/******************************************************************************/
/***         Generated by IBExpert 2012.12.16.1 2018/05/10 10:05:24         ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                Domains                                 ***/
/******************************************************************************/

CREATE DOMAIN ANO AS
CHAR(4);

CREATE DOMAIN BOOLEANO AS
CHAR(1);

CREATE DOMAIN CALIFICA AS
VARCHAR(20);

CREATE DOMAIN CENTRO AS
VARCHAR(4);

CREATE DOMAIN CORREO AS
VARCHAR(100);

CREATE DOMAIN CTACONTA AS
VARCHAR(20);

CREATE DOMAIN DATOAUDIT AS
VARCHAR(4096) CHARACTER SET ISO8859_1;

CREATE DOMAIN ENTERO AS
SMALLINT;

CREATE DOMAIN ESTUDIANTE AS
VARCHAR(100);

CREATE DOMAIN EXPLICA AS
VARCHAR(255);

CREATE DOMAIN FECCONTA AS
CHAR(8);

CREATE DOMAIN FECHA AS
DATE;

CREATE DOMAIN HORA AS
TIME;

CREATE DOMAIN ID AS
INTEGER;

CREATE DOMAIN MES AS
SMALLINT;

CREATE DOMAIN MONTO AS
NUMERIC(18,2);

CREATE DOMAIN NIT AS
VARCHAR(20);

CREATE DOMAIN NOMBRE AS
VARCHAR(60);

CREATE DOMAIN NUMERO AS
VARCHAR(6);

CREATE DOMAIN OBSERVACIONT AS
VARCHAR(1024);

CREATE DOMAIN PORCENTAJE AS
NUMERIC(9,4);

CREATE DOMAIN PORC_CONTA AS
NUMERIC(9,4);

CREATE DOMAIN PREFIJO AS
VARCHAR(4);

CREATE DOMAIN PREF_NUM AS
VARCHAR(12);

CREATE DOMAIN SEXO AS
CHAR(1);

CREATE DOMAIN TIPO_BENEF AS
CHAR(1);

CREATE DOMAIN TRM AS
DOUBLE PRECISION;

CREATE DOMAIN T_ATRIBUTO AS
NUMERIC(18,4);

CREATE DOMAIN T_BOOLEANO AS
CHAR(1)
check (value in ('S','N'));

CREATE DOMAIN T_CANTIDAD AS
NUMERIC(18,4);

CREATE DOMAIN T_CENTRO AS
VARCHAR(4);

CREATE DOMAIN T_COD_ARTICULO AS
VARCHAR(15);

CREATE DOMAIN T_CONCEPTO AS
VARCHAR(60);

CREATE DOMAIN T_CTANOMNIIF AS
VARCHAR(140);

CREATE DOMAIN T_CTA_CONTABLE AS
VARCHAR(20);

CREATE DOMAIN T_FECHA AS
DATE;

CREATE DOMAIN T_GRUPO AS
VARCHAR(2);

CREATE DOMAIN T_ID AS
INTEGER;

CREATE DOMAIN T_LOTE AS
VARCHAR(15);

CREATE DOMAIN T_MONTO AS
NUMERIC(18,2)
DEFAULT 0;

CREATE DOMAIN T_NIT AS
VARCHAR(20);

CREATE DOMAIN T_NOMCTANIIF AS
VARCHAR(140);

CREATE DOMAIN T_NUMDOC AS
VARCHAR(8);

CREATE DOMAIN T_NUMFACL AS
VARCHAR(12);

CREATE DOMAIN T_NUMPROV AS
VARCHAR(15);

CREATE DOMAIN T_PORCENTAJE AS
NUMERIC(9,4)
DEFAULT 0;

CREATE DOMAIN T_PREFIJO AS
VARCHAR(4);

CREATE DOMAIN T_PROYECTO AS
VARCHAR(4);

CREATE DOMAIN T_SERIAL AS
VARCHAR(30);

CREATE DOMAIN T_TELEFONO AS
VARCHAR(40);

CREATE DOMAIN T_TIPODOC AS
VARCHAR(3);

CREATE DOMAIN T_TIPOID AS
CHAR(1);

CREATE DOMAIN T_TIPO_COMP AS
CHAR(3);

CREATE DOMAIN T_UNIDAD AS
VARCHAR(8);

CREATE DOMAIN T_USUARIO AS
VARCHAR(10);

CREATE DOMAIN T_ZONA AS
VARCHAR(2);

CREATE DOMAIN VOLUMEN AS
FLOAT;



/******************************************************************************/
/***                               Exceptions                               ***/
/******************************************************************************/

CREATE EXCEPTION ABONO_CERO 'El monto del abono no puede ser cero';

CREATE EXCEPTION ABONO_PRESTAMO_MAYOR 'Al valor abonado es superior al saldo del prestamo';

CREATE EXCEPTION ACTIVO_SIN_CUENTA 'Debe indicar la cuenta contable para el activo';

CREATE EXCEPTION ACTIVO_SIN_MESES_DEPRECIACION 'Falta indicar el numero de meses de depreciacion del activo';

CREATE EXCEPTION AJUSTE_NO_EXISTE 'No existe el encabezado del ajuste.';

CREATE EXCEPTION ANO_INICIO_INCORRECTO 'El año de inicio en la configuración es incorrecto, debe tener 4 dígitos.';

CREATE EXCEPTION ANTICPO_SIN_ORIGEN 'El Anticipo a cruzar no está correctamente registrado. Anulelo y vuelvalo a registrar';

CREATE EXCEPTION APLICACIONCL_NO_EXISTE 'No existe el encabezado de la aplicación del cliente.';

CREATE EXCEPTION APLICACIONPR_NO_EXISTE 'No existe el encabezado de la aplicación del proveedor.';

CREATE EXCEPTION ARTICULO_CON_EXISTENCIA 'El Articulo indicado tiene existencias registradas';

CREATE EXCEPTION ARTICULO_CON_MOVIMIENTOS 'No se puede cambiar o borrar el artículo pues ya tiene movimientos';

CREATE EXCEPTION ARTICULO_INACTIVO 'El artículo indicado esta inactivo.';

CREATE EXCEPTION ARTICULO_NO_EXISTE 'El artículo indicado no esta registrado.';

CREATE EXCEPTION ARTICULO_REGISTRADO 'El código de artículo ya esta registrado.';

CREATE EXCEPTION ARTICULO_SIN_PESO 'Debe indicar el peso del artículo';

CREATE EXCEPTION AUTORIZACION_NO_EXISTE 'No se encontró la autorización de numeración.';

CREATE EXCEPTION AUTORIZACION_YA_EXISTE 'Ya existe una autorización de numeración con ese prefijo.';

CREATE EXCEPTION BANCO_NO_EXISTE 'No existe el código del banco.';

CREATE EXCEPTION BODEGA_NO_EXISTE 'No existe la bodega para este movimiento.';

CREATE EXCEPTION BONO_USADO 'El bono de pago ya fue usado en caja';

CREATE EXCEPTION CAJA_NO_EXISTE 'La caja indicada no existe.';

CREATE EXCEPTION CAMBIODOC_NO_EXISTE 'No existe el encabezado del cambio de documento.';

CREATE EXCEPTION CAMBIO_CARGO_EXISTE 'Ya existe un cambio de cargo de la misma fecha';

CREATE EXCEPTION CAMBIO_CODIGO_CUENTA 'No se puede modificar el código de la cuenta. Eliminela y vuelva a crearla.';

CREATE EXCEPTION CAMBIO_FECHA 'No puede cambiar la fecha de un comprobante, anulelo y vuelva a registrarlo';

CREATE EXCEPTION CAMBIO_SALARIO_EXISTE 'Ya existe un cambio de salario para el empleado en esa fecha';

CREATE EXCEPTION CAMBIO_VINCUL_EXISTE 'Ya existe un cambio de vinculación de la misma fecha';

CREATE EXCEPTION CANTIDAD_CRUCE_MAYOR 'La cantidad del artículo usada es mayor a la original';

CREATE EXCEPTION CANTIDAD_MAYOR_DESCUENTO 'Se alcanzo el maximo de unidades de la promocion';

CREATE EXCEPTION CENTRO_CON_MOVIMIENTO 'El centro/subcentro de costos ya tiene movimientos.';

CREATE EXCEPTION CENTRO_NO_EXISTE 'El Proyecto o centro indicado no esta registrado.';

CREATE EXCEPTION CIUDAD_NO_EXISTE 'Debe indicar una ciudad';

CREATE EXCEPTION CLIENTE_CON_MOV 'El NIT indicado ya tiene movimientos como cliente';

CREATE EXCEPTION CLIENTE_CON_MOVIMIENTO 'No se puede borrar el cliente por tener movimientos registrados.';

CREATE EXCEPTION CLIENTE_INACTIVO 'El cliente esta inactivo o en estado No vender';

CREATE EXCEPTION CLIENTE_NO_EXISTE 'No se encontró el cliente previamente registrado.';

CREATE EXCEPTION COBRADOR_MOVIMIENTO 'El cobrador indicado tiene documentos registrados';

CREATE EXCEPTION COBRADOR_NOREG 'No se encontró el cobrado especificado.';

CREATE EXCEPTION COBRADOR_NO_EXISTE 'El cobrador indicado no ha sido registrado.';

CREATE EXCEPTION CODIGO_EAN_INCORRECTO 'Codigo o prefijo incorrecto para generar EAN13';

CREATE EXCEPTION COMISIONES_CALCULADAS 'Las comisiones para algunos de estos días ya fuerón tomados en cuenta';

CREATE EXCEPTION COMISIONES_REGISTRADAS 'Ya existen comisiones registradas para el empleado';

CREATE EXCEPTION COMPROBAENCABEZA_NO_EXISTE 'No existe el encabezado para el comprobante contable.';

CREATE EXCEPTION COMPROBANTE_DESCUADRADO 'Error. La configuración no permite registrar un comprobante descuadrado.';

CREATE EXCEPTION COMPROBANTE_REGISTRADO 'Ya existe un comprobante contable con ese tipo y número';

CREATE EXCEPTION CONCEPTO_ASIGNADO_EMPLEADO 'El concepto ya fue asignado a un empleado';

CREATE EXCEPTION CONCEPTO_CONTABLE_USADO 'La categoría ya fue usada en algún comprobante contable';

CREATE EXCEPTION CONCEPTO_CON_MOVIMIENTO 'El concepto ya fue utilizado en una liquidacion';

CREATE EXCEPTION CONFIGURACION_NO_ENCONTRADA 'No se encontró el parámetro de configuración necesario';

CREATE EXCEPTION CONSIGNATAR_NO_EXISTE 'No existe el encabezado de la consignación.';

CREATE EXCEPTION CONSIGNA_NO_EXISTA 'No existe el encabezado de la consignación.';

CREATE EXCEPTION CONSUMO_NO_EXISTE 'No se encontró el trabajo';

CREATE EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad está bloqueada. No se puede registrar el comprobante.';

CREATE EXCEPTION COTIZACION_NO_EXISTE 'No existe el encabezado de la cotización.';

CREATE EXCEPTION CUENTABANCO_NO_EXISTE 'No existe la cuenta del banco.';

CREATE EXCEPTION CUENTA_CON_HIJAS 'La cuenta no puede afectarse porque ya tiene subcuentas registradas.';

CREATE EXCEPTION CUENTA_CON_MOVIMIENTOS 'Esta cuenta no puede ser eliminada o modificada porque tiene movimientos.';

CREATE EXCEPTION CUENTA_CON_SALDO 'La cuenta no puede elimnarse porque ya tiene un saldo inicial.';

CREATE EXCEPTION CUENTA_NO_ES_NORMAL 'La cuenta debe ser de tipo normal';

CREATE EXCEPTION CUENTA_NO_EXISTE 'La cuenta no se encuentra previamente registrada.';

CREATE EXCEPTION CUENTA_PADRE_NO_EXISTE 'No existe la cuenta de nivel inmediatamente anterior.';

CREATE EXCEPTION CUENTA_SIN_DATOS 'Faltó ingresar el código o el nombre de la cuenta contable';

CREATE EXCEPTION CUPO_INSUFICIENTE 'El cupo de crédito del cliente es insuficiente.';

CREATE EXCEPTION DATO_OBLIGATORIO 'El Dato indicado es obligatorio';

CREATE EXCEPTION DESCUENTO_MAYOR_AL_TOTAL 'El monto del descuento es mayor al monto del articulo';

CREATE EXCEPTION DESENSAMBLE_NO_EXISTE 'No existe el encabezado del desensamble.';

CREATE EXCEPTION DEVOLUCIONPROD_NO_EXISTE 'No se encontró la devolución de produccion';

CREATE EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor que la facturada';

CREATE EXCEPTION DEVOLUCION_NO_EXISTE 'No existe el encabezado de la devolución.';

CREATE EXCEPTION DOCUMENTO_ABONO_MAYOR 'El monto del abono o de las retenciones es mayor que el saldo del documento.';

CREATE EXCEPTION DOCUMENTO_CON_ABONOS 'El Documento no puede ser eliminado o modificado porque ya tiene abonos.';

CREATE EXCEPTION DOCUMENTO_CRUZADO 'El documento indicado ya fue cruzado con otra operación';

CREATE EXCEPTION DOCUMENTO_DEVUELTO 'La factura a anular ya tiene devoluciones asociadas.';

CREATE EXCEPTION DOCUMENTO_DE_OTRO_TERCERO 'El documento inidicado pertenece a otro tercero.';

CREATE EXCEPTION DOCUMENTO_FECHA_ABONO_ANTERIOR 'La fecha del documento es posterior a la fecha del abono.';

CREATE EXCEPTION DOCUMENTO_PAGO_SALIDO 'La forma de pago ya fue utilizada en otro movimiento';

CREATE EXCEPTION DOCUMENTO_REFERENCIADO 'No se puede borrar un comprobante que fue generado por otra opción del sistema';

CREATE EXCEPTION DOCUMENTO_REGISTRADO 'El numero de documento ya esta registrado.';

CREATE EXCEPTION DOCUMENTO_TOTALMENTE_CANCELADO 'El documento indicado ya fue totalmente cancelado.';

CREATE EXCEPTION EFECTIVO_INSUFICIENTE 'El saldo del efectivo es insuficiente para el movimiento.';

CREATE EXCEPTION EGRESO_NO_EXISTE 'No existe el encabezado del egreso.';

CREATE EXCEPTION ENSAMBLE_NO_EXISTE 'No existe el encabezado del ensamble.';

CREATE EXCEPTION ENTRADAPROD_NO_EXISTE 'No existe la entrada de producto especificada';

CREATE EXCEPTION ENTRADA_NO_EXISTE 'No existe el encabezado de la entrada.';

CREATE EXCEPTION ESTRUCTURA_INCORRECTA 'El número de dígitos de la cuenta no corresponde con la estructura contable.';

CREATE EXCEPTION EXISTENCIA_INSUFICIENTE 'La existencia del artículo quedará negativa';

CREATE EXCEPTION EXISTENCIA_SOBRE_MAXIMO 'La existencia del artículo quedará sobre el máximo en la bodega';

CREATE EXCEPTION FACTOR_NO_ENCONTRADO 'No se encontró el factor de equivalencia para esa unidad.';

CREATE EXCEPTION FACTOR_PRECIO_MENOR 'El factor de precio debe ser mayor o igual al de cantidad.';

CREATE EXCEPTION FACTURA_NO_EXISTE 'No se encontró el encabezado de la factura.';

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

CREATE EXCEPTION FALTA_ARTICULO 'Debe registrar un artículo para mover una cuenta de tipo inventario.';

CREATE EXCEPTION FALTA_BASE 'la cuenta a mover requiere entrar la base y el porcentaje de retención.';

CREATE EXCEPTION FECHA_ANTERIOR_DOCUMENTO 'La fecha del abono es anterior a la fecha del documento a abonar';

CREATE EXCEPTION FECHA_ANTERIOR_INICIO 'La fecha especificada es anterior al inicio de la compañía.';

CREATE EXCEPTION FECHA_NO_VALIDA 'La fecha no es válida para el período actual.';

CREATE EXCEPTION FORMAPAGO_NO_EXISTE 'La forma de pago indicada no existe.';

CREATE EXCEPTION GRUPO_NO_EXISTE 'No existe el código del grupo.';

CREATE EXCEPTION HORA_EXTRA_YA_UTILIZADA 'El registro de horas extras ya fue usado en una nómina';

CREATE EXCEPTION INTERFAZ_NO_ENCONTRADA 'No existe la interfaz especififcada.';

CREATE EXCEPTION LIMITE_ALCANZADO 'Se completo el máximo número de registros para esta versión';

CREATE EXCEPTION LISTA_NO_EXISTE 'No existe la lista de precios.';

CREATE EXCEPTION LOTE_CON_MOVIMIENTOS 'No se puede borrar el lote por que tiene salidas registradas.';

CREATE EXCEPTION LOTE_NEGATIVO 'No existe un lote con existencia suficiente, disminuya la cantidad.';

CREATE EXCEPTION LOTE_NO_EXISTE 'No se encontró el número de lote previamente registrado.';

CREATE EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote o vencimiento para el artículo';

CREATE EXCEPTION LOTE_PREVIO 'Ya existe un lote para el artículo con el mismo número.';

CREATE EXCEPTION MARCA_NO_EXISTE 'No existe el código de la marca especificado.';

CREATE EXCEPTION MES_YA_FACTURADO 'El tercero ya tiene una factura del mes';

CREATE EXCEPTION MOVIMIENTO_CUENTA_PADRE 'La cuenta padre ya posee movimientos. Use el módulo de mantenimiento';

CREATE EXCEPTION MOVIMIENTO_NO_CARTERA 'El movimiento que se esta registrando no puede mover una cuenta de cartera';

CREATE EXCEPTION MOVIMIENTO_NO_INVENTARIO 'El movimiento que se esta registrando no puede mover una cuenta de inventario';

CREATE EXCEPTION NIVEL_NO_AFECTABLE 'El nivel de la cuenta debe ser mayor que el mínimo afectable.';

CREATE EXCEPTION NOMINA_CON_APORTES 'La nómina ya registra un pago de aportes';

CREATE EXCEPTION NOMINA_CON_PAGO 'La nómina ya registra un pago';

CREATE EXCEPTION NOMINA_OTRO_PERIODO 'La nómina indicada pertenece a otro período';

CREATE EXCEPTION NOMINA_REGISTRADA 'Ya existe una liquidación para este periodo y año';

CREATE EXCEPTION NOTA_YA_EXISTE 'Ya existe una nota con ese número en este periodo contable';

CREATE EXCEPTION NO_HAY_BONO_DE_PAGO 'No se encontró un bono de pago de ese valor disponible';

CREATE EXCEPTION ORDEN_NO_EXISTE 'No se encontró el encabezado de la Orden de compra.';

CREATE EXCEPTION PAGO_NO_EXISTE 'No se encontró el encabezado del pago.';

CREATE EXCEPTION PEDIDO_NO_EXISTE 'No existe el encabezado del pedido.';

CREATE EXCEPTION PERIODO_PAGADO 'El período de nómina ya fue pagado';

CREATE EXCEPTION PLANTILLA_NO_EXISTE 'No se encontró el encabezado de la plantilla.';

CREATE EXCEPTION PRECIO_MAYOR_TOPE 'el precio unitario es mayor al tope de facturaciÃ³n';

CREATE EXCEPTION PREFIJOBANCO_NO_EXISTE 'No existe el prefijo para este movimiento de banco';

CREATE EXCEPTION PREFIJO_CONTA_NOEXISTE 'No existe el tipo de comprobante o prefijo especificado.';

CREATE EXCEPTION PREFIJO_DEVCHEQUE 'Ya existe un prefijo para la devolución de cheques';

CREATE EXCEPTION PREFIJO_NO_EXISTE 'No existe el prefijo para ese documento.';

CREATE EXCEPTION PRODUCCION_NO_EXISTE 'No existe la orden de producción especificada';

CREATE EXCEPTION PROVEEDOR_CON_MOV 'El NIT indicado ya tiene movimientos como proveedor';

CREATE EXCEPTION PROVEEDOR_CON_MOVIMIENTO 'No se puede borrar el proveedor por tener movimientos registrados.';

CREATE EXCEPTION PROVEEDOR_NO_EXISTE 'No existe el proveedor de ese movimiento.';

CREATE EXCEPTION PROYECTO_NO_EXISTE 'No existe el proyecto indicado.';

CREATE EXCEPTION PUNTOVTA_NO_EXISTE 'No existe el punto de venta.';

CREATE EXCEPTION RANGO_DIAS_INCONSISTENTE 'El rango de días entra en conflicto con otro definido';

CREATE EXCEPTION RECIBO_NO_EXISTE 'No se encontró el encabezado del recibo.';

CREATE EXCEPTION REMISION_NO_EXISTE 'No se encontró el encabezado de la remisión.';

CREATE EXCEPTION RUTA_NO_EXISTE 'Ruta de entregas no encontrada';

CREATE EXCEPTION RUTA_USADA 'La ruta esta siendo usada';

CREATE EXCEPTION SALDOCTA_NO_EXISTE 'No existe el saldo para la cuenta contable.';

CREATE EXCEPTION SALDO_INSUFICIENTE 'La existencia en la bodega es insuficiente.';

CREATE EXCEPTION SALDO_SIN_CUENTA 'No existe la cuenta contable para este saldo.';

CREATE EXCEPTION SALDO_SIN_TERCERO 'No existe el tercero para este saldo.';

CREATE EXCEPTION SALIDAPROD_NO_EXISTE 'No existe la salida a producción especificada';

CREATE EXCEPTION SALIDA_NO_EXISTE 'No se encontró el encabezado de la salida.';

CREATE EXCEPTION SDP_ICPE 'Error registrando. No existe el registro maestro.';

CREATE EXCEPTION SDP_UCC 'Este valor no puede modificarse.';

CREATE EXCEPTION SDP_UCCP 'El código depende de una tabla mestra.';

CREATE EXCEPTION SDP_UCPE 'Error registrando. No existe el registro maestro.';

CREATE EXCEPTION SDP_UPR 'No puede modificarse el código en la tabla maestra.';

CREATE EXCEPTION SERIAL_YA_USADO 'No puede eliminar un serial que fue usado en un documento de salida';

CREATE EXCEPTION SORTEO_YA_EXISTE 'Ya existe un sorteo con el prefijo';

CREATE EXCEPTION SUBGRUPO_NO_EXISTE 'No existe el código de subgrupo especificado.';

CREATE EXCEPTION TARJETA_NO_EXISTE 'No existe el código de la tarjeta.';

CREATE EXCEPTION TASA_CAMBIO_REGISTRADA 'Ya se registro una tasa de cambio para esta fecha';

CREATE EXCEPTION TERCERO_CON_MOV 'El NIT indicado tiene comprobantes registrados.';

CREATE EXCEPTION TERCERO_CON_SALDO 'El NIT indicado tiene un saldo registrado.';

CREATE EXCEPTION TERCERO_NO_EXISTE 'El NIT indicado no esta registrado.';

CREATE EXCEPTION TIPOCOMP_NO_EXISTE 'No existe el tipo de comprobante especificado.';

CREATE EXCEPTION TIPODOC_NO_EXISTE 'No existe el tipo de documento especificado.';

CREATE EXCEPTION TIQUETE_USADO 'Tiquete previamente usado en una planilla';

CREATE EXCEPTION TRASFERENCIA_NO_EXISTE 'No se encontró la transferencia.';

CREATE EXCEPTION UNIDAD_CON_MOV 'La unidad del artículo ya ha sido usada.';

CREATE EXCEPTION UNIDAD_NO_REGISTRADA 'La unidad especificada no existe para el artículo';

CREATE EXCEPTION VEHICULO_NO_EXISTE 'No se encontró el vehículo';

CREATE EXCEPTION VENCIMIENTO_INCORRECTO 'La fecha de vencimiento es anterior al documento';

CREATE EXCEPTION VENDEDOR_MOVIMIENTO 'El vendedor indicado tiene documentos registrados';

CREATE EXCEPTION VENDEDOR_NOREG 'No se encontró el vendedor especificado';

CREATE EXCEPTION YA_EXISTE_EL_REGISTRO 'Ya existe el registro para este periodo, año y empleado';

CREATE EXCEPTION "interfaz_no_definida" 'Interfaz contable no definida para la operación';



SET TERM ^ ; 



/******************************************************************************/
/***                           Stored Procedures                            ***/
/******************************************************************************/

CREATE PROCEDURE ABONOS_DOCUMENTO_CARTERA (
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    TIPOAB INTEGER,
    IDAB INTEGER,
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ABONO NUMERIC(18,2),
    RETES NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ABONOS_DOCUMENTO_CXPAGAR (
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    TIPOAB INTEGER,
    IDAB INTEGER,
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ABONO NUMERIC(18,2),
    RETES NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ACTIVAR_ACTUALIZACION_BALANCE (
    FECINI DATE,
    FECFIN DATE,
    NULO CHAR(1))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ACTIVO_VALOR (
    CODIGO VARCHAR(15),
    FECHA CHAR(8),
    DEP CHAR(1))
RETURNS (
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ACTIVO_VALOR_NIIF (
    CODIGO VARCHAR(15),
    FECHA CHAR(8),
    DEP CHAR(1))
RETURNS (
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ACTUALICE_COSTO (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,4),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_COSTO_NIIF (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,4),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_PRMINIMO (
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    PRMIN NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ACTUALICE_SALDO_ACTIVO (
    CUENTA VARCHAR(20),
    ACTIVO VARCHAR(15),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_SALDO_ACTIVO_NIIF (
    CUENTA VARCHAR(20),
    ACTIVO VARCHAR(15),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_SALDO_ARTICULO (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_SALDO_ARTICULO_NIIF (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_SALDO_CENT_TERC_NIIF (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    NIT VARCHAR(20),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE 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
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_SALDO_CENTRO_NIIF (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE 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
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_SALDO_CUENTA (
    CUENTA VARCHAR(20),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_SALDO_CUENTA_NIIF (
    CUENTA VARCHAR(20),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_SALDO_TERCERO (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_SALDO_TERCERO_NIIF (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    FECHA CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALICE_TOTAL_DOCVENTA (
    TIPO INTEGER,
    ID INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACTUALIZA_PUNTOS_ACUMULADOS (
    CLIENTE VARCHAR(20),
    FECHA DATE,
    PTOSVIG NUMERIC(18,2),
    PTOSXVE NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ACUMULA_PUNTOS_CLIENTE (
    TIPO INTEGER,
    IDDOC INTEGER,
    CLIENTE VARCHAR(20),
    FECHA DATE)
RETURNS (
    PUNTOS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AFECTA_INVENTARIO_FACTURAS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    ITEM INTEGER,
    ARTIC VARCHAR(20),
    BOD VARCHAR(2),
    CANT NUMERIC(18,2),
    LOTE VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AJUSTA_CANT_PEDIDO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    NUMERO VARCHAR(12),
    ITEM INTEGER,
    FECHA DATE,
    ARTI VARCHAR(20),
    BODORI VARCHAR(2),
    BODE VARCHAR(2),
    CANTORI NUMERIC(18,4),
    CANT NUMERIC(18,4),
    UNIDADORI VARCHAR(8),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    STAND VARCHAR(20),
    ESTADO VARCHAR(10))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AJUSTES_APERTURA_NIIF
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    SALDO NUMERIC(18,2),
    RECLASDB NUMERIC(18,2),
    RECLASCR NUMERIC(18,2),
    AJUSTEDB NUMERIC(18,2),
    AJUSTECR NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    CUENTANIIF VARCHAR(20),
    NOMBRENIIF VARCHAR(140),
    RECLASDBN NUMERIC(18,2),
    RECLASCRN NUMERIC(18,2),
    AJUSTEDBN NUMERIC(18,2),
    AJUSTECRN NUMERIC(18,2),
    NUEVO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AJUSTES_SIN_CONTABILDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE AKTIVIA_INVENTARIO (
    FECHA DATE)
RETURNS (
    CODBOD VARCHAR(2),
    CODIGO VARCHAR(15),
    CANT NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE ALERTAS_CONTRATO_EMPL (
    FEC DATE)
RETURNS (
    DIAS INTEGER,
    MENSAJE VARCHAR(60),
    EMPLNOM VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ANALISIS_BANCOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CUENTA INTEGER,
    NOMCUENTA VARCHAR(60),
    TIPODOC INTEGER,
    NOMTIPODOC VARCHAR(8),
    FECHA DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    DB CHAR(1),
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ANALISIS_CAJA (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    CAJA INTEGER,
    NOMCAJACTA VARCHAR(60),
    TIPODOC INTEGER,
    NOMTIPODOC VARCHAR(8),
    FECHA DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    DB CHAR(1),
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ANALISIS_CARTERA (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    AGENCIA INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    TERCERO VARCHAR(20),
    NOMBRETERC VARCHAR(60),
    MUNICIPIO VARCHAR(5),
    NOMMUNICIPIO VARCHAR(60),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    TIPODOC INTEGER,
    NOMTIPODOC VARCHAR(8),
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ANALISIS_COMPRAS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    AGENCIA VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    PROVEEDOR VARCHAR(20),
    NOMPROVEEDOR VARCHAR(60),
    MUNICIPIO VARCHAR(5),
    NOMMUNI VARCHAR(60),
    GRUPO VARCHAR(30),
    ARTICULO VARCHAR(20),
    ARTDESCR VARCHAR(60),
    GRUPOINV VARCHAR(30),
    SUBGRUPOINV VARCHAR(30),
    MARCA VARCHAR(30),
    CANTIDAD NUMERIC(18,1),
    MONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ANALISIS_CXPAGAR (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    TERCERO VARCHAR(20),
    NOMBRETERC VARCHAR(60),
    MUNICIPIO VARCHAR(5),
    NOMMUNICIPIO VARCHAR(60),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    TIPODOC INTEGER,
    NOMTIPODOC VARCHAR(8),
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ANALISIS_INVENTARIO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    CODGRUPO VARCHAR(30),
    CODSUBG VARCHAR(30),
    CODMARC VARCHAR(30),
    CODBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    TIPO INTEGER,
    FECHA DATE,
    NOMTIPO VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ANALISIS_VENTAS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    AGENCIA INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    PUNTOVTA INTEGER,
    CLIENTE VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR VARCHAR(60),
    ZONA VARCHAR(60),
    MUNICIPIO VARCHAR(5),
    NOMMUNI VARCHAR(60),
    GRUPOCART VARCHAR(30),
    ARTICULO VARCHAR(20),
    ARTDESCR VARCHAR(60),
    GRUPOINV VARCHAR(30),
    SUBGRUPOINV VARCHAR(30),
    MARCA VARCHAR(30),
    CANTIDAD DOUBLE PRECISION,
    MONTO DOUBLE PRECISION,
    TOTAL DOUBLE PRECISION)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE APLICACIONPR_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ARCHIVO_BANCO (
    IDDOC INTEGER,
    FECHA DATE,
    FECHAPAGO DATE,
    SECUENCIA CHAR(1),
    FORMATO VARCHAR(60))
RETURNS (
    DATOS VARCHAR(591))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ARREGLA_BARRAS_ARTICULO
RETURNS (
    ARTICULO VARCHAR(20),
    BARRAS VARCHAR(20),
    UNIDAD VARCHAR(8),
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ARREGLA_COSTO_PLANPROD (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FEC DATE,
    PLANID INTEGER,
    CONC VARCHAR(60),
    PREF VARCHAR(4),
    NUM VARCHAR(8),
    BODDES VARCHAR(2),
    ITEM INTEGER,
    ARTIC VARCHAR(20),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    LOTE VARCHAR(20),
    COSTOU NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ARREGLA_COSTO_PRODENT
RETURNS (
    IDORD INTEGER,
    ID INTEGER,
    ARTIC VARCHAR(20),
    FEC DATE,
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ARREGLA_CUENTA_BANCO_CONTA (
    CTAANT VARCHAR(20))
RETURNS (
    ID INTEGER,
    CTA VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ARREGLA_CUENTAS_NO_TERCERO
RETURNS (
    ID INTEGER,
    ITEM INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ARREGLA_ENTRADAS_COSTO_CERO
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ARREGLA_EXIST_PROD_CONS
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    ARTI VARCHAR(20),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ARREGLA_MOV_CAJA_RC
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ARREGLA_MOV_CLIENTE_APL
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ARREGLA_MOV_CLIENTE_RC
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE ARTICULOS_SIN_CONTAR (
    ID INTEGER)
RETURNS (
    ARTICULO VARCHAR(20),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    LOTE VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ASIGNA_COBRADOR
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    COBRA INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ASIGNA_PRECIOS (
    AUT CHAR(1),
    UTIL NUMERIC(9,2),
    MARGEN NUMERIC(9,2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ASIGNA_RUTERO_FAC (
    TIPO INTEGER,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE ASIGNE_BOLETAS (
    IDF INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ASIGNE_FACTURA_ENTREGA (
    ENTREGADOR INTEGER)
RETURNS (
    IDDOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    NOMCLI VARCHAR(60),
    HORAREG TIME,
    ITEMS INTEGER,
    ITEM INTEGER,
    STAND VARCHAR(20),
    DESARTI VARCHAR(60),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    ITEM2 INTEGER,
    STAND2 VARCHAR(20),
    DESARTI2 VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    TERCERO VARCHAR(60),
    CIUDAD VARCHAR(5),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOF 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA_N (
    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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    TERCERO VARCHAR(60),
    CIUDAD VARCHAR(5),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOF NUMERIC(18,2),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMCUENTA VARCHAR(140),
    NOMPROY VARCHAR(60),
    NOMCENT VARCHAR(60),
    CTAPROY VARCHAR(24),
    CTAPROYCENT VARCHAR(28))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AUXILIAR_CENTRO_INI_FIN (
    CUENTA VARCHAR(20),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    ANOINI CHAR(4),
    ANOFIN CHAR(4),
    PERINI INTEGER,
    PERFIN INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    CIUDAD VARCHAR(5),
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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),
    CIUDAD VARCHAR(5),
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AUXILIAR_CENTRO_MES_N (
    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(8),
    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),
    CIUDAD VARCHAR(5),
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AUXILIAR_CUENTA_INI_FIN (
    CUENTA VARCHAR(20),
    ANOINI CHAR(4),
    ANOFIN CHAR(4),
    PERINI INTEGER,
    PERFIN INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CIUDAD VARCHAR(5),
    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
  SUSPEND;
END^





CREATE PROCEDURE AUXILIAR_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CIUDAD VARCHAR(5),
    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
  SUSPEND;
END^





CREATE PROCEDURE AUXILIAR_CUENTA_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CIUDAD VARCHAR(5),
    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
  SUSPEND;
END^





CREATE 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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CIUDAD VARCHAR(5),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AUXILIAR_DESDE_HASTA_NIIF (
    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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CIUDAD VARCHAR(5),
    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(140),
    SALDO NUMERIC(18,2),
    CATEGORIA VARCHAR(4))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    DV CHAR(1),
    CIUDAD VARCHAR(5),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA_N (
    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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    DV CHAR(1),
    CIUDAD VARCHAR(5),
    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(140),
    NOMTERCERO VARCHAR(60),
    CUENTANIT VARCHAR(40),
    SALDOFIN NUMERIC(18,2),
    SALDOCTA NUMERIC(18,2),
    SALDOCTAF NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE AUXILIAR_TERCERO_INI_FIN (
    CUENTA VARCHAR(20),
    TERCERO VARCHAR(20),
    ANOINI CHAR(4),
    ANOFIN CHAR(4),
    PERINI INTEGER,
    PERFIN INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE 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(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE AUXILIAR_TERCERO_MES_N (
    CUENTA VARCHAR(20),
    TERCERO VARCHAR(20),
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    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
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_ANUAL (
    ANO CHAR(4),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TERC CHAR(1),
    SALDOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_ANUAL_CENTROS (
    ANO CHAR(4),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    SALDOS CHAR(1),
    NIIF CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_ANUAL_NIIF (
    ANO CHAR(4),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TERC CHAR(1),
    SALDOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(140),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_ARTICULO_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_CENTRO_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_CENTRO_MES_N (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_CENTRO_TERCERO_MES (
    CUENTA VARCHAR(20),
    PROY CHAR(4),
    CENT CHAR(4),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_CENTRO_TERCERO_MES_N (
    CUENTA VARCHAR(20),
    PROY CHAR(4),
    CENT CHAR(4),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_COMPARATIVO (
    ANO1 CHAR(4),
    MES1 INTEGER,
    ANO2 CHAR(4),
    MES2 INTEGER,
    TERCEROS CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(60),
    NIT VARCHAR(20),
    NOM_TERCERO VARCHAR(60),
    INICIAL1 NUMERIC(18,2),
    DEBITOS1 NUMERIC(18,2),
    CREDITOS1 NUMERIC(18,2),
    FINAL1 NUMERIC(18,2),
    INICIAL2 NUMERIC(18,2),
    DEBITOS2 NUMERIC(18,2),
    CREDITOS2 NUMERIC(18,2),
    FINAL2 NUMERIC(18,2),
    TERCERO CHAR(1),
    NIVEL INTEGER,
    NOMCTATER VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_COMPARATIVO_NIIF (
    ANO1 CHAR(4),
    MES1 INTEGER,
    ANO2 CHAR(4),
    MES2 INTEGER,
    TERCEROS CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(140),
    NIT VARCHAR(20),
    NOM_TERCERO VARCHAR(60),
    INICIAL1 NUMERIC(18,2),
    DEBITOS1 NUMERIC(18,2),
    CREDITOS1 NUMERIC(18,2),
    FINAL1 NUMERIC(18,2),
    INICIAL2 NUMERIC(18,2),
    DEBITOS2 NUMERIC(18,2),
    CREDITOS2 NUMERIC(18,2),
    FINAL2 NUMERIC(18,2),
    TERCERO CHAR(1),
    NIVEL INTEGER,
    NOMCTATER VARCHAR(140))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_CON_CENTROS_MES (
    ANO CHAR(4),
    MES INTEGER,
    PORCENTRO CHAR(1),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    PROYINI VARCHAR(4),
    PROYFIN VARCHAR(4),
    CENTINI VARCHAR(4),
    CENTFIN VARCHAR(4))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(60),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    NOM_CENTRO VARCHAR(60),
    NOM_SUBCENTRO 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),
    SCENTRO NUMERIC(18,2),
    MCLASE NUMERIC(18,2),
    MGRUPO NUMERIC(18,2),
    MSUBGRUPO NUMERIC(18,2),
    MCUENTA NUMERIC(18,2),
    MOVIMIEN NUMERIC(18,2),
    NOMCTACEN VARCHAR(120),
    SALDO DOUBLE PRECISION,
    NIVEL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_CON_CENTROS_MES_N (
    ANO CHAR(4),
    MES INTEGER,
    PORCENTRO CHAR(1),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    PROYINI VARCHAR(4),
    PROYFIN VARCHAR(4),
    CENTINI VARCHAR(4),
    CENTFIN VARCHAR(4))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(140),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    NOM_CENTRO VARCHAR(60),
    NOM_SUBCENTRO 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),
    SCENTRO NUMERIC(18,2),
    MCLASE NUMERIC(18,2),
    MGRUPO NUMERIC(18,2),
    MSUBGRUPO NUMERIC(18,2),
    MCUENTA NUMERIC(18,2),
    MOVIMIEN NUMERIC(18,2),
    NOMCTACEN VARCHAR(120),
    NIVEL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_CON_TERCEROS_ACUM (
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN 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),
    DEBULT NUMERIC(18,2),
    CREULT NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    FINULT NUMERIC(18,2),
    NOMCTATER VARCHAR(120),
    NIVEL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_CON_TERCEROS_MES_N (
    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(140),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_FINAL (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    SALDO NUMERIC(18,2),
    SCLASE NUMERIC(18,2),
    SGRUPO NUMERIC(18,2),
    SSUBGRUPO NUMERIC(18,2),
    SCUENTA NUMERIC(18,2),
    NIVEL INTEGER,
    AFECTA CHAR(1),
    CUENTANIIF VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_FINAL_DET (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    SALDO NUMERIC(18,2),
    CUENTANIIF VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_INICIAL
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(60),
    NIT VARCHAR(20),
    DV CHAR(1),
    PROY VARCHAR(4),
    NOM_TERCERO VARCHAR(60),
    CENTRO VARCHAR(4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_INICIAL_DET (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    SALDO NUMERIC(18,2),
    CUENTANIIF VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_INICIAL_NIIF
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(140),
    NIT VARCHAR(20),
    DV CHAR(1),
    PROY VARCHAR(4),
    NOM_TERCERO VARCHAR(60),
    CENTRO VARCHAR(4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_MES (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1),
    SIMULACIERRE CHAR(1),
    NOTAS CHAR(1),
    SOLOMES CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    SCLASE NUMERIC(18,2),
    SGRUPO NUMERIC(18,2),
    SSUBGRUPO NUMERIC(18,2),
    SCUENTA NUMERIC(18,2),
    MCLASE NUMERIC(18,2),
    MGRUPO NUMERIC(18,2),
    MSUBGRUPO NUMERIC(18,2),
    MCUENTA NUMERIC(18,2),
    NIVEL INTEGER,
    MOVIMIEN NUMERIC(18,2),
    NETO NUMERIC(18,2),
    UOP CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_MES_DINAMIC (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV 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,
    CATEGORIA VARCHAR(10),
    FLUJO VARCHAR(20),
    MOVIMIEN NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_MES_NIIF (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1),
    SIMULACIERRE CHAR(1),
    NOTAS CHAR(1),
    SOLOMES CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(140),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    SCLASE NUMERIC(18,2),
    SGRUPO NUMERIC(18,2),
    SSUBGRUPO NUMERIC(18,2),
    SCUENTA NUMERIC(18,2),
    MCLASE NUMERIC(18,2),
    MGRUPO NUMERIC(18,2),
    MSUBGRUPO NUMERIC(18,2),
    MCUENTA NUMERIC(18,2),
    NIVEL INTEGER,
    MOVIMIEN NUMERIC(18,2),
    NETO NUMERIC(18,2),
    UOP CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_PRUEBA_ACUMULADO (
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER,
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    SIN_MOV CHAR(1),
    TERCEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    AFECTABLE CHAR(1),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    NOMCTATER VARCHAR(120),
    NIVEL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_PRUEBA_ACUMULADO_NIIF (
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER,
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    SIN_MOV CHAR(1),
    TERCEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(140),
    AFECTABLE CHAR(1),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    NOMCTATER VARCHAR(120),
    NIVEL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_TERCERO_ANO (
    CUENTA VARCHAR(20),
    ANO CHAR(4))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE 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))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_TERCERO_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BALANCE_TERCERO_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BASE_APORTES (
    IDNOMINA INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE BASE_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    PROY VARCHAR(4),
    CENTRO VARCHAR(4))
RETURNS (
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BASE_CUENTA_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    PROY VARCHAR(4),
    CENTRO VARCHAR(4))
RETURNS (
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BODEGA_FACTURACION (
    ARTIC VARCHAR(20),
    FECHA DATE,
    AGENCIA INTEGER,
    CODBOD VARCHAR(2),
    CANT NUMERIC(18,2))
RETURNS (
    BOD VARCHAR(2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BODEGA_FACTURACION_ALTERNA (
    ARTIC VARCHAR(20),
    FECHA DATE,
    AGENCIA INTEGER,
    CODBOD VARCHAR(2),
    CANT NUMERIC(18,2))
RETURNS (
    BOD VARCHAR(2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BONOS_DISPONIBLES (
    HOY DATE)
RETURNS (
    FORMA INTEGER,
    NUMERO VARCHAR(12),
    ITEM INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BORRA_DESCUADRADOS (
    TIPO CHAR(3),
    FECINI CHAR(8),
    FECFIN CHAR(8))
RETURNS (
    ID INTEGER,
    PREF CHAR(4),
    NUMERO CHAR(8),
    FECHA CHAR(8),
    DB NUMERIC(18,2),
    CR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BORRAR_FACTURAS (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    NUMERO VARCHAR(8),
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BORRAR_PEDIDO_WEB (
    ID INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE BORRE_APERTURA_NIIF (
    FECINI DATE,
    FECFIN DATE,
    NULO CHAR(1))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BORRE_CONTABIL_FACTURA (
    ID INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE BUSCA_ID_DOC (
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8))
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSCA_ID_DOC_CARTERA (
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSCA_ID_DOC_CXPAGAR (
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER,
    NUMPROV VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSCA_ID_DOC_CXPAGAR_P (
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER,
    NUMPROV VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSCAR_CHEQUES (
    CUENTA INTEGER)
RETURNS (
    ID INTEGER,
    CODCTA VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NOMTERC VARCHAR(60),
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1),
    CONFIRMA CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSCAR_DEVOLCHEQ (
    CUENTA INTEGER)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_ANTICIPOS_CLI (
    SUBEMPRESA INTEGER)
RETURNS (
    ANCL_ID INTEGER,
    PREF_PRE VARCHAR(4),
    ANCL_FECHA DATE,
    ANCL_NUMERO VARCHAR(8),
    ANCL_CONC VARCHAR(60),
    ANCL_BASE NUMERIC(18,2),
    ANCL_ANULADO CHAR(1),
    TERC_NIT VARCHAR(20),
    TERC_NOM VARCHAR(60),
    PREFRDC VARCHAR(4),
    RECA_NUMERO VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_ANTICIPOS_PRV (
    SUBEMPRESA INTEGER)
RETURNS (
    ANPR_ID INTEGER,
    TERC_NIT VARCHAR(20),
    PREF_PRE VARCHAR(4),
    ANPR_NUMERO VARCHAR(8),
    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(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_CAMPANAS (
    CUMPLIDOS CHAR(1),
    ANULADOS CHAR(1))
RETURNS (
    ID INTEGER,
    ABIERTA CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    NOMBRE VARCHAR(60),
    ITOK INTEGER,
    ITTOT INTEGER,
    PORCENTA NUMERIC(9,2),
    ANULADO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_DOCS_PRODUCCION (
    IDORD INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ANULADO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_EGRESOS (
    SUBEMPRESA INTEGER)
RETURNS (
    EGRE_ID INTEGER,
    PREF_PRE VARCHAR(4),
    EGRE_NUMERO VARCHAR(8),
    EGRE_FECHA DATE,
    EGRE_NOMTERC VARCHAR(60),
    EGRE_CONC VARCHAR(60),
    EGRE_MONTO NUMERIC(18,2),
    EGRE_RETEN NUMERIC(18,2),
    CLEG_NOMBRE VARCHAR(60),
    EGRE_ANULADO CHAR(1),
    EGRE_TIPO CHAR(1),
    EGRE_CAJA NUMERIC(18,2),
    EGRE_BANCO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_EVENTOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_EVENTOS_CLI (
    NIT VARCHAR(20))
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    HORA TIME,
    MOTIVO VARCHAR(60),
    TIPO VARCHAR(60),
    ASESOR VARCHAR(60),
    RESPUESTA VARCHAR(60),
    EXPLICA VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_IMPORTACIONES
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    REFERENCIA VARCHAR(60),
    CONCEPTO VARCHAR(60),
    ORDENES INTEGER,
    ORDENADO NUMERIC(18,2),
    FACTURAS INTEGER,
    FACTURADO NUMERIC(18,2),
    CERRADA CHAR(1),
    FECCIE DATE,
    ANULADO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_NOTAS_EVENTO (
    EVENTO INTEGER)
RETURNS (
    ID INTEGER,
    FECHA DATE,
    HORA TIME,
    ASESOR VARCHAR(60),
    TEXTO VARCHAR(60),
    ARCHIVO VARCHAR(1024),
    RESPUESTA VARCHAR(60),
    MINTOT SMALLINT,
    MINFAC SMALLINT,
    ANULADO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_ORDENES_COMPRA (
    SUBEMPRESA INTEGER)
RETURNS (
    ORDC_ID INTEGER,
    PREF_PRE VARCHAR(4),
    ORDC_NUMERO VARCHAR(6),
    ORDC_FECHA DATE,
    ORDC_VENCE DATE,
    TERC_NOM VARCHAR(60),
    ORDC_TOTAL NUMERIC(18,2),
    ORDC_IVAMONTO NUMERIC(18,2),
    TERC_NIT VARCHAR(20),
    ORDC_ANULADO CHAR(1),
    CANT NUMERIC(18,2),
    IDEST INTEGER,
    ESTADO VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_PENDIENTES (
    SUBEMPRESA INTEGER)
RETURNS (
    PEND_ID INTEGER,
    PREF_PRE VARCHAR(4),
    PEND_NUMERO VARCHAR(8),
    PEND_FECHA DATE,
    PEND_NOMCLI VARCHAR(60),
    PEND_TOTAL NUMERIC(18,2),
    PEND_IVAMONTO NUMERIC(18,2),
    VEND_COD INTEGER,
    PEND_ANULADO CHAR(1),
    PEND_FACTURA VARCHAR(12))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_PRODUCCION (
    SUBEMPRESA INTEGER)
RETURNS (
    PROR_ID INTEGER,
    PREF_PRE VARCHAR(4),
    PROR_NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





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),
    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),
    ACTIVO CHAR(1),
    ZONA VARCHAR(2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_REMESAS (
    SUBEMPRESA INTEGER,
    TIPO INTEGER)
RETURNS (
    CGRM_ID INTEGER,
    CGRM_PRE VARCHAR(4),
    CGRM_NUMERO VARCHAR(8),
    CGRM_FECHA DATE,
    DESTINO VARCHAR(60),
    ORIGEN VARCHAR(60),
    CGRM_TOTAL NUMERIC(18,2),
    CGRM_ANULADO CHAR(1),
    TIDO_COD INTEGER,
    PLANILLA VARCHAR(10),
    MANIFIESTO VARCHAR(10))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_REMISIONES (
    SUBEMPRESA INTEGER)
RETURNS (
    REVT_ID INTEGER,
    PREF_PRE VARCHAR(4),
    REVT_NUMERO VARCHAR(8),
    REVT_FECHA DATE,
    REVT_NOMTERC VARCHAR(60),
    REVT_TOTAL NUMERIC(18,2),
    REVT_IVAMONTO NUMERIC(18,2),
    VEND_COD INTEGER,
    PTVT_NOM VARCHAR(60),
    REVT_ANULADO CHAR(1),
    USADO CHAR(1),
    CIUD_COD VARCHAR(5))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE BUSQUEDA_TIQUETES (
    SUBEMPRESA INTEGER)
RETURNS (
    TIQP_ID INTEGER,
    TIQP_PREF VARCHAR(4),
    TIQP_NUMERO VARCHAR(8),
    TIQP_FECHA DATE,
    TIQP_NOMBRE VARCHAR(60),
    TIQP_PUESTO VARCHAR(60),
    RUTA_NOMBRE VARCHAR(60),
    TIQP_TOTAL NUMERIC(18,2),
    TIQP_ANULADO CHAR(1),
    PLANILLA VARCHAR(10))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CADENA_MES (
    MES INTEGER)
RETURNS (
    MESC CHAR(2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAF (
    DATO VARCHAR(200),
    LONGDATO INTEGER,
    TIPODATO CHAR(1))
RETURNS (
    DATOCEROS VARCHAR(200))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CALCULA_CESANTIA (
    NITEMP VARCHAR(20),
    SALARIO NUMERIC(18,2),
    FECLIQ DATE,
    FECCES DATE)
RETURNS (
    CESANTIA NUMERIC(18,2),
    INTCESANT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CALCULA_COMISIONES_NOMINA (
    FECINI DATE,
    FECFIN DATE,
    PERIODICIDAD INTEGER,
    PERIODO INTEGER,
    ANO CHAR(4))
RETURNS (
    IDCOMI INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CALCULA_CONSOLIDADO_FECHA
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CALCULA_CRUCE_PROVISIONAL
RETURNS (
    ID_PROV INTEGER,
    PREF_PROV VARCHAR(4),
    NUM_PROV VARCHAR(8),
    ID_RC INTEGER,
    FECHA_RC DATE,
    PREF_RC VARCHAR(4),
    NUM_RC VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CALCULA_INDEMNIZACION (
    EMPL VARCHAR(20),
    FECHA DATE)
RETURNS (
    DIASL INTEGER,
    INDEMNIZA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CALCULA_PORCPRECIO (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(20),
    PRECIO NUMERIC(18,2),
    COSTOU NUMERIC(18,2),
    COSTOP NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CALCULA_PRECIOS (
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CALCULA_PRIMA (
    NITEMP VARCHAR(20),
    SALARIO NUMERIC(18,2),
    FECLIQ DATE,
    FECPRI DATE)
RETURNS (
    PRIMA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CALCULA_VACACIONES (
    NITEMPL VARCHAR(20),
    FECLIQ DATE)
RETURNS (
    FECVAC DATE,
    DIASDIS NUMERIC(9,4),
    SALARIO NUMERIC(18,2),
    VACACION NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CALCULE_CESANTIA_LIQ (
    NITEMPL VARCHAR(20),
    FECLIQ DATE)
RETURNS (
    FECCES DATE,
    SALARIOC NUMERIC(18,2),
    CESANTIA NUMERIC(18,2),
    INTCESANT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CALCULE_DV
RETURNS (
    NIT VARCHAR(20),
    DV INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIA_CLIENTE (
    ANTES VARCHAR(20),
    NUEVO VARCHAR(20))
RETURNS (
    TIPODOC INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIA_CTAS_ARTI (
    ARTI_INI VARCHAR(15),
    ARTI_FIN VARCHAR(15))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CAMBIA_CTAS_CLIENTES (
    CLI_INI VARCHAR(15),
    CLI_FIN VARCHAR(15))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CAMBIA_CTAS_PROVEEDOR (
    PRO_INI VARCHAR(15),
    PRO_FIN VARCHAR(15))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CAMBIA_CUENTA_BANCO_CONTA (
    CUENTABCO INTEGER,
    CTACONTABLE VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    TIPO INTEGER,
    CONSEC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIA_IVA (
    ARTICULO VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    IVAMONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIA_TIVA (
    TANT INTEGER,
    TNUE INTEGER,
    PRECIOS CHAR(1),
    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
BEGIN
  EXIT;
END^





CREATE PROCEDURE CAMBIE_ID_AJUSTEINV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_AJUSTESINF
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ANTICLIE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ANTIPROV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_APLICLIE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_APLIPROV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ARQUEO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_AUTOCART
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CAMBART
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CAMBCOSTO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CAMBDOCU
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CAMPANA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CHEQUE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CIERANUAL
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CIERTERC
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_COMPRAS
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_COMPROBA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CONCILIAB
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CONFIRMDEPOS
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CONS
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CONSIGNA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CONSIGNATAR
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CONSNOMINA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CONSOLFP
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CONSUMO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_COTICOMP
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_COTIWEB
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_COTIZACI
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_CUENTA_BANCO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_DEPRECIA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_DESENSAMBLE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_DETCART
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_DEV_CHEQUES
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_DEVOLCLIE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_DEVOLPROV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_DISFVACAC
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_EGRESO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ENSAMBLE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ENTRADA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ENTRSALEMPL
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ENVIO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_EVENTO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_FACTCONT
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_FACTPER
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_FACTURA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_FACWEB
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_GASTOIMP
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_HORARIOEMPL
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_IMPORTA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_INTERBANCO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_INTERCAJA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_INTERCARTERA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_INTERCMP
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_INTERCOMPRA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_INTERCXPAGAR
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_INTERTRA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_INTERVTA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_INTINVENTARIO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_LIQRUTA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_LIQUIDACION
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_MANIFIESTO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_NOMINA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_NOMINA_PROV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_NOMINACOMISIONES
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_NOTA_CR_BANCO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_NOTA_DB_BANCO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_NOTACRCLIE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_NOTACRPROV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_NOTADBCLIE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_NOTADBPROV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_NOVEDAD
RETURNS (
    IDN INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ORDEMBARQUE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ORDENCOMP
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ORDENMCIA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_ORDENPROD
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PAGO_NOMINA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PEDIDO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PEDWEB
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PENDIENTE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PLANILLAP
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PLANPROD
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PLANTILLA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PRESTAMOS
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PRODDEV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PRODENT
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_PRODSAL
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_RECICAJA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_RECIPROV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_REDIPTOS
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_REDPTOSV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_REMESAC
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_REMICLIE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_REMIPROV
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_RESERVA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_RETIRO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_REVPRECIO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_RUTERO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_SALIDA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_SOLIMP
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_TIQUETE
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_TRANSFER
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_TRASLACAJA
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_TRASLADO
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_ID_VACACION
RETURNS (
    IDN INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIE_IDNOTADOC
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIO_ANO_CONTA (
    ANOA CHAR(4),
    ANON CHAR(4))
RETURNS (
    ID INTEGER,
    FECHA CHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIO_CODIGO_ARTICULO (
    CODANT VARCHAR(20),
    CODNUE VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CAMBIO_PRECIOS (
    FECHA DATE)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CAMBIO_PRECIOS_IVA (
    FECINI DATE,
    FECFIN DATE,
    LISTA INTEGER,
    IVAANT NUMERIC(18,2),
    IVANUE NUMERIC(18,2))
RETURNS (
    ARTICULO VARCHAR(20),
    PRECIOANT NUMERIC(18,2),
    PRECIONUE NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIO_TARIFA_IVA (
    FECINI DATE,
    FECFIN DATE,
    TARIFANT INTEGER,
    TARIFNUE INTEGER)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    TARIFA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIOS_PATRIMONIO (
    ANO CHAR(4))
RETURNS (
    CONCEPTO VARCHAR(60),
    CTA31 NUMERIC(18,2),
    CTA32 NUMERIC(18,2),
    CTA33 NUMERIC(18,2),
    CTA34 NUMERIC(18,2),
    CTA35 NUMERIC(18,2),
    CTA36 NUMERIC(18,2),
    CTA38 NUMERIC(18,2),
    TOTALMOV NUMERIC(18,2),
    SAL31 NUMERIC(18,2),
    SAL32 NUMERIC(18,2),
    SAL33 NUMERIC(18,2),
    SAL34 NUMERIC(18,2),
    SAL35 NUMERIC(18,2),
    SAL36 NUMERIC(18,2),
    SAL38 NUMERIC(18,2),
    TOTALSAL NUMERIC(18,2),
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAMBIOS_SITUACION (
    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),
    TOTAL5 NUMERIC(18,2),
    NOMSECCION VARCHAR(120))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CANCELE_FACTURA (
    ID INTEGER,
    ABONO NUMERIC(18,2),
    FORMAP INTEGER)
RETURNS (
    IDR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CANTIDAD_POR_FACTOR (
    CODIGO VARCHAR(15),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8))
RETURNS (
    CANTFAC NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CARTERA_CLIENTE (
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    MONEDA INTEGER,
    SOLOPESOS CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    CODSUC VARCHAR(10),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    COBR INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    VENCE DATE,
    FECDOC DATE,
    DIAS INTEGER,
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1),
    NOTA VARCHAR(256),
    TRMDOC NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CARTERA_CLIENTES_OFFLINE (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    COBINI INTEGER,
    COBFIN INTEGER,
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    HOY CHAR(1),
    MONEDA INTEGER,
    VEND 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(3),
    NOMZONA VARCHAR(60),
    NOMSUBZ VARCHAR(60),
    NOMCANA VARCHAR(60),
    NOMSUBC VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    DIASBL INTEGER,
    RESALTAR CHAR(1),
    INSTCART VARCHAR(255),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CARTERA_PUNTO_DIA (
    FECHA DATE,
    PTOVTA INTEGER)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CLIENTE VARCHAR(60),
    TOTAL NUMERIC(18,2),
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CARTERA_TOTAL (
    FECHA DATE)
RETURNS (
    CARTERA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAUSA_DIFERENCIA_CAMBIO (
    FECHA DATE,
    TIPOCOMP VARCHAR(3),
    PREFCONT VARCHAR(4),
    NUMCONT VARCHAR(8),
    TRM NUMERIC(18,2),
    CTACARTERA VARCHAR(20))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    DIFERENCIA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAUSA_NOM1EMPLEADO (
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    NITE VARCHAR(20))
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAUSA_NOM2EMPLEADO (
    IDNOMINA INTEGER,
    NITE VARCHAR(20))
RETURNS (
    ITEMINI INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAUSA_NOMINA (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAUSA_NOMINA_1_EMPLEADO (
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    NITE VARCHAR(20))
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAUSA_NOMINA_EMPLEADO (
    FECHA DATE,
    NITE VARCHAR(20),
    DIAS INTEGER,
    PAOB CHAR(1),
    VACAC CHAR(1))
RETURNS (
    CONC_COD INTEGER,
    CONC_NOMBRE VARCHAR(60),
    ENTIDAD VARCHAR(20),
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAUSA_NOMINA_VACACIONES (
    FECHA DATE,
    NITE VARCHAR(20),
    DIAS INTEGER,
    MONTO NUMERIC(18,2))
RETURNS (
    CONC_COD INTEGER,
    CONC_NOMBRE VARCHAR(60),
    ENTIDAD VARCHAR(20),
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAUSA_NOMINA1 (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAUSA_NOMINA2 (
    IDNOMINA INTEGER,
    DEPTO INTEGER)
RETURNS (
    ITEMINI INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CAUSA_RETENCION_LABORAL (
    NITE VARCHAR(20),
    VACAID INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CEROS_ANCHO_FIJO (
    DATO VARCHAR(200),
    LONGDATO INTEGER,
    TIPODATO CHAR(1))
RETURNS (
    DATOCEROS VARCHAR(200))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CERRAR_IMPORTACION (
    ID INTEGER,
    FECCIE DATE)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CERTIFICA_LABORAL (
    FEC DATE,
    NITEMPL VARCHAR(20))
RETURNS (
    NOMEMPL VARCHAR(60),
    FECING DATE,
    SALARIO NUMERIC(18,2),
    RECYEXT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    SALARIOLET VARCHAR(200),
    NOMTIPOCONT VARCHAR(60),
    FECHAEXPED DATE,
    CARGOEMPL VARCHAR(60),
    FIRMA VARCHAR(100),
    CARGOFIRMA VARCHAR(100))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CERTIFICADOS_RETENCION (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    FECINI VARCHAR(8),
    FECFIN VARCHAR(8),
    PRYINI VARCHAR(4),
    PRYFIN VARCHAR(4),
    CENINI VARCHAR(4),
    CENFIN VARCHAR(4),
    FECEXP DATE,
    ADMON VARCHAR(60),
    NUMERAR CHAR(1),
    INICIAL VARCHAR(6))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    CODCUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60),
    BASEIVA NUMERIC(18,2),
    BASE NUMERIC(18,2),
    PAGADO NUMERIC(18,2),
    PORC NUMERIC(9,2),
    RETENCION NUMERIC(18,2),
    FECHAEXP DATE,
    ADMINISTRACION VARCHAR(60),
    NUMERO VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    GASTOS NUMERIC(18,2),
    PENSION NUMERIC(18,2),
    TOTALVACAC NUMERIC(18,2),
    CESANTIA NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    APSALUD NUMERIC(18,2),
    APPENSION NUMERIC(18,2),
    VOLUNTARIOS NUMERIC(18,2),
    RETENCION NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CHEQUEA_VENCIMIENTOS_CARGOS
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_COSTOS (
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_COSTOS_NIIF (
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_INVENTARIO (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_INVENTARIO_FECHA (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    FECINI DATE,
    CLASE INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_LOTES (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_LOTES2 (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_MOVIMIENTO_ARTICULO (
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES (
    CLIINI VARCHAR(20),
    CLIFIN VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR (
    PRVINI VARCHAR(20),
    PRVFIN VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_PRESTAMOS (
    NIT VARCHAR(20))
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    MONTO NUMERIC(18,2),
    ANO CHAR(4),
    PERIODO INTEGER,
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CHEQUEO_PUNTOS_CLIENTE (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    FECINI DATE)
RETURNS (
    ID INTEGER,
    NIT VARCHAR(20),
    FECHA DATE,
    DB NUMERIC(18,2),
    CR NUMERIC(18,2),
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CHEQUEO_PUNTOS_VENDEDOR (
    FECINI DATE,
    FECFIN DATE)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_SALDOS_BANCOS
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_SALDOS_CAJAS (
    CAJAINI INTEGER,
    CAJAFIN INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_SALDOS_CAJAS_FECHA (
    CAJAINI INTEGER,
    CAJAFIN INTEGER,
    FECINI DATE)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_SALDOS_CONTA (
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_SALDOS_CONTA_NIIF (
    FECINI CHAR(8),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA (
    CLIINI VARCHAR(20),
    CLIFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR (
    PRVINI VARCHAR(20),
    PRVFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CHEQUEO_STANDS
RETURNS (
    ARTICULO VARCHAR(20),
    BODEGA VARCHAR(2),
    STAND VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CHEQUES_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CIERRE_FACTURACION (
    FECHA DATE,
    PUNTO INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PREF VARCHAR(4),
    AUTORIZA VARCHAR(20),
    PUNTOVTA VARCHAR(60),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    NROFAC INTEGER,
    HORAINI TIME,
    HORAFIN TIME,
    BASEFAC NUMERIC(18,2),
    IVAFAC NUMERIC(18,2),
    BASEINALCF NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    INALCF NUMERIC(18,2),
    DEC2799F NUMERIC(18,2),
    EXTRAF NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    NROITE INTEGER,
    NRODEV INTEGER,
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    BASEINALCD NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2),
    INALCD NUMERIC(18,2),
    DEC2799D NUMERIC(18,2),
    EXTRAD NUMERIC(18,2),
    TOTALDEV NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    EGRESOS NUMERIC(18,2),
    BASENETO NUMERIC(18,2),
    IVANETO NUMERIC(18,2),
    CONSUMON NUMERIC(18,2),
    BASEINALCN NUMERIC(18,2),
    INALCN 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),
    BASEF5 NUMERIC(18,2),
    IVAF5 NUMERIC(18,2),
    DEC2799F5 NUMERIC(18,2),
    TOTALF5 NUMERIC(18,2),
    BASED5 NUMERIC(18,2),
    IVAD5 NUMERIC(18,2),
    DEC2799D5 NUMERIC(18,2),
    TOTALD5 NUMERIC(18,2),
    BASEF6 NUMERIC(18,2),
    IVAF6 NUMERIC(18,2),
    DEC2799F6 NUMERIC(18,2),
    TOTALF6 NUMERIC(18,2),
    BASED6 NUMERIC(18,2),
    IVAD6 NUMERIC(18,2),
    DEC2799D6 NUMERIC(18,2),
    TOTALD6 NUMERIC(18,2),
    BASEF7 NUMERIC(18,2),
    IVAF7 NUMERIC(18,2),
    DEC2799F7 NUMERIC(18,2),
    TOTALF7 NUMERIC(18,2),
    BASED7 NUMERIC(18,2),
    IVAD7 NUMERIC(18,2),
    DEC2799D7 NUMERIC(18,2),
    TOTALD7 NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    FORMAP6 NUMERIC(18,2),
    FORMAP7 NUMERIC(18,2),
    FORMAP8 NUMERIC(18,2),
    FORMAP9 NUMERIC(18,2),
    FORMAP10 NUMERIC(18,2),
    FORMAP11 NUMERIC(18,2),
    FORMAP12 NUMERIC(18,2),
    FORMAP13 NUMERIC(18,2),
    FORMAP14 NUMERIC(18,2),
    FORMAP15 NUMERIC(18,2),
    FORMAPE1 NUMERIC(18,2),
    FORMAPE2 NUMERIC(18,2),
    FORMAPE3 NUMERIC(18,2),
    FORMAPE4 NUMERIC(18,2),
    FORMAPE5 NUMERIC(18,2),
    FORMAPE6 NUMERIC(18,2),
    FORMAPE7 NUMERIC(18,2),
    FORMAPE8 NUMERIC(18,2),
    FORMAPE9 NUMERIC(18,2),
    FORMAPE10 NUMERIC(18,2),
    FORMAPE11 NUMERIC(18,2),
    FORMAPE12 NUMERIC(18,2),
    FORMAPE13 NUMERIC(18,2),
    FORMAPE14 NUMERIC(18,2),
    FORMAPE15 NUMERIC(18,2),
    CANTFP1 INTEGER,
    CANTFP2 INTEGER,
    CANTFP3 INTEGER,
    CANTFP4 INTEGER,
    CANTFP5 INTEGER,
    CANTFP6 INTEGER,
    CANTFP7 INTEGER,
    CANTFP8 INTEGER,
    CANTFP9 INTEGER,
    CANTFP10 INTEGER,
    CANTFP11 INTEGER,
    CANTFP12 INTEGER,
    CANTFP13 INTEGER,
    CANTFP14 INTEGER,
    CANTFP15 INTEGER,
    CARTERA NUMERIC(18,2),
    RETES NUMERIC(18,2),
    VENDEDOR1 VARCHAR(60),
    VTAVEND1 NUMERIC(18,2),
    VENDEDOR2 VARCHAR(60),
    VTAVEND2 NUMERIC(18,2),
    VENDEDOR3 VARCHAR(60),
    VTAVEND3 NUMERIC(18,2),
    VENDEDOR4 VARCHAR(60),
    VTAVEND4 NUMERIC(18,2),
    VENDEDOR5 VARCHAR(60),
    VTAVEND5 NUMERIC(18,2),
    NROFACTANUL INTEGER,
    IVANUL NUMERIC(18,2),
    TOTALFACANUL NUMERIC(18,2),
    SALDOCAJA NUMERIC(18,2),
    ARQUEO NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    SOBRANTE NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CIERRE_FACTURACION_VEND (
    FECHA DATE,
    PUNTO INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PUNTOVTA VARCHAR(60),
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NROFAC INTEGER,
    BASEFAC NUMERIC(18,2),
    IVAFAC NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    NROITE INTEGER,
    NRODEV INTEGER,
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    TOTALDEV NUMERIC(18,2),
    BASENETO NUMERIC(18,2),
    IVANETO NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    FORMAP6 NUMERIC(18,2),
    FORMAP7 NUMERIC(18,2),
    FORMAP8 NUMERIC(18,2),
    FORMAP9 NUMERIC(18,2),
    FORMAP10 NUMERIC(18,2),
    FORMAP11 NUMERIC(18,2),
    FORMAP12 NUMERIC(18,2),
    FORMAP13 NUMERIC(18,2),
    FORMAP14 NUMERIC(18,2),
    FORMAP15 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    RETES NUMERIC(18,2),
    NROFACTANUL INTEGER,
    IVANUL NUMERIC(18,2),
    TOTALFACANUL NUMERIC(18,2),
    TNROFAC INTEGER,
    TBASEFAC NUMERIC(18,2),
    TIVAFAC NUMERIC(18,2),
    TTOTALFAC NUMERIC(18,2),
    TNROITE INTEGER,
    TNRODEV INTEGER,
    TBASEDEV NUMERIC(18,2),
    TIVADEV NUMERIC(18,2),
    TTOTALDEV NUMERIC(18,2),
    TBASENETO NUMERIC(18,2),
    TIVANETO NUMERIC(18,2),
    TTOTALNETO NUMERIC(18,2),
    TFORMAP1 NUMERIC(18,2),
    TFORMAP2 NUMERIC(18,2),
    TFORMAP3 NUMERIC(18,2),
    TFORMAP4 NUMERIC(18,2),
    TFORMAP5 NUMERIC(18,2),
    TFORMAP6 NUMERIC(18,2),
    TFORMAP7 NUMERIC(18,2),
    TFORMAP8 NUMERIC(18,2),
    TFORMAP9 NUMERIC(18,2),
    TFORMAP10 NUMERIC(18,2),
    TFORMAP11 NUMERIC(18,2),
    TFORMAP12 NUMERIC(18,2),
    TFORMAP13 NUMERIC(18,2),
    TFORMAP14 NUMERIC(18,2),
    TFORMAP15 NUMERIC(18,2),
    TCARTERA NUMERIC(18,2),
    TRETES NUMERIC(18,2),
    TNROFACTANUL INTEGER,
    TIVANUL NUMERIC(18,2),
    TTOTALFACANUL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CIERRE_FORMAPAGO (
    FECHA DATE,
    PUNTO INTEGER,
    PREFIJO VARCHAR(4),
    FP INTEGER)
RETURNS (
    CANT INTEGER,
    TOTAL NUMERIC(18,2),
    MONEDAEX NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CLASIFICA_INVENTARIO (
    FECHA DATE,
    DIAS INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CLIENTES_ARTICULO (
    FECINI DATE,
    FECFIN DATE,
    ARTICULO VARCHAR(15),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCLI VARCHAR(20),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CLIENTES_DESCUENTO (
    FECINI DATE,
    FECFIN DATE,
    IDDTO INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FECHA DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANT NUMERIC(18,2),
    PRUNIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CLIENTES_SIN_REGISTRO (
    COBRADOR INTEGER,
    VENDEDOR INTEGER,
    LISTA INTEGER,
    ZONA VARCHAR(2))
RETURNS (
    NIT VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COBRADOR_NOTAS
RETURNS (
    NIT VARCHAR(20),
    COBR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CODIGO_BARRAS (
    ARTICULO VARCHAR(15))
RETURNS (
    CODIGO VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CODIGOS_BARRAS (
    CODIGO VARCHAR(20))
RETURNS (
    BARRAS VARCHAR(20),
    DESCRIPCION VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COLA_FUNCIONES (
    OPERARIO INTEGER,
    FUNCOCI INTEGER,
    CONFIRMA CHAR(1))
RETURNS (
    ITEM INTEGER,
    ARTICOD VARCHAR(15),
    FECHA DATE,
    CANT SMALLINT,
    TIEMPOF SMALLINT,
    TIEMPOO SMALLINT,
    ESTADO CHAR(1),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    HORA TIME,
    TIEMPOR SMALLINT,
    OPER INTEGER,
    TIEMPOA TIME,
    ARTIDES VARCHAR(60),
    NOMESTADO VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMISIONES_ARTICULO (
    DETALLE CHAR(1),
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    CEROS CHAR(1),
    AGENCIA INTEGER,
    SOLOTOT CHAR(1))
RETURNS (
    CODVEND VARCHAR(10),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(10),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    CANTDEV NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    BASEDEV NUMERIC(18,2),
    PORC NUMERIC(18,2),
    COMISION NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PUNTOVTA INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMISIONES_COBRO (
    DESDE INTEGER,
    HASTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1))
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECDOC DATE,
    PUNTOVTA INTEGER,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(8),
    FECREC DATE,
    DIAS INTEGER,
    ABONO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMIMONTO NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    ARTICULO VARCHAR(20),
    ARTIDES VARCHAR(60),
    CODGRP VARCHAR(2),
    CODMAR VARCHAR(3),
    CANT NUMERIC(18,4),
    DTOFIN NUMERIC(18,2),
    VENCE DATE,
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    FECDOC DATE,
    PUNTOVTA INTEGER,
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPARA_CENTROS (
    ANO CHAR(4),
    MES INTEGER,
    PROY1 VARCHAR(4),
    CEN1 VARCHAR(4),
    PROY2 VARCHAR(4),
    CEN2 VARCHAR(4))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(60),
    NOM_CENTRO VARCHAR(60),
    INICIAL1 NUMERIC(18,2),
    DEBITOS1 NUMERIC(18,2),
    CREDITOS1 NUMERIC(18,2),
    FINAL1 NUMERIC(18,2),
    INICIAL2 NUMERIC(18,2),
    DEBITOS2 NUMERIC(18,2),
    CREDITOS2 NUMERIC(18,2),
    FINAL2 NUMERIC(18,2),
    NIVEL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPARA_CENTROS_NIIF (
    ANO CHAR(4),
    MES INTEGER,
    PROY1 VARCHAR(4),
    CEN1 VARCHAR(4),
    PROY2 VARCHAR(4),
    CEN2 VARCHAR(4))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(140),
    NOM_CENTRO VARCHAR(60),
    INICIAL1 NUMERIC(18,2),
    DEBITOS1 NUMERIC(18,2),
    CREDITOS1 NUMERIC(18,2),
    FINAL1 NUMERIC(18,2),
    INICIAL2 NUMERIC(18,2),
    DEBITOS2 NUMERIC(18,2),
    CREDITOS2 NUMERIC(18,2),
    FINAL2 NUMERIC(18,2),
    NIVEL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPARA_INVENTARIO (
    FECHA1 DATE,
    FECHA2 DATE,
    BODEGA VARCHAR(2),
    CEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    ESTADO CHAR(1),
    CANT1 NUMERIC(18,4),
    COSTO1 NUMERIC(18,2),
    CANT2 NUMERIC(18,4),
    COSTO2 NUMERIC(18,2),
    DIFCANT NUMERIC(18,4),
    DIFCOSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPARA_ITEM_FACTURA (
    IDFAC INTEGER,
    ITEM INTEGER,
    CODBAR VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPARA_MOVCAJA_DOCCAJA (
    CAJAINI INTEGER,
    CAJAFIN INTEGER)
RETURNS (
    CAJAID INTEGER,
    CAJANOM VARCHAR(60),
    SALDO NUMERIC(18,2),
    MONTOE NUMERIC(18,2),
    MONTOO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE COMPARA_SALIDAS_ENTRADAS (
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    TIVA NUMERIC(18,2),
    CANTS NUMERIC(18,2),
    CANTE NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    TOTALPR NUMERIC(18,2),
    TOTALCO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPLETA_CEROS (
    NUMERO VARCHAR(6))
RETURNS (
    NUMCEROS VARCHAR(6))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPLETA_CEROS8 (
    NUMERO VARCHAR(8))
RETURNS (
    NUMCEROS VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPLETA_NUMERO_COMPROBANTE
RETURNS (
    ID INTEGER,
    NUMERO VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPONE_FECHA (
    ANO CHAR(4),
    PERIODO INTEGER,
    DIA INTEGER)
RETURNS (
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPONE_FECHA_CONTA (
    ANO CHAR(4),
    PERIODO INTEGER,
    DIA INTEGER)
RETURNS (
    FECHA CHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE COMPRAS_ARTICULO_DETALLE (
    ARTICULO VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    IDFACT INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NUMPROV VARCHAR(15),
    NIT VARCHAR(20),
    PROVEEDOR VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2),
    DESCTO NUMERIC(9,2),
    NETO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPRAS_ARTICULO_MES (
    FECINI DATE,
    FECFIN DATE,
    GRUPO 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),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    IVAVTAS NUMERIC(18,2),
    TOTVTAS NUMERIC(18,2),
    CANTDEV NUMERIC(18,4),
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    TOTDEV NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPRAS_GRUPO (
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    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
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE COMPROBANTES_ACTIVO (
    ACTIVO VARCHAR(20))
RETURNS (
    ID INTEGER,
    TIPO VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(20),
    TIPOREF INTEGER,
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPROBANTES_DIARIO (
    FECINI VARCHAR(8),
    FECFIN VARCHAR(8),
    CONSOLIDADO CHAR(1))
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COMPROBANTES_TERCERO (
    NIT VARCHAR(20))
RETURNS (
    ID INTEGER,
    TIPO VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(20),
    CUENTA VARCHAR(20),
    MONTO NUMERIC(18,2),
    TIPOREF INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONCILIA_BANCO (
    ID INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CONCILIA_BANCO_ACT (
    ID INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE 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(8),
    FECCONTA CHAR(10),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    FECCONTA CHAR(10),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    DEBITOSC NUMERIC(18,2),
    CREDITOSC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    MONTO NUMERIC(18,2),
    FECCONTA CHAR(10),
    MONTOC NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(8),
    CTAINVEN VARCHAR(20),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONCILIA_DEVCOMPRAS (
    FECINI DATE,
    FECFIN DATE,
    CTAEXE VARCHAR(20),
    CTAGRA VARCHAR(20),
    CTAOTRO VARCHAR(20))
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(8),
    CTAVENTAS VARCHAR(20),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONCILIA_PAT_DETALLE (
    ANO CHAR(4),
    MES INTEGER,
    CUENTA VARCHAR(20))
RETURNS (
    ID INTEGER,
    CONSEC INTEGER,
    TICO VARCHAR(3),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    DB2649 NUMERIC(18,2),
    CR2649 NUMERIC(18,2),
    DBNIIF NUMERIC(18,2),
    CRNIIF NUMERIC(18,2),
    DIF NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(8),
    CTAVENTAS VARCHAR(20),
    MONTO NUMERIC(18,2),
    MONTOC NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONCILIACION_PATRIMONIAL (
    ANO CHAR(4),
    MES INTEGER,
    NIVSAL INTEGER)
RETURNS (
    CUENTA VARCHAR(20),
    NOMBRE VARCHAR(60),
    CUENTANIIF VARCHAR(20),
    NOMBRENIIF VARCHAR(140),
    SALDO NUMERIC(18,2),
    SALDONIIF NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2),
    PORCENTAJE NUMERIC(9,2),
    NIVEL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONFIRMA_RUTERO_FAC (
    TIPO INTEGER,
    RUTA INTEGER,
    FECHA DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSECUTIVOS_CONTA (
    TIPOINI VARCHAR(3),
    TIPOFIN VARCHAR(3),
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    CONSOLIDADO CHAR(1),
    NIIF CHAR(1))
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMTIPO VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSIGNA_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSOLIDA_ARTICULOS (
    ARTICULOV VARCHAR(20),
    ARTICULON VARCHAR(20))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSOLIDA_CONC_NOMINA (
    ID_NOMINA INTEGER)
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSOLIDA_CONC_NOMINA_PROV (
    ID_NOMINA INTEGER,
    TIPPAGO INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CONSOLIDA_ITEMS_AJUSTE (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    ITEM1 INTEGER,
    ITEM2 INTEGER,
    ARTIC VARCHAR(20),
    CANT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSOLIDADO_PROVISIONES (
    ANO CHAR(4),
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    INACTIVOS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    VACACION NUMERIC(18,2),
    PROVVAC NUMERIC(18,2),
    PAGOVAC NUMERIC(18,2),
    SALARIOV NUMERIC(18,2),
    DIASV INTEGER,
    FECHAV DATE,
    CESANTIA NUMERIC(18,2),
    PAGOCES NUMERIC(18,2),
    PROVCES NUMERIC(18,2),
    SALARIOC NUMERIC(18,2),
    FECHAC DATE,
    INTCES NUMERIC(18,2),
    PAGOICES NUMERIC(18,2),
    PROVICES NUMERIC(18,2),
    PRIMA NUMERIC(18,2),
    PROVPRI NUMERIC(18,2),
    SALARIOP NUMERIC(18,2),
    FECHAP DATE,
    PAGOPRI NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSOLIDE_AJUSTES (
    FECHA DATE,
    PREF VARCHAR(4),
    BOD VARCHAR(2),
    CEROS CHAR(1))
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSOLIDE_PENDIENTES (
    IDCONS INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CONSOLIDE_PRODUCCION (
    PLANID INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CONSULTA_ARTICULOS (
    INACTIVOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    CONSUMO NUMERIC(18,2),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    CODIGO1 VARCHAR(20),
    CODIGO2 VARCHAR(20),
    CODIGO3 VARCHAR(20),
    UNIDAD2 VARCHAR(8),
    FACTOR2 NUMERIC(18,4),
    UNIDAD3 VARCHAR(8),
    FACTOR3 NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSULTA_ARTICULOS_MOVIL (
    BUSCAR VARCHAR(100))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    DESCORTA VARCHAR(30),
    GRUPO VARCHAR(30),
    SUBGR VARCHAR(3),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ALTERNATIVA VARCHAR(30),
    IVA NUMERIC(9,2),
    CONSUMO NUMERIC(18,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSULTA_ARTICULOS_MOVILC (
    BUSCAR VARCHAR(100))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    DESCORTA VARCHAR(30),
    GRUPO VARCHAR(30),
    SUBGR VARCHAR(3),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ALTERNATIVA VARCHAR(30),
    IVA NUMERIC(9,2),
    CONSUMO NUMERIC(18,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    UNIDAD1 VARCHAR(8),
    PRECIO1 NUMERIC(18,2),
    UNIDAD2 VARCHAR(8),
    PRECIO2 NUMERIC(18,2),
    UNIDAD3 VARCHAR(8),
    PRECIO3 NUMERIC(18,2),
    PUM NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSULTA_ARTICULOS_WEB (
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    UNIALT1 VARCHAR(8),
    FACTCN1 NUMERIC(18,2),
    FACTPR1 NUMERIC(18,2),
    UNIALT2 VARCHAR(8),
    FACTCN2 NUMERIC(18,2),
    FACTPR2 NUMERIC(18,2),
    UNIALT3 VARCHAR(8),
    FACTCN3 NUMERIC(18,2),
    FACTPR3 NUMERIC(18,2),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    IVA NUMERIC(9,2),
    ESTAMPILLA NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    PRECIO2 NUMERIC(18,2),
    CANTMIN2 NUMERIC(18,2),
    PRECIO3 NUMERIC(18,2),
    CANTMIN3 NUMERIC(18,2),
    PRECIO4 NUMERIC(18,2),
    CANTMIN4 NUMERIC(18,2),
    BARRAS SMALLINT)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSULTA_BALANCE_MES (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1),
    NIVSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    NIVEL INTEGER,
    SUMINI NUMERIC(18,2),
    SUMDB NUMERIC(18,2),
    SUMCR NUMERIC(18,2),
    SUMFIN NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSULTA_BALANCE_MES_NIIF (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1),
    NIVSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(140),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    NIVEL INTEGER,
    SUMINI NUMERIC(18,2),
    SUMDB NUMERIC(18,2),
    SUMCR NUMERIC(18,2),
    SUMFIN NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSULTA_CLIENTES
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CODIGO VARCHAR(20),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    COBR INTEGER,
    NOMCOBR VARCHAR(60),
    ESTADO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSULTA_EXISTENCIAS_WEB (
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(20),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    AGENCIA INTEGER,
    EXISTENCIA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSULTA_PRESUPUESTO_MES (
    ANO CHAR(4),
    MES INTEGER,
    PROY CHAR(4),
    CENT CHAR(4))
RETURNS (
    CUENTA VARCHAR(20),
    NOMBRE VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSULTA_PUNTOS_CLIENTE (
    IDDOC INTEGER,
    CLIENTE VARCHAR(20),
    FECHA DATE)
RETURNS (
    PTDOC INTEGER,
    PTACUM INTEGER,
    PTVENCER INTEGER,
    FECPTOS DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSULTA_PUNTOS_VENDEDOR (
    VEND INTEGER,
    FECHA DATE)
RETURNS (
    PTACUM INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSUMO_HISTORICO (
    ARTIC VARCHAR(20),
    FECHA DATE)
RETURNS (
    CONSUMO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONSUMO_PRECIOS
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CONTABIL_AJUSTE (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_AJUSTE_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_APLICACL (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_APLICACL_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_APLICAPR (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_APLICAPR_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_CAMBCOSTO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_CAMBCOSTO_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_CHEQUE (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_CIERRE_COMP_INT (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_CONSIGNA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_CONSIGNA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_CONSIGNATAR (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_CONSIGNATAR_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_COSTOS (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_COSTOS_CONTADO (
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_DESENSAMBLE (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_DESENSAMBLE_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_DETERIORO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_DEVOLCHEQ (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_DEVOLCHEQ_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_DEVOLCLI (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_DEVOLCLI_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_DEVOLCOMP (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_DEVOLCOMP_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_EGRESO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_EGRESO_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_ENSAMBLE (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_ENSAMBLE_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_ENTRADA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_ENTRADA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_FACTCOMP (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_FACTCOMP_INT (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_FACTCOMP_INTN (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_FACTCOMP_IVA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_FACTCOMP_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_FACTURA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_FACTURA_FACTOR (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_FACTURA_IVA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_FACTURA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_FACTURAS_CONTADO_NIT (
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_LIQRUTA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_MANIFIESTO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOMINA (
    IDDOC INTEGER)
RETURNS (
    ERROR INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTACRBC (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTACRBC_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTACRCL (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTACRCL_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTACRPR (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTACRPR_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTADBBC (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTADBBC_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTADBCL (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTADBCL_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTADBPR (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_NOTADBPR_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_PAGONOMI (
    IDDOC INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CONTABIL_PLANILLA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_PRODDEV_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_PRODENT_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_PRODSAL_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_PRODUCCION (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_PRODUCCION_DEV (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_PRODUCCION_ENT (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_PRODUCCION_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_PRODUCCION_SAL (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_RECICAJA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_RECICAJA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_RECIPROV (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_RECIPROV_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_REMESA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_REMICLIE (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_REMICLIE_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_REMIPROV (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_REMIPROV_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_RETIRO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_RUTERO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_SALIDA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_SALIDA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_TRASCUENTA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_TRASCUENTA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_TRASLACAJA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_TRASLACAJA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_TRASLAMERCANCIA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABIL_TRASMERC_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABILICE_COMP_SIMPLIFICADO (
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABILICE_COSTO_VENTAS (
    TIPO INTEGER,
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABILICE_EQUIVALENCIA_NIIF (
    IDC INTEGER,
    BORRAR CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    ESTADO CHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTABILIZA_PENDIENTE (
    IDCNT INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CONTABILIZA_PENDIENTE_NIIF (
    IDCNT INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CONTACTOS_CLIENTE (
    NIT VARCHAR(20))
RETURNS (
    ID INTEGER,
    NOMBRE VARCHAR(60),
    CARGO VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTADO_COSTOS (
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTADO_MVERDE (
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTADO_MVERDE_NIT (
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTADO_MVERDE2 (
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CONTADOS_SIN_RECIBO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VEND INTEGER,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    MONTO NUMERIC(18,2),
    IVAM NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    CAJA INTEGER,
    SUCURSAL VARCHAR(10))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COPIA_CUENTAS_NIIF
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE COPIA_INTERFAZ_BANCOS (
    TIPO INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE COPIA_LISTA_PRECIOS (
    ORIGEN INTEGER,
    DESTINO INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE COPIA_SALDOS_NIIF (
    ANO CHAR(4),
    MES INTEGER,
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
RETURNS (
    CODIGO VARCHAR(20),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    SALDO NUMERIC(18,2),
    CUENTANIIF VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CORREOS_TERCERO (
    NIT VARCHAR(20),
    CARTERA CHAR(1))
RETURNS (
    EMAIL VARCHAR(100))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CORTE_CXPAGAR (
    FECHA DATE)
RETURNS (
    TIPO INTEGER,
    IDDOC INTEGER,
    FECDOC DATE,
    NIT VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_EN_VENTAS (
    TIPO INTEGER,
    ID INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE COSTO_EN_VENTAS_CONTADO (
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE COSTO_EN_VENTAS_CONTADO_NIT (
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER,
    NIT VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE COSTO_EN_VENTAS_NIIF (
    TIPO INTEGER,
    ID INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE COSTO_NIIF_PROM_Y_ULT_UNIDAD (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTOP NUMERIC(18,2),
    UCOSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_PROMEDIO (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTOP NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_PROMEDIO_NIIF (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTOP NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_PROMEDIO_UNIDAD (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_PROMEDIO_UNIDAD_NIIF (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_PROMEDIO_Y_ULTIMO (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTOP NUMERIC(18,2),
    UCOSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_PROMEDIO_Y_ULTIMO_NIIF (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTOP NUMERIC(18,2),
    UCOSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_PROVEEDOR (
    NIT VARCHAR(20),
    ARTI VARCHAR(15),
    UNI VARCHAR(8),
    FECHA DATE)
RETURNS (
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_VENTAS_ARTICULO (
    ARTICULO VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_VENTAS_CLIENTE (
    CLIENTE VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_VENTAS_FECHA (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_VENTAS_FECHAS (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_VENTAS_ITEM (
    TIPO INTEGER,
    ID INTEGER,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTOPROM NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_VENTAS_PUNTO (
    PUNTO INTEGER,
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTO_VENTAS_VENDEDOR (
    VENDEDOR INTEGER,
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE COSTOS_PROVEEDOR_TRASLADO
RETURNS (
    ARTICULO VARCHAR(20),
    DESCR VARCHAR(60),
    COSTO NUMERIC(18,2),
    FECHA DATE,
    NIT VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CREA_BARRAS (
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15))
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIP VARCHAR(60),
    UNIDAD VARCHAR(8),
    BARRAS VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CREAR_CLIENTE (
    NIT VARCHAR(20),
    TIPOID CHAR(1),
    RAZONSOCIAL VARCHAR(60),
    APELLIDO1 VARCHAR(60),
    APELLIDO2 VARCHAR(60),
    NOMBRE1 VARCHAR(60),
    NOMBRE2 VARCHAR(60),
    DIR VARCHAR(60),
    CIUDAD VARCHAR(40),
    TEL VARCHAR(40),
    CEL VARCHAR(25),
    FAX VARCHAR(25),
    EMAIL VARCHAR(100),
    CONTACTO VARCHAR(255),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ZONA VARCHAR(2))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CREE_CUENTA_PUC (
    CUENTA VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CRONOLOGICO_CONTA (
    TIPOINI VARCHAR(3),
    TIPOFIN VARCHAR(3),
    FECINI VARCHAR(8),
    FECFIN VARCHAR(8),
    CONSOLIDADO CHAR(1),
    NIIF CHAR(1))
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMTIPO VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CRUCES_DOCUMENTO_DETALLE (
    TIPOORI INTEGER,
    IDORI INTEGER)
RETURNS (
    TIPODES INTEGER,
    ID INTEGER,
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    ARTIC VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(20),
    OBS VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CRUCES_DOCUMENTOS (
    TIPOORI INTEGER,
    IDORI INTEGER)
RETURNS (
    USOORI VARCHAR(6),
    TIPODES INTEGER,
    ID INTEGER,
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_AGENCIA (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    CAJA INTEGER,
    NOMCAJA VARCHAR(60),
    NOMVEND VARCHAR(60),
    INICIAL NUMERIC(18,2),
    NROFAC INTEGER,
    NROCLI INTEGER,
    ITEMFAC INTEGER,
    ITEMDEV INTEGER,
    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),
    TOTDIA NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    CONSIGNAT NUMERIC(18,2),
    BONOS NUMERIC(18,2),
    TRASLADOIN NUMERIC(18,2),
    TRASLADOEG NUMERIC(18,2),
    TRASLADOSE NUMERIC(18,2),
    TRASLADOSO NUMERIC(18,2),
    DESCUADRE NUMERIC(18,2),
    TINICIAL NUMERIC(18,2),
    TVTACONTADO NUMERIC(18,2),
    TVTACREDITO NUMERIC(18,2),
    TVTATOTAL NUMERIC(18,2),
    TVTARETS NUMERIC(18,2),
    TDEVCONTADO NUMERIC(18,2),
    TDEVCREDITO NUMERIC(18,2),
    TDEVTOTAL NUMERIC(18,2),
    TDEVOTRODIA NUMERIC(18,2),
    TDEVRETS NUMERIC(18,2),
    TNETOCONTADO NUMERIC(18,2),
    TNETOCREDITO NUMERIC(18,2),
    TNETOTOTAL NUMERIC(18,2),
    TNETORETS NUMERIC(18,2),
    TINGCONTADO NUMERIC(18,2),
    TINGDESCTO NUMERIC(18,2),
    TINGCXC NUMERIC(18,2),
    TINGOTROS NUMERIC(18,2),
    TINGTOTAL NUMERIC(18,2),
    TEGRCXP NUMERIC(18,2),
    TEGROTROS NUMERIC(18,2),
    TEGRTOTAL NUMERIC(18,2),
    TTOTDIA NUMERIC(18,2),
    TCONSIGNA NUMERIC(18,2),
    TCONSIGNAT NUMERIC(18,2),
    TTRASLADOIN NUMERIC(18,2),
    TTRASLADOEG NUMERIC(18,2),
    TTRASLADOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_AGENCIA_FP (
    AGENCIA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    CAJA INTEGER)
RETURNS (
    FORMAID INTEGER,
    NOMFORMA VARCHAR(60),
    FORMAMONTO NUMERIC(18,2),
    FORMATOTAL NUMERIC(18,2),
    FORMASALDO NUMERIC(18,2),
    FORMASALDOT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    TRASLADOIN NUMERIC(18,2),
    TRASLADOEG 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),
    SALDOINI NUMERIC(18,2),
    SALDOFIN NUMERIC(18,2),
    MOVDIA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_CAJA_ABONOS (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    AXCTIPO VARCHAR(10),
    AXCNUMERO VARCHAR(12),
    AXCNIT VARCHAR(20),
    AXCNOMBRE VARCHAR(60),
    AXCMONTO NUMERIC(18,2),
    AXCSALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_CAJA_DETALLE (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    CXCTIPO VARCHAR(10),
    CXCNUMERO VARCHAR(12),
    CXCNIT VARCHAR(20),
    CXCNOMBRE VARCHAR(60),
    CXCMONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_CAJA_DETALLE_F (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    CAJA INTEGER)
RETURNS (
    CXCTIPO VARCHAR(10),
    CXCTIPOREF INTEGER,
    CXCIDDOC INTEGER,
    CXCPREF VARCHAR(4),
    CXCNUM VARCHAR(8),
    CXCNUMERO VARCHAR(12),
    CXCNIT VARCHAR(20),
    CXCNOMBRE VARCHAR(60),
    CXCMONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_CAJA_EGRESOS (
    FECHA DATE,
    AGENCIA INTEGER,
    CAJA INTEGER)
RETURNS (
    EGRTIPO VARCHAR(8),
    EGRNUM VARCHAR(10),
    EGRCONC VARCHAR(60),
    EGRNIT VARCHAR(20),
    EGRNOMBRE VARCHAR(60),
    EGRMONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_CAJA_FPAGO (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    CHETIPO VARCHAR(30),
    CHERECIBO VARCHAR(10),
    CHEMONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_COMPROBANTES_CONTABLES (
    FECINI CHAR(8),
    FECFIN CHAR(8),
    TIPOCOMP CHAR(3))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    ITEM INTEGER,
    DIF NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_UNA_CAJA (
    FECHA DATE,
    CAJA 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),
    TOTDIA NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    TRASLADOIN NUMERIC(18,2),
    TRASLADOEG 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),
    SALDOINI NUMERIC(18,2),
    SALDOFIN NUMERIC(18,2),
    MOVDIA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_UNA_CAJA_ABONOS (
    FECHA DATE,
    CAJA INTEGER)
RETURNS (
    AXCTIPO VARCHAR(10),
    AXCNUMERO VARCHAR(12),
    AXCNIT VARCHAR(20),
    AXCNOMBRE VARCHAR(60),
    AXCMONTO NUMERIC(18,2),
    AXCSALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_UNA_CAJA_DETALLE (
    FECHA DATE,
    CAJA INTEGER)
RETURNS (
    CXCIDTIPO INTEGER,
    CXCTIPO VARCHAR(10),
    CXCIDDOC INTEGER,
    CXCPREF VARCHAR(4),
    CXCNUM VARCHAR(8),
    CXCNUMERO VARCHAR(12),
    CXCNIT VARCHAR(20),
    CXCNOMBRE VARCHAR(60),
    CXCMONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_UNA_CAJA_EGRESOS (
    FECHA DATE,
    CAJA INTEGER)
RETURNS (
    EGRTIPO VARCHAR(8),
    EGRNUM VARCHAR(10),
    EGRCONC VARCHAR(60),
    EGRNIT VARCHAR(20),
    EGRNOMBRE VARCHAR(60),
    EGRMONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUADRE_UNA_CAJA_FPAGO (
    FECHA DATE,
    CAJA INTEGER)
RETURNS (
    CHETIPO VARCHAR(30),
    CHENUMERO VARCHAR(20),
    CHERECIBO VARCHAR(10),
    CHEMONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUENTA_AFECTABLE (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUENTA_AFECTABLE_NIIF (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUENTA_INTERFAZ (
    TIPO INTEGER,
    ID INTEGER,
    CUENTA VARCHAR(20),
    INV CHAR(1))
RETURNS (
    CTAOK VARCHAR(20),
    TIPOCUEN CHAR(1),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUENTA_INTERFAZ_NIIF (
    TIPO INTEGER,
    ID INTEGER,
    CUENTA VARCHAR(20),
    INV CHAR(1))
RETURNS (
    CTAOK VARCHAR(20),
    TIPOCUEN CHAR(1),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUENTA_MAL_AFECTABLE
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    AFECTABLE CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CUENTAS_ARTICULOS
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE CUPO_DISPONIBLE (
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    DISPONIBLE NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE CXPAGAR_PROVEEDOR (
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DATOS_COMPANIA
RETURNS (
    NITCOMP VARCHAR(20),
    NOMBRECOMP VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DATOS_VEHICULO (
    PLACA VARCHAR(8))
RETURNS (
    NITASOC VARCHAR(20),
    NOMASOC VARCHAR(60),
    AFILIADO CHAR(1),
    CODTIPO INTEGER,
    TIPO VARCHAR(30),
    LINEA VARCHAR(60),
    MARCA VARCHAR(60),
    CARROC VARCHAR(60),
    MODELO VARCHAR(4),
    NUMERO VARCHAR(15),
    COLOR VARCHAR(60),
    PESO NUMERIC(18,2),
    REGNC VARCHAR(20),
    CAPAC INTEGER,
    NITCOND VARCHAR(20),
    CONDUCTOR VARCHAR(60),
    FECSOAT DATE,
    SOAT VARCHAR(20),
    SEGCONTR DATE,
    SEGEXTRA DATE,
    NITTENE VARCHAR(20),
    NOMTENE VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DESCARGA_REMISION_FALTANTE (
    REMISION1 VARCHAR(10),
    REMISION2 VARCHAR(10),
    REMISION3 VARCHAR(10),
    REMISION4 VARCHAR(10),
    REMISION5 VARCHAR(10),
    REMISION6 VARCHAR(10),
    PREFAC VARCHAR(4),
    NUMFAC VARCHAR(8))
RETURNS (
    IDCON INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DESENSAMBLES_SIN_CONTABIL_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DESENSAMBLES_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DETALLE_COMPRAS_ARTICULO (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    NIT VARCHAR(20))
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE DETALLE_COMPRAS_PROVEEDOR (
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DETALLE_DEVOLUCIONES_POS (
    FECHA DATE,
    PUNTO INTEGER,
    VENDEDOR INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE DETALLE_VENTAS_ARTICULO (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    NIT VARCHAR(20))
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE DETALLE_VENTAS_ARTICULO_VEND (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    VEND INTEGER)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE DETALLE_VENTAS_CIUDAD (
    CODCIU VARCHAR(5),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DETALLE_VENTAS_CLIENTE (
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DETALLE_VENTAS_VENDEDOR (
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE DETERIORO_CARTERA (
    FECHA DATE,
    DIAS INTEGER,
    TASA DOUBLE PRECISION)
RETURNS (
    NIT VARCHAR(20),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    SALDO NUMERIC(18,2),
    DIASDOC INTEGER,
    DETERIORO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DEV_INVENTARIO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ARTI VARCHAR(20),
    IDDEV INTEGER,
    NUMDEV VARCHAR(10),
    IDFACT INTEGER,
    NUMFAC VARCHAR(10),
    IDREM INTEGER,
    NUMREM VARCHAR(10))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DEVOLCLI_SIN_CONTABILIDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DEVOLCOMP_SIN_INVENTARIO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    IDF INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DEVOLUCIONES_SIN_INVENTARIO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    IDF INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DEVOLVER_ITEM_NEGATIVOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    IDD INTEGER,
    ITEM INTEGER,
    FECHA DATE,
    PREFDEV VARCHAR(4),
    NUMERO VARCHAR(12),
    CODBAR VARCHAR(20),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIA_FECHA (
    FECHA CHAR(8))
RETURNS (
    DIA CHAR(2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIAS_ENTRE_NOMINA (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    DIAS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIAS_LABORADOS (
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1),
    CONCEPTO INTEGER)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIAS_LABORADOS_LIQ (
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1),
    CONCEPTO INTEGER)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIAS_LABORADOS_SINV (
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1),
    CONCEPTO INTEGER)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIAS_LIQUIDACION (
    EMPL VARCHAR(20),
    FECHA DATE)
RETURNS (
    DIAS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIAS_MES (
    MES INTEGER,
    ANO INTEGER)
RETURNS (
    DIAS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIAS_VACACIONES (
    EMPLEADO VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ANO CHAR(4),
    PERIODO INTEGER,
    DIAS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIF_MOVBANCO_CONCILIACION (
    FECINI DATE,
    FECFIN DATE,
    CUENTA VARCHAR(3))
RETURNS (
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIFERENCIAS_ARTICULOS_BD (
    COMPANIA VARCHAR(3),
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    LISTA INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    DESCRIPCION2 VARCHAR(60),
    UNIDAD VARCHAR(8),
    UNIDAD2 VARCHAR(8),
    GRUPO VARCHAR(2),
    GRUPO2 VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    SUBGRUPO2 VARCHAR(3),
    MARCA VARCHAR(3),
    MARCA2 VARCHAR(3),
    ESTADO CHAR(1),
    ESTADO2 CHAR(1),
    PRECIO NUMERIC(18,2),
    PRECIO2 NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIFERENCIAS_CONTEO (
    FECHA DATE,
    BODEGA VARCHAR(2),
    STAND VARCHAR(20))
RETURNS (
    ID1 INTEGER,
    ID2 INTEGER,
    ITEM INTEGER,
    ARTICULO VARCHAR(20),
    LOTE VARCHAR(20),
    CANT1 NUMERIC(18,2),
    CANT2 NUMERIC(18,2),
    DIF NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIFERENCIAS_TERCEROS_BD (
    COMPANIA VARCHAR(3),
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    NOMBRE2 VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIGITO_CHEQUEO (
    CODIGO VARCHAR(20))
RETURNS (
    DIG INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DIGITOS_NIVEL (
    NIVEL SMALLINT)
RETURNS (
    DIGITOS SMALLINT)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DINERO_DISPONIBLE (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    COB VARCHAR(5),
    IDCAJA INTEGER,
    CTABCO VARCHAR(3),
    NROBCO VARCHAR(20),
    NOMBRE VARCHAR(60),
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE DOCCOMPRA_X_IMPORT (
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    VALIDEZ INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DOCCOMPRA_X_PROVEEDOR (
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NROPROV VARCHAR(15),
    VALIDEZ INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DOCUMENTOS_IMPORTACION (
    IDIMP INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(8),
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DOCUMENTOS_SERIAL (
    ARTICULO VARCHAR(20),
    SERIAL VARCHAR(30))
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(8),
    IDDOC INTEGER,
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    CODBOD VARCHAR(2),
    ENTRADA CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR (
    FECINI DATE,
    FECFIN DATE,
    CONTADO CHAR(1),
    NIIF CHAR(1))
RETURNS (
    TIPO VARCHAR(10),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    ID INTEGER,
    TIDO INTEGER,
    CTABCO INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DOCVENTAS_X_CLIENTE (
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VALIDEZ INTEGER,
    VEND INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    SUCUR VARCHAR(10))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE DV (
    NIT VARCHAR(20))
RETURNS (
    DV INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EDITA_CLIENTE_MOVIL (
    NIT VARCHAR(20))
RETURNS (
    TERC_NIT VARCHAR(20),
    TERC_DV CHAR(1),
    TERC_TIPOID CHAR(1),
    TERC_NOM VARCHAR(60),
    TERC_DIR VARCHAR(60),
    TERC_CIU VARCHAR(60),
    TERC_TEL VARCHAR(60),
    TERC_CEL VARCHAR(60),
    TERC_FAX VARCHAR(60),
    TERC_EMAIL VARCHAR(60),
    TERC_APELLIDO1 VARCHAR(60),
    TERC_APELLIDO2 VARCHAR(60),
    TERC_NOMBRE1 VARCHAR(60),
    TERC_NOMBRE2 VARCHAR(60),
    TERC_CONTACTO VARCHAR(60),
    TERC_OBS VARCHAR(1024))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EGRESOS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EMPLEADO_ACTIVO (
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    FECING DATE,
    FECRET DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ENSAMBLES_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ENSAMBLES_SIN_CONTABILIDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ENTRADA_AJUSTE (
    IDAJUSTE INTEGER,
    PREFENT VARCHAR(4))
RETURNS (
    IDENT INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ENTRADAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ENTRADAS_SIN_CONTABILIDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ENTREGA_FIN (
    IDDOC INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ENTREGA_ITEM (
    IDDOC INTEGER,
    ITEM INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    NOMCLI VARCHAR(60),
    HORAREG TIME,
    ITEMS INTEGER,
    STAND VARCHAR(20),
    DESARTI VARCHAR(60),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    ITEM2 INTEGER,
    STAND2 VARCHAR(20),
    DESARTI2 VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ENTREGA_SIGUIENTE_ITEM (
    IDDOC INTEGER,
    ITEMANT INTEGER)
RETURNS (
    ITEM INTEGER,
    STAND VARCHAR(20),
    DESARTI VARCHAR(60),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    ITEM2 INTEGER,
    STAND2 VARCHAR(20),
    DESARTI2 VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ERRORINT (
    TIPODOC INTEGER,
    IDDOC INTEGER,
    CADENA VARCHAR(20),
    ERRORS INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE ES_AFECTABLE (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ES_AFECTABLE_NIIF (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ESTADO_FLUJO_EFECTIVO (
    ANO CHAR(4),
    NIIF CHAR(1))
RETURNS (
    SECCION INTEGER,
    CUENTA VARCHAR(140),
    FINAL NUMERIC(18,2),
    SUMA NUMERIC(18,2),
    TOTAL2 NUMERIC(18,2),
    TOTAL3 NUMERIC(18,2),
    TOTAL4 NUMERIC(18,2),
    NOMSECCION VARCHAR(120))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTE_CENTRO (
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTE_CUENTA (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTE_CUENTA_NIIF (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTE_TERCERO (
    NIT VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIA_BODEGA (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    BODEGA VARCHAR(2),
    STAND VARCHAR(20),
    EXISTENCIA NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS_BAJO_MINIMO (
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    CEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    STAND VARCHAR(20),
    MINIMO NUMERIC(18,4),
    FALTANTE NUMERIC(18,4),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS_COMPRAS (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    VENTAANO NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20),
    NOMBOD VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS_DESDE_HASTA (
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    INACTIVOS CHAR(1),
    NIIF CHAR(1),
    SUCURSAL INTEGER,
    LISTART INTEGER)
RETURNS (
    CANT NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    INVIMA VARCHAR(20),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    LOTEV DATE,
    SERIALES VARCHAR(2048),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    COSTOIVA NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20),
    ESTADO CHAR(1),
    MAXIMO NUMERIC(18,2),
    MINIMO NUMERIC(18,2),
    FECHAVTA DATE,
    ARTI_OBS VARCHAR(1024))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS_MENOS_RESERVA (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    BODEGA VARCHAR(2),
    STAND VARCHAR(20),
    EXISTENCIA NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS_PROVEEDOR (
    FECFIN DATE,
    NIT VARCHAR(20))
RETURNS (
    INVFIN NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS_SOBRE_MAXIMO (
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    CEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    STAND VARCHAR(20),
    DIASMAX NUMERIC(18,4),
    MAXIMO NUMERIC(18,4),
    DIASINV NUMERIC(18,4),
    EXCEDENTE NUMERIC(18,4),
    ULTCOSTO NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS_TERCEROS (
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTINI NUMERIC(18,2),
    FECHA DATE,
    TIPODOC VARCHAR(8),
    NUMERO VARCHAR(12),
    REMISIONES NUMERIC(18,2),
    DEVOLUCIONES NUMERIC(18,2),
    CANTFIN NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NITTERC VARCHAR(20),
    NOMTERC VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    IVA NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS_UNIDAD (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    STAND VARCHAR(20),
    NOMBOD VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS_UNIDAD_BOD (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8),
    BOD VARCHAR(2))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXISTENCIAS_WEB (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    BODEGA VARCHAR(2),
    AGENCIA INTEGER,
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXPORTA_FACTURAS (
    INI DATE,
    FIN DATE)
RETURNS (
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA VARCHAR(8),
    VENCE VARCHAR(8),
    NIT VARCHAR(20),
    CODCLI VARCHAR(15),
    NOMBRE VARCHAR(22),
    VENDEDOR INTEGER,
    BODEGA VARCHAR(2),
    OBSERVACION VARCHAR(255),
    ITEM INTEGER,
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ARTICULO VARCHAR(15),
    DESCR VARCHAR(60),
    LOTE VARCHAR(15),
    CANT NUMERIC(18,4),
    MONTO NUMERIC(18,2),
    DB CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXPORTA_FACTURAS_ASOB (
    INI DATE,
    FIN DATE)
RETURNS (
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA VARCHAR(8),
    VENCE VARCHAR(8),
    NIT VARCHAR(20),
    CODCLI VARCHAR(15),
    NOMBRE VARCHAR(22),
    VENDEDOR INTEGER,
    BODEGA VARCHAR(2),
    ITEM INTEGER,
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXPORTA_FACTURAS_DET (
    INI DATE,
    FIN DATE,
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4))
RETURNS (
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    NIT VARCHAR(20),
    CODCLI VARCHAR(15),
    NOMBRE VARCHAR(60),
    VENDEDOR INTEGER,
    BODEGA VARCHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    REFERENCIA VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    PRUNIT NUMERIC(18,2),
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE EXPORTAR_RUTERO (
    FECHA DATE)
RETURNS (
    ID INTEGER,
    NUMERO VARCHAR(8),
    VEHICULO VARCHAR(15),
    CONDUCTOR VARCHAR(15),
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTCOMP_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTCOMP_SIN_INVENTARIO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    IDF INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTOR_UNIDAD_CANT (
    ARTICULO VARCHAR(15),
    UNIDAD VARCHAR(8))
RETURNS (
    FACTOR NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTOR_UNIDAD_CANT_EXCEP (
    ARTICULO VARCHAR(15),
    UNIDAD VARCHAR(8))
RETURNS (
    FACTOR NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTOR_UNIDAD_PRE (
    ARTICULO VARCHAR(15),
    UNIDAD VARCHAR(8))
RETURNS (
    FACTOR NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURA_ALQUILER_Y_TRANSPORTE (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    VEND INTEGER,
    PTVT INTEGER,
    PREFIJO VARCHAR(4),
    FECHA DATE,
    DIAS INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAR_CONCEPTOS (
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE,
    REFER VARCHAR(60),
    FECINI DATE,
    FECFIN DATE,
    MORA NUMERIC(9,4),
    FECDTO DATE,
    DTOPP NUMERIC(9,4))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAR_EVENTO (
    EVENTO INTEGER,
    FECHA DATE,
    PREFIJO VARCHAR(4),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3))
RETURNS (
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAR_PEDIDOS (
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8))
RETURNS (
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAR_REMISION (
    IDR INTEGER,
    PREF VARCHAR(4))
RETURNS (
    IDF INTEGER,
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAR_REMISIONES (
    FECINI DATE,
    FECFIN DATE,
    PREFREM VARCHAR(4),
    PREFFAC VARCHAR(4))
RETURNS (
    IDR INTEGER,
    NUMREM VARCHAR(8),
    IDF INTEGER,
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAS_MAL_TOTAL (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2),
    ITEMS NUMERIC(18,2),
    IVATOT NUMERIC(18,2),
    IVAIT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAS_MES_NIT (
    NIT VARCHAR(20),
    ANO INTEGER)
RETURNS (
    MES VARCHAR(15),
    FACTURA VARCHAR(12))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAS_POR_ENTREGAR (
    FECHA DATE,
    CONFIRMA CHAR(1))
RETURNS (
    IDDOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    CLIENTE VARCHAR(60),
    HORAREG TIME,
    HORAASI TIME,
    HORALIS TIME,
    HORAEMP TIME,
    HORAENT TIME,
    FECHACONF DATE,
    HORACONF TIME,
    ITEMS INTEGER,
    IDPED INTEGER,
    ENTREGA VARCHAR(60),
    EMBALAJE INTEGER,
    MONTO NUMERIC(18,2),
    ENCARGADO VARCHAR(60),
    EMPACADOR VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAS_RUTERO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    CIUD VARCHAR(5),
    NOMCIU VARCHAR(60),
    GRPCAR INTEGER,
    NOMGRUP VARCHAR(30),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAS_SIN_CONTABILIDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAS_SIN_INVENTARIO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    IDF INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    BODEGA VARCHAR(2),
    LOTE VARCHAR(20),
    ITEM INTEGER,
    NIT VARCHAR(20),
    NOMCLI VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAS_SIN_MOV
RETURNS (
    ID INTEGER,
    ITE INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FACTURAS_TIEMPOS (
    FECHA DATE)
RETURNS (
    IDFACT INTEGER,
    NUMERO VARCHAR(12),
    TERC_NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    PEDOK CHAR(1),
    TIEMPOAPROX INTEGER,
    HORAC TIME)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FALTANTE (
    TIPORI INTEGER,
    TIPDES INTEGER,
    IDDOC INTEGER,
    ITEM INTEGER)
RETURNS (
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FALTANTE_CORTE (
    TIPORI INTEGER,
    TIPDES INTEGER,
    IDDOC INTEGER,
    ITEM INTEGER,
    CORTE DATE)
RETURNS (
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FALTANTES_COMPRAS_ARTICULO (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NROPROV VARCHAR(15),
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FALTANTES_COMPRAS_ARTICULOI (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(4),
    GRPFIN VARCHAR(4),
    SUBINI VARCHAR(4),
    SUBFIN VARCHAR(4),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(3),
    NOMGRUPO VARCHAR(60),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(60),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(60),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FALTANTES_VENTAS_ARTICULO (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR1 NUMERIC(18,4),
    FACTOR2 NUMERIC(18,4),
    FACTOR3 NUMERIC(18,4),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    COSTOUN NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CIUDAD VARCHAR(60),
    OBS VARCHAR(255),
    BOD VARCHAR(2),
    PESOUNIT NUMERIC(18,2),
    PESOTOT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FECHA_A_CONTA (
    FECHAD DATE)
RETURNS (
    FECHAS CHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FECHA_DESDE_CONTA (
    FECINI CHAR(8))
RETURNS (
    FECHA CHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FECHA_DOCUMENTOS_PAGO
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FECHA_FINAL_PERIODO_PAGO (
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FECHA_INICIAL_PERIODO_PAGO (
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FECHA_PERIODO_PAGO (
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    PERIODO INTEGER,
    DIA INTEGER)
RETURNS (
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FECHA_Y_NUMERO_CONTA (
    FECHA CHAR(8),
    DIAS INTEGER)
RETURNS (
    VENCE CHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FECHAS_ANTERIORES_LOTE (
    ARTICULO VARCHAR(15))
RETURNS (
    LOTE VARCHAR(15),
    SALDO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FIN_DE_MES (
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    FECHA CHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FORM_INTEGRADO_ELECTRONICO (
    IDDOC INTEGER,
    FECLIQ VARCHAR(10),
    CODOPER VARCHAR(2))
RETURNS (
    DATOS VARCHAR(686) CHARACTER SET ISO8859_1)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE FORM_INTEGRADO_ELECTRONICO_ARP (
    IDDOC INTEGER,
    FECLIQ VARCHAR(8),
    CODOPER VARCHAR(2))
RETURNS (
    DATOS VARCHAR(700))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  EXIT;
END^





CREATE PROCEDURE GER_CARTERA_CLIENTES (
    FECHA DATE,
    TIPOREP CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    CUPO NUMERIC(18,2),
    DIASMAX INTEGER,
    SALDOCLI NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_COMPRAS_GRUPO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBGRUPO VARCHAR(30),
    CANTC NUMERIC(18,2),
    COMPRAS NUMERIC(18,2),
    CANTV NUMERIC(18,2),
    VENTAS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_COMPRAS_PROVEEDOR (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    PROVEEDOR VARCHAR(20),
    NOMPROVEEDOR VARCHAR(60),
    CANTC NUMERIC(18,2),
    COMPRAS NUMERIC(18,2),
    CANTV NUMERIC(18,2),
    VENTAS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_CXPAGAR (
    FECHA DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIASMAX INTEGER,
    SALDOPRV NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_DISMINUCION_VENTAS_CLI (
    FEC1INI DATE,
    FEC1FIN DATE,
    FEC2INI DATE,
    FEC2FIN DATE,
    TIPO CHAR(1))
RETURNS (
    CLIENTE VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    VENTA1 NUMERIC(18,2),
    VENTA2 NUMERIC(18,2),
    CANT1 NUMERIC(18,2),
    CANT2 NUMERIC(18,2),
    DIFCANT NUMERIC(18,2),
    DIFMONTO NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_DISMINUCION_VENTAS_PROD (
    FEC1INI DATE,
    FEC1FIN DATE,
    FEC2INI DATE,
    FEC2FIN DATE,
    TIPO CHAR(1))
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    VENTA1 NUMERIC(18,2),
    VENTA2 NUMERIC(18,2),
    CANT1 NUMERIC(18,2),
    CANT2 NUMERIC(18,2),
    DIFCANT NUMERIC(18,2),
    DIFMONTO NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_INVENTARIO_AGOTADOS (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    PORC NUMERIC(18,2))
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    EXISTENCIA NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    PORCENTAJE NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_INVENTARIO_BAJAROT (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    PORC NUMERIC(18,2))
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    EXISTENCIA NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    PORCENTAJE NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_INVENTARIO_GRUPO (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBGRUPO VARCHAR(30),
    EXISTENCIA NUMERIC(18,2),
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_INVENTARIO_MARCA (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    EXISTENCIA NUMERIC(18,2),
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_INVENTARIO_PROV (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    PROVEEDOR VARCHAR(15),
    NOMPROVEEDOR VARCHAR(60),
    EXISTENCIA NUMERIC(18,2),
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_MOVIMIENTO_CLIENTES (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS NUMERIC(18,2),
    DEVOLUCIONES NUMERIC(18,2),
    NOTAS NUMERIC(18,2),
    ABONOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_MOVIMIENTO_PROVEEDOR (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS NUMERIC(18,2),
    DEVOLUCIONES NUMERIC(18,2),
    NOTAS NUMERIC(18,2),
    ABONOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_RESUMEN_BANCOS (
    FECHA DATE)
RETURNS (
    NOMCTA VARCHAR(60),
    SALDOINI NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    RETIROS NUMERIC(18,2),
    NOTAS NUMERIC(18,2),
    TRASLADOS NUMERIC(18,2),
    SALDOFINAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_RESUMEN_CAJA (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    NOMCAJACTA VARCHAR(60),
    SALDOINI NUMERIC(18,2),
    RECIBOS NUMERIC(18,2),
    EGRESOS NUMERIC(18,2),
    TRASLADOS NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    SALDOFINAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_RESUMEN_SALDOS (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    NOMCAJACTA VARCHAR(60),
    SALDOINI NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    SALDOFINAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_VENTAS_ARTICULO (
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_VENTAS_CLIENTE (
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    CLIENTE VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_VENTAS_FECHA (
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    FECHA DATE,
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_VENTAS_GRUPO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBGRUPO VARCHAR(30),
    CANT NUMERIC(18,2),
    VENTAS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_VENTAS_PUNTO (
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    PUNTO INTEGER,
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GER_VENTAS_VENDEDOR (
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    VENDEDOR INTEGER,
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GRABE_COTIZA_WEB (
    ID INTEGER)
RETURNS (
    IDCOT INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GRABE_FACTURA_WEB (
    ID INTEGER)
RETURNS (
    IDFAC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE GRABE_PEDIDO_WEB (
    ID INTEGER)
RETURNS (
    IDPED INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE HISTORIA_MENSAJES (
    USUARIO VARCHAR(10))
RETURNS (
    ID INTEGER,
    EOS CHAR(1),
    FECHA DATE,
    HORA TIME,
    REMITE VARCHAR(10),
    MENSAJE VARCHAR(255),
    LEIDO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE HISTORICO_CARTERA_CLIENTE (
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    SUCURSAL VARCHAR(10),
    AGENCIA INTEGER)
RETURNS (
    FECDOC DATE,
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE HISTORICO_EMPLEADO (
    FEC DATE,
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    EMPLDESDE VARCHAR(20),
    EMPLHASTA VARCHAR(20))
RETURNS (
    FECNOM DATE,
    CONCNOM VARCHAR(60),
    COD INTEGER,
    NIT VARCHAR(20),
    VALOR NUMERIC(18,2),
    ENTIDAD VARCHAR(20),
    DEDUC CHAR(1),
    PROV CHAR(1),
    APORTE CHAR(1),
    PAGOOK CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    APLICAPROM CHAR(1),
    SALARIO CHAR(1),
    GTOEMPR CHAR(1),
    NOMCORTO VARCHAR(60),
    NOMPER VARCHAR(60),
    NOMEMPL VARCHAR(60),
    FECRET DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IBC_APORTE (
    NITE VARCHAR(20),
    IDPAGO INTEGER,
    TIPOAPORTE CHAR(3))
RETURNS (
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IBC_APORTES (
    NITE VARCHAR(20),
    IDPAGO INTEGER)
RETURNS (
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IBC_EMPLEADO (
    NITE VARCHAR(20),
    ANO CHAR(4),
    PERIODO INTEGER,
    CONC_COD INTEGER)
RETURNS (
    BASICO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IDS_CORTE (
    FECHA DATE,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    OPER INTEGER,
    FECHAREC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(8),
    ID INTEGER,
    ITEM INTEGER,
    TIPO INTEGER,
    DOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    IDNUEVO INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_AJUSTE (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_ANTICLIE (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    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),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    CLIE_COD VARCHAR(15),
    ZONA_COD VARCHAR(60),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_ANTIPROV (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    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),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_APLICLIE (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    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(20),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_APLIPROV (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_APORTES (
    IDDOC INTEGER,
    DETALLE CHAR(1))
RETURNS (
    ITEM INTEGER,
    TIPOAP CHAR(1),
    CONPAGO CHAR(1),
    ADMINI VARCHAR(20),
    NOMADMIN VARCHAR(60),
    NROEMPL INTEGER,
    MONTO NUMERIC(18,2),
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    FORMULARIO VARCHAR(10),
    ITEMDET INTEGER,
    NITEMPL VARCHAR(20),
    NOMEMPL VARCHAR(60),
    IBC NUMERIC(18,2),
    COTOBL NUMERIC(18,2),
    VALORNORET NUMERIC(18,2),
    TIPAP CHAR(3))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_ARQUEO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    ITEM INTEGER,
    DENOMINACION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    TOTALIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_ARTICULO (
    CANT INTEGER,
    PREF VARCHAR(4),
    LISTA 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),
    PORIVA NUMERIC(9,2),
    PESO NUMERIC(18,4),
    PUM NUMERIC(18,2),
    COSTOP NUMERIC(18,2),
    COSTOPMASIVA NUMERIC(18,2),
    UCOSTO NUMERIC(18,2),
    UCOSTOMASIVA NUMERIC(18,2),
    LISTAP INTEGER,
    NOMLISTA VARCHAR(30),
    PRECIO1 NUMERIC(18,2),
    CANTMIN1 NUMERIC(18,4),
    PRECIO2 NUMERIC(18,2),
    CANTMIN2 NUMERIC(18,4),
    PRECIO3 NUMERIC(18,2),
    CANTMIN3 NUMERIC(18,4),
    PRECIO4 NUMERIC(18,2),
    CANTMIN4 NUMERIC(18,4),
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_CAMBCOSTO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    UNIDAD VARCHAR(8),
    COSANT NUMERIC(18,4),
    COSNUE NUMERIC(18,4),
    CANT NUMERIC(18,4),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_CAMBDOCU (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_CERTRETE (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE IMPR_COMPROBANTE (
    ID INTEGER)
RETURNS (
    TIPO VARCHAR(3),
    FTO CHAR(1),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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(10),
    NUMAPLICA VARCHAR(10),
    VENCE CHAR(8),
    TIPODOC VARCHAR(8),
    TIPODOCAP VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_COMPROBANTE_NIIF (
    ID INTEGER)
RETURNS (
    TIPO VARCHAR(3),
    FTO CHAR(1),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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(140),
    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(10),
    NUMAPLICA VARCHAR(10),
    VENCE CHAR(8),
    TIPODOC VARCHAR(8),
    TIPODOCAP VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_CONCILIACIONB (
    ID INTEGER,
    CRUZADOS CHAR(1))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_CONSIGNA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODCUENTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    SUCURSAL VARCHAR(60),
    CTACONTA VARCHAR(20),
    CODBANCO INTEGER,
    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),
    DET_RDC VARCHAR(10),
    TOTALFORMA1 NUMERIC(18,2),
    TOTALFORMA2 NUMERIC(18,2),
    TOTALFORMA3 NUMERIC(18,2),
    TOTALFORMA4 NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_CONSIGNATAR (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NOMCAJA VARCHAR(60),
    CODCUENTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    SUCURSAL VARCHAR(60),
    CTACONTA VARCHAR(20),
    CODBANCO VARCHAR(2),
    NOMBANCO VARCHAR(60),
    TOTMONTO NUMERIC(18,2),
    TOTRTFTE NUMERIC(18,2),
    TOTRTIVA NUMERIC(18,2),
    TOTCOMIS NUMERIC(18,2),
    OBSERVAC BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    FORPAGO VARCHAR(27),
    DET_CODTAR VARCHAR(2),
    DET_COMTAR VARCHAR(20),
    DET_NROTAR VARCHAR(20),
    DET_BASE NUMERIC(18,2),
    DET_IVA NUMERIC(18,2),
    DET_COMIPOR NUMERIC(9,2),
    DET_COMIMON NUMERIC(18,2),
    DET_RTFTEPOR NUMERIC(9,2),
    DET_RTFTEMON NUMERIC(9,2),
    DET_RTIVAPOR NUMERIC(9,2),
    DET_RTIVAMON NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_CONTABILIZACION (
    TIPODOC INTEGER,
    IDDOC INTEGER,
    CON CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(140),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(10),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_COTIPROV (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_COTIZACION (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER,
    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),
    SUMA4 NUMERIC(18,2),
    SUMA5 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    ORDENCLI VARCHAR(20),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_CRUCES (
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    RTCREEDOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    SALDOTER NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_DESENSAMBLE (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 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),
    TOTAL NUMERIC(18,2),
    SERIALES VARCHAR(4096),
    LOTE VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_DEVOLPROV (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    NUMPROV VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREE NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    LOTE VARCHAR(15),
    SERIALES VARCHAR(4096),
    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(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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_DEVOLUCION (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(12),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    DEC2799 NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREEP NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    SERIALES VARCHAR(4096),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    INALC NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    SUMA4 NUMERIC(18,2),
    SUMA5 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    TOTINALC NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    SUMAINALC NUMERIC(18,2),
    VRFLETE NUMERIC(18,2),
    VEHICULO VARCHAR(15),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_DIFERENCIAS_CONTEO (
    FECHA DATE,
    BODEGA VARCHAR(2),
    STAND VARCHAR(20))
RETURNS (
    ID1 INTEGER,
    ID2 INTEGER,
    PREF1 VARCHAR(4),
    NUM1 VARCHAR(8),
    PREF2 VARCHAR(4),
    NUM2 VARCHAR(8),
    CONC1 VARCHAR(60),
    CONC2 VARCHAR(60),
    NOMBOD VARCHAR(60),
    ITEM INTEGER,
    ARTICULO VARCHAR(20),
    DESCRIP VARCHAR(60),
    LOTE VARCHAR(20),
    CANT1 NUMERIC(18,4),
    UNIDAD1 VARCHAR(8),
    CANT2 NUMERIC(18,4),
    UNIDAD2 VARCHAR(8),
    DIF NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    OBS1 BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    OBS2 BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_EGRESO (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(70),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RTCREE NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    EXCEDENTE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    FECDOC DATE,
    NUMDOC VARCHAR(8),
    NUMPRV VARCHAR(15),
    CONCDOC VARCHAR(60),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    RTCREEDOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    SALDOPROV NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_EMPAQUE (
    TIPO INTEGER,
    IDFAC INTEGER,
    CANT INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHAENT DATE,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(60),
    TELEFONO VARCHAR(40),
    CELULAR VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMBALAJE SMALLINT,
    NOMEMBALAJE VARCHAR(60),
    TOTALEMB SMALLINT)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_ENSAMBLE (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    PRODARTI VARCHAR(15),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    TURNO VARCHAR(60),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    CODRETAL VARCHAR(20),
    DESCRETAL VARCHAR(60),
    CANTRETAL NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    TOTENSAMBLE NUMERIC(18,2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PESO NUMERIC(18,4),
    TOTAL NUMERIC(18,2),
    SERIALES VARCHAR(4096),
    LOTE VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_ENTRADA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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,
    SERIALES VARCHAR(4096),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_FACTCOMP (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SIMPLIFICADO VARCHAR(15),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NUMPROV VARCHAR(15),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREE NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    STAND VARCHAR(20),
    SERIALES VARCHAR(4096),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    DTOIT1 NUMERIC(18,2),
    DTOIT2 NUMERIC(18,2),
    DTOIT3 NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    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),
    DTOITEM1 NUMERIC(18,2),
    DTOITEM2 NUMERIC(18,2),
    DTOITEM3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_FACTPRO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    IMPORTA VARCHAR(12),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    MONEDA VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SIMPLIFICADO VARCHAR(15),
    CODBODEGA VARCHAR(2),
    NOMBODEGA 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),
    ARANCEL NUMERIC(18,2),
    GASTOSIT NUMERIC(18,2),
    GASTOS NUMERIC(18,2),
    FOB 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),
    ARTIDESCORTA VARCHAR(30),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    PRUNITMON NUMERIC(18,2),
    ARANCMONTO NUMERIC(18,2),
    TRM DOUBLE PRECISION,
    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(30),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CODPROY VARCHAR(4),
    CODCENTRO VARCHAR(4),
    NOMPROY VARCHAR(60),
    NOMCENTRO VARCHAR(60),
    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),
    TOTGASTOS NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTALMONEDA NUMERIC(18,2),
    DESCADIC BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_FACTURA (
    ID INTEGER,
    MONEDAEX CHAR(1))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    DIRPACIENTE VARCHAR(100),
    CIUPACIENTE VARCHAR(60),
    TELPACIENTE VARCHAR(40),
    TRPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    INGTERCEROS NUMERIC(18,2),
    INGPROPIOS NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    DEC2799 NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREEP NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    DTOF1P NUMERIC(9,2),
    DTOF1M NUMERIC(18,2),
    DTOF1F DATE,
    DTOF2P NUMERIC(9,2),
    DTOF2M NUMERIC(18,2),
    DTOF2F DATE,
    DTOF3P NUMERIC(9,2),
    DTOF3M NUMERIC(18,2),
    DTOF3F DATE,
    ANTICIPO NUMERIC(18,2),
    RETGARANTIA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    ENTREGA DATE,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    SERIALES VARCHAR(4096),
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    BASE NUMERIC(18,2),
    PORCBASE NUMERIC(9,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    INALC NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(255),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    SUMA4 NUMERIC(18,2),
    SUMA5 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    SUMAINALC NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    TOTINALC NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    DTOITEM1 NUMERIC(18,2),
    DTOITEM2 NUMERIC(18,2),
    DTOITEM3 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),
    MONTOPAGOE1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    MONTOPAGOE2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    MONTOPAGOE3 NUMERIC(18,2),
    FORMAPAGO4 VARCHAR(30),
    MONTOPAGO4 NUMERIC(18,2),
    MONTOPAGOE4 NUMERIC(18,2),
    FORMAPAGO5 VARCHAR(30),
    MONTOPAGO5 NUMERIC(18,2),
    MONTOPAGOE5 NUMERIC(18,2),
    FORMAPAGO6 VARCHAR(30),
    MONTOPAGO6 NUMERIC(18,2),
    MONTOPAGOE6 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),
    UNIALTERNA VARCHAR(8),
    FECINI DATE,
    FECFIN DATE,
    CARTINI NUMERIC(18,2),
    CARTFIN NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    CARGOS NUMERIC(18,2),
    CODRECAUDO VARCHAR(65),
    CODRECAUDOR VARCHAR(65),
    VALE VARCHAR(60),
    FACMAR VARCHAR(60),
    TOTDESCITEM NUMERIC(18,2),
    SUMDTOS NUMERIC(18,2),
    LLEVAR VARCHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_LIQRUTAC (
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(60),
    TEL VARCHAR(40),
    RUTA VARCHAR(60),
    DIAS INTEGER,
    VRCONTRATOS NUMERIC(18,2),
    BECADOS VARCHAR(100),
    VRBECAS NUMERIC(18,2),
    VRDESCUENTO NUMERIC(18,2),
    VRPAGOS NUMERIC(18,2),
    COMIPOR NUMERIC(9,2),
    COMIMON NUMERIC(18,2),
    RETEPOR NUMERIC(9,2),
    RETEMON NUMERIC(18,2),
    RICAPOR NUMERIC(9,2),
    RICAMON NUMERIC(18,2),
    RELEVOSP NUMERIC(18,2),
    RELEVOSN NUMERIC(18,2),
    EFECTIVOS NUMERIC(18,2),
    ANTICIPOS NUMERIC(18,2),
    APAGAR NUMERIC(18,2),
    OBS VARCHAR(1024),
    NUMCON INTEGER,
    NUMEFE INTEGER,
    ITEMREC INTEGER,
    CONTREC VARCHAR(8),
    CONTEST VARCHAR(60),
    DIASREC INTEGER,
    VALORREC NUMERIC(18,2),
    CONTFECR DATE,
    OBSREC VARCHAR(1024))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_LIQRUTAC_CONC (
    ID INTEGER)
RETURNS (
    ITEMCON INTEGER,
    CONCEPTO VARCHAR(60),
    CONCPAGO CHAR(1),
    VALORCON NUMERIC(18,2),
    OBSCON VARCHAR(1024))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_LIQRUTAC_EFE (
    ID INTEGER)
RETURNS (
    ITEMEFE INTEGER,
    CONTRATO VARCHAR(60),
    VALOREFE NUMERIC(18,2),
    OBSEFE VARCHAR(1024))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_LIQUIDACION (
    ID INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FECHA DATE,
    FECING DATE,
    DIASTOT INTEGER,
    MOTIVO VARCHAR(60),
    CONTRATO VARCHAR(60),
    TIPOCOT VARCHAR(60),
    CARGO VARCHAR(60),
    DEPARTAMENTO VARCHAR(60),
    SALARIO NUMERIC(18,2),
    DIASLAB INTEGER,
    FECCES DATE,
    DIASCES INTEGER,
    FECPRI DATE,
    DIASPRI INTEGER,
    FECVAC DATE,
    DIASVAC INTEGER,
    CODCONC INTEGER,
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    TOTPAGOS NUMERIC(18,2),
    TOTDESC NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    BASEVAC NUMERIC(18,2),
    BASEPRI NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_MANIFIESTO (
    ID INTEGER)
RETURNS (
    REGION VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CODORIGEN VARCHAR(5),
    NOMORIGEN VARCHAR(60),
    CODDESTINO VARCHAR(5),
    NOMDESTINO VARCHAR(60),
    VEHICULO VARCHAR(15),
    VEHITIPO VARCHAR(30),
    VEHICAPA INTEGER,
    VEHIMARCA VARCHAR(60),
    VEHILINEA VARCHAR(60),
    VEHINUMINT VARCHAR(15),
    VEHIMODELO VARCHAR(60),
    VEHISERIE VARCHAR(20),
    VEHIREPOT VARCHAR(4),
    VEHICOLOR VARCHAR(60),
    VEHICARROC VARCHAR(60),
    VEHIREGNAL VARCHAR(20),
    VEHIPESOV NUMERIC(18,2),
    VEHISOAT VARCHAR(20),
    VEHISOATASEG VARCHAR(60),
    VEHIFECSOAT DATE,
    PROPNIT VARCHAR(20),
    PROPNOM VARCHAR(60),
    PROPDIR VARCHAR(60),
    PROPCIU VARCHAR(60),
    PROPTEL VARCHAR(40),
    TENENIT VARCHAR(20),
    TENENOM VARCHAR(60),
    TENEDIR VARCHAR(60),
    TENECIU VARCHAR(60),
    TENETEL VARCHAR(40),
    CONDNIT VARCHAR(20),
    CONDNOM VARCHAR(60),
    CONDDIR VARCHAR(60),
    CONDCIU VARCHAR(60),
    CONDTEL VARCHAR(40),
    CONDCATEGORIA VARCHAR(20),
    SEGUROCIA VARCHAR(60),
    SEGUROPOL VARCHAR(20),
    SEGUROVIG DATE,
    PAGOLUGAR VARCHAR(60),
    PAGOFECHA DATE,
    PAGOCARGUE VARCHAR(60),
    PAGODESCAR VARCHAR(60),
    FLETE NUMERIC(18,2),
    RETENPOR NUMERIC(9,2),
    RETENMON NUMERIC(18,2),
    DESCUENTO NUMERIC(18,2),
    NETO NUMERIC(18,2),
    ANTICIPO NUMERIC(18,2),
    APAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMREM INTEGER,
    PREFREM VARCHAR(4),
    NUMREM VARCHAR(8),
    CANTREM NUMERIC(18,2),
    UNIDREM VARCHAR(10),
    NATUREM INTEGER,
    EMPQREM INTEGER,
    PESOREM NUMERIC(18,2),
    PRODREM VARCHAR(15),
    DESCREM VARCHAR(60),
    VALORREM NUMERIC(18,2),
    REMITEN VARCHAR(60),
    DESTINA VARCHAR(60),
    DESTINO VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_NOTACRCL (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    MONTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    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(23))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_NOTACRPR (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    MONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15),
    DOCAPLICADO VARCHAR(21))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_NOTADBCL (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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,
    MONTO NUMERIC(18,2),
    DTOP NUMERIC(9,2),
    DTOM NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    EXTRA 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),
    RTCREE NUMERIC(9,2),
    RTCREEM 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_NOTADBPR (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NUMPROV VARCHAR(15),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    EMAIL VARCHAR(100),
    VENCE DATE,
    NROCTR VARCHAR(30),
    MONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15),
    DOCAPLICADO VARCHAR(21))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_ORDENCMP (
    ID INTEGER,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    DIASVENCE INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREE NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    CONDENTREGA VARCHAR(255),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    BOD1 VARCHAR(2),
    BOD2 VARCHAR(2),
    BOD3 VARCHAR(2),
    BOD4 VARCHAR(2),
    BOD5 VARCHAR(2),
    BOD6 VARCHAR(2),
    BOD7 VARCHAR(2),
    BOD8 VARCHAR(2),
    BOD9 VARCHAR(2),
    BOD0 VARCHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    DTOIT1 NUMERIC(18,2),
    DTOIT2 NUMERIC(18,2),
    DTOIT3 NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CODIGOPR VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    DIASPAGO INTEGER,
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    DTOITEM1 NUMERIC(18,2),
    DTOITEM2 NUMERIC(18,2),
    DTOITEM3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    CANTB1 NUMERIC(18,4),
    CANTB2 NUMERIC(18,4),
    CANTB3 NUMERIC(18,4),
    CANTB4 NUMERIC(18,4),
    CANTB5 NUMERIC(18,4),
    CANTB6 NUMERIC(18,4),
    CANTB7 NUMERIC(18,4),
    CANTB8 NUMERIC(18,4),
    CANTB9 NUMERIC(18,4),
    CANTB0 NUMERIC(18,4),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_ORDENINT (
    ID INTEGER,
    MONEDAEX CHAR(1))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DIASVENCE INTEGER,
    DIASPAGO INTEGER,
    VENCE DATE,
    MONEDA VARCHAR(60),
    TRM DOUBLE PRECISION,
    IMPORTACION VARCHAR(20),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    REFERENCIA VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALMON NUMERIC(18,2),
    TERMINOSPAGO VARCHAR(1024),
    ENTREGA VARCHAR(1024),
    ENTRNOM VARCHAR(60),
    ENTRDIR VARCHAR(255),
    ENTRCIU VARCHAR(60),
    ENTRPAIS VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ORDENID INTEGER,
    ORDENNRO VARCHAR(12),
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    PRUNMON NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CODIGOPR VARCHAR(20),
    ZONACOD VARCHAR(3),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CODPROY VARCHAR(4),
    CODCENTRO VARCHAR(4),
    NOMPROY VARCHAR(60),
    NOMCENTRO VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    NOMGRUPO VARCHAR(60),
    NOMSUBG VARCHAR(60),
    NOMMARC VARCHAR(60),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_ORDENINV (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    FECLLEGA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODITEM VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    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),
    PESOUNIT NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    LOTE VARCHAR(15),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PARQUEADERO (
    PLACA VARCHAR(8))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    MARCA VARCHAR(60),
    COLOR VARCHAR(60),
    LINEA VARCHAR(60),
    TIPO VARCHAR(60),
    TARIFA NUMERIC(18,2),
    MAXC INTEGER,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FIJO NUMERIC(18,2),
    HORAINI TIME)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PEDIDO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUCUR VARCHAR(10),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREEP NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    ENTREGA DATE,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    INSTRUCCIONES VARCHAR(255),
    DESPACHO VARCHAR(255),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    ORDENCLI VARCHAR(20),
    NUMORI VARCHAR(60),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    SUMA4 NUMERIC(18,2),
    SUMA5 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PENDIENTE (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PESOTOT NUMERIC(18,4),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PLANCONCEPTO (
    IDDOC INTEGER)
RETURNS (
    ITEM INTEGER,
    CONCEPTO VARCHAR(60),
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PLANILLA (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NOMRUTA VARCHAR(60),
    ASESOR INTEGER,
    NOMASESOR VARCHAR(60),
    NITASOC VARCHAR(20),
    NOMBREASOC VARCHAR(60),
    VEHICULO VARCHAR(15),
    TIPOVEHI VARCHAR(30),
    CAPAVEHI INTEGER,
    NUMINTERNO VARCHAR(15),
    HORA TIME,
    NITCOND VARCHAR(20),
    NOMBRECOND VARCHAR(60),
    PASAJES NUMERIC(18,2),
    REMESAS NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    CONTRAE NUMERIC(18,2),
    NETO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMTIQ INTEGER,
    PREFTIQ VARCHAR(4),
    NUMTIQ VARCHAR(8),
    PASAJERO VARCHAR(60),
    RUTATIQ VARCHAR(60),
    PUESTO VARCHAR(10),
    CONTADOTIQ NUMERIC(18,2),
    CONTRAETIQ NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    GASTO CHAR(1),
    TIPOCONC CHAR(15),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCAJA NUMERIC(18,2),
    TOTALBANCO NUMERIC(18,2),
    TOTALNOMI NUMERIC(18,2),
    NOMPER VARCHAR(60),
    CARGOEMPL VARCHAR(60),
    DEPTOEMPL VARCHAR(60),
    SECCEMPL VARCHAR(60),
    AREAEMPL VARCHAR(60),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    NUMCOP INTEGER,
    NOMBRE_COPIA VARCHAR(60),
    DIASLAB INTEGER,
    SALARIO NUMERIC(18,2),
    BENEFICIO CHAR(1),
    BENPAG CHAR(1),
    BASE NUMERIC(18,2),
    CODDPTOEMPL INTEGER,
    CODSECCEMPL INTEGER,
    CODAREAEMPL INTEGER,
    ORDEN INTEGER,
    CANT NUMERIC(18,2),
    HORDIU NUMERIC(18,2),
    HORNOC NUMERIC(18,2),
    HORFDI NUMERIC(18,2),
    HORFNO NUMERIC(18,2),
    HORREN NUMERIC(18,2),
    HORREF NUMERIC(18,2),
    HORDOM NUMERIC(18,2),
    HORRFN NUMERIC(18,2),
    MHORDIU NUMERIC(18,2),
    MHORNOC NUMERIC(18,2),
    MHORFDI NUMERIC(18,2),
    MHORFNO NUMERIC(18,2),
    MHORREN NUMERIC(18,2),
    MHORREF NUMERIC(18,2),
    MHORDOM NUMERIC(18,2),
    MHORRFN NUMERIC(18,2),
    FORMPAGO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PLANPROD (
    ID INTEGER,
    ENSPREV CHAR(1))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PLANPROD_ENT (
    ID INTEGER,
    ENSPREV CHAR(1))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PLANREMESA (
    IDDOC INTEGER)
RETURNS (
    ITEM INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    DESTINO VARCHAR(60),
    VALOR NUMERIC(18,2),
    CONTADO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    CONTRAE NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PRODUCCION (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PRODUCCION_ENT (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PRODUCCION_ENTRADA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE IMPR_PRODUCCION_MONTAJE (
    ID INTEGER)
RETURNS (
    ITEM INTEGER,
    PROCESO VARCHAR(60),
    MINUTOS NUMERIC(18,4),
    REALES NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_RECICAJA (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    RTCREE 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(8),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    RTCREEDOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    DV CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_RECICJPAGO (
    ID INTEGER)
RETURNS (
    ITEMPAGO INTEGER,
    FORPAGO VARCHAR(30),
    BCOPAGO VARCHAR(2),
    CTAPAGO VARCHAR(20),
    NUMPAGO VARCHAR(20),
    FECPAGO DATE,
    MONTOPAGO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_RECIPROV (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    RCREE 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(8),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    RCREEDOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_REDENCION (
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_REMESA (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ASESOR INTEGER,
    NOMASESOR VARCHAR(60),
    VEHICULO VARCHAR(15),
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    TIPOVEHI VARCHAR(30),
    NUMINTERNO VARCHAR(15),
    REMITENOM VARCHAR(60),
    REMITECIU VARCHAR(60),
    REMITEDIR VARCHAR(60),
    REMITETEL VARCHAR(40),
    DESTINONOM VARCHAR(60),
    DESTINOCIU VARCHAR(60),
    DESTINODIR VARCHAR(60),
    DESTINOTEL VARCHAR(40),
    PRODUCTO VARCHAR(15),
    NOMPRODUCTO VARCHAR(60),
    CONCEPTO VARCHAR(255),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CANTIDAD NUMERIC(18,2),
    PESO NUMERIC(18,2),
    UNIDAD VARCHAR(10),
    EMPAQUE VARCHAR(60),
    NATURALEZA VARCHAR(25),
    VALOR NUMERIC(18,2),
    FLETE NUMERIC(18,2),
    SEGURO NUMERIC(18,2),
    DOMICILIO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    FORMAP CHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_REMIPROV (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NUMPROV VARCHAR(15),
    COTIZACION VARCHAR(30),
    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),
    SERIALES VARCHAR(4096),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_REMISION (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER,
    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),
    SERIALES VARCHAR(4096),
    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),
    SUMA4 NUMERIC(18,2),
    SUMA5 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VRFLETE NUMERIC(18,2),
    VEHICULO VARCHAR(15),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_RESERVA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE 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),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_REVPRECIOS (
    ID INTEGER)
RETURNS (
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE IMPR_RUTERO (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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,
    TIPODOC INTEGER,
    NOMTIPO VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    FECDOC DATE,
    NITCLIEN VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMCLIEN VARCHAR(60),
    DIRCLIEN VARCHAR(60),
    TELCLIEN VARCHAR(40),
    URGENTE CHAR(1),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    MONTO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    NETO NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    CAJAS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_SALIDA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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,
    SERIALES VARCHAR(4096),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_SORTEO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    PREMIO VARCHAR(60),
    TEXTO VARCHAR(255),
    MONTO NUMERIC(18,2),
    FECFAC DATE,
    HORAFAC TIME,
    NUMFAC VARCHAR(12))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_TAXONOMIA (
    IDTAX INTEGER,
    IDENC INTEGER,
    FECHA CHAR(8))
RETURNS (
    TITULO VARCHAR(100),
    FECHAA CHAR(8),
    ITEM INTEGER,
    NIVEL INTEGER,
    NOMBRE2 VARCHAR(255),
    NOMBRE3 VARCHAR(255),
    NOMBRE4 VARCHAR(255),
    NOMBRE5 VARCHAR(255),
    NOMBRE VARCHAR(255),
    SALDO2 NUMERIC(18,2),
    SALDO3 NUMERIC(18,2),
    SALDO4 NUMERIC(18,2),
    SALDO5 NUMERIC(18,2),
    VALOR NUMERIC(18,2),
    SALDO2A NUMERIC(18,2),
    SALDO3A NUMERIC(18,2),
    SALDO4A NUMERIC(18,2),
    SALDO5A NUMERIC(18,2),
    VALORA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_TIQUETE (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NOMRUTA VARCHAR(60),
    ASESOR INTEGER,
    NOMASESOR VARCHAR(60),
    VEHICULO VARCHAR(15),
    TIPOVEHI VARCHAR(30),
    NUMINTERNO VARCHAR(15),
    HORA TIME,
    NITCLIENTE VARCHAR(20),
    NOMBRECLIENTE VARCHAR(60),
    PASAJERO VARCHAR(60),
    PUESTO VARCHAR(10),
    PASAJE NUMERIC(18,2),
    TOTPASAJE NUMERIC(18,2),
    SEGURO NUMERIC(18,2),
    TOTSEGURO NUMERIC(18,2),
    CANT INTEGER,
    TOTAL NUMERIC(18,2),
    FORMAP CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_TRASFERENCIA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NIT VARCHAR(20),
    NOMTERC 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),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    LOTEDES VARCHAR(15),
    LOTEVENCE DATE,
    SERIALES VARCHAR(4096),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_TRASLACAJA (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NOMCAJAORI VARCHAR(60),
    NOMCAJADES VARCHAR(60),
    CONCEPTO VARCHAR(60),
    ITEM INTEGER,
    FORPAGO VARCHAR(30),
    BCOPAGO VARCHAR(2),
    CTAPAGO VARCHAR(20),
    NUMPAGO VARCHAR(20),
    FECPAGO DATE,
    MONTOPAGO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_TRASLADOBCO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODCUENTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    SUCURSAL VARCHAR(60),
    CTACONTA VARCHAR(20),
    CODBANCO INTEGER,
    NOMBANCO VARCHAR(60),
    CODCUENTAD VARCHAR(3),
    NROCUENTAD VARCHAR(20),
    TITULARD VARCHAR(60),
    SUCURSALD VARCHAR(60),
    CTACONTAD VARCHAR(20),
    CODBANCOD INTEGER,
    NOMBANCOD VARCHAR(60),
    NOTA VARCHAR(8),
    MONTO NUMERIC(18,2),
    NOTAMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    GMFPORC NUMERIC(9,2),
    GMFMONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPR_VACACIONES (
    ID INTEGER)
RETURNS (
    NITEMP VARCHAR(20),
    NOMEMP VARCHAR(60),
    DEPTO VARCHAR(60),
    CARGO VARCHAR(60),
    FECING DATE,
    FECINI DATE,
    FECFIN DATE,
    DIASACU INTEGER,
    DIASTOT INTEGER,
    DIASHAB INTEGER,
    DIASNOL INTEGER,
    DISFRUT VARCHAR(11),
    SALARIO NUMERIC(18,2),
    VALOR NUMERIC(18,2),
    ITEM INTEGER,
    CODCONC INTEGER,
    CONCNOM VARCHAR(60),
    CONCVALOR NUMERIC(18,2),
    CONCPOD CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPUESTOS_CLIENTE (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(5),
    TEL VARCHAR(40),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    IVAMONTO 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),
    SUBTOTALD NUMERIC(18,2),
    DTOMONTOD NUMERIC(18,2),
    IVAMONTOD NUMERIC(18,2),
    EXENTOSD NUMERIC(18,2),
    GRAVADOS1D NUMERIC(18,2),
    GRAVADOS2D NUMERIC(18,2),
    GRAVADOS3D NUMERIC(18,2),
    BASEDEC2799D NUMERIC(18,2),
    IVA1D NUMERIC(18,2),
    IVA2D NUMERIC(18,2),
    IVA3D NUMERIC(18,2),
    IVADEC2799D NUMERIC(18,2),
    EXTRAD NUMERIC(18,2),
    TOTALD NUMERIC(18,2),
    RTFTEMONTOD NUMERIC(18,2),
    RTIVAMONTOD NUMERIC(18,2),
    RTICAMONTOD NUMERIC(18,2),
    NETOD NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPUESTOS_COMPRAS (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1))
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NUMPROV VARCHAR(15),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    IVA6 NUMERIC(18,2),
    IVA7 NUMERIC(18,2),
    IVA8 NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    GRAVADOS4 NUMERIC(18,2),
    GRAVADOS5 NUMERIC(18,2),
    GRAVADOS6 NUMERIC(18,2),
    GRAVADOS7 NUMERIC(18,2),
    GRAVADOS8 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREEMONTO NUMERIC(18,2),
    NETO NUMERIC(18,2),
    ANULADO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPUESTOS_PROVEEDOR (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(5),
    TEL VARCHAR(40),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    GRAVADOS3 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),
    SUBTOTALD NUMERIC(18,2),
    DTOMONTOD NUMERIC(18,2),
    IVAMONTOD NUMERIC(18,2),
    EXENTOSD NUMERIC(18,2),
    GRAVADOS1D NUMERIC(18,2),
    IVA1D NUMERIC(18,2),
    GRAVADOS2D NUMERIC(18,2),
    IVA2D NUMERIC(18,2),
    GRAVADOS3D NUMERIC(18,2),
    IVA3D NUMERIC(18,2),
    EXTRAD NUMERIC(18,2),
    TOTALD NUMERIC(18,2),
    RTFTEMONTOD NUMERIC(18,2),
    RTIVAMONTOD NUMERIC(18,2),
    RTICAMONTOD NUMERIC(18,2),
    NETOD NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE IMPUESTOS_VENTAS (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    GRAVADOS4 NUMERIC(18,2),
    GRAVADOS5 NUMERIC(18,2),
    GRAVADOS6 NUMERIC(18,2),
    GRAVADOS7 NUMERIC(18,2),
    GRAVADOS8 NUMERIC(18,2),
    BASEDEC2799 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    IVA6 NUMERIC(18,2),
    IVA7 NUMERIC(18,2),
    IVA8 NUMERIC(18,2),
    IVADEC2799 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREEMONTO NUMERIC(18,2),
    NETO NUMERIC(18,2),
    ANULADO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE INACTIVAR_ACTUALIZACION_BALANCE (
    FECINI DATE,
    FECFIN DATE,
    NULO CHAR(1))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE INACTIVAR_PROVEEDORES (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SALDO NUMERIC(18,2),
    ITEMS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE INACTIVOS_EXISTENCIA (
    FECHA DATE,
    ACTIVAR CHAR(1))
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    BODEGA VARCHAR(2),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE INCAPACIDAD_TOTAL (
    EMPL VARCHAR(20),
    FECHA DATE)
RETURNS (
    DURAC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE INCREMENTE_NROCOPIA (
    TIPO INTEGER,
    ID INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE INF_CERTIFICADOS_RETENCION (
    ANO CHAR(4))
RETURNS (
    TIPOID VARCHAR(2),
    NIT VARCHAR(20),
    APELLIDO1 VARCHAR(60),
    APELLIDO2 VARCHAR(60),
    NOMBRE1 VARCHAR(60),
    NOMBRE2 VARCHAR(60),
    DIRECCION VARCHAR(60),
    DEPTOCIA VARCHAR(2),
    MUNICIA VARCHAR(3),
    PAIS VARCHAR(3),
    DEPTOEMPL VARCHAR(2),
    MUNIEMPL VARCHAR(3),
    EMAIL VARCHAR(100),
    FECINI DATE,
    FECFIN DATE,
    SALARIOS NUMERIC(18,2),
    GASTOS NUMERIC(18,2),
    PENSION NUMERIC(18,2),
    TOTALVACAC NUMERIC(18,2),
    CESANTIA NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    APSALUD NUMERIC(18,2),
    APPENSION NUMERIC(18,2),
    VOLUNTARIOS NUMERIC(18,2),
    RETENCION NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE INFORME_DIARIO_VENTAS (
    FECHA DATE,
    PREFIJO VARCHAR(4),
    AGRUPA CHAR(1))
RETURNS (
    SERVIDOR VARCHAR(60),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    NROFAC INTEGER,
    NROFACAN INTEGER,
    HORAINI TIME,
    HORAFIN TIME,
    BASEFAC NUMERIC(18,2),
    IVAFAC NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    NROITE INTEGER,
    NRODEV INTEGER,
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    TOTALDEV NUMERIC(18,2),
    BASENETO NUMERIC(18,2),
    IVANETO NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    GRUPOFAC VARCHAR(20),
    GRUPONOM VARCHAR(60),
    GRUPOCANTF INTEGER,
    GRUPOBASEF NUMERIC(18,2),
    GRUPODSCTOF NUMERIC(18,2),
    GRUPOIVAP NUMERIC(9,2),
    GRUPOIVAMF NUMERIC(18,2),
    GRUPOTOTF NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE INFORME_DIARIO_VENTAS_FP (
    FECHA DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    FORMAP INTEGER,
    NOMFORMA VARCHAR(30),
    CANTIDAD INTEGER,
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE INFORME_DIARIO_VENTAS_TERM (
    FECHA DATE,
    PREFIJO VARCHAR(4),
    AGRUPA CHAR(1))
RETURNS (
    TERMINAL VARCHAR(20),
    NOMTERM VARCHAR(60),
    CANTIDAD INTEGER,
    BASE NUMERIC(18,2),
    DESCTO NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE INSERTE_SALDO_INICIAL (
    ITEM INTEGER,
    CUEN_COD VARCHAR(20),
    TERC_NIT VARCHAR(20),
    PROY_COD VARCHAR(4),
    CENT_COD VARCHAR(4),
    ARTI_COD VARCHAR(15),
    DOCO_NUMERO VARCHAR(8),
    TIPODOC INTEGER,
    DOCO_VENCE CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  EXIT;
END^





CREATE 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(8),
    BOD CHAR(2),
    ARTI VARCHAR(20),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2),
    LOTE VARCHAR(20),
    IDR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE KARDEX_ARTICULO_MES_N (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE KARDEX_DESDE_HASTA_N (
    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
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE KARDEX_INVENTARIO_MES_N (
    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
  SUSPEND;
END^





CREATE PROCEDURE LEE_CONFIGURACION (
    MODULO VARCHAR(50),
    CATEGORIA VARCHAR(50),
    PROPIEDAD VARCHAR(255))
RETURNS (
    VALOR VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE LIBRO_DIARIO (
    ANO CHAR(4),
    MES INTEGER,
    NIVEL INTEGER,
    FECHAS CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    TIPOCOMP VARCHAR(3),
    NOMCOMP VARCHAR(60),
    FECHA CHAR(8),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    NOMCUENTA VARCHAR(60),
    MAYOR VARCHAR(20),
    CLASE VARCHAR(20),
    SUBCLASE VARCHAR(20),
    GRUPO VARCHAR(20),
    SUBGRUPO VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE LIBRO_DIARIO_CUENTA (
    ANO CHAR(4),
    MES INTEGER,
    RESUMIDO CHAR(1),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TIPOINI VARCHAR(3),
    TIPOFIN VARCHAR(3))
RETURNS (
    CUENTA VARCHAR(20),
    TIPOCOMP VARCHAR(3),
    NOMCOMP VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    NOMCUENTA VARCHAR(60),
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE LIBRO_DIARIO_CUENTA_N (
    ANO CHAR(4),
    MES INTEGER,
    RESUMIDO CHAR(1),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TIPOINI VARCHAR(3),
    TIPOFIN VARCHAR(3))
RETURNS (
    CUENTA VARCHAR(20),
    TIPOCOMP VARCHAR(3),
    NOMCOMP VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    NOMCUENTA VARCHAR(140),
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE LIQ_PARQUEADERO (
    PLACA VARCHAR(8))
RETURNS (
    ID INTEGER,
    FECINI DATE,
    FECFIN DATE,
    HORAINI TIME,
    HORAFIN TIME,
    CANT INTEGER,
    PRUNIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE LIQUIDA_VACACIONES (
    NITEMPL VARCHAR(20),
    FECHA DATE)
RETURNS (
    IDVACAC INTEGER,
    FECING DATE,
    DIASLAB INTEGER,
    DIASDIS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE LIQUIDACION_APORTES (
    ANO VARCHAR(4),
    MES INTEGER,
    MORA NUMERIC(18,4),
    DIASMORA INTEGER,
    FECHA DATE,
    FORMULARIO VARCHAR(10),
    SOLOSS CHAR(1))
RETURNS (
    IDAPORTE INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE LIQUIDACION_EMPLEADO (
    NITEMPL VARCHAR(20),
    FECLIQ DATE,
    DIASLAB INTEGER)
RETURNS (
    SALARIOP NUMERIC(18,2),
    PRIMA NUMERIC(18,2),
    FECPRIMA DATE,
    SALARIOC NUMERIC(18,2),
    FECCES DATE,
    CESANTIA NUMERIC(18,2),
    INTCESANT NUMERIC(18,2),
    BASEVAC NUMERIC(18,2),
    FECVAC DATE,
    DIASVAC NUMERIC(9,4),
    VACACION NUMERIC(18,2),
    DSPRESTAMO NUMERIC(18,2),
    DSCARTERA NUMERIC(18,2),
    TOTPAGOS NUMERIC(18,2),
    TOTDESC NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE LIQUIDACION_IMPORTACION (
    ID INTEGER)
RETURNS (
    ITEM INTEGER,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    DESCADIC BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    PRUMON NUMERIC(18,2),
    TRMFAC NUMERIC(18,2),
    FLETES NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    IMPUESTOS NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    SUMAFLETES NUMERIC(18,2),
    SUMASEGUROS NUMERIC(18,2),
    SUMAIMPTOS NUMERIC(18,2),
    SUMAOTROS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE LISTA_PRECIOS_CON_ESCALA (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    LISTA INTEGER,
    GRUPO VARCHAR(2))
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    PRECIO NUMERIC(18,2),
    PRECIOESCALA1 NUMERIC(18,2),
    ESCALA1 NUMERIC(18,4),
    PRECIOESCALA2 NUMERIC(18,2),
    ESCALA2 NUMERIC(18,4),
    IVA NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE LISTA_PRECIOS_OFFLINE (
    VEND INTEGER)
RETURNS (
    LIPR_COD INTEGER,
    ARTI_COD VARCHAR(15),
    LIPR_NOM VARCHAR(30),
    PRAR_FIJO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE LISTAS_ARTICULO_WEB (
    ARTICULO VARCHAR(15),
    VENDEDOR INTEGER,
    CLIENTE VARCHAR(20))
RETURNS (
    NOMLISTA VARCHAR(30),
    CODLISTA INTEGER,
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MANIFIESTOS_CONDUCTOR (
    CONDUCTOR VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VEHICULO VARCHAR(20),
    DESTINO INTEGER,
    MONTO NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MANIFIESTOS_VEHICULO (
    VEHICULO VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONDUCTOR VARCHAR(20),
    DESTINO INTEGER,
    MONTO NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MAX_NIVEL
RETURNS (
    MAXNIVEL SMALLINT)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MAXIMO_ARTICULO (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2),
    CANT NUMERIC(18,2))
RETURNS (
    EXCESO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MAYOR_SALDO_LOTE (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2))
RETURNS (
    LOTE VARCHAR(15),
    SALDO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE MEDIOS_MAGNETICOS (
    ANO CHAR(4))
RETURNS (
    TIPO CHAR(1),
    CODIGO CHAR(2),
    SUBCODIGO CHAR(2),
    NIT CHAR(20),
    DV CHAR(1),
    CLASE CHAR(1),
    NOMBRE VARCHAR(60),
    VALOR1 NUMERIC(18,2),
    VALOR2 NUMERIC(18,2),
    VALOR3 NUMERIC(18,2),
    DESCRIPCION VARCHAR(60),
    DIRECCION VARCHAR(60),
    DEPTOYMUN CHAR(5))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MEDIOS_MAGNETICOS2 (
    ANO CHAR(4))
RETURNS (
    TIPO CHAR(1),
    CODIGO CHAR(2),
    SUBCODIGO CHAR(2),
    NIT CHAR(14),
    DV CHAR(1),
    CLASE CHAR(1),
    NOMBRE VARCHAR(60),
    VALOR1 NUMERIC(18,2),
    VALOR2 NUMERIC(18,2),
    VALOR3 NUMERIC(18,2),
    DESCRIPCION VARCHAR(20),
    DIRECCION VARCHAR(40),
    DEPTOYMUN CHAR(5))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MERCANCIA_EN_TRANSITO (
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MES_FECHA (
    FECHA CHAR(8))
RETURNS (
    MESF CHAR(2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MINIMO_ARTICULO (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2))
RETURNS (
    MINIMO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MM_1001 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1001_8 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1001_9 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1002 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1003 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1005 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_10057 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1006 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_10067 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_10068 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1007 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_10078 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1008 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1009 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1011 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_1012 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM_22761 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MM14_EMPLEADOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPOID INTEGER,
    NIT VARCHAR(20),
    VINCU INTEGER,
    CONDI INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MM14_FACTURACIONPAPEL (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(10),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    INGRESOS NUMERIC(18,2),
    DESCTOSCOND NUMERIC(18,2),
    DESCTOSNOCOND NUMERIC(18,2),
    ANULADAS NUMERIC(18,2),
    IVAANUL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MM14_FACTURACIONPOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PUNTOPOS VARCHAR(20),
    PREF VARCHAR(10),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    EXENTOS NUMERIC(18,2),
    BASE16 NUMERIC(18,2),
    BASE5 NUMERIC(18,2),
    CONSUMO16 NUMERIC(18,2),
    CONSUMO8 NUMERIC(18,2),
    CONSUMO4 NUMERIC(18,2),
    DESCTOS NUMERIC(18,2),
    FORMAP INTEGER,
    FACTURAS INTEGER,
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MM14_MOVTERCEROS (
    FECINI CHAR(8),
    FECFIN CHAR(8))
RETURNS (
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(100),
    TIPOID INTEGER,
    NIT VARCHAR(20),
    SALDOINI NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    SALDOFIN NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MM14_PAGOS_SALARIALES (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPOID INTEGER,
    NIT VARCHAR(20),
    DIASL INTEGER,
    SALINT INTEGER,
    BASICO NUMERIC(18,2),
    SUELDO NUMERIC(18,2),
    HORASE NUMERIC(18,2),
    COMIS NUMERIC(18,2),
    VIATICO NUMERIC(18,2),
    ESPECIE NUMERIC(18,2),
    BONIFICA NUMERIC(18,2),
    AUXILIO NUMERIC(18,2),
    PRIMAS NUMERIC(18,2),
    OTROSAL NUMERIC(18,2),
    DESOTROS VARCHAR(500),
    INCAPEMP NUMERIC(18,2),
    DIASINCEMP INTEGER,
    INCAPEPS NUMERIC(18,2),
    DIASINCEPS INTEGER,
    LICNOREM NUMERIC(18,2),
    DIASLNR INTEGER,
    LICREM NUMERIC(18,2),
    DIASLR INTEGER,
    VACAC NUMERIC(18,2),
    DIASVAC INTEGER,
    FECVINI DATE,
    FECVFIN DATE,
    VACACOMP NUMERIC(18,2),
    VACALIQ NUMERIC(18,2),
    VRNOSALPRIM NUMERIC(18,2),
    VRNOSALPUBL NUMERIC(18,2),
    VRNOSALPREM NUMERIC(18,2),
    VRNOSALOTRO NUMERIC(18,2),
    DESOTRONS VARCHAR(500),
    PORCARL NUMERIC(9,2),
    NOVEDAD CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MM14_TERCEROS (
    FECINI CHAR(8),
    FECFIN CHAR(8))
RETURNS (
    TIPOID INTEGER,
    NIT VARCHAR(20),
    DV CHAR(1),
    NATUR CHAR(1),
    APE1 VARCHAR(60),
    APE2 VARCHAR(60),
    NOM1 VARCHAR(60),
    NOM2 VARCHAR(60),
    RAZON VARCHAR(60),
    DIREC VARCHAR(100),
    ACTIV CHAR(4),
    PAIS CHAR(3),
    DPTO CHAR(2),
    MPIO CHAR(3),
    CORREO VARCHAR(100),
    TELEF VARCHAR(40),
    CELUL VARCHAR(40))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MMDIST_2 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_22 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_23 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_24 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_26 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_31 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_310 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_32 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_33 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_34 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_36 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_4 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MMDIST_6 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MOV_DETALLE_BANCOS (
    FECINI DATE,
    FECFIN DATE,
    CTAINI VARCHAR(3),
    CTAFIN VARCHAR(3),
    DETALLE CHAR(1))
RETURNS (
    FECHA DATE,
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    CONCEPTO VARCHAR(60),
    BENEFICIARIO VARCHAR(60),
    NUMEROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    EGRESO VARCHAR(10),
    COD_CUENTA VARCHAR(3),
    SALDOINICIAL NUMERIC(18,2),
    CODIGO INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVARTI_CANTIDADES (
    ARTICULO VARCHAR(15),
    DESDE DATE,
    HASTA DATE,
    AGENCIA INTEGER)
RETURNS (
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CANTENT NUMERIC(18,4),
    CANTSAL NUMERIC(18,4),
    IDMOV INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVBANCO_NO_CONCILIADOS (
    FECINI DATE,
    FECFIN DATE,
    CUENTA VARCHAR(3))
RETURNS (
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVER_FORMATO (
    TIPO INTEGER,
    PREFI VARCHAR(4),
    POSICIONES INTEGER,
    DESDE INTEGER,
    HASTA INTEGER,
    ACCION CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE MOVIMIENTO_ACUM_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_ARTICULO_ANULADO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    TIPO VARCHAR(8),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_ARTICULOC_MES (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_BANCO_MES (
    CUENTA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    CONCEPTO VARCHAR(60),
    TIPOID INTEGER,
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_CAJA_MES (
    CAJA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    TERCERO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    CONCEPTO VARCHAR(60),
    TIPOID INTEGER,
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA (
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    EMPSUCURSAL INTEGER,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    DIASPAGO INTEGER,
    SUCURSAL VARCHAR(10),
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_CENTRO_MES (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_CENTRO_MES_NIIF (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_CENTROS_MES (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_CUENTA_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA (
    NIT VARCHAR(20),
    DESDE DATE,
    HASTA DATE,
    MONEDA INTEGER)
RETURNS (
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    NOMBRE VARCHAR(60),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    NUMPROV VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_NETO_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_NETO_CUENTA_MES_N (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_NO_AFECTABLE
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    CUENTA VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_TERCERO_MES (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTO_TERCERO_MES_NIIF (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_ARTICULOC_MES (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_CENTRO_MES (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_CENTRO_MES_N (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_CENTRO_TERCERO_MES (
    CUENTA VARCHAR(20),
    PROY CHAR(4),
    CENT CHAR(4),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_CUENTA_DE_HASTA_N (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_CUENTA_DESDE_HASTA (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_CUENTA_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_TERCERO_DESDE_HASTA (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_TERCERO_MES (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVIMIENTOS_TERCERO_MES_NIIF (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    ENT CHAR(1),
    CANTENT NUMERIC(18,4),
    CANTSAL NUMERIC(18,4),
    IDMOV INTEGER,
    NIT VARCHAR(20),
    CONS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE MOVTOS_CENTRO_TERCERO_MES_N (
    CUENTA VARCHAR(20),
    PROY CHAR(4),
    CENT CHAR(4),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NOMBRE_ASCII (
    CADENA VARCHAR(60))
RETURNS (
    CADENAASCII VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NOMBRE_COMPANIA
RETURNS (
    NOMBRE VARCHAR(80))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NOMBRES_GRUPOS_CLIENTE (
    NIT VARCHAR(20))
RETURNS (
    CODZONA VARCHAR(2),
    CODGRUPO INTEGER,
    CODCIU VARCHAR(5),
    NOMZONA VARCHAR(60),
    NOMGRUPO VARCHAR(60),
    NOMCIU VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE NOMINA_SALARIOS_UGPP (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPOCONT VARCHAR(60),
    CONCSAL INTEGER,
    ALTORIES CHAR(1),
    TIPODOC CHAR(3),
    NITEMPL VARCHAR(20),
    TIPODOCAP CHAR(3),
    NITEMPLAP VARCHAR(20),
    NOMEMPL VARCHAR(60),
    CARGO VARCHAR(60),
    BENEFICIO VARCHAR(60),
    FECING DATE,
    FECRET DATE,
    SALINT CHAR(1),
    ANO CHAR(4),
    MES INTEGER,
    DIASLAB INTEGER,
    DIASINC INTEGER,
    DIASLICR INTEGER,
    DIASLICNR INTEGER,
    DIASVACD INTEGER,
    DIASTOT INTEGER,
    NOVINGRET VARCHAR(16),
    CONC INTEGER,
    BASEAP CHAR(1),
    BENEF CHAR(1),
    CONCCTA VARCHAR(20),
    CONCNOM VARCHAR(60),
    CONCCTANOM VARCHAR(60),
    CONCIBCVR NUMERIC(18,2),
    CONCNIBCVR NUMERIC(18,2),
    CONCBENEF NUMERIC(18,2),
    INCAPVR NUMERIC(18,2),
    LICRVR NUMERIC(18,2),
    LICNRVR NUMERIC(18,2),
    VACDVR NUMERIC(18,2),
    VACCVR NUMERIC(18,2),
    VACFVR NUMERIC(18,2),
    PAGCES NUMERIC(18,2),
    PAGINT NUMERIC(18,2),
    PAGPRI NUMERIC(18,2),
    PAGIND NUMERIC(18,2),
    AUXTRA NUMERIC(18,2),
    PAGDOT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NOTACRCL_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NOTACRPR_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NOTADBCL_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NOTADBPR_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NOTASCRBC_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NOTASDBBC_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    NOMIID INTEGER,
    MOTIVO VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NRO_COPIA (
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    COPIA VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NROBANCO_REF_EGRESOS (
    CTABANCO VARCHAR(20))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE NUM_ENT
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE NUMERO_CONCILIACION (
    ID INTEGER)
RETURNS (
    ITEM INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE NUMERO_DOCUMENTO (
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ORDEN_SUGERIDA_TOTAL (
    PROVEEDOR VARCHAR(20),
    CODBOD VARCHAR(2),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    BODEGA VARCHAR(2),
    UNIDAD VARCHAR(8),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    SUGERIDO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    DIAS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ORDENE_TARIFAS (
    ABASE1 NUMERIC(18,2),
    ABASE2 NUMERIC(18,2),
    ABASE3 NUMERIC(18,2),
    ABASE4 NUMERIC(18,2),
    ABASE5 NUMERIC(18,2),
    ABASE6 NUMERIC(18,2),
    ABASE7 NUMERIC(18,2),
    ABASE8 NUMERIC(18,2),
    AIVA1 NUMERIC(18,2),
    AIVA2 NUMERIC(18,2),
    AIVA3 NUMERIC(18,2),
    AIVA4 NUMERIC(18,2),
    AIVA5 NUMERIC(18,2),
    AIVA6 NUMERIC(18,2),
    AIVA7 NUMERIC(18,2),
    AIVA8 NUMERIC(18,2))
RETURNS (
    BASE1 NUMERIC(18,2),
    BASE2 NUMERIC(18,2),
    BASE3 NUMERIC(18,2),
    BASE4 NUMERIC(18,2),
    BASE5 NUMERIC(18,2),
    BASE6 NUMERIC(18,2),
    BASE7 NUMERIC(18,2),
    BASE8 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    IVA6 NUMERIC(18,2),
    IVA7 NUMERIC(18,2),
    IVA8 NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ORDENES_ARTICULO (
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    ORDEN NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    SUMA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ORDENES_ARTICULO_FECHA (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECORD DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECLLEGA DATE,
    PROVEEDOR VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ORDENES_COMPRA_ARTICULO (
    CODIGO VARCHAR(20),
    FECHA DATE)
RETURNS (
    ORDENADO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PADRE (
    CUENTA VARCHAR(20))
RETURNS (
    PADRE VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PAGO_NOMINA_XEMPL (
    ID INTEGER)
RETURNS (
    NITEMPL VARCHAR(20),
    NOMBREEMPL VARCHAR(60),
    DEVENGOS NUMERIC(18,2),
    DEDUCIBLES NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TIPOPAGO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PEDIDOS_POR_ENTREGAR (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    IDDOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    CLIENTE VARCHAR(60),
    HORAREG TIME,
    ITEMS INTEGER,
    MONTO NUMERIC(18,2),
    VENDEDOR VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PEDIDOS_WEB_POR_CONFIRMAR (
    FECHA DATE)
RETURNS (
    IDDOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    CLIENTE VARCHAR(60),
    FECHAREG DATE,
    HORAREG TIME,
    ITEMS INTEGER,
    MONTO NUMERIC(18,2),
    VENDEDOR VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PEDIDOS_X_ORDENAR (
    FECHA DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VALIDEZ INTEGER,
    VEND INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    SUCUR VARCHAR(10))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PENDIENTES_X_CLIENTE (
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    ITEM INTEGER,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PERFILES_EMPLEADO
RETURNS (
    PERFIL INTEGER,
    NOMBRE VARCHAR(60),
    CODCONC INTEGER,
    NOMCONC VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PERIODO_NOM_FECHA (
    FECHA DATE,
    PERIODICIDAD INTEGER)
RETURNS (
    PERIODO INTEGER,
    ANO INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PERIODO_NOM_FECHAF (
    FECHA DATE,
    PERIODICIDAD INTEGER)
RETURNS (
    PERIODO INTEGER,
    ANO INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PLANILLA_NOMINA_HORAS (
    ID INTEGER)
RETURNS (
    NITDETALLE VARCHAR(20),
    NOMEMPL VARCHAR(60),
    DPTO INTEGER,
    SALARIO NUMERIC(18,2),
    HORAS NUMERIC(18,2),
    TIPOHORA VARCHAR(60),
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    NOVFECHA DATE,
    DPTO INTEGER,
    NOMEMPL VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PORCENTAJE (
    UTILIDAD NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    CERO CHAR(1))
RETURNS (
    PORC NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE POS (
    SUBSTR1 VARCHAR(100),
    STR VARCHAR(100))
RETURNS (
    POS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PRECIO_CANTIDAD (
    ARTICULO VARCHAR(20),
    LISTA INTEGER,
    VEND INTEGER,
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8))
RETURNS (
    FIJO NUMERIC(18,2),
    CANTMIN NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PRECIO_UNIDAD (
    ARTICULO VARCHAR(20),
    LISTA INTEGER,
    UNIDAD VARCHAR(8))
RETURNS (
    FIJO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    DIG INTEGER,
    COMIPORC NUMERIC(9,2),
    CANTMIN NUMERIC(18,4),
    SUBEMPRESA INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PRECIOS_WEB (
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    LISTA INTEGER,
    PRECIO NUMERIC(18,2),
    AGENCIA INTEGER,
    CANTMIN NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PRESTAMOS_EMPLEADO (
    TERC_NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    PRNO_ID INTEGER,
    PRNO_FECHA DATE,
    PRNO_CONC VARCHAR(60),
    PRNO_MONTO NUMERIC(18,2),
    PRNO_CUOTAS INTEGER,
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PRESTAMOS_NOMINA
RETURNS (
    PRNO_ID INTEGER,
    TERC_NIT VARCHAR(20),
    PRNO_FECHA DATE,
    PRNO_CONC VARCHAR(60),
    PRNO_PAGOID INTEGER,
    PRNO_MONTO NUMERIC(18,2),
    PRNO_CUOTAS INTEGER,
    PRNO_INTCES NUMERIC(9,4),
    TERC_NOM VARCHAR(60),
    EGRESO VARCHAR(10),
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PRESTAMOS_PENDIENTES (
    EMPLEADO VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    CONCEPTO VARCHAR(60),
    FECPRES DATE,
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PRESUPUESTO_MES (
    PERIODO INTEGER,
    ANO CHAR(4),
    CUENINI VARCHAR(20),
    CUENFIN VARCHAR(20))
RETURNS (
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60),
    PRDEBITO NUMERIC(18,2),
    PRCREDITO NUMERIC(18,2),
    APDEBITO NUMERIC(18,2),
    APCREDITO NUMERIC(18,2),
    MVDEBITO NUMERIC(18,2),
    MVCREDITO NUMERIC(18,2),
    AMDEBITO NUMERIC(18,2),
    AMCREDITO NUMERIC(18,2),
    DIFERENCIAM NUMERIC(18,2),
    DIFERENCIAA NUMERIC(18,2),
    PORCENTAJEM NUMERIC(9,2),
    PORCENTAJEA NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PRODUCCION_SUGERIDA (
    FECHA DATE,
    MARCA VARCHAR(3))
RETURNS (
    ARTICULO VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PROMEDIO_PRODUCCION_ARTICULO (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PROMEDIO_SALIDAS_ARTICULO (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PROMEDIO_TOTAL_ARTICULO (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PROVEEDORES_SIN_REGISTRO (
    ZONA VARCHAR(2))
RETURNS (
    NIT VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE PUNTOS_DOCUMENTO (
    TIPO INTEGER,
    IDDOC INTEGER,
    CLIENTE VARCHAR(20),
    FECHA DATE)
RETURNS (
    PTDOC INTEGER,
    PTACUM INTEGER,
    PTVENCER INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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(12),
    MONDOC NUMERIC(18,2),
    FECREC DATE,
    NUMREC VARCHAR(10),
    MONREC NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMI CHAR(2),
    PORC NUMERIC(18,2),
    DB NUMERIC(18,2),
    CR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RANGO_CLIENTES (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    NOMINI VARCHAR(60),
    NOMFIN VARCHAR(60),
    VENINI INTEGER,
    VENFIN INTEGER,
    COBINI INTEGER,
    COBFIN INTEGER,
    ZONINI VARCHAR(2),
    ZONFIN VARCHAR(2),
    CIUINI VARCHAR(5),
    CIUFIN VARCHAR(5),
    CLAINI INTEGER,
    CLAFIN INTEGER,
    AGRINI INTEGER,
    AGRFIN INTEGER,
    TIPINI INTEGER,
    TIPFIN INTEGER,
    ULTVNT DATE,
    ULTCON DATE,
    CHECK1 CHAR(1),
    CHECK2 CHAR(1),
    CHECK3 CHAR(1),
    CHECK4 CHAR(1),
    CHECK5 CHAR(1),
    CHECK6 CHAR(1))
RETURNS (
    NIT VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_APERTURA_NIIF
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE RECALCULA_COSTO_PROV (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    ARTICULO VARCHAR(20),
    FECHA DATE,
    TRM NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_COSTOS_NIIF (
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_FACTURAS_FECHA (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    IVATOTAL NUMERIC(18,2),
    TOTALF NUMERIC(18,2),
    ITEM INTEGER,
    CANT NUMERIC(18,4),
    PRUNIT NUMERIC(18,2),
    DTOIT NUMERIC(18,2),
    IVAITEM NUMERIC(18,2),
    TOTALI NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_FALTANTES_REMISIONES (
    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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_FALTANTES_VENTAS2 (
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FACTURA VARCHAR(8),
    REMISION VARCHAR(30),
    IDCON INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_GASTOS_IMPORTACION (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FAPO_ID INTEGER,
    FPGA_ITEM INTEGER,
    TIGI_COD INTEGER,
    TIPO CHAR(1),
    LIQUIDA CHAR(1),
    FPGA_TRM NUMERIC(18,4),
    FPGA_VALOR NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_IDREF (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    TIPOCO VARCHAR(3))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_IVA_COMPRA (
    ID INTEGER,
    PORANT NUMERIC(18,2),
    PORNUE NUMERIC(18,2))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    IVATOTAL NUMERIC(18,2),
    TOTALF NUMERIC(18,2),
    ITEM INTEGER,
    CANT NUMERIC(18,4),
    PRUNIT NUMERIC(18,2),
    DTOIT NUMERIC(18,2),
    IVAITEM NUMERIC(18,2),
    TOTALI NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_IVA_FACTURA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    IVATOTAL NUMERIC(18,2),
    TOTALF NUMERIC(18,2),
    ITEM INTEGER,
    CANT NUMERIC(18,4),
    PRUNIT NUMERIC(18,2),
    DTOIT NUMERIC(18,2),
    IVAITEM NUMERIC(18,2),
    TOTALI NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_MOVBANCO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULA_PUNTOS_CLIENTE (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20))
RETURNS (
    NIT VARCHAR(20),
    ID INTEGER,
    FECHA DATE,
    PUNTOS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULE_FACTURAS_MAL_TOTAL (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    TOTAL NUMERIC(18,2),
    TOTITEMS NUMERIC(18,2),
    IVATOT NUMERIC(18,2),
    IVAIT NUMERIC(18,2),
    IDFACT INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECALCULO_COMISIONES_VENTAS (
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE RECALCULO_DEV_REMISION
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE RECCONTADO_MVERDE (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECIBO_RECAUDO (
    CAJA INTEGER,
    PREFIJO VARCHAR(4),
    FORMAP INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECLASIFICA_DEVDEC1818 (
    FECINI DATE,
    FECFIN DATE,
    PREFI VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ITEM INTEGER,
    CODIGO VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECONTABILICE_COSTOS_VENTAS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECONTABILICE_NIIF (
    FECINI DATE,
    FECFIN DATE,
    TIPO VARCHAR(3),
    PREF VARCHAR(4),
    BORRAR CHAR(1),
    INCAJUS CHAR(1))
RETURNS (
    ID INTEGER,
    PRCO VARCHAR(4),
    NUMERO VARCHAR(8),
    CUENTA VARCHAR(20),
    ESTADO VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECUPERA_FACTURAS_VEND (
    VEND INTEGER,
    FECHA DATE)
RETURNS (
    ID VARCHAR(12),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    ITEMS INTEGER,
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RECUPERA_NUMERO_CHEQUE
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE RECUPERA_PEDIDOS_VEND (
    VEND INTEGER,
    FECHA DATE)
RETURNS (
    ID VARCHAR(12),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    ITEMS INTEGER,
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REDONDEE (
    VALOR NUMERIC(18,4),
    DIG INTEGER)
RETURNS (
    RESPUESTA NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REDONDEE_NOTAS_PROVEEDOR (
    FECFIN DATE)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE REDONDEE_PRECIO_LISTA (
    CODLISTA INTEGER)
RETURNS (
    PRECIO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REGISTRA_PROVISION (
    FECHA DATE,
    TIPOCOMP VARCHAR(3),
    PREFCNT VARCHAR(4),
    CTAGASTO VARCHAR(20),
    CTACART VARCHAR(20))
RETURNS (
    DIASI INTEGER,
    TOTAL NUMERIC(18,2),
    PROVISION NUMERIC(18,2),
    IDCNT INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REGISTRA_RECIBO_FACTURA (
    FACTURA INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE REGISTRA_RECIBOS_CONTADO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PREFAC VARCHAR(4),
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    PREFD VARCHAR(4),
    NUMD VARCHAR(8),
    PREFF VARCHAR(4),
    NUMF VARCHAR(8),
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REGISTRE_CLIENTE (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONOS VARCHAR(40),
    MOVIL VARCHAR(40),
    EMAIL VARCHAR(100),
    CONTACTO VARCHAR(60))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REGISTRE_COINCIDENCIAS_CONTEO (
    FECHA DATE,
    BODEGA VARCHAR(2),
    STAND VARCHAR(20),
    IDAJUS INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE REGISTRE_FACTURA_WEB (
    AGENCIA INTEGER,
    CLIENTE VARCHAR(20),
    OBSERV VARCHAR(1024))
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REGISTRE_ITEM_FACTURA_WEB (
    ID INTEGER,
    ARTICULO VARCHAR(20),
    BARRAS VARCHAR(20),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    DTOP NUMERIC(9,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    REFER VARCHAR(60))
RETURNS (
    ITEM INTEGER,
    TOTALF NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REGISTRE_REGIAUTO (
    CODIGO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER,
    DIA INTEGER,
    NUMERO VARCHAR(8),
    PORC NUMERIC(9,4),
    CONC VARCHAR(60),
    REF VARCHAR(8))
RETURNS (
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REMISIONES_COSTO_CERO
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ARTICULO VARCHAR(20),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RENGLON_NOVEDAD_APORTES (
    IDDOC INTEGER,
    SECINT INTEGER,
    FECLIQ DATE,
    DATOS1 VARCHAR(685) CHARACTER SET ISO8859_1,
    NITEMPL VARCHAR(20),
    PRIVEZ CHAR(1),
    IDNOV INTEGER,
    ITEM INTEGER,
    PPAGO INTEGER,
    PERNOV INTEGER,
    TIPONOV INTEGER,
    DIAINI INTEGER,
    DURA INTEGER,
    PRORROGA CHAR(1))
RETURNS (
    DATOS VARCHAR(686) CHARACTER SET ISO8859_1,
    PRIVEZN CHAR(1),
    SECINTN INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RENGLON_VS_APORTES (
    IDDOC INTEGER,
    FECLIQ DATE,
    DATOS1 VARCHAR(685),
    NITEMPL VARCHAR(20),
    PRIVEZ CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PPAGO INTEGER,
    PERNOV INTEGER,
    TIPONOV INTEGER,
    DIAINI INTEGER)
RETURNS (
    DATOS VARCHAR(686),
    PRIVEZN CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RENUMERAR_CLIENTES
RETURNS (
    NIT VARCHAR(20),
    I INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_ANALISIS_CARTERA (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    EXTENDIDA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    MAILCART VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    DIASCR INTEGER,
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    RESALTAR CHAR(1),
    INSTCART VARCHAR(255),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    CIENTOCHENTA NUMERIC(18,2),
    DOSSETENTA NUMERIC(18,2),
    TRESSESENTA NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    DIA_CAR INTEGER,
    RADICADA NUMERIC(18,2),
    SINRADICAR NUMERIC(18,2),
    CALIFICA VARCHAR(20),
    GRUPNOM VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    DIAS INTEGER,
    DTOF NUMERIC(18,2),
    FECDTOF DATE,
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_APLICACLI (
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMNIT VARCHAR(60),
    ITEM INTEGER,
    IDDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NRODOC VARCHAR(8),
    ABONO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_APLICAPROV (
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMNIT VARCHAR(60),
    ITEM INTEGER,
    IDDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NRODOC VARCHAR(8),
    ABONO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_APORTES_NOMINA (
    ADMINI VARCHAR(20),
    ADMFIN VARCHAR(20),
    EMPINI VARCHAR(20),
    EMPFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ORDEN CHAR(1),
    SOLOSS CHAR(1))
RETURNS (
    ADMINIST VARCHAR(20),
    NOMADM VARCHAR(60),
    ADMEPS CHAR(1),
    ADMAFP CHAR(1),
    ADMARP CHAR(1),
    ADMCCF CHAR(1),
    EMPNIT VARCHAR(20),
    EMPNOM VARCHAR(60),
    EMPDEP VARCHAR(60),
    FECNOM DATE,
    NOMCONC VARCHAR(60),
    ANO CHAR(4),
    PERIODO INTEGER,
    CONCEPTO VARCHAR(60),
    MONTOAP NUMERIC(18,2),
    DEDUC CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_ARTICULO_BARRAS (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    ORDEN CHAR(1))
RETURNS (
    ARTI_COD VARCHAR(15),
    ARTI_DES VARCHAR(60),
    ARTI_DESCORTA VARCHAR(30),
    GRUP_COD VARCHAR(2),
    GRUP_NOM VARCHAR(30),
    SUBG_COD VARCHAR(3),
    SUBG_NOM VARCHAR(30),
    MARC_COD VARCHAR(3),
    MARC_NOM VARCHAR(30),
    ARTI_UNIDAD VARCHAR(8),
    COBA_COD VARCHAR(15),
    COBA_DES VARCHAR(60),
    COBA_UNIDAD VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_ARTICULOS_CLIENTE (
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CONTACTO VARCHAR(255),
    CODCLI VARCHAR(20),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    OBSDOC VARCHAR(255),
    DTO NUMERIC(9,2),
    VEND INTEGER,
    TIPODOC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_ARTICULOS_CONTABIL (
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    INACTIVOS CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    MARINI VARCHAR(3),
    MARFIN VARCHAR(3),
    SUBINI VARCHAR(3),
    SUBFIN VARCHAR(3))
RETURNS (
    ARTI_COD VARCHAR(15),
    ARTI_DES VARCHAR(60),
    ARTI_DESCORTA VARCHAR(30),
    GRUP_COD VARCHAR(2),
    GRUP_NOM VARCHAR(30),
    SUBG_COD VARCHAR(3),
    SUBG_NOM VARCHAR(30),
    MARC_COD VARCHAR(3),
    MARC_NOM VARCHAR(30),
    ARTI_IVA NUMERIC(9,4),
    ARTI_UNIDAD VARCHAR(8),
    ESAR_NOM VARCHAR(20),
    ARTI_EXIST CHAR(1),
    ARTI_FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ARTI_OBS VARCHAR(2048),
    ARTI_PESO NUMERIC(18,2),
    ARTI_ALTO NUMERIC(18,2),
    ARTI_ANCHO NUMERIC(18,2),
    ARTI_LARGO NUMERIC(18,2),
    ARTI_CONSUMO NUMERIC(18,2),
    ARTI_ENSAMBLE CHAR(1),
    ARTI_TERCERO CHAR(1),
    ARTI_INVIMA VARCHAR(20),
    ARTI_CUM VARCHAR(20),
    ARTI_POSARANCEL VARCHAR(20),
    ARTI_PORCARAN NUMERIC(9,4),
    ARTI_INALC NUMERIC(9,4),
    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_CTAIVADC VARCHAR(20),
    COAR_CTAIVAV VARCHAR(20),
    COAR_CTAIVADV VARCHAR(20),
    COAR_CTAVNT VARCHAR(20),
    COAR_CTADEV VARCHAR(20),
    COAR_CTACONS VARCHAR(20),
    COAR_CTACOS VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_ARTICULOS_PROVEEDOR (
    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))
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(8),
    FECHA DATE,
    DTO NUMERIC(9,2),
    NUMPROV VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_ARTICULOS_PROVEEDORI (
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(4),
    GRPFIN VARCHAR(4),
    SUBINI VARCHAR(3),
    SUBFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA 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),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(3),
    NOMGRUPO VARCHAR(60),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(60),
    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))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    SINREMI CHAR(1))
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    DTO NUMERIC(9,2),
    DTO1 NUMERIC(9,2),
    DTO2 NUMERIC(9,2),
    DTO3 NUMERIC(9,2),
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCIU VARCHAR(5),
    CODCLI VARCHAR(20),
    NOMCIU VARCHAR(60),
    GRPCAR INTEGER,
    NOMGRPCAR VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_ASOCIADOS (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOM VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(40),
    OBS VARCHAR(255),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    ESTADO CHAR(1),
    ANIV DATE,
    CODCIUD VARCHAR(5),
    NOMCIUD VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_AUDITORIA (
    CODUSUARIO VARCHAR(10),
    FECINI DATE,
    FECFIN DATE,
    TIPODOC INTEGER,
    CODIGO VARCHAR(20))
RETURNS (
    USUARIO VARCHAR(10),
    FECHA DATE,
    HORA TIME,
    DOCUMENTO VARCHAR(60),
    OPERACION VARCHAR(30),
    NUMERODOC VARCHAR(20),
    EQUIPO VARCHAR(60),
    RAZONANULA VARCHAR(255),
    DATOS VARCHAR(4096))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_AUSENTISMO (
    EMPLDESDE VARCHAR(20),
    EMPLHASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMEMPL VARCHAR(60),
    DEPTO VARCHAR(60),
    NOMSECCION VARCHAR(60),
    NOMAREA VARCHAR(60),
    CARGO VARCHAR(60),
    FECHA DATE,
    NOVEDAD VARCHAR(60),
    DIAS INTEGER,
    TIPOINC VARCHAR(15),
    VALOR NUMERIC(18,2),
    MOTIVO VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CAMPANAS (
    FECHAI DATE,
    FECHAF DATE,
    CUMPLIDOS CHAR(1),
    DETALLE CHAR(1))
RETURNS (
    ID INTEGER,
    FECINI DATE,
    FECFIN DATE,
    NOMBRE VARCHAR(60),
    ITOK INTEGER,
    ITTOT INTEGER,
    PORCENTA NUMERIC(9,2),
    CLIENTE VARCHAR(20),
    NOMCLI VARCHAR(60),
    FECCONT DATE,
    EXPLICA VARCHAR(255),
    RESPTA VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CARTERA_CLIENTES (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    MAILCART VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    DIASCR INTEGER,
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    RESALTAR CHAR(1),
    INSTCART VARCHAR(255),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    RADICADA NUMERIC(18,2),
    SINRADICAR NUMERIC(18,2),
    TOTCLI NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CALIFICA VARCHAR(20),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    RCREE 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),
    RADICADA NUMERIC(18,2),
    SINRADICAR NUMERIC(18,2),
    INSTCART VARCHAR(255),
    CALIFICA VARCHAR(20),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    DIASCR INTEGER,
    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
BEGIN
  SUSPEND;
END^





CREATE 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),
    CALIFICA VARCHAR(20),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CLIENTES_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODCLI VARCHAR(20),
    NOMCLI VARCHAR(60),
    FECING VARCHAR(8),
    NITCLIE VARCHAR(20),
    DIR VARCHAR(60),
    TEL VARCHAR(40),
    CODMUNI VARCHAR(5),
    TIPONEG INTEGER,
    NOMCIU VARCHAR(60),
    ZONA VARCHAR(3))
AS
BEGIN
  SUSPEND;
END^





CREATE 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 VARCHAR(20),
    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
BEGIN
  SUSPEND;
END^





CREATE 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),
    RTICABASE NUMERIC(18,2),
    RTECREE 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
BEGIN
  SUSPEND;
END^





CREATE 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),
    PRECIO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DTO NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_COMPRAS_ARTICULOI (
    TIPO INTEGER,
    DETALLE CHAR(1),
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    SUBINI VARCHAR(4),
    SUBFIN VARCHAR(4),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    AGENCIA INTEGER,
    CEROS CHAR(1))
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(3),
    NOMGRUPO VARCHAR(60),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(60),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    TOTMON NUMERIC(18,2),
    GASTOS NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    NOMTIPO VARCHAR(50))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_COMPRAS_PROVEEDORI (
    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),
    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),
    TOTMON NUMERIC(18,2),
    GASTOS NUMERIC(18,2),
    ARANCEL NUMERIC(18,2),
    TOTGEN NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_COMPRAS_RIMAR (
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    LISTA INTEGER,
    MESES INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    BARRAS VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMAR VARCHAR(3),
    GRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    ULTCOSTOME NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    PROVEEDOR VARCHAR(60),
    SUGERIDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_COMPRAS_SISMED (
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    ITEM INTEGER,
    MES CHAR(2),
    CUM VARCHAR(18),
    PRMIN NUMERIC(18,2),
    PRMAX NUMERIC(18,2),
    COMPRAS NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    FACMIN VARCHAR(12),
    FACMAX VARCHAR(12))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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),
    RCREE NUMERIC(18,2),
    FORMAPAGO VARCHAR(30),
    FPBANCO VARCHAR(3),
    FPCUENTA VARCHAR(20),
    FPNUMERO VARCHAR(20),
    FPFECHA DATE,
    ANULADO CHAR(1),
    OBS VARCHAR(255),
    MONTOCAJA NUMERIC(18,2),
    MONTOCHEQ NUMERIC(18,2),
    CODCOBRADOR INTEGER,
    NOMCOBRADOR VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    RCREE NUMERIC(18,2),
    ANULADO CHAR(1),
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    MONTOG NUMERIC(18,2),
    CODCOBRADOR INTEGER,
    NOMCOBRADOR VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    NIT VARCHAR(20),
    BENEFICIARIO VARCHAR(60),
    COBR INTEGER,
    COMIP CHAR(1),
    NUMREL VARCHAR(10),
    MONTO NUMERIC(18,2),
    DESCUENTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    FECDOC DATE,
    ANULADO CHAR(1),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    RCREEDOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    CODCOBRADOR INTEGER,
    NOMCOBRADOR VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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(8),
    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),
    RCREEPORC NUMERIC(9,2),
    RCREEMONTO 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
  SUSPEND;
END^





CREATE PROCEDURE REP_COMPROBANTES_CMP (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER,
    MONEDA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NUMPROV VARCHAR(15),
    SIMPLIFICA CHAR(1),
    ORDEN VARCHAR(30),
    COTIZACI VARCHAR(30),
    REMISION VARCHAR(30),
    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),
    BASEIT 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),
    TRM NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_COMPROBANTES_CXPAGAR (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    NUMPROV VARCHAR(20),
    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(8),
    ABONO NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    INALCM NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    DTO1 NUMERIC(18,2),
    DTO2 NUMERIC(18,2),
    DTO3 NUMERIC(18,2),
    DTO4 NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    NETO NUMERIC(18,2),
    PROV_COD VARCHAR(15),
    ZONA_COD VARCHAR(60),
    NUMFAC VARCHAR(12),
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    BASE0 NUMERIC(18,2),
    BASE1 NUMERIC(18,2),
    BASE2 NUMERIC(18,2),
    BASE3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TRM NUMERIC(18,2),
    ANULADO CHAR(1),
    NOMTIPO VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_COMPROBANTES_FAC (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    AUTORIZA VARCHAR(20),
    PTVTID INTEGER,
    PTVTNOM VARCHAR(60),
    VENDCOD INTEGER,
    VENDNOM VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    PEDIDO VARCHAR(30),
    COTIZACI VARCHAR(30),
    REMISION VARCHAR(30),
    OBS VARCHAR(255),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    REFERENCIA VARCHAR(60),
    PRECIO NUMERIC(18,2),
    DTOPORCIT NUMERIC(9,2),
    DTOMONTOIT NUMERIC(18,2),
    IVAPORCIT NUMERIC(9,2),
    IVAMONTOIT NUMERIC(18,2),
    CONSUMOIT NUMERIC(18,2),
    SUBTOTALIT NUMERIC(18,2),
    DTOPOR NUMERIC(9,2),
    DTO1POR NUMERIC(9,2),
    DTO2POR NUMERIC(9,2),
    DTO3POR NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    DTO1MONTO NUMERIC(18,2),
    DTO2MONTO NUMERIC(18,2),
    DTO3MONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTFTEPOR NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPOR NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPOR NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPOR NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    DTOFFECHA DATE,
    TOTAL NUMERIC(18,2),
    ANULADO CHAR(1),
    VEHICULO VARCHAR(8),
    DESPACHO VARCHAR(255),
    FECREG DATE,
    HORAREG TIME,
    CONTADO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    CONSCLI VARCHAR(7))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_COMPROBANTES_INV (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    TURNO VARCHAR(60),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_COMPROBANTES_TRANS (
    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 (
    DOCUMENTO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VEHICULO VARCHAR(8),
    VNUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    CAJAID INTEGER,
    CAJANOM VARCHAR(60),
    RUTAID INTEGER,
    RUTANOM VARCHAR(60),
    VENDCOD INTEGER,
    VENDNOM VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CONCEPTO VARCHAR(60),
    FORMAP CHAR(1),
    ANULADO CHAR(1),
    MONTO NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    ITEM INTEGER,
    VALORIT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONCEP_XPAGAR (
    FEC DATE,
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    ANO CHAR(4))
RETURNS (
    CONO_IDORI INTEGER,
    CONO_PERIODO INTEGER,
    CONO_ANO CHAR(4),
    CONO_VALOR NUMERIC(18,2),
    CONO_ABONO NUMERIC(18,2),
    CONO_SALDO 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_APORTE CHAR(1),
    NOMPER VARCHAR(60),
    NOMEMPL VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONCEPTOS_NOMINA (
    ANOINI CHAR(4),
    ANOFIN CHAR(4),
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    DETALLE CHAR(1),
    CONCDESDE VARCHAR(20),
    CONCHASTA VARCHAR(20))
RETURNS (
    FECNOM DATE,
    CONCNOM VARCHAR(60),
    COD INTEGER,
    NIT VARCHAR(20),
    VALOR NUMERIC(18,2),
    ENTIDAD VARCHAR(20),
    DEDUC CHAR(1),
    PROV CHAR(1),
    APORTE CHAR(1),
    PAGOOK CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    APLICAPROM CHAR(1),
    SALARIO CHAR(1),
    GTOEMPR CHAR(1),
    CTAGASTO VARCHAR(20),
    CTAPAGAR VARCHAR(20),
    NOMCTAGASTO VARCHAR(60),
    NOMCTAPAGAR VARCHAR(60),
    NOMCORTO VARCHAR(60),
    NOMPER VARCHAR(60),
    NOMEMPL VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONDUCTORES (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOM VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    OBS VARCHAR(255),
    EMAIL VARCHAR(100),
    CEL VARCHAR(25),
    ESTADO CHAR(1),
    LICVEN DATE,
    LICENCIA VARCHAR(20),
    CATEGORIA VARCHAR(20),
    NOMCIUD VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONSECUTIVOS_BANCOS (
    TIPO INTEGER,
    CTAINI VARCHAR(3),
    CTAFIN VARCHAR(3),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONSECUTIVOS_CAJA (
    TIPO INTEGER,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONSECUTIVOS_CARTERA (
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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(8),
    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
  SUSPEND;
END^





CREATE PROCEDURE REP_CONSECUTIVOS_CMP (
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER,
    MONEDA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NUMPROV VARCHAR(15),
    SIMPLIFICA CHAR(1),
    ORDEN VARCHAR(30),
    COTIZACI VARCHAR(30),
    REMISION VARCHAR(30),
    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),
    BASEIT 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),
    TRM NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONSECUTIVOS_CXPAGAR (
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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(8),
    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),
    PROV_COD VARCHAR(15),
    ZONA_COD VARCHAR(60),
    ANULADO CHAR(1),
    NOMTIPO VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONSECUTIVOS_FAC (
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    AUTORIZA VARCHAR(20),
    PTVTID INTEGER,
    PTVTNOM VARCHAR(60),
    VENDCOD INTEGER,
    VENDNOM VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUCURSAL VARCHAR(10),
    PEDIDO VARCHAR(30),
    COTIZACI VARCHAR(30),
    REMISION VARCHAR(30),
    OBS VARCHAR(255),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    REFERENCIA VARCHAR(60),
    PRECIO NUMERIC(18,2),
    DTOPORCIT NUMERIC(9,2),
    DTOMONTOIT NUMERIC(18,2),
    IVAPORCIT NUMERIC(9,2),
    IVAMONTOIT NUMERIC(18,2),
    CONSUMOIT NUMERIC(18,2),
    SUBTOTALIT NUMERIC(18,2),
    DTOPOR NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTFTEPOR NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPOR NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPOR NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPOR NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    DTOFFECHA DATE,
    TOTAL NUMERIC(18,2),
    ANULADO CHAR(1),
    VEHICULO VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONSECUTIVOS_IMP (
    TIPO INTEGER,
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    DETALLE CHAR(1),
    SOLOCERR CHAR(1))
RETURNS (
    TIPODOC INTEGER,
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ESTADO CHAR(1),
    NIT VARCHAR(20),
    NOMPROV VARCHAR(60),
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTOFOB NUMERIC(18,2),
    COSTOFOBM NUMERIC(18,2),
    TRM NUMERIC(18,2),
    MONEDA VARCHAR(60),
    DTOITE NUMERIC(9,2),
    COSTOTOT NUMERIC(18,2),
    FLETE NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    IMPUESTOS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PRNETO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONSECUTIVOS_INV (
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TURNO VARCHAR(60),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONSECUTIVOS_TRANS (
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(4),
    NUMFIN VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    DOCUMENTO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VEHICULO VARCHAR(8),
    VNUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    CAJAID INTEGER,
    CAJANOM VARCHAR(60),
    RUTAID INTEGER,
    RUTANOM VARCHAR(60),
    VENDCOD INTEGER,
    VENDNOM VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CONCEPTO VARCHAR(60),
    FORMAP CHAR(1),
    ANULADO CHAR(1),
    MONTO NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    ITEM INTEGER,
    VALORIT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CONSIGNACIONES (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODCUENTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    CODBANCO VARCHAR(2),
    NOMBANCO VARCHAR(60),
    ITEM INTEGER,
    FORPAGO VARCHAR(30),
    DET_CODBCO VARCHAR(2),
    DET_CUENTA VARCHAR(20),
    DET_NUMERO VARCHAR(20),
    DET_FECHA DATE,
    DET_MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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 VARCHAR(20),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CRM_COMPROMISOS (
    TIPO INTEGER,
    ASESOR INTEGER,
    FECINI DATE,
    FECFIN DATE,
    CUMPLIDOS CHAR(1))
RETURNS (
    ID INTEGER,
    FECHA DATE,
    HORA TIME,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CONTACTO VARCHAR(60),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    NOMASESOR VARCHAR(60),
    CODASESOR INTEGER,
    OBSERVACION VARCHAR(255),
    USUARIO VARCHAR(8),
    CUMPLIDO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CRM_EVENTOS (
    TIPOC INTEGER,
    ASESOR INTEGER,
    MOTIVO INTEGER,
    RESPTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    INTERNOS CHAR(1))
RETURNS (
    ID INTEGER,
    FECHA DATE,
    HORA TIME,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CONTACTO VARCHAR(60),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    CODMOTIVO INTEGER,
    NOMMOTIVO VARCHAR(60),
    NOMASESOR VARCHAR(60),
    CODASESOR INTEGER,
    CODRESPTA INTEGER,
    NOMRESPTA VARCHAR(60),
    EXPLICA VARCHAR(255),
    SOLUCION VARCHAR(512))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_CRUCES_DOCUMENTO (
    TIPOORI INTEGER,
    TIPODES INTEGER,
    FECINI DATE,
    FECFIN DATE,
    ID INTEGER,
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    IDORI INTEGER,
    PREFORI VARCHAR(4),
    NUMORI VARCHAR(6),
    FECORI DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    ITEM INTEGER,
    IDDES INTEGER,
    PREFDES VARCHAR(4),
    NUMDES VARCHAR(6),
    FECDES DATE,
    ARTIC VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTORI NUMERIC(18,2),
    CANTDES NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(20),
    OBS VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    FECDTOF DATE,
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    NUMPROV VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_DECRETO1818 (
    FECINI DATE,
    FECFIN DATE,
    PREFI VARCHAR(4),
    TIPOPREF INTEGER)
RETURNS (
    TIPO INTEGER,
    PREF VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    FECHA DATE,
    VTATOTAL NUMERIC(18,2),
    VTADEC1818 NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_DETALLE_CERTIFICADO (
    FECINI CHAR(8),
    FECFIN CHAR(8),
    PROYINI VARCHAR(4),
    PROYFIN VARCHAR(4),
    CENTINI VARCHAR(4),
    CENTFIN VARCHAR(4),
    TIPO CHAR(1))
RETURNS (
    ITEM INTEGER,
    CUENTA VARCHAR(20),
    CATEGORIA VARCHAR(60),
    CODCUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    DV CHAR(1),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,2),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    IVA NUMERIC(18,2),
    RETEFTE NUMERIC(18,2),
    RETEIVA NUMERIC(18,2),
    RETEICA NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_DETERIORO_CARTERA (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    DIASC INTEGER,
    TASA NUMERIC(18,4),
    CEROS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    MAILCART VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    DIASCR INTEGER,
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    RESALTAR CHAR(1),
    INSTCART VARCHAR(255),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    DETERIORO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    TOTCLI NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CALIFICA VARCHAR(20),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_DIFCOSTOS_FACREM (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    IDORI INTEGER,
    PREFORI VARCHAR(4),
    NUMORI VARCHAR(6),
    FECORI DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    ITEM INTEGER,
    IDDES INTEGER,
    PREFDES VARCHAR(4),
    NUMDES VARCHAR(6),
    FECDES DATE,
    ARTIC VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTORI NUMERIC(18,2),
    CANTDES NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    COSTOFAC NUMERIC(18,2),
    COSTOREM NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    LOTE VARCHAR(15),
    LOTEV DATE,
    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,
    FECULTV DATE,
    DIASUV INTEGER,
    CLASE CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_DOCUMENTOS_CLIENTE (
    TIPO INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(10),
    GRPFIN VARCHAR(10),
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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(8),
    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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_DOCUMENTOS_PROVEEDOR (
    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(8),
    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(8),
    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),
    RTCREE NUMERIC(9,2),
    RTCREEM 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),
    ANULADO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_DOCUMENTOS_VEHICULO (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(8),
    PREFFIN VARCHAR(8),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    DOCUMENTO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VEHICULO VARCHAR(8),
    VNUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    CAJAID INTEGER,
    CAJANOM VARCHAR(60),
    RUTAID INTEGER,
    RUTANOM VARCHAR(60),
    VENDCOD INTEGER,
    VENDNOM VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CONCEPTO VARCHAR(60),
    FORMAP CHAR(1),
    ANULADO CHAR(1),
    MONTO NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    ITEM INTEGER,
    VALORIT NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





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(8),
    TURNO VARCHAR(60),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    BODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(60),
    PRODUCTO VARCHAR(20),
    DESPROD VARCHAR(60),
    CANT NUMERIC(18,4),
    COSTO 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),
    COSTOCOMP NUMERIC(18,4),
    PESOCOMP NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_ENTREGA_FACTURAS (
    TIPODOC INTEGER,
    FECINI DATE,
    FECFIN DATE,
    ENTRINI INTEGER,
    ENTRFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    IDDOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    NOMCLIENTE VARCHAR(60),
    ITEMS INTEGER,
    TOTAL NUMERIC(18,2),
    ENTRID INTEGER,
    ENTRNOM VARCHAR(60),
    FECREG DATE,
    HORAREG TIME,
    FECASI DATE,
    HORAASI TIME,
    FECLIS DATE,
    HORALIS TIME,
    FECENT DATE,
    HORAENT TIME,
    TIEMPOL TIME,
    TIEMPOE TIME,
    OBSERVACION BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_ESTADO_CUENTA_BANCO (
    FECINI DATE,
    FECFIN DATE,
    CTAINI VARCHAR(2),
    CTAFIN VARCHAR(2))
RETURNS (
    FECHA DATE,
    TIPO VARCHAR(30),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    CONCEPTO VARCHAR(60),
    NUMEROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    SUCURSAL VARCHAR(60),
    NOMBANCO VARCHAR(60),
    COD_CUENTA VARCHAR(3),
    CODIGO INTEGER,
    SALDOINICIAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_FACTURAS_MES (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    ANO VARCHAR(4),
    MES INTEGER,
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_FALTANTES_CLIENTES (
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(255),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    OBS VARCHAR(255),
    FECENTREGA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_FALTANTES_COMPRA (
    TIPOORI INTEGER,
    FECINI DATE,
    FECFIN DATE,
    TIPODES INTEGER,
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    NROPROV VARCHAR(15),
    VENCE DATE,
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    FALTANTE NUMERIC(18,4),
    NUMCRUCE VARCHAR(60),
    FECCRUCE DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_FALTANTES_PROVEEDOR (
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NROPROV VARCHAR(15),
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_FALTANTES_PROVEEDORI (
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(4),
    GRPFIN VARCHAR(4),
    SUBINI VARCHAR(3),
    SUBFIN VARCHAR(3),
    AGRUPA CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(3),
    NOMGRUPO VARCHAR(60),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(60),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_FALTANTES_VENDEDOR (
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    OBS VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_FALTANTES_VENTA (
    TIPOORI INTEGER,
    FECINI DATE,
    FECFIN DATE,
    CORTE DATE,
    TIPODES INTEGER,
    SOLOFALT CHAR(1),
    DETALLE CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    VENCE DATE,
    ENTREGA DATE,
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    CRUCE NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    TOTPRE NUMERIC(18,2),
    TOTCOS NUMERIC(18,2),
    DESCUENTO NUMERIC(9,4),
    FALTANTE NUMERIC(18,4),
    OBS VARCHAR(255),
    NUMCRUCE VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_HISTOEMPL (
    FECDESDE DATE,
    FECHASTA DATE,
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    PERIODICIDAD INTEGER)
RETURNS (
    NOMI_FECCAUSA DATE,
    CONC_NOMBRE VARCHAR(60),
    CONC_COD INTEGER,
    TERC_NIT VARCHAR(20),
    FECING DATE,
    NOCO_VALOR NUMERIC(18,2),
    NOCO_ENTIDAD VARCHAR(20),
    NOCO_DEDUC CHAR(1),
    NOCO_PROV CHAR(1),
    NOCO_APORTE CHAR(1),
    NOCO_PAGOOK CHAR(1),
    NOCO_PERIODO INTEGER,
    NOCO_ANO CHAR(4),
    NOCO_APLICAPROM CHAR(1),
    NOCO_SALARIO CHAR(1),
    NOCO_GTOEMPR CHAR(1),
    CONC_NOMCORTO VARCHAR(60),
    PNOM_NOMBRE VARCHAR(60),
    TERC_NOM VARCHAR(60),
    FECRET DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE 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 SUB_TYPE 0 SEGMENT SIZE 80)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_IMPORTACIONES (
    TIPO INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    SOLOCERR CHAR(1))
RETURNS (
    TIPODOC INTEGER,
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ESTADO CHAR(1),
    NIT VARCHAR(20),
    NOMPROV VARCHAR(60),
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTOFOB NUMERIC(18,2),
    COSTOFOBM NUMERIC(18,2),
    TRM NUMERIC(18,2),
    MONEDA VARCHAR(60),
    DTOITE NUMERIC(9,2),
    COSTOTOT NUMERIC(18,2),
    FLETE NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    IMPUESTOS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PRNETO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    NIIF CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    RESERVADO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_LISTA_PRECIOS (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LISTA INTEGER,
    LINI INTEGER,
    LFIN INTEGER,
    FECHA DATE,
    DEATRES CHAR(1),
    MASIVA CHAR(1),
    HOY CHAR(1),
    EXIST CHAR(1),
    CODBOD VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    REFERENCIA VARCHAR(20),
    UNIDAD VARCHAR(8),
    UNIDAD2 VARCHAR(8),
    FACTOR2 NUMERIC(18,4),
    UNIDAD3 VARCHAR(8),
    FACTOR3 NUMERIC(18,4),
    UNIDAD4 VARCHAR(8),
    FACTOR4 NUMERIC(18,4),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NOMLISTA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    PRECIO2 NUMERIC(18,2),
    PRECIO3 NUMERIC(18,2),
    PRECIOANT NUMERIC(18,2),
    FECANT DATE,
    VARIACION NUMERIC(18,2),
    VARTEXTO VARCHAR(5),
    MARGEN NUMERIC(9,2),
    IVA NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    CANTMIN NUMERIC(18,4),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    CANT NUMERIC(18,4),
    DTO1 NUMERIC(9,4),
    DTO2 NUMERIC(9,4),
    COMI NUMERIC(9,4),
    COMIC NUMERIC(9,4),
    FECPRE DATE,
    FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_METAS_VENTAS (
    DESDE VARCHAR(10),
    HASTA VARCHAR(10),
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    FECHA DATE,
    META NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_MOVIMIENTO_CLIENTE (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CONTADO CHAR(1),
    SUBEMPRESA INTEGER,
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    CALIFICA VARCHAR(20),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    TIPOREF INTEGER,
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    TDEBITO NUMERIC(18,2),
    TCREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    CUPO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    CALIFICA VARCHAR(20),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    TIPOREF INTEGER,
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    RCREE NUMERIC(18,2),
    CUPO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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),
    RCREE NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2),
    ARCREE NUMERIC(18,2),
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_MOVIMIENTO_X_ARTICULO (
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    SALDOINI NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    SALDOFIN NUMERIC(18,4),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    LOTE VARCHAR(15),
    LO_VENCE DATE,
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_MUNICIPIOS_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODCIU VARCHAR(5),
    NOMCIU VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_NOMINA_HORASEXTRA (
    ANOINI CHAR(4),
    ANOFIN CHAR(4),
    PERINI INTEGER,
    PERFIN INTEGER,
    EMPINI VARCHAR(20),
    EMPFIN VARCHAR(20))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DEPTO INTEGER,
    DEPTONOM VARCHAR(60),
    FECHA DATE,
    ANO CHAR(4),
    PERIODO INTEGER,
    SALBASE NUMERIC(18,2),
    HORASDIU INTEGER,
    MHORASDIU NUMERIC(18,2),
    HORASFDIU INTEGER,
    MHORASFDIU NUMERIC(18,2),
    HORASNOC INTEGER,
    MHORASNOC NUMERIC(18,2),
    HORASFNOC INTEGER,
    MHORASFNOC NUMERIC(18,2),
    HORASRNOC INTEGER,
    MHORASRNOC NUMERIC(18,2),
    HORASRFES INTEGER,
    MHORASRFES NUMERIC(18,2),
    HORASRFNOC INTEGER,
    MHORASRFNOC NUMERIC(18,2),
    HORASRDOM INTEGER,
    MHORASDOM NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_NOMINA_NOVEDADES (
    FECINI DATE,
    FECFIN DATE,
    EMPINI VARCHAR(20),
    EMPFIN VARCHAR(20))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DEPTO INTEGER,
    DEPTONOM VARCHAR(60),
    FECHA DATE,
    TIPONOV VARCHAR(60),
    VALOR NUMERIC(18,2),
    ANO CHAR(4),
    PERIODO INTEGER,
    DIA INTEGER,
    DURA INTEGER,
    PRORROGA CHAR(1),
    MOTIVO VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_PEDIDOS_ENTREGA (
    FECINI DATE,
    FECFIN DATE,
    TIPOENT INTEGER)
RETURNS (
    FECHA DATE,
    EMPRESA VARCHAR(20),
    ORIGEN VARCHAR(5),
    CIUDAD VARCHAR(5),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIRECCION VARCHAR(60),
    TELEFONO VARCHAR(40),
    CELULAR VARCHAR(40),
    UNIDADES INTEGER,
    VOLUMEN DOUBLE PRECISION,
    MONTO NUMERIC(18,2),
    ANEXOS VARCHAR(20),
    NUMERO VARCHAR(12),
    FORMAPAGO VARCHAR(20),
    CONTIENE VARCHAR(20),
    OBSERVACION VARCHAR(256))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_PLANILLA_INVENTARIO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ARTIINI VARCHAR(15),
    ARTIFIN VARCHAR(15),
    GRUPOINI VARCHAR(2),
    GRUPOFIN VARCHAR(2),
    SUBGINI VARCHAR(3),
    SUBGFIN VARCHAR(3),
    CEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(3),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    AJUSTE NUMERIC(18,2),
    ENSAMBLE NUMERIC(18,2),
    DESENSAMBLE NUMERIC(18,2),
    COMPRA NUMERIC(18,2),
    REMCOMP NUMERIC(18,2),
    DEVCOMP NUMERIC(18,2),
    VENTA NUMERIC(18,2),
    REMCLIE NUMERIC(18,2),
    DEVCLIE NUMERIC(18,2),
    NOTADB NUMERIC(18,2),
    NOTACR NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    BODECOD VARCHAR(2),
    COSTOP NUMERIC(18,2),
    VALOREXISTE NUMERIC(18,2),
    VNTMES NUMERIC(18,2),
    VNTANO NUMERIC(18,2),
    PROMANO NUMERIC(18,2),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_PRECIOS_RIMAR (
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    ORDEN CHAR(1),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    LISTA INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    REFERENCIA VARCHAR(20),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMAR VARCHAR(3),
    GRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    BAJO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_PRECIOS_SISMED (
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    ITEM INTEGER,
    MES CHAR(2),
    CANAL CHAR(3),
    CUM VARCHAR(18),
    COMERC CHAR(2),
    PRMIN NUMERIC(18,2),
    PRMAX NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    FACMIN VARCHAR(12),
    FACMAX VARCHAR(12))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_PRECIOS_TODOS (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LINI INTEGER,
    LFIN INTEGER,
    FECHA DATE,
    MASIVA 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),
    PRECIO1 NUMERIC(18,2),
    PRECIO2 NUMERIC(18,2),
    PRECIO3 NUMERIC(18,2),
    PRECIO4 NUMERIC(18,2),
    PRECIO5 NUMERIC(18,2),
    PRECIO6 NUMERIC(18,2),
    PRECIO7 NUMERIC(18,2),
    PRECIO8 NUMERIC(18,2),
    PRECIO9 NUMERIC(18,2),
    MARGEN1 NUMERIC(9,2),
    MARGEN2 NUMERIC(9,2),
    MARGEN3 NUMERIC(9,2),
    MARGEN4 NUMERIC(9,2),
    MARGEN5 NUMERIC(9,2),
    MARGEN6 NUMERIC(9,2),
    MARGEN7 NUMERIC(9,2),
    MARGEN8 NUMERIC(9,2),
    MARGEN9 NUMERIC(9,2),
    IVA NUMERIC(9,2),
    COSTOP NUMERIC(18,2),
    UCOSTO NUMERIC(18,2),
    MENOR VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_PRESTAMOS_NOMINA (
    EMPINI VARCHAR(20),
    EMPFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ORDEN CHAR(1))
RETURNS (
    EMPNIT VARCHAR(20),
    EMPNOM VARCHAR(60),
    FECPRE DATE,
    ANO CHAR(4),
    PERIODO INTEGER,
    CONCEPTO VARCHAR(60),
    MONTOPRE NUMERIC(18,2),
    INTPRE NUMERIC(9,2),
    CUOTAS INTEGER,
    MONTOCUO NUMERIC(18,2),
    PAGADO CHAR(1),
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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
BEGIN
  SUSPEND;
END^





CREATE 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),
    PRECIO NUMERIC(18,2),
    IVAP NUMERIC(9,2),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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),
    EMAIL VARCHAR(100))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_REVALID_CLIENTES (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NOMCLI VARCHAR(60),
    NOMCLISUCU VARCHAR(60),
    CLIDV CHAR(1),
    NITCLIE VARCHAR(20),
    DIR VARCHAR(60),
    TEL1 VARCHAR(40),
    TEL2 VARCHAR(40),
    ZONANOM VARCHAR(60),
    CONTACTO VARCHAR(60),
    MUNICIPIO VARCHAR(60),
    DEPTO VARCHAR(60),
    CODVEND INTEGER,
    CODCLISUCU VARCHAR(10),
    SEMANA VARCHAR(20),
    DIAVISITA VARCHAR(60),
    SUBSEGMENTO VARCHAR(60),
    FRECUENCIA VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_REVALID_PRODUCTOS (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CODMARCA VARCHAR(3))
RETURNS (
    CODART VARCHAR(15),
    DESCART VARCHAR(60),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    NOMGRUPO VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_REVALID_VENTAS (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO CHAR(1),
    NUMDOC VARCHAR(12),
    FECDOC DATE,
    CODCLI VARCHAR(20),
    NOMCLI VARCHAR(60),
    VENDNOM VARCHAR(60),
    VENDCOD INTEGER,
    CLIFACTNOM VARCHAR(60),
    CODART VARCHAR(15),
    DESCART VARCHAR(60),
    CANT NUMERIC(18,4),
    TOTITEM NUMERIC(18,2),
    VOLUMEN NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_RUTAS_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODCLI VARCHAR(20),
    CODVEND VARCHAR(20),
    FRECUENCIA VARCHAR(40),
    MES VARCHAR(2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_RUTEROS (
    FECINI DATE,
    FECFIN DATE,
    VEHINI VARCHAR(8),
    VEHFIN VARCHAR(8),
    PROINI VARCHAR(20),
    PROFIN VARCHAR(20),
    DETALLE CHAR(1),
    RUTAINI INTEGER,
    RUTAFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    ID INTEGER,
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    RUTA INTEGER,
    NOMRUTA VARCHAR(60),
    VEHICULO VARCHAR(8),
    CONDUCTOR VARCHAR(20),
    NOMCOND VARCHAR(60),
    PROPIETARIO VARCHAR(20),
    NOMPROP VARCHAR(60),
    FACTURAS INTEGER,
    DOCUMENTO VARCHAR(8),
    FACTURA VARCHAR(12),
    FECDOC DATE,
    CLIENTE VARCHAR(20),
    NOMCLI VARCHAR(60),
    CODVEN INTEGER,
    URGENTE CHAR(1),
    KILOS NUMERIC(18,2),
    ITEMS INTEGER,
    VALOR NUMERIC(18,2),
    SUCURSAL VARCHAR(10),
    BASE NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_SIN_FACTURAS_MES (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    ANO VARCHAR(4),
    MES INTEGER,
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_SKU_BIT (
    FECINI DATE,
    FECFIN DATE,
    CODSUBG VARCHAR(3),
    SUBEMPRESA INTEGER)
RETURNS (
    CODART VARCHAR(15),
    NOMART VARCHAR(60),
    TIPOREF VARCHAR(2),
    UNIDAD VARCHAR(8),
    CODBARRAS VARCHAR(15),
    NOMFAMI VARCHAR(60),
    SALDO NUMERIC(18,4),
    FECHA VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_SUGERIDO_PROVEEDOR (
    FECHA DATE,
    PRVINI VARCHAR(20),
    PRVFIN VARCHAR(20),
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CODART VARCHAR(20),
    DESART VARCHAR(60),
    CODGRP VARCHAR(3),
    CODSUBG VARCHAR(3),
    CODMAR VARCHAR(3),
    PROMEDIO NUMERIC(18,4),
    MINIMO NUMERIC(18,2),
    EXIST NUMERIC(18,4),
    SUGERIDO NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2),
    PEDIDO NUMERIC(18,4),
    ORDINV NUMERIC(18,4),
    ORDCMP NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    NOMGRUPO VARCHAR(60),
    NOMSUBG VARCHAR(60),
    NOMMARC VARCHAR(30))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_TERCEROS (
    TIPO INTEGER,
    ORDEN CHAR(1),
    DESDE VARCHAR(60),
    HASTA VARCHAR(60),
    VENDINI INTEGER,
    VENDFIN INTEGER,
    GRPINI CHAR(2),
    GRPFIN CHAR(2))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(40),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CTARTFTE VARCHAR(20),
    CTARTIVA VARCHAR(20),
    CTARTICA VARCHAR(20),
    CTAVENTA VARCHAR(20),
    CTACLIENTE VARCHAR(20),
    CTAPROV VARCHAR(20),
    CTAEMPL VARCHAR(20),
    CODIGO VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMCOBR VARCHAR(60),
    RTFTEBASE NUMERIC(18,2),
    CUPO NUMERIC(18,2),
    RTFTEPOR NUMERIC(9,2),
    RTIVAPOR NUMERIC(9,2),
    RTICAPOR NUMERIC(9,2),
    NOMGRUPO VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_TIPONEGOCIO_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODTIPONEG INTEGER,
    NOMTIPONEG VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_UTILIDAD_CLIENTE (
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    ULTIMO CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    CONTACTO VARCHAR(255),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    DTO NUMERIC(9,2),
    VENDCOD INTEGER,
    VENDNOMBRE VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE 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),
    ULTIMO 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(8),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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 DOUBLE PRECISION,
    COSTO DOUBLE PRECISION,
    UTILIDAD DOUBLE PRECISION,
    PORC NUMERIC(9,2),
    IVA DOUBLE PRECISION,
    IVAPOR NUMERIC(9,2),
    CONSUMO DOUBLE PRECISION,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    TIPODOC INTEGER,
    PART FLOAT)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_UTILIDAD_VENTAS_SUBG (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    ULTIMO CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    IVAPOR NUMERIC(9,2),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    TIPODOC INTEGER,
    PART FLOAT)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VACACIONES_NOMINA (
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECHA DATE)
RETURNS (
    TERC_NIT VARCHAR(20),
    TERC_NOM VARCHAR(60),
    EMPL_FECING DATE,
    PRVA_FECHA DATE,
    EMPL_DIASACUM INTEGER,
    EMPL_DIASDES INTEGER,
    EMPL_DIASDIS INTEGER,
    EMPL_ULTVAC DATE,
    SALARIO NUMERIC(18,2),
    VACACION NUMERIC(18,2),
    EMPL_DPTO INTEGER,
    DPTO_NOMBRE VARCHAR(60),
    EMPL_SECC INTEGER,
    SECC_NOM VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VEHICULOS (
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    PLACA VARCHAR(8),
    NUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    CAPACIDAD INTEGER,
    LINEA VARCHAR(60),
    MARCA VARCHAR(60),
    COLOR VARCHAR(60),
    SERIE VARCHAR(20),
    MODELO VARCHAR(4),
    REPOT VARCHAR(4),
    CARROC VARCHAR(60),
    REGISTRONC VARCHAR(20),
    SOAT DATE,
    CONTRA DATE,
    EXTRA DATE,
    NITASOC VARCHAR(20),
    NOMASOC VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    ACTIVO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VEHICULOS_ASOCIADO (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    NITASOC VARCHAR(20),
    NOMASOC VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    PLACA VARCHAR(8),
    NUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    CAPACIDAD INTEGER,
    LINEA VARCHAR(60),
    MARCA VARCHAR(60),
    COLOR VARCHAR(60),
    SERIE VARCHAR(20),
    MODELO VARCHAR(4),
    REPOT VARCHAR(4),
    CARROC VARCHAR(60),
    REGISTRONC VARCHAR(20),
    SOAT DATE,
    CONTRA DATE,
    EXTRA DATE,
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    ACTIVO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VEHICULOS_VENCE (
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    ORDEN CHAR(1),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PLACA VARCHAR(8),
    NUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    CAPACIDAD INTEGER,
    LINEA VARCHAR(60),
    MARCA VARCHAR(60),
    COLOR VARCHAR(60),
    SERIE VARCHAR(20),
    MODELO VARCHAR(4),
    REPOT VARCHAR(4),
    CARROC VARCHAR(60),
    REGISTRONC VARCHAR(20),
    SOAT DATE,
    CONTRA DATE,
    EXTRA DATE,
    NITASOC VARCHAR(20),
    NOMASOC VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    ACTIVO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VENCIMIENTOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PLACA VARCHAR(8),
    NUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    CAPACIDAD INTEGER,
    LINEA VARCHAR(60),
    MARCA VARCHAR(60),
    COLOR VARCHAR(60),
    SERIE VARCHAR(20),
    MODELO VARCHAR(4),
    SOAT DATE,
    CONTRA DATE,
    EXTRA DATE,
    FECHA DATE,
    NITASOC VARCHAR(20),
    NOMASOC VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE REP_VENDEDORES_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NITVEND VARCHAR(20),
    UBICAVEND VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE 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),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    INVIMA VARCHAR(20),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    TIVA INTEGER,
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    REFEREN VARCHAR(60),
    DTO NUMERIC(9,2),
    TRANSP VARCHAR(60),
    ALTERNATIVAS NUMERIC(18,4),
    NOMTIPO VARCHAR(50),
    DESPACHO VARCHAR(255),
    OBS VARCHAR(255),
    HORA INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VENTAS_ARTICULO_ANO (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    FECHA DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    NOMGRP VARCHAR(60),
    NOMSUBG VARCHAR(60),
    NOMMARCA 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VENTAS_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    SUBG VARCHAR(3))
RETURNS (
    NITCLI VARCHAR(20),
    CODVEND INTEGER,
    FECDOC VARCHAR(8),
    NUMDOC VARCHAR(8),
    TOTALDOC NUMERIC(18,2),
    TOTALCASA NUMERIC(18,2),
    TOTALCONTROL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VENTAS_CANAL (
    TIPO INTEGER,
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODCAN INTEGER,
    NOMCAN VARCHAR(60),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NUMORI VARCHAR(60),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    ID INTEGER,
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VENTAS_CLIENTE (
    TIPO INTEGER,
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DV CHAR(1),
    CONTACTO VARCHAR(255),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    SUCURSAL VARCHAR(10),
    DESPACHO VARCHAR(255),
    OBS VARCHAR(255),
    ID INTEGER,
    ABONOS NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2),
    ULTVENTA DATE,
    APELLIDO1 VARCHAR(60),
    APELLIDO2 VARCHAR(60),
    NOMBRE1 VARCHAR(60),
    NOMBRE2 VARCHAR(60),
    CODCIU VARCHAR(5),
    TRANSPORTA VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VENTAS_EVENTO (
    EVENTO INTEGER,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1))
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    TIVA INTEGER,
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    REFEREN VARCHAR(60),
    DTO NUMERIC(9,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    CIUDAD VARCHAR(40),
    DESPACHO VARCHAR(255),
    OBS VARCHAR(255),
    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
  SUSPEND;
END^





CREATE PROCEDURE REP_VENTAS_VENDEDOR_GRUPO (
    FECINI DATE,
    FECFIN DATE,
    TIPODOC INTEGER)
RETURNS (
    CODVEN INTEGER,
    NOMVEN VARCHAR(60),
    VENTAS NUMERIC(18,2),
    DEVOL NUMERIC(18,2),
    NETO NUMERIC(18,2),
    LISTA VARCHAR(60),
    GRUPO VARCHAR(60),
    GRUPO2 VARCHAR(60),
    GRUPO3 VARCHAR(60),
    GRUPO4 VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VENTAS_VENDEDOR_RIMAR (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO INTEGER,
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    RECAUDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REP_VENTASDET_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    SUBG VARCHAR(3))
RETURNS (
    CODARTI VARCHAR(15),
    NITCLI VARCHAR(20),
    CODVEND INTEGER,
    FECDOC VARCHAR(8),
    NUMDOC VARCHAR(8),
    CANT NUMERIC(18,4),
    TOTITEM NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO VARCHAR(1),
    COSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REPARTE_SALIDA (
    PREFS VARCHAR(4),
    NUMERO VARCHAR(8),
    PREFE VARCHAR(4),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    IDENS INTEGER,
    NUMENS VARCHAR(12),
    FECENS DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REPORTE_IMPORTACIONES (
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ANULADOS CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    REFERENCIA VARCHAR(60),
    CONCEPTO VARCHAR(60),
    MONEDA INTEGER,
    NOMMONEDA VARCHAR(30),
    FECLLEGA DATE,
    PROY VARCHAR(4),
    CENT VARCHAR(4),
    CTAIMP VARCHAR(20),
    ORDENES INTEGER,
    ORDENADO NUMERIC(18,2),
    FACTURAS INTEGER,
    FACTURADO NUMERIC(18,2),
    GASTOS INTEGER,
    GASTADO NUMERIC(18,2),
    TOTALIMP NUMERIC(18,2),
    CERRADA CHAR(1),
    ANULADO CHAR(1),
    ITEM INTEGER,
    CODART VARCHAR(20),
    DESCART VARCHAR(60),
    DESCORTA VARCHAR(30),
    OBSART BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    PRUMON NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TRMFAC NUMERIC(18,2),
    FLETES NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    IMPUESTOS NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    TOTALITE NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RESERVAS_ARTICULO (
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    RESERVA NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RESERVAS_ARTICULO_FECHA (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECRES DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VENCE DATE,
    CLIENTE VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RESTE_EXISTENCIA (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    FECHA DATE,
    CANTIDAD NUMERIC(18,4),
    ANULAR CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE RESTE_SALDO_BANCO (
    CUENTA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE RESTE_SALDO_BANCO_CONF (
    CUENTA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE RESTE_SALDO_CAJA (
    CAJA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE RESTE_SALDO_EFECTIVO (
    CAJA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE RESULTADO_ANUAL (
    ANO CHAR(4),
    NIIF CHAR(1))
RETURNS (
    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),
    SAENE NUMERIC(18,2),
    SAFEB NUMERIC(18,2),
    SAMAR NUMERIC(18,2),
    SAABR NUMERIC(18,2),
    SAMAY NUMERIC(18,2),
    SAJUN NUMERIC(18,2),
    SAJUL NUMERIC(18,2),
    SAAGO NUMERIC(18,2),
    SASEP NUMERIC(18,2),
    SAOCT NUMERIC(18,2),
    SANOV NUMERIC(18,2),
    SADIC NUMERIC(18,2),
    SACIE NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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),
    CAJA_ID INTEGER,
    SALDOFIN_EFEC NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RESUMEN_GERENCIAL_RIMAR (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    VENTAS NUMERIC(18,2),
    COSTOS NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    BANCOS NUMERIC(18,2),
    INVENTARIO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RESUMEN_PUNTOS_TX (
    FECHA DATE)
RETURNS (
    CLIENTE VARCHAR(20),
    PTACUM NUMERIC(18,2),
    PTVENCER NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RESUMEN_PUNTOS_TX1 (
    FECHA DATE)
RETURNS (
    CLIENTE VARCHAR(20),
    PTACUM NUMERIC(18,2),
    PTVENCER NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RESUMEN_SALDOS_BANCO (
    FECINI DATE,
    FECFIN DATE,
    INACTIVOS CHAR(1))
RETURNS (
    CUBA_COD INTEGER,
    CUBA_NUMERO VARCHAR(20),
    BANC_NOMBRE VARCHAR(60),
    CUBA_TITULAR VARCHAR(60),
    SALDO_INICIAL NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    CHEQUES NUMERIC(18,2),
    DEVCHEQ NUMERIC(18,2),
    RETIROS NUMERIC(18,2),
    NOTASDB NUMERIC(18,2),
    NOTASCR NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    SALDO_CONF NUMERIC(18,2),
    SALDO_FINAL NUMERIC(18,2),
    SALDO_ULTIMO NUMERIC(18,2),
    CHEQUESSC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CUBA_CODCTA VARCHAR(3))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE RESUMEN_VENTAS_ARTICULO (
    FECHA DATE,
    PUNTO INTEGER)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANT NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RESUMEN_VENTAS_DIA (
    FECHA DATE,
    PUNTO INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE RETIROS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE REVERSA_TRASLADO (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(20),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    LOTE VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RUTERO_CONSOLIDADO_ARTICULO (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    CODGRP VARCHAR(3),
    CODSUBG VARCHAR(3),
    CODMARC VARCHAR(3),
    NOMGRP VARCHAR(60),
    NOMSUBG VARCHAR(60),
    NOMMARC VARCHAR(60),
    BODEGA VARCHAR(2),
    STAND VARCHAR(20),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE RUTERO_FACTURA (
    TIPO INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
RETURNS (
    ID INTEGER,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4),
    VENDEDOR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALARIO_BASE_EMPLEADO (
    NITE VARCHAR(20),
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    PERIODO INTEGER,
    FECHA DATE,
    MENSUAL CHAR(1),
    CONC_COD INTEGER)
RETURNS (
    SALARIO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALARIO_PROMEDIO (
    NITEMP VARCHAR(20),
    FECHA DATE,
    COP CHAR(1))
RETURNS (
    SALARIO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALARIO_PROMEDIO_DETALLE (
    NITEMP VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1))
RETURNS (
    CONC INTEGER,
    NOMCONC VARCHAR(60),
    MONTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALARIO_PROMEDIO_SIN_AUX (
    NITEMP VARCHAR(20),
    FECHA DATE,
    MESES INTEGER,
    VACAC CHAR(1))
RETURNS (
    SALARIO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALARIO_PROMEDIO_VACACIONES (
    NITEMP VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    LIQUIDA CHAR(1))
RETURNS (
    SALARIO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_ACTIVO (
    CUENTA VARCHAR(20),
    ACTIVO VARCHAR(15),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_ACTIVO_MES (
    CUENTA VARCHAR(20),
    ACTIVO VARCHAR(15),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_ACTIVO_NIIF (
    CUENTA VARCHAR(20),
    ACTIVO VARCHAR(15),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_ARTICULO (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_ARTICULO_MES (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_ARTICULO_NIIF (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CENTRO (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CENTRO_MES (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CENTRO_MES_NIIF (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CENTRO_NIIF (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CENTRO_TERCERO (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    NIT VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CENTRO_TERCERO_NIIF (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    NIT VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CLIENTE (
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CLIENTE_FAC (
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CLIENTE_SUCURSAL (
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CUENTA (
    CUENTA VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CUENTA_BANCO (
    CUENTA INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CUENTA_BANCO_CONF (
    CUENTA INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CUENTA_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CUENTA_NIIF (
    CUENTA VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_CUENTAF (
    CUENTA VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_DOC_CARTERA (
    TIPO INTEGER,
    ID INTEGER,
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_DOC_CXPAGAR (
    TIPO INTEGER,
    ID INTEGER,
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_EN_CAJA (
    CAJA INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_EN_EFECTIVO (
    CAJA INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_FINAL_CAJA (
    CAJA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_FINAL_CUENTA_BANCO (
    CUENTA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_FORMA_PAGO (
    CAJA INTEGER,
    FORMAP INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_INICIAL_INVENTARIO (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA CHAR(2))
RETURNS (
    SALDO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_INICIAL_PROVEEDOR (
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_INICIAL_TOTAL_INV (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_INVENTARIO (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_LOTE (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    LOTE VARCHAR(15))
RETURNS (
    SALDO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_LOTE_FECHA (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    LOTE VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_LOTES_FECHA (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    FECHA DATE)
RETURNS (
    LOTE VARCHAR(15),
    SALDO NUMERIC(18,4),
    VENCE DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_PRESTAMO (
    ID INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_PROVEEDOR (
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_TERCERO (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_TERCERO_FECHA (
    ARTICULO VARCHAR(15),
    NIT VARCHAR(20),
    CODSUC VARCHAR(10),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_TERCERO_MES (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_TERCERO_MES_NIIF (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_TERCERO_NIIF (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_TERCEROS_FECHA (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    CODSUC VARCHAR(10),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    REMISIONES NUMERIC(18,4),
    DEVOLUCIONES NUMERIC(18,4),
    SALDO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_TOTAL_BANCOS (
    FECHA DATE)
RETURNS (
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDO_TOTAL_INVENTARIO (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDOS_ARTICULO_CUENTA (
    ARTICULO VARCHAR(15),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    SALDOINI NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    SALDOFIN NUMERIC(18,2),
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALDOS_FACTURA (
    ID INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALIDAS_ANO_ANTERIOR (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    SALIDAS NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALIDAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SALIDAS_SIN_CONTABILIDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SELECCIONE_LOTE (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4))
RETURNS (
    LOTE VARCHAR(15))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SERIALES_ITEM_DOCUMENTO (
    TIPO INTEGER,
    IDDOC INTEGER,
    ITEM INTEGER)
RETURNS (
    SERIALES VARCHAR(4096))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SUGERIDO_BODEGA (
    FECHA DATE,
    CODBOD VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    MINIMO NUMERIC(18,4),
    FALTANTE NUMERIC(18,4),
    ULTCOSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SUGERIDO_PROVEEDOR (
    FECHA DATE,
    PROVE VARCHAR(20),
    PORCREP NUMERIC(18,2))
RETURNS (
    CODART VARCHAR(20),
    DESART VARCHAR(60),
    CODGRP VARCHAR(3),
    CODSUBG VARCHAR(3),
    CODMAR VARCHAR(3),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(60),
    PROMEDIO NUMERIC(18,4),
    VENTANT NUMERIC(18,4),
    MINIMO NUMERIC(18,2),
    EXIST NUMERIC(18,4),
    OPTIMO NUMERIC(18,4),
    CANT NUMERIC(18,4),
    PORCR NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2),
    PEDIDO NUMERIC(18,4),
    ORDINV NUMERIC(18,4),
    ORDCMP NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    NOMGRUPO VARCHAR(60),
    NOMSUBG VARCHAR(60),
    NOMMARC VARCHAR(30),
    NOMPROV VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SUGIERE_METAS_VENTAS (
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE,
    BASE CHAR(1),
    CRECE NUMERIC(18,4))
RETURNS (
    FECHA DATE,
    VENTAS NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SUGIERE_PRECIO (
    ARTICULO VARCHAR(20),
    CODLISTA INTEGER,
    FECHA DATE,
    PORC NUMERIC(9,4),
    UOM CHAR(1))
RETURNS (
    PRECIO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SUMA_APERTURA_NIIF (
    FECINI DATE,
    FECFIN DATE,
    NULO CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    SALDO2649 NUMERIC(18,2),
    DBNIIF NUMERIC(18,2),
    CRNIIF NUMERIC(18,2),
    SALDONIIF NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE SUMA_DESCUENTOS_FINANCIEROS (
    IDF INTEGER)
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE SUME_EXISTENCIA (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    FECHA DATE,
    CANTIDAD NUMERIC(18,4),
    ANULAR CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE SUME_SALDO_BANCO (
    CUENTA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE SUME_SALDO_BANCO_CONF (
    CUENTA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE SUME_SALDO_CAJA (
    CAJA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE SUME_SALDO_CUENTA
AS
BEGIN
  EXIT;
END^





CREATE PROCEDURE SUME_SALDO_EFECTIVO (
    CAJA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
BEGIN
  EXIT;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TERCEROS_CREADOS (
    FECINI DATE,
    FECFIN DATE,
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    NULO CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FECHA DATE,
    CTAPROV VARCHAR(20),
    CTACLIE VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TOTAL_DOC_COMPRA (
    TIPODOC INTEGER,
    ID INTEGER)
RETURNS (
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TOTAL_DOC_IMPORT (
    TIPODOC INTEGER,
    ID INTEGER)
RETURNS (
    SUBTOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TOTAL_DOC_VENTAS (
    TIPODOC INTEGER,
    ID INTEGER)
RETURNS (
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TOTAL_FACTURA_WEB (
    ID INTEGER)
RETURNS (
    ITEMS INTEGER,
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TOTAL_PAGOS_TERCERO_ANO (
    NIT VARCHAR(20),
    INI CHAR(8),
    FIN CHAR(8),
    NAT CHAR(1))
RETURNS (
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TOTAL_PEDIDO_WEB (
    ID INTEGER)
RETURNS (
    ITEMS INTEGER,
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_ARTICULO_MOVIL (
    CODIGO VARCHAR(20),
    VEND INTEGER,
    CLIENTE VARCHAR(20),
    SUCUCLI VARCHAR(10),
    IDPEDWEB INTEGER)
RETURNS (
    DES VARCHAR(60),
    DESCORTA VARCHAR(30),
    GRUPO VARCHAR(30),
    SUBGR VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ALTERNATIVA VARCHAR(30),
    IVA NUMERIC(9,2),
    CONSUMO NUMERIC(18,2),
    EXISTEN NUMERIC(18,2),
    LISTA INTEGER,
    PRECIO NUMERIC(18,2),
    OBS VARCHAR(1024),
    NOMLISTA VARCHAR(30),
    OK INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_ARTICULOS_MOVIL_OFFLINE
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    DESCORTA VARCHAR(30),
    GRUPO VARCHAR(60),
    SUBGR VARCHAR(60),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ALTERNATIVA VARCHAR(30),
    IVA NUMERIC(9,2),
    CONSUMO NUMERIC(18,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_CIUDADES_MOVIL
RETURNS (
    CIUD_COD VARCHAR(5),
    CIUD_NOM VARCHAR(60),
    PREDET CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_CLIENTE_MOVIL (
    NIT VARCHAR(20))
RETURNS (
    TERC_NOM VARCHAR(124),
    SALDO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_CLIENTE_WEB (
    NIT VARCHAR(20))
RETURNS (
    TERC_NOM VARCHAR(60),
    TERC_DV CHAR(1),
    TERC_DIR VARCHAR(60),
    TERC_CIU VARCHAR(40),
    TERC_TEL VARCHAR(25),
    TERC_CEL VARCHAR(25),
    TERC_EMAIL VARCHAR(100),
    TERC_CONTACTO VARCHAR(255),
    TERC_INSTRUCCIONES VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_CLIENTES_MOVIL (
    BUSCAR VARCHAR(60),
    VEND INTEGER)
RETURNS (
    TERC_NIT VARCHAR(20),
    TERC_NOM VARCHAR(60),
    TERC_CONTACTO VARCHAR(60),
    TERC_DIR VARCHAR(100),
    TERC_DV CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_CLIENTES_MOVIL_OFFLINE (
    VEND INTEGER)
RETURNS (
    TERC_NIT VARCHAR(20),
    TERC_NOM VARCHAR(60),
    TERC_CONTACTO VARCHAR(60),
    TERC_DIR VARCHAR(100),
    TERC_CEL VARCHAR(25),
    LIPR_COD INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_FACTURA (
    ID INTEGER)
RETURNS (
    ITEMS INTEGER,
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    FECHA DATE,
    ENTREGA DATE,
    OBS VARCHAR(1024),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_PEDIDO (
    ID INTEGER)
RETURNS (
    ITEMS INTEGER,
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    FECHA DATE,
    ENTREGA DATE,
    OBS VARCHAR(1024),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_PEDIDOS_VEND (
    VEND INTEGER,
    FECHA DATE)
RETURNS (
    NUMDOC VARCHAR(12),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_RECAUDO_RUTA (
    RUTA INTEGER,
    FECHA DATE)
RETURNS (
    CONTRATO INTEGER,
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_RUTERO_DET (
    IDRUT INTEGER,
    ITEMRUT INTEGER)
RETURNS (
    RUTD_PREF VARCHAR(4),
    RUTD_NUMERO VARCHAR(8),
    RUTD_NIT VARCHAR(20),
    RUTD_CAJAS NUMERIC(18,4),
    TERC_DIR VARCHAR(60),
    TERC_TEL VARCHAR(40),
    TERC_CIU VARCHAR(40),
    RUTD_NOMCLI VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_RUTEROS_CONDUCTOR (
    CONDUCT VARCHAR(20))
RETURNS (
    RUTID INTEGER,
    PREFRUT VARCHAR(4),
    NUMRUT VARCHAR(8),
    FECRUT DATE,
    ITEMDOCRUT INTEGER,
    IDDOC INTEGER,
    NITDOCRUT VARCHAR(20),
    NOMCLIDOCRUT VARCHAR(60),
    DIRCLI VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_SUCURSALES (
    NIT VARCHAR(20))
RETURNS (
    NOMBRE VARCHAR(125),
    CLCU_COD VARCHAR(10),
    LIPR_COD INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRAE_UN_RECAUDO (
    IDCONTRATO INTEGER,
    FECHA DATE)
RETURNS (
    VALOR NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRASCUENTAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRASFERENCIAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRASLACAJAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE TRASLADOS_SIN_CONTABILDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ULTIMA_DEPRECIACION_UNIDADES (
    FECHA CHAR(8))
RETURNS (
    ACTIVO VARCHAR(20),
    FECULT CHAR(8),
    UNIREST INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ULTIMO_COMPROMISO (
    NIT VARCHAR(20))
RETURNS (
    TEXTO VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ULTIMO_COSTO (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    UCOSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ULTIMO_COSTO_NIIF (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    UCOSTO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE ULTIMO_EVENTO (
    NIT VARCHAR(20))
RETURNS (
    TEXTO VARCHAR(255))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE UNIDADES (
    ID VARCHAR(15))
RETURNS (
    UNIDAD VARCHAR(8),
    FACCAN NUMERIC(18,4),
    FACPRE NUMERIC(18,4))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE UNIDADES_OFFLINE
RETURNS (
    ARTI_COD VARCHAR(15),
    UNAR_UNIDAD VARCHAR(8),
    UNAR_FACCAN NUMERIC(18,6),
    UNAR_FACPRE NUMERIC(18,6))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE USUARIOS_MENSAJE
RETURNS (
    USUARIO VARCHAR(10),
    CONECTADO CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE 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(8),
    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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDA_CUENTAS_ARTICULO
RETURNS (
    ART VARCHAR(20),
    CTA VARCHAR(20),
    TIPO VARCHAR(20))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_ARTICULO (
    CODIGO VARCHAR(15))
RETURNS (
    TIPO CHAR(1),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    ID VARCHAR(15),
    LOTE CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_BONO (
    FEC DATE,
    MONTO NUMERIC(18,2))
RETURNS (
    BANCO CHAR(2),
    CUENTA VARCHAR(10),
    NUMERO VARCHAR(8),
    FECHA DATE)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_CUENTA (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_CUENTA_C (
    CUENTA VARCHAR(20))
RETURNS (
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_CUENTA_NIIF (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_CUENTA_NIIF_C (
    CUENTA VARCHAR(20))
RETURNS (
    ERROR INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_DESCUENTO (
    ARTICULO VARCHAR(20),
    NIT VARCHAR(20),
    TOTAL NUMERIC(18,2),
    CANT NUMERIC(18,4))
RETURNS (
    ID INTEGER,
    OK CHAR(1),
    DTOP NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_ESTRUCTURA (
    CUENTA VARCHAR(20))
RETURNS (
    NIVEL SMALLINT)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_EXISTENCIA (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    CANTIDAD NUMERIC(18,2),
    FECHA DATE)
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_NIVEL (
    CUENTA VARCHAR(20))
RETURNS (
    NIVEL SMALLINT)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_PADRE (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_PADRE_NIIF (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALIDE_RECAUDO
RETURNS (
    CONTRATO VARCHAR(20),
    FECHA DATE,
    MONTO NUMERIC(18,2),
    RAZON VARCHAR(60))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALOR_INICIAL_INVENTARIO (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    INICIAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALOR_INICIAL_INVENTARIO_N (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    INICIAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VALOR_INVENTARIO (
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VARIACION_COSTOS (
    ARTICULO VARCHAR(15),
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    FECHA DATE,
    COSTO NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    NUMERODOC VARCHAR(10),
    TIPO INTEGER,
    ID INTEGER)
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VENCIDO_CLIENTE (
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    BLOQ CHAR(1))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VENTAS_ANUALES_ARTICULO (
    ARTICULO VARCHAR(20),
    FECHA DATE)
RETURNS (
    PERIODO VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VENTAS_ANUALES_CLIENTE (
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    PERIODO VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VENTAS_ANUALES_VENDEDOR (
    VEND INTEGER,
    FECHA DATE)
RETURNS (
    PERIODO VARCHAR(8),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VENTAS_ARTICULO (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    BODEGA VARCHAR(2))
RETURNS (
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VENTAS_ARTICULO_ANO1 (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    FECHA DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(20),
    MES INTEGER,
    TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VENTAS_CIUDAD_VENDEDOR (
    CODVEND INTEGER,
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CIUDAD VARCHAR(5),
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    TFACTURAS NUMERIC(18,2),
    TDEVOLUCIONES NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VENTAS_POR_HORA (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    DIASEM VARCHAR(15),
    HORA INTEGER,
    SUBTOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE PROCEDURE VENTAS_PROVEEDOR (
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    MFACTURAS NUMERIC(18,2),
    MDEVOLUCIONES NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE 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
BEGIN
  SUSPEND;
END^





CREATE 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
  SUSPEND;
END^





CREATE PROCEDURE VER_ARTICULOS_PEDWEB (
    IDDOC INTEGER)
RETURNS (
    PEWD_ITEM INTEGER,
    PEWD_CODBAR VARCHAR(15),
    ARTI_DES VARCHAR(60),
    PEWD_CANT NUMERIC(18,4),
    PEWD_PRUNIT NUMERIC(18,2),
    PEWD_TOTAL NUMERIC(18,2))
AS
BEGIN
  SUSPEND;
END^






SET TERM ; ^



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/



CREATE TABLE ACCESO_USUARIO (
    USER_COD     VARCHAR(8) NOT NULL,
    ACUS_MODULO  VARCHAR(20) NOT NULL,
    ACUS_OPCION  INTEGER NOT NULL,
    ACUS_SI      T_BOOLEANO
);

CREATE TABLE ACTIVACION (
    ACTIVA  VARCHAR(15)
);

CREATE TABLE ACTIVOS_CENTROS (
    ACFJ_COD     T_COD_ARTICULO NOT NULL,
    ACCE_ITEM    T_ID NOT NULL,
    ACCE_PROY    T_PROYECTO,
    ACCE_CENTRO  T_CENTRO,
    ACCE_PORC    T_PORCENTAJE
);

CREATE TABLE ACTIVOS_DOCUMENTOS (
    ACFJ_COD      T_COD_ARTICULO NOT NULL,
    ACDO_ITEM     T_ID NOT NULL,
    ACDO_ARCHIVO  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ACDO_NOMBRE   EXPLICA
);

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,
    ACFJ_OBS        BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ACFJ_DEPNIIF    SMALLINT,
    ACFJ_RESCATE    T_MONTO,
    ACGR_ID         T_ID,
    ACFJ_UNIDADES   T_BOOLEANO,
    ACSG_ID         T_ID,
    ACFJ_CTADEPD    T_CTA_CONTABLE,
    ACFJ_CTADEPC    T_CTA_CONTABLE,
    ACFJ_CTANIIFD   T_CTA_CONTABLE,
    ACFJ_CTANIIFC   T_CTA_CONTABLE,
    ACFJ_CTACONTA   T_CTA_CONTABLE,
    ACFJ_CTANIIF    T_CTA_CONTABLE,
    ACFJ_VRORIG     T_MONTO,
    ACFJ_CTADETERD  T_CTA_CONTABLE,
    ACFJ_CTADETERC  T_CTA_CONTABLE,
    ACFJ_UNITOT     T_ID
);

CREATE TABLE ACTIVOS_FIJOS_VALOR (
    ACFJ_COD        T_COD_ARTICULO NOT NULL,
    ACFV_FECHA      FECCONTA NOT NULL,
    ACFV_VALOR      T_MONTO,
    ACFV_OBS        EXPLICA,
    ACFV_DOCUMENTO  BLOB SUB_TYPE 0 SEGMENT SIZE 1024,
    ACFV_VRUSO      T_MONTO,
    ACFJ_CSUSO      T_MONTO,
    ACFV_PRVENTA    T_MONTO,
    ACFV_CSVENTA    T_MONTO,
    ACFV_VRRECUP    T_MONTO,
    ACFV_DIFER      T_MONTO,
    ACFV_IDCOMP     T_ID,
    TICO_COD        T_TIPO_COMP,
    PRCO_PREF       VARCHAR(4),
    ACFV_CONC       T_CONCEPTO,
    ENCO_NUMERO     T_NUMDOC
);

CREATE TABLE ACTIVOS_GRUPOS (
    ACGR_ID       T_ID NOT NULL,
    ACGR_NOM      T_CONCEPTO,
    ACGR_MESDEP   T_ID,
    ACGR_DEP      T_BOOLEANO,
    ACGR_MESDEPN  T_ID,
    ACGR_TIPODEP  T_ID
);

CREATE TABLE ACTIVOS_SUBGRUPO (
    ACGR_ID      T_ID NOT NULL,
    ACSG_ID      T_ID NOT NULL,
    ACSG_NOMBRE  T_CONCEPTO
);

CREATE TABLE ADMINISTRADORA (
    ADMI_EPS       BOOLEANO,
    ADMI_ARP       BOOLEANO,
    ADMI_AFP       BOOLEANO,
    ADMI_CCF       BOOLEANO,
    ADMI_COD       VARCHAR(20),
    ADMI_CTACXP    CTACONTA,
    TERC_NIT       T_NIT NOT NULL,
    ADMI_AFC       BOOLEANO,
    ADMI_CODARP    NIT,
    ADMI_CODEPS    NIT,
    ADMI_CODAFP    NIT,
    ADMI_CODAFC    NIT,
    ADMI_CODCCF    NIT,
    ADMI_CTACONTA  T_CTA_CONTABLE,
    ADMI_CTAEPS    T_CTA_CONTABLE,
    ADMI_CTAAFP    T_CTA_CONTABLE,
    ADMI_CTAAFC    T_CTA_CONTABLE,
    ADMI_CTAARP    T_CTA_CONTABLE,
    ADMI_CTACCF    T_CTA_CONTABLE,
    ADMI_INTDIA    T_BOOLEANO
);

CREATE TABLE AFP_ESPECIAL (
    AFPE_ID      ID NOT NULL,
    AFPE_NOMBRE  NOMBRE,
    AFPE_TARIFA  PORCENTAJE
);

CREATE TABLE AJUSTE_CIERRE (
    AJCI_ID      T_ID NOT NULL,
    AJCI_FECINI  DATE,
    AJCI_FECFIN  DATE,
    AJCI_PORC    T_PORCENTAJE,
    AJCI_FACTOR  T_PORCENTAJE
);

CREATE TABLE AJUSTES (
    AJUS_ID         T_ID NOT NULL,
    TIDO_COD        INTEGER NOT NULL,
    PREF_PRE        VARCHAR(4) NOT NULL,
    BODE_COD        VARCHAR(2) NOT NULL,
    AJUS_NUMERO     T_NUMDOC NOT NULL,
    AJUS_FECHA      DATE NOT NULL,
    AJUS_CONC       VARCHAR(60),
    AJUS_ANULADO    T_BOOLEANO,
    AJUS_TRANSMIT   T_BOOLEANO,
    AJUS_OBS        BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    AJUS_USUARIO    T_USUARIO,
    NUMOK           T_BOOLEANO DEFAULT 'N',
    AJUS_NOAJUSTAR  T_BOOLEANO,
    AJUS_STAND      VARCHAR(20),
    AJUS_PASADA     SMALLINT
);

CREATE TABLE AJUSTES_DETALLE (
    AJUS_ID        T_ID NOT NULL,
    AJUS_ITEM      T_ID NOT NULL,
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    AJUS_EXANT     T_CANTIDAD,
    AJUS_EXNUE     T_CANTIDAD,
    AJUS_UNIDAD    T_UNIDAD,
    AJUS_LOTE      T_LOTE,
    AJUS_FACTOR    T_CANTIDAD,
    AJUS_CODBAR    T_COD_ARTICULO,
    AJDE_ANULADO   T_BOOLEANO,
    AJDE_DESC      T_CONCEPTO,
    AJDE_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    AJDE_TRANSMIT  T_BOOLEANO,
    AJDE_COSTO     T_MONTO
);

CREATE TABLE AJUSTES_INFLACION (
    AJUS_ID       T_ID NOT NULL,
    TICO_COD      CHAR(3) NOT NULL,
    PRCO_PREF     VARCHAR(4),
    AJUS_FECHA    CHAR(8),
    AJUS_CONC     T_CONCEPTO,
    AJUS_REFER    VARCHAR(8),
    AJUS_PAAG     T_PORCENTAJE,
    ENCO_CONSEC   T_ID,
    TERC_NIT      T_NIT,
    ENCO_NUMERO   T_NUMDOC,
    AJUS_USUARIO  T_USUARIO
);

CREATE TABLE ANALISIS_ABCINVEN (
    ABCI_COD     T_COD_ARTICULO NOT NULL,
    ABCI_VENTA   T_CANTIDAD,
    ABCI_BODEGA  VARCHAR(2),
    ABCI_CANT    T_CANTIDAD,
    ABCI_COSTO   T_MONTO
);

CREATE TABLE ANTICIPOS_CLIENTE (
    ANCL_ID          T_ID NOT NULL,
    TIDO_COD         T_ID,
    PREF_PRE         VARCHAR(4),
    TERC_NIT         T_NIT,
    ANCL_FECHA       DATE,
    ANCL_NUMERO      VARCHAR(6),
    ANCL_CONC        VARCHAR(60),
    ANCL_BASE        T_MONTO,
    ANCL_IVAPORC     T_PORCENTAJE,
    ANCL_IVAMONTO    T_MONTO,
    ANCL_RTFTEPORC   T_PORCENTAJE,
    ANCL_RTFTEMONTO  T_MONTO,
    ANCL_RTIVAPORC   T_PORCENTAJE,
    ANCL_RTIVAMONTO  T_MONTO,
    ANCL_RTICAPORC   T_PORCENTAJE,
    ANCL_RTICAMONTO  T_MONTO,
    ANCL_DTOFECHA    DATE,
    ANCL_DTOFPORC    T_PORCENTAJE,
    ANCL_DTOFMONTO   T_MONTO,
    ANCL_ANULADO     T_BOOLEANO,
    ANCL_TRANSMIT    T_BOOLEANO,
    COBR_COD         T_ID,
    ANCL_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    RECA_ID          T_ID,
    ANCL_USUARIO     T_USUARIO,
    ANCL_SUCURSAL    VARCHAR(10),
    NUMOK            T_BOOLEANO DEFAULT 'N',
    VEND_COD         T_ID,
    ANCL_TRM         T_MONTO,
    ANCL_RTCREE      T_PORCENTAJE,
    ANCL_RTCREEM     T_MONTO
);

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 ANTICIPOS_PROVEEDOR (
    ANPR_ID          T_ID NOT NULL,
    TERC_NIT         T_NIT NOT NULL,
    TIDO_COD         INTEGER NOT NULL,
    PREF_PRE         VARCHAR(4) NOT NULL,
    ANPR_NUMERO      T_NUMDOC NOT NULL,
    ANPR_FECHA       DATE NOT NULL,
    ANPR_CONC        VARCHAR(60),
    ANPR_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ANPR_BASE        T_MONTO,
    ANPR_IVAPORC     T_PORCENTAJE,
    ANPR_IVAMONTO    T_MONTO,
    ANPR_RTFTEPORC   T_PORCENTAJE,
    ANPR_RTFTEMONTO  T_MONTO,
    ANPR_RTIVAPORC   T_PORCENTAJE,
    ANPR_RTIVAMONTO  T_MONTO,
    ANPR_RTICAPORC   T_PORCENTAJE,
    ANPR_RTICAMONTO  T_MONTO,
    ANPR_DTOFECHA    DATE,
    ANPR_DTOFPORC    T_PORCENTAJE,
    ANPR_DTOFMONTO   T_MONTO,
    ANPR_ANULADO     T_BOOLEANO,
    ANPR_TRANSMIT    T_BOOLEANO,
    EGRE_ID          INTEGER,
    ANPR_USUARIO     T_USUARIO,
    NUMOK            T_BOOLEANO DEFAULT 'N',
    ANPR_TRM         T_MONTO,
    ANPR_RTCREE      T_PORCENTAJE,
    ANPR_RTCREEM     T_MONTO
);

CREATE TABLE APERTURA_NIIF (
    CUEN_COD        T_CTA_CONTABLE NOT NULL,
    APNI_SALDOANT   T_MONTO,
    APNI_AJUSTEDB   T_MONTO,
    APNI_AJUSTECR   T_MONTO,
    APNI_SALDONIIF  T_MONTO,
    APNI_NOTA       VARCHAR(2048),
    APNI_CUENNIIF   T_CTA_CONTABLE,
    APNI_ARCHIVO    BLOB SUB_TYPE 0 SEGMENT SIZE 8192
);

CREATE TABLE APERTURA_NIIF_DET (
    CUEN_COD       T_CTA_CONTABLE NOT NULL,
    APND_ITEM      T_ID NOT NULL,
    APND_CUENTA    T_CTA_CONTABLE,
    APND_TIPOCTA   CHAR(1),
    APND_CONCEPTO  T_CONCEPTO,
    APND_SALDOINI  T_MONTO,
    APND_DEBITO    T_MONTO,
    APND_CREDITO   T_MONTO,
    APND_SALDOFIN  T_MONTO,
    APND_ARCHIVO   BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    APND_CTANIIF   T_CTA_CONTABLE,
    APND_RECLDB    T_MONTO,
    APND_RECLCR    T_MONTO,
    TERC_NIT       T_NIT,
    PROY_COD       T_PROYECTO,
    CENT_COD       T_CENTRO,
    ACTI_COD       T_COD_ARTICULO
);

CREATE TABLE APLICACION_CLIENTE (
    APCL_ID        T_ID NOT NULL,
    TERC_NIT       T_NIT NOT NULL,
    TIDO_COD       INTEGER,
    PREF_PRE       VARCHAR(4),
    APCL_NUMERO    VARCHAR(6),
    APCL_FECHA     DATE,
    APCL_CONCEPTO  VARCHAR(60),
    APCL_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    APCL_ANULADO   T_BOOLEANO,
    APCL_TRANSMIT  T_BOOLEANO,
    COBR_COD       T_ID,
    APCL_USUARIO   T_USUARIO,
    APCL_SUCURSAL  VARCHAR(10),
    NUMOK          T_BOOLEANO DEFAULT 'N',
    APCL_TRM       T_MONTO
);

CREATE TABLE APLICACION_CLIENTE_CRUCE (
    APCL_ID         T_ID NOT NULL,
    APCR_ITEM       T_ID NOT NULL,
    APCR_TIPODOC    T_ID,
    APCR_IDDOC      T_ID,
    APCR_PREFIJO    VARCHAR(4),
    APCR_NUMERO     T_NUMDOC,
    APCR_APLICADO   T_MONTO,
    APCR_RTFTE      T_MONTO,
    APCR_RTIVA      T_MONTO,
    APCR_RTICA      T_MONTO,
    APCR_ANULADO    T_BOOLEANO,
    APCR_TRANSMIT   T_BOOLEANO,
    APCR_DIFCAMBIO  T_MONTO,
    APCR_NUMPROV    T_NUMPROV,
    APCR_RCREE      T_MONTO
);

CREATE TABLE APLICACION_CLIENTE_DETALLE (
    APCL_ID         T_ID NOT NULL,
    ACDE_ITEM       T_ID NOT NULL,
    ACDE_TIPODOC    T_ID,
    ACDE_IDDOC      INTEGER,
    ACDE_PREFIJO    VARCHAR(4),
    ACDE_NUMERO     T_NUMDOC,
    ACDE_APLICADO   T_MONTO,
    ACDE_RTFTE      T_MONTO,
    ACDE_RTIVA      T_MONTO,
    ACDE_RTICA      T_MONTO,
    ACDE_ANULADO    T_BOOLEANO,
    ACDE_TRANSMIT   T_BOOLEANO,
    ACDE_DIFCAMBIO  T_MONTO,
    ACDE_SUCURSAL   VARCHAR(10),
    ACDE_RCREE      T_MONTO
);

CREATE TABLE APLICACION_PROVEDOR (
    APPR_ID        T_ID NOT NULL,
    TIDO_COD       T_ID NOT NULL,
    PREF_PRE       VARCHAR(4) NOT NULL,
    APPR_NUMERO    T_NUMDOC,
    APPR_CONC      T_CONCEPTO,
    APPR_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    APPR_ANULADO   T_BOOLEANO,
    APPR_TRANSMIT  T_BOOLEANO,
    TERC_NIT       T_NIT,
    APPR_FECHA     DATE,
    APPR_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N',
    APPR_TRM       T_MONTO
);

CREATE TABLE APLICACION_PROVEEDOR_DETALLE (
    APPR_ID         T_ID NOT NULL,
    APPD_ITEM       T_ID NOT NULL,
    APPD_TIPODOC    T_ID NOT NULL,
    APPD_IDDOC      T_ID NOT NULL,
    APPD_APLICADO   T_MONTO,
    APPD_RTFTE      T_MONTO,
    APPD_RTIVA      T_MONTO,
    APPD_RTICA      T_MONTO,
    APPD_ANULADO    T_BOOLEANO,
    APPD_TRANSMIT   T_BOOLEANO,
    APPD_PREFIJO    VARCHAR(4),
    APPD_NUMERO     VARCHAR(6),
    APPD_DIFCAMBIO  T_MONTO,
    APPD_RCREE      T_MONTO
);

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 ARQUEO_CAJA (
    ARQC_ID        T_ID NOT NULL,
    PREF_PRE       VARCHAR(4) NOT NULL,
    ARQC_NUMERO    T_NUMDOC NOT NULL,
    ARQC_FECHA     DATE NOT NULL,
    ARQC_CAJA      T_ID NOT NULL,
    ARQC_OBS       VARCHAR(255),
    ARQC_ANULADO   T_BOOLEANO,
    ARQC_TRANSMIT  T_BOOLEANO,
    NUM_OK         T_BOOLEANO,
    ARQC_USUARIO   T_USUARIO
);

CREATE TABLE ARQUEO_CAJA_DET (
    ARQC_ID        T_ID NOT NULL,
    ARQD_ITEM      T_ID NOT NULL,
    DENO_ID        T_ID,
    ARQD_CANT      SMALLINT,
    ARQD_OBS       VARCHAR(255),
    ARQD_ANULADO   T_BOOLEANO,
    ARQD_TRANSMIT  T_BOOLEANO,
    ARQD_TOTAL     T_MONTO,
    ARQD_MONTO     T_MONTO
);

CREATE TABLE ARTICULO (
    ARTI_COD          T_COD_ARTICULO NOT NULL,
    GRUP_COD          VARCHAR(2),
    SUBG_COD          VARCHAR(3),
    MARC_COD          VARCHAR(3),
    ARTI_DES          VARCHAR(60) NOT NULL,
    ARTI_DESVAR       T_BOOLEANO NOT NULL,
    ARTI_TIPO         CHAR(1) NOT NULL,
    ARTI_EXIST        CHAR(1) NOT NULL,
    ARTI_FECHA        DATE,
    ARTI_UNIDAD       VARCHAR(8) NOT NULL,
    ARTI_PRECIO       T_MONTO,
    ARTI_CONSUMO      T_MONTO,
    ARTI_IMPOTRO      T_MONTO,
    ARTI_PESO         NUMERIC(9,4),
    ARTI_ANCHO        T_ATRIBUTO,
    ARTI_ALTO         T_ATRIBUTO,
    ARTI_LARGO        T_ATRIBUTO,
    ARTI_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ARTI_FOTO         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ARTI_MAX          T_CANTIDAD,
    ARTI_MIN          T_CANTIDAD,
    ARTI_DIAS         INTEGER,
    ESAR_COD          CHAR(1),
    ARTI_USUARIO      T_USUARIO,
    TAIV_COD          T_ID NOT NULL,
    ARTI_CLASE        CHAR(1),
    ARTI_DIANALIS     INTEGER,
    ARTI_DESCORTA     VARCHAR(30),
    ARTI_PRODCANT     T_BOOLEANO,
    ARTI_CICLO        SMALLINT,
    ARTI_TIENDA       T_BOOLEANO,
    ARTI_ENSAMBLE     T_BOOLEANO,
    ARTI_VALORBONO    T_MONTO,
    ARTI_MERMA        T_PORCENTAJE,
    ARTI_SOBRANTE     T_COD_ARTICULO,
    ARTI_PORCSOBR     T_PORCENTAJE,
    ARTI_REUSOB       T_BOOLEANO,
    ARTI_ESPECIE      T_ID,
    ARTI_DEC2799      T_BOOLEANO,
    ARTI_SOBTOT       T_BOOLEANO,
    ARTI_PORCARAN     T_PORCENTAJE,
    ARTI_MERMAENT     T_BOOLEANO,
    ARTI_MERMAPOR     T_PORCENTAJE,
    ARTI_TERCERO      T_BOOLEANO,
    ARTI_INVIMA       VARCHAR(20),
    ARTI_INALC        T_PORCENTAJE,
    ARTI_DTOMAX       T_PORCENTAJE,
    ARTI_CUM          T_COD_ARTICULO,
    ARTI_POSARANCEL   T_COD_ARTICULO,
    ARTI_TIEMPOF      ENTERO,
    ARTI_TIEMPOO      ENTERO,
    ARTI_CAMBPRECIVA  T_BOOLEANO,
    ARTI_ORDEN        ENTERO
);

CREATE TABLE ARTICULO_ALERTAS (
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    ARTI_ITEM      INTEGER NOT NULL,
    ARAL_USUARIO   T_USUARIO,
    ARAL_FECHAINI  DATE,
    ARAL_FECHAFIN  DATE,
    ARAL_MENSAJE   VARCHAR(255),
    ARAL_LEIDO     T_BOOLEANO
);

CREATE TABLE ARTICULO_BODEGA (
    SUCU_ID   T_ID NOT NULL,
    ARTI_COD  T_COD_ARTICULO NOT NULL,
    BODE_COD  VARCHAR(2) NOT NULL
);

CREATE TABLE ARTICULO_DOCUMENTOS (
    ARTI_COD      T_COD_ARTICULO NOT NULL,
    ARDO_ITEM     T_ID NOT NULL,
    ARDO_ARCHIVO  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ARDO_NOMBRE   EXPLICA
);

CREATE TABLE ARTICULO_EQUIVALENCIA (
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    AREQ_ITEM      T_ID NOT NULL,
    AREQ_EQUIVALE  T_COD_ARTICULO
);

CREATE TABLE ARTICULO_MINIMOS (
    ARMN_ARTICULO  T_COD_ARTICULO NOT NULL,
    ARMN_BODEGA    VARCHAR(2) NOT NULL,
    ARMN_DIA       ENTERO NOT NULL,
    ARMN_HORAINI   HORA NOT NULL,
    ARMN_HORAFIN   HORA NOT NULL,
    ARMN_MINIMO    T_CANTIDAD
);

CREATE TABLE ARTICULOS_PRODUCTO (
    ARTI_COD     T_COD_ARTICULO NOT NULL,
    ARPR_ITEM    T_ID NOT NULL,
    ARPR_CANT    T_CANTIDAD,
    ARPR_UNIDAD  T_UNIDAD NOT NULL,
    ARPR_CODBAR  T_COD_ARTICULO,
    ARPR_COMP    T_COD_ARTICULO,
    ARPR_PORC    T_PORCENTAJE,
    ARPR_MERMA   T_PORCENTAJE,
    ARPR_BASE    T_BOOLEANO,
    ARPR_PRECIO  T_MONTO
);

CREATE TABLE ARTICULOS_REPORTE (
    ARTI_COD  T_COD_ARTICULO
);

CREATE TABLE ASEGURADORA (
    ASEG_NIT     T_NIT NOT NULL,
    ASEG_NOMBRE  T_CONCEPTO
);

CREATE TABLE ASESORES (
    ASES_ID      INTEGER NOT NULL,
    ASES_NOMBRE  VARCHAR(60)
);

CREATE TABLE AUDITORIA (
    AUDI_ID         T_ID NOT NULL,
    AUDI_USUARIO    T_USUARIO,
    AUDI_FECHA      DATE,
    AUDI_HORA       TIME,
    TIDO_COD        INTEGER,
    AUDI_IDDOC      T_ID,
    AUDI_OPER       CHAR(1),
    AUDI_COD        T_NIT,
    AUDI_ENVIO      T_BOOLEANO,
    AUDI_TICO       T_TIPO_COMP,
    AUDI_RAZON      VARCHAR(255),
    AUDI_IPCLIENTE  T_CONCEPTO,
    AUDI_DATOS      DATOAUDIT
);

CREATE TABLE AUTORIZACIONES (
    AUTO_NUMERO      VARCHAR(20) NOT NULL,
    TIDO_COD         INTEGER NOT NULL,
    PREF_PRE         VARCHAR(4) NOT NULL,
    AUTO_FECHA       DATE NOT NULL,
    AUTO_INICIAL     T_NUMDOC,
    AUTO_FINAL       T_NUMDOC,
    AUTO_VENCE       DATE,
    AUTO_ITEMS       INTEGER,
    AUTO_PREFRDC     VARCHAR(4),
    AUTO_CONTADO     T_BOOLEANO,
    AUTO_NITCONTADO  T_NIT,
    AUTO_ESPOS       T_BOOLEANO,
    AUTO_FECHAS      T_BOOLEANO,
    AUTO_COTIZA      T_BOOLEANO,
    AUTO_REMISION    T_BOOLEANO,
    AUTO_PEDIDO      T_BOOLEANO,
    AUTO_AVISAR      SMALLINT,
    AUTO_USRAVISO    T_USUARIO,
    AUTO_ENTREGA     T_BOOLEANO,
    AUTO_MAQUINA     T_CONCEPTO,
    AUTO_MARCA       VARCHAR(3)
);

CREATE TABLE AUTORIZACIONES_CARTERA (
    AUCA_ID        T_ID NOT NULL,
    AUCA_NIT       T_NIT,
    AUCA_FECHA     FECHA,
    AUCA_MOTIVO    CHAR(1),
    AUCA_CUPO      T_MONTO,
    AUCA_CARTERA   T_MONTO,
    AUCA_MONTODOC  T_MONTO,
    AUCA_USUARIO   T_USUARIO,
    AUCA_HORA      TIME,
    AUCA_OBS       VARCHAR(1024),
    AUCA_APROBADO  T_BOOLEANO,
    AUCA_VENTAS    T_MONTO,
    AUCA_DIAS      ENTERO,
    AUCA_DIASR     ENTERO,
    AUCA_SALDO     T_MONTO,
    AUCA_TIPO      T_ID,
    AUCA_VEND      T_ID
);

CREATE TABLE BANCOS (
    BANC_COD     INTEGER NOT NULL,
    BANC_NOMBRE  VARCHAR(60) NOT NULL,
    BANC_NIT     VARCHAR(20),
    BANC_CODACH  VARCHAR(7)
);

CREATE TABLE BARRAS_ARTICULO (
    ARTI_COD     T_COD_ARTICULO NOT NULL,
    COBA_COD     T_COD_ARTICULO NOT NULL,
    COBA_DES     VARCHAR(60) NOT NULL,
    COBA_UNIDAD  T_UNIDAD NOT NULL,
    COBA_ACTIVO  BOOLEANO
);

CREATE TABLE BODEGA (
    BODE_COD      VARCHAR(2) NOT NULL,
    BODE_NOM      VARCHAR(30) NOT NULL,
    BODE_PROY     VARCHAR(4),
    BODE_CENTRO   VARCHAR(4),
    SUCU_ID       T_ID,
    BODE_ACTIVA   T_BOOLEANO,
    BODE_LOTES    T_BOOLEANO,
    BODE_USUARIO  T_USUARIO,
    BODE_FACTURA  T_BOOLEANO,
    BODE_AUTO     T_BOOLEANO
);

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

CREATE TABLE CAJAS (
    CAJA_ID       T_ID NOT NULL,
    CAJA_NOMBRE   VARCHAR(60) NOT NULL,
    CAJA_CUENTA   T_CTA_CONTABLE,
    CAJA_RESP     VARCHAR(60),
    CAJE_ID       INTEGER,
    SUCU_ID       T_ID,
    CAJA_ACTIVA   T_BOOLEANO,
    CAJA_FPBCO    VARCHAR(2),
    CAJA_PREDET   T_BOOLEANO,
    CAJA_CTANIIF  T_CTA_CONTABLE
);

CREATE TABLE CAJEROS (
    CAJE_ID      INTEGER NOT NULL,
    CAJE_NOMBRE  T_CONCEPTO
);

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),
    CAMC_STAND      T_COD_ARTICULO
);

CREATE TABLE CAMBIA_PRECIOS (
    CAPR_ID       T_ID NOT NULL,
    ARTI_COD      T_COD_ARTICULO NOT NULL,
    LIPR_COD      INTEGER NOT NULL,
    CAPR_FECHA    FECHA NOT NULL,
    CAPR_PRECIO   T_MONTO,
    CAPR_USUARIO  T_USUARIO
);

CREATE TABLE CAMBIO_ARTICULOS (
    CAAR_ID        T_ID NOT NULL,
    CAAR_ITEM      T_ID NOT NULL,
    CAAR_FECHA     FECHA,
    ARTI_CODE      T_COD_ARTICULO,
    ARTI_CODS      T_COD_ARTICULO,
    CAAR_CANT      T_CANTIDAD,
    CAAR_COSTO     T_MONTO,
    CAAR_PREFENT   T_PREFIJO,
    CAAR_PREFSAL   T_PREFIJO,
    CAAR_IDENT     T_ID,
    CAAR_IDSAL     T_ID,
    CAAR_BODEGA    VARCHAR(2),
    CAAR_CONCEPTO  T_CONCEPTO,
    CAAR_LOTE      T_LOTE,
    CAAR_CODBARE   T_COD_ARTICULO,
    CAAR_CODBARS   T_COD_ARTICULO
);

CREATE TABLE CAMBIO_COSTO (
    CACO_ID         T_ID NOT NULL,
    PREF_PRE        PREFIJO,
    CACO_NUMERO     T_NUMDOC,
    CACO_FECHA      FECHA,
    CACO_CONCEPTO   T_CONCEPTO,
    ARTI_COD        T_COD_ARTICULO,
    CACO_CTACONTA   T_CTA_CONTABLE,
    NUMOK           T_BOOLEANO,
    CACO_ANULADO    T_BOOLEANO,
    CACO_TRANSMIT   T_BOOLEANO,
    CACO_NVOCOSTO   T_MONTO,
    CACO_ANTCOSTO   T_MONTO,
    CACO_IMPTOS     T_BOOLEANO,
    CACO_USUARIO    T_USUARIO,
    CACO_OBS        BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CACO_CLASE      SMALLINT,
    CACO_NVOCOSTON  T_MONTO,
    CACO_ANTCOSTON  T_MONTO
);

CREATE TABLE CAMBIO_DOCUMENTOS (
    CADO_ID        T_ID NOT NULL,
    CAJA_ID        T_ID NOT NULL,
    TIDO_COD       INTEGER NOT NULL,
    PREF_PRE       VARCHAR(4) NOT NULL,
    CADO_NUMERO    T_NUMDOC NOT NULL,
    CADO_FECHA     DATE NOT NULL,
    CADO_CONC      VARCHAR(60),
    CADO_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CADO_ANULADO   T_BOOLEANO,
    CADO_TRANSMIT  T_BOOLEANO,
    CADO_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N',
    VEND_COD       T_ID
);

CREATE TABLE CAMBIO_SITUACION (
    CASI_ID       INTEGER NOT NULL,
    CASI_CUENTA   T_CTA_CONTABLE,
    CASI_SECCION  INTEGER,
    CASI_DB       T_BOOLEANO
);

CREATE TABLE CAMBIODOC_ENTRADAS (
    CADO_ID        T_ID NOT NULL,
    CDEN_ITEM      T_ID NOT NULL,
    FOPA_ID        T_ID NOT NULL,
    CDEN_BANCO     VARCHAR(2),
    CDEN_CUENTA    VARCHAR(20),
    CDEN_NUMERO    VARCHAR(20),
    CDEN_FECHA     DATE,
    CDEN_MONTO     T_MONTO,
    CDEN_ANULADO   T_BOOLEANO,
    CDEN_TRANSMIT  T_BOOLEANO
);

CREATE TABLE CAMBIODOC_SALIDAS (
    CADO_ID        T_ID NOT NULL,
    CDSA_ITEM      T_ID NOT NULL,
    FOPA_ID        T_ID NOT NULL,
    CDSA_BANCO     VARCHAR(2),
    CDSA_CUENTA    VARCHAR(20),
    CDSA_NUMERO    VARCHAR(20),
    CDSA_FECHA     DATE,
    CDSA_MONTO     T_MONTO,
    CDSA_ANULADO   T_BOOLEANO,
    CDSA_TRANSMIT  T_BOOLEANO
);

CREATE TABLE CANAL (
    CANA_ID      T_ID NOT NULL,
    CANA_NOM     T_CONCEPTO,
    CANA_ACTIVO  T_BOOLEANO
);

CREATE TABLE CARGA_PRODUCTOS (
    CGPR_COD     T_COD_ARTICULO NOT NULL,
    CGPR_DESC    VARCHAR(255),
    CGPR_NOMBRE  T_CONCEPTO
);

CREATE TABLE CARGA_REMESA (
    CGRM_PREF        T_PROYECTO NOT NULL,
    CGRM_NUMERO      T_NUMDOC NOT NULL,
    CGRM_FECHA       DATE,
    CGRM_VEND        T_ID,
    CGRM_REMNOM      T_CONCEPTO,
    CGRM_REMTEL      VARCHAR(40),
    CGRM_REMDIR      T_CONCEPTO,
    CGRM_DESNOM      T_CONCEPTO,
    CGRM_DESTEL      VARCHAR(40),
    CGRM_DESDIR      T_CONCEPTO,
    CGRM_PROD        T_COD_ARTICULO,
    CGRM_CONC        VARCHAR(255),
    CGRM_OBS         VARCHAR(255),
    CGRM_CANT        T_CANTIDAD,
    CGRM_PESO        T_CANTIDAD,
    CGRM_VALOR       T_MONTO,
    CGRM_SEGURO      T_MONTO,
    CGRM_FLETE       T_MONTO,
    CGRM_TOTAL       T_MONTO,
    CGRM_FPAGO       CHAR(1),
    CGRM_DOMICILIO   T_MONTO,
    CGRM_ID          T_ID NOT NULL,
    CGRM_ANULADO     T_BOOLEANO,
    CGRM_TRANSMIT    T_BOOLEANO,
    CGRM_PLANILLA    T_ID,
    CGRM_ORIGEN      VARCHAR(5),
    CGRM_DESTINO     VARCHAR(5),
    CGRM_TIPOVH      T_ID,
    CGRM_VEHICULO    T_NIT,
    CGRM_NIT         T_NIT,
    CGRM_MANIF       T_ID,
    CGRM_UNIDAD      VARCHAR(10),
    CGRM_EMPAQUE     T_ID,
    CGRM_NATURALEZA  T_ID,
    CGRM_NUMOK       T_BOOLEANO,
    CGRM_CAJA        T_ID,
    TIDO_COD         T_ID,
    CGRM_NOMCLIENTE  T_CONCEPTO,
    CGRM_USUARIO     T_USUARIO,
    CGRM_NITDEST     T_NIT
);

CREATE TABLE CARTAS_NOMINA (
    CANO_ID       T_ID NOT NULL,
    CANO_NOMBRE   T_CONCEPTO,
    CANO_ARCHIVO  T_CONCEPTO
);

CREATE TABLE CENTROS (
    PROY_COD  T_PROYECTO NOT NULL,
    CENT_COD  T_CENTRO NOT NULL,
    CENT_NOM  VARCHAR(60) NOT NULL,
    SUCU_ID   T_ID
);

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 CHEQUERA (
    CUBA_COD      INTEGER NOT NULL,
    CHRA_ID       T_ID NOT NULL,
    CHRA_INICIAL  VARCHAR(8) NOT NULL,
    CHRA_CANT     INTEGER NOT NULL,
    CHRA_GIRADOS  INTEGER NOT NULL
);

CREATE TABLE CHEQUES (
    CHEQ_ID        INTEGER NOT NULL,
    CUBA_COD       INTEGER NOT NULL,
    PRBA_PREF      VARCHAR(4) NOT NULL,
    CHEQ_FECHA     DATE NOT NULL,
    CHEQ_IDEGRESO  T_ID NOT NULL,
    CHEQ_CONCEPTO  VARCHAR(60),
    CHEQ_BENEF     VARCHAR(60),
    CHEQ_MONTO     NUMERIC(18,2),
    CHEQ_GMFPORC   NUMERIC(9,2),
    CHEQ_GMFMONTO  NUMERIC(18,2),
    CHEQ_ANULADO   T_BOOLEANO,
    CHEQ_TRANSMIT  T_BOOLEANO,
    CHEQ_EGRESO    VARCHAR(10),
    CHEQ_NUMERO    VARCHAR(8),
    TERC_NIT       T_NIT,
    CHEQ_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N',
    CHEQ_CONFIRMA  T_BOOLEANO
);

CREATE TABLE CIERRE_ANUAL (
    CIAN_ID        T_ID NOT NULL,
    CIAN_FECHA     CHAR(8),
    CIAN_CONCEPTO  T_CONCEPTO,
    CIAN_REFER     VARCHAR(8),
    TERC_NIT       T_NIT,
    TICO_COD       CHAR(3),
    PRCO_PREF      VARCHAR(4),
    ENCO_CONSEC    T_ID,
    ENCO_NUMERO    T_NUMDOC,
    CIAN_USUARIO   T_USUARIO,
    CIAN_NIIF      CHAR(1)
);

CREATE TABLE CIERRE_TERCEROS (
    CITE_ID        T_ID NOT NULL,
    CITE_FECHA     CHAR(8),
    CITE_CONCEPTO  T_CONCEPTO,
    TICO_COD       CHAR(3),
    PRCO_PREF      VARCHAR(4),
    ENCO_CONSEC    T_ID,
    TERC_NIT       T_NIT,
    CITE_REFER     VARCHAR(8),
    ENCO_NUMERO    T_NUMDOC,
    CUEN_COD       T_CTA_CONTABLE,
    CITE_USUARIO   T_USUARIO,
    CITE_NIIF      CHAR(1)
);

CREATE TABLE CIUDADES (
    CIUD_COD     CHAR(5) NOT NULL,
    CIUD_NOM     VARCHAR(60),
    CIUD_ACTIVA  T_BOOLEANO
);

CREATE TABLE CLASE_EGRESO (
    CLEG_ID      T_ID NOT NULL,
    CLEG_NOMBRE  T_CONCEPTO
);

CREATE TABLE CLIENTE_SUCURSALES (
    TERC_NIT       T_NIT NOT NULL,
    CLCU_COD       VARCHAR(10) NOT NULL,
    CLSU_NOMBRE    T_CONCEPTO,
    CLSU_DIR       T_CONCEPTO,
    CLSU_CIUDAD    VARCHAR(40),
    CLSU_TEL       VARCHAR(40),
    CLSU_OBS       BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    VEND_COD       INTEGER,
    COBR_COD       INTEGER,
    ZONA_COD       VARCHAR(2),
    LIPR_COD       INTEGER,
    CLSU_ACTIVO    T_BOOLEANO,
    CLSU_VALORMES  T_MONTO,
    GRCA_COD       T_ID,
    CLSU_DEC1818   T_BOOLEANO
);

CREATE TABLE CLIENTES (
    TERC_NIT            T_NIT NOT NULL,
    CLIE_COD            T_NIT NOT NULL,
    CLIE_ESTADO         CHAR(1) NOT NULL,
    CLIE_RTEFTE         T_PORCENTAJE,
    CLIE_RTEIVA         T_PORCENTAJE,
    CLIE_RTEICA         T_PORCENTAJE,
    CLIE_RTFTEBASE      T_MONTO,
    CLIE_DTOMAX         T_PORCENTAJE,
    CLIE_CUPO           T_MONTO,
    COBR_COD            INTEGER,
    VEND_COD            INTEGER,
    ZONA_COD            T_ZONA,
    LIPR_COD            INTEGER,
    CLIE_DIAS           INTEGER,
    CLIE_FECHA          DATE,
    CLIE_ANIV           DATE,
    CLIE_USUARIO        T_USUARIO,
    GRCA_COD            INTEGER,
    CLIE_DIASBLOQ       INTEGER,
    CLIE_DETALLE        T_BOOLEANO,
    CLIE_FACC           T_ID,
    CLIE_INSTRUCCIONES  VARCHAR(255),
    CLIE_PEDIDOS        VARCHAR(255),
    CLIE_VALORMES       T_MONTO,
    CLIE_INSTCARTERA    VARCHAR(255),
    CLIE_RESALTAR       T_BOOLEANO,
    CLIE_MAILCART       VARCHAR(100),
    CLIE_RTICABASE      T_MONTO,
    CLIE_LNGT           T_PORCENTAJE,
    CLIE_LATI           T_PORCENTAJE,
    CLIE_CALIFICA       CALIFICA,
    CLIE_RTCREE         T_PORCENTAJE,
    CLIE_REVALID        T_BOOLEANO,
    SEGM_COD            CENTRO
);

CREATE TABLE CLIENTES_ALERTAS (
    TERC_NIT       T_NIT NOT NULL,
    CLAL_ITEM      INTEGER NOT NULL,
    CLAL_USUARIO   T_USUARIO,
    CLAL_FECHAINI  DATE,
    CLAL_FECHAFIN  DATE,
    CLAL_MENSAJE   VARCHAR(255),
    CLAL_ANULADO   T_BOOLEANO
);

CREATE TABLE CLIENTES_FACTURACION_MASIVA (
    CLFA_ID         T_ID NOT NULL,
    TERC_NIT        T_NIT NOT NULL,
    CLSU_COD        VARCHAR(10) NOT NULL,
    CLFA_DETCLI     T_NIT,
    CLFA_DETCLINOM  T_CONCEPTO
);

CREATE TABLE COBRADORES (
    COBR_COD        T_ID NOT NULL,
    COBR_NOM        T_CONCEPTO NOT NULL,
    COBR_ESTADO     T_BOOLEANO,
    COBR_DIRECCION  VARCHAR(60),
    COBR_TELEFONOS  VARCHAR(30),
    SUCU_ID         T_ID,
    COBR_CC         T_NIT
);

CREATE TABLE COCINA_COLA_FUNCION (
    COFU_ID          T_ID NOT NULL,
    COCF_ITEM        T_ID NOT NULL,
    CPCF_FECHA       FECHA,
    COCF_ARTICULO    T_COD_ARTICULO,
    COCF_CANT        ENTERO,
    COCF_TIEMPOF     ENTERO,
    COCF_TIEMPOO     ENTERO,
    COCF_ENTREGADO   T_BOOLEANO,
    COCF_OBS         OBSERVACIONT,
    COCF_HORA        HORA,
    COCF_TIEMPOREAL  ENTERO,
    COCF_OPERARIO    T_ID,
    COCF_TIEMPOA     HORA,
    COCF_IDDOC       ID,
    COCF_TIEMPOE     HORA,
    COCF_TIEMPOINI   HORA
);

CREATE TABLE COCINA_FUNCIONES (
    COFU_ID      T_ID NOT NULL,
    COFU_NOMBRE  T_CONCEPTO,
    COFU_ACTIVA  T_BOOLEANO
);

CREATE TABLE COCINA_OPERARIOS (
    COOP_ID       T_ID NOT NULL,
    COOP_NOMBRE   T_CONCEPTO,
    COOP_ACTIVO   T_BOOLEANO,
    COOP_FUNCION  ENTERO
);

CREATE TABLE COLORES (
    COLR_ID   T_ID NOT NULL,
    COLR_NOM  T_CONCEPTO
);

CREATE TABLE COMISION_COBRO (
    COBR_COD      INTEGER NOT NULL,
    CMCB_ITEM     INTEGER NOT NULL,
    CMCB_DIASINI  INTEGER,
    CMCB_DIASFIN  INTEGER,
    CMCB_PORC     T_PORCENTAJE
);

CREATE TABLE COMISIONES (
    VEND_COD      T_ID NOT NULL,
    COMI_ID       T_ID NOT NULL,
    COMI_INICIAL  T_MONTO,
    COMI_FINAL    T_MONTO,
    COMI_PORC     T_PORCENTAJE
);

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,
    CMPP_NIT       T_NIT
);

CREATE TABLE COMISIONES_PUNTOS (
    COPU_COD       VARCHAR(2) NOT NULL,
    COPU_FACTOR    T_PORCENTAJE,
    COPU_FACTORCL  T_PORCENTAJE,
    COPU_DIAS      SMALLINT
);

CREATE TABLE COMPRAS_INTERNACIONALES (
    COIN_ID          T_ID NOT NULL,
    BODE_COD         VARCHAR(2) NOT NULL,
    TERC_NIT         T_NIT NOT NULL,
    TIDO_COD         INTEGER NOT NULL,
    PREF_PRE         VARCHAR(4) NOT NULL,
    COIN_NUMERO      T_NUMDOC NOT NULL,
    COIN_FECHA       DATE NOT NULL,
    COIN_VENCE       DATE NOT NULL,
    COIN_NUMPROV     T_NUMPROV,
    COIN_CONC        VARCHAR(60),
    COIN_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    COIN_ANULADO     T_BOOLEANO,
    COIN_TRANSMIT    T_BOOLEANO,
    COIN_IMPTOS      T_BOOLEANO,
    COIN_DTOPORC     T_PORCENTAJE,
    COIN_DTOMONTO    T_MONTO,
    COIN_ADICIONAL   T_MONTO,
    COIN_EXTRA       T_MONTO,
    COIN_RTIVAPOR    T_PORCENTAJE,
    COIN_RTIVAMONTO  T_MONTO,
    COIN_RTICAPOR    T_PORCENTAJE,
    COIN_RTICAMONTO  T_MONTO,
    COIN_RTFTEPORC   T_PORCENTAJE,
    COIN_RTFTEMONTO  T_MONTO,
    COIN_IVAMONTO    T_MONTO,
    COIN_DTOFPOR     T_PORCENTAJE,
    COIN_DTOFMONTO   T_MONTO,
    COIN_DTOFFECHA   DATE,
    COIN_TOTAL       T_MONTO,
    COIN_DEVUELTO    T_CANTIDAD,
    COIN_NROCOPIA    INTEGER,
    COIN_CONSOLIDA   T_ID,
    COIN_USUARIO     T_USUARIO,
    NUMOK            T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE COMPRAS_INTERNACIONALES_DETALLE (
    COIN_ID             T_ID NOT NULL,
    CIDE_ITEM           T_ID NOT NULL,
    ARTI_COD            T_COD_ARTICULO NOT NULL,
    BODE_COD            VARCHAR(2) NOT NULL,
    CIDE_CANT           T_CANTIDAD,
    CIDE_UNIDAD         T_UNIDAD,
    CIDE_LOTE           T_LOTE,
    CIDE_PRUNIT         T_MONTO,
    CIDE_DTOPORC        T_PORCENTAJE,
    CIDE_DTOMONTO       T_MONTO,
    CIDE_FACTOR         T_CANTIDAD,
    CIDE_DESC           VARCHAR(255),
    CIDE_OBS            BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CIDE_CODBAR         T_COD_ARTICULO,
    CIDE_NACIONALIZADO  T_CANTIDAD,
    CIDE_DEVUELTO       T_CANTIDAD,
    CIDE_ANULADO        T_BOOLEANO,
    CIDE_TRANSMIT       T_BOOLEANO,
    CIDE_TOTAL          T_MONTO,
    CIDE_REFERENCIA     VARCHAR(60),
    CIDE_CODPROV        T_COD_ARTICULO,
    LOTE_VENCE          DATE,
    CIDE_REEXPEDIDO     NUMERIC(18,4)
);

CREATE TABLE COMPROBANTE_DETALLE (
    ENCO_CONSEC       INTEGER NOT NULL,
    CODE_ITEM         INTEGER NOT NULL,
    CUEN_COD          VARCHAR(20) NOT NULL,
    CODE_CONCEPTO     T_CONCEPTO,
    CODE_REFER        VARCHAR(8),
    CODE_DEBITO       NUMERIC(18,2),
    CODE_CREDITO      NUMERIC(18,2),
    CODE_BASE         NUMERIC(18,2),
    CODE_PORC         PORC_CONTA,
    TERC_NIT          T_NIT,
    PROY_COD          VARCHAR(4),
    CENT_COD          VARCHAR(4),
    DOCO_VENCE        CHAR(8),
    ARTI_COD          T_COD_ARTICULO,
    CODE_TIPOAPL      INTEGER,
    CODE_TIPONUE      INTEGER,
    CONC_COD          VARCHAR(4),
    CNDE_DOCNUMERO    T_NUMFACL,
    CNDE_DOCAPLICA    VARCHAR(10),
    CODE_DESCONTABLE  T_BOOLEANO
);

CREATE TABLE COMPROBANTE_DETALLE_NIIF (
    ENCO_CONSEC       INTEGER NOT NULL,
    CODE_ITEM         INTEGER NOT NULL,
    CUEN_COD          VARCHAR(20) NOT NULL,
    CODE_CONCEPTO     T_CONCEPTO,
    CODE_REFER        VARCHAR(8),
    CODE_DEBITO       NUMERIC(18,2),
    CODE_CREDITO      NUMERIC(18,2),
    CODE_BASE         NUMERIC(18,2),
    CODE_PORC         PORC_CONTA,
    TERC_NIT          T_NIT,
    PROY_COD          VARCHAR(4),
    CENT_COD          VARCHAR(4),
    DOCO_VENCE        CHAR(8),
    ARTI_COD          T_COD_ARTICULO,
    CODE_TIPOAPL      INTEGER,
    CODE_TIPONUE      INTEGER,
    CONC_COD          VARCHAR(4),
    CNDE_DOCNUMERO    VARCHAR(10),
    CNDE_DOCAPLICA    VARCHAR(10),
    CODE_DESCONTABLE  T_BOOLEANO
);

CREATE TABLE COMPROBANTE_ENCABEZADO (
    ENCO_CONSEC       INTEGER NOT NULL,
    TICO_COD          T_TIPO_COMP NOT NULL,
    PRCO_PREF         VARCHAR(4) NOT NULL,
    ENCO_NUMERO       T_NUMDOC NOT NULL,
    ENCO_FECHA        CHAR(8) NOT NULL,
    ENCO_CONCEPTO     T_CONCEPTO,
    ENCO_REFER        VARCHAR(8),
    ENCO_TIPOREF      T_ID,
    ENCO_IDREF        T_ID,
    ENCO_USUARIO      T_USUARIO,
    TERC_NIT          T_NIT,
    ENCO_NOMTERC      T_CONCEPTO,
    ENCO_MONTO        T_MONTO,
    ENCO_DESCONTABLE  T_BOOLEANO,
    ENCO_MANDANTE     T_NIT,
    ENCO_REPNIIF      T_BOOLEANO,
    ENCO_OBS          BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
    ENCO_CONTANIIF    T_BOOLEANO
);

CREATE TABLE CONCEPTO_CONTABLE (
    CONC_COD     VARCHAR(4) NOT NULL,
    CONC_NOMBRE  VARCHAR(60)
);

CREATE TABLE CONCEPTOS (
    CONC_COD        VARCHAR(4) NOT NULL,
    CONC_NOM        VARCHAR(60) NOT NULL,
    CONC_DEBITO     CHAR(1),
    CONC_CTACIERRE  T_CTA_CONTABLE,
    CONC_ANOINI     CHAR(4),
    CONC_MESINI     INTEGER,
    CONC_ANOFIN     CHAR(4),
    CONC_MESFIN     INTEGER,
    CONC_VENCE      T_BOOLEANO
);

CREATE TABLE CONCEPTOS_CUENTAS (
    CONC_COD         VARCHAR(4) NOT NULL,
    COCU_ITEM        INTEGER NOT NULL,
    CUEN_COD         VARCHAR(20) NOT NULL,
    COCU_CUENTABASE  VARCHAR(20) NOT NULL,
    COCU_BASE        VARCHAR(4) NOT NULL,
    COCU_PORC        NUMERIC(9,2),
    COCU_MONTO       NUMERIC(18,2),
    COCU_DEBITO      CHAR(1) NOT NULL,
    TERC_NIT         T_NIT,
    PROY_COD         T_PROYECTO,
    CENT_COD         T_CENTRO
);

CREATE TABLE CONCEPTOS_CXPAGAR (
    COCX_COD        VARCHAR(8) NOT NULL,
    COCX_NOMBRE     T_CONCEPTO,
    COCX_MONTO      T_MONTO,
    COCX_IVAPORC    T_PORCENTAJE,
    COCX_RTFTEPORC  T_PORCENTAJE,
    COCX_RTIVAPORC  T_PORCENTAJE,
    COCX_RTICAPORC  T_PORCENTAJE,
    COCX_DB         T_BOOLEANO,
    COCX_BASE       T_BOOLEANO,
    COCX_VER        T_BOOLEANO,
    COCX_CTACONTA   T_CTA_CONTABLE,
    COCX_CTAIVA     T_CTA_CONTABLE,
    COCX_CTARTFTE   T_CTA_CONTABLE,
    COCX_CTARTIVA   T_CTA_CONTABLE,
    COCX_CTARTICA   T_CTA_CONTABLE,
    COCX_PREF       VARCHAR(4)
);

CREATE TABLE CONCEPTOS_FRECUENTES (
    TIDO_COD   INTEGER NOT NULL,
    COFR_ITEM  INTEGER NOT NULL,
    COFR_DESC  NOMBRE
);

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      NIT,
    CONC_MONTO        MONTO,
    CONC_CTAGAST      CTACONTA,
    CONC_DIAS         BOOLEANO,
    CONC_MODIFI       BOOLEANO,
    CONC_PROMEDIO     BOOLEANO,
    CONC_TODOSPER     BOOLEANO,
    CONC_PROV         BOOLEANO,
    CONC_PERACTUAL    BOOLEANO,
    CONC_APORTE       CHAR(1),
    CONC_APLICAPROM   BOOLEANO,
    CONC_PERPROMEDIO  INTEGER,
    CONC_OTROCONC     BOOLEANO,
    CONC_CODOTROCONC  ID,
    CONC_SALARIO      BOOLEANO,
    CONC_CTACXP       CTACONTA,
    CONC_NOMCORTO     NOMBRE,
    CONC_GTOEMPR      CHAR(1),
    CONC_CXP          CHAR(1),
    CONC_CART         CHAR(1),
    CONC_TOMSAL       INTEGER,
    CONC_BENEFIC      CHAR(1),
    CONC_ORDEN        INTEGER,
    CONC_REPOI        T_BOOLEANO,
    CONC_CTASAVP      CHAR(1),
    CONC_PPAGO        SMALLINT,
    CONC_DIASINC      BOOLEANO,
    CONC_PAGOVAC      BOOLEANO,
    CONC_ACTIVO       T_BOOLEANO,
    CONC_BASERT       T_BOOLEANO,
    CONC_BASEAP       T_BOOLEANO,
    CONC_BASEPR       T_BOOLEANO,
    CONC_BENPAG       TIPO_BENEF,
    CONC_PRESTAMO     T_BOOLEANO
);

CREATE TABLE CONCEPTOS_NOMINA_REPORTE (
    CONC_COD  T_ID NOT NULL
);

CREATE TABLE CONCEPTOS_PLANILLA (
    COPL_ID        T_ID NOT NULL,
    COPL_NOM       T_CONCEPTO,
    COPL_VALOR     T_MONTO,
    COPL_CTACONTA  T_CTA_CONTABLE,
    COPL_PORC      T_PORCENTAJE,
    COPL_REMESA    T_BOOLEANO,
    COPL_TIPOVH    T_ID,
    COPL_BASEING   T_BOOLEANO
);

CREATE TABLE CONCEPTOS_TRANSPORTE (
    COTR_ID        T_ID NOT NULL,
    COTR_NOM       T_CONCEPTO,
    COTR_VALOR     T_MONTO,
    COTR_CTACONTA  T_CTA_CONTABLE,
    COTR_PORC      T_PORCENTAJE,
    COTR_BASEING   T_BOOLEANO,
    COTR_ACTIVO    T_BOOLEANO,
    COTR_PAGO      T_BOOLEANO
);

CREATE TABLE CONCILIA_BANCO_CONTA_AUX (
    COBC_TIPO  INTEGER NOT NULL,
    COBC_ID    INTEGER NOT NULL
);

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,
    COBN_IDDOC     T_ID,
    COBN_DB        T_BOOLEANO,
    COBN_ID        T_ID NOT NULL,
    COBN_ANULADO   T_BOOLEANO,
    COBN_CLASE     CHAR(1)
);

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,
    COBD_PREFIJO  VARCHAR(4),
    COBD_NUMERO   T_NUMDOC
);

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,
    CUBA_COD          T_ID,
    COBN_ANULADO      T_BOOLEANO,
    COBN_FECINI       DATE,
    COBN_FECFIN       DATE,
    COBN_EXTRACTOINI  T_MONTO,
    COBN_EXTRACTOFIN  T_MONTO
);

CREATE TABLE CONCILIACION_OPERACIONES (
    CUBA_COD      T_ID NOT NULL,
    COOP_OPER     VARCHAR(20) NOT NULL,
    COOP_TIPODOC  T_ID,
    COOP_DB       T_BOOLEANO
);

CREATE TABLE CONCILIACION_PAT (
    CUENTAREF    T_CTA_CONTABLE NOT NULL,
    CTALOCAL     T_CTA_CONTABLE,
    CTALOCALNOM  T_NOMCTANIIF,
    CTANIIF      T_CTA_CONTABLE,
    CTANIIFNOM   T_NOMCTANIIF,
    SALDOLOCAL   T_MONTO,
    SALDONIIF    T_MONTO,
    DIFERENCIA   T_MONTO,
    PORCENTAJE   T_PORCENTAJE,
    NIVEL        T_ID
);

CREATE TABLE CONCILIACION_PAT_DET (
    COPD_ID      T_ID NOT NULL,
    COPD_CONSEC  T_ID NOT NULL,
    COPD_DB2649  T_MONTO,
    COPD_CR2649  T_MONTO,
    COPD_DBNIIF  T_MONTO,
    COPD_CRNIIF  T_MONTO,
    COPD_DIF     T_MONTO
);

CREATE TABLE CONDUCTOR (
    TERC_NIT        T_NIT NOT NULL,
    COND_FECHA      FECHA NOT NULL,
    COND_LICENCIA   NIT,
    COND_VENCE      FECHA,
    COND_CATEGORIA  T_NIT
);

CREATE TABLE CONFIGURA_CERTRETE (
    CFCR_CUENTA   T_CTA_CONTABLE NOT NULL,
    CFCR_ITEM     T_ID NOT NULL,
    CFCR_CTABASE  T_CTA_CONTABLE,
    CFCR_BASE     CHAR(1)
);

CREATE TABLE CONFIGURA_CERTRETEL (
    COCR_RENGLON  T_ID NOT NULL,
    COCR_NOMBRE   T_CONCEPTO
);

CREATE TABLE CONFIGURA_CERTRETEL_CONC (
    COCR_RENGLON  T_ID NOT NULL,
    CCRC_ITEM     T_ID NOT NULL,
    CCRC_CONC     T_ID,
    CCRC_SUMA     T_BOOLEANO
);

CREATE TABLE CONFIGURA_LINKFTP (
    CFLK_CODFAMI     T_GRUPO,
    SUCU_ID          INTEGER,
    CFLK_SERVER      NOMBRE,
    CFLK_USUARIO     NOMBRE,
    CFLK_CLAVE       NOMBRE,
    CFLK_CODCASA     NIT,
    CFLK_UBICADOC    NOMBRE,
    CFLK_CODPARTNER  NIT,
    CFLK_DIAS        T_ID,
    CFLK_PUERTO      ID
);

CREATE TABLE CONFIGURA_MEDIOSMAG (
    COME_ITEM         INTEGER NOT NULL,
    COME_DESCRIPCION  VARCHAR(60),
    COME_RESPUESTA    VARCHAR(30),
    COME_CUENTA       T_CTA_CONTABLE,
    COME_FORMATO      T_ID,
    COME_MINIMO       T_MONTO,
    COME_NATUR        CHAR(1)
);

CREATE TABLE CONFIGURA_POS (
    CFGP_ID         T_ID NOT NULL,
    CFGP_PROPIEDAD  VARCHAR(100),
    CFGP_VALOR      VARCHAR(30),
    CFGP_RTAS       VARCHAR(100)
);

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,
    COTV_DBTIENDA    VARCHAR(100)
);

CREATE TABLE CONFIGURACION (
    CONF_MODULO     VARCHAR(20) NOT NULL,
    CONF_CATEGORIA  VARCHAR(20) NOT NULL,
    CONF_PROPIEDAD  VARCHAR(100) NOT NULL,
    CONF_VALOR      VARCHAR(100),
    CONF_POSIBLES   VARCHAR(250),
    CONF_AYUDA      VARCHAR(250)
);

CREATE TABLE CONFIGURACION_HORAS_EMPLEADO (
    TERC_NIT       VARCHAR(20) NOT NULL,
    NUHO_ENTRADA   TIME,
    NUHO_SALIDA    TIME,
    NUHO_DIAEXTRA  TIME
);

CREATE TABLE CONFIRMACION_DEPOSITO (
    SLIM_ID         ID NOT NULL,
    OREM_ID         ID NOT NULL,
    CODE_ID         INTEGER NOT NULL,
    CODE_FEC        DATE,
    CODE_VALOR      NUMERIC(18,2),
    TERC_NIT        NIT NOT NULL,
    CODE_NUMERO     T_NUMDOC,
    PREF_PRE        PREFIJO,
    CODE_VALORMON   MONTO,
    TACA_MONTO      MONTO,
    TIMO_COD        INTEGER,
    CODE_CONSOLIDA  INTEGER,
    CODE_ORDEMBAR   VARCHAR(10)
);

CREATE TABLE CONSIGNA (
    CONS_ID        INTEGER NOT NULL,
    CUBA_COD       INTEGER NOT NULL,
    PRBA_PREF      VARCHAR(4) NOT NULL,
    CONS_NUMERO    VARCHAR(8) NOT NULL,
    CONS_FECHA     DATE NOT NULL,
    CONS_CONCEPTO  VARCHAR(60),
    CONS_ANULADO   T_BOOLEANO,
    CONS_TRANSMIT  T_BOOLEANO,
    CONS_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N',
    CONS_PREFRDC   VARCHAR(4)
);

CREATE TABLE CONSIGNA_DETALLE (
    CONS_ID        INTEGER NOT NULL,
    CODE_ITEM2     INTEGER NOT NULL,
    FOPA_ID        T_ID NOT NULL,
    CODE_BANCO     CHAR(2),
    CODE_CUENTA    VARCHAR(20),
    CODE_NUMERO    VARCHAR(20),
    CODE_FECHA     DATE,
    CODE_MONTO     NUMERIC(18,2),
    CODE_ANULADO   T_BOOLEANO,
    CODE_TRANSMIT  T_BOOLEANO,
    CODE_DEVUELTO  T_BOOLEANO,
    CAJA_ID        T_ID
);

CREATE TABLE CONSIGNA_RECIBOS (
    CONS_ID        T_ID NOT NULL,
    COND_ITEM      T_ID NOT NULL,
    COND_RECID     T_ID,
    COND_NIT       T_NIT,
    COND_SUCURSAL  VARCHAR(10),
    COND_BANCO     CHAR(2),
    COND_CUENTA    VARCHAR(20),
    COND_NUMERO    VARCHAR(20),
    COND_PREFRDC   VARCHAR(4),
    COND_NUMRDC    T_NUMDOC,
    CAJA_ID        T_ID,
    COND_MONTO     T_MONTO,
    COND_DESCTO    T_MONTO,
    COND_RTFTE     T_MONTO,
    COND_RTIVA     T_MONTO,
    COND_RTICA     T_MONTO,
    COND_EXEDENTE  T_MONTO,
    COND_TIPODOC   T_ID,
    COND_IDDOC     T_ID,
    COND_PREFDOC   VARCHAR(4),
    COND_NUMDOC    T_NUMDOC,
    COND_DEVUELTO  CHAR(1),
    COND_ANULADO   T_BOOLEANO,
    COND_TRANSMIT  T_BOOLEANO,
    COND_COMIP     VARCHAR(2),
    COND_COBR      INTEGER,
    FOPA_ID        T_ID,
    COND_OBS       VARCHAR(255),
    COND_RCREE     T_MONTO
);

CREATE TABLE CONSIGNA_TARJETAS (
    COTJ_ID        T_ID NOT NULL,
    COTJ_NUMERO    T_NUMDOC NOT NULL,
    COTJ_FECHA     DATE NOT NULL,
    COTJ_CHEQUE    T_BOOLEANO,
    PREF_PRE       VARCHAR(4),
    COTJ_ANULADO   T_BOOLEANO,
    COTJ_TRANSMIT  T_BOOLEANO,
    CAJA_ID        INTEGER,
    CUBA_COD       INTEGER,
    COTJ_MONTO     T_MONTO,
    COTJ_RTFTE     T_MONTO,
    COTJ_COMISION  T_MONTO,
    COTJ_CONCEPTO  T_CONCEPTO,
    COTJ_RTIVA     T_MONTO,
    COTJ_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TERC_NIT       T_NIT,
    COTJ_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N',
    COTJ_RTICA     T_MONTO
);

CREATE TABLE CONSIGNA_TARJETAS_DET (
    COTJ_ID          T_ID NOT NULL,
    CTJD_ITEM        T_ID NOT NULL,
    TARJ_COD         VARCHAR(3),
    CTJD_NROTJ       VARCHAR(20) NOT NULL,
    CTJD_COMPROB     VARCHAR(20) NOT NULL,
    CTJD_BASE        T_MONTO,
    CTJD_IVA         T_MONTO,
    CTJD_COMIPORC    T_PORCENTAJE,
    CTJD_COMIIVA     T_BOOLEANO,
    CTJD_COMIMONTO   T_MONTO,
    CTJD_RTFTEPORC   T_PORCENTAJE,
    CTJD_RTFTEMONTO  T_MONTO,
    CTJD_RTIVAPOC    T_PORCENTAJE,
    CTJD_RTIVAMONTO  T_MONTO,
    CTJD_ANULADO     T_BOOLEANO,
    CTJD_TRANSMIT    T_BOOLEANO,
    FOPA_ID          INTEGER,
    CTJD_RTICAPORC   T_PORCENTAJE,
    CTJD_RTCAMONTO   T_MONTO
);

CREATE TABLE CONSOLIDADO_FALTANTES (
    COFA_ITEM     T_ID NOT NULL,
    COFA_ID       INTEGER NOT NULL,
    COFA_TIPODES  INTEGER,
    COFA_TIPOORI  INTEGER,
    COFA_IDORI    T_ID,
    COFA_IDDES    T_ID,
    ARTI_COD      T_COD_ARTICULO,
    COFA_CANT     T_CANTIDAD,
    COFA_ITEMORI  INTEGER,
    COFA_OK       T_BOOLEANO,
    COFA_CODBAR   T_COD_ARTICULO,
    COFA_FACTOR   T_CANTIDAD,
    COFA_UNIDAD   VARCHAR(8),
    COFA_PRUNIT   T_MONTO,
    COFA_DESCITE  T_CONCEPTO,
    COFA_BODEGA   VARCHAR(2),
    COFA_DTOITE   T_PORCENTAJE,
    COFA_LOTE     T_LOTE,
    LOTE_VENCE    DATE,
    COFA_LISTA    INTEGER,
    CODE_OBSIT    BLOB SUB_TYPE 1 SEGMENT SIZE 8192,
    CODE_REF      T_CONCEPTO,
    COFA_CANTCR   T_CANTIDAD,
    COFA_FECDES   FECHA
);

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),
    CONO_PERIODICIDAD  INTEGER,
    CONO_DEDUC         BOOLEANO,
    CONO_PROV          BOOLEANO,
    CONO_APORTE        BOOLEANO,
    CONO_GTOEMPR       BOOLEANO,
    CONO_DEB           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),
    COPO_PERIODICIDAD  INTEGER,
    COPO_DEDUC         BOOLEANO,
    COPO_PROV          BOOLEANO,
    COPO_APORTE        BOOLEANO,
    COPO_GTOEMPR       BOOLEANO
);

CREATE TABLE CONSOLIDE_DOCS (
    CODO_ITEM     T_ID NOT NULL,
    CODO_ID       INTEGER NOT NULL,
    CODO_TIPODES  INTEGER,
    CODO_TIPOORI  INTEGER,
    CODO_IDORI    T_ID,
    CODO_IDDES    T_ID,
    ARTI_COD      T_COD_ARTICULO,
    CODO_CANT     T_CANTIDAD,
    CODO_ITEMORI  INTEGER
);

CREATE TABLE CONSOLIDE_FALTANTES (
    CEFA_ID       T_ID,
    CEFA_ITEM     T_ID,
    CEFA_TIPODES  INTEGER,
    CEFA_TIPOORI  INTEGER,
    CEFA_IDORI    T_ID
);

CREATE TABLE CONSOLIDE_FORMASP (
    COFP_ID    T_ID NOT NULL,
    COFP_ITEM  T_ID NOT NULL,
    FOPA_ID    T_ID,
    COFP_BCO   VARCHAR(2),
    COFP_CTA   VARCHAR(20),
    COFP_NUM   VARCHAR(20)
);

CREATE TABLE CONSOLIDE_NOMINAS (
    CONN_ID     T_ID NOT NULL,
    CONN_ITEM   T_ID NOT NULL,
    CONN_NOMID  T_ID
);

CREATE TABLE CONSULTA_BALANCE (
    COBA_ANO  CHAR(4) NOT NULL,
    COBA_MES  INTEGER NOT NULL,
    CUENTA    T_CTA_CONTABLE NOT NULL,
    INICIAL   T_MONTO,
    DEBITOS   T_MONTO,
    CREDITOS  T_MONTO
);

CREATE TABLE CONSULTA_WEB (
    COWE_TIME  TIMESTAMP
);

CREATE TABLE CONSUMO_DETALLE (
    CONS_ID        T_ID NOT NULL,
    CNDE_ITEM      T_ID NOT NULL,
    ARTI_COD       T_COD_ARTICULO,
    CNDE_CANT      T_CANTIDAD,
    CNDE_UNIDAD    VARCHAR(8),
    CNDE_FACTOR    T_CANTIDAD,
    CNDE_PRUNIT    T_MONTO,
    CNDE_DTOPORC   T_PORCENTAJE,
    CNDE_DTOMONTO  T_MONTO,
    CNDE_TOTAL     T_MONTO,
    CNDE_ANULADO   T_BOOLEANO,
    CNDE_TRANSMIT  T_BOOLEANO,
    CNDE_IVAPORC   T_PORCENTAJE,
    CNDE_IVAMONTO  T_MONTO,
    CNDE_CODBAR    T_COD_ARTICULO,
    CNDE_DESC      T_CONCEPTO,
    CNDE_CONSUMO   T_MONTO,
    LIPR_COD       INTEGER,
    BODE_COD       VARCHAR(2)
);

CREATE TABLE CONSUMOS (
    CONS_ID         T_ID NOT NULL,
    PUES_COD        T_ID NOT NULL,
    CONS_FECHA      DATE,
    VEHI_COD        VARCHAR(8) NOT NULL,
    TERC_NIT        T_NIT,
    CONS_ANULADO    T_BOOLEANO,
    CONS_TRANSMIT   T_BOOLEANO,
    CONS_NOMTERC    VARCHAR(60),
    VEND_COD        INTEGER,
    CONS_CONC       T_CONCEPTO,
    CONS_LIQUIDADO  T_BOOLEANO,
    BODE_COD        VARCHAR(2),
    PREF_PRE        VARCHAR(4),
    CONS_NUMERO     T_NUMDOC,
    CONS_USUARIO    T_USUARIO,
    NUMOK           T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE CONTABIL_ARTICULO (
    ARTI_COD        T_COD_ARTICULO NOT NULL,
    COAR_CTAINV     T_CTA_CONTABLE,
    COAR_CTAIVAC    T_CTA_CONTABLE,
    COAR_CTAIVAV    T_CTA_CONTABLE,
    COAR_CTACONS    T_CTA_CONTABLE,
    COAR_CTAVNT     T_CTA_CONTABLE,
    COAR_CTACOS     T_CTA_CONTABLE,
    COAR_CTACOMP    T_CTA_CONTABLE,
    COAR_CTADEV     T_CTA_CONTABLE,
    COAR_CTARTFTE   T_CTA_CONTABLE,
    COAR_CTARTICA   T_CTA_CONTABLE,
    COAR_CTARTFTEV  T_CTA_CONTABLE,
    COAR_CTARTICAV  T_CTA_CONTABLE,
    COAR_RTFTE      T_PORCENTAJE,
    COAR_RTBASE     T_MONTO,
    COAR_CTAIVADEC  T_CTA_CONTABLE,
    COAR_CTARTCREE  T_CTA_CONTABLE,
    COAR_RTCREE     T_PORCENTAJE,
    COAR_RTICA      T_PORCENTAJE,
    COAR_CTAIVADV   T_CTA_CONTABLE,
    COAR_CTAIVADC   T_CTA_CONTABLE
);

CREATE TABLE CONTABIL_ARTICULO_NIIF (
    ARTI_COD        T_COD_ARTICULO NOT NULL,
    COAR_CTAINV     T_CTA_CONTABLE,
    COAR_CTAIVAC    T_CTA_CONTABLE,
    COAR_CTAIVAV    T_CTA_CONTABLE,
    COAR_CTACONS    T_CTA_CONTABLE,
    COAR_CTAVNT     T_CTA_CONTABLE,
    COAR_CTACOS     T_CTA_CONTABLE,
    COAR_CTACOMP    T_CTA_CONTABLE,
    COAR_CTADEV     T_CTA_CONTABLE,
    COAR_CTARTFTE   T_CTA_CONTABLE,
    COAR_CTARTICA   T_CTA_CONTABLE,
    COAR_CTARTFTEV  T_CTA_CONTABLE,
    COAR_CTARTICAV  T_CTA_CONTABLE,
    COAR_RTFTE      T_PORCENTAJE,
    COAR_RTBASE     T_MONTO,
    COAR_CTAIVADEC  T_CTA_CONTABLE,
    COAR_CTARTCREE  T_CTA_CONTABLE,
    COAR_RTCREE     T_PORCENTAJE,
    COAR_RTICA      T_PORCENTAJE,
    COAR_CTAIVADV   T_CTA_CONTABLE,
    COAR_CTAIVADC   T_CTA_CONTABLE
);

CREATE TABLE CONTABILIZACION (
    CNTB_ID         T_ID NOT NULL,
    CNTB_TIPOREF    T_NUMDOC NOT NULL,
    CNTB_IDREF      T_ID NOT NULL,
    CNTB_PREFREF    VARCHAR(4) NOT NULL,
    CNTB_NUMREF     T_NUMDOC NOT NULL,
    CNTB_FECHA      CHAR(8),
    CNTB_TIPOCOMP   T_TIPO_COMP,
    CNTB_PREFCNT    VARCHAR(4),
    CNTB_REF        VARCHAR(20),
    CNTB_CONCEPTO   T_CONCEPTO,
    CNTB_NUMERO     T_NUMDOC,
    CNTB_PROCESADO  T_BOOLEANO
);

CREATE TABLE CONTABILIZACION_DET (
    CNTB_ID          T_ID NOT NULL,
    CNDE_ITEM        T_ID NOT NULL,
    CNDE_CUENTA      T_CTA_CONTABLE,
    CNDE_TERC        T_NIT,
    CNDE_PROY        VARCHAR(4),
    CNDE_CENTRO      T_CENTRO,
    CNDE_CONC        VARCHAR(60),
    CNDE_BASE        T_MONTO,
    CNDE_PORC        T_PORCENTAJE,
    CNDE_DEBITOS     T_MONTO,
    CNDE_CREDITOS    T_MONTO,
    CNDE_REF         VARCHAR(8),
    CNDE_DOCVENCE    T_FECHA,
    CNDE_DOCTIPON    INTEGER,
    CNDE_DOCTIPOA    INTEGER,
    CNDE_CONCOD      VARCHAR(4),
    CNDE_ARTICULO    T_COD_ARTICULO,
    CNDE_DOCNUMERO   VARCHAR(10),
    CNDE_DOCAPLICAR  VARCHAR(10)
);

CREATE TABLE CONTRATOS_COLEGIOS (
    CNCL_ID          T_ID NOT NULL,
    CNCL_NUMERO      T_NUMDOC,
    CNCL_FECHA       FECHA,
    CNCL_PADRE       T_NIT,
    CNCL_NOMBRE      T_CONCEPTO,
    CNCL_ESTUDIANTE  ESTUDIANTE,
    CNCL_RUTA1       T_ID,
    CNCL_VALOR       T_MONTO,
    CNCL_RUTA2       T_ID,
    CNCL_PORC2       T_PORCENTAJE,
    CNCL_ACTIVO      T_BOOLEANO,
    CNCL_OBS         OBSERVACIONT
);

CREATE TABLE CORREDOR_RUTA (
    CORU_ID        T_ID NOT NULL,
    CORU_NOMBRE    T_CONCEPTO,
    CORU_PLANILLA  T_MONTO
);

CREATE TABLE COSTO_FACTURA (
    FECHA     DATE NOT NULL,
    ARTICULO  T_COD_ARTICULO NOT NULL,
    COSTO     T_MONTO
);

CREATE TABLE COSTO_VENTAS (
    ARTI_COD   T_COD_ARTICULO,
    CANT       T_CANTIDAD,
    COSTO      T_MONTO,
    CTACOS     T_CTA_CONTABLE,
    CTAINV     T_CTA_CONTABLE,
    COVE_ID    T_ID NOT NULL,
    TIDO_COD   INTEGER NOT NULL,
    COVE_ITEM  T_ID NOT NULL
);

CREATE TABLE COSTO_VENTAS_NIIF (
    ARTI_COD   T_COD_ARTICULO,
    CANT       T_CANTIDAD,
    COSTO      T_MONTO,
    CTACOS     T_CTA_CONTABLE,
    CTAINV     T_CTA_CONTABLE,
    COVE_ID    T_ID NOT NULL,
    TIDO_COD   INTEGER NOT NULL,
    COVE_ITEM  T_ID NOT NULL
);

CREATE TABLE COSTOS (
    ARTI_COD     T_COD_ARTICULO NOT NULL,
    COST_FECHA   DATE NOT NULL,
    COST_ENTC    T_CANTIDAD,
    COST_ENTP    T_MONTO,
    COST_SALC    T_CANTIDAD,
    COST_SALP    T_MONTO,
    COST_SALDOC  T_CANTIDAD,
    COST_SALDOP  T_MONTO,
    COST_ULTIMO  T_MONTO,
    COST_ITEM    INTEGER NOT NULL,
    COST_IDMOV   INTEGER,
    COST_TIPO    INTEGER
);

CREATE TABLE COSTOS_NIIF (
    ARTI_COD     T_COD_ARTICULO NOT NULL,
    COST_FECHA   DATE NOT NULL,
    COST_ENTC    T_CANTIDAD,
    COST_ENTP    T_MONTO,
    COST_SALC    T_CANTIDAD,
    COST_SALP    T_MONTO,
    COST_SALDOC  T_CANTIDAD,
    COST_SALDOP  T_MONTO,
    COST_ULTIMO  T_MONTO,
    COST_ITEM    INTEGER NOT NULL,
    COST_IDMOV   INTEGER,
    COST_TIPO    INTEGER
);

CREATE TABLE COTIZACION_PROVEEDOR (
    COPR_ID         T_ID NOT NULL,
    COPR_NUMERO     T_NUMDOC NOT NULL,
    TERC_NIT        T_NIT NOT NULL,
    TIDO_COD        INTEGER NOT NULL,
    PREF_PRE        VARCHAR(4) NOT NULL,
    BODE_COD        VARCHAR(2) NOT NULL,
    COPR_FECHA      DATE NOT NULL,
    COPR_VALIDEZ    INTEGER,
    COPR_CONC       VARCHAR(60),
    COPR_OBS        BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    COPR_DTOPORC    T_PORCENTAJE,
    COPR_DTOMONTO   T_MONTO,
    COPR_ADICIONAL  T_MONTO,
    COPR_IVAMONTO   T_MONTO,
    COPR_EXTRA      T_MONTO,
    COPR_TOTAL      T_MONTO,
    COPR_IMPTOS     T_BOOLEANO,
    COPR_ANULADO    T_BOOLEANO,
    COPR_TRANSMIT   T_BOOLEANO,
    COPR_NROCOPIA   INTEGER,
    COPR_USUARIO    T_USUARIO,
    NUMOK           T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE COTIZACION_WEB (
    COWE_ID         T_ID NOT NULL,
    COWE_FECHA      FECHA,
    TERC_NIT        T_NIT,
    COWE_SUCURSAL   VARCHAR(10),
    COWE_OBS        BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    COWE_ENTREGA    FECHA,
    COWE_DIAS       INTEGER,
    VEND_COD        T_ID,
    COWE_DTOPORC    T_PORCENTAJE,
    COWE_ADICIONAL  T_MONTO,
    COWE_EXTRA      T_MONTO,
    COWE_IVAMONTO   T_MONTO,
    COWE_TOTAL      T_MONTO,
    COWE_PREF       VARCHAR(4),
    COWE_DTOMONTO   T_MONTO,
    COWE_NUMPED     VARCHAR(10)
);

CREATE TABLE COTIZACION_WEB_DETALLE (
    COWE_ID          T_ID NOT NULL,
    COWD_ITEM        T_ID NOT NULL,
    ARTI_COD         T_COD_ARTICULO,
    COWD_CODBAR      T_COD_ARTICULO,
    COWD_CANT        T_CANTIDAD,
    COWD_UNIDAD      T_UNIDAD,
    COWD_FACTOR      T_CANTIDAD,
    LIPR_COD         T_ID,
    COWD_PRUNIT      T_MONTO,
    COWD_DTOP        T_PORCENTAJE,
    COWD_IVAP        T_PORCENTAJE,
    COWD_IVAMONTO    T_MONTO,
    COWD_CONSUMO     T_MONTO,
    COWD_TOTAL       T_MONTO,
    COWD_REFERENCIA  T_CONCEPTO,
    COWD_DTOM        T_MONTO,
    COWD_DESC        T_CONCEPTO
);

CREATE TABLE COTIZACIONES (
    COTI_ID         T_ID NOT NULL,
    TERC_NIT        T_NIT NOT NULL,
    VEND_COD        T_ID NOT NULL,
    TIDO_COD        INTEGER NOT NULL,
    PREF_PRE        VARCHAR(4) NOT NULL,
    COTI_NUMERO     T_NUMDOC NOT NULL,
    COTI_FECHA      DATE NOT NULL,
    COTI_VALIDEZ    INTEGER,
    COTI_OBS        BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    COTI_DTOPORC    T_PORCENTAJE,
    COTI_DTOMONTO   T_MONTO,
    COTI_ADICIONAL  T_MONTO,
    COTI_IVAMONTO   T_MONTO,
    COTI_EXTRA      T_MONTO,
    COTI_TOTAL      T_MONTO,
    COTI_IMPTOS     T_BOOLEANO,
    COTI_NOMTERC    VARCHAR(60),
    PTVT_ID         T_ID,
    COTI_ANULADO    T_BOOLEANO,
    COTI_TRANSMIT   T_BOOLEANO,
    COTI_NROCOPIA   INTEGER,
    COTI_USUARIO    T_USUARIO,
    COTI_SUCURSAL   VARCHAR(10),
    NUMOK           T_BOOLEANO DEFAULT 'N',
    COTI_FACTOR     DOUBLE PRECISION,
    COTI_TRM        T_MONTO,
    COTI_REMISION   T_CONCEPTO,
    COTI_CONSOLIDA  T_ID,
    COTI_ORDENC     VARCHAR(20)
);

CREATE TABLE COTIZACIONES_DETALLE (
    COTI_ID           T_ID NOT NULL,
    CTDE_ITEM         T_ID NOT NULL,
    ARTI_COD          T_COD_ARTICULO NOT NULL,
    CTDE_CANT         T_CANTIDAD,
    CTDE_UNIDAD       T_UNIDAD,
    CTDE_PRUNIT       T_MONTO,
    CTDE_DTOPORC      T_PORCENTAJE,
    CTDE_DTOMONTO     T_MONTO,
    CTDE_IVAPORC      T_PORCENTAJE,
    CTDE_IVAMONTO     T_MONTO,
    CTDE_CONSUMO      T_MONTO,
    CTDE_FACTOR       T_CANTIDAD,
    CTDE_DESC         VARCHAR(255),
    CTDE_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CTDE_CODBAR       T_COD_ARTICULO,
    CTDE_PEDIDO       T_CANTIDAD,
    CTDE_FACTURADO    T_CANTIDAD,
    CTDE_TOTAL        T_MONTO,
    CTDE_ANULADO      T_BOOLEANO,
    CTDE_TRANSMIT     T_BOOLEANO,
    LIPR_COD          INTEGER,
    CTDE_REFERENCIA   VARCHAR(60),
    CTDE_REMISIONADO  T_CANTIDAD,
    CTDE_TIVA         SMALLINT
);

CREATE TABLE COTIZACIONES_PROVEEDOR_DET (
    COPR_ID           T_ID NOT NULL,
    CPRD_ITEM         T_ID NOT NULL,
    ARTI_COD          T_COD_ARTICULO NOT NULL,
    BODE_COD          VARCHAR(2) NOT NULL,
    CPRD_CANT         T_CANTIDAD,
    CPRD_UNIDAD       T_UNIDAD,
    CPRD_PRUNIT       T_MONTO,
    CPRD_DTOPORC      T_PORCENTAJE,
    CPRD_DTOMONTO     T_MONTO,
    CPRD_FACTOR       T_CANTIDAD,
    CPRD_DESC         VARCHAR(60),
    CPRD_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CPRD_IVAPORC      T_PORCENTAJE,
    CPRD_IVAMONTO     T_MONTO,
    CPRD_CONSUMO      T_MONTO,
    CPRD_CODBAR       T_COD_ARTICULO,
    CPRD_FACTURADO    T_CANTIDAD,
    CPRD_ORDENADO     T_CANTIDAD,
    CPRD_REMISIONADO  T_CANTIDAD,
    CPRD_TOTAL        T_MONTO,
    CPRD_ANULADO      T_BOOLEANO,
    CPRD_TRANSMIT     T_BOOLEANO,
    CPRD_CODPROV      T_COD_ARTICULO
);

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,
    CRAC_ASESOR       T_ID
);

CREATE TABLE CRM_AGRUPACION (
    CRAG_ID      T_ID NOT NULL,
    CRAG_NOMBRE  T_CONCEPTO
);

CREATE TABLE CRM_ASESOR (
    CRAS_ID      T_ID NOT NULL,
    CRAS_NOMBRE  T_CONCEPTO NOT NULL,
    CRAS_ACTIVO  T_BOOLEANO
);

CREATE TABLE CRM_CAMPANA (
    CRCM_ID           T_ID NOT NULL,
    CRCM_NOMBRE       T_CONCEPTO,
    CRCM_FECINI       DATE,
    CRCM_FECFIN       DATE,
    CRCM_ANULADO      T_BOOLEANO,
    CRCM_USUARIO      T_USUARIO,
    CRCM_FECHA        DATE,
    CRCM_OBS          BLOB SUB_TYPE 1 SEGMENT SIZE 8192,
    CRCM_ASESOR       T_ID,
    CRCM_TIPOEVEN     T_ID,
    CRCM_DURACION     SMALLINT,
    CRCM_HORAINI1     TIME,
    CRCM_HORAFIN1     TIME,
    CRCM_HORAINI2     TIME,
    CRCM_HORAFIN2     TIME,
    CRCM_DIAS         SMALLINT,
    CRCM_ABIERTA      T_BOOLEANO,
    CRCM_COMPROMISOS  T_BOOLEANO
);

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,
    CRCD_ASESOR      T_ID,
    CRCD_HORACONTAC  TIME
);

CREATE TABLE CRM_CAMPANA_MOTIVOS (
    CRCM_ID    T_ID NOT NULL,
    CRMO_ITEM  T_ID NOT NULL,
    CREM_ID    T_ID NOT NULL
);

CREATE TABLE CRM_CAMPANA_PLANILLA (
    CRCP_ID        T_ID NOT NULL,
    CRCP_TIPOCOMP  T_ID,
    CRCP_OBS       VARCHAR(255),
    CRCP_DIAS      SMALLINT,
    CRCP_ITEM      T_ID NOT NULL,
    CRCP_DURACION  SMALLINT,
    CRCP_HORAINI   TIME,
    CRCP_ASESOR    T_ID
);

CREATE TABLE CRM_CAMPANA_RESPUESTAS (
    CRCM_ID    T_ID NOT NULL,
    CRCR_ITEM  T_ID NOT NULL,
    CRER_ID    T_ID NOT NULL
);

CREATE TABLE CRM_CARGOS (
    CRCG_ID      T_ID NOT NULL,
    CRCG_NOMBRE  T_CONCEPTO NOT NULL
);

CREATE TABLE CRM_CLASE (
    CRCL_ID      T_NIT NOT NULL,
    CRCL_NOMBRE  T_CONCEPTO
);

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,
    CRCL_ESTADO     T_ID,
    CRCL_CLASE      T_ID,
    CRCL_AGRUPA     T_ID,
    CRCL_CALIFICA   CALIFICA,
    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,
    CRCL_ESTERCERO  T_BOOLEANO,
    CRCL_PAIS       CHAR(3),
    CRCL_REPLICA    T_BOOLEANO,
    CRCL_CHECK1     T_BOOLEANO,
    CRCL_CHECK2     T_BOOLEANO,
    CRCL_CHECK3     T_BOOLEANO,
    CRCL_CHECK4     T_BOOLEANO,
    CRCL_CHECK5     T_BOOLEANO,
    CRCL_CHECK6     T_BOOLEANO,
    CRCL_NITCNT     T_NIT,
    ZONA_COD        VARCHAR(2),
    VEND_COD        T_ID,
    COBR_COD        T_ID,
    GRCA_COD        T_ID,
    CRCL_MAILCART   VARCHAR(100)
);

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,
    CRCO_CUMPLIDO   T_BOOLEANO,
    CRCO_HORAAVISO  TIME,
    CRCO_CONTACTO   T_ID,
    CRCO_ANULADO    T_BOOLEANO,
    CRCO_PRIORIDAD  CHAR(1),
    CRCO_FECREG     DATE,
    CRCO_USUARIO    T_USUARIO,
    CRCO_IDDOC      T_ID,
    CRCO_TIPODOC    T_ID,
    CRCM_ID         T_ID
);

CREATE TABLE CRM_CONTACTOS (
    CRCL_NIT        T_NIT NOT NULL,
    CRCO_ID         T_ID NOT NULL,
    CRCO_NOMBRE     T_CONCEPTO,
    CRCO_CARGO      T_CONCEPTO,
    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,
    CRCO_REPLICA    T_BOOLEANO
);

CREATE TABLE CRM_ESTADO (
    CRES_ID      T_ID NOT NULL,
    CRES_NOMBRE  T_CONCEPTO NOT NULL,
    CRES_COLOR   VARCHAR(30)
);

CREATE TABLE CRM_EVENTO_MOTIVO (
    CREM_ID       T_ID NOT NULL,
    CREM_NOMBRE   T_CONCEPTO,
    CREM_ACTIVO   T_BOOLEANO,
    CREM_GENERAL  T_BOOLEANO
);

CREATE TABLE CRM_EVENTO_RESPUESTA (
    CRER_ID       T_ID NOT NULL,
    CRER_NOMBRE   T_CONCEPTO,
    CRER_COLOR    VARCHAR(30),
    CRER_GENERAL  T_BOOLEANO,
    CRER_ACTIVO   T_BOOLEANO,
    CRER_MOTIVO   T_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(512),
    CREV_OBS        BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CREV_ACTIVIDAD  T_ID,
    CRCL_NIT        T_NIT,
    CRCL_CONTACTO   T_ID,
    CREV_ANULADO    T_BOOLEANO,
    CREV_ORIGEN     T_ID,
    CRCM_ID         T_ID,
    EVEN_PREF       T_PREFIJO,
    EVEN_NUMERO     T_NUMDOC,
    CREV_MINTOT     ENTERO,
    CREV_MINFAC     ENTERO
);

CREATE TABLE CRM_EVENTOS_NOTAS (
    CREV_ID         T_ID NOT NULL,
    CEVN_NOTA       T_ID NOT NULL,
    CEVN_FECHA      FECHA,
    CEVN_HORA       HORA,
    CEVN_ASESOR     T_ID,
    CEVN_TEXTO      BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CEVN_NOMARCH    OBSERVACIONT,
    CEVN_ARCHIVO    BLOB SUB_TYPE 0 SEGMENT SIZE 8192,
    CEVN_RESPUESTA  T_ID,
    CEVN_MINTOT     ENTERO,
    CEVN_MINFAC     ENTERO,
    CEVN_ANULADO    T_BOOLEANO
);

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,
    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
);

CREATE TABLE CRM_TIPO_ACTIVIDAD (
    CRTA_ID      T_ID NOT NULL,
    CRTA_NOMBRE  T_CONCEPTO NOT NULL
);

CREATE TABLE CRM_TIPOCONTACTO (
    CRTC_ID      T_ID NOT NULL,
    CRTC_NOMBRE  T_CONCEPTO NOT NULL
);

CREATE TABLE CRM_TIPOEVENTO (
    CRTE_ID       T_ID NOT NULL,
    CRTE_NOMBRE   T_CONCEPTO,
    CRTE_INTERNO  T_BOOLEANO
);

CREATE TABLE CRM_TIPORELACION (
    CRTR_ID      T_ID NOT NULL,
    CRTR_NOMBRE  T_CONCEPTO NOT NULL
);

CREATE TABLE CUENTAS (
    CUEN_COD           VARCHAR(20) NOT NULL,
    CUEN_NOM           VARCHAR(60) NOT NULL,
    CUEN_TERCERO       CHAR(1) NOT NULL,
    CUEN_CENTRO        CHAR(1) NOT NULL,
    CUEN_RETENCION     CHAR(1) NOT NULL,
    CUEN_CTAJUSTE      T_CTA_CONTABLE,
    CUEN_CTACORRECION  T_CTA_CONTABLE,
    CUEN_BASEMIN       T_MONTO,
    CUEN_PORC          T_PORCENTAJE,
    CUEN_AJUSDB        T_BOOLEANO,
    CUEN_TIPO          CHAR(1) NOT NULL,
    CUEN_ACTIVA        T_BOOLEANO,
    CUEN_AFECTABLE     T_BOOLEANO,
    CUEN_EQNIIF        T_CTA_CONTABLE
);

CREATE TABLE CUENTAS_BANCO (
    CUBA_COD       INTEGER NOT NULL,
    BANC_COD       INTEGER NOT NULL,
    CUBA_CODCTA    VARCHAR(3) NOT NULL,
    CUBA_NUMERO    VARCHAR(20) NOT NULL,
    CUBA_TITULAR   VARCHAR(60) NOT NULL,
    CUBA_SUCURSAL  VARCHAR(60),
    CUBA_CTACONTA  VARCHAR(20),
    CUBA_GMFPOR    T_PORCENTAJE,
    CUBA_CTAGMF    T_CTA_CONTABLE,
    CUBA_CTAIVA    T_CTA_CONTABLE,
    CUBA_ESTADO    T_BOOLEANO,
    SUCU_ID        T_ID,
    CUBA_CTANIIF   T_CTA_CONTABLE,
    CUBA_CTAGMFN   T_CTA_CONTABLE,
    CUBA_CTAIVAN   T_CTA_CONTABLE
);

CREATE TABLE CUENTAS_EXPORTACION (
    CUEN_COD  T_CTA_CONTABLE,
    CUEX_COD  T_CTA_CONTABLE
);

CREATE TABLE CUENTAS_NIIF (
    CUEN_COD        VARCHAR(20) NOT NULL,
    CUEN_NOM        VARCHAR(140) NOT NULL,
    CUEN_TERCERO    CHAR(1) NOT NULL,
    CUEN_CENTRO     CHAR(1) NOT NULL,
    CUEN_RETENCION  CHAR(1) NOT NULL,
    CUEN_BASEMIN    T_MONTO,
    CUEN_PORC       T_PORCENTAJE,
    CUEN_TIPO       CHAR(1) NOT NULL,
    CUEN_ACTIVA     T_BOOLEANO,
    CUEN_AFECTABLE  T_BOOLEANO,
    CUEN_NORMA      VARCHAR(255)
);

CREATE TABLE CUENTAS_NIIF_NORMA (
    CUEN_COD   T_CTA_CONTABLE NOT NULL,
    NNIF_ID    T_ID NOT NULL,
    NNID_ITEM  T_ID NOT NULL
);

CREATE TABLE CUENTAS_REPORTE_CERTDET (
    CRCD_CUENTA  T_CTA_CONTABLE NOT NULL,
    CRCD_IVA     T_CTA_CONTABLE,
    CRCD_RTFTE   T_CTA_CONTABLE,
    CRCD_RTIVA   T_CTA_CONTABLE,
    CRCD_RTICA   T_CTA_CONTABLE,
    CRCD_NOMBRE  T_CONCEPTO,
    CRCD_ITEM    T_ID NOT NULL
);

CREATE TABLE DENOMINACIONES (
    DENO_ID      T_ID NOT NULL,
    DENO_NOMBRE  T_CONCEPTO,
    DENO_MONTO   T_MONTO
);

CREATE TABLE DEPARTAMENTO (
    DPTO_COD      ID NOT NULL,
    DPTO_NOMBRE   NOMBRE NOT NULL,
    DPTO_PROY     CENTRO,
    DPTO_CENTRO   CENTRO,
    DPTO_TARARP   PORCENTAJE,
    DPTO_CTASAVP  CHAR(1),
    DPTO_TARL     T_ID
);

CREATE TABLE DEPOSITOS (
    TERC_NIT         T_NIT NOT NULL,
    DETO_COD         INTEGER NOT NULL,
    TERC_DEPOS       CHAR(1),
    DETO_CUENXPAGAR  T_CTA_CONTABLE
);

CREATE TABLE DEPRECIACION (
    DEPR_ID       T_ID NOT NULL,
    DEPR_FECHA    CHAR(8),
    TICO_COD      T_TIPO_COMP,
    PRCO_PREF     PREFIJO,
    ENCO_CONSEC   T_ID,
    DEPR_REFER    VARCHAR(10),
    ENCO_NUMERO   T_NUMDOC,
    DEPR_USUARIO  T_USUARIO,
    DEPR_CONC     T_CONCEPTO,
    DEPR_NIIF     CHAR(1)
);

CREATE TABLE DEPRECIACION_DETALLE (
    DEPR_ID        T_ID NOT NULL,
    DEPD_ITEM      T_ID NOT NULL,
    ACFJ_COD       T_COD_ARTICULO,
    DEPD_MESES     ENTERO,
    DEPD_UNIDADES  T_ID,
    DEPD_MONTO     T_MONTO,
    DEPD_MONTON    T_MONTO,
    DEPD_MESESN    ENTERO
);

CREATE TABLE DEPRECIACION_UNIDADES (
    DEPR_ID        T_ID NOT NULL,
    DEPU_ITEM      T_ID NOT NULL,
    ACFJ_COD       T_COD_ARTICULO,
    DEPU_UNIDADES  T_ID,
    DEPU_OK        T_BOOLEANO
);

CREATE TABLE DESCUENTOS_PRECIOS (
    DCTP_ID         T_ID NOT NULL,
    DCTP_NOMBRE     T_CONCEPTO,
    DCTP_PORC       T_PORCENTAJE,
    DCTP_BASEMIN    T_MONTO,
    DCTP_FAMI       T_GRUPO,
    DCTP_GRUPO      VARCHAR(3),
    DCTP_MARCA      VARCHAR(3),
    DCTP_BASEGRP    T_BOOLEANO,
    DCTP_FAMIBASE   T_GRUPO,
    DCTP_GRUPOBASE  VARCHAR(3),
    DCTP_MARCABASE  VARCHAR(3),
    DCTP_DIASEM     ENTERO,
    DCTP_HORAINI    TIME,
    DCTP_HORAFIN    TIME,
    DCTP_LISTAA     T_ID,
    DCTP_FECINI     FECHA,
    DCTP_FECFIN     FECHA,
    DCTP_CLIINS     T_BOOLEANO
);

CREATE TABLE DESCUENTOS_PRECIOS_CLI (
    DCTP_ID     T_ID NOT NULL,
    DCPC_ITEM   T_ID NOT NULL,
    TERC_NIT    T_NIT NOT NULL,
    DCPC_VENTA  T_CANTIDAD,
    ARTI_COD    T_COD_ARTICULO NOT NULL
);

CREATE TABLE DESCUENTOS_PRECIOS_DET (
    DCTP_ID      T_ID NOT NULL,
    DCPD_ITEM    T_ID NOT NULL,
    ARTI_COD     T_COD_ARTICULO,
    DCPD_PRECIO  T_MONTO,
    DCPD_VTAMAX  T_CANTIDAD,
    DCPD_CANTOT  T_CANTIDAD,
    DCPD_VENTA   T_CANTIDAD,
    DCPD_DTOP    T_PORCENTAJE
);

CREATE TABLE DESENSAMBLES (
    DESE_ID        T_ID NOT NULL,
    TIDO_COD       INTEGER NOT NULL,
    PREF_PRE       VARCHAR(4) NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    DESE_NUMERO    T_NUMDOC NOT NULL,
    DESE_FECHA     DATE NOT NULL,
    DESE_CONC      VARCHAR(60),
    DESE_REFER     VARCHAR(20),
    DESE_CANT      T_CANTIDAD,
    DESE_UNIDAD    T_UNIDAD,
    DESE_FACTOR    T_CANTIDAD,
    DESE_ANULADO   T_BOOLEANO,
    DESE_TRANSMIT  T_BOOLEANO,
    DESE_CODBAR    T_COD_ARTICULO,
    ARTI_COD       T_COD_ARTICULO,
    DESE_DESC      T_CONCEPTO,
    DESE_LOTE      T_LOTE,
    DESE_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TERC_NIT       T_NIT,
    DESE_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N',
    DESE_TIPOREF   T_ID,
    DESE_IDREF     T_ID,
    DESE_ITEMREF   T_ID
);

CREATE TABLE DESENSAMBLES_DETALLE (
    DESE_ID        T_ID NOT NULL,
    DESE_ITEM      T_ID NOT NULL,
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    DEDE_CANT      T_CANTIDAD,
    DEDE_UNIDAD    T_UNIDAD,
    DEDE_COSTO     T_MONTO,
    DEDE_LOTE      T_LOTE,
    DEDE_FACTOR    T_CANTIDAD,
    DEDE_IVAPORC   T_PORCENTAJE,
    DEDE_IVAMONTO  T_MONTO,
    DEDE_CONSUMO   T_MONTO,
    DEDE_CODBAR    T_COD_ARTICULO,
    DEDE_ANULADO   T_BOOLEANO,
    DEDE_TRANSMIT  T_BOOLEANO,
    DEDE_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    DEDE_DESC      T_CONCEPTO,
    DEDE_TOTAL     T_MONTO
);

CREATE TABLE DETERIORO_CARTERA_DET (
    DECA_ID        T_ID NOT NULL,
    DECD_ITEM      T_ID NOT NULL,
    DECD_TIPODOC   T_ID,
    DECD_IDDOC     T_ID,
    DECD_MONTO     T_MONTO,
    DECD_ANULADO   T_BOOLEANO,
    DECD_TRANSMIT  T_BOOLEANO,
    DECD_PREFDOC   T_PREFIJO,
    DECD_NUMDOC    T_NUMDOC,
    DECD_DIAS      ENTERO,
    DECD_SALDO     T_MONTO,
    TERC_NIT       T_NIT,
    DECD_IDNOTA    T_ID
);

CREATE TABLE DETERIORO_CARTERA_ENC (
    DECA_ID        T_ID NOT NULL,
    PREF_PRE       T_PREFIJO,
    DECA_NUMERO    T_NUMDOC,
    DECA_FECHA     FECHA,
    DECA_CONCEPTO  T_CONCEPTO,
    DECA_TASA      T_PORCENTAJE,
    DECA_DIAS      ENTERO,
    DECA_PREFND    T_PREFIJO,
    DECA_ANULADO   T_BOOLEANO,
    DECA_TRANSMIT  T_BOOLEANO,
    DECA_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO
);

CREATE TABLE DEVOLUCION_CHEQUES (
    DVCH_ID        T_ID NOT NULL,
    CUBA_COD       INTEGER NOT NULL,
    PRBA_PREF      VARCHAR(4) NOT NULL,
    TERC_NIT       T_NIT,
    DVCH_NUMDOC    T_NUMDOC NOT NULL,
    DVCH_FECHA     DATE NOT NULL,
    DVCH_CONC      VARCHAR(60),
    DVCH_BANCO     VARCHAR(2),
    DVCH_CUENTA    VARCHAR(20),
    DVCH_NROCH     VARCHAR(20),
    DVCH_FECCH     DATE,
    DVCH_MONTO     T_MONTO,
    DVCH_CARTERA   T_BOOLEANO,
    DVCH_ANULADO   T_BOOLEANO,
    DVCH_TRANSMIT  T_BOOLEANO,
    DVCH_NOMTERC   T_CONCEPTO,
    CAJA_ID        INTEGER,
    DVCH_USUARIO   T_USUARIO,
    DVCH_SUCURSAL  VARCHAR(10),
    NUMOK          T_BOOLEANO DEFAULT 'N',
    COBR_COD       T_ID,
    VEND_COD       T_ID,
    DVCH_TRM       T_MONTO
);

CREATE TABLE DEVOLUCION_COMPRAS_DOCRELA (
    DVCO_ID       T_ID NOT NULL,
    DVCR_TIPOREL  INTEGER,
    DVCR_IDREL    T_ID
);

CREATE TABLE DEVOLUCIONES_COMPRAS (
    DVCO_ID            T_ID NOT NULL,
    TERC_NIT           T_NIT NOT NULL,
    TIDO_COD           INTEGER NOT NULL,
    PREF_PRE           VARCHAR(4) NOT NULL,
    BODE_COD           VARCHAR(2) NOT NULL,
    DVCO_NUMERO        T_NUMDOC NOT NULL,
    DVCO_FECHA         DATE NOT NULL,
    DVCO_CONC          VARCHAR(60),
    DVCO_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    DVCO_DTOPORC       T_PORCENTAJE,
    DVCO_DTOMONTO      T_MONTO,
    DVCO_ADICIONAL     T_MONTO,
    DVCO_IVAMONTO      T_MONTO,
    DVCO_EXTRA         T_MONTO,
    DVCO_RTFTEPORC     T_PORCENTAJE,
    DVCO_RTFTEMONTO    T_MONTO,
    DVCO_RTIVAPORC     T_PORCENTAJE,
    DVCO_RTIVAMONTO    T_MONTO,
    DVCO_RTICAPORC     T_PORCENTAJE,
    DVCO_RTICAMONTO    T_MONTO,
    DVCO_TOTAL         T_MONTO,
    DVCO_IMPTOS        T_BOOLEANO,
    DVCO_ANULADO       T_BOOLEANO,
    DVCO_TRANSMIT      T_BOOLEANO,
    DVCO_FACTID        T_ID,
    DVCO_FACTURA       VARCHAR(10),
    DVCO_NROCOPIA      INTEGER,
    DVCO_SIMPLIFICADO  T_BOOLEANO,
    DVCO_CONSOLIDA     T_ID,
    DVCO_USUARIO       T_USUARIO,
    NUMOK              T_BOOLEANO DEFAULT 'N',
    DVCO_TRM           T_MONTO,
    DVCO_REMISION      VARCHAR(10),
    DVCO_REMID         T_ID,
    DVCO_RTCREE        T_PORCENTAJE,
    DVCO_RTCREEM       T_MONTO,
    DVCO_DEC1818       T_BOOLEANO
);

CREATE TABLE DEVOLUCIONES_COMPRAS_DET (
    DVCO_ID        T_ID NOT NULL,
    DVCD_ITEM      T_ID NOT NULL,
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    DVCD_CANT      T_CANTIDAD,
    DVCD_UNIDAD    T_UNIDAD,
    DVCD_LOTE      T_LOTE,
    DVCD_PRUNIT    T_MONTO,
    DVCD_DTOPORC   T_PORCENTAJE,
    DVCD_DTOMONTO  T_MONTO,
    DVCD_FACTOR    T_CANTIDAD,
    DVCD_DESC      VARCHAR(255),
    DVCD_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    DVCD_IVAPORC   T_PORCENTAJE,
    DVCD_IVAMONTO  T_MONTO,
    DVCD_CONSUMO   T_MONTO,
    DVCD_CODBAR    T_COD_ARTICULO,
    DVCD_ANULADO   T_BOOLEANO,
    DVCD_TRANSMIT  T_BOOLEANO,
    DVCD_TOTAL     T_MONTO,
    DVCD_TIVA      SMALLINT
);

CREATE TABLE DEVOLUCIONES_VENTAS (
    DEVT_ID           T_ID NOT NULL,
    VEND_COD          T_ID NOT NULL,
    TERC_NIT          T_NIT NOT NULL,
    TIDO_COD          INTEGER NOT NULL,
    PREF_PRE          VARCHAR(4) NOT NULL,
    PTVT_ID           T_ID NOT NULL,
    DEVT_NUMERO       T_NUMDOC NOT NULL,
    DEVT_FECHA        DATE NOT NULL,
    DEVT_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    DEVT_IVAINC       T_BOOLEANO NOT NULL,
    DEVT_COMIPORC     T_PORCENTAJE,
    DEVT_COMIMONTO    T_MONTO,
    DEVT_ADICIONAL    T_MONTO,
    DEVT_IVAMONTO     T_MONTO,
    DEVT_EXTRA        T_MONTO,
    DEVT_RTFTEPORC    T_PORCENTAJE,
    DEVT_RTIVAPORC    T_PORCENTAJE,
    DEVT_RTIVAMONTO   T_MONTO,
    DEVT_RTICAPORC    T_PORCENTAJE,
    DEVT_RTICAMONTO   T_MONTO,
    DEVT_ANULADO      T_BOOLEANO,
    DEVT_TRANSMIT     T_BOOLEANO,
    DEVT_TOTAL        T_MONTO,
    DEVT_NOMTERC      VARCHAR(60),
    DEVT_RTFTEMONTO   T_MONTO,
    DEVT_DTOPOR       T_PORCENTAJE,
    DEVT_DTOMONTO     T_MONTO,
    BODE_COD          VARCHAR(2),
    DEVT_FACTURA      VARCHAR(30),
    DEVT_FACTID       T_ID,
    DEVT_NROCOPIA     INTEGER,
    DEVT_CONSOLIDA    T_ID,
    DEVT_USUARIO      T_USUARIO,
    DEVT_SUCURSAL     VARCHAR(10),
    NUMOK             T_BOOLEANO DEFAULT 'N',
    COBR_COD          T_ID,
    DEVT_FACTOR       DOUBLE PRECISION,
    DEVT_REMISION     VARCHAR(10),
    DEVT_REMID        T_ID,
    DEVT_TRM          T_MONTO,
    DEVT_DTOIT1       T_MONTO,
    DEVT_DTOIT2       T_MONTO,
    DEVT_DTOIT3       T_MONTO,
    DEVT_CONFIRMACXC  T_BOOLEANO,
    DEVT_PEDIDO       VARCHAR(10),
    DEVT_PEDID        T_ID,
    DEVT_APLICA       T_BOOLEANO,
    DEVT_DEC2799      T_MONTO,
    DEVT_RTCREE       T_PORCENTAJE,
    DEVT_RTCREEM      T_MONTO,
    DEVT_IDFMAR       T_ID,
    DEVT_FLETE        T_BOOLEANO,
    DEVT_TRANSP       T_CONCEPTO,
    DEVT_VEHICULO     VARCHAR(15),
    DEVT_VRFLETE      T_MONTO,
    DEVT_DEVREM       T_BOOLEANO
);

CREATE TABLE DEVOLUCIONES_VENTAS_DETALLE (
    DEVT_ID           T_ID NOT NULL,
    DVDE_ITEM         T_ID NOT NULL,
    BODE_COD          VARCHAR(2) NOT NULL,
    ARTI_COD          T_COD_ARTICULO NOT NULL,
    DVDE_CANT         T_CANTIDAD,
    DVDE_UNIDAD       T_UNIDAD,
    DVDE_LOTE         T_LOTE,
    DVDE_PRUNIT       T_MONTO,
    DVDE_DTOPORC      T_PORCENTAJE,
    DVDE_DTOMONTO     T_MONTO,
    DVDE_IVAPORC      T_PORCENTAJE,
    DVDE_IVAMONTO     T_MONTO,
    DVDE_CONSUMO      T_MONTO,
    DVDE_FACTOR       T_CANTIDAD,
    DVDE_DESC         VARCHAR(255),
    DVDE_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    DVDE_CODBAR       T_COD_ARTICULO,
    DVDE_TOTAL        T_MONTO,
    DVDE_ANULADO      T_BOOLEANO,
    DVDE_TRANSMIT     T_BOOLEANO,
    DVDE_REFERENCIA   VARCHAR(60),
    LOTE_VENCE        DATE,
    DVDE_FACTORLISTA  T_PORCENTAJE,
    DVDE_DTO1         T_PORCENTAJE,
    DVDE_DTO2         T_PORCENTAJE,
    DVDE_DTO3         T_PORCENTAJE,
    DVDE_DTOM1        T_MONTO,
    DVDE_DTOM2        T_MONTO,
    DVDE_DTOM3        T_MONTO,
    DVDE_TIVA         SMALLINT,
    DVDE_INALCP       T_PORCENTAJE,
    DVDE_INACM        T_MONTO,
    LIPR_COD          T_ID
);

CREATE TABLE DEVOLUCIONES_VENTAS_DOCRELA (
    DEVT_ID       INTEGER NOT NULL,
    DVDR_TIPOREL  INTEGER NOT NULL,
    DVDR_IDREL    INTEGER NOT NULL
);

CREATE TABLE DOCUMENTOS_CONTA (
    DOCO_ID      T_ID NOT NULL,
    DOCU_NUMERO  T_NUMDOC,
    DOCO_FECHA   DATE,
    DOCO_VENCE   DATE,
    DOCO_MONTO   T_MONTO,
    CUEN_COD     T_CTA_CONTABLE NOT NULL
);

CREATE TABLE DOCUMENTOS_ESTADO (
    DOES_ID      T_ID NOT NULL,
    DOES_NOMBRE  T_CONCEPTO,
    DOES_COT     T_BOOLEANO,
    DOES_PED     T_BOOLEANO,
    DOES_FAC     T_BOOLEANO,
    DOES_ORD     T_BOOLEANO,
    DOES_CMP     T_BOOLEANO,
    DOES_IMP     T_BOOLEANO,
    DOES_OIT     T_BOOLEANO
);

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

CREATE TABLE DOCUMENTOS_PAGO_CAJA (
    DPCA_ID       INTEGER NOT NULL,
    FOPA_ID       T_ID NOT NULL,
    CAJA_ID       T_ID NOT NULL,
    DPCA_BANCO    VARCHAR(2) NOT NULL,
    DPCA_CUENTA   VARCHAR(20) NOT NULL,
    DPCA_NUMERO   VARCHAR(20) NOT NULL,
    DPCA_FECHA    DATE NOT NULL,
    DPCA_MONTO    T_MONTO,
    DPCA_TIPOENT  INTEGER,
    DPCA_IDENT    T_ID,
    DPCA_TIPOSAL  INTEGER DEFAULT 0,
    DPCA_IDSAL    INTEGER DEFAULT 0,
    DPCA_FECSAL   FECHA
);

CREATE TABLE EDUCACION_FORMAL_EMPLEADO (
    TERC_NIT       NIT NOT NULL,
    EDFO_ITEM      INTEGER NOT NULL,
    EDFO_INSTI     VARCHAR(60),
    EDFO_PROGRAMA  VARCHAR(60),
    EDFO_DESDE     VARCHAR(20),
    EDFO_HASTA     VARCHAR(20),
    NIVI_COD       INTEGER
);

CREATE TABLE EGRESOS (
    EGRE_ID          T_ID NOT NULL,
    TIDO_COD         INTEGER NOT NULL,
    PREF_PRE         VARCHAR(4) NOT NULL,
    EGRE_NUMERO      T_NUMDOC NOT NULL,
    EGRE_FECHA       DATE NOT NULL,
    EGRE_CONC        VARCHAR(60),
    EGRE_MONTO       T_MONTO,
    EGRE_RTFTEMONTO  T_MONTO,
    EGRE_RTIVAMONTO  T_MONTO,
    EGRE_RTICAMONTO  T_MONTO,
    EGRE_DTOF        T_MONTO,
    EGRE_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    EGRE_TIPOMOVBCO  VARCHAR(2),
    EGRE_IDMOVBCO    T_ID,
    EGRE_NOMTERC     T_CONCEPTO,
    EGRE_ANULADO     T_BOOLEANO,
    EGRE_TRANSMIT    T_BOOLEANO,
    TERC_NIT         T_NIT,
    EGRE_TIPO        CHAR(1),
    CAJA_ID          INTEGER,
    EGRE_USUARIO     T_USUARIO,
    NUMOK            T_BOOLEANO DEFAULT 'N',
    CLEG_ID          T_ID,
    EGRE_TRM         T_MONTO,
    EGRE_EXCEDENTE   T_MONTO,
    EGRE_RTCREE      T_MONTO,
    EGRE_IDINTER     T_ID,
    EGRE_IDAPORTE    T_ID
);

CREATE TABLE EGRESOS_BANCO (
    EGRE_ID        T_ID NOT NULL,
    EGBC_TIPOBCO   T_ID,
    CUBA_COD       INTEGER,
    EGBC_NUMERO    VARCHAR(20),
    EGBC_FECHA     DATE,
    PRBA_PREF      VARCHAR(4),
    EGBC_BENEF     VARCHAR(60),
    EGBC_MONTO     T_MONTO,
    EGBC_CONCEPTO  T_CONCEPTO,
    EGBC_GMF       CHAR(1),
    EGBC_ANULADO   T_BOOLEANO,
    EGBC_TRANSMIT  T_BOOLEANO
);

CREATE TABLE EGRESOS_CAJA (
    EGRE_ID        T_ID NOT NULL,
    EGCA_ITEM      T_ID NOT NULL,
    CAJA_ID        T_ID NOT NULL,
    FOPA_ID        T_ID NOT NULL,
    EGCA_BANCO     VARCHAR(2),
    EGCA_CUENTA    VARCHAR(20),
    EGCA_NUMERO    VARCHAR(20),
    EGCA_FECHA     DATE,
    EGCA_MONTO     T_MONTO,
    EGCA_ANULADO   T_BOOLEANO,
    EGCA_TRANSMIT  T_BOOLEANO
);

CREATE TABLE EGRESOS_CONTABILIDAD (
    EGRE_ID        T_ID NOT NULL,
    EGCO_ITEM      T_ID NOT NULL,
    CUEN_COD       VARCHAR(20),
    EGCO_DEBITOS   T_MONTO,
    EGCO_CREDITOS  T_MONTO,
    EGCO_BASEM     T_MONTO,
    EGCO_PORC      T_PORCENTAJE,
    EGCO_CONC      T_CONCEPTO,
    EGCO_NIT       T_NIT,
    EGCO_PROY      T_PROYECTO,
    EGCO_CENTRO    T_PROYECTO,
    EGCO_CATEG     VARCHAR(4)
);

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,
    EGCC_DIFCAMBIO  T_MONTO,
    EGCC_RCREE      T_MONTO
);

CREATE TABLE EGRESOS_DETALLE (
    EGRE_ID         T_ID NOT NULL,
    EGDE_ITEM       INTEGER NOT NULL,
    EGDE_TIPODOC    INTEGER,
    EGDE_IDDOC      T_ID,
    EGDE_PREFIJO    VARCHAR(4),
    EGDE_NUMERO     T_NUMDOC,
    EGDE_ABONO      T_MONTO,
    EGDE_RTFTE      T_MONTO,
    EGDE_RTIVA      T_MONTO,
    EGDE_RTICA      T_MONTO,
    EGDE_DTOF       T_MONTO,
    EGDE_ANULADO    T_BOOLEANO,
    EGDE_TRANSMIT   T_BOOLEANO,
    EGDE_DIFCAMBIO  T_MONTO,
    EGDE_NUMPROV    T_NUMPROV,
    EGDE_RCREE      T_MONTO
);

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

CREATE TABLE EMPAQUES (
    EMPQ_ID   T_ID NOT NULL,
    EMPQ_NOM  T_CONCEPTO
);

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),
    EMBE_FECNAC     FECHA,
    EMBE_DIR        NOMBRE,
    EMBE_TEL        NOMBRE,
    EMBE_EDAD       INTEGER
);

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,
    EMCO_TOMSAL      INTEGER,
    EMCO_ACTIVO      T_BOOLEANO,
    EMCO_CTAGASTO    T_CTA_CONTABLE,
    EMCO_CTAPAGAR    T_CTA_CONTABLE
);

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),
    EMLL_DESCARGO  VARCHAR(255)
);

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),
    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           NIT,
    EMPL_AUXTR         BOOLEANO,
    EMPL_BANCO         ID,
    EMPL_CUENTA        VARCHAR(25),
    EMPL_TIPOCTA       CHAR(1),
    EMPL_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    EMPL_FOTO          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    EMPL_FORMPAGO      CHAR(1),
    EMPL_CCF           NIT,
    EMPL_TIPOCOMI      CHAR(1),
    EMPL_CONTRANOS     DATE,
    EMPL_TIPOCONT      CHAR(1),
    PROY_COD           CENTRO,
    CENT_COD           CENTRO,
    EMPL_DEDDEP        T_BOOLEANO,
    EMPL_DEDINTV       MONTO,
    EMPL_DEDAFC        MONTO,
    EMPL_DEDMEDP       MONTO,
    EMPL_PERFIL        T_ID,
    EMPL_DEDSALUD      T_MONTO,
    EMPL_FACSAL        T_PORCENTAJE,
    EMPL_HORAS         SMALLINT,
    EMPL_ALTORIESGO    T_BOOLEANO,
    EMPL_IDPILA        T_NIT,
    EMPL_TIPOIDPILA    T_TIPOID,
    EMPL_TIPOVINC      T_ID,
    EMPL_BENEFICIO     T_CONCEPTO
);

CREATE TABLE ENSAMBLE_MAQUINA (
    ENMA_ID      T_ID NOT NULL,
    ENMA_NOMBRE  T_CONCEPTO
);

CREATE TABLE ENSAMBLE_OPERARIO (
    ENOP_ID      T_ID NOT NULL,
    ENOP_NOMBRE  T_CONCEPTO
);

CREATE TABLE ENSAMBLE_TURNO (
    ENSA_TURNO   T_ID NOT NULL,
    ENSA_NOMBRE  T_CONCEPTO
);

CREATE TABLE ENSAMBLES (
    ENSA_ID            T_ID NOT NULL,
    TIDO_COD           INTEGER NOT NULL,
    PREF_PRE           VARCHAR(4) NOT NULL,
    BODE_COD           VARCHAR(2) NOT NULL,
    ENSA_NUMERO        T_NUMDOC NOT NULL,
    ENSA_FECHA         DATE NOT NULL,
    ENSA_CONC          VARCHAR(60),
    ENSA_REFER         VARCHAR(20),
    ENSA_CANT          T_CANTIDAD,
    ENSA_UNIDAD        T_UNIDAD,
    ENSA_FACTOR        T_CANTIDAD,
    ENSA_ANULADO       T_BOOLEANO,
    ENSA_TRANSMIT      T_BOOLEANO,
    ARTI_COD           T_COD_ARTICULO,
    ENSA_DESC          T_CONCEPTO,
    ENSA_CODBAR        T_COD_ARTICULO,
    ENSA_LOTE          T_LOTE,
    ENSA_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TERC_NIT           T_NIT,
    ENSA_USUARIO       T_USUARIO,
    NUMOK              T_BOOLEANO DEFAULT 'N',
    ENSA_COSTO         T_MONTO,
    LOTE_VENCE         DATE,
    ENSA_CODRETAL      T_COD_ARTICULO,
    ENSA_CANTRETAL     T_CANTIDAD,
    ENSA_OPER          T_ID,
    ENSA_MAQUINA       T_ID,
    ENSA_PESO          T_CANTIDAD,
    ENSA_BODRETAL      VARCHAR(2),
    ENSA_CODPRINCIPAL  T_COD_ARTICULO,
    ENSA_TIPOREF       T_ID,
    ENSA_IDREF         T_ID,
    ENSA_ITEMREF       T_ID,
    ENSA_TURNO         T_ID
);

CREATE TABLE ENSAMBLES_DETALLE (
    ENSA_ID        T_ID NOT NULL,
    ESDE_ITEM      T_ID NOT NULL,
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    ESDE_CANT      T_CANTIDAD,
    ESDE_UNIDAD    T_UNIDAD,
    ESDE_COSTO     T_MONTO,
    ESDE_LOTE      T_LOTE,
    ESDE_FACTOR    T_CANTIDAD,
    ESDE_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ESDE_IVAPORC   T_PORCENTAJE,
    ESDE_IVAMONTO  T_MONTO,
    ESDE_CONSUMO   T_MONTO,
    ESDE_CODBAR    T_COD_ARTICULO,
    ESDE_ANULADO   T_BOOLEANO,
    ESDE_TRANSMIT  T_BOOLEANO,
    ESDE_DESC      T_CONCEPTO,
    ESDE_TOTAL     T_MONTO,
    ESDE_PESO      T_CANTIDAD,
    ESDE_PRECIO    T_MONTO
);

CREATE TABLE ENTRADAS (
    ENTR_ID        T_ID NOT NULL,
    TIDO_COD       INTEGER NOT NULL,
    PREF_PRE       VARCHAR(4) NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    ENTR_NUMERO    T_NUMDOC NOT NULL,
    ENTR_FECHA     DATE NOT NULL,
    ENTR_CONC      VARCHAR(60),
    ENTR_REFER     VARCHAR(20),
    ENTR_TIPOREF   INTEGER,
    ENTR_IDREF     INTEGER,
    ENTR_IMPTOS    T_BOOLEANO,
    ENTR_NOMTERC   VARCHAR(60),
    ENTR_ANULADO   T_BOOLEANO NOT NULL,
    ENTR_TRANSMIT  T_BOOLEANO,
    ENTR_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TERC_NIT       T_NIT,
    ENTR_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N',
    ENTR_ORDEN     VARCHAR(10),
    ENTR_ORDENID   T_ID
);

CREATE TABLE ENTRADAS_DETALLE (
    ENTR_ID        T_ID NOT NULL,
    ENDE_ITEM      T_ID NOT NULL,
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    ENDE_CANT      T_CANTIDAD,
    ENDE_UNIDAD    T_UNIDAD,
    ENDE_COSTO     T_MONTO,
    ENDE_LOTE      T_LOTE,
    ENDE_FACTOR    T_CANTIDAD,
    ENDE_DESC      VARCHAR(255),
    ENDE_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ENDE_DTOPORC   T_PORCENTAJE,
    ENDE_DTOMONTO  T_MONTO,
    ENDE_IVAPORC   T_PORCENTAJE,
    ENDE_IVAMONTO  T_MONTO,
    ENDE_CONSUMO   T_MONTO,
    ENDE_CODBAR    T_COD_ARTICULO,
    ENDE_TOTAL     T_MONTO,
    ENDE_ANULADO   T_BOOLEANO NOT NULL,
    ENDE_TRANSMIT  T_BOOLEANO,
    LOTE_VENCE     DATE,
    ENDE_STAND     T_LOTE,
    ENDE_COSTON    T_MONTO,
    ENDE_TOTALN    T_MONTO
);

CREATE TABLE ENTRADAS_SALIDAS_EMPLEADO (
    INEN_ID      INTEGER NOT NULL,
    TERC_NIT     NIT,
    INEN_HOREN   TIME,
    INEN_HORSAL  TIME,
    INEN_FECHA   DATE
);

CREATE TABLE ENTREGA_DOCUMENTOS (
    TIDO_COD          T_ID NOT NULL,
    ENDO_IDDOC        T_ID NOT NULL,
    ENDO_FECHAA       DATE,
    ENDO_HORAA        TIME,
    ENDO_ENCARGADO    T_ID,
    ENDO_FECHAE       DATE,
    ENDO_HORAE        TIME,
    ENDO_OBS          BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ENDO_FECHAL       FECHA,
    ENDO_HORAL        TIME,
    ENDO_FECHAC       FECHA,
    ENDO_HORAC        HORA,
    ENDO_ENTREGADOA   T_CONCEPTO,
    ENDO_RECIBIDOPOR  T_CONCEPTO,
    ENDO_FECHAQ       FECHA,
    ENDO_HORAQ        HORA,
    ENDO_EMPACADOR    T_ID
);

CREATE TABLE ENTREGADORES (
    ENTG_ID      T_ID NOT NULL,
    ENTG_NOMBRE  T_CONCEPTO,
    ENTG_ACTIVO  T_BOOLEANO,
    SUCU_ID      T_ID
);

CREATE TABLE ENVIO_AUTO (
    ENVA_ID       T_ID NOT NULL,
    ENVA_FECHA    DATE,
    ENVA_HORA     TIME,
    ENVA_AGENCIA  T_ID,
    ENVA_PREFIJO  VARCHAR(4),
    ENVA_ERROR    VARCHAR(1024)
);

CREATE TABLE ENVIO_ERRORES (
    ENER_ID       T_ID NOT NULL,
    ENER_ITEM     T_ID NOT NULL,
    ENER_TIPODOC  T_ID,
    ENER_IDDOC    T_ID,
    ENER_MENSAJE  VARCHAR(1024)
);

CREATE TABLE ENVIO_RESUMDIA (
    PTVT_ID      ID NOT NULL,
    ENRE_FECHA   DATE NOT NULL,
    ENRE_HORA    TIME NOT NULL,
    ENRE_FACTID  T_ID
);

CREATE TABLE ERRORES (
    ERRO_ITEM      T_ID NOT NULL,
    ERRO_ORIGEN    VARCHAR(20),
    ERRO_CAUSA     VARCHAR(256),
    ERRO_SOLUCION  VARCHAR(256),
    ERRO_TIPODOC   INTEGER,
    ERRO_NROITEM   INTEGER,
    ERRO_CODIGO    VARCHAR(20),
    ERRO_CADENA    VARCHAR(20),
    ERRO_IDDOC     INTEGER,
    ERRO_CANTR     NUMERIC(18,4),
    ERRO_CANT      NUMERIC(18,4)
);

CREATE TABLE ERRORES_ENVIO_CORREO (
    TERC_NIT  T_NIT NOT NULL,
    FECHA     DATE NOT NULL,
    EMAIL     VARCHAR(100),
    STATUS    VARCHAR(255)
);

CREATE TABLE ERRORES_LOTES (
    ARTICULO  T_COD_ARTICULO NOT NULL,
    BODEGA    VARCHAR(2) NOT NULL,
    LOTE      T_LOTE,
    IDMOV     T_ID NOT NULL,
    FECHA     DATE,
    TIPOMOV   T_ID,
    CANT      T_CANTIDAD,
    SALDOBOD  T_CANTIDAD,
    LOTESAL   T_LOTE,
    TIPO      T_CONCEPTO,
    ID        T_ID NOT NULL
);

CREATE TABLE ESTADO_ARTICULO (
    ESAR_COD  CHAR(1) NOT NULL,
    ESAR_NOM  VARCHAR(20)
);

CREATE TABLE ESTRUCTURA (
    ESTR_NIVEL    INTEGER NOT NULL,
    ESTR_DIGITOS  INTEGER NOT NULL
);

CREATE TABLE EVENTO_EXISTENCIAS (
    EVEX_ID      T_ID NOT NULL,
    EVEN_ID      T_ID NOT NULL,
    ARTI_COD     T_COD_ARTICULO NOT NULL,
    EVEX_EXIST   T_CANTIDAD,
    EVEX_PEDIDO  T_CANTIDAD
);

CREATE TABLE EVENTOS_VENTAS (
    EVVE_ID        T_ID NOT NULL,
    EVVE_NOMBRE    T_NUMFACL NOT NULL,
    EVVE_CONCEPTO  T_CONCEPTO,
    EVVE_EXIS      T_BOOLEANO,
    EVVE_CUPO      T_BOOLEANO,
    EVVE_VALIDEZ   ENTERO
);

CREATE TABLE EXISTENCIA (
    BODE_COD      VARCHAR(2) NOT NULL,
    ARTI_COD      T_COD_ARTICULO NOT NULL,
    EXIS_FECHA    DATE NOT NULL,
    EXIS_ENTR     T_CANTIDAD,
    EXIS_SAL      T_CANTIDAD,
    EXIS_SALDO    T_CANTIDAD,
    EXIS_STAND    VARCHAR(15),
    EXIS_RESERVA  T_CANTIDAD,
    EXIS_ORDEN    T_CANTIDAD
);

CREATE TABLE EXISTENCIA_LOTE (
    ARTI_COD    T_COD_ARTICULO NOT NULL,
    LOTE_NRO    T_LOTE NOT NULL,
    EXLO_FECHA  DATE NOT NULL,
    EXLO_SAL    T_CANTIDAD,
    EXLO_SALDO  T_CANTIDAD,
    BODE_COD    VARCHAR(2) NOT NULL,
    EXLO_ENT    T_CANTIDAD
);

CREATE TABLE EXISTENCIA_TERCERO (
    ARTI_COD    T_COD_ARTICULO NOT NULL,
    TERC_NIT    T_NIT NOT NULL,
    CLSU_COD    VARCHAR(10) NOT NULL,
    EXTE_FECHA  FECHA NOT NULL,
    EXTE_SALDO  T_CANTIDAD,
    EXTE_ENTR   T_CANTIDAD,
    EXTE_SAL    T_CANTIDAD
);

CREATE TABLE EXISTENCIAS_ARTICULO_WEB (
    ARTICULO    T_COD_ARTICULO NOT NULL,
    BODEGA      VARCHAR(2) NOT NULL,
    EXISTENCIA  T_CANTIDAD
);

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

CREATE TABLE FACTOR_COSTO (
    FACO_FECINI  DATE NOT NULL,
    FACO_FECFIN  DATE NOT NULL,
    FACO_FACTOR  NUMERIC(9,4)
);

CREATE TABLE FACTOR_INVENTARIO (
    FAIN_FECINI  DATE NOT NULL,
    FAIN_FECFIN  DATE NOT NULL,
    FAIN_FACTOR  NUMERIC(9,4)
);

CREATE TABLE FACTURA_ALQUILER (
    FAAL_CLIENTE   T_NIT NOT NULL,
    FAAL_FECHA     FECHA,
    FAAL_SUCURSAL  VARCHAR(10) NOT NULL
);

CREATE TABLE FACTURA_CONCEPTO (
    FACC_ID      T_ID NOT NULL,
    FACC_NOMBRE  T_CONCEPTO,
    FACC_VEND    T_ID,
    FACC_DIAS    SMALLINT,
    FACC_PREF    VARCHAR(4),
    FACC_PTVT    T_ID,
    FACC_OBS     BLOB SUB_TYPE 1 SEGMENT SIZE 80
);

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,
    FACI_DESC      T_CONCEPTO,
    FACI_IVAMONTO  T_MONTO,
    FACI_TOTAL     T_MONTO
);

CREATE TABLE FACTURA_EMBALAJE (
    FACT_ID    T_ID NOT NULL,
    TIEM_COD   VARCHAR(2) NOT NULL,
    FAEM_CANT  ENTERO
);

CREATE TABLE FACTURA_PROFORMA (
    FAPO_ID           ID NOT NULL,
    TERC_NIT          NIT,
    TIDO_COD          INTEGER,
    PREF_PRE          PREFIJO,
    FAPO_NUMERO       T_NUMDOC,
    FAPO_FECHA        DATE,
    FAPO_VALIDEZ      INTEGER,
    FAPO_CONC         VARCHAR(60),
    FAPO_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FAPO_DTOPORC      PORCENTAJE,
    FAPO_DTOMONTO     MONTO,
    FAPO_ADICIONAL    MONTO,
    FAPO_EXTRA        MONTO,
    FAPO_DTOFECHA     DATE,
    FAPO_TOTAL        MONTO,
    FAPO_TOTMON       MONTO,
    FAPO_ANULADO      BOOLEANO,
    FAPO_TRASMIT      BOOLEANO,
    FAPO_CONSOLIDADO  INTEGER,
    FAPO_USUSARIO     T_USUARIO,
    TERM_COD          VARCHAR(3),
    FOPA_COD          INTEGER,
    TACA_ID           INTEGER,
    TACA_MONTO        TRM,
    TIMO_COD          INTEGER,
    FAPO_VENCE        DATE,
    FAPO_SOLIMP       VARCHAR(20),
    FAPO_TOTGTOS      NUMERIC(18,2),
    FAPO_ESTADO       CHAR(1),
    FAPO_IVAMONTO     NUMERIC(18,2),
    BODE_COD          VARCHAR(2),
    FAPO_TRANSMIT     CHAR(1),
    FAPO_ARANCMONTO   T_MONTO,
    FAPO_FOB          MONTO,
    FAPO_IDIMPOR      T_ID,
    FAPO_IMPORTACION  T_NUMFACL,
    FAPO_MONEDA       T_ID,
    FAPO_PROY         T_PROYECTO,
    FAPO_CENTRO       T_CENTRO,
    FAPO_FECCIE       FECHA,
    FAPO_NUMPROV      T_NUMFACL
);

CREATE TABLE FACTURA_PROFORMA_DET (
    FAPO_ID          INTEGER NOT NULL,
    FPDE_ITEM        INTEGER NOT NULL,
    ARTI_COD         VARCHAR(15),
    FPDE_CANT        NUMERIC(18,4),
    FPDE_UNIDAD      VARCHAR(8),
    FPDE_PRUNIT      NUMERIC(18,2),
    FPDE_DTOPORC     NUMERIC(9,4),
    FPDE_DTOMONTO    NUMERIC(18,2),
    FPDE_FACTOR      NUMERIC(18,4),
    FPDE_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FPDE_CODBAR      VARCHAR(15),
    FPDE_TOTAL       NUMERIC(18,2),
    FPDE_TOTMON      NUMERIC(18,2),
    FPDE_TRASMIT     CHAR(1),
    FPDE_ANULADO     CHAR(1),
    FPDE_DESC        VARCHAR(60),
    FPDE_CODPROV     VARCHAR(15),
    FPDE_PRUNITMON   MONTO,
    FPDE_FOB         NUMERIC(18,2),
    FPDE_TRM         TRM,
    FPDE_ALTO        NUMERIC(18,4),
    FPDE_ANCHO       NUMERIC(18,4),
    FPDE_LARGO       NUMERIC(18,4),
    FPDE_PESO        VOLUMEN,
    FPDE_IVAPORC     NUMERIC(9,4),
    FPDE_IVAMONTO    NUMERIC(18,2),
    FPDE_CONSUMO     NUMERIC(18,2),
    BODE_COD         VARCHAR(2),
    FPDE_TRANSMIT    CHAR(1),
    FPDE_ARANCPORC   T_PORCENTAJE,
    FPDE_ARANCMONTO  T_MONTO,
    FPDE_TOTGTOS     NUMERIC(18,2),
    FPDE_FLETE       MONTO,
    FPDE_SEGURO      MONTO,
    FPDE_OTROGTO     MONTO,
    FPDE_FLETETOTAL  NUMERIC(18,2),
    FPDE_VOLUMEN     VOLUMEN,
    FPDE_LOTE        T_LOTE,
    FPDE_LOTEV       FECHA
);

CREATE TABLE FACTURA_PROFORMA_GASTOS (
    FAPO_ID          INTEGER NOT NULL,
    FPGA_ITEM        INTEGER NOT NULL,
    TIGI_COD         INTEGER,
    FPGA_VALOR       NUMERIC(18,2),
    FPGA_VALORCUB    NUMERIC(18,2),
    FPGA_VALORCPES   NUMERIC(18,2),
    FPGA_VALORCANT   NUMERIC(18,2),
    FPGA_IDGTO       INTEGER,
    FPGA_ANULADO     CHAR(1),
    TERC_NOM         VARCHAR(60),
    TERC_NIT         T_NIT,
    FPGA_RTFTEPORC   T_PORCENTAJE,
    FPGA_RTFTEMONTO  T_MONTO,
    FPGA_RTIVAPORC   T_PORCENTAJE,
    FPGA_RTIVAMONTO  T_MONTO,
    FPGA_RTICAPORC   T_PORCENTAJE,
    FPGA_RTICAMONTO  T_MONTO,
    FPGA_RTCREE      T_PORCENTAJE,
    FPGA_RTCREEM     T_MONTO,
    FPGA_FECHA       FECHA,
    FPGA_CONC        T_CONCEPTO,
    FPGA_VENCE       FECHA,
    FPGA_IVAPORC     T_PORCENTAJE,
    FPGA_IVAMONTO    T_MONTO,
    FPGA_NUMPROV     T_NUMFACL,
    FPGA_BASEEX      T_MONTO,
    FPGA_BASEGR      T_MONTO,
    FPGA_MONEDA      T_ID,
    FPGA_TRM         TRM,
    FPGA_BASERET     T_MONTO
);

CREATE TABLE FACTURA_WEB (
    FACW_ID          T_ID NOT NULL,
    FACW_PREF        PREFIJO,
    FACW_FECHA       FECHA,
    VEND_COD         T_ID,
    TERC_NIT         T_NIT,
    FACW_SUCURSAL    VARCHAR(10),
    FACW_NOMBRE      NOMBRE,
    FACW_ENTREGA     FECHA,
    FACW_DIASCR      SMALLINT,
    FACW_DTOPORC     T_PORCENTAJE,
    FACW_DTOMONTO    T_MONTO,
    FACW_ADICIONAL   T_MONTO,
    FACW_IVAMONTO    T_MONTO,
    FACW_EXTRA       T_MONTO,
    FACW_TOTAL       T_MONTO,
    FACW_RTFTEPORC   T_PORCENTAJE,
    FACW_RTIVAPORC   T_PORCENTAJE,
    FACW_RTICAPORC   T_PORCENTAJE,
    FACW_OBS         BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    FACW_RTFTEMONTO  T_MONTO,
    FACW_RTIVAMONTO  T_MONTO,
    FACW_RTICAMONTO  T_MONTO,
    FACW_IDFAC       T_ID
);

CREATE TABLE FACTURA_WEB_DETALLE (
    FACW_ID          T_ID NOT NULL,
    FAWD_ITEM        T_ID NOT NULL,
    ARTI_COD         T_COD_ARTICULO,
    FAWD_CODBAR      T_COD_ARTICULO,
    BODE_COD         VARCHAR(2),
    FAWD_REFERENCIA  T_CONCEPTO,
    FAWD_CANT        T_CANTIDAD,
    FAWD_UNIDAD      T_UNIDAD,
    FAWD_FACTOR      T_MONTO,
    LIPR_COD         T_ID,
    FAWD_PRUNIT      T_MONTO,
    FAWD_DTOP        T_PORCENTAJE,
    FAWD_DTOM        T_MONTO,
    FAWD_DTO1        T_PORCENTAJE,
    FAWD_DTO1M       T_MONTO,
    FAWD_DTO2        T_PORCENTAJE,
    FAWD_DTO2M       T_MONTO,
    FAWD_DTO3        T_PORCENTAJE,
    FAWD_DTO3M       T_MONTO,
    FAWD_IVAP        T_PORCENTAJE,
    FAWD_IVAMONTO    T_MONTO,
    FAWD_CONSUMO     T_MONTO,
    FAWD_TOTAL       T_MONTO,
    FAWD_DESC        T_CONCEPTO,
    FAWD_OBS         BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    FAWD_INALCP      T_PORCENTAJE,
    FAWD_INALCM      T_MONTO
);

CREATE TABLE FACTURAS (
    FACT_ID          T_ID NOT NULL,
    PTVT_ID          T_ID NOT NULL,
    VEND_COD         T_ID NOT NULL,
    TERC_NIT         T_NIT NOT NULL,
    AUTO_NUMERO      VARCHAR(20),
    FACT_NUMERO      T_NUMDOC NOT NULL,
    FACT_FECHA       DATE NOT NULL,
    FACT_DESPACHO    VARCHAR(255),
    FACT_VENCE       DATE,
    FACT_IVAINC      T_BOOLEANO NOT NULL,
    FACT_COMIPORC    T_PORCENTAJE,
    FACT_COMIMONTO   T_MONTO,
    FACT_DTOPOR      T_PORCENTAJE,
    FACT_DTOMONTO    T_MONTO,
    FACT_ADICIONAL   T_MONTO,
    FACT_IVAMONTO    T_MONTO,
    FACT_RTFTEPOR    T_PORCENTAJE,
    FACT_RTFTEMONTO  T_MONTO,
    FACT_RTIVAPOR    T_PORCENTAJE,
    FACT_RTIVAMONTO  T_MONTO,
    FACT_RTICAPOR    T_PORCENTAJE,
    FACT_RTICAMONTO  T_MONTO,
    FACT_EXTRA       T_MONTO,
    FACT_DTOFPOR     T_PORCENTAJE,
    FACT_DTOFMONTO   T_MONTO,
    FACT_DTOFFECHA   DATE,
    PREF_PRE         VARCHAR(4),
    FACT_TRANSP      VARCHAR(60),
    FACT_NOMCLIENTE  VARCHAR(60),
    FACT_COTIZACI    VARCHAR(30),
    FACT_PEDIDO      VARCHAR(30),
    FACT_REMISION    VARCHAR(30),
    FACT_ANULADO     T_BOOLEANO,
    FACT_TRANSMIT    T_BOOLEANO,
    FACT_TOTAL       T_MONTO,
    BODE_COD         VARCHAR(2),
    FACT_OBS         BLOB SUB_TYPE 1 SEGMENT SIZE 50,
    VEHI_COD         VARCHAR(8),
    FACT_CONSOLIDA   T_ID,
    FACT_RECIBIDO    T_MONTO,
    FACT_USUARIO     T_USUARIO,
    FACT_SUCURSAL    VARCHAR(10),
    NUMOK            T_BOOLEANO DEFAULT 'N',
    COBR_COD         T_ID,
    FACT_FACTOR      DOUBLE PRECISION,
    FACT_DETCLI      T_NIT,
    FACT_DETCLINOM   T_CONCEPTO,
    FACT_DTOIT1      MONTO,
    FACT_DTOIT2      MONTO,
    FACT_DTOIT3      MONTO,
    FACT_TRM         TRM,
    FACT_ANTICIPO    T_MONTO,
    FACT_GARANTIA    T_MONTO,
    FACT_DEC2799     T_MONTO,
    FACT_COMIP       CHAR(1),
    FACT_FECINI      FECHA,
    FACT_FECFIN      FECHA,
    FACT_ENTREGA     FECHA,
    FACT_RTCREE      T_PORCENTAJE,
    FACT_RTCREEM     T_MONTO,
    FACT_IDFMAR      T_ID,
    FACT_DETCLIDIR   VARCHAR(100),
    FACT_DETCLICIU   T_CONCEPTO,
    FACT_DETCLITEL   T_TELEFONO,
    FACT_DETCLITR    T_CONCEPTO,
    FACT_VALE        T_CONCEPTO,
    FACT_ORDENCLI    PREF_NUM,
    FACT_DTOF1       T_PORCENTAJE,
    FACT_DTOF1FEC    FECHA,
    FACT_DTOF2       T_PORCENTAJE,
    FACT_DTOF2FEC    FECHA,
    FACT_DTOF3       T_PORCENTAJE,
    FACT_DTOF3FEC    FECHA,
    FACT_DTOF4       T_PORCENTAJE,
    FACT_DTOF4FEC    FECHA,
    FACT_DTOF1M      T_MONTO,
    FACT_DTOF2M      T_MONTO,
    FACT_DTOF3M      T_MONTO,
    FACT_AUTOCAR     T_ID,
    FACT_AUTOCUPO    T_ID,
    FACT_CONTRATO    T_ID,
    FACT_PTOSCLIFAC  ENTERO,
    FACT_EXISTE      T_BOOLEANO
);

CREATE TABLE FACTURAS_COMPRA (
    FACO_ID            T_ID NOT NULL,
    BODE_COD           VARCHAR(2) NOT NULL,
    TERC_NIT           T_NIT NOT NULL,
    TIDO_COD           INTEGER NOT NULL,
    PREF_PRE           VARCHAR(4) NOT NULL,
    FACO_NUMERO        T_NUMDOC NOT NULL,
    FACO_FECHA         DATE NOT NULL,
    FACO_VENCE         DATE NOT NULL,
    FACO_NUMPROV       T_NUMPROV,
    FACO_CONC          VARCHAR(60),
    FACO_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FACO_ANULADO       T_BOOLEANO,
    FACO_TRANSMIT      T_BOOLEANO,
    FACO_IMPTOS        T_BOOLEANO,
    FACO_DTOPORC       T_PORCENTAJE,
    FACO_DTOMONTO      T_MONTO,
    FACO_ADICIONAL     T_MONTO,
    FACO_EXTRA         T_MONTO,
    FACO_RTIVAPOR      T_PORCENTAJE,
    FACO_RTIVAMONTO    T_MONTO,
    FACO_RTICAPOR      T_PORCENTAJE,
    FACO_RTICAMONTO    T_MONTO,
    FACO_RTFTEPORC     T_PORCENTAJE,
    FACO_RTFTEMONTO    T_MONTO,
    FACO_IVAMONTO      T_MONTO,
    FACO_DTOFPOR       T_PORCENTAJE,
    FACO_DTOFMONTO     T_MONTO,
    FACO_DTOFFECHA     DATE,
    FACO_TOTAL         T_MONTO,
    FACO_COTIZACI      VARCHAR(30),
    FACO_ORDEN         VARCHAR(30),
    FACO_REMISION      VARCHAR(30),
    FACO_DEVUELTO      T_CANTIDAD,
    FACO_NROCOPIA      INTEGER,
    FACO_SIMPLIFICADO  T_BOOLEANO,
    FACO_CONSOLIDA     T_ID,
    FACO_USUARIO       T_USUARIO,
    NUMOK              T_BOOLEANO DEFAULT 'N',
    FACO_TRM           T_MONTO,
    FACO_RTCREE        T_PORCENTAJE,
    FACO_RTCREEM       T_MONTO,
    FACO_DEC1818       T_BOOLEANO,
    FACO_DTO1IT        T_MONTO,
    FACO_DTO2IT        T_MONTO,
    FACO_DTO3IT        T_MONTO
);

CREATE TABLE FACTURAS_COMPRAS_DETALLE (
    FACO_ID           T_ID NOT NULL,
    FCDE_ITEM         T_ID NOT NULL,
    ARTI_COD          T_COD_ARTICULO NOT NULL,
    BODE_COD          VARCHAR(2) NOT NULL,
    FCDE_CANT         T_CANTIDAD,
    FCDE_UNIDAD       T_UNIDAD,
    FCDE_LOTE         T_LOTE,
    FCDE_PRUNIT       T_MONTO,
    FCDE_DTOPORC      T_PORCENTAJE,
    FCDE_DTOMONTO     T_MONTO,
    FCDE_FACTOR       T_CANTIDAD,
    FCDE_DESC         VARCHAR(255),
    FCDE_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FCDE_IVAPORC      T_PORCENTAJE,
    FCDE_IVAMONTO     T_MONTO,
    FCDE_CONSUMO      T_MONTO,
    FCDE_CODBAR       T_COD_ARTICULO,
    FCDE_REMISIONADO  T_CANTIDAD,
    FCDE_DEVUELTO     T_CANTIDAD,
    FCDE_ANULADO      T_BOOLEANO,
    FCDE_TRANSMIT     T_BOOLEANO,
    FCDE_TOTAL        T_MONTO,
    FCDE_REFERENCIA   VARCHAR(60),
    FCDE_CODPROV      T_COD_ARTICULO,
    LOTE_VENCE        DATE,
    FCDE_STAND        T_LOTE,
    FCDE_TIVA         SMALLINT,
    FCDE_DTO1         T_PORCENTAJE,
    FCDE_DTO2         T_PORCENTAJE,
    FCDE_DTO3         T_PORCENTAJE,
    FCDE_DTOM1        T_MONTO,
    FCDE_DTOM2        T_MONTO,
    FCDE_DTOM3        T_MONTO
);

CREATE TABLE FACTURAS_CONTADO (
    FCNT_ID          T_ID NOT NULL,
    PTVT_ID          T_ID NOT NULL,
    VEND_COD         T_ID NOT NULL,
    FCNT_NUMERO      T_NUMDOC NOT NULL,
    FCNT_FECHA       DATE,
    FCNT_IVAINC      T_BOOLEANO,
    FCNT_COMIPORC    T_PORCENTAJE,
    FCNT_COMIMONTO   T_MONTO,
    FCNT_DTOPOR      T_PORCENTAJE,
    FCNT_DTOMONTO    T_MONTO,
    PREF_PRE         VARCHAR(4),
    FCNT_NOMCLIENTE  T_CONCEPTO,
    FCNT_ANULADO     T_BOOLEANO,
    FCNT_CIERRE      T_BOOLEANO,
    BODE_COD         VARCHAR(2),
    FCNT_USUARIO     T_USUARIO,
    NUMOK            T_BOOLEANO,
    TERC_NIT         T_NIT,
    FCNT_RECIBIDO    T_MONTO
);

CREATE TABLE FACTURAS_CONTADO_DETALLE (
    FCNT_ID          T_ID NOT NULL,
    FCND_ITEM        T_ID NOT NULL,
    ARTI_COD         T_COD_ARTICULO,
    FCND_CANT        T_CANTIDAD,
    FCND_UNIDAD      T_UNIDAD,
    FCND_PRUNIT      T_MONTO,
    BODE_COD         VARCHAR(2),
    FCND_DTOPORC     T_PORCENTAJE,
    FCND_DTOMONTO    T_MONTO,
    FCND_IVAPORC     T_PORCENTAJE,
    FCND_IVAMONTO    T_MONTO,
    FCND_CONSUMO     T_MONTO,
    FCND_FACTOR      T_CANTIDAD,
    FCND_DESC        T_CONCEPTO,
    FCND_CODBAR      T_COD_ARTICULO,
    FCND_TOTAL       T_MONTO,
    LIPR_COD         T_ID,
    FCND_REFERENCIA  T_CONCEPTO,
    FCND_ANULADO     T_BOOLEANO,
    FCND_CERRADO     T_BOOLEANO,
    FCND_DEVUELTO    T_CANTIDAD
);

CREATE TABLE FACTURAS_CONTADO_PAGO (
    FCNT_ID       T_ID NOT NULL,
    FCNP_ITEM     T_ID NOT NULL,
    FOPA_ID       T_ID,
    FCNP_BANCO    VARCHAR(2),
    FCNP_CUENTA   VARCHAR(20),
    FCNP_NUMERO   VARCHAR(20),
    FCNP_FECHA    DATE,
    FCNP_MONTO    T_MONTO,
    FCNP_ANULADO  T_BOOLEANO,
    FCNP_CERRADO  T_BOOLEANO
);

CREATE TABLE FACTURAS_DETALLE (
    FACT_ID           T_ID NOT NULL,
    FADE_ITEM         T_ID NOT NULL,
    BODE_COD          VARCHAR(2) NOT NULL,
    ARTI_COD          T_COD_ARTICULO NOT NULL,
    FADE_CANT         T_CANTIDAD,
    FADE_UNIDAD       T_UNIDAD,
    FADE_LOTE         T_LOTE,
    FADE_PRUNIT       T_MONTO,
    FADE_DTOPORC      T_PORCENTAJE,
    FADE_DTOMONTO     T_MONTO,
    FADE_IVAPORC      T_PORCENTAJE,
    FADE_IVAMONTO     T_MONTO,
    FADE_CONSUMO      T_MONTO,
    FADE_FACTOR       T_CANTIDAD,
    FADE_DESC         VARCHAR(255),
    FADE_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FADE_CODBAR       T_COD_ARTICULO,
    FADE_REMISIONADO  T_CANTIDAD,
    FADE_DEVUELTO     T_CANTIDAD,
    FADE_TOTAL        T_MONTO,
    LIPR_COD          T_ID,
    FADE_REFERENCIA   VARCHAR(60),
    FADE_ANULADO      T_BOOLEANO,
    FADE_TRANSMIT     T_BOOLEANO,
    FADE_FACTORLISTA  T_PORCENTAJE,
    FADE_DTO1         PORCENTAJE,
    FADE_DTO2         PORCENTAJE,
    FADE_DTO3         PORCENTAJE,
    FADE_DTOM1        MONTO,
    FADE_DTOM2        MONTO,
    FADE_DTOM3        MONTO,
    FADE_CAJAS        T_CANTIDAD,
    FADE_BASE         T_MONTO,
    FADE_PORCBASE     T_MONTO,
    FADE_TIVA         SMALLINT,
    FADE_INALCP       T_PORCENTAJE,
    FADE_INALCM       T_MONTO,
    FADE_IDPEND       T_ID,
    FADE_ITEMPEND     T_ID,
    FADE_LLEVAR       T_BOOLEANO,
    FADE_IDDTO        T_ID
);

CREATE TABLE FACTURAS_MES (
    FAME_NIT       T_NIT NOT NULL,
    FAME_ANO       SMALLINT NOT NULL,
    FAME_MES       SMALLINT NOT NULL,
    FAME_IDFACT    T_ID,
    FAME_SUCURSAL  VARCHAR(10) NOT NULL
);

CREATE TABLE FLUJO_EFECTIVO (
    FLEF_ID       INTEGER NOT NULL,
    FLEF_CUENTA   T_CTA_CONTABLE,
    FLEF_SECCION  INTEGER,
    FLEF_DB       T_BOOLEANO,
    FLEF_NIIF     T_BOOLEANO
);

CREATE TABLE FODO_SOL_PENSIONAL (
    FSPE_ITEM     ID NOT NULL,
    FSPE_SMLVINI  ID,
    FSPE_SMLVFIN  ID,
    FSPE_TARIFA   PORCENTAJE
);

CREATE TABLE FORMA_PAGO_REMESA (
    FPRM_COD        CHAR(1) NOT NULL,
    FPRM_NOM        VARCHAR(30) NOT NULL,
    FPRM_CTACONTA   T_CTA_CONTABLE,
    FPRM_CTAPASAJE  T_CTA_CONTABLE,
    FPRM_CTASEGURO  T_CTA_CONTABLE,
    FPRM_CTACOSTO   T_CTA_CONTABLE
);

CREATE TABLE FORMA_PAGOS (
    FOPA_COD     INTEGER NOT NULL,
    FOPA_NOMBRE  VARCHAR(60)
);

CREATE TABLE FORMAS_PAGO (
    FOPA_ID        T_ID NOT NULL,
    FOPA_NOM       VARCHAR(30) NOT NULL,
    FOPA_CTACONTA  T_CTA_CONTABLE,
    FOPA_CONSIGNA  T_BOOLEANO,
    FOPA_CTABCO    T_ID,
    FOPA_PREFBCO   VARCHAR(4),
    FOPA_TARJETA   VARCHAR(3),
    FOPA_CTANIIF   T_CTA_CONTABLE,
    FOPA_MONEDAEX  T_BOOLEANO
);

CREATE TABLE FORMATO_DATOS (
    TIDO_COD             T_ID NOT NULL,
    PREF_PRE             VARCHAR(4) NOT NULL,
    DAFO_DATO            VARCHAR(30) NOT NULL,
    DAFO_IMPRIME         T_BOOLEANO,
    DAFO_POSX            INTEGER,
    DAFO_POSY            INTEGER,
    DAFO_FORMATO         VARCHAR(20),
    DAFO_LONG            INTEGER,
    DAFO_REPITE          T_BOOLEANO,
    DAFO_FONT            VARCHAR(60),
    DAFO_FSIZE           INTEGER,
    DAFO_LIQUIDA         T_BOOLEANO,
    DAFO_POSYVAR         T_BOOLEANO,
    DAFO_ITEM            INTEGER NOT NULL,
    DAFO_INI             SMALLINT DEFAULT 1,
    DAFO_CORTARPALABRAS  T_BOOLEANO,
    DAFO_JUSTIFICA       CHAR(1)
);

CREATE TABLE FORMATO_LINEAS (
    TIDO_COD      T_ID NOT NULL,
    PREF_PRE      VARCHAR(4) NOT NULL,
    FOLI_ITEM     T_ID NOT NULL,
    FOLI_TIPO     CHAR(1),
    FOLI_X        INTEGER,
    FOLI_Y        INTEGER,
    FOLI_POSX     INTEGER,
    FOLI_POSY     INTEGER,
    FOLI_CADENA   VARCHAR(60),
    FOLI_FONT     VARCHAR(60),
    FOLI_FSIZE    INTEGER,
    FOLI_LIQUIDA  T_BOOLEANO,
    FOLI_IMAGEN   BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FOLI_REPITE   T_BOOLEANO
);

CREATE TABLE FORMATOCONTABLE_DETALLE (
    FOCO_ID       T_ID NOT NULL,
    FOCD_ITEM     T_ID NOT NULL,
    FOCD_POSX     INTEGER,
    FOCD_POSY     INTEGER,
    FOCD_FONT     T_CONCEPTO,
    FOCD_FSIZE    INTEGER,
    FOCD_INI      INTEGER,
    FOCD_LONG     INTEGER,
    FOCD_OPER     CHAR(1),
    FOCD_FACTOR   T_MONTO,
    FOCD_PAGINA   INTEGER,
    FOCD_CUENTAS  VARCHAR(255),
    FOCD_PROY     T_PROYECTO,
    FOCD_CENTRO   T_CENTRO
);

CREATE TABLE FORMATOCONTABLE_TEXTOS (
    FOCO_ID      T_ID NOT NULL,
    FOCD_ITEM    T_ID NOT NULL,
    FOCD_TIPO    CHAR(1),
    FOCD_CADENA  VARCHAR(255),
    FOCD_POSX    INTEGER,
    FOCD_POSY    INTEGER,
    FOCD_X       INTEGER,
    FOCD_Y       INTEGER,
    FOCD_FONT    T_CONCEPTO,
    FOCD_FSIZE   INTEGER,
    FOCD_PAGINA  INTEGER,
    FOCD_IMAGEN  BLOB SUB_TYPE 0 SEGMENT SIZE 80
);

CREATE TABLE FORMATOS (
    TIDO_COD         T_ID NOT NULL,
    PREF_PRE         VARCHAR(4) NOT NULL,
    FORM_IMPRE       VARCHAR(60),
    FORM_NROITEMS    INTEGER,
    FORM_PAGINAS     T_BOOLEANO,
    FORM_ENTRELINEA  INTEGER,
    FORM_FONT        VARCHAR(60),
    FORM_FSIZE       INTEGER,
    FORM_PAPELAN     NUMERIC(5,2),
    FORM_PAPELAL     NUMERIC(5,2),
    FORM_PREFITE     VARCHAR(4)
);

CREATE TABLE FORMATOS_CONTABLES (
    FOCO_ID         T_ID NOT NULL,
    FOCO_NOMBRE     T_CONCEPTO NOT NULL,
    FOCO_IMPRESORA  T_ID,
    FOCO_LINEAS     INTEGER,
    FOCO_TITULO     T_CONCEPTO,
    FOCO_SUBTITULO  VARCHAR(255),
    FOCO_FACTOR     T_MONTO,
    FOCO_PAGINAS    INTEGER,
    FOCO_NIIF       T_BOOLEANO
);

CREATE TABLE FOTOS_ARTICULO (
    ARTI_COD     T_COD_ARTICULO NOT NULL,
    FTAR_ITEM    INTEGER NOT NULL,
    FTAR_IMAGEN  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    FTAR_NOMBRE  NOMBRE
);

CREATE TABLE GASTOS_IMPORTACION (
    GAIN_ID           INTEGER NOT NULL,
    GAIN_PREF         PREFIJO,
    GAIN_NUMERO       T_NUMDOC,
    GAIN_IDIMPOR      INTEGER,
    GAIN_IMPORTACION  VARCHAR(12),
    TIGI_COD          INTEGER,
    TERC_NIT          T_NIT,
    TERC_NOM          VARCHAR(60),
    GAIN_FECHA        FECHA,
    GAIN_CONC         T_CONCEPTO,
    GAIN_VENCE        FECHA,
    GAIN_VALOR        NUMERIC(18,2),
    GAIN_VALORCUB     NUMERIC(18,2),
    GAIN_VALORCPES    NUMERIC(18,2),
    GAIN_VALORCANT    NUMERIC(18,2),
    GAIN_IDGTO        INTEGER,
    GAIN_ANULADO      CHAR(1),
    GAIN_PROY         VARCHAR(4),
    GAIN_CENTRO       VARCHAR(4),
    GAIN_SUBCEN       VARCHAR(4),
    GAIN_IVAPORC      T_PORCENTAJE,
    GAIN_IVAMONTO     T_MONTO,
    GAIN_NUMPROV      T_NUMFACL,
    GAIN_BASEEX       T_MONTO,
    GAIN_BASEGR       T_MONTO,
    GAIN_MONEDA       T_ID,
    GAIN_TRM          T_MONTO,
    GAIN_RTFTEPORC    T_PORCENTAJE,
    GAIN_RTFTEMONTO   T_MONTO,
    GAIN_RTIVAPORC    T_PORCENTAJE,
    GAIN_RTIVAMONTO   T_MONTO,
    GAIN_RTICAPORC    T_PORCENTAJE,
    GAIN_RTICAMONTO   T_MONTO,
    GAIN_RTCREE       T_PORCENTAJE,
    GAIN_RTCREEM      T_MONTO,
    GAIN_BASERET      T_MONTO
);

CREATE TABLE GRUPO (
    GRUP_COD           VARCHAR(2) NOT NULL,
    GRUP_NOM           VARCHAR(30) NOT NULL,
    GRUP_CTAINVENT     T_CTA_CONTABLE,
    GRUP_CTAVENTAS     T_CTA_CONTABLE,
    GRUP_CTACOSTOS     T_CTA_CONTABLE,
    GRUP_CTAIVACMP     T_CTA_CONTABLE,
    GRUP_CTAIVAVNT     T_CTA_CONTABLE,
    GRUP_COMIPOR       T_PORCENTAJE,
    GRUP_COMIMONTO     T_MONTO,
    GRUP_CTACOMP       T_CTA_CONTABLE,
    GRUP_CTADEV        T_CTA_CONTABLE,
    GRUP_CTARTFTEV     T_CTA_CONTABLE,
    GRUP_CTARTFTEC     T_CTA_CONTABLE,
    GRUP_RTFTEB        T_MONTO,
    GRUP_RTFTEP        T_PORCENTAJE,
    GRUP_DSCTO         T_PORCENTAJE,
    GRUP_IDTIENDA      T_ID,
    GRUP_BASEPRECIO    VARCHAR(10),
    GRUP_CTARTCREE     T_CTA_CONTABLE,
    GRUP_RTCREE        T_PORCENTAJE,
    GRUP_CTARTICA      T_CTA_CONTABLE,
    GRUP_RTICA         T_PORCENTAJE,
    GRUP_CTAIVADV      T_CTA_CONTABLE,
    GRUP_CTAIVADC      T_CTA_CONTABLE,
    GRUP_IMAGEN        BLOB SUB_TYPE 0 SEGMENT SIZE 1024,
    GRUP_CTAINVNIIF    T_CTA_CONTABLE,
    GRUP_CTAVTANIIF    T_CTA_CONTABLE,
    GRUP_CTACOSNIIF    T_CTA_CONTABLE,
    GRUP_CTAIVACNIIF   T_CTA_CONTABLE,
    GRUP_CTAIVAVNIIF   T_CTA_CONTABLE,
    GRUP_CTACMPNIIF    T_CTA_CONTABLE,
    GRUP_CTADEVNIIF    T_CTA_CONTABLE,
    GRUP_CTARTFVNIIF   T_CTA_CONTABLE,
    GRUP_CTARTFCNIIF   T_CTA_CONTABLE,
    GRUP_CTARTCRNIIF   T_CTA_CONTABLE,
    GRUP_CTARICANIIF   T_CTA_CONTABLE,
    GRUP_CTAIVDVNIIF   T_CTA_CONTABLE,
    GRUP_CTAIVDCNIIF   T_CTA_CONTABLE,
    GRUP_DEC1818       T_BOOLEANO,
    COFU_ID            ENTERO,
    GRUP_CTAESTAM      T_CTA_CONTABLE,
    GRUP_CTAESTAMNIIF  T_CTA_CONTABLE
);

CREATE TABLE GRUPO_CARTERA (
    GRCA_COD     INTEGER NOT NULL,
    GRCA_NOMBRE  VARCHAR(30) NOT NULL
);

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

CREATE TABLE GRUPOS_PROVEEDORES (
    GRPR_COD          VARCHAR(2) NOT NULL,
    GRPR_NOM          VARCHAR(60) NOT NULL,
    GRPR_CTAPROV      T_CTA_CONTABLE,
    GRPR_CTARTFTE     T_CTA_CONTABLE,
    GRPR_CTARTIVA     T_CTA_CONTABLE,
    GRPR_CTARTICA     T_CTA_CONTABLE,
    GRPR_CTAANTI      T_CTA_CONTABLE,
    GRPR_CTAPROVNIIF  T_CTA_CONTABLE,
    GRPR_CTARFTENIIF  T_CTA_CONTABLE,
    GRPR_CTARIVANIIF  T_CTA_CONTABLE,
    GRPR_CTARICANIIF  T_CTA_CONTABLE,
    GRPR_CTAANTINIIF  T_CTA_CONTABLE
);

CREATE TABLE HEMOLIFE_CLIENTES (
    HECL_NOMBRE  T_CONCEPTO NOT NULL,
    TERC_NIT     T_NIT,
    CLSU_COD     VARCHAR(10)
);

CREATE TABLE HEMOLIFE_ENSAMBLES (
    HEEN_ID        T_ID NOT NULL,
    HEEN_FECHA     FECHA NOT NULL,
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    CANT_PROD      T_CANTIDAD,
    CANT_DESC      T_CANTIDAD,
    CANT_DEV       T_CANTIDAD,
    CAT_CANJE      T_CANTIDAD,
    BODE_COD       VARCHAR(2),
    CANT_ENTR      T_CANTIDAD,
    ALBA_NUMERO    T_NUMDOC,
    TERC_NOM       T_CONCEPTO,
    HEEN_CODEQ     T_COD_ARTICULO,
    HEEN_TRANSMIT  T_BOOLEANO
);

CREATE TABLE HEMOLIFE_EQUIVALENCIAS (
    ARTI_COD  T_COD_ARTICULO NOT NULL,
    CODLAB    VARCHAR(10),
    BODE_COD  VARCHAR(2)
);

CREATE TABLE HEMOLIFE_REMISIONES (
    HERE_ID        T_ID NOT NULL,
    HERE_FECHA     FECHA,
    HERE_NIT       T_NIT,
    HERE_NOMBRE    T_CONCEPTO,
    HERE_PRODUCTO  T_COD_ARTICULO,
    HERE_CANT      T_CANTIDAD,
    HERE_NOMPROD   T_CONCEPTO,
    HERE_TRANSMIT  T_BOOLEANO,
    ARTI_COD       T_COD_ARTICULO,
    BODE_COD       VARCHAR(2),
    HERE_PRUNIT    T_MONTO,
    HERE_ITEM      T_ID NOT NULL,
    HERE_SUCURSAL  VARCHAR(10)
);

CREATE TABLE HISTORICO_VENTAS (
    HIVE_ANO    INTEGER NOT NULL,
    HIVE_MES    INTEGER NOT NULL,
    SUCU_ID     INTEGER NOT NULL,
    HIVE_VENTA  T_MONTO
);

CREATE TABLE HORARIO_EMPLEADO (
    HOEM_ID         INTEGER NOT NULL,
    TERC_NIT        VARCHAR(20),
    HOEM_TIPOCONTR  CHAR(1)
);

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

CREATE TABLE IMPORTACION (
    IMPO_ID          T_ID NOT NULL,
    IMPO_PREF        PREFIJO,
    IMPO_NUMERO      T_NUMDOC,
    IMPO_FECHA       FECHA,
    IMPO_CONC        T_CONCEPTO,
    IMPO_OBS         BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    IMPO_ANULADO     T_BOOLEANO,
    IMPO_TRANSMIT    T_BOOLEANO,
    IMPO_USUARIO     T_USUARIO,
    IMPO_NUMOK       T_BOOLEANO,
    IMPO_REFERENCIA  T_CONCEPTO,
    IMPO_MONEDA      T_ID,
    IMPO_FECLLEGA    FECHA,
    IMPO_CTAINV      T_CTA_CONTABLE,
    IMPO_PROY        T_PROYECTO,
    IMPO_CENTRO      T_CENTRO,
    IMPO_CTAIMP      T_CTA_CONTABLE,
    IMPO_CERRADA     T_BOOLEANO,
    IMPO_FECCIE      FECHA
);

CREATE TABLE IMPORTACION_INVENTARIO (
    IMIN_TIPO     T_ID NOT NULL,
    IMIN_DATO     VARCHAR(60) NOT NULL,
    IMIN_COLUMNA  INTEGER,
    IMIN_ANCHO    INTEGER
);

CREATE TABLE IMPORTACION_LIQUIDACION (
    IMPO_ID       T_ID NOT NULL,
    IMLI_ITEM     T_ID NOT NULL,
    ARTI_COD      T_COD_ARTICULO,
    IMLI_CANT     T_CANTIDAD,
    IMLI_UNIDAD   T_UNIDAD,
    IMLI_PRUNIT   T_MONTO,
    IMLI_PRUMON   T_MONTO,
    IMLI_FLETES   T_MONTO,
    IMLI_SEGUROS  T_MONTO,
    IMLI_IMPTOS   T_MONTO,
    IMLI_OTROS    T_MONTO,
    IMLI_PESO     VOLUMEN,
    IMLI_VOLUMEN  VOLUMEN,
    IMLI_FOB      T_MONTO
);

CREATE TABLE INCAPACIDADES (
    TERC_NIT      NIT NOT NULL,
    INCA_ID       ID NOT NULL,
    INCA_ADMIN    ID NOT NULL,
    INCA_TIPOADM  CHAR(1),
    INCA_NUMERO   NUMERO NOT NULL,
    INCA_ANO      ANO,
    INCA_MES      MES,
    INCA_TIPO     CHAR(1),
    INCA_VALOR    MONTO,
    INCA_VROTROS  MONTO
);

CREATE TABLE INGRESOS_EMPLEADO (
    TERC_NIT      T_NIT NOT NULL,
    INEM_FECHA    FECHA NOT NULL,
    INEM_INGRESO  T_BOOLEANO NOT NULL
);

CREATE TABLE INTERFAZ_BANCOS (
    INBA_ID            T_ID NOT NULL,
    TIDO_COD           INTEGER,
    PREF_PRE           VARCHAR(4),
    INBA_NOMBRE        T_CONCEPTO,
    INBA_BANCO         CHAR(1),
    INBA_IVA           CHAR(1),
    INBA_GMF           CHAR(1),
    INBA_CTABCO        T_CTA_CONTABLE,
    INBA_CTAIVA        T_CTA_CONTABLE,
    INBA_CTAGMF        T_CTA_CONTABLE,
    INBA_CTABASE       T_CTA_CONTABLE,
    TICO_COD           T_TIPO_COMP,
    PRCO_PRE           VARCHAR(4),
    INBA_CONFIRMAR     T_BOOLEANO,
    INBA_BASE          CHAR(1),
    CUBA_COD           INTEGER,
    INBA_USUARIO       T_USUARIO,
    INBA_EQUIVALENCIA  T_BOOLEANO
);

CREATE TABLE INTERFAZ_BANCOS_CTAS (
    INBA_ID      T_ID NOT NULL,
    INBC_ITEM    INTEGER NOT NULL,
    INBC_CUENTA  T_CTA_CONTABLE,
    INBC_PORC    T_PORCENTAJE,
    INBC_VALOR   T_MONTO,
    INBC_BASE    VARCHAR(20),
    INBC_DB      T_BOOLEANO,
    INBC_CN      CHAR(1)
);

CREATE TABLE INTERFAZ_BANCOS_NIIF (
    INBA_ID       T_ID NOT NULL,
    INBA_BANCO    CHAR(1),
    INBA_IVA      CHAR(1),
    INBA_GMF      CHAR(1),
    INBA_BASE     CHAR(1),
    INBA_CTABCO   T_CTA_CONTABLE,
    INBA_CTAIVA   T_CTA_CONTABLE,
    INBA_CTAGMF   T_CTA_CONTABLE,
    INBA_CTABASE  T_CTA_CONTABLE
);

CREATE TABLE INTERFAZ_CAJA (
    INCJ_ID            T_ID NOT NULL,
    TIDO_COD           INTEGER,
    PREF_PRE           VARCHAR(4),
    INCJ_NOMBRE        T_CONCEPTO,
    INCJ_CAJA          CHAR(1),
    INCJ_BANCO         CHAR(1),
    INCJ_BASE          CHAR(1),
    INCJ_RTFTE         CHAR(1),
    INCJ_RTIVA         CHAR(1),
    INCJ_RTICA         CHAR(1),
    INCJ_DTOPP         CHAR(1),
    INCJ_CTACAJA       T_CTA_CONTABLE,
    INCJ_CTABANCO      T_CTA_CONTABLE,
    INCJ_CTARTFTE      T_CTA_CONTABLE,
    INCJ_CTARTIVA      T_CTA_CONTABLE,
    INCJ_CTARTICA      T_CTA_CONTABLE,
    INCJ_CTADTO        T_CTA_CONTABLE,
    INCJ_CTABASE       T_CTA_CONTABLE,
    TICO_COD           T_TIPO_COMP,
    PRCO_PRE           VARCHAR(4),
    INCJ_CONFIRMAR     T_BOOLEANO,
    INCJ_USUARIO       T_USUARIO,
    INCJ_RTCREE        CHAR(1),
    INCJ_CTARTCREE     T_CTA_CONTABLE,
    INCJ_EQUIVALENCIA  T_BOOLEANO
);

CREATE TABLE INTERFAZ_CAJA_CTAS (
    INCJ_ID      T_ID NOT NULL,
    INJC_ITEM    INTEGER NOT NULL,
    INJC_CUENTA  T_CTA_CONTABLE,
    INJC_BASE    VARCHAR(20),
    INJC_PORC    T_PORCENTAJE,
    INJC_VALOR   T_MONTO,
    INJC_DB      T_BOOLEANO,
    INJC_CN      CHAR(1)
);

CREATE TABLE INTERFAZ_CAJA_NIIF (
    INCJ_ID         T_ID NOT NULL,
    INCJ_CAJA       CHAR(1),
    INCJ_BANCO      CHAR(1),
    INCJ_BASE       CHAR(1),
    INCJ_RTFTE      CHAR(1),
    INCJ_RTIVA      CHAR(1),
    INCJ_RTICA      CHAR(1),
    INCJ_DTOPP      CHAR(1),
    INCJ_CTACAJA    T_CTA_CONTABLE,
    INCJ_CTABANCO   T_CTA_CONTABLE,
    INCJ_CTARTFTE   T_CTA_CONTABLE,
    INCJ_CTARTIVA   T_CTA_CONTABLE,
    INCJ_CTARTICA   T_CTA_CONTABLE,
    INCJ_CTADTO     T_CTA_CONTABLE,
    INCJ_CTABASE    T_CTA_CONTABLE,
    INCJ_RTCREE     CHAR(1),
    INCJ_CTARTCREE  T_CTA_CONTABLE
);

CREATE TABLE INTERFAZ_CARTERA (
    INCA_ID            T_ID NOT NULL,
    TIDO_COD           INTEGER,
    PREF_PRE           VARCHAR(4),
    INCA_NOMBRE        T_CONCEPTO,
    TICO_COD           T_TIPO_COMP,
    PRCO_PRE           VARCHAR(4),
    INCA_CONFIRMAR     T_BOOLEANO,
    INCA_BASE          CHAR(1),
    INCA_IVA           CHAR(1),
    INCA_RTFTE         CHAR(1),
    INCA_RTIVA         CHAR(1),
    INCA_RTICA         CHAR(1),
    INCA_CLIE          CHAR(1),
    INCA_CTABASE       T_CTA_CONTABLE,
    INCA_CTAIVA        T_CTA_CONTABLE,
    INCA_CTARTFTE      T_CTA_CONTABLE,
    INCA_CTARTIVA      T_CTA_CONTABLE,
    INCA_CTARTICA      T_CTA_CONTABLE,
    INCA_CTACLIE       T_CTA_CONTABLE,
    INCA_USUARIO       T_USUARIO,
    INCA_RTCREE        CHAR(1),
    INCA_CTARTCREE     T_CTA_CONTABLE,
    INCA_EQUIVALENCIA  T_BOOLEANO
);

CREATE TABLE INTERFAZ_CARTERA_CTAS (
    INCA_ID      T_ID NOT NULL,
    INCD_ITEM    INTEGER NOT NULL,
    INCD_CUENTA  T_CTA_CONTABLE,
    INCD_BASE    VARCHAR(20),
    INCD_PORC    T_PORCENTAJE,
    INCD_VALOR   T_MONTO,
    INCD_DB      T_BOOLEANO,
    INCD_CN      CHAR(1)
);

CREATE TABLE INTERFAZ_CARTERA_NIIF (
    INCA_ID         T_ID NOT NULL,
    INCA_BASE       CHAR(1),
    INCA_IVA        CHAR(1),
    INCA_RTFTE      CHAR(1),
    INCA_RTIVA      CHAR(1),
    INCA_RTICA      CHAR(1),
    INCA_CLIE       CHAR(1),
    INCA_CTABASE    T_CTA_CONTABLE,
    INCA_CTAIVA     T_CTA_CONTABLE,
    INCA_CTARTFTE   T_CTA_CONTABLE,
    INCA_CTARTIVA   T_CTA_CONTABLE,
    INCA_CTARTICA   T_CTA_CONTABLE,
    INCA_CTACLIE    T_CTA_CONTABLE,
    INCA_RTCREE     CHAR(1),
    INCA_CTARTCREE  T_CTA_CONTABLE
);

CREATE TABLE INTERFAZ_COMPRAS (
    INCO_ID            T_ID NOT NULL,
    TIDO_COD           INTEGER,
    PREF_PRE           VARCHAR(4),
    INCO_NOMBRE        T_CONCEPTO,
    TICO_COD           T_TIPO_COMP,
    PRCO_PRE           VARCHAR(4),
    INCO_CONFIRMAR     T_BOOLEANO,
    INCO_INVEN         CHAR(1),
    INCO_IVA           CHAR(1),
    INCO_CXP           CHAR(1),
    INCO_CONSUMO       CHAR(1),
    INCO_RTFTE         CHAR(1),
    INCO_RTIVA         CHAR(1),
    INCO_RTICA         CHAR(1),
    INCO_CTAINVEN      T_CTA_CONTABLE,
    INCO_CTAIVA        T_CTA_CONTABLE,
    INCO_CTACXP        T_CTA_CONTABLE,
    INCO_CTACONSUMO    T_CTA_CONTABLE,
    INCO_CTAEXTRA      T_CTA_CONTABLE,
    INCO_CTARTFTE      T_CTA_CONTABLE,
    INCO_CTARTIVA      T_CTA_CONTABLE,
    INCO_CTARTICA      T_CTA_CONTABLE,
    INCO_CTADTO        T_CTA_CONTABLE,
    INCO_CTAADIC       T_CTA_CONTABLE,
    INCO_CENTRO        CHAR(1),
    INCO_USUARIO       T_USUARIO,
    INCO_RTCREE        CHAR(1),
    INCO_CTARTCREE     T_CTA_CONTABLE,
    INCO_EQUIVALENCIA  T_BOOLEANO
);

CREATE TABLE INTERFAZ_COMPRAS_CTAS (
    INCO_ID      T_ID NOT NULL,
    INCC_ITEM    INTEGER NOT NULL,
    INCC_CUENTA  T_CTA_CONTABLE,
    INCC_BASE    VARCHAR(20),
    INCC_PORC    T_PORCENTAJE,
    INCC_VALOR   T_MONTO,
    INCC_DB      T_BOOLEANO,
    INCC_CN      CHAR(1)
);

CREATE TABLE INTERFAZ_COMPRAS_NIIF (
    INCO_ID          T_ID NOT NULL,
    INCO_INVEN       CHAR(1),
    INCO_IVA         CHAR(1),
    INCO_CXP         CHAR(1),
    INCO_CONSUMO     CHAR(1),
    INCO_RTFTE       CHAR(1),
    INCO_RTIVA       CHAR(1),
    INCO_RTICA       CHAR(1),
    INCO_RTCREE      CHAR(1),
    INCO_CTAINVEN    T_CTA_CONTABLE,
    INCO_CTAIVA      T_CTA_CONTABLE,
    INCO_CTACXP      T_CTA_CONTABLE,
    INCO_CTACONSUMO  T_CTA_CONTABLE,
    INCO_CTAEXTRA    T_CTA_CONTABLE,
    INCO_CTARTFTE    T_CTA_CONTABLE,
    INCO_CTARTIVA    T_CTA_CONTABLE,
    INCO_CTARTICA    T_CTA_CONTABLE,
    INCO_CTADTO      T_CTA_CONTABLE,
    INCO_CTAADIC     T_CTA_CONTABLE,
    INCO_CTARTCREE   T_CTA_CONTABLE
);

CREATE TABLE INTERFAZ_CXPAGAR (
    INCP_ID            T_ID NOT NULL,
    TIDO_COD           INTEGER,
    PREF_PRE           VARCHAR(4),
    TICO_COD           T_TIPO_COMP,
    PRCO_PRE           VARCHAR(4),
    INCP_NOMBRE        T_CONCEPTO,
    INCP_BASE          CHAR(1),
    INCP_IVA           CHAR(1),
    INCP_RTFTE         CHAR(1),
    INCP_RTIVA         CHAR(1),
    INCP_RTICA         CHAR(1),
    INCP_PROV          CHAR(1),
    INCP_CTABASE       T_CTA_CONTABLE,
    INCP_CTAIVA        T_CTA_CONTABLE,
    INCP_CTARTFTE      T_CTA_CONTABLE,
    INCP_CTARTIVA      T_CTA_CONTABLE,
    INCP_CTARTICA      T_CTA_CONTABLE,
    INCP_CTAPROV       T_CTA_CONTABLE,
    INCP_CONFIRMAR     T_BOOLEANO,
    INCP_USUARIO       T_USUARIO,
    INCP_RTCREE        CHAR(1),
    INCP_CTARTCREE     T_CTA_CONTABLE,
    INCP_CTADTO1       T_CTA_CONTABLE,
    INCP_CTADTO2       T_CTA_CONTABLE,
    INCP_CTADTO3       T_CTA_CONTABLE,
    INCP_CTADTO4       T_CTA_CONTABLE,
    INCP_EQUIVALENCIA  T_BOOLEANO
);

CREATE TABLE INTERFAZ_CXPAGAR_CTAS (
    INCP_ID      T_ID NOT NULL,
    INPC_ITEM    INTEGER NOT NULL,
    INPC_CUENTA  T_CTA_CONTABLE,
    INPC_BASE    VARCHAR(20),
    INPC_VALOR   T_MONTO,
    INPC_PORC    T_PORCENTAJE,
    INPC_DB      T_BOOLEANO,
    INPC_CN      CHAR(1)
);

CREATE TABLE INTERFAZ_CXPAGAR_NIIF (
    INCP_ID         T_ID NOT NULL,
    INCP_BASE       CHAR(1),
    INCP_IVA        CHAR(1),
    INCP_RTFTE      CHAR(1),
    INCP_RTIVA      CHAR(1),
    INCP_RTICA      CHAR(1),
    INCP_PROV       CHAR(1),
    INCP_CTABASE    T_CTA_CONTABLE,
    INCP_CTAIVA     T_CTA_CONTABLE,
    INCP_CTARTFTE   T_CTA_CONTABLE,
    INCP_CTARTIVA   T_CTA_CONTABLE,
    INCP_CTARTICA   T_CTA_CONTABLE,
    INCP_CTAPROV    T_CTA_CONTABLE,
    INCP_RTCREE     CHAR(1),
    INCP_CTARTCREE  T_CTA_CONTABLE
);

CREATE TABLE INTERFAZ_INVENTARIO (
    ININ_ID            T_ID NOT NULL,
    TIDO_COD           T_ID,
    PREF_PRE           VARCHAR(4),
    ININ_NOMBRE        T_CONCEPTO,
    ININ_CTACIERRE     T_CTA_CONTABLE,
    ININ_BASE          CHAR(1),
    ININ_CONSUMO       CHAR(1),
    ININ_TOTAL         CHAR(1),
    ININ_CONFIRMAR     T_BOOLEANO,
    TICO_COD           T_TIPO_COMP,
    PRCO_PREF          VARCHAR(4),
    ININ_IVAV          CHAR(1),
    ININ_CTABASE       T_CTA_CONTABLE,
    ININ_CTAIVA        T_CTA_CONTABLE,
    ININ_CTACONSUMO    T_CTA_CONTABLE,
    ININ_CENTRO        CHAR(1),
    ININ_USUARIO       T_USUARIO,
    ININ_CODPROY       T_PROYECTO,
    ININ_CODCENT       T_CENTRO,
    ININ_EQUIVALENCIA  T_BOOLEANO
);

CREATE TABLE INTERFAZ_INVENTARIO_CTAS (
    ININ_ID      T_ID NOT NULL,
    INIC_ITEM    INTEGER NOT NULL,
    INIC_CUENTA  T_CTA_CONTABLE,
    INIC_BASE    VARCHAR(20),
    INIC_PORC    T_PORCENTAJE,
    INIC_VALOR   T_MONTO,
    INIC_DB      T_BOOLEANO,
    INIC_CN      CHAR(1)
);

CREATE TABLE INTERFAZ_INVENTARIO_NIIF (
    ININ_ID          T_ID NOT NULL,
    ININ_CTACIERRE   T_CTA_CONTABLE,
    ININ_BASE        CHAR(1),
    ININ_CONSUMO     CHAR(1),
    ININ_TOTAL       CHAR(1),
    ININ_IVAV        CHAR(1),
    ININ_CTABASE     T_CTA_CONTABLE,
    ININ_CTAIVA      T_CTA_CONTABLE,
    ININ_CTACONSUMO  T_CTA_CONTABLE
);

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),
    INNO_CONFIRMAR     T_BOOLEANO,
    INNO_USUARIO       T_USUARIO,
    INNO_DET           BOOLEANO,
    INNO_DTLLEADMIN    CHAR(1),
    INNO_EQUIVALENCIA  T_BOOLEANO
);

CREATE TABLE INTERFAZ_TRANSPORTE (
    INTR_ID            T_ID NOT NULL,
    INTR_NOMBRE        T_CONCEPTO,
    TIDO_COD           T_ID,
    TICO_COD           T_TIPO_COMP,
    PRCO_PREF          T_PROYECTO,
    PREF_PRE           T_PROYECTO,
    INTR_CTASEGURO     T_CTA_CONTABLE,
    INTR_CONFIRMAR     T_BOOLEANO,
    INTR_USUARIO       T_USUARIO,
    INTR_CTACAJA       T_CTA_CONTABLE,
    INTR_CTAPAGAR      T_CTA_CONTABLE,
    INTR_CTACARTERA    T_CTA_CONTABLE,
    INTR_CARTERA       CHAR(1),
    INTR_CXPAGAR       CHAR(1),
    INTR_CAJA          CHAR(1),
    INTR_CTAINGPLA     T_CTA_CONTABLE,
    INTR_CTAINGREM     T_CTA_CONTABLE,
    INTR_CTADOMICIL    T_CTA_CONTABLE,
    INTR_CTACONTRAE    T_CTA_CONTABLE,
    INTR_CTARTFTE      T_CTA_CONTABLE,
    INTR_EQUIVALENCIA  T_BOOLEANO
);

CREATE TABLE INTERFAZ_TRANSPORTE_CTAS (
    INTR_ID      T_ID NOT NULL,
    INTC_ITEM    T_ID NOT NULL,
    INTC_CUENTA  T_CTA_CONTABLE,
    INTC_BASE    T_CTA_CONTABLE,
    INTC_PORC    T_PORCENTAJE,
    INTC_VALOR   T_MONTO,
    INTC_DB      T_BOOLEANO
);

CREATE TABLE INTERFAZ_VENTAS (
    INVE_ID            T_ID NOT NULL,
    TIDO_COD           T_ID,
    PREF_PRE           VARCHAR(4),
    INVE_NOMBRE        T_CONCEPTO,
    INVE_VENTAS        CHAR(1),
    INVE_IVA           CHAR(1),
    INVE_CONSUMO       CHAR(1),
    INVE_CARTERA       CHAR(1),
    INVE_COSTO         CHAR(1),
    INVE_INVEN         CHAR(1),
    INVE_CTAVENTAS     T_CTA_CONTABLE,
    INVE_CTAIVA        T_CTA_CONTABLE,
    INVE_CTACARTERA    T_CTA_CONTABLE,
    INVE_CTACONSUMO    T_CTA_CONTABLE,
    INVE_CTAINVEN      T_CTA_CONTABLE,
    INVE_CTACOSTOS     T_CTA_CONTABLE,
    INVE_CTAEXTRA      T_CTA_CONTABLE,
    INVE_RTFTE         CHAR(1),
    INVE_RTIVA         CHAR(1),
    INVE_RTICA         CHAR(1),
    INVE_CTARTFTE      T_CTA_CONTABLE,
    INVE_CTARTIVA      T_CTA_CONTABLE,
    INVE_CTARTICA      T_CTA_CONTABLE,
    TICO_COD           T_TIPO_COMP,
    PRCO_PRE           VARCHAR(4),
    INVE_CONFIRMAR     T_BOOLEANO,
    INVE_CTADTO        T_CTA_CONTABLE,
    INVE_CTAADIC       T_CTA_CONTABLE,
    INVE_CENTRO        CHAR(1),
    INVE_USUARIO       T_USUARIO,
    INVE_CTADTOIVA     T_CTA_CONTABLE,
    INVE_RTCREE        CHAR(1),
    INVE_CTARTCREE     T_CTA_CONTABLE,
    INVE_EQUIVALENCIA  T_BOOLEANO
);

CREATE TABLE INTERFAZ_VENTAS_CTAS (
    INVE_ID      T_ID NOT NULL,
    INVC_ITEM    INTEGER NOT NULL,
    INVC_CUENTA  T_CTA_CONTABLE,
    INVC_PORC    T_PORCENTAJE,
    INVC_DB      T_BOOLEANO,
    INVC_BASE    VARCHAR(20),
    INVC_VALOR   T_MONTO,
    INVC_CN      CHAR(1)
);

CREATE TABLE INTERFAZ_VENTAS_NIIF (
    INVE_ID          T_ID NOT NULL,
    INVE_VENTAS      CHAR(1),
    INVE_IVA         CHAR(1),
    INVE_CONSUMO     CHAR(1),
    INVE_CARTERA     CHAR(1),
    INVE_COSTO       CHAR(1),
    INVE_INVEN       CHAR(1),
    INVE_CTAVENTAS   T_CTA_CONTABLE,
    INVE_CTAIVA      T_CTA_CONTABLE,
    INVE_CTACARTERA  T_CTA_CONTABLE,
    INVE_CTACONSUMO  T_CTA_CONTABLE,
    INVE_CTAINVEN    T_CTA_CONTABLE,
    INVE_CTACOSTOS   T_CTA_CONTABLE,
    INVE_CTAEXTRA    T_CTA_CONTABLE,
    INVE_RTFTE       CHAR(1),
    INVE_RTIVA       CHAR(1),
    INVE_RTICA       CHAR(1),
    INVE_CTARTFTE    T_CTA_CONTABLE,
    INVE_CTARTIVA    T_CTA_CONTABLE,
    INVE_CTARTICA    T_CTA_CONTABLE,
    INVE_CTADTO      T_CTA_CONTABLE,
    INVE_CTAADIC     T_CTA_CONTABLE,
    INVE_CTADTOIVA   T_CTA_CONTABLE,
    INVE_RTCREE      CHAR(1),
    INVE_CTARTCREE   T_CTA_CONTABLE
);

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,
    LIQD_PERIODO        INTEGER,
    LIQD_DIASLAB        INTEGER,
    LIQD_INDEMNIZACION  MONTO,
    LIQD_NOMID          T_ID,
    LIQD_FECCES         FECHA,
    LIQD_FECPRI         FECHA,
    LIQD_FECVAC         FECHA,
    LIQD_TOTAL          MONTO,
    LIQD_TOTPAGOS       MONTO,
    LIQD_TOTDESC        MONTO,
    LIQD_INDEMNIZA      T_BOOLEANO,
    LIQD_SALARIOP       MONTO,
    LIQD_BASEVAC        MONTO,
    LIQD_DIASVAC        PORCENTAJE,
    LIQD_VACID          T_ID,
    LIQD_DSCARTERA      T_MONTO,
    LIQD_IDCAR          T_ID
);

CREATE TABLE LIQUIDACION_RUTA_COLEGIO (
    LIQR_ID            T_ID NOT NULL,
    LIQR_NUMERO        T_NUMDOC,
    LIQR_FECHA         FECHA,
    LIQR_RUTA          T_ID,
    LIQR_CONDUCTOR     T_NIT,
    LIQR_DIAS          ENTERO,
    LIQR_VRCONTRATOS   T_MONTO,
    LIQR_VRDESCUENTOS  T_MONTO,
    LIQR_VRPAGOS       T_MONTO,
    LIQR_VRANTICIPOS   T_MONTO,
    LIQR_VREFECTIVOS   T_MONTO,
    LIQR_VRRELEVOSP    T_MONTO,
    LIQR_VRRELEVOSN    T_MONTO,
    LIQR_ANULADO       T_BOOLEANO,
    LIQR_RTFTEPOR      T_PORCENTAJE,
    LIQR_RTFTEMONTO    T_MONTO,
    LIQR_NUMOK         T_BOOLEANO,
    LIQR_USUARIO       T_USUARIO,
    LIQR_APAGAR        T_MONTO,
    LIQR_COMIPORC      T_PORCENTAJE,
    LIQR_COMIMONTO     T_MONTO,
    LIQR_RTICAPOR      T_PORCENTAJE,
    LIQR_RTICAMONTO    T_MONTO,
    LIQR_OBS           OBSERVACIONT,
    LIQR_IDND          T_ID,
    LIQR_CORTE         FECHA,
    LIQR_BECAS         T_MONTO,
    LIQR_BECADOS       ESTUDIANTE
);

CREATE TABLE LIQUIDACION_RUTA_CONC (
    LIQR_ID        T_ID NOT NULL,
    LIQC_ITEM      T_ID NOT NULL,
    LIQC_CONCEPTO  T_ID,
    LIQC_DB        T_BOOLEANO,
    LIQC_VALOR     T_MONTO,
    LIQC_OBS       OBSERVACIONT,
    LIQC_ANULADO   T_BOOLEANO
);

CREATE TABLE LIQUIDACION_RUTA_DET (
    LIQR_ID        T_ID NOT NULL,
    LIQD_ITEM      T_ID NOT NULL,
    LIQD_CONTRATO  T_ID,
    LIQD_DIAS      ENTERO,
    LIQD_VALOR     T_MONTO,
    LIQD_ANULADO   T_BOOLEANO,
    LIQD_OBS       OBSERVACIONT
);

CREATE TABLE LIQUIDACION_RUTA_EFE (
    LIQR_ID        T_ID NOT NULL,
    LIQE_ITEM      T_ID NOT NULL,
    LIQE_CONTRATO  T_ID,
    LIQE_VALOR     T_MONTO,
    LIQE_ANULADO   T_BOOLEANO,
    LIQE_OBS       OBSERVACIONT
);

CREATE TABLE LISTA_ARTICULOS (
    LIAR_ID      T_ID NOT NULL,
    LIAR_NOMBRE  T_CONCEPTO
);

CREATE TABLE LISTA_ARTICULOS_DET (
    LIAR_ID   T_ID NOT NULL,
    ARTI_COD  T_COD_ARTICULO NOT NULL
);

CREATE TABLE LISTA_PRECIOS (
    LIPR_COD        T_ID NOT NULL,
    LIPR_NOM        VARCHAR(30) NOT NULL,
    LIPR_COMI       T_PORCENTAJE,
    LIPR_DIASMAX    INTEGER,
    LIPR_FECINI     DATE,
    LIPR_FECFIN     DATE,
    LIPR_MARGEN     T_PORCENTAJE,
    LIPR_UTIL       T_PORCENTAJE,
    LIPR_COMIMONTO  T_MONTO,
    LIPR_MODIF      T_BOOLEANO,
    SUCU_ID         T_ID,
    LIPR_AUTO       T_BOOLEANO,
    LIPR_DIASEM     SMALLINT,
    LIPR_HORAINI    TIME,
    LIPR_HORAFIN    TIME,
    LIPR_DSCTO      T_PORCENTAJE,
    LIPR_PREDET     T_BOOLEANO,
    LIPR_DTOF1      T_PORCENTAJE,
    LIPR_DTOF1DIAS  ENTERO,
    LIPR_DTOF2      T_PORCENTAJE,
    LIPR_DTOF2DIAS  ENTERO,
    LIPR_DTOF3      T_PORCENTAJE,
    LIPR_DTOF3DIAS  ENTERO,
    LIPR_DTOF4      T_PORCENTAJE,
    LIPR_DTOF4DIAS  ENTERO,
    LIPR_GRUPLIS    T_CONCEPTO
);

CREATE TABLE LISTAPRE_USUARIOS (
    LIPR_COD  T_ID NOT NULL,
    USER_COD  T_USUARIO NOT NULL
);

CREATE TABLE LISTAPREC_VENDEDOR (
    VEND_COD  T_ID NOT NULL,
    LIPR_COD  T_ID NOT NULL
);

CREATE TABLE LISTAS_VENDEDOR (
    LIVE_ID      T_ID NOT NULL,
    LIVE_NOMBRE  T_CONCEPTO
);

CREATE TABLE LLAMADOS_ATENCION (
    LLAT_COD     ID NOT NULL,
    LLAT_NOMBRE  NOMBRE
);

CREATE TABLE LOTES (
    ARTI_COD        T_COD_ARTICULO NOT NULL,
    LOTE_NRO        T_LOTE NOT NULL,
    LOTE_FECHA      DATE NOT NULL,
    LOTE_CANT       T_CANTIDAD,
    LOTE_COSTO      T_MONTO,
    LOTE_SALDO      T_CANTIDAD,
    LOTE_ID         T_ID NOT NULL,
    LOTE_VENCE      DATE,
    BODE_COD        VARCHAR(2) NOT NULL,
    LOTE_COSTONIIF  T_MONTO
);

CREATE TABLE LUGAR_INSPECCION (
    LUIN_NOM  VARCHAR(60),
    LUIN_COD  CHAR(2) NOT NULL
);

CREATE TABLE MANIFIESTO_CARGA (
    MANC_ID         T_ID NOT NULL,
    MANC_REGION     VARCHAR(3),
    MANC_CODIGO     VARCHAR(4),
    MANC_FECHA      DATE,
    MANC_ORIGEN     VARCHAR(5),
    MANC_DESTINO    VARCHAR(5),
    MANC_VEHICULO   VARCHAR(8),
    MANC_CONDUCTOR  T_NIT,
    MANC_TOTAL      T_MONTO,
    MANC_RTFTEP     T_PORCENTAJE,
    MANC_RTFTEM     T_MONTO,
    MANC_DESCTO     T_MONTO,
    MANC_FLETENETO  T_MONTO,
    MANC_ANTICIPO   T_MONTO,
    MANC_APAGAR     T_MONTO,
    MANC_SEGCIA     T_NIT,
    MANC_SEGPOLIZA  T_CTA_CONTABLE,
    MANC_SEGVIG     DATE,
    MANC_LUGARPAGO  VARCHAR(5),
    MANC_CARGEPAGO  T_CONCEPTO,
    MANC_DESCARGE   T_CONCEPTO,
    MANC_OBS        VARCHAR(255),
    MANC_PREF       T_PROYECTO,
    MANC_NUMERO     T_NUMDOC,
    MANC_ANULADO    T_BOOLEANO,
    MANC_TRANSMIT   T_BOOLEANO,
    MANC_NUMOK      T_BOOLEANO,
    MANC_USUARIO    T_USUARIO,
    MANC_INGRESO    T_MONTO,
    MANC_CONTRAE    T_MONTO,
    MANC_PAGOFEC    DATE,
    MANC_ASOC       T_NIT
);

CREATE TABLE MANIFIESTO_CARGA_DET (
    MANC_ID        T_ID NOT NULL,
    MNCD_ITEM      T_ID NOT NULL,
    MNCD_REMESA    T_ID,
    MNCD_ANULADO   T_BOOLEANO,
    MNCD_TRANSMIT  T_BOOLEANO,
    MNCD_CONCEPTO  T_CONCEPTO,
    MNCD_VALOR     T_MONTO,
    MNCD_PREF      VARCHAR(4),
    MNCD_NUMERO    T_NUMDOC,
    MNCD_CONTRAE   T_MONTO
);

CREATE TABLE MANIFIESTOS_CARGA_CONC (
    MANC_ID        T_ID NOT NULL,
    MNCC_ITEM      T_ID NOT NULL,
    MNCC_CONC      T_ID,
    MNCC_VALOR     T_MONTO,
    MNCC_ANULADO   T_BOOLEANO,
    MNCC_TRANSMIT  T_BOOLEANO
);

CREATE TABLE MARCAS (
    MARC_COD      VARCHAR(3) NOT NULL,
    MARC_NOM      VARCHAR(30) NOT NULL,
    MARC_TIENDA   T_ID,
    MARC_DSCTO    T_PORCENTAJE,
    MARC_COMIPOR  T_PORCENTAJE
);

CREATE TABLE MEDIOS_MAGNETICOS_DATOS (
    MEMG_FORMATO       INTEGER NOT NULL,
    MEMG_ITEM          INTEGER NOT NULL,
    MEMG_CONCEPTO      INTEGER,
    MEMG_TIPODOC       INTEGER,
    MEMG_NIT           T_NIT,
    MEMG_DV            CHAR(1),
    MEMG_APELLIDO1     T_CONCEPTO,
    MEMG_APELLIDO2     T_CONCEPTO,
    MEMG_NOMBRE1       T_CONCEPTO,
    MEMG_NOMBRE2       T_CONCEPTO,
    MEMG_RAZONSOCIAL   T_CONCEPTO,
    MEMG_DIRECCION     T_CONCEPTO,
    MEMG_DEPARTAMENTO  CHAR(2),
    MEMG_MUNICIPIO     CHAR(3),
    MEMG_PAGO          T_MONTO,
    MEMG_RETENCION     T_MONTO,
    MEMG_ANO           CHAR(4) NOT NULL,
    MEMG_PAIS          CHAR(3),
    MEMG_PAGOND        T_MONTO,
    MEMG_IVA           T_MONTO,
    MEMG_IVAND         T_MONTO,
    MEMG_RETEASUM      T_MONTO,
    MEMG_RETIVACOMUN   T_MONTO,
    MEMG_RETIVASIMP    T_MONTO,
    MEMG_RETIVAND      T_MONTO,
    MEMG_RETCREE       T_MONTO,
    MEMG_RASUMC        T_MONTO
);

CREATE TABLE MEDIOS_TRANSPORTE (
    META_COD  INTEGER NOT NULL,
    META_NOM  VARCHAR(60)
);

CREATE TABLE MEDIOSMAG_ARCHIVOS (
    MEDM_FORMATO        INTEGER NOT NULL,
    MEDM_NOMBRE         T_CONCEPTO NOT NULL,
    MEDM_VERSION        VARCHAR(2),
    MEDM_VALOR1         VARCHAR(30),
    MEDM_VALOR2         VARCHAR(30),
    MEDM_VALOR3         VARCHAR(30),
    MEDM_VALOR4         VARCHAR(30),
    MEDM_VALOR5         VARCHAR(30),
    MEDM_VALOR6         VARCHAR(30),
    MEDM_VALOR7         VARCHAR(30),
    MEDM_VALOR8         VARCHAR(30),
    MEDM_VALOR9         VARCHAR(30),
    MEDM_PROCEDIMIENTO  T_CONCEPTO,
    MEDM_ORDEN          SMALLINT,
    MEDM_VALOR10        VARCHAR(30),
    MEDM_VALOR11        VARCHAR(30)
);

CREATE TABLE MEDIOSMAG_ARCHIVOS2014 (
    MM14_ID             T_ID NOT NULL,
    MM14_NOMBRE         VARCHAR(100),
    MM14_PROCEDIMIENTO  VARCHAR(60)
);

CREATE TABLE MEDIOSMAG_CUENTAS (
    MMCU_ITEM         T_ID NOT NULL,
    MMCU_CUENTA       T_CTA_CONTABLE,
    MMCU_CONS         T_ID NOT NULL,
    MMCU_CTARTF       T_CTA_CONTABLE,
    MMCU_CTAIVA       T_CTA_CONTABLE,
    MMCU_CTARTIVA     T_CTA_CONTABLE,
    MMCU_CTAIVAND     T_CTA_CONTABLE,
    MMCU_NATUR        CHAR(1),
    MMCU_CTARCREE     T_CTA_CONTABLE,
    MMCU_CTARTCREEAS  T_CTA_CONTABLE
);

CREATE TABLE MEDIOSMAG_DISTR_CUENTAS (
    MMDI_ARTICULO  T_ID NOT NULL,
    MMDI_ANO       CHAR(4) NOT NULL,
    MMDC_ITEM      T_ID NOT NULL,
    MMDC_CUENTA    T_CTA_CONTABLE,
    MMDC_CTASALDO  T_CTA_CONTABLE,
    MMDC_CTADEV    T_CTA_CONTABLE
);

CREATE TABLE MEDIOSMAG_DISTR_DATOS (
    MMDI_ARTICULO      INTEGER NOT NULL,
    MMDI_ANO           CHAR(4) NOT NULL,
    MMDD_ITEM          INTEGER NOT NULL,
    MMDD_TIPODOC       VARCHAR(3),
    MMDD_NIT           T_NIT,
    MMDD_NOMBRE        T_CONCEPTO,
    MMDD_DIRECCION     T_CONCEPTO,
    MMDD_TEL           T_TELEFONO,
    MMDD_EMAIL         VARCHAR(100),
    MMDD_CODMUNICIPIO  CHAR(5),
    MMDD_NOMMUNICIPIO  VARCHAR(60),
    MMDD_NOMDEPTO      VARCHAR(60),
    MMDD_BASE          T_MONTO,
    MMDD_TARIFA        T_MONTO,
    MMDD_MONTO         T_MONTO,
    MMDD_DEVOL         T_MONTO,
    MMDD_SALDO         T_MONTO,
    MMDD_FECHA         DATE,
    MMDD_DV            CHAR(1),
    MMDD_CONCSH        SMALLINT,
    MMDD_PAIS          CHAR(3)
);

CREATE TABLE MEDIOSMAG_DISTRITALES (
    MMDI_ARTICULO       T_ID NOT NULL,
    MMDI_NOMBRE         T_CONCEPTO,
    MMDI_ANO            CHAR(4) NOT NULL,
    MMDI_TOPE           T_MONTO,
    MMDI_PROY           T_PROYECTO,
    MMDI_CENTRO         T_CENTRO,
    MMDI_PROCEDIMIENTO  T_CONCEPTO,
    MMDI_NATUR          CHAR(1),
    MMDI_INCSALDO       T_BOOLEANO
);

CREATE TABLE MENSAJERIA (
    MENS_ID         T_ID NOT NULL,
    MENS_AUTOR      T_USUARIO,
    MENS_MENSAJE    VARCHAR(255),
    MENS_FECHA      DATE,
    MENS_HORA       TIME,
    MENS_NIVEL      INTEGER,
    MENS_DESTINO    T_USUARIO,
    MENS_LEIDO      T_BOOLEANO,
    MENS_FECLEIDO   DATE,
    MENS_HORALEIDO  TIME,
    MENS_RESPUESTA  T_ID
);

CREATE TABLE MODO_TRANSPORTE (
    MOTA_COD  INTEGER NOT NULL,
    MOTA_NOM  VARCHAR(60)
);

CREATE TABLE MODULOS (
    MODU_ID      INTEGER NOT NULL,
    MODU_NOMBRE  VARCHAR(30),
    PROG_ID      INTEGER NOT NULL
);

CREATE TABLE MOVIMIENTO_ARTICULO (
    ARTI_COD        T_COD_ARTICULO NOT NULL,
    MVAR_CONS       INTEGER NOT NULL,
    BODE_COD        VARCHAR(2) NOT NULL,
    MVAR_FECHA      DATE NOT NULL,
    MVAR_IDREF      T_ID NOT NULL,
    MVAR_CONC       VARCHAR(60),
    MVAR_CANT       T_CANTIDAD,
    MVAR_COSTO      T_MONTO,
    MVAR_ENTRADA    T_BOOLEANO,
    MVAR_LOTE       T_LOTE,
    MVAR_PREF       VARCHAR(4),
    MVAR_NUMERO     T_NUMDOC,
    MVAR_TIPODOC    INTEGER,
    MVAR_ITEM       INTEGER,
    TERC_NIT        T_NIT,
    MVAR_COSTONIIF  T_MONTO,
    CLSU_COD        VARCHAR(10)
);

CREATE TABLE MOVIMIENTO_BANCO (
    MOBA_ID        INTEGER NOT NULL,
    CUBA_COD       INTEGER,
    MOBA_PREF      VARCHAR(4) NOT NULL,
    MOBA_NUMERO    VARCHAR(8) NOT NULL,
    MOBA_FECHA     DATE NOT NULL,
    MOBA_CONCEPTO  VARCHAR(60),
    MOBA_TOTAL     NUMERIC(18,2),
    MOBA_DB        T_BOOLEANO NOT NULL,
    MOBA_IDREF     T_ID,
    MOBA_TIPODOC   INTEGER,
    MOBA_TIPOREF   INTEGER
);

CREATE TABLE MOVIMIENTO_CAJA (
    MOCA_ID        T_ID NOT NULL,
    CAJA_ID        T_ID NOT NULL,
    MOCA_FECHA     DATE NOT NULL,
    MOCA_DEBITOS   T_MONTO,
    MOCA_CREDITOS  T_MONTO,
    MOCA_CONC      VARCHAR(60),
    MOCA_DB        T_BOOLEANO NOT NULL,
    MOCA_TIPOREF   INTEGER,
    MOCA_PREFREF   VARCHAR(4),
    MOCA_NUMREF    T_NUMDOC,
    MOCA_IDREF     T_ID
);

CREATE TABLE MOVIMIENTO_CARGO_EMPLEADO (
    MVCE_ID     T_ID NOT NULL,
    TERC_NIT    T_NIT,
    MVCE_FECHA  FECHA,
    MVCE_CARGO  T_CONCEPTO
);

CREATE TABLE MOVIMIENTO_CLIENTES (
    MVCL_ID        T_ID NOT NULL,
    TERC_NIT       T_NIT NOT NULL,
    MVCL_TIPOREF   CHAR(2) NOT NULL,
    MVCL_IDREF     T_ID NOT NULL,
    MVCL_PREFREF   VARCHAR(4) NOT NULL,
    MVCL_NUMREF    T_NUMDOC NOT NULL,
    MVCL_FECHA     DATE NOT NULL,
    MVCL_VENCE     DATE NOT NULL,
    MVCL_CONC      VARCHAR(60),
    MVCL_MONTO     T_MONTO,
    MVCL_RTEFTE    T_MONTO,
    MVCL_RTEIVA    T_MONTO,
    MVCL_RTEICA    T_MONTO,
    MVCL_ABONO     T_BOOLEANO,
    MVCL_DEBITO    T_BOOLEANO,
    MVCL_SUCURSAL  VARCHAR(10),
    COBR_COD       T_ID,
    SUCU_ID        T_ID,
    MVCL_TRM       T_MONTO,
    MVCL_RCREE     T_MONTO
);

CREATE TABLE MOVIMIENTO_PROVEEDOR (
    MVPR_ID        T_ID NOT NULL,
    TERC_NIT       T_NIT NOT NULL,
    MVPR_TIPOREF   T_TIPODOC NOT NULL,
    MVPR_IDREF     T_ID NOT NULL,
    MVPR_FECHA     DATE NOT NULL,
    MVPR_VENCE     DATE NOT NULL,
    MVPR_CONC      VARCHAR(60),
    MVPR_MONTO     T_MONTO,
    MVPR_RTFTE     T_MONTO,
    MVPR_RTIVA     T_MONTO,
    MVPR_RTICA     T_MONTO,
    MVPR_ABONO     T_BOOLEANO NOT NULL,
    MVPR_DEBITO    T_BOOLEANO NOT NULL,
    MVPR_PREFIJO   VARCHAR(4),
    MVPR_NUMERO    VARCHAR(6),
    MVPR_TRM       T_MONTO,
    MVPR_MONTOMON  MONTO,
    MVPR_TIPOMON   INTEGER,
    MVPR_IMPORT    T_BOOLEANO,
    MVPR_RCREE     T_MONTO
);

CREATE TABLE MOVIMIENTO_SALARIO_EMPLEADO (
    MVSE_ID       INTEGER NOT NULL,
    TERC_NIT      NIT,
    MVSE_FECHA    DATE,
    MVSE_SALARIO  NUMERIC(18,2),
    MVSE_NOVEDAD  T_BOOLEANO,
    MVSE_FACSAL   T_PORCENTAJE
);

CREATE TABLE MOVIMIENTO_VINCUL_EMPLEADO (
    MVVE_ID     T_ID NOT NULL,
    TERC_NIT    T_NIT,
    MVVE_FECHA  FECHA,
    TIVU_COD    T_ID
);

CREATE TABLE NIVEL_FORMACION (
    NIVI_COD     ID NOT NULL,
    NIVI_NOMBRE  NOMBRE NOT NULL
);

CREATE TABLE NOMBRES_CAMPOS (
    NOMBRE       VARCHAR(30),
    DESCRIPCION  VARCHAR(50)
);

CREATE TABLE NOMBRES_COPIAS (
    NOCO_ID      INTEGER NOT NULL,
    NOCO_NOMBRE  VARCHAR(30) 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),
    NOMI_PAGOOK        BOOLEANO,
    NOMI_CONC          T_CONCEPTO,
    NOMI_TIPO          CHAR(1)
);

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     T_NUMDOC,
    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,
    NCDE_RCREE      T_MONTO
);

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,
    NCOM_FECDESDE      DATE,
    NCOM_FECHASTA      DATE
);

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 (
    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),
    NOCO_PROV        CHAR(1),
    NOCO_APORTE      BOOLEANO,
    NOCO_PAGOOK      BOOLEANO,
    NOCO_PERIODO     INTEGER,
    NOCO_ANO         ANO,
    NOCO_MOD         BOOLEANO,
    NOCO_APLICAPROM  BOOLEANO,
    NOCO_SALARIO     BOOLEANO,
    NOCO_GTOEMPR     CHAR(1),
    NOCO_NITCONT     NIT,
    NOCO_VALORCONT   NUMERIC(18,2),
    NOCO_BASE        NUMERIC(18,2),
    NOCO_CANT        T_MONTO,
    NOCO_BENPAG      TIPO_BENEF
);

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),
    NCOP_PROV        CHAR(1),
    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)
);

CREATE TABLE NOMINA_DEPARTAMENTO (
    NOMI_ID     INTEGER NOT NULL,
    NODP_DEPTO  INTEGER NOT NULL
);

CREATE TABLE NOMINA_DETALLE (
    NOMI_ID        ID NOT NULL,
    TERC_NIT       NIT NOT NULL,
    NODE_DIASLAB   INTEGER,
    NODE_FORMPAGO  CHAR(1)
);

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

CREATE TABLE NOMINA_HORASEXT (
    NOEX_PERIODIO      INTEGER NOT NULL,
    TERC_NIT           NIT NOT NULL,
    NOEX_MONTO         NUMERIC(18,2),
    NOEX_PERIODICIDAD  INTEGER,
    NOEX_ANO           CHAR(4) NOT NULL,
    NOEX_ORDNOCT       INTEGER,
    NOEX_SALBASE       MONTO,
    NOEX_MONTOREC      MONTO,
    NOEX_DIUR          NUMERIC(18,2),
    NOEX_FDIUR         NUMERIC(18,2),
    NOEX_NOCT          NUMERIC(18,2),
    NOEX_FNOCT         NUMERIC(18,2),
    NOEX_RECNOCT       NUMERIC(18,2),
    NOEX_RECFEST       NUMERIC(18,2),
    NOEX_MDIUR         T_MONTO,
    NOEX_MFDIUR        T_MONTO,
    NOEX_MNOCT         T_MONTO,
    NOEX_MRECNOCT      T_MONTO,
    NOEX_MRECFEST      T_MONTO,
    NOEX_MFNOCT        T_MONTO,
    NOEX_RECFNOC       T_MONTO,
    NOEX_MRECFNOC      T_MONTO,
    NOEX_DOMIN         MONTO,
    NOEX_MDOMIN        T_MONTO,
    NOEX_NOMID         T_ID
);

CREATE TABLE NOMINA_NOVEDADES (
    NONO_ID           ID NOT NULL,
    TERC_NIT          NIT NOT NULL,
    TNOV_COD          CHAR(3) NOT NULL,
    NONO_DIAINI       SMALLINT,
    NONO_DURA         SMALLINT,
    NONO_VALOR        MONTO,
    NONO_TIPOADM      CHAR(3),
    NONO_NVAADM       NIT,
    NONO_TIPOINCAP    BOOLEANO,
    NONO_VRAPORTEEM   MONTO,
    NONO_VRAPORTETR   MONTO,
    NONO_VRNORET      MONTO,
    NONO_PERIODO      ID,
    NONO_ANO          ANO,
    NONO_PPAGO        BOOLEANO,
    NONO_FECHA        FECHA,
    NONO_PRORROGA     BOOLEANO,
    NONO_OK           BOOLEANO,
    NONO_NROAUTO      INTEGER,
    NONO_NVODEPTO     INTEGER,
    NONO_AUTINCAPLIS  VARCHAR(15),
    NONO_PERHASTA     INTEGER,
    NONO_IBC          MONTO,
    NONO_MOTIVO       VARCHAR(255),
    NONO_DOMINICAL    T_BOOLEANO
);

CREATE TABLE NOMINA_NOVEDADES_DETALLE (
    NONO_ID        INTEGER NOT NULL,
    NNDE_PERIODO   INTEGER NOT NULL,
    NNDE_DIAINI    INTEGER,
    NNDE_VALOR     MONTO,
    NNDE_DURACION  INTEGER,
    NNDE_ANO       ANO,
    NNDE_PRORROGA  BOOLEANO,
    NOMI_ID        T_ID,
    NNDE_ITEM      T_ID NOT NULL,
    NNDE_PORC      T_PORCENTAJE,
    NNDE_TIPOINC   SMALLINT
);

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),
    NOPO_PAGOOK        BOOLEANO,
    NOPO_OK            BOOLEANO
);

CREATE TABLE NOMINA_SALDINI (
    TERC_NIT     T_NIT NOT NULL,
    NOSI_FECCES  DATE,
    NOSI_FECPRI  DATE,
    NOSI_FECVAC  DATE
);

CREATE TABLE NOMINA_UGPP_MESES (
    NUGM_ID     SMALLINT NOT NULL,
    NUGM_FECHA  FECHA
);

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

CREATE TABLE NORMAS_NIIF (
    NNIF_ID      T_ID NOT NULL,
    NNIF_NOMBRE  T_CONCEPTO
);

CREATE TABLE NORMAS_NIIF_DETALLE (
    NNIF_ID      T_ID NOT NULL,
    NNID_ITEM    T_ID NOT NULL,
    NNIF_NOMBRE  T_CONCEPTO,
    NNID_TEXTO   BLOB SUB_TYPE 1 SEGMENT SIZE 80
);

CREATE TABLE NOTA_CREDITO_PROV_DET (
    NCPR_ID        T_ID NOT NULL,
    NCPD_ITEM      T_ID NOT NULL,
    ACTI_COD       T_COD_ARTICULO,
    NCPD_CANT      T_CANTIDAD,
    NCPD_UNIDAD    T_UNIDAD,
    NCPD_COSTO     T_MONTO,
    NCPD_DESC      T_CONCEPTO,
    NCPD_TOTAL     T_MONTO,
    NCPD_ANULADO   T_BOOLEANO,
    NCPD_TRANSMIT  T_BOOLEANO
);

CREATE TABLE NOTA_DEBITO_PROV_DET (
    NDPR_ID        T_ID NOT NULL,
    NDPD_ITEM      T_ID NOT NULL,
    ARTI_COD       T_COD_ARTICULO,
    NDPD_CANT      T_CANTIDAD,
    NDPD_UNIDAD    T_UNIDAD,
    NDPD_COSTO     T_MONTO,
    NDPD_DESC      T_CONCEPTO,
    NDPD_TOTAL     T_MONTO,
    NDPD_ANULADO   T_BOOLEANO,
    NDPD_TRANSMIT  T_BOOLEANO
);

CREATE TABLE NOTAS_CLIENTES (
    NOCL_ID       T_ID NOT NULL,
    TERC_NIT      T_NIT,
    NOCL_FECHA    DATE,
    NOCL_TEXTO    VARCHAR(256),
    NOCL_ALARMA   DATE,
    TINO_COD      T_ID,
    NOCL_TIPODOC  T_ID,
    NOCL_IDDOC    T_ID,
    NOCL_NUMDOC   PREF_NUM,
    CLSU_COD      VARCHAR(10) NOT NULL
);

CREATE TABLE NOTAS_CREDITO (
    NCBC_ID        INTEGER NOT NULL,
    CUBA_COD       INTEGER NOT NULL,
    PRBA_PREF      VARCHAR(4) NOT NULL,
    NCBC_NUMERO    VARCHAR(8) NOT NULL,
    NCBC_FECHA     DATE NOT NULL,
    NCBC_CONCEPTO  VARCHAR(60),
    NCBC_MONTO     NUMERIC(18,2),
    NCBC_ANULADO   T_BOOLEANO,
    NCBC_TRANSMIT  T_BOOLEANO,
    NCBC_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE NOTAS_CREDITO_CLIENTES (
    NCCL_ID          T_ID NOT NULL,
    TERC_NIT         T_NIT NOT NULL,
    TIDO_COD         INTEGER NOT NULL,
    PREF_PRE         VARCHAR(4) NOT NULL,
    NCCL_NUMERO      T_NUMDOC NOT NULL,
    NCCL_FECHA       DATE NOT NULL,
    NCCL_CONC        VARCHAR(60),
    NCCL_MONTO       T_MONTO,
    NCCL_IVAPORC     T_PORCENTAJE,
    NCCL_IVAMONTO    T_MONTO,
    NCCL_RTFTEPORC   T_PORCENTAJE,
    NCCL_RTFTEMONTO  T_MONTO,
    NCCL_RTIVAPORC   T_PORCENTAJE,
    NCCL_RTIVAMONTO  T_MONTO,
    NCCL_RTICAPORC   T_PORCENTAJE,
    NCCL_RTICAMONTO  T_MONTO,
    NCCL_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NCCL_COMIPORC    T_PORCENTAJE,
    NCCL_COMIMONTO   T_MONTO,
    COBR_COD         T_ID,
    NCCL_ANULADO     T_BOOLEANO,
    NCCL_TRANSMIT    T_BOOLEANO,
    NCCL_USUARIO     T_USUARIO,
    NCCL_SUCURSAL    VARCHAR(10),
    NUMOK            T_BOOLEANO DEFAULT 'N',
    VEND_COD         T_ID,
    NCCL_TIPODOCAPL  INTEGER,
    NCCL_NUMDOCAPL   PREF_NUM,
    NCCL_TRM         T_MONTO,
    NCCL_ENVIADO     T_BOOLEANO,
    NCCL_FECENVIO    DATE,
    NCCL_USRENVIO    T_USUARIO,
    NCCL_ENVIOMED    VARCHAR(255),
    NCCL_EXENTO      T_MONTO,
    NCCL_BASE1       T_MONTO,
    NCCL_IVA1        T_MONTO,
    NCCL_BASE2       T_MONTO,
    NCCL_IVA2        T_MONTO,
    NCCL_BASE3       T_MONTO,
    NCCL_IVA3        T_MONTO,
    NCCL_RTCREE      T_PORCENTAJE,
    NCCL_RTCREEM     T_MONTO,
    NCCL_DTOPORC     T_PORCENTAJE,
    NCCL_DTOMONTO    T_MONTO,
    NCCL_ADICIONAL   T_MONTO,
    NCCL_EXTRA       T_MONTO
);

CREATE TABLE NOTAS_CREDITO_PROVEEDOR (
    NCPR_ID          T_ID NOT NULL,
    TERC_NIT         T_NIT NOT NULL,
    TIDO_COD         INTEGER NOT NULL,
    PREF_PRE         VARCHAR(4) NOT NULL,
    NCPR_NUMERO      T_NUMDOC NOT NULL,
    NCPR_FECHA       DATE NOT NULL,
    NCPR_CONC        VARCHAR(60),
    NCPR_MONTO       T_MONTO,
    NCPR_IVAPORC     T_PORCENTAJE,
    NCPR_IVAMONTO    T_MONTO,
    NCPR_RTFTEPORC   T_PORCENTAJE,
    NCPR_RTFTEMONTO  T_MONTO,
    NCPR_RTIVAPORC   T_PORCENTAJE,
    NCPR_RTIVAMONTO  T_MONTO,
    NCPR_RTICAPORC   T_PORCENTAJE,
    NCPR_RTICAMONTO  T_MONTO,
    NCPR_DTOFECHA    DATE,
    NCPR_DTOFPORC    T_PORCENTAJE,
    NCPR_DTOFMONTO   T_MONTO,
    NCPR_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NCPR_ANULADO     T_BOOLEANO,
    NCPR_TRANSMIT    T_BOOLEANO,
    ARTI_COD         T_COD_ARTICULO,
    NCPR_CTACAUSA    T_CTA_CONTABLE,
    NCPR_CTAPAGAR    T_CTA_CONTABLE,
    NCPR_USUARIO     T_USUARIO,
    NUMOK            T_BOOLEANO DEFAULT 'N',
    NCPR_TRM         TRM,
    NCPR_BASE0       T_MONTO,
    NCPR_BASE1       T_MONTO,
    NCPR_BASE2       T_MONTO,
    NCPR_IVA1        T_MONTO,
    NCPR_IVA2        T_MONTO,
    NCPR_BASE3       T_MONTO,
    NCPR_IVA3        T_MONTO,
    NCPR_BASERTFTE   T_MONTO,
    NCPR_RTCREE      T_PORCENTAJE,
    NCPR_RTCREEM     T_MONTO,
    NCPR_TIPODOCAPL  T_ID,
    NCPR_NUMDOCAPL   T_NUMDOC,
    NCPR_INALCM      T_MONTO,
    NCPR_FACID       T_ID,
    NCPR_CTACAUSAN   T_CTA_CONTABLE,
    NCPR_CTAPAGARN   T_CTA_CONTABLE,
    NCPR_NUMPROV     T_NUMPROV,
    NCPR_PROY        T_PROYECTO,
    NCPR_CENTRO      T_CENTRO,
    NCPR_ADICIONAL   T_MONTO,
    NCPR_EXTRA       T_MONTO,
    NCPR_DTOPORC     T_PORCENTAJE,
    NCPR_DTOMONTO    T_MONTO,
    NCPR_MONEDA      T_ID,
    NCPR_TOTALDET    T_MONTO,
    NCPR_TIPOCOSTO   CHAR(1)
);

CREATE TABLE NOTAS_DEBITO (
    NDBC_ID        INTEGER NOT NULL,
    CUBA_COD       INTEGER NOT NULL,
    PRBA_PREF      VARCHAR(4) NOT NULL,
    NDBC_NUMERO    VARCHAR(8) NOT NULL,
    NDBC_FECHA     DATE NOT NULL,
    NDBC_CONCEPTO  VARCHAR(60),
    NDBC_MONTO     NUMERIC(18,2),
    NDBC_IVAPORC   NUMERIC(9,2),
    NDBC_IVAMONTO  NUMERIC(18,2),
    NDBC_GMFPORC   NUMERIC(9,2),
    NDBC_GMFMONTO  NUMERIC(18,2),
    NDBC_ANULADO   T_BOOLEANO,
    NDBC_TRANSMIT  T_BOOLEANO,
    NDBC_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE NOTAS_DEBITO_CLIENTES (
    NDCL_ID          T_ID NOT NULL,
    TERC_NIT         T_NIT NOT NULL,
    TIDO_COD         INTEGER NOT NULL,
    PREF_PRE         VARCHAR(4) NOT NULL,
    NDCL_NUMERO      T_NUMDOC NOT NULL,
    NDCL_FECHA       DATE NOT NULL,
    NDCL_VENCE       DATE NOT NULL,
    NDCL_CONC        VARCHAR(60),
    NDCL_MONTO       T_MONTO,
    NDCL_IVAPORC     T_PORCENTAJE,
    NDCL_IVAMONTO    T_MONTO,
    NDCL_RTFTEPORC   T_PORCENTAJE,
    NDCL_RTFTEMONTO  T_MONTO,
    NDCL_RTIVAPORC   T_PORCENTAJE,
    NDCL_RTIVAMONTO  T_MONTO,
    NDCL_RTICAPORC   T_PORCENTAJE,
    NDCL_RTICAMONTO  T_MONTO,
    NDCL_FECHADTO    DATE,
    NDCL_DTOFPORC    T_PORCENTAJE,
    NDCL_DTOFMONTO   T_MONTO,
    NDCL_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NDCL_COMIPORC    T_PORCENTAJE,
    NDCL_COMIMONTO   T_MONTO,
    COBR_COD         T_ID,
    NDCL_ANULADO     T_BOOLEANO,
    NDCL_TRANSMIT    T_BOOLEANO,
    NDCL_USUARIO     T_USUARIO,
    NDCL_SUCURSAL    VARCHAR(10),
    NUMOK            T_BOOLEANO DEFAULT 'N',
    VEND_COD         T_ID,
    NDCL_TRM         T_MONTO,
    NDCL_TIPODOCAPL  T_ID,
    NDCL_NUMDOCAPL   VARCHAR(10),
    NDCL_ENVIADO     T_BOOLEANO,
    NDCL_FECENVIO    DATE,
    NDCL_USRENVIO    T_USUARIO,
    NDCL_ENVIOMED    VARCHAR(255),
    NDCL_EXENTO      T_MONTO,
    NDCL_BASE1       T_MONTO,
    NDCL_IVA1        T_MONTO,
    NDCL_BASE2       T_MONTO,
    NDCL_IVA2        T_MONTO,
    NDCL_BASE3       T_MONTO,
    NDCL_IVA3        T_MONTO,
    NDCL_RTCREE      T_PORCENTAJE,
    NDCL_RTCREEM     T_MONTO,
    NDCL_DTOPORC     T_PORCENTAJE,
    NDCL_DTOMONTO    T_MONTO,
    NDCL_ADICIONAL   T_MONTO,
    NDCL_EXTRA       T_MONTO
);

CREATE TABLE NOTAS_DEBITO_PROVEEDOR (
    NDPR_ID          T_ID NOT NULL,
    TERC_NIT         T_NIT NOT NULL,
    TIDO_COD         INTEGER NOT NULL,
    PREF_PRE         VARCHAR(4) NOT NULL,
    NDPR_NUMERO      T_NUMDOC NOT NULL,
    NDPR_FECHA       DATE NOT NULL,
    NDPR_CONC        VARCHAR(60),
    NDPR_VENCE       DATE NOT NULL,
    NDPR_MONTO       T_MONTO,
    NDPR_IVAPORC     T_PORCENTAJE,
    NDPR_IVAMONTO    T_MONTO,
    NDPR_RTFTEPORC   T_PORCENTAJE,
    NDPR_RTFTEMONTO  T_MONTO,
    NDPR_RTIVAPORC   T_PORCENTAJE,
    NDPR_RTIVAMONTO  T_MONTO,
    NDPR_RTICAPORC   T_PORCENTAJE,
    NDPR_RTICAMONTO  T_MONTO,
    NDPR_DTOFECHA    DATE,
    NDPR_DTOFPORC    T_PORCENTAJE,
    NDPR_DTOFMONTO   T_MONTO,
    NDPR_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NDPR_ANULADO     T_BOOLEANO,
    NDPR_TRANSMIT    T_BOOLEANO,
    NDPR_PROY        VARCHAR(4),
    NDPR_CENTRO      VARCHAR(4),
    NDPR_CTACAUSA    T_CTA_CONTABLE,
    NDPR_CTAPAGAR    T_CTA_CONTABLE,
    NDPR_NUMPROV     T_NUMPROV,
    NDPR_USUARIO     T_USUARIO,
    NUMOK            T_BOOLEANO DEFAULT 'N',
    NDPR_TRM         TRM,
    NDPR_BASE1       T_MONTO,
    NDPR_IVA1        T_MONTO,
    NDPR_BASE2       T_MONTO,
    NDPR_IVA2        T_MONTO,
    NDPR_BASE0       T_MONTO,
    ARTI_COD         T_COD_ARTICULO,
    NDPR_NUMCTR      VARCHAR(30),
    NDPR_BASE3       T_MONTO,
    NDPR_IVA3        T_MONTO,
    NDPR_BASERTFTE   T_MONTO,
    NDPR_RTCREE      T_PORCENTAJE,
    NDPR_RTCREEM     T_MONTO,
    NDPR_TIPOAPL     T_ID,
    NDPR_NUMAPL      VARCHAR(10),
    NDPR_INALCM      T_MONTO,
    NDPR_FACID       T_ID,
    NDPR_CTACAUSAN   T_CTA_CONTABLE,
    NDPR_CTAPAGARN   T_CTA_CONTABLE,
    NDPR_DTO1P       T_PORCENTAJE,
    NDPR_DTO2P       T_PORCENTAJE,
    NDPR_DTO3P       T_PORCENTAJE,
    NDPR_DTO4P       T_PORCENTAJE,
    NDPR_DTO1M       T_MONTO,
    NDPR_DTO2M       T_MONTO,
    NDPR_DTO3M       T_MONTO,
    NDPR_DTO4M       T_MONTO,
    NDPR_ADICIONAL   T_MONTO,
    NDPR_EXTRA       T_MONTO,
    NDPR_MONEDA      T_ID,
    NDPR_TOTALDET    T_MONTO,
    NDPR_TIPOCOSTO   CHAR(1)
);

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,
    NODO_RESUMEN  T_CONCEPTO,
    NODO_IMAGEN   VARCHAR(250)
);

CREATE TABLE NOTAS_ESTADOS_FINANCIEROS (
    NOEF_ID       T_ID NOT NULL,
    NOEF_ANO      SMALLINT,
    NOEF_PERIODO  SMALLINT,
    NOEF_CUENTA   T_CTA_CONTABLE,
    NOEF_NUMERO   SMALLINT,
    NOEF_TITULO   T_CONCEPTO,
    NOEF_NOTA     BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET ISO8859_1
);

CREATE TABLE NUMERO_COPIA (
    TIDO_COD    INTEGER NOT NULL,
    NUCO_ID     INTEGER NOT NULL,
    NUCO_COPIA  INTEGER
);

CREATE TABLE OPCIONES (
    OPCI_ID      INTEGER NOT NULL,
    MODU_ID      INTEGER NOT NULL,
    PROG_ID      INTEGER NOT NULL,
    OPCI_NOMBRE  VARCHAR(60)
);

CREATE TABLE OPCIONES_INTERFAZ (
    TIDO_COD     T_ID NOT NULL,
    OPIN_ITEM    INTEGER NOT NULL,
    OPIN_OPCION  VARCHAR(25),
    OPIN_TABLA   VARCHAR(30),
    OPIN_CAMPO   VARCHAR(30),
    OPIN_ID      T_ID NOT NULL
);

CREATE TABLE ORDEN_EMBARQUE (
    SLIM_ID         INTEGER NOT NULL,
    OREM_ID         INTEGER NOT NULL,
    TERC_NIT        VARCHAR(20),
    TIEM_COD        INTEGER,
    OREM_FECHA      DATE,
    OREM_PESO       NUMERIC(9,4),
    OREM_ALTO       NUMERIC(18,4),
    OREM_LARGO      NUMERIC(18,4),
    OREM_ANCHO      NUMERIC(18,4),
    OREM_VALOR      NUMERIC(18,2),
    FOPA_COD        INTEGER,
    OREM_FECLLEG    DATE,
    UNCA_COD        INTEGER,
    TICA_COD        INTEGER,
    META_COD        INTEGER,
    MOTA_COD        INTEGER,
    LUIN_COD        CHAR(2),
    TRAN_NIT        NIT,
    OREM_CONSOLIDA  INTEGER,
    OREM_VALORMON   NUMERIC(18,2),
    TIMO_COD        INTEGER,
    TACA_MONTO      NUMERIC(18,2),
    OREM_ANULADO    CHAR(1),
    OREM_VENCE      DATE,
    PREF_PRE        PREFIJO,
    OREM_NUMERO     T_NUMDOC,
    TIDO_COD        INTEGER,
    DETO_COD        INTEGER,
    DETO_NIT        T_NIT,
    OREM_SOLIMP     T_NUMDOC
);

CREATE TABLE ORDENES_COMPRA (
    ORDC_ID            T_ID NOT NULL,
    TERC_NIT           T_NIT NOT NULL,
    TIDO_COD           INTEGER NOT NULL,
    PREF_PRE           VARCHAR(4) NOT NULL,
    BODE_COD           VARCHAR(2) NOT NULL,
    ORDC_NUMERO        T_NUMDOC NOT NULL,
    ORDC_FECHA         DATE NOT NULL,
    ORDC_VALIDEZ       INTEGER NOT NULL,
    ORDC_CONC          VARCHAR(60),
    ORDC_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ORDC_DESPACHO      VARCHAR(255),
    ORDC_DTOPORC       T_PORCENTAJE,
    ORDC_DTOMONTO      T_MONTO,
    ORDC_ADICIONAL     T_MONTO,
    ORDC_EXTRA         T_MONTO,
    ORDC_DTOFPORC      T_PORCENTAJE,
    ORDC_DTOFMONTO     T_MONTO,
    ORDC_DTOFECHA      DATE,
    ORDC_TOTAL         T_MONTO,
    ORDC_COTIZACION    VARCHAR(10),
    ORDC_IMPTOS        T_BOOLEANO,
    ORDC_IVAMONTO      T_MONTO,
    ORDC_ANULADO       T_BOOLEANO,
    ORDC_TRANSMIT      T_BOOLEANO,
    ORDC_NROCOPIA      INTEGER,
    ORDC_DIASPAGO      SMALLINT,
    ORDC_CONSOLIDA     T_ID,
    ORDC_USUARIO       T_USUARIO,
    NUMOK              T_BOOLEANO DEFAULT 'N',
    ORDC_SIMPLIFICADO  T_BOOLEANO,
    ORDC_VENCE         DATE,
    ORDC_CONDENTREGA   VARCHAR(255),
    ORDC_RTFTEPORC     T_PORCENTAJE,
    ORDC_RTFTEMONTO    T_MONTO,
    ORDC_RTIVAPORC     T_PORCENTAJE,
    ORDC_RTIVAMONTO    T_MONTO,
    ORDC_RTICAPORC     T_PORCENTAJE,
    ORDC_RTICAMONTO    T_MONTO,
    ORDC_RTCREE        T_PORCENTAJE,
    ORDC_RTCREEM       T_MONTO,
    ORDC_DTO1IT        T_MONTO,
    ORDC_DTO2IT        T_MONTO,
    ORDC_DTO3IT        T_MONTO,
    ORDC_ESTADO        SMALLINT,
    ORDC_ORDENINV      T_NUMFACL
);

CREATE TABLE ORDENES_COMPRA_DETALLE (
    ORDC_ID           T_ID NOT NULL,
    OCDE_ITEM         T_ID NOT NULL,
    ARTI_COD          T_COD_ARTICULO NOT NULL,
    BODE_COD          VARCHAR(2) NOT NULL,
    OCDE_CANT         T_CANTIDAD,
    OCDE_UNIDAD       T_UNIDAD,
    OCDE_PRUNIT       T_MONTO,
    OCDE_DTOPORC      T_PORCENTAJE,
    OCDE_DTOMONTO     T_MONTO,
    OCDE_FACTOR       T_CANTIDAD,
    OCDE_DESC         VARCHAR(60),
    OCDE_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    OCDE_IVAPORC      T_PORCENTAJE,
    OCDE_IVAMONTO     T_MONTO,
    OCDE_CONSUMO      T_MONTO,
    OCDE_CODBAR       T_COD_ARTICULO,
    OCDE_FACTURADO    T_CANTIDAD,
    OCDE_REMISIONADO  T_CANTIDAD,
    OCDE_TOTAL        T_MONTO,
    OCDE_ANULADO      T_BOOLEANO,
    OCDE_TRANSMIT     T_BOOLEANO,
    OCDE_ORDENADO     T_CANTIDAD,
    OCDE_CODPROV      T_COD_ARTICULO,
    OCDE_DTO1         T_PORCENTAJE,
    OCDE_DTO2         T_PORCENTAJE,
    OCDE_DTO3         T_PORCENTAJE,
    OCDE_DTOM1        T_MONTO,
    OCDE_DTOM2        T_MONTO,
    OCDE_DTOM3        T_MONTO
);

CREATE TABLE ORDENES_COMPRA_DOCRELA (
    ORDC_ID       T_ID NOT NULL,
    ORCD_TIPOREL  INTEGER NOT NULL,
    ORCD_IDREL    T_ID NOT NULL
);

CREATE TABLE ORDENES_INVENTARIO (
    ORIN_ID        T_ID NOT NULL,
    TIDO_COD       INTEGER NOT NULL,
    PREF_PRE       VARCHAR(4) NOT NULL,
    ORIN_NUMERO    T_NUMDOC NOT NULL,
    ORIN_FECHA     DATE NOT NULL,
    ORIN_CONC      T_CONCEPTO,
    ORIN_TIPOREF   INTEGER,
    ORIN_IDREF     INTEGER,
    ORIN_IMPTOS    T_BOOLEANO,
    ORIN_NOMTERC   T_CONCEPTO,
    ORIN_ANULADO   T_BOOLEANO,
    ORIN_TRANSMIT  T_BOOLEANO,
    ORIN_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ORIN_FECLLEGA  DATE,
    ORIN_REFER     VARCHAR(20),
    BODE_COD       VARCHAR(2),
    TERC_NIT       T_NIT,
    ORIN_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE ORDENINVENTARIO_DETALLE (
    ORIN_ID        T_ID NOT NULL,
    ORID_ITEM      T_ID NOT NULL,
    ORID_CANT      T_CANTIDAD,
    ORID_UNIDAD    T_UNIDAD,
    ORID_FACTOR    T_CANTIDAD,
    ORID_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ORID_CODBAR    T_COD_ARTICULO,
    ORID_ENTREGAR  T_CANTIDAD,
    ARTI_COD       T_COD_ARTICULO,
    ORID_DESC      T_CONCEPTO,
    ORID_DTOPORC   T_PORCENTAJE,
    ORID_DTOMONTO  T_MONTO,
    ORID_IVAPORC   T_PORCENTAJE,
    ORID_IVAMONTO  T_MONTO,
    ORID_CONSUMO   T_MONTO,
    ORIN_COSTO     T_MONTO,
    ORID_LOTE      T_LOTE,
    ORID_ANULADO   T_BOOLEANO,
    ORID_TOTAL     T_MONTO,
    BODE_COD       VARCHAR(2)
);

CREATE TABLE PAGO_APORTES (
    PGAP_ID          ID NOT NULL,
    PGAP_ITEM        ID NOT NULL,
    PGAP_TIPOAP      CHAR(1),
    PGAP_CONPAGO     CHAR(2),
    PGAP_ADMIN       NIT NOT NULL,
    PGAP_MONTO       MONTO,
    PGAP_INTMORA     MONTO,
    PGAP_FECHA       FECHA,
    PGAP_FORMULARIO  VARCHAR(10),
    PGAP_IDNOMINA    INTEGER,
    PGAP_ANO         ANO,
    PGAP_MES         ID,
    PGAP_CTACONTA    T_CTA_CONTABLE
);

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,
    PADE_TIPAP       CHAR(3)
);

CREATE TABLE PAGO_APORTES_EMPLEADOS (
    PGAP_ID   INTEGER NOT NULL,
    TERC_NIT  NIT NOT NULL,
    PGAE_IBC  MONTO
);

CREATE TABLE PAGO_APORTES_NOM (
    PGAP_ID     T_ID NOT NULL,
    PGAP_IDNOM  T_ID NOT NULL,
    IDEGRESO    T_ID
);

CREATE TABLE PAGO_NOMINA (
    PGNO_ID        ID NOT NULL,
    PGNO_FECHA     FECHA NOT NULL,
    PGNO_MONTO     MONTO,
    PGNO_NIT       NIT,
    PGNO_PREF      T_PREFIJO,
    PGNO_NUMERO    T_NUMDOC,
    PGNO_ANULADO   T_BOOLEANO,
    PGNO_CONCEPTO  T_CONCEPTO,
    PGNO_CAJA      T_ID,
    PGNO_BANCO     T_ID,
    PGNO_TIPOBCO   ENTERO,
    PGNO_PREFBCO   T_PREFIJO,
    PGNO_NOMTERC   T_CONCEPTO,
    PGNO_IDCONS    T_ID,
    PGNO_GLOBAL    T_BOOLEANO,
    PGNO_MONTOB    T_MONTO,
    PGNO_MONTOC    T_MONTO
);

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),
    PGND_ANULADO  T_BOOLEANO
);

CREATE TABLE PAGO_NOMINA_EGRESOS (
    PGNO_ID       T_ID NOT NULL,
    PGNE_ITEM     T_ID NOT NULL,
    EGRE_ID       T_ID,
    PGNE_ANULADO  T_BOOLEANO
);

CREATE TABLE PAISES (
    PAIS_ID   CHAR(3) NOT NULL,
    PAIS_NOM  VARCHAR(60) NOT NULL
);

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),
    PAAN_NITARP      NIT,
    PAAN_CESEMP      PORCENTAJE,
    PAAN_RECNOC      PORCENTAJE,
    PAAN_RECFEST     PORCENTAJE,
    PAAN_CONSBANC    VARCHAR(1),
    PAAN_SALINTEG    T_PORCENTAJE,
    PAAN_PORCIEG     PORCENTAJE,
    PAAN_PORCIP      PORCENTAJE,
    PAAN_EPSDIASINC  SMALLINT,
    PAAN_UVT         MONTO,
    PAAN_MAXDEDMP    ENTERO,
    PAAN_MAXDEDDEP   ENTERO,
    PAAN_DEDDEP      T_PORCENTAJE,
    PAAN_MAXDEDAFC   ENTERO,
    PAAN_RECFESNOC   PORCENTAJE,
    PAAN_PORCIEG90   T_PORCENTAJE,
    PAAN_MAXFS       PORCENTAJE,
    PAAN_ALTORIESGO  T_PORCENTAJE
);

CREATE TABLE PARAMETROS_CONTABLES (
    PACO_ID           T_ID NOT NULL,
    PACO_SIGNIFICADO  VARCHAR(255) NOT NULL,
    PACO_CTACONTA     T_CTA_CONTABLE
);

CREATE TABLE PARENTESCO (
    PARE_COD     CHAR(1),
    PARE_NOM     VARCHAR(60),
    PARE_CODIGO  T_ID
);

CREATE TABLE PARQUEADERO (
    PARQ_ID        INTEGER NOT NULL,
    PARQ_VEHICULO  VARCHAR(8) NOT NULL,
    PARQ_FECINI    DATE NOT NULL,
    PARQ_HORAINI   TIME,
    PARQ_HORAFIN   TIME,
    PARQ_CANT      SMALLINT,
    PARQ_TARIFA    T_MONTO,
    PARQ_FECFIN    DATE,
    PARQ_FIJO      T_MONTO,
    PARQ_FACTURA   T_ID,
    PARQ_ANULADO   T_BOOLEANO,
    TIVH_COD       T_ID,
    PARQ_PREF      VARCHAR(4),
    PARQ_NUMERO    T_NUMDOC,
    PARQ_NUMOK     T_BOOLEANO
);

CREATE TABLE PEDIDO_WEB (
    PEWE_ID           T_ID NOT NULL,
    PEWE_FECHA        FECHA,
    TERC_NIT          T_NIT,
    PEWE_SUCURSAL     VARCHAR(10),
    PEWE_OBS          BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PEWE_ENTREGA      FECHA,
    PEWE_DIASCR       INTEGER,
    VEND_COD          T_ID,
    PEWE_DTOPORC      T_PORCENTAJE,
    PEWE_ADICIONAL    T_MONTO,
    PEWE_EXTRA        T_MONTO,
    PEWE_IVAMONTO     T_MONTO,
    PEWE_TOTAL        T_MONTO,
    PEWE_RTFTEPORC    T_PORCENTAJE,
    PEWE_RTIVAPORC    T_PORCENTAJE,
    PEWE_RTICAPORC    T_PORCENTAJE,
    PEWE_PREF         VARCHAR(4),
    PEWE_DTOMONTO     T_MONTO,
    PEWE_NUMPED       PREF_NUM,
    PEWE_IDPED        T_ID,
    PEWE_NOMCLI       T_CONCEPTO,
    PTVT_ID           T_ID,
    PEWE_EVENTO       T_ID,
    PEWE_AUTOCAR      T_ID,
    PEWE_AUTOCUPO     T_ID,
    PEWE_TIPOENTREGA  INTEGER,
    PEWE_HORAENTREGA  TIME,
    PEWE_IDOFFLINE    T_ID
);

CREATE TABLE PEDIDO_WEB_DETALLE (
    PEWE_ID          T_ID NOT NULL,
    PEWD_ITEM        T_ID NOT NULL,
    ARTI_COD         T_COD_ARTICULO,
    PEWD_CODBAR      T_COD_ARTICULO,
    BODE_COD         VARCHAR(2),
    PEWD_CANT        T_CANTIDAD,
    PEWD_UNIDAD      T_UNIDAD,
    PEWD_FACTOR      T_CANTIDAD,
    LIPR_COD         T_ID,
    PEWD_PRUNIT      T_MONTO,
    PEWD_DTOP        T_PORCENTAJE,
    PEWD_DTO1        T_PORCENTAJE,
    PEWD_DTO2        T_PORCENTAJE,
    PEWD_DTO3        T_PORCENTAJE,
    PEWD_IVAP        T_PORCENTAJE,
    PEWD_IVAMONTO    T_MONTO,
    PEWD_CONSUMO     T_MONTO,
    PEWD_TOTAL       T_MONTO,
    PEWD_REFERENCIA  T_CONCEPTO,
    PEWD_DTOM        T_MONTO,
    PEWD_DTO1M       T_MONTO,
    PEWD_DTO2M       T_MONTO,
    PEWD_DTO3M       T_MONTO,
    PEWD_DESC        T_CONCEPTO
);

CREATE TABLE PEDIDOS (
    PEDI_ID           T_ID NOT NULL,
    TERC_NIT          T_NIT NOT NULL,
    VEND_COD          T_ID NOT NULL,
    TIDO_COD          INTEGER NOT NULL,
    PREF_PRE          VARCHAR(4) NOT NULL,
    PEDI_NUMERO       T_NUMDOC NOT NULL,
    PEDI_FECHA        DATE NOT NULL,
    PEDI_VALIDEZ      INTEGER,
    PEDI_DESPACHO     VARCHAR(255),
    PEDI_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PEDI_IVAINC       T_BOOLEANO NOT NULL,
    PEDI_NOMTERC      VARCHAR(60),
    PEDI_DTOPOR       T_PORCENTAJE,
    PEDI_DTOMONTO     T_MONTO,
    PEDI_ADICIONAL    T_MONTO,
    PEDI_IVAMONTO     T_MONTO,
    PEDI_EXTRA        T_MONTO,
    PEDI_TOTAL        T_MONTO,
    PEDI_ANULADO      T_BOOLEANO,
    PEDI_TRANSMIT     T_BOOLEANO,
    PTVT_ID           T_ID,
    PEDI_COTIZACI     VARCHAR(30),
    PEDI_RTFTEPORC    T_PORCENTAJE,
    PEDI_RTFTEMONTO   T_MONTO,
    PEDI_RTIVAPORC    T_PORCENTAJE,
    PEDI_RTIVAMONTO   T_MONTO,
    PEDI_RTICAPORC    T_PORCENTAJE,
    PEDI_RTICAMONTO   T_MONTO,
    PEDI_NROCOPIA     INTEGER,
    PEDI_CONSOLIDA    T_ID,
    PEDI_USUARIO      T_USUARIO,
    PEDI_SUCURSAL     VARCHAR(10),
    NUMOK             T_BOOLEANO DEFAULT 'N',
    PEDI_FACTOR       DOUBLE PRECISION,
    PEDI_TRM          T_MONTO,
    PEDI_DTOIT1       T_MONTO,
    PEDI_DTOIT2       T_MONTO,
    PEDI_DTOIT3       T_MONTO,
    PEDI_VENCE        DATE,
    PEDI_DIASCR       SMALLINT,
    PEDI_IDENTR       T_ID,
    PEDI_PENDIENTE    T_BOOLEANO,
    PEDI_CANAL        T_ID,
    PEDI_ORDENC       VARCHAR(20),
    PEDI_ENTREGA      FECHA,
    PEDI_RTCREE       T_PORCENTAJE,
    PEDI_RTCREEM      T_MONTO,
    PEDI_NROORI       T_CONCEPTO,
    PEDI_PEDWEB       T_ID,
    PEDI_AUTOCAR      T_ID,
    PEDI_AUTOCUPO     T_ID,
    PEDI_EVENTO       T_ID,
    PEDI_TIPOENTREGA  T_ID,
    PEDI_HORAENTREGA  TIME,
    PEDI_CONSDIA      ENTERO,
    PEDI_ENTREGARA    T_CONCEPTO
);

CREATE TABLE PEDIDOS_DETALLE (
    PEDI_ID          T_ID NOT NULL,
    PEDE_ITEM        T_ID NOT NULL,
    ARTI_COD         T_COD_ARTICULO NOT NULL,
    PEDE_CANT        T_CANTIDAD,
    PEDE_UNIDAD      T_UNIDAD,
    PEDE_DTOPORC     T_PORCENTAJE,
    PEDE_DTOMONTO    T_MONTO,
    PEDE_IVAPORC     T_PORCENTAJE,
    PEDE_IVAMONTO    T_MONTO,
    PEDE_CONSUMO     T_MONTO,
    PEDE_FACTOR      T_CANTIDAD,
    PEDE_DESC        VARCHAR(255),
    PEDE_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PEDE_CODBAR      T_COD_ARTICULO,
    PEDE_TOTAL       T_MONTO,
    PEDE_ANULADO     T_BOOLEANO,
    PEDE_TRANSMIT    T_BOOLEANO,
    LIPR_COD         T_ID,
    PEDE_REFERENCIA  VARCHAR(60),
    PEDE_PRUNIT      T_MONTO,
    PEDE_FACTURAD    T_CANTIDAD,
    PEDE_REMISIONAD  T_CANTIDAD,
    PEDE_RESERVA     T_CANTIDAD,
    BODE_COD         VARCHAR(2),
    PEDE_DTO1        T_PORCENTAJE,
    PEDE_DTO2        T_PORCENTAJE,
    PEDE_DTO3        T_PORCENTAJE,
    PEDE_DTOM1       T_MONTO,
    PEDE_DTOM2       T_MONTO,
    PEDE_DTOM3       T_MONTO,
    PEDE_DEVUELTO    T_CANTIDAD,
    PEDE_PRLISTA     T_MONTO,
    PEDE_TIVA        SMALLINT
);

CREATE TABLE PEDIDOS_DOCRELA (
    PEDI_ID       INTEGER NOT NULL,
    PEDR_TIPOREL  INTEGER NOT NULL,
    PEDR_IDREL    INTEGER NOT NULL
);

CREATE TABLE PENDIENTE_VENTAS (
    PEND_ID        T_ID NOT NULL,
    PREF_PRE       VARCHAR(4),
    PEND_NUMERO    T_NUMDOC,
    PEND_FECHA     DATE,
    PEND_IDFACT    T_ID,
    PEND_FACTURA   PREF_NUM,
    BODE_COD       VARCHAR(2),
    TERC_NIT       T_NIT,
    PEND_SUCURSAL  VARCHAR(10),
    PEND_NOMCLI    T_CONCEPTO,
    VEND_COD       T_ID,
    PEND_ANULADO   T_BOOLEANO,
    PEND_TRANSMIT  T_BOOLEANO,
    NUMOK          T_BOOLEANO,
    PEND_USUARIO   T_USUARIO,
    PEND_TOTAL     T_MONTO,
    PEND_IVAMONTO  T_MONTO,
    PEND_IVAINC    T_BOOLEANO,
    PEND_OBS       BLOB SUB_TYPE 1 SEGMENT SIZE 80
);

CREATE TABLE PENDIENTE_VENTAS_DETALLE (
    PEND_ID          T_ID NOT NULL,
    PEVD_ITEM        T_ID NOT NULL,
    ARTI_COD         T_COD_ARTICULO,
    PEVD_CORBAR      T_COD_ARTICULO,
    BODE_COD         VARCHAR(2),
    PEVD_CANT        T_CANTIDAD,
    PEVD_UNIDAD      T_UNIDAD,
    PEVD_FACTOR      T_CANTIDAD,
    PEVD_LOTE        T_LOTE,
    PEVD_PRUNIT      T_MONTO,
    PEVD_DTOPORC     T_PORCENTAJE,
    PEVD_DTOMONTO    T_MONTO,
    PEVD_IVAPORC     T_PORCENTAJE,
    PEVD_IVAMONTO    T_MONTO,
    PEVD_CONSUMO     T_MONTO,
    PEVD_TOTAL       T_MONTO,
    PEVD_REFERENCIA  T_CONCEPTO,
    PEVD_DESC        VARCHAR(255),
    PEVD_OBS         BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PEVD_ANULADO     T_BOOLEANO,
    PEVD_TRANSMIT    T_BOOLEANO,
    PEVD_IDFACT      T_ID
);

CREATE TABLE PERFIL_EMPLEADO (
    PEEM_ID      T_ID NOT NULL,
    PEEM_NOMBRE  T_CONCEPTO
);

CREATE TABLE PERFIL_EMPLEADO_DETALLE (
    PEEM_ID   T_ID NOT NULL,
    CONC_COD  T_ID NOT NULL
);

CREATE TABLE PERIODO_PAGO (
    PPAG_COD      ID NOT NULL,
    PPAG_NOMBRE   NOMBRE NOT NULL,
    PPAG_PERIODO  ID,
    PPAG_DIAS     ID
);

CREATE TABLE PERIODO_PAGO_NOMBRE (
    PPAG_COD      INTEGER NOT NULL,
    PNOM_ITEM     INTEGER NOT NULL,
    PNOM_NOMBRE   NOMBRE,
    PPAG_PERIODO  INTEGER,
    PPAG_MESFIN   ENTERO,
    PPAG_DIAFIN   ENTERO
);

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,
    PLPR_ENTRADA      T_BOOLEANO,
    PLPR_BODORI       VARCHAR(2),
    PLPR_BODDES       VARCHAR(2)
);

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,
    PLPC_CODBAR     T_COD_ARTICULO,
    PLPC_DESC       T_CONCEPTO,
    PLPC_OBS        BLOB SUB_TYPE 1 SEGMENT SIZE 8192,
    PLPC_BASE       T_BOOLEANO
);

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

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,
    PLPD_MERMA     T_PORCENTAJE,
    PLPD_PESO      T_CANTIDAD,
    PLPD_LOTE      T_LOTE
);

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,
    ARPR_BASE     T_BOOLEANO
);

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),
    PLDI_CONC      T_CONCEPTO,
    PLDI_CONCITE   T_BOOLEANO,
    PLDI_NIT       T_NIT,
    PLDI_PROY      T_PROYECTO,
    PLDI_CENTRO    T_CENTRO
);

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),
    PLDC_BASE     T_BOOLEANO,
    PLDC_DB       T_BOOLEANO,
    PLDC_CUADRAR  T_BOOLEANO
);

CREATE TABLE PLANILLA_PASAJEROS (
    PLPA_ID         T_ID NOT NULL,
    PLPA_PREF       T_PROYECTO,
    PLPA_NUMERO     T_NUMDOC,
    PLPA_FECHA      DATE,
    PLPA_VEHICULO   VARCHAR(8),
    PLPA_HORA       TIME,
    PLPA_SUBTOTAL   T_MONTO,
    PLPA_NETO       T_MONTO,
    PLPA_DESPACHA   T_ID,
    PLPA_CONDUCTOR  T_NIT,
    PLPA_RUTA       T_ID,
    PLPA_ANULADO    T_BOOLEANO,
    PLPA_TRANSMIT   T_BOOLEANO,
    PLPA_OBS        VARCHAR(255),
    PLPA_REMESA     T_MONTO,
    PLPA_NUMOK      T_BOOLEANO,
    PLPA_USUARIO    T_USUARIO,
    PLPA_PASAJE     T_MONTO,
    PLPA_OTROS      T_MONTO,
    PLPA_CONTRAE    T_MONTO,
    PLPA_CAJA       T_ID
);

CREATE TABLE PLANILLA_PASAJEROS_CON (
    PLPA_ID        T_ID NOT NULL,
    PLPC_ITEM      T_ID NOT NULL,
    PLPC_CONC      T_ID,
    PLPC_VALOR     T_MONTO,
    PLPC_ANULADO   T_BOOLEANO,
    PLPC_TRANSMIT  T_BOOLEANO
);

CREATE TABLE PLANILLA_PASAJEROS_DET (
    PLPA_ID        T_ID NOT NULL,
    PLPA_ITEM      T_ID NOT NULL,
    PLPA_TIQUETE   T_ID,
    PLPA_ANULADO   T_BOOLEANO,
    PLPA_TRANSMIT  T_BOOLEANO,
    PLPA_VALOR     T_MONTO,
    PLPD_PREF      T_PROYECTO,
    PLPD_NUMERO    T_NUMDOC,
    PLPD_PASAJERO  T_CONCEPTO,
    PLPD_CONTADO   T_MONTO,
    PLPD_CREDITO   T_MONTO,
    PLPD_BASE      T_MONTO
);

CREATE TABLE PLANILLA_PASAJEROS_REM (
    PLPA_ID          T_ID NOT NULL,
    PLPA_ITEM        T_ID NOT NULL,
    PLPR_REMESA      T_ID,
    PLPR_ANULADO     T_BOOLEANO,
    PLPR_TRANSMIT    T_BOOLEANO,
    PLPR_PREF        T_PROYECTO,
    PLPR_NUMREM      T_NUMDOC,
    PLPR_VALOR       T_MONTO,
    PLPR_CONTRAE     T_MONTO,
    PLPR_CONTADO     T_MONTO,
    PLPR_CXCCONTRAE  T_MONTO
);

CREATE TABLE PLANTILLA_DETALLE (
    PLAN_ID        INTEGER NOT NULL,
    PLDE_ITEM      INTEGER NOT NULL,
    CUEN_COD       VARCHAR(20),
    PLDE_CONCEPTO  VARCHAR(60),
    PLDE_REFER     VARCHAR(8),
    PLDE_DEBITOS   NUMERIC(18,2),
    PLDE_CREDITOS  NUMERIC(18,2),
    PLDE_PORC      NUMERIC(9,2),
    TERC_NIT       T_NIT,
    PROY_COD       VARCHAR(4),
    CENT_COD       VARCHAR(4),
    PLDE_BASE      T_MONTO,
    ARTI_COD       T_COD_ARTICULO,
    CONC_COD       VARCHAR(4)
);

CREATE TABLE PLANTILLA_DETALLE_NIIF (
    PLAN_ID        INTEGER NOT NULL,
    PLDE_ITEM      INTEGER NOT NULL,
    CUEN_COD       VARCHAR(20),
    PLDE_CONCEPTO  VARCHAR(60),
    PLDE_REFER     VARCHAR(8),
    PLDE_DEBITOS   NUMERIC(18,2),
    PLDE_CREDITOS  NUMERIC(18,2),
    PLDE_PORC      NUMERIC(9,2),
    TERC_NIT       T_NIT,
    PROY_COD       VARCHAR(4),
    CENT_COD       VARCHAR(4),
    PLDE_BASE      T_MONTO,
    ARTI_COD       T_COD_ARTICULO,
    CONC_COD       VARCHAR(4)
);

CREATE TABLE PLANTILLA_ENCABEZADO (
    PLAN_ID        INTEGER NOT NULL,
    TICO_COD       T_TIPO_COMP,
    PRCO_PREF      VARCHAR(4),
    PLAN_CONCEPTO  VARCHAR(60) NOT NULL,
    PLAN_REFER     VARCHAR(8),
    PLAN_USUARIO   T_USUARIO
);

CREATE TABLE PRECIOS_ARTICULO (
    LIPR_COD        T_ID NOT NULL,
    ARTI_COD        T_COD_ARTICULO NOT NULL,
    PRAR_FIJO       T_MONTO,
    PRAR_MARGEN     T_PORCENTAJE,
    PRAR_UTIL       T_PORCENTAJE,
    PRAR_AUTO       T_BOOLEANO,
    PRAR_CONSUMO    T_MONTO,
    PRAR_COMI       T_PORCENTAJE,
    PRAR_COMIMONTO  T_MONTO,
    PRAR_CANTMIN    T_CANTIDAD,
    PRAR_DTO1       T_PORCENTAJE,
    PRAR_DTO2       T_PORCENTAJE,
    PRAR_COMIC      T_PORCENTAJE,
    PRAR_REDON      SMALLINT
);

CREATE TABLE PREFIJOS (
    TIDO_COD      INTEGER NOT NULL,
    PREF_PRE      VARCHAR(4) NOT NULL,
    PREF_ACTUAL   T_NUMDOC NOT NULL,
    PREF_AUTO     T_BOOLEANO NOT NULL,
    PREF_IVAINC   T_BOOLEANO NOT NULL,
    PREF_PROY     VARCHAR(4),
    PREF_CENTRO   VARCHAR(4),
    PREF_ACTIVO   T_BOOLEANO,
    PREF_USUARIO  T_USUARIO,
    TICO_COD      T_TIPO_COMP,
    SUCU_ID       T_ID,
    PREF_DEC1818  T_BOOLEANO
);

CREATE TABLE PREFIJOS_BANCOS (
    CUBA_COD      INTEGER NOT NULL,
    PRBA_PREF     VARCHAR(4) NOT NULL,
    PRBA_NUMERO   T_NUMDOC NOT NULL,
    PRBA_AUTO     T_BOOLEANO,
    TIDO_COD      INTEGER NOT NULL,
    PRBA_PROY     VARCHAR(4),
    PRBA_CENTRO   VARCHAR(4),
    PRBA_USUARIO  T_USUARIO,
    TICO_COD      T_TIPO_COMP,
    PRBA_ACTIVO   T_BOOLEANO
);

CREATE TABLE PREFIJOS_CONTA (
    TICO_COD      T_TIPO_COMP NOT NULL,
    PRCO_PREF     VARCHAR(4) NOT NULL,
    PRCO_AUTO     CHAR(1) NOT NULL,
    PREF_NUMERO   CHAR(6) NOT NULL,
    PRCO_USUARIO  T_USUARIO,
    PRCO_ACTIVO   T_BOOLEANO
);

CREATE TABLE PREFIJOS_EXPORTACION (
    PREX_PREF     VARCHAR(4) NOT NULL,
    PREX_EXPORTA  VARCHAR(10),
    PREX_TIPO     CHAR(3),
    PREX_TIPOEXP  VARCHAR(10)
);

CREATE TABLE PRESTAMO_CUOTAS (
    PRNO_ID       ID NOT NULL,
    PRCU_ITEM     ID NOT NULL,
    PRCU_MONTO    MONTO,
    PRCU_PERIODO  INTEGER,
    PRCU_ANO      ANO,
    PRCU_OK       BOOLEANO,
    PRCU_ABONO    T_MONTO,
    PRCU_NOMIID   T_ID,
    PRCU_GASTO    MONTO
);

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,
    PRNO_ENTIDAD   T_NIT,
    PRNO_CONC      T_CONCEPTO,
    CONC_COD       T_ID,
    PRNO_GASTOS    MONTO,
    PRNO_CTAGASTO  CTACONTA
);

CREATE TABLE PRESUPUESTO (
    CUEN_COD      T_CTA_CONTABLE NOT NULL,
    PRES_PERIODO  INTEGER NOT NULL,
    PRES_DEBITO   T_MONTO,
    PRES_CREDITO  T_MONTO,
    PRES_ANO      CHAR(4) NOT NULL,
    PRES_AFECTA   T_BOOLEANO,
    PROY_COD      T_PROYECTO,
    CENT_COD      T_CENTRO
);

CREATE TABLE PRESUPUESTO_VENTAS (
    VEND_COD        INTEGER NOT NULL,
    PRVE_ANO        INTEGER NOT NULL,
    PRVE_MES        INTEGER NOT NULL,
    PRVE_VENTA      T_MONTO,
    PRVE_RECAUDO    T_MONTO,
    PRVE_PENDIENTE  T_MONTO,
    PRVE_PENDRECA   T_MONTO
);

CREATE TABLE PRESUPUESTO_VENTAS_GRUPO (
    VEND_COD   INTEGER NOT NULL,
    GRUP_COD   VARCHAR(2) NOT NULL,
    SUBG_COD   VARCHAR(3) NOT NULL,
    PRVG_ANO   CHAR(4) NOT NULL,
    PRVG_MES   INTEGER NOT NULL,
    PRVG_META  T_CANTIDAD
);

CREATE TABLE PRESUPUESTO_VENTAS_MESES (
    PRVM_ANO   INTEGER NOT NULL,
    PRVM_MES   INTEGER NOT NULL,
    PRVM_DIAS  INTEGER
);

CREATE TABLE PROCEDIMIENTOS_USUARIO (
    PRUS_COD     T_ID NOT NULL,
    PRUS_NOMBRE  T_CONCEPTO,
    PRUS_SP      VARCHAR(250),
    PRUS_PARAM1  T_CONCEPTO,
    PRUS_PARAM2  T_CONCEPTO,
    PRUS_PARAM3  T_CONCEPTO,
    PRUS_PARAM4  T_CONCEPTO,
    PRUS_PARAM5  T_CONCEPTO,
    PRUS_MODULO  T_CONCEPTO
);

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,
    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
);

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_OBS       BLOB SUB_TYPE 1 SEGMENT SIZE 80
);

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),
    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,
    PRDE_COSTO       T_MONTO,
    PRDE_LOTE        T_LOTE,
    PRDE_RECHAZADO   T_COD_ARTICULO,
    PRDE_BODPROD     VARCHAR(2),
    PRDE_BODRECH     VARCHAR(2)
);

CREATE TABLE PRODUCCION_MONTAJE (
    PROR_ID        T_ID NOT NULL,
    PRMO_ITEM      T_ID NOT NULL,
    PRMO_PROCESO   T_CONCEPTO,
    PRMO_MINUTOS   SMALLINT,
    PRMO_MINUTOSR  SMALLINT,
    PRMO_ANULADO   T_BOOLEANO,
    PRMO_TRANSMIT  T_BOOLEANO
);

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,
    PROR_ESTADO      CHAR(1),
    PROR_NOMCLIENTE  T_CONCEPTO,
    ARTI_COD         T_COD_ARTICULO,
    PROR_FECMONTAJE  DATE
);

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,
    PODE_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
);

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,
    PRSA_BODEGA      VARCHAR(2)
);

CREATE TABLE PRODUCTO_MONTAJE (
    ARTI_COD      T_COD_ARTICULO NOT NULL,
    PRMO_ITEM     T_ID NOT NULL,
    PRMO_PROCESO  T_CONCEPTO,
    PRMO_MINUTOS  SMALLINT
);

CREATE TABLE PROGRAM_VACACIONES (
    PRVA_ITEM   INTEGER NOT NULL,
    TERC_NIT    NIT,
    PRVA_FECHA  DATE
);

CREATE TABLE PROGRAMACION_PAGOS (
    PRPG_FECHA    FECHA NOT NULL,
    PRPG_TIPODOC  T_ID NOT NULL,
    PRPG_IDDOC    T_ID NOT NULL,
    PRPG_ABONO    T_MONTO,
    PRPG_COB      CHAR(1),
    PRPG_IDCAJA   T_ID,
    PRPG_EGRESO   T_BOOLEANO,
    PRPG_PREF     VARCHAR(4),
    PRPG_TIPOBCO  T_ID,
    PRPG_PREFBCO  VARCHAR(4),
    PRPG_IDEGRE   T_ID
);

CREATE TABLE PROGRAMAS (
    PROG_ID   INTEGER NOT NULL,
    PROG_NOM  VARCHAR(60) NOT NULL
);

CREATE TABLE PROMEDIO_SALIDAS (
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    PRSA_PROMEDIO  T_CANTIDAD,
    PRSA_FECHA     DATE NOT NULL
);

CREATE TABLE PROVEEDOR_ARTICULO (
    TERC_NIT     T_NIT NOT NULL,
    ARTI_COD     T_COD_ARTICULO NOT NULL,
    PVAR_COD     VARCHAR(15),
    PVAR_DES     VARCHAR(60),
    PVAR_COSTO   T_MONTO,
    PVAR_FECHA   DATE,
    PVAR_TRM     T_MONTO,
    PVAR_UNIDAD  T_UNIDAD,
    PVAR_FACTOR  T_CANTIDAD
);

CREATE TABLE PROVEEDORES (
    TERC_NIT           T_NIT NOT NULL,
    GRPR_COD           VARCHAR(2) NOT NULL,
    PROV_COD           VARCHAR(15),
    PROV_CODIGOINT     VARCHAR(15),
    PROV_VENDEDOR      VARCHAR(60),
    PROV_CARTERA       VARCHAR(60),
    PROV_RETEFTE       T_PORCENTAJE,
    PROV_RTEIVA        T_PORCENTAJE,
    PROV_RTEICA        T_PORCENTAJE,
    PROV_RTFTEBASE     T_MONTO,
    PROV_CTAPAGAR      T_CTA_CONTABLE,
    PROV_CTARTFTE      T_CTA_CONTABLE,
    PROV_CTARTIVA      T_CTA_CONTABLE,
    PROV_CTARTICA      T_CTA_CONTABLE,
    PROV_DIASPAGO      SMALLINT,
    PROV_SIMPLIFICADO  T_BOOLEANO,
    PROV_CTACAUSA      T_CTA_CONTABLE,
    PROV_USUARIO       T_USUARIO,
    PROV_RTICABASE     T_MONTO,
    PROV_RTCREE        T_PORCENTAJE,
    PROV_CTARTCREE     T_CTA_CONTABLE,
    PROV_CTAPAGNIIF    T_CTA_CONTABLE,
    PROV_CTARFTENIIF   T_CTA_CONTABLE,
    PROV_CTARIVANIIF   T_CTA_CONTABLE,
    PROV_CTARICANIIF   T_CTA_CONTABLE,
    PROV_CTARCREENIIF  T_CTA_CONTABLE,
    PROV_CTACAUSANIIF  T_CTA_CONTABLE
);

CREATE TABLE PROVISION_CARTERA (
    PRCA_ITEM     T_ID NOT NULL,
    PRCA_DIASINI  SMALLINT,
    PRCA_PORC     T_PORCENTAJE
);

CREATE TABLE PROYECTOS (
    PROY_COD  T_PROYECTO NOT NULL,
    PROY_NOM  VARCHAR(60) NOT NULL
);

CREATE TABLE PRUEBAS (
    PRUE_ID  T_ID NOT NULL
);

CREATE TABLE PUC (
    TIPU_COD     INTEGER NOT NULL,
    PUC_COD      VARCHAR(20) NOT NULL,
    PUC_NOM      VARCHAR(60) NOT NULL,
    PUC_TERC     T_BOOLEANO,
    PUC_RETEN    T_BOOLEANO,
    PUC_CTAAJUS  T_CTA_CONTABLE,
    PUC_CTACORR  T_CTA_CONTABLE,
    PUC_AJDB     T_BOOLEANO
);

CREATE TABLE PUESTOS (
    PUES_COD  T_ID NOT NULL,
    PUES_NOM  VARCHAR(30) NOT NULL,
    VEND_COD  INTEGER,
    BODE_COD  VARCHAR(2)
);

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

CREATE TABLE PUNTO_VENTA (
    PTVT_ID          T_ID NOT NULL,
    BODE_COD         VARCHAR(2) NOT NULL,
    PTVT_NOM         VARCHAR(60) NOT NULL,
    PTVT_RESP        VARCHAR(60),
    CAJA_ID          T_ID,
    PTVT_COLOR       VARCHAR(8),
    PREF_PRE         VARCHAR(4),
    TERC_NIT         T_NIT,
    SUCU_ID          T_ID,
    PTVT_BALPTO      VARCHAR(4),
    PTVT_BALPOSP     INTEGER,
    PTVT_BALLONC     INTEGER,
    PTVT_MONPTO      VARCHAR(4),
    PTVT_BALFACTOR   T_CANTIDAD,
    PTVT_MODPREC     T_BOOLEANO,
    PTVT_ACTIVO      T_BOOLEANO,
    PTVT_DEC2799     T_BOOLEANO,
    PTVT_IDDIAN      VARCHAR(20),
    PTVT_FECCIE      FECHA,
    PTVT_CAJACIERRE  T_ID,
    PTVT_CAJADIF     T_ID,
    PTVT_PREFPED     PREFIJO,
    PTVT_BALINVERT   T_BOOLEANO,
    PTVT_BALCAR      T_LOTE,
    PTVT_BALLEE      T_BOOLEANO,
    PTVT_PREFCOT     PREFIJO
);

CREATE TABLE PUNTOS_ARTICULOS (
    PTAR_COD     T_COD_ARTICULO NOT NULL,
    PTAR_FACTOR  INTEGER
);

CREATE TABLE PUNTOS_CLIENTE (
    PTCL_ID       T_ID NOT NULL,
    PTCL_NIT      T_NIT NOT NULL,
    PTCL_FECHA    DATE,
    PTCL_TIPODOC  INTEGER,
    PTCL_IDDOC    T_ID,
    PTCL_DB       T_MONTO,
    PTCL_CR       T_MONTO,
    PTCL_SALDO    T_MONTO
);

CREATE TABLE PUNTOS_CLIENTE_ACUMULADO (
    TERC_NIT        T_NIT NOT NULL,
    PTCA_FECHA      DATE NOT NULL,
    PTCA_ACUMULADO  T_MONTO,
    PTCA_PORVENCER  T_MONTO
);

CREATE TABLE PUNTOS_DIASESPECIAL (
    PTDE_ID      T_ID NOT NULL,
    PTDE_FECINI  DATE,
    PTDE_FECFIN  DATE,
    PTDE_HORINI  TIME,
    PTDE_HORFIN  TIME,
    PTDE_FACTOR  INTEGER
);

CREATE TABLE PUNTOS_PREMIOS (
    PTPR_COD     T_COD_ARTICULO NOT NULL,
    PTPR_NOMBRE  T_CONCEPTO,
    PTPR_INVEN   T_BOOLEANO,
    PTPR_ACTIVO  T_BOOLEANO,
    PTPR_PUNTOS  INTEGER
);

CREATE TABLE PUNTOS_REDENCION (
    PTRE_ID       T_ID NOT NULL,
    PTRE_NUMERO   T_NUMDOC NOT NULL,
    PTRE_FECHA    DATE,
    PTRE_NIT      T_NIT,
    PTPR_COD      T_COD_ARTICULO,
    PTRE_PUNTOS   INTEGER,
    PTRE_ANULADO  T_BOOLEANO
);

CREATE TABLE PUNTOS_VEND_REDENCION (
    PTVR_ID       T_ID NOT NULL,
    PTVR_NUMERO   T_NUMDOC,
    PTVR_FECHA    DATE,
    PTVR_VEND     INTEGER,
    PTVR_PUNTOS   T_MONTO,
    PTVR_ANULADO  T_BOOLEANO,
    PTVR_PREMIO   T_CONCEPTO
);

CREATE TABLE PUNTOS_VENDEDOR (
    PTVT_ID       T_ID NOT NULL,
    VEND_COD      T_ID NOT NULL,
    PTVT_FECHA    DATE,
    PTVT_TIPODOC  T_ID,
    PTVT_IDDOC    T_ID,
    PTVT_DB       T_CANTIDAD,
    PTVT_CR       T_CANTIDAD,
    PTVT_SALDO    T_CANTIDAD
);

CREATE TABLE RECAUDO (
    RECR_ID          T_ID NOT NULL,
    RECR_FECHA       FECHA,
    RECR_REFERENCIA  T_NIT,
    RECR_MONTO       T_MONTO,
    RECA_ID          T_ID
);

CREATE TABLE RECIBO_PROVISIONAL (
    RCPR_ID        T_ID NOT NULL,
    TERC_NIT       T_NIT NOT NULL,
    VEND_COD       T_ID,
    TIDO_COD       INTEGER NOT NULL,
    PREF_PRE       VARCHAR(4) NOT NULL,
    CAJA_ID        T_ID NOT NULL,
    RCPR_NUMERO    T_NUMDOC NOT NULL,
    RCPR_FECHA     DATE NOT NULL,
    RCPR_CONC      VARCHAR(60),
    RCPR_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    RCPR_NOMTERC   VARCHAR(60),
    RCPR_ANULADO   T_BOOLEANO,
    RCPR_TRANSMIT  T_BOOLEANO,
    RCPR_DTOF      T_MONTO,
    RCPR_RTFTE     T_MONTO,
    RCPR_RTIVA     T_MONTO,
    RCPR_RTICA     T_MONTO,
    RCPR_MONTO     T_MONTO,
    RCPR_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N',
    SUCU_ID        T_ID,
    RCPR_IDCRUCE   T_ID,
    RCPR_FECCRUCE  DATE,
    RCPR_TRM       T_MONTO,
    RCPR_RCREE     T_MONTO
);

CREATE TABLE RECIBO_PROVISIONAL_DETALLE (
    RCPR_ID        T_ID NOT NULL,
    RPDE_ITEM      T_ID NOT NULL,
    RPDE_NUMDOC    T_NUMDOC NOT NULL,
    RPDE_RTFTE     T_MONTO,
    RPDE_RTIVA     T_MONTO,
    RPDE_RTICA     T_MONTO,
    RPDE_DTOF      T_MONTO,
    RPDE_ABONO     T_MONTO,
    RPDE_PREFDOC   VARCHAR(4),
    RPDE_ANULADO   T_BOOLEANO,
    RPDE_TRANSMIT  T_BOOLEANO,
    RPDE_TIPODOC   INTEGER,
    RPDE_IDDOC     INTEGER,
    RPDE_SUCURSAL  VARCHAR(10) NOT NULL,
    RPDE_RCREE     T_MONTO
);

CREATE TABLE RECIBO_PROVISIONAL_PAGO (
    RCPR_ID        T_ID NOT NULL,
    RPPA_ITEM      T_ID NOT NULL,
    FOPA_ID        T_ID NOT NULL,
    RPPA_BANCO     VARCHAR(2),
    RPPA_CUENTA    VARCHAR(20),
    RPPA_NUMERO    VARCHAR(20),
    RPPA_FECHA     DATE,
    RPPA_MONTO     T_MONTO,
    RPPA_ANULADO   T_BOOLEANO,
    RPPA_TRANSMIT  T_BOOLEANO
);

CREATE TABLE RECIBOS_CAJA (
    RECA_ID           T_ID NOT NULL,
    CAJA_ID           T_ID NOT NULL,
    TIDO_COD          INTEGER NOT NULL,
    PREF_PRE          VARCHAR(4) NOT NULL,
    RECA_NUMERO       T_NUMDOC NOT NULL,
    RECA_FECHA        DATE NOT NULL,
    RECA_CONC         VARCHAR(60),
    RECA_MONTO        T_MONTO,
    RECA_RTFTEMONTO   T_MONTO,
    RECA_RTIVAMONTO   T_MONTO,
    RECA_RTICAMONTO   T_MONTO,
    RECA_DTOF         T_MONTO,
    RECA_OBS          BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TERC_NIT          T_NIT,
    RECA_NOMTERC      T_CONCEPTO,
    RECA_ANULADO      T_BOOLEANO,
    RECA_TRANSMIT     T_BOOLEANO,
    COBR_COD          INTEGER,
    RECA_PROVISIONAL  VARCHAR(10),
    RECA_PROVID       T_ID,
    RECA_USUARIO      T_USUARIO,
    NUMOK             T_BOOLEANO DEFAULT 'N',
    RECA_TRM          TRM,
    RECA_EXEDENTE     T_MONTO,
    CONS_ID           T_ID,
    RECA_PAGANOM      T_BOOLEANO,
    RECA_RTCREEM      T_MONTO,
    RECA_PRESTAMO     T_ID
);

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,
    RCCR_DIFCAMBIO  T_MONTO,
    RCCR_NUMPROV    T_NUMPROV,
    RCCR_RCREE      T_MONTO
);

CREATE TABLE RECIBOS_CAJA_DETALLE (
    RECA_ID         T_ID NOT NULL,
    RCDE_ITEM       INTEGER NOT NULL,
    RCDE_TIPODOC    INTEGER,
    RCDE_IDDOC      T_ID,
    RCDE_PREFIJO    VARCHAR(4),
    RCDE_NUMERO     T_NUMDOC,
    RCDE_ABONO      T_MONTO,
    RCDE_RTFTE      T_MONTO,
    RCDE_RTIVA      T_MONTO,
    RCDE_RTICA      T_MONTO,
    RCDE_DTOF       T_MONTO,
    RCDE_ANULADO    T_BOOLEANO,
    RCDE_TRANSMIT   T_BOOLEANO,
    RCDE_COMIP      VARCHAR(2),
    RCDE_SUCURSAL   VARCHAR(10) NOT NULL,
    RCDE_DIFCAMBIO  T_MONTO,
    RCDE_COBR       INTEGER,
    RCDE_RCREE      T_MONTO
);

CREATE TABLE RECIBOS_CAJA_PAGO (
    RECA_ID        T_ID NOT NULL,
    RCPA_ITEM      T_ID NOT NULL,
    FOPA_ID        T_ID NOT NULL,
    RCPA_BANCO     VARCHAR(2),
    RCPA_CUENTA    VARCHAR(20),
    RCPA_NUMERO    VARCHAR(20),
    RCPA_FECHA     DATE,
    RCPA_MONTO     T_MONTO,
    RCPA_ANULADO   T_BOOLEANO,
    RCPA_TRANSMIT  T_BOOLEANO,
    RCPA_IVAMONTO  T_MONTO,
    RCPA_CONC      T_CONCEPTO,
    RCPA_TRM       TRM
);

CREATE TABLE RECIBOS_PRESTAMOS (
    RECA_ID       T_ID NOT NULL,
    PRNO_ID       T_ID NOT NULL,
    PRCU_ITEM     T_ID NOT NULL,
    RCPR_ABONO    T_MONTO,
    RCPR_ANULADO  T_BOOLEANO
);

CREATE TABLE REGISTRO_AUTOMATICO (
    REAU_COD   VARCHAR(4) NOT NULL,
    REAU_NOM   VARCHAR(60) NOT NULL,
    TICO_COD   T_TIPO_COMP,
    PRCO_PREF  VARCHAR(4)
);

CREATE TABLE REGISTRO_CONCEPTOS (
    REAU_COD   VARCHAR(4) NOT NULL,
    RECO_ITEM  INTEGER NOT NULL,
    CONC_COD   VARCHAR(4)
);

CREATE TABLE RELEVOS_COLEGIOS (
    RELC_ID         T_ID NOT NULL,
    RELC_RUTA       T_ID,
    RELC_FECHA      FECHA,
    RELC_MOTIVO     T_CONCEPTO,
    RELC_CONDUCTOR  T_NIT,
    RELC_VALOR      T_MONTO,
    RELC_ANULADO    T_BOOLEANO
);

CREATE TABLE REMESAS_DESTINATARIO (
    TERC_NIT        T_NIT NOT NULL,
    TERC_DEST       T_BOOLEANO,
    TERC_NOMBRE     T_CONCEPTO,
    TERC_DIR        VARCHAR(120),
    TERC_CIU        VARCHAR(60),
    TERC_TEL        T_TELEFONO,
    TERC_CORREO     CORREO,
    TERC_CEL        T_TELEFONO,
    TERC_NOMBRE1    T_CONCEPTO,
    TERC_NOMBRE2    T_CONCEPTO,
    TERC_APELLIDO1  T_CONCEPTO,
    TERC_APELLIDO2  T_CONCEPTO,
    TERC_CONTACTO   VARCHAR(255),
    TERC_TIPOID     CHAR(1),
    CIUD_COD        VARCHAR(5),
    TERC_DV         CHAR(1)
);

CREATE TABLE REMISION_PROVEEDOR (
    REPR_ID            T_ID NOT NULL,
    TERC_NIT           T_NIT NOT NULL,
    TIDO_COD           INTEGER NOT NULL,
    PREF_PRE           VARCHAR(4) NOT NULL,
    BODE_COD           VARCHAR(2) NOT NULL,
    REPR_NUMERO        T_NUMDOC NOT NULL,
    REPR_FECHA         DATE NOT NULL,
    REPR_CONC          VARCHAR(60),
    REPR_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    REPR_NUMPROV       T_NUMPROV,
    REPR_DTOPORC       T_PORCENTAJE,
    REPR_DTOMONTO      T_MONTO,
    REPR_ADICIONAL     T_MONTO,
    REPR_IVAMONTO      T_MONTO,
    REPR_EXTRA         T_MONTO,
    REPR_TOTAL         T_MONTO,
    REPR_ORDEN         VARCHAR(10),
    REPR_COTIZACI      VARCHAR(10),
    REPR_IMPTOS        T_BOOLEANO,
    REPR_ANULADO       T_BOOLEANO,
    REPR_TRANSMIT      T_BOOLEANO,
    REPR_NROCOPIA      INTEGER,
    REPR_SIMPLIFICADO  T_BOOLEANO,
    REPR_CONSOLIDA     T_ID,
    REPR_USUARIO       T_USUARIO,
    NUMOK              T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE REMISION_PROVEEDOR_DET (
    REPR_ID         T_ID NOT NULL,
    RPVD_ITEM       T_ID NOT NULL,
    ARTI_COD        T_COD_ARTICULO NOT NULL,
    BODE_COD        VARCHAR(2) NOT NULL,
    RPVD_CANT       T_CANTIDAD,
    RPVD_UNIDAD     T_UNIDAD,
    RPVD_LOTE       T_LOTE,
    RPVD_PRUNIT     T_MONTO,
    RPVD_DTOPORC    T_PORCENTAJE,
    RPVD_DTOMONTO   T_MONTO,
    RPVD_FACTOR     T_CANTIDAD,
    RPVD_DESC       VARCHAR(255),
    RPVD_OBS        BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    RPVD_IVAPORC    T_PORCENTAJE,
    RPVD_IVAMONTO   T_MONTO,
    RPVD_CONSUMO    T_MONTO,
    RPVD_CODBAR     T_COD_ARTICULO,
    RPVD_FACTURADO  T_CANTIDAD,
    RPVD_ANULADO    T_BOOLEANO,
    RPVD_TRANSMIT   T_BOOLEANO,
    RPVD_TOTAL      T_MONTO,
    RPVD_CODPROV    T_COD_ARTICULO,
    LOTE_VENCE      DATE,
    RPVD_STAND      T_LOTE,
    RPVD_DEVUELTO   T_CANTIDAD
);

CREATE TABLE REMISION_PROVEEDOR_DOCRELA (
    REPR_ID       T_ID NOT NULL,
    RPRD_TIPOREL  INTEGER NOT NULL,
    RPRD_IDREL    T_ID NOT NULL
);

CREATE TABLE REMISIONES_VENTA (
    REVT_ID         T_ID NOT NULL,
    TERC_NIT        T_NIT NOT NULL,
    VEND_COD        T_ID NOT NULL,
    BODE_COD        VARCHAR(2) NOT NULL,
    TIDO_COD        INTEGER NOT NULL,
    PREF_PRE        VARCHAR(4) NOT NULL,
    REVT_NUMERO     T_NUMDOC NOT NULL,
    REVT_FECHA      DATE NOT NULL,
    REVT_CONC       VARCHAR(60),
    REVT_OBS        BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    REVT_DESPACHO   VARCHAR(255),
    REVT_IVAINC     T_BOOLEANO NOT NULL,
    REVT_ANULADO    T_BOOLEANO,
    REVT_TRANSMIT   T_BOOLEANO,
    REVT_NOMTERC    VARCHAR(60),
    REVT_TOTAL      T_MONTO,
    REVT_IVAMONTO   T_MONTO,
    PTVT_ID         T_ID,
    LIPR_COD        INTEGER,
    REVT_COTIZACI   VARCHAR(30),
    REVT_PEDIDO     VARCHAR(30),
    REVT_FACTURA    VARCHAR(30),
    REVT_NROCOPIA   INTEGER,
    REVT_TRANSP     VARCHAR(60),
    REVT_CONSOLIDA  T_ID,
    REVT_USUARIO    T_USUARIO,
    REVT_SUCURSAL   VARCHAR(10),
    NUMOK           T_BOOLEANO DEFAULT 'N',
    REVT_TRM        T_MONTO,
    REMI_PENDIENTE  VARCHAR(30),
    REVT_FLETE      T_BOOLEANO,
    REVT_VEHICULO   VARCHAR(15),
    REVT_VRFLETE    T_MONTO
);

CREATE TABLE REMISIONES_VENTA_DETALLE (
    REVT_ID          T_ID NOT NULL,
    RVDE_ITEM        T_ID NOT NULL,
    BODE_COD         VARCHAR(2) NOT NULL,
    ARTI_COD         T_COD_ARTICULO NOT NULL,
    RVDE_CANT        T_CANTIDAD,
    RVDE_UNIDAD      T_UNIDAD,
    RVDE_LOTE        T_LOTE,
    RVDE_PRUNIT      T_MONTO,
    RVDE_DTOPORC     T_PORCENTAJE,
    RVDE_DTOMONTO    T_MONTO,
    RVDE_IVAPORC     T_PORCENTAJE,
    RVDE_IVAMONTO    T_MONTO,
    RVDE_CONSUMO     T_MONTO,
    RVDE_FACTOR      T_CANTIDAD,
    RVDE_DESC        VARCHAR(255),
    RVDE_OBS         BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    RVDE_CODBAR      T_COD_ARTICULO,
    RVDE_FACTURADO   T_CANTIDAD,
    RVDE_TOTAL       T_MONTO,
    RVDE_ANULADO     T_BOOLEANO,
    RVDE_TRANSMIT    T_BOOLEANO,
    RVDE_REFERENCIA  VARCHAR(60),
    LIPR_COD         INTEGER,
    RVDE_DEVUELTO    T_CANTIDAD,
    RVDE_CAJAS       T_CANTIDAD,
    RVDE_INALCP      T_PORCENTAJE,
    RVDE_INALCM      T_MONTO,
    RVDE_TIVA        SMALLINT
);

CREATE TABLE REMISIONES_VENTA_DOCRELA (
    REVT_ID       INTEGER NOT NULL,
    RVDR_TIPOREL  INTEGER NOT NULL,
    RVDR_IDREL    INTEGER NOT NULL
);

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,
    TIPO      T_ID NOT NULL,
    CANT      T_CANTIDAD,
    UTILIDAD  T_MONTO
);

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),
    RPAE_TIPO      CHAR(1),
    RPAE_SERVIDOR  T_CONCEPTO,
    RPAE_OK        T_BOOLEANO
);

CREATE TABLE REPLICA_COMPANIA (
    RPCO_COD       CHAR(3) NOT NULL,
    RPCP_NOMBRE    VARCHAR(80),
    RPCO_SERVIDOR  VARCHAR(60),
    RPCO_ERRO      T_BOOLEANO,
    SUCU_ID        T_ID,
    RPCO_ACTIVA    T_BOOLEANO
);

CREATE TABLE REPLICA_COMPRAS (
    RPCM_COD       VARCHAR(3) NOT NULL,
    RPCM_PREF      VARCHAR(4) NOT NULL,
    RPCM_NOMBRE    VARCHAR(60),
    RPCM_SERVIDOR  VARCHAR(60),
    RPCM_PREDDES   VARCHAR(4)
);

CREATE TABLE REPLICA_CONTA (
    RPCO_ID        T_ID NOT NULL,
    RPCO_NOMBRE    T_CONCEPTO,
    RPCO_SERVIDOR  T_CONCEPTO,
    RPCO_COD       CHAR(3) NOT NULL
);

CREATE TABLE REPLICA_CONTA_DETALLE (
    RPCO_ID      T_ID NOT NULL,
    RPCD_ITEM    T_ID NOT NULL,
    RPCD_PREF    VARCHAR(4),
    RPCD_PROY    VARCHAR(4),
    RPCD_CENTRO  VARCHAR(4)
);

CREATE TABLE REPLICA_EVENTOS (
    RPEV_ID        T_ID NOT NULL,
    RPEV_COMPANIA  VARCHAR(60) NOT NULL,
    RPEV_TIPO      T_ID NOT NULL,
    RPEV_IDDOC     T_ID,
    RPEV_PREF      VARCHAR(4),
    RPEV_CODIGO    VARCHAR(20),
    RPEV_FECREG    DATE,
    RPEV_HORAREG   TIME,
    RPEV_FECREP    DATE,
    RPEV_HORAREP   TIME,
    RPEV_OPER      CHAR(1),
    RPEV_PREFDEST  VARCHAR(4),
    RPEV_PTVT      T_ID,
    RPEV_ERROR     VARCHAR(2048),
    RPEV_NUMERO    T_NUMDOC
);

CREATE TABLE REPLICA_VENTAS (
    RPVE_COD       CHAR(3) NOT NULL,
    RPVE_NOMBRE    T_CONCEPTO,
    RPVE_SERVIDOR  T_CONCEPTO,
    RPVE_PREF      VARCHAR(4) NOT NULL,
    RPVE_PTVT      INTEGER NOT NULL,
    RPVE_PREFDES   VARCHAR(4),
    RPVE_PTVTDES   INTEGER
);

CREATE TABLE REPLICACION_CONFIGURA (
    REPC_TIPO      T_ID NOT NULL,
    REPC_PREF      PREFIJO NOT NULL,
    REPC_REPLICA   T_BOOLEANO,
    REPC_COMPANIA  VARCHAR(3) NOT NULL
);

CREATE TABLE REPORTE_ERRORES (
    REER_ID  INTEGER NOT NULL
);

CREATE TABLE REPORTES_AUX (
    REPA_ID        INTEGER NOT NULL,
    REPA_USER      T_USUARIO NOT NULL,
    REPA_ARTICULO  T_COD_ARTICULO
);

CREATE TABLE REPORTES_MENSAJE (
    REPM_ID       INTEGER NOT NULL,
    REPM_MENSAJE  BLOB SUB_TYPE 1 SEGMENT SIZE 80
);

CREATE TABLE RESERVAS (
    RESE_ID        T_ID NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    TIDO_COD       INTEGER NOT NULL,
    PREF_PRE       VARCHAR(4) NOT NULL,
    RESE_NUMERO    T_NUMDOC NOT NULL,
    RESE_FECHA     DATE NOT NULL,
    RESE_CONC      T_CONCEPTO,
    RESE_TIPOREF   INTEGER,
    RESE_IDREF     INTEGER,
    RESE_ANULADO   T_BOOLEANO,
    RESE_TRANSMIT  T_BOOLEANO,
    RESE_NOMTERC   T_CONCEPTO,
    RESE_VENCE     DATE,
    RESE_REFER     VARCHAR(20),
    RESE_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TERC_NIT       T_NIT,
    RESE_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE RESERVAS_DETALLE (
    RESE_ID        T_ID NOT NULL,
    RSDE_ITEM      T_ID NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    RDSE_CANT      T_CANTIDAD,
    RSDE_UNIDAD    T_UNIDAD,
    RSDE_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    RSDE_CODBAR    T_COD_ARTICULO,
    RSDE_LIBERAR   T_CANTIDAD,
    RSDE_ANULADO   T_BOOLEANO,
    ARTI_COD       T_COD_ARTICULO,
    RSDE_DESC      T_CONCEPTO,
    RSDE_FACTOR    T_CANTIDAD,
    RSDE_TRANSMIT  T_BOOLEANO
);

CREATE TABLE RESPUESTA_TIPOCUENTA (
    TICU_ITEM  T_ID NOT NULL,
    RETC_ID    T_ID NOT NULL,
    RETC_RTA   VARCHAR(30) NOT NULL
);

CREATE TABLE RESUMEN_VENTAS (
    RESU_FECHA    DATE NOT NULL,
    PTVT_ID       INTEGER NOT NULL,
    ARTI_COD      T_COD_ARTICULO,
    RESU_CANT     T_CANTIDAD,
    RESU_UNIDAD   T_UNIDAD,
    RESU_IVA      T_MONTO,
    RESU_CONSUMO  T_MONTO,
    RESU_TOTAL    T_MONTO,
    RESU_ITEM     INTEGER NOT NULL
);

CREATE TABLE RETENCION_MINIMA (
    RETM_ANO    ANO NOT NULL,
    RETM_ITEM   ID NOT NULL,
    RETM_HASTA  MONTO,
    RETM_RETE   MONTO
);

CREATE TABLE RETENCIONES (
    RETE_ITEM      ID NOT NULL,
    RETE_HASTA     MONTO,
    RETE_PORC      PORCENTAJE,
    RETE_MONTO     PORCENTAJE,
    RETE_DESDE     MONTO,
    RETE_ANO       ANO NOT NULL,
    RETE_DESDEUVT  SMALLINT,
    RETE_HASTAUVT  SMALLINT,
    RETE_MASUVT    T_MONTO,
    RETE_MENOSUVT  T_MONTO
);

CREATE TABLE RETIROS (
    RETI_ID         INTEGER NOT NULL,
    CUBA_COD        INTEGER NOT NULL,
    PRBA_PREF       VARCHAR(4) NOT NULL,
    RETI_NUMERO     VARCHAR(8) NOT NULL,
    RETI_FECHA      DATE NOT NULL,
    RETI_IDEGRESO   T_ID NOT NULL,
    RETI_CONCEPTO   VARCHAR(60),
    RETI_MONTO      NUMERIC(18,2),
    RETI_IVAPORC    NUMERIC(9,2),
    RETI_IVAMONTO   NUMERIC(18,2),
    RETI_GMFPORC    NUMERIC(9,2),
    RETI_GMFMONTO   NUMERIC(18,2),
    RETI_ANULADO    T_BOOLEANO,
    RETI_TRANSMIT   T_BOOLEANO,
    RETI_BENEF      T_CONCEPTO,
    RETI_NOTA       T_NUMDOC,
    RETI_NOTAMONTO  T_MONTO,
    RETI_NOTAPREF   VARCHAR(4),
    RETI_EGRESO     VARCHAR(10),
    TERC_NIT        T_NIT,
    RETI_USUARIO    T_USUARIO,
    NUMOK           T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE REVISION (
    REVI_FECHA   DATE,
    REVI_NOMINA  DATE
);

CREATE TABLE REVISION_PRECIOS (
    RVPR_ID        T_ID NOT NULL,
    RVPR_PREF      VARCHAR(4),
    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,
    RVPR_FECINI    DATE,
    RVPR_FECFIN    DATE,
    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,
    RVPD_DESC      T_CONCEPTO,
    RVPD_UNIDAD    T_UNIDAD,
    RVPD_COSTO     T_MONTO,
    RVPD_PORC      T_PORCENTAJE,
    RPVD_SUGERIDO  T_MONTO
);

CREATE TABLE RUTA_HORAS_PASAJEROS (
    RUTA_ID    T_ID NOT NULL,
    RUHO_ITEM  T_ID NOT NULL,
    RUHO_HORA  TIME NOT NULL
);

CREATE TABLE RUTA_PASAJEROS (
    RUTA_ID        INTEGER NOT NULL,
    RUTA_NOMBRE    T_CONCEPTO,
    RUTA_VALOR     T_MONTO,
    RUTA_CORREDOR  T_ID
);

CREATE TABLE RUTAS_COLEGIOS (
    RUTC_ID           T_ID NOT NULL,
    RUTC_NOMBRE       T_CONCEPTO,
    RUTC_COLEGIO      T_NIT,
    RUTC_CONDUCTOR    T_NIT,
    RUTC_ACTIVA       T_BOOLEANO,
    RUTC_PORCENTAJE   T_PORCENTAJE,
    RUTC_VRNEGOCIADO  T_MONTO,
    RUTC_PORCCOM      T_PORCENTAJE,
    RUTC_CTACOMIS     T_CTA_CONTABLE,
    RUTC_BECADOS      ESTUDIANTE
);

CREATE TABLE RUTAS_ENTREGA (
    RUTA_ID   T_ID NOT NULL,
    RUTA_NOM  T_CONCEPTO
);

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,
    RUTE_USUARIO    T_USUARIO,
    NUMOK           T_BOOLEANO,
    RUTE_CONFIMADO  T_BOOLEANO
);

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,
    RUTD_ENTREGADO  T_BOOLEANO,
    RUTD_DEVID      T_ID,
    RUTD_DEVNUMERO  VARCHAR(10),
    RUTD_RECID      T_ID,
    RUTD_RECIBO     VARCHAR(10),
    RUTD_VEND       INTEGER,
    RUTF_PREFRDC    VARCHAR(4),
    RUTD_RECOK      T_BOOLEANO,
    RUTD_TIPODOC    T_ID,
    RUTD_REMID      T_ID,
    RUTD_URGENTE    T_BOOLEANO,
    RUTD_NOMENT     VARCHAR(60),
    RUTD_TELENT     VARCHAR(40),
    RUTD_OBSENT     BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    RUTD_LONG       VARCHAR(20),
    RUTD_LATIT      VARCHAR(20)
);

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 NOT NULL,
    RUTA_OK       T_BOOLEANO,
    RUTA_RAZON    T_ID,
    RUTA_EXPLICA  T_CONCEPTO
);

CREATE TABLE RUTERO_RAZON (
    RAZO_ID   ID NOT NULL,
    RAZO_NOM  T_CONCEPTO
);

CREATE TABLE SALDO_BANCOS (
    CUBA_COD       INTEGER NOT NULL,
    SABA_FECHA     DATE NOT NULL,
    SABA_SALDO     NUMERIC(18,2),
    SABA_DEBITOS   NUMERIC(18,2),
    SABA_CREDITOS  NUMERIC(18,2)
);

CREATE TABLE SALDO_BANCOS_CONF (
    CUBA_COD       INTEGER NOT NULL,
    SABA_FECHA     DATE NOT NULL,
    SABA_SALDO     NUMERIC(18,2),
    SABA_DEBITOS   NUMERIC(18,2),
    SABA_CREDITOS  NUMERIC(18,2)
);

CREATE TABLE SALDO_CAJA (
    CAJA_ID        T_ID NOT NULL,
    SACA_FECHA     DATE NOT NULL,
    SACA_DEBITOS   T_MONTO,
    SACA_CREDITOS  T_MONTO,
    SACA_SALDO     T_MONTO
);

CREATE TABLE SALDO_EFECTIVO (
    SAEF_FECHA     DATE NOT NULL,
    CAJA_ID        T_ID NOT NULL,
    SAEF_SALDO     T_MONTO,
    SAEF_DEBITOS   T_MONTO,
    SAEF_CREDITOS  T_MONTO
);

CREATE TABLE SALDOS_ACTIVO (
    ACFJ_COD       T_COD_ARTICULO NOT NULL,
    CUEN_COD       T_CTA_CONTABLE NOT NULL,
    SAAC_SALDO     T_MONTO,
    SAAC_DEBITOS   T_MONTO,
    SAAC_CREDITOS  T_MONTO,
    SAAC_FECHA     CHAR(8) NOT NULL
);

CREATE TABLE SALDOS_ACTIVO_NIIF (
    ACFJ_COD       T_COD_ARTICULO NOT NULL,
    CUEN_COD       T_CTA_CONTABLE NOT NULL,
    SAAC_SALDO     T_MONTO,
    SAAC_DEBITOS   T_MONTO,
    SAAC_CREDITOS  T_MONTO,
    SAAC_FECHA     CHAR(8) NOT NULL
);

CREATE TABLE SALDOS_ARTICULO (
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    CUEN_COD       T_CTA_CONTABLE NOT NULL,
    SAAR_FECHA     CHAR(8) NOT NULL,
    SAAR_SALDO     T_MONTO,
    SAAR_DEBITOS   T_MONTO,
    SAAR_CREDITOS  T_MONTO
);

CREATE TABLE SALDOS_ARTICULO_NIIF (
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    CUEN_COD       T_CTA_CONTABLE NOT NULL,
    SAAR_FECHA     CHAR(8) NOT NULL,
    SAAR_SALDO     T_MONTO,
    SAAR_DEBITOS   T_MONTO,
    SAAR_CREDITOS  T_MONTO
);

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

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

CREATE TABLE SALDOS_CENTROS_TERCERO (
    CUEN_COD      T_CTA_CONTABLE NOT NULL,
    SACU_FECHA    CHAR(8) NOT NULL,
    PROY_COD      T_PROYECTO NOT NULL,
    CENT_COD      T_CENTRO NOT NULL,
    TERC_NIT      T_NIT NOT NULL,
    SACT_SALDO    T_MONTO,
    SACT_DEBITO   T_MONTO,
    SACT_CREDITO  T_MONTO
);

CREATE TABLE SALDOS_CENTROS_TERCERO_NIIF (
    CUEN_COD      T_CTA_CONTABLE NOT NULL,
    SACU_FECHA    CHAR(8) NOT NULL,
    PROY_COD      T_PROYECTO NOT NULL,
    CENT_COD      T_CENTRO NOT NULL,
    TERC_NIT      T_NIT NOT NULL,
    SACT_SALDO    T_MONTO,
    SACT_DEBITO   T_MONTO,
    SACT_CREDITO  T_MONTO
);

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

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

CREATE TABLE SALDOS_DOC_CARTERA (
    SDCA_TIPOREF    T_ID NOT NULL,
    SDCA_IDREF      T_ID NOT NULL,
    SDCA_FECHA      DATE NOT NULL,
    TERC_NIT        T_NIT NOT NULL,
    SDCA_SALDO      T_MONTO,
    SDCA_MONTO      T_MONTO,
    SDCA_RTFTE      T_MONTO,
    SDCA_RTIVA      T_MONTO,
    SDCA_RTICA      T_MONTO,
    SDCA_ABONO      T_MONTO,
    SDCA_ABRTFTE    T_MONTO,
    SDCA_ABRTIVA    T_MONTO,
    SDCA_ABRTICA    T_MONTO,
    SDCA_DEBITO     T_BOOLEANO,
    SDCA_TRM        T_MONTO,
    SDCA_RCREE      T_MONTO,
    SDCA_ABRCREE    T_MONTO,
    SDCA_DETERIORO  T_MONTO
);

CREATE TABLE SALDOS_DOC_CXPAGAR (
    SDCP_TIPOREF  T_ID NOT NULL,
    SDCP_IDREF    T_ID NOT NULL,
    SDCP_FECHA    DATE NOT NULL,
    TERC_NIT      T_NIT,
    SDCP_SALDO    T_MONTO,
    SDCP_RTEFTE   T_MONTO,
    SDCP_RTIVA    T_MONTO,
    SDCP_RTICA    T_MONTO,
    SDCP_ABONO    T_MONTO,
    SDCP_ABRTFTE  T_MONTO,
    SDCP_ABRTIVA  T_MONTO,
    SDCP_ABRTICA  T_MONTO,
    SDCP_DEBITO   T_BOOLEANO NOT NULL,
    SDCP_MONTO    T_MONTO,
    SDCP_TRM      T_MONTO,
    SDCP_RCREE    T_MONTO,
    SDCP_ABRCREE  T_MONTO
);

CREATE TABLE SALDOS_DOCCONTA (
    DOCO_ID        T_ID NOT NULL,
    SADC_FECHA     CHAR(8) NOT NULL,
    SADC_SALDO     T_MONTO,
    SADC_DEBITOS   T_MONTO,
    SADC_CREDITOS  T_MONTO,
    CUEN_COD       T_CTA_CONTABLE NOT NULL
);

CREATE TABLE SALDOS_INICIALES (
    SAIN_ITEM     T_ID NOT NULL,
    CUEN_COD      T_CTA_CONTABLE NOT NULL,
    TERC_NIT      T_NIT,
    PROY_COD      T_PROYECTO,
    CENT_COD      T_CENTRO,
    ARTI_COD      T_COD_ARTICULO,
    DOCO_NUMERO   VARCHAR(8),
    DOCO_VENCE    CHAR(8),
    SAIN_DEBITO   T_MONTO,
    SAIN_CREDITO  T_MONTO,
    SAIN_TIPODOC  INTEGER
);

CREATE TABLE SALDOS_INICIALES_NIIF (
    SAIN_ITEM     T_ID NOT NULL,
    CUEN_COD      T_CTA_CONTABLE NOT NULL,
    TERC_NIT      T_NIT,
    PROY_COD      T_PROYECTO,
    CENT_COD      T_CENTRO,
    ARTI_COD      T_COD_ARTICULO,
    DOCO_NUMERO   VARCHAR(8),
    DOCO_VENCE    CHAR(8),
    SAIN_DEBITO   T_MONTO,
    SAIN_CREDITO  T_MONTO,
    SAIN_TIPODOC  INTEGER
);

CREATE TABLE SALDOS_INVENTARIO (
    CUEN_COD      T_CTA_CONTABLE NOT NULL,
    ARTI_COD      T_COD_ARTICULO NOT NULL,
    SAIN_FECHA    CHAR(8) NOT NULL,
    SAIN_SALDO    T_MONTO,
    SAIN_DEBITO   T_MONTO,
    SAIN_CREDITO  T_MONTO
);

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

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

CREATE TABLE SALIDAS (
    SALI_ID        T_ID NOT NULL,
    TIDO_COD       INTEGER NOT NULL,
    PREF_PRE       VARCHAR(4) NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    SALI_NUMERO    T_NUMDOC NOT NULL,
    SALI_FECHA     DATE NOT NULL,
    SALI_CONC      VARCHAR(60),
    SALI_REFER     VARCHAR(20),
    SALI_TIPOREF   INTEGER,
    SALI_IDREF     INTEGER,
    SALI_IMPTOS    T_BOOLEANO NOT NULL,
    SALI_NOMTERC   VARCHAR(60),
    SALI_ANULADO   T_BOOLEANO NOT NULL,
    SALI_TRANSMIT  T_BOOLEANO,
    SALI_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TERC_NIT       T_NIT,
    SALI_RESERVA   VARCHAR(10),
    SALI_RESEID    T_ID,
    SALI_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE SALIDAS_DETALLE (
    SALI_ID        T_ID NOT NULL,
    SADE_ITEM      T_ID NOT NULL,
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    SADE_CANT      T_CANTIDAD,
    SADE_UNIDAD    T_UNIDAD,
    SADE_LOTE      T_LOTE,
    SADE_FACTOR    T_CANTIDAD,
    SADE_DESC      VARCHAR(255),
    SADE_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    SADE_IVAPORC   T_PORCENTAJE,
    SADE_IVAMONTO  T_MONTO,
    SADE_CONSUMO   T_MONTO,
    SADE_CODBAR    T_COD_ARTICULO,
    SADE_ANULADO   T_BOOLEANO,
    SADE_COSTO     T_MONTO,
    SADE_TOTAL     T_MONTO,
    SADE_TRANSMIT  T_BOOLEANO
);

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 SEGMENTOS (
    SEGM_COD     CENTRO NOT NULL,
    SEGM_NOMBRE  NOMBRE
);

CREATE TABLE SEMILLA_PROCEDENCIA (
    SEPR_ID         T_ID NOT NULL,
    SEPR_MUNICIPIO  VARCHAR(5),
    SEPR_NOMBRE     T_CONCEPTO
);

CREATE TABLE SEMILLAS_CLIMA (
    SECL_ID      T_ID NOT NULL,
    SECL_NOMBRE  T_CONCEPTO
);

CREATE TABLE SEMILLAS_ESPECIES (
    SEES_ID          T_ID NOT NULL,
    SEES_NOMBRE      T_CONCEPTO,
    SEES_NOMCIEN     VARCHAR(255),
    SEES_SUBLINEA    T_ID,
    SEES_HABCRE      T_ID,
    SEES_SIEMBRA     T_ID,
    SEES_USO         T_ID,
    SEES_DIASANA     SMALLINT,
    SEES_SEMXGR      T_CANTIDAD,
    SEES_DISTSIEM    T_CANTIDAD,
    SEES_GERMIN      T_CANTIDAD,
    SEES_PUREZA      T_CANTIDAD,
    SEES_HUMEDAD     T_CANTIDAD,
    SEES_FERTILIDAD  T_ID
);

CREATE TABLE SEMILLAS_FERTILIDAD (
    SEFE_ID      T_ID NOT NULL,
    SEFE_NOMBRE  T_CONCEPTO
);

CREATE TABLE SEMILLAS_FORMACION_ECO (
    SEFO_ID      T_ID NOT NULL,
    SEFO_NOMBRE  T_CONCEPTO
);

CREATE TABLE SEMILLAS_FUENTE (
    SEFU_ID      T_ID NOT NULL,
    SEFU_NOMBRE  T_CONCEPTO
);

CREATE TABLE SEMILLAS_HABITOS_CR (
    SEHC_ID      T_ID NOT NULL,
    SEHC_NOMBRE  T_CONCEPTO
);

CREATE TABLE SEMILLAS_NOMBRES_ESPECIE (
    SENE_ID      T_ID NOT NULL,
    SEES_ID      T_ID NOT NULL,
    SENE_NOMBRE  T_CONCEPTO
);

CREATE TABLE SEMILLAS_SIEMBRA (
    SESI_ID      T_ID NOT NULL,
    SESI_NOMBRE  T_CONCEPTO
);

CREATE TABLE SEMILLAS_SUBLINEAS (
    SESL_ID      T_ID NOT NULL,
    SESL_NOMBRE  T_CONCEPTO
);

CREATE TABLE SEMILLAS_SUELO (
    SESU_ID      T_ID NOT NULL,
    SESU_NOMBRE  T_CONCEPTO
);

CREATE TABLE SEMILLAS_USOS (
    SEUS_ID      T_ID NOT NULL,
    SEUS_NOMBRE  T_CONCEPTO
);

CREATE TABLE SERIALES_ARTICULO (
    ARTI_COD     T_COD_ARTICULO NOT NULL,
    BODE_COD     VARCHAR(2) NOT NULL,
    SEAR_COD     T_SERIAL NOT NULL,
    SEAR_EXISTE  T_BOOLEANO
);

CREATE TABLE SERIALES_DOCUMENTO (
    TIDO_COD       T_ID NOT NULL,
    SEDO_IDDOC     T_ID NOT NULL,
    SEDO_ITEM      T_ID NOT NULL,
    SEDO_SERIAL    T_SERIAL NOT NULL,
    SEDO_ARTICULO  T_COD_ARTICULO NOT NULL,
    SEDO_BOD       VARCHAR(2) NOT NULL,
    SEDO_CONS      T_ID,
    SEDO_ENTRADA   T_BOOLEANO,
    SEDO_CONFIRMA  T_BOOLEANO
);

CREATE TABLE SOLICITUD_IMPORTACION (
    SLIM_ID            INTEGER NOT NULL,
    TERC_NIT           VARCHAR(20) NOT NULL,
    TIDO_COD           INTEGER NOT NULL,
    PREF_PRE           VARCHAR(4) NOT NULL,
    SLIM_NUMERO        VARCHAR(6) NOT NULL,
    SLIM_FECHA         DATE NOT NULL,
    SLIM_VALIDEZ       INTEGER NOT NULL,
    SLIM_CONC          VARCHAR(60),
    SLIM_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    SLIM_DTOPORC       NUMERIC(9,4),
    SLIM_DTOMONTO      NUMERIC(18,2),
    SLIM_ADICIONAL     NUMERIC(18,2),
    SLIM_EXTRA         NUMERIC(18,2),
    SLIM_DTOFECHA      DATE,
    SLIM_TOTAL         NUMERIC(18,2),
    SLIM_TOTMON        NUMERIC(18,2),
    SLIM_ANULADO       CHAR(1),
    SLIM_TRASMIT       CHAR(1),
    SLIM_DIASPAGO      INTEGER,
    SLIM_CONSOLIDA     CHAR(1),
    SLIM_USUARIO       VARCHAR(10),
    TERM_COD           VARCHAR(3),
    FOPA_COD           INTEGER,
    SLIM_NODISP        VARCHAR(60),
    TACA_ID            INTEGER,
    TACA_MONTO         TRM,
    TIMO_COD           INTEGER,
    TIEM_COD           CHAR(2),
    SLIM_VENCE         FECHA,
    SLDE_FOC           NUMERIC(18,2),
    SLDE_FOB           NUMERIC(18,2),
    SLIM_IDIMPOR       T_ID,
    SLIM_IMPORTACION   T_NUMFACL,
    SLIM_REFERENCIA    T_CONCEPTO,
    SLIM_CONTACTO      ENTERO,
    SLIM_TIPOENTREGA   ENTERO,
    SLIM_TERMINOSPAGO  OBSERVACIONT,
    SLIM_ENTREGA       OBSERVACIONT,
    SLIM_MONEDA        T_ID,
    SLIM_ENTRNOMBRE    T_CONCEPTO,
    SLIM_ENTRDIR       VARCHAR(255),
    SLIM_ENTRCIU       T_CONCEPTO,
    SLIM_ENTRPAIS      T_CONCEPTO,
    SLIM_PROY          T_PROYECTO,
    SLIM_CENTRO        T_CENTRO,
    SLIM_ESTADO        SMALLINT
);

CREATE TABLE SOLICITUD_IMPORTACION_DET (
    SLIM_ID         INTEGER NOT NULL,
    SLDE_ITEM       INTEGER NOT NULL,
    ARTI_COD        VARCHAR(15),
    SLDE_CANT       NUMERIC(18,4),
    SLDE_UNIDAD     VARCHAR(8),
    SLDE_PRUNIT     NUMERIC(18,2),
    SLDE_DTOPORC    NUMERIC(9,4),
    SLDE_DTOMONTO   NUMERIC(18,2),
    SLDE_FACTOR     NUMERIC(18,4),
    SLDE_OBS        BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    SLDE_CODBAR     VARCHAR(15),
    SLDE_TOTAL      NUMERIC(18,2),
    SLDE_TOTMON     NUMERIC(18,2),
    SLDE_TRASMIT    CHAR(1),
    SLDE_ANULADO    CHAR(1),
    SLDE_DESC       VARCHAR(60),
    SLDE_CODPROV    VARCHAR(15),
    SLDE_PRUNITMON  MONTO,
    SLDE_FOB        NUMERIC(18,2),
    SLDE_TRM        TRM,
    SLDE_ORDENID    T_ID
);

CREATE TABLE SOPORTE (
    SOPO_ID           INTEGER NOT NULL,
    SOPO_FECHA        DATE NOT NULL,
    SOPO_MODULO       INTEGER,
    SOPO_OPCION       INTEGER,
    SOPO_HORA         TIME,
    ASES_ID           INTEGER,
    SOPO_TEMA         VARCHAR(100),
    SOPO_RESPUESTA    BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SOPO_ESTADO       CHAR(1),
    SOPO_PENDIENTE    BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SOPO_EXPLICACION  BLOB SUB_TYPE 1 SEGMENT SIZE 80
);

CREATE TABLE SORTEO_FACTURA (
    SORT_ID      T_ID NOT NULL,
    SORT_PREF    VARCHAR(4) NOT NULL,
    SORT_NUMERO  T_NUMDOC NOT NULL,
    TERC_NIT     T_NIT NOT NULL,
    SORT_MONTO   T_MONTO,
    SORT_NOMBRE  T_CONCEPTO,
    SORT_IDFACT  T_ID
);

CREATE TABLE SORTEOS_CONFIGURACION (
    SORC_ID       T_ID NOT NULL,
    SORC_FECINI   DATE,
    SORC_FECFIN   DATE,
    SORC_TOTMIN   T_MONTO,
    SORC_GRIN     VARCHAR(3),
    SORC_SGIN     VARCHAR(3),
    SORC_MARC     VARCHAR(3),
    SORC_ARTI     T_COD_ARTICULO,
    SORC_FECHA    DATE,
    SORC_PREMIO   T_CONCEPTO,
    SORC_TEXTO    BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    SORC_PREF     VARCHAR(4) NOT NULL,
    SORC_UNASOLA  T_BOOLEANO
);

CREATE TABLE STANDS (
    ARTI_COD      T_COD_ARTICULO NOT NULL,
    STAND_COD     VARCHAR(20) NOT NULL,
    STAND_DESC    VARCHAR(60),
    STAND_BODEGA  VARCHAR(2) NOT NULL,
    STAND_MAX     T_CANTIDAD,
    STAND_MIN     T_CANTIDAD
);

CREATE TABLE SUBGRUPO (
    GRUP_COD     VARCHAR(2) NOT NULL,
    SUBG_COD     VARCHAR(3) NOT NULL,
    SUBG_NOM     VARCHAR(30) NOT NULL,
    COFU_ID      ENTERO,
    SUBG_IMAGEN  BLOB SUB_TYPE 0 SEGMENT SIZE 1024
);

CREATE TABLE SUBTIPO_COTIZANTE (
    TCOT_COD      ID NOT NULL,
    STCO_COD      ID NOT NULL,
    STCO_NOMBRE   NOMBRE NOT NULL,
    STCO_CODDIAN  SMALLINT
);

CREATE TABLE SUCURSALES (
    SUCU_ID         INTEGER NOT NULL,
    SUCU_NOMBRE     T_CONCEPTO,
    SUCU_DIRECCION  T_CONCEPTO,
    SUCU_TELEFONOS  T_CONCEPTO,
    SUCU_PROY       T_PROYECTO,
    SUCU_CENT       T_CENTRO
);

CREATE TABLE SUPERVISOR (
    SUPE_ID   T_ID NOT NULL,
    SUPE_NOM  T_CONCEPTO
);

CREATE TABLE TARIFA_IVA (
    TAIV_COD           INTEGER NOT NULL,
    TAIV_PORC          T_PORCENTAJE,
    TAIV_CTAVTA        T_CTA_CONTABLE,
    TAIV_CTADEV        T_CTA_CONTABLE,
    TAIV_CTAINV        T_CTA_CONTABLE,
    TAIV_CTACOMP       T_CTA_CONTABLE,
    TAIV_CTAIVAVNT     T_CTA_CONTABLE,
    TAIV_CTACOSTO      T_CTA_CONTABLE,
    TAIV_CTAIVACMP     T_CTA_CONTABLE,
    TAIV_NOMBRE        VARCHAR(20),
    TAIV_TIENDA        T_ID,
    TAIV_CTAIVADV      T_CTA_CONTABLE,
    TAIV_CTAIVADC      T_CTA_CONTABLE,
    TAIV_CTAVTANIIF    T_CTA_CONTABLE,
    TAIV_CTADEVNIIF    T_CTA_CONTABLE,
    TAIV_CTAINVNIIF    T_CTA_CONTABLE,
    TAIV_CTACMPNIIF    T_CTA_CONTABLE,
    TAIV_CTACOSNIIF    T_CTA_CONTABLE,
    TAIV_CTAIVAVNIIF   T_CTA_CONTABLE,
    TAIV_CTAIVACNIIF   T_CTA_CONTABLE,
    TAIV_CTAIVDVNIIF   T_CTA_CONTABLE,
    TAIV_CTAIVDCNIIF   T_CTA_CONTABLE,
    TAIV_ORDIMP        ENTERO,
    TAIV_CTAESTAM      T_CTA_CONTABLE,
    TAIV_CTAESTAMNIIF  T_CTA_CONTABLE
);

CREATE TABLE TARIFAS_ARL (
    TARL_ID      T_ID NOT NULL,
    TARL_NOMBRE  T_CONCEPTO,
    TARL_TARIFA  T_PORCENTAJE
);

CREATE TABLE TARIFAS_REMESAS (
    TARM__ORIGEN  VARCHAR(5) NOT NULL,
    TARM_DESTINO  VARCHAR(5) NOT NULL,
    TARM_FLETE    T_MONTO
);

CREATE TABLE TARJETAS (
    TARJ_COD        VARCHAR(3) NOT NULL,
    TARJ_NOM        VARCHAR(60) NOT NULL,
    TARJ_COMIPORC   T_PORCENTAJE,
    TARJ_COMIIVA    T_BOOLEANO,
    TARJ_RTFTEPORC  T_PORCENTAJE,
    TARJ_RTFTEBASE  T_MONTO,
    TARJ_RTIVAPORC  T_PORCENTAJE,
    TARJ_RTIVABASE  T_MONTO,
    TARJ_CTABANCO   T_CTA_CONTABLE,
    TARJ_CTARTFTE   T_CTA_CONTABLE,
    TARJ_CTARTIVA   T_CTA_CONTABLE,
    TARJ_CTACOMI    T_CTA_CONTABLE,
    TARJ_RTICAPORC  T_PORCENTAJE
);

CREATE TABLE TASA_CAMBIO_MONEDA (
    TACA_ID     INTEGER NOT NULL,
    TACA_FECHA  DATE NOT NULL,
    TIMO_COD    INTEGER NOT NULL,
    TACA_VALOR  TRM
);

CREATE TABLE TAXONOMIA (
    TAXO_ID      T_ID NOT NULL,
    TAXO_NOMBRE  VARCHAR(100)
);

CREATE TABLE TAXONOMIA_CUENTAS (
    TAXO_ID    T_ID NOT NULL,
    TAXE_ID    T_ID NOT NULL,
    TAXD_ID    T_ID NOT NULL,
    TAXC_ITEM  T_ID NOT NULL,
    CUEN_COD   T_CTA_CONTABLE,
    TAXC_TIPO  SMALLINT
);

CREATE TABLE TAXONOMIA_DETALLE (
    TAXO_ID      T_ID NOT NULL,
    TAXE_ID      T_ID NOT NULL,
    TAXD_ITEM    T_ID NOT NULL,
    TAXD_NOMBRE  VARCHAR(255),
    TAXD_TIPO    SMALLINT,
    TAXD_NIVEL   SMALLINT,
    TAXD_NORMA   VARCHAR(255),
    TAXD_PADRE   T_ID
);

CREATE TABLE TAXONOMIA_ENCABEZA (
    TAXO_ID      T_ID NOT NULL,
    TAXE_ID      T_ID NOT NULL,
    TAXE_NOMBRE  VARCHAR(100)
);

CREATE TABLE TAXONOMIA_INSTANCIA (
    TAIN_ID       T_ID NOT NULL,
    TAXO_ID       T_ID NOT NULL,
    TAXE_ID       T_ID NOT NULL,
    TAXD_ID       T_ID NOT NULL,
    MONTO         T_MONTO,
    TAIN_ANO      CHAR(4),
    TAIN_PERIODO  SMALLINT,
    TAIN_TEXTO    BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    TAIN_MONTOA   T_MONTO
);

CREATE TABLE TERCERO_DOCUMENTOS (
    TERC_NIT      T_NIT NOT NULL,
    TEDO_ITEM     T_ID NOT NULL,
    TEDO_ARCHIVO  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TEDO_NOMBRE   EXPLICA
);

CREATE TABLE TERCEROS (
    TERC_NIT           VARCHAR(20) NOT NULL,
    TERC_NOM           VARCHAR(60) NOT NULL,
    TERC_DIR           VARCHAR(60),
    TERC_CIU           VARCHAR(40),
    TERC_TEL           VARCHAR(40),
    TERC_CONTACTO      EXPLICA,
    TERC_OBS           BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TERC_EMAIL         VARCHAR(100),
    TERC_FAX           VARCHAR(25),
    TERC_CEL           VARCHAR(25),
    TERC_CLIE          T_BOOLEANO,
    TERC_PROV          T_BOOLEANO,
    TERC_EMPL          T_BOOLEANO,
    TERC_CTARTFTE      T_CTA_CONTABLE,
    TERC_CTARTIVA      T_CTA_CONTABLE,
    TERC_CTARTICA      T_CTA_CONTABLE,
    TERC_CTAVENTA      T_CTA_CONTABLE,
    TERC_CTACLIENTE    T_CTA_CONTABLE,
    TERC_CTAPROV       T_CTA_CONTABLE,
    TERC_CTAEMPL       T_CTA_CONTABLE,
    TERC_DV            CHAR(1),
    CIUD_COD           VARCHAR(5),
    TERC_TIPOID        CHAR(1),
    TERC_USUARIO       T_USUARIO,
    TERC_APELLIDO1     T_CONCEPTO,
    TERC_APELLIDO2     T_CONCEPTO,
    TERC_NOMBRE1       T_CONCEPTO,
    TERC_NOMBRE2       T_CONCEPTO,
    TERC_EXENTO        T_BOOLEANO,
    TERC_ANIV          DATE,
    TERC_ESTADO        CHAR(1),
    TERC_ADMINI        CHAR(1),
    TERC_CONDUCTOR     T_BOOLEANO,
    TERC_LICVEN        DATE,
    TERC_CATEGORIA     VARCHAR(20),
    PAIS_ID            CHAR(3),
    TERC_ASOCIADO      T_BOOLEANO,
    TERC_ASOCINAC      T_BOOLEANO,
    TERC_TRANS         CHAR(1),
    TERC_NITCONTA      T_NIT,
    TERC_DVDIAN        CHAR(1),
    TERC_SIMPLIFICA    T_BOOLEANO,
    TERC_DEPOS         T_BOOLEANO,
    TERC_CTARCREE      T_CTA_CONTABLE,
    TERC_ACTIVIDAD     CHAR(4),
    TERC_CONCSH        SMALLINT,
    TERC_CTACLIENIIF   T_CTA_CONTABLE,
    TERC_CTAPROVNIIF   T_CTA_CONTABLE,
    TERC_CTARFTENIIF   T_CTA_CONTABLE,
    TERC_CTARIVANIIF   T_CTA_CONTABLE,
    TERC_CTARICANIIF   T_CTA_CONTABLE,
    TERC_CTARCREENIIF  T_CTA_CONTABLE,
    TERC_CTAVTANIIF    T_CTA_CONTABLE,
    TERC_LICENCIA      T_NIT,
    TERC_CTADETERIORO  T_CTA_CONTABLE
);

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

CREATE TABLE TERMINALES_NOMBRES (
    TERM_IP      T_CONCEPTO NOT NULL,
    TERM_NOMBRE  T_CONCEPTO
);

CREATE TABLE TERMINOS_COMERCIO_INT (
    TERM_COD   VARCHAR(3) NOT NULL,
    TERM_DESC  VARCHAR(400),
    TERM_NOM   VARCHAR(300)
);

CREATE TABLE TERMINOS_ENTREGA (
    TEEN_ID   T_ID NOT NULL,
    TEEN_NOM  T_CONCEPTO,
    TEEN_OBS  OBSERVACIONT
);

CREATE TABLE TERMINOS_PAGO (
    TEPA_ID   T_ID NOT NULL,
    TEPA_NOM  T_CONCEPTO,
    TEPA_OBS  OBSERVACIONT
);

CREATE TABLE TIPO_CARGA (
    TICA_COD  INTEGER NOT NULL,
    TICA_NOM  VARCHAR(60)
);

CREATE TABLE TIPO_COMPROBANTE (
    TICO_COD      T_TIPO_COMP NOT NULL,
    TICO_NOM      VARCHAR(60) NOT NULL,
    TICO_FORMATO  T_BOOLEANO
);

CREATE TABLE TIPO_COTIZANTE (
    TCOT_COD       ID NOT NULL,
    TCOT_NOMBRE    NOMBRE NOT NULL,
    TCOT_TIPODIAN  SMALLINT,
    TCOT_CONDIC    SMALLINT
);

CREATE TABLE TIPO_CUENTAS (
    TICU_ITEM    T_ID NOT NULL,
    TICU_NOMBRE  VARCHAR(30) NOT NULL
);

CREATE TABLE TIPO_DOCUMENTO (
    TIDO_COD       INTEGER NOT NULL,
    TIDO_NOMCORTO  VARCHAR(8) NOT NULL,
    TIDO_NOMLARGO  VARCHAR(30) NOT NULL,
    TIDO_MODULO    VARCHAR(20),
    TIDO_INVE      CHAR(1),
    TIDO_CART      CHAR(1),
    TIDO_CXP       CHAR(1),
    TIDO_CAJA      CHAR(1),
    TIDO_BCOS      CHAR(1),
    TIDO_NOM       BOOLEANO,
    TIDO_IMP       BOOLEANO
);

CREATE TABLE TIPO_EMBALAJE (
    TIEM_NOMBRE  VARCHAR(60),
    TIEM_COD     CHAR(2) NOT NULL
);

CREATE TABLE TIPO_GASTOS_IMPORTACION (
    TIGI_COD           INTEGER NOT NULL,
    TIGI_NOMBRE        VARCHAR(60),
    TIGI_TIPO          CHAR(1),
    TIGI_LIQUIDACION   CHAR(1),
    TIGI_TIPODOC       INTEGER,
    TIGI_APLICAIMPTOS  CHAR(1),
    TIGI_CTACONTA      T_CTA_CONTABLE,
    TIGI_CTAGASTO      T_CTA_CONTABLE,
    TIGI_PREF          PREFIJO
);

CREATE TABLE TIPO_ID (
    TIID_COD     CHAR(1) NOT NULL,
    TIID_NOM     VARCHAR(30),
    TIID_CODIGO  T_ID,
    TIID_CODSHD  CHAR(3),
    TIID_NATUR   CHAR(1)
);

CREATE TABLE TIPO_NOTA_CLIENTE (
    TINO_COD  INTEGER NOT NULL,
    TINO_NOM  T_CONCEPTO
);

CREATE TABLE TIPO_NOTADOC (
    TIND_ID      T_ID NOT NULL,
    TIND_NOMBRE  T_CONCEPTO
);

CREATE TABLE TIPO_PUC (
    TIPU_COD  INTEGER NOT NULL,
    TIPU_NOM  VARCHAR(60) NOT NULL
);

CREATE TABLE TIPO_VEHICULO (
    TIVH_COD       T_ID NOT NULL,
    TICH_NOM       VARCHAR(30),
    TIVH_HORA      T_BOOLEANO,
    TIVH_TARIFA    T_MONTO,
    TIVH_MAX       SMALLINT,
    TIVH_FIJO      T_MONTO,
    TIVH_ARTICULO  T_COD_ARTICULO,
    TIVH_MODO      VARCHAR(10),
    TIVH_MIN       ENTERO,
    TIVH_FIJOMIN   T_MONTO
);

CREATE TABLE TIPO_VINCULO_UGPP (
    TIVU_COD     T_ID NOT NULL,
    TIUV_NOMBRE  T_CONCEPTO
);

CREATE TABLE TIPOS_EMBARQUE (
    TIEM_COD     INTEGER NOT NULL,
    TIEM_NOMBRE  VARCHAR(60)
);

CREATE TABLE TIPOS_MONEDA (
    TIMO_COD     INTEGER NOT NULL,
    TIMO_NOMBRE  VARCHAR(60)
);

CREATE TABLE TIPOS_NOVEDAD (
    TNOV_COD       CHAR(3) NOT NULL,
    TNOV_NOMBRE    NOMBRE,
    TNOV_PREGUNTA  BOOLEANO
);

CREATE TABLE TIQUETE_PASAJERO (
    TIQP_ID        T_ID NOT NULL,
    TIQP_PREF      T_PROYECTO,
    TIQP_NUMERO    T_NUMDOC,
    TIQP_FECHA     DATE,
    TIQP_NOMBRE    T_CONCEPTO,
    TIQP_VEHICULO  VARCHAR(8),
    TIQP_RUTA      T_ID,
    TIQP_CLIENTE   T_BOOLEANO,
    TIQP_NIT       T_NIT,
    TIQP_PASAJE    T_MONTO,
    TIQP_SEGURO    T_MONTO,
    TIQP_CANT      INTEGER,
    TIQP_TOTAL     T_MONTO,
    TIQP_FORMAP    CHAR(1),
    TIQP_VEND      T_ID,
    TIQP_PUESTO    VARCHAR(10),
    TIQP_ANULADO   T_BOOLEANO,
    TIQP_TRANSMIT  T_BOOLEANO,
    TIQP_TIPOV     T_ID,
    TIQP_HORA      TIME,
    TIQP_NUMOK     T_BOOLEANO,
    TIQP_USUARIO   T_USUARIO,
    TIQP_PLANILLA  T_ID,
    TIQP_CAJA      T_ID
);

CREATE TABLE TRANSPORTADORES_INTERNAC (
    TERC_NIT        NIT NOT NULL,
    TRAN_CODIGOINT  VARCHAR(15),
    TRAN_CTAPAGAR   T_CTA_CONTABLE,
    TRAN_USUARIO    T_USUARIO
);

CREATE TABLE TRASFERENCIAS (
    TRAN_ID        T_ID NOT NULL,
    TIDO_COD       INTEGER NOT NULL,
    PREF_PRE       VARCHAR(4) NOT NULL,
    BODE_COD       VARCHAR(2) NOT NULL,
    TRAN_NUMERO    T_NUMDOC NOT NULL,
    TRAN_FECHA     DATE NOT NULL,
    TRAN_CONC      VARCHAR(60),
    TRAN_REFER     VARCHAR(20),
    TRAN_BODDES    VARCHAR(2) NOT NULL,
    TRAN_IMPTOS    T_BOOLEANO,
    TRAN_ANULADO   T_BOOLEANO,
    TRAN_TRANSMIT  T_BOOLEANO,
    TRAN_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TRAN_CONFIRMA  T_BOOLEANO,
    TERC_NIT       T_NIT,
    TRAN_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N',
    TRAN_ORDEN     VARCHAR(10),
    TRAN_ORDENID   T_ID
);

CREATE TABLE TRASFERENCIAS_DETALLE (
    TRAN_ID        T_ID NOT NULL,
    TRAS_ITEM      T_ID NOT NULL,
    ARTI_COD       T_COD_ARTICULO NOT NULL,
    TRAS_CANT      T_CANTIDAD,
    TRAS_UNIDAD    T_UNIDAD,
    TRAS_LOTE      T_LOTE,
    TRAS_FACTOR    T_CANTIDAD,
    TRAS_DESC      VARCHAR(255),
    TRAS_OBS       BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TRAS_IVAPORC   T_PORCENTAJE,
    TRAS_IVAMONTO  T_MONTO,
    TRAS_CONSUMO   T_MONTO,
    TRAS_CODBAR    T_COD_ARTICULO,
    TRAS_ANULADO   T_BOOLEANO,
    TRAS_CONFIRMA  T_BOOLEANO,
    TRAS_COSTO     T_MONTO,
    TRAS_TOTAL     T_MONTO,
    TRAS_LOTEDES   T_LOTE,
    TRAS_TRANSMIT  T_BOOLEANO,
    LOTE_VENCE     FECHA
);

CREATE TABLE TRASLADOS (
    TRAS_ID         INTEGER NOT NULL,
    CUBA_COD        INTEGER NOT NULL,
    PRBA_PREF       VARCHAR(4) NOT NULL,
    TRAS_NUMERO     VARCHAR(8) NOT NULL,
    TRAS_FECHA      DATE NOT NULL,
    TRAS_CONCEPTO   VARCHAR(60),
    TRAS_MONTO      NUMERIC(18,2),
    TRAS_CTADEST    INTEGER NOT NULL,
    TRAS_IVAPORC2   NUMERIC(9,2),
    TRAS_IVAMONTO2  NUMERIC(18,2),
    TRAS_GMFPORC    NUMERIC(9,2),
    TRAS_GMFMONTO   NUMERIC(18,2),
    TRAS_NOTA       VARCHAR(8),
    TRAS_NOTAMONTO  NUMERIC(18,2),
    TRAS_ANULADO    T_BOOLEANO,
    TRAS_TRANSMIT   T_BOOLEANO,
    TRAS_NOTAPREF   VARCHAR(4),
    TRAS_USUARIO    T_USUARIO,
    NUMOK           T_BOOLEANO DEFAULT 'N'
);

CREATE TABLE TRASLADOS_CAJA (
    TRCJ_ID        T_ID NOT NULL,
    PREF_PRE       VARCHAR(4),
    TRCJ_NUMERO    T_NUMDOC,
    TRCJ_FECHA     DATE,
    TRCJ_CONC      T_CONCEPTO,
    TRCJ_ANULADO   T_BOOLEANO,
    TRCJ_TRANSMIT  T_BOOLEANO,
    CAJA_ID        INTEGER,
    TRCJ_DESTINO   INTEGER,
    TRCJ_USUARIO   T_USUARIO,
    NUMOK          T_BOOLEANO DEFAULT 'N',
    VEND_COD       T_ID
);

CREATE TABLE TRASLADOS_CAJA_DET (
    TRCJ_ID        T_ID NOT NULL,
    TRCD_ITEM      INTEGER NOT NULL,
    FOPA_ID        INTEGER,
    TRCD_BANCO     VARCHAR(2),
    TRCD_CUENTA    VARCHAR(20),
    TRCD_NUMERO    VARCHAR(20),
    TRCD_FECHA     DATE,
    TRCD_MONTO     T_MONTO,
    TRCD_ANULADO   T_BOOLEANO,
    TRCD_TRANSMIT  T_BOOLEANO
);

CREATE TABLE TRASPORTADORES (
    TRSP_ID      T_ID NOT NULL,
    TRSP_NOMBRE  T_CONCEPTO NOT NULL
);

CREATE TABLE UNIDAD_ARTICULO (
    ARTI_COD     T_COD_ARTICULO NOT NULL,
    UNAR_UNIDAD  T_UNIDAD NOT NULL,
    UNAR_FACCAN  T_CANTIDAD NOT NULL,
    UNAR_FACPRE  T_CANTIDAD NOT NULL,
    UNAR_ACTIVA  T_BOOLEANO
);

CREATE TABLE UNIDADES_CARGA (
    UNCA_COD  INTEGER NOT NULL,
    UNCA_NOM  VARCHAR(60)
);

CREATE TABLE USUARIO (
    USER_COD         VARCHAR(10) NOT NULL,
    USER_ANOCNT      CHAR(4),
    USER_PERCNT      INTEGER,
    SUCU_ID          T_ID,
    USER_EMAIL       VARCHAR(100),
    USER_MAILSERVER  VARCHAR(100),
    USER_MAILUSER    CORREO,
    USER_MAILPASS    VARCHAR(40),
    VEND_COD         T_ID,
    CAJA_ID          T_ID,
    ENTG_ID          T_ID,
    PTVT_ID          T_ID,
    COCI_ID          T_ID,
    COND_NIT         NIT
);

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,
    VACA_OK       BOOLEANO,
    VACA_PERIODO  INTEGER,
    VACA_FECFIN   DATE,
    VACA_DIASSOL  SMALLINT,
    VACA_PAGONOM  T_BOOLEANO,
    VACA_DISFR    T_BOOLEANO,
    VACA_DIASACU  SMALLINT,
    VACA_FECINI   FECHA
);

CREATE TABLE VACACIONES_DETALLE (
    VACA_ID            T_ID NOT NULL,
    VACD_ITEM          T_ID NOT NULL,
    VACD_ANO           ANO,
    VACD_PERIODO       T_ID,
    VACD_PERIODICIDAD  T_ID,
    VACD_PAGANOM       T_BOOLEANO,
    VACD_DIAS          SMALLINT,
    VACD_MONTO         T_MONTO,
    VACD_NOMID         T_ID
);

CREATE TABLE VACACIONES_DISFRUT (
    TERC_NIT  VARCHAR(20),
    VADI_ID   INTEGER NOT NULL
);

CREATE TABLE VACACIONES_DISFRUT_DET (
    VADI_ID           INTEGER NOT NULL,
    VADE_ITEM         INTEGER NOT NULL,
    VADI_PERDESDE     ANO,
    VADI_PERHASTA     ANO,
    VADI_DISFRUTADOS  BOOLEANO,
    VADI_DIAS         SMALLINT
);

CREATE TABLE VALORES_NOMINA (
    TERC_NIT   T_NIT,
    VANO_NOM   T_CONCEPTO,
    ANO_VALOR  T_MONTO,
    NOMI_ID    T_ID,
    CONC_COD   T_ID
);

CREATE TABLE VEHICULO_CARROCERIA (
    VHCA_ID   INTEGER NOT NULL,
    VHCA_NOM  T_CONCEPTO
);

CREATE TABLE VEHICULO_COLOR (
    VHCO_COD    INTEGER NOT NULL,
    VHCO_COLOR  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,
    VHMA_CODMINT  CHAR(2)
);

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),
    VEHI_AFILIADO      T_BOOLEANO,
    VEHI_MOTOR         T_CONCEPTO
);

CREATE TABLE VEHICULOS_HISTORIA (
    VEHI_COD          T_NUMDOC NOT NULL,
    VEHH_FECHA        FECHA NOT NULL,
    VEHH_CONDUCTOR    T_NIT,
    VEHH_PROPIETARIO  T_NIT
);

CREATE TABLE VENDEDOR_DOCUMENTOS (
    VEND_COD      T_ID NOT NULL,
    VEDO_ITEM     T_ID NOT NULL,
    VEDO_ARCHIVO  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    VEDO_NOMBRE   EXPLICA
);

CREATE TABLE VENDEDOR_META (
    VEND_ID         T_ID NOT NULL,
    VEME_FECHA      DATE NOT NULL,
    VEME_META       T_MONTO,
    VEME_COMIPOR    T_PORCENTAJE,
    VEME_COMIMONTO  T_MONTO,
    VEME_COMIBASE   T_MONTO
);

CREATE TABLE VENDEDORES (
    VEND_COD        T_ID NOT NULL,
    VEND_NOMBRE     VARCHAR(60) NOT NULL,
    VEND_ESTADO     CHAR(1) NOT NULL,
    VEND_DIRECCION  VARCHAR(60),
    VEND_TELEFONOS  VARCHAR(30),
    PTVT_ID         INTEGER,
    PROY_COD        VARCHAR(4),
    CENT_COD        VARCHAR(4),
    SUCU_ID         T_ID,
    VEND_CONTADO    T_BOOLEANO,
    VEND_CC         NIT,
    VEND_GRUPO      T_CONCEPTO,
    VEND_LISTA      T_ID
);

CREATE TABLE VENDEDORES_GRUPO (
    GRVE_ID   T_ID NOT NULL,
    VEND_COD  T_ID NOT NULL
);

CREATE TABLE VENTAS_MES (
    MES    SMALLINT NOT NULL,
    TOTAL  T_MONTO
);

CREATE TABLE ZONAS (
    ZONA_NOM          VARCHAR(60) NOT NULL,
    ZONA_CTAVENTAS    T_CTA_CONTABLE,
    ZONA_CTACLIENTE   T_CTA_CONTABLE,
    ZONA_CTARTFTE     T_CTA_CONTABLE,
    ZONA_CTARIVA      T_CTA_CONTABLE,
    ZONA_CTARICA      T_CTA_CONTABLE,
    ZONA_COD          T_ZONA NOT NULL,
    SUCU_ID           T_ID,
    ZONA_CTAANTI      T_CTA_CONTABLE,
    ZONA_CTAVTANIIF   T_CTA_CONTABLE,
    ZONA_CTACLIENIIF  T_CTA_CONTABLE,
    ZONA_CTARFTENIIF  T_CTA_CONTABLE,
    ZONA_CTARIVANIIF  T_CTA_CONTABLE,
    ZONA_CTARICANIIF  T_CTA_CONTABLE,
    ZONA_CTAANTINIIF  T_CTA_CONTABLE,
    ZONA_VRFLETE      T_MONTO
);



/******************************************************************************/
/***                                 Views                                  ***/
/******************************************************************************/


/* View: AJUSTE_TOTAL */
CREATE VIEW AJUSTE_TOTAL(
    TIPO,
    ANULADO,
    PREFIJO,
    NUMERO,
    FECHA,
    CONCEPTO,
    TERCERO,
    IVA,
    TOTAL)
AS
SELECT MAX('AJUSTE'), MAX(AJUS_ANULADO), MAX(PREF_PRE), MAX(AJUS_NUMERO), MAX(AJUS_FECHA), MAX(AJUS_CONC), MAX(''), SUM(0), SUM(0)
FROM AJUSTES
;



/* View: CONSIGNA_TOTAL */
CREATE VIEW CONSIGNA_TOTAL(
    ID,
    CUENTAID,
    CUENTA,
    PREFIJO,
    NUMERO,
    FECHA,
    CONCEPTO,
    ANULADO,
    TOTAL)
AS
SELECT MAX(C.CONS_ID), MAX(C.CUBA_COD), MAX(CUBA_CODCTA), MAX(PRBA_PREF), MAX(CONS_NUMERO), MAX(CONS_FECHA), MAX(CONS_CONCEPTO), MAX(CONS_ANULADO), SUM(CODE_MONTO)
FROM CONSIGNA C, CONSIGNA_DETALLE CD, CUENTAS_BANCO B
WHERE C.CONS_ID = CD.CONS_ID AND B.CUBA_COD = C.CUBA_COD GROUP BY C.CONS_ID
;



/* View: CUENTAS_BANCOS */
CREATE VIEW CUENTAS_BANCOS(
    CUBA_COD,
    CUBA_CODCTA,
    BANC_COD,
    BANC_NOMBRE,
    CUBA_NUMERO,
    CUBA_TITULAR,
    CUBA_SUCURSAL,
    CUBA_ESTADO)
AS
SELECT C.CUBA_COD, C.CUBA_CODCTA, B.BANC_COD, B.BANC_NOMBRE, C.CUBA_NUMERO, C.CUBA_TITULAR, C.CUBA_SUCURSAL, C.CUBA_ESTADO
FROM CUENTAS_BANCO C, BANCOS B
WHERE C.BANC_COD = B.BANC_COD
;



/* View: DESENSAMBLE_TOTAL */
CREATE VIEW DESENSAMBLE_TOTAL(
    TIPO,
    ANULADO,
    PREFIJO,
    NUMERO,
    FECHA,
    CONCEPTO,
    TERCERO,
    IVA,
    TOTAL)
AS
SELECT MAX('DESENSAMBLE'), MAX(DESE_ANULADO), MAX(PREF_PRE), MAX(DESE_NUMERO), MAX(DESE_FECHA), MAX(DESE_CONC), MAX(DESE_DESC), SUM(DEDE_IVAMONTO), SUM(DEDE_CANT*DEDE_COSTO+DEDE_IVAMONTO+DEDE_CONSUMO)
FROM DESENSAMBLES E, DESENSAMBLES_DETALLE ED
WHERE E.DESE_ID = ED.DESE_ID
;



/* View: ENSAMBLE_TOTAL */
CREATE VIEW ENSAMBLE_TOTAL(
    TIPO,
    ANULADO,
    PREFIJO,
    NUMERO,
    FECHA,
    CONCEPTO,
    TERCERO,
    IVA,
    TOTAL)
AS
SELECT MAX('ENSAMBLE'), MAX(ENSA_ANULADO), MAX(PREF_PRE), MAX(ENSA_NUMERO), MAX(ENSA_FECHA), MAX(ENSA_CONC), MAX(ENSA_DESC), SUM(ESDE_IVAMONTO), SUM(ESDE_CANT*ESDE_COSTO+ESDE_IVAMONTO+ESDE_CONSUMO)
FROM ENSAMBLES E, ENSAMBLES_DETALLE ED
WHERE E.ENSA_ID = ED.ENSA_ID
;



/* View: ENTRADA_TOTAL */
CREATE VIEW ENTRADA_TOTAL(
    TIPO,
    ANULADO,
    PREFIJO,
    NUMERO,
    FECHA,
    CONCEPTO,
    TERCERO,
    IVA,
    TOTAL)
AS
SELECT MAX('ENTRADA'), MAX(ENTR_ANULADO), MAX(PREF_PRE), MAX(ENTR_NUMERO), MAX(ENTR_FECHA), MAX(ENTR_CONC), MAX(ENTR_NOMTERC), SUM(ENDE_IVAMONTO), SUM(ENDE_TOTAL)
FROM ENTRADAS E, ENTRADAS_DETALLE ED
WHERE E.ENTR_ID = ED.ENTR_ID
;



/* View: ORDENINV_TOTAL */
CREATE VIEW ORDENINV_TOTAL(
    TIPO,
    ANULADO,
    PREFIJO,
    NUMERO,
    FECHA,
    CONCEPTO,
    TERCERO,
    IVA,
    TOTAL)
AS
SELECT MAX('ORDEN'), MAX(ORIN_ANULADO), MAX(PREF_PRE), MAX(ORIN_NUMERO), MAX(ORIN_FECHA), MAX(ORIN_CONC), MAX(ORIN_NOMTERC), SUM(ORID_IVAMONTO), SUM(ORID_TOTAL)
FROM ORDENES_INVENTARIO O, ORDENINVENTARIO_DETALLE OD
WHERE O.ORIN_ID = OD.ORIN_ID
;



/* View: RESERVA_TOTAL */
CREATE VIEW RESERVA_TOTAL(
    TIPO,
    ANULADO,
    PREFIJO,
    NUMERO,
    FECHA,
    CONCEPTO,
    TERCERO,
    IVA,
    TOTAL)
AS
SELECT MAX('RESERVA'), MAX(RESE_ANULADO), MAX(PREF_PRE), MAX(RESE_NUMERO), MAX(RESE_FECHA), MAX(RESE_CONC), MAX(RESE_NOMTERC), SUM(0), SUM(0)
FROM RESERVAS R
;



/* View: SALIDA_TOTAL */
CREATE VIEW SALIDA_TOTAL(
    TIPO,
    ANULADO,
    PREFIJO,
    NUMERO,
    FECHA,
    CONCEPTO,
    TERCERO,
    IVA,
    TOTAL)
AS
SELECT MAX('SALIDA'), MAX(SALI_ANULADO), MAX(PREF_PRE), MAX(SALI_NUMERO), MAX(SALI_FECHA), MAX(SALI_CONC), MAX(SALI_NOMTERC), SUM(SADE_IVAMONTO), SUM(SADE_TOTAL)
FROM SALIDAS S, SALIDAS_DETALLE SD
WHERE S.SALI_ID = SD.SALI_ID
;



/* View: TRASLADO_TOTAL */
CREATE VIEW TRASLADO_TOTAL(
    TIPO,
    ANULADO,
    PREFIJO,
    NUMERO,
    FECHA,
    CONCEPTO,
    TERCERO,
    IVA,
    TOTAL)
AS
SELECT MAX('TRASLADO'), MAX(TRAN_ANULADO), MAX(PREF_PRE), MAX(TRAN_NUMERO), MAX(TRAN_FECHA), MAX(TRAN_CONC), MAX(''), SUM(TRAS_IVAMONTO), SUM(TRAS_TOTAL)
FROM TRASFERENCIAS T, TRASFERENCIAS_DETALLE TD
WHERE T.TRAN_ID = TD.TRAN_ID
;




/* Check constraints definition */

ALTER TABLE CUENTAS ADD CONSTRAINT CKC_CUEN_TERCERO_CUENTAS check (CUEN_TERCERO in ('S','N'));
ALTER TABLE CUENTAS ADD CONSTRAINT CKC_CUEN_CENTRO_CUENTAS check (CUEN_CENTRO in ('S','N'));
ALTER TABLE CUENTAS ADD CONSTRAINT CKC_CUEN_RETENCION_CUENTAS check (CUEN_RETENCION in ('S','N'));
ALTER TABLE CONCEPTOS ADD CONSTRAINT CKC_CONC_DEBITO_CONCEPTO check (CONC_DEBITO is null or (CONC_DEBITO in ('S','N')));
ALTER TABLE PREFIJOS_CONTA ADD CONSTRAINT CKC_PRCO_AUTO_PREFIJOS check (PRCO_AUTO in ('S','N'));
ALTER TABLE CONCEPTOS_CUENTAS ADD CONSTRAINT CKC_COCU_DEBITO_CONCEPTO check (COCU_DEBITO in ('S','N'));
ALTER TABLE CUENTAS_NIIF ADD CONSTRAINT CKC_CUENN_TERCERO_CUENTAS check (CUEN_TERCERO in ('S','N'));
ALTER TABLE CUENTAS_NIIF ADD CONSTRAINT CKC_CUENN_CENTRO_CUENTAS check (CUEN_CENTRO in ('S','N'));
ALTER TABLE CUENTAS_NIIF ADD CONSTRAINT CKC_CUENN_RETENCION_CUENTAS check (CUEN_RETENCION in ('S','N'));


/******************************************************************************/
/***                           Unique Constraints                           ***/
/******************************************************************************/

ALTER TABLE CUENTAS_BANCO ADD CONSTRAINT UNQ1_CUENTAS_BANCO UNIQUE (CUBA_CODCTA);
ALTER TABLE TRASPORTADORES ADD CONSTRAINT UNQ1_TRASPORTADORES UNIQUE (TRSP_NOMBRE);


/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE ACTIVOS_CENTROS ADD CONSTRAINT PK_ACTIVOS_CENTROS PRIMARY KEY (ACFJ_COD, ACCE_ITEM);
ALTER TABLE ACTIVOS_DOCUMENTOS ADD CONSTRAINT PK_ACTIVOS_DOCUMENTOS PRIMARY KEY (ACFJ_COD, ACDO_ITEM);
ALTER TABLE ACTIVOS_FIJOS ADD CONSTRAINT PK_ACTIVOS_FIJOS PRIMARY KEY (ACFJ_COD);
ALTER TABLE ACTIVOS_FIJOS_VALOR ADD CONSTRAINT PK_ACTIVOS_FIJOS_VALOR PRIMARY KEY (ACFJ_COD, ACFV_FECHA);
ALTER TABLE ACTIVOS_GRUPOS ADD CONSTRAINT PK_ACTIVOS_GRUPOS PRIMARY KEY (ACGR_ID);
ALTER TABLE ACTIVOS_SUBGRUPO ADD CONSTRAINT PK_ACTIVOS_SUBGRUPO PRIMARY KEY (ACGR_ID, ACSG_ID);
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 AJUSTES ADD CONSTRAINT PK_AJUSTES PRIMARY KEY (AJUS_ID);
ALTER TABLE AJUSTES_DETALLE ADD CONSTRAINT PK_AJUSTES_DETALLE PRIMARY KEY (AJUS_ID, AJUS_ITEM);
ALTER TABLE AJUSTES_INFLACION ADD CONSTRAINT PK_AJUSTES_INFLACION PRIMARY KEY (AJUS_ID);
ALTER TABLE AJUSTE_CIERRE ADD CONSTRAINT PK_AJUSTE_CIERRE PRIMARY KEY (AJCI_ID);
ALTER TABLE ANALISIS_ABCINVEN ADD CONSTRAINT PK_ANALISIS_ABCINVEN PRIMARY KEY (ABCI_COD);
ALTER TABLE ANTICIPOS_CLIENTE ADD CONSTRAINT PK_ANTICIPOS_CLIENTE PRIMARY KEY (ANCL_ID);
ALTER TABLE ANTICIPOS_NOMINA ADD CONSTRAINT PK_ANTICIPOS_NOMINA PRIMARY KEY (ANNO_ID);
ALTER TABLE ANTICIPOS_PROVEEDOR ADD CONSTRAINT PK_ANTICIPOS_PROVEEDOR PRIMARY KEY (ANPR_ID);
ALTER TABLE APERTURA_NIIF ADD CONSTRAINT PK_APERTURA_NIIF PRIMARY KEY (CUEN_COD);
ALTER TABLE APERTURA_NIIF_DET ADD CONSTRAINT PK_APERTURA_NIIF_DET PRIMARY KEY (CUEN_COD, APND_ITEM);
ALTER TABLE APLICACION_CLIENTE ADD CONSTRAINT PK_APLICACION_CLIENTE PRIMARY KEY (APCL_ID);
ALTER TABLE APLICACION_CLIENTE_CRUCE ADD CONSTRAINT PK_APLICACION_CLIENTE_CRUCE PRIMARY KEY (APCL_ID, APCR_ITEM);
ALTER TABLE APLICACION_CLIENTE_DETALLE ADD CONSTRAINT PK_APLICACION_CLIENTE_DETALLE PRIMARY KEY (APCL_ID, ACDE_ITEM);
ALTER TABLE APLICACION_PROVEDOR ADD CONSTRAINT PK_APLICACION_PROVEDOR PRIMARY KEY (APPR_ID);
ALTER TABLE APLICACION_PROVEEDOR_DETALLE ADD CONSTRAINT PK_APLICACION_PROVEEDOR_DETALLE PRIMARY KEY (APPR_ID, APPD_ITEM);
ALTER TABLE AREA ADD CONSTRAINT PK_AREA PRIMARY KEY (DPTO_COD, SECC_COD, AREA_COD);
ALTER TABLE ARQUEO_CAJA ADD CONSTRAINT PK_ARQUEO_CAJA PRIMARY KEY (ARQC_ID);
ALTER TABLE ARQUEO_CAJA_DET ADD CONSTRAINT PK_ARQUEO_CAJA_DET PRIMARY KEY (ARQC_ID, ARQD_ITEM);
ALTER TABLE ARTICULO ADD CONSTRAINT PK_ARTICULO PRIMARY KEY (ARTI_COD);
ALTER TABLE ARTICULOS_PRODUCTO ADD CONSTRAINT PK_ARTICULOS_PRODUCTO PRIMARY KEY (ARTI_COD, ARPR_ITEM);
ALTER TABLE ARTICULO_ALERTAS ADD CONSTRAINT PK_ARTICULO_ALERTAS PRIMARY KEY (ARTI_COD, ARTI_ITEM);
ALTER TABLE ARTICULO_BODEGA ADD CONSTRAINT PK_ARTICULO_BODEGA PRIMARY KEY (SUCU_ID, ARTI_COD, BODE_COD);
ALTER TABLE ARTICULO_DOCUMENTOS ADD CONSTRAINT PK_ARTICULO_DOCUMENTOS PRIMARY KEY (ARTI_COD, ARDO_ITEM);
ALTER TABLE ARTICULO_EQUIVALENCIA ADD CONSTRAINT PK_ARTICULO_EQUIVALENCIA PRIMARY KEY (ARTI_COD, AREQ_ITEM);
ALTER TABLE ARTICULO_MINIMOS ADD CONSTRAINT PK_ARTICULO_MINIMOS PRIMARY KEY (ARMN_ARTICULO, ARMN_BODEGA, ARMN_DIA, ARMN_HORAINI);
ALTER TABLE ASEGURADORA ADD CONSTRAINT PK_ASEGURADORA PRIMARY KEY (ASEG_NIT);
ALTER TABLE ASESORES ADD CONSTRAINT PK_ASESORES PRIMARY KEY (ASES_ID);
ALTER TABLE AUDITORIA ADD CONSTRAINT PK_AUDITORIA PRIMARY KEY (AUDI_ID);
ALTER TABLE AUTORIZACIONES ADD CONSTRAINT PK_AUTORIZACIONES PRIMARY KEY (AUTO_NUMERO, PREF_PRE);
ALTER TABLE AUTORIZACIONES_CARTERA ADD CONSTRAINT PK_AUTORIZACIONES_CARTERA PRIMARY KEY (AUCA_ID);
ALTER TABLE BANCOS ADD CONSTRAINT PK_BANCOS PRIMARY KEY (BANC_COD);
ALTER TABLE BARRAS_ARTICULO ADD CONSTRAINT PK_BARRAS_ARTICULO PRIMARY KEY (ARTI_COD, COBA_COD);
ALTER TABLE BODEGA ADD CONSTRAINT PK_BODEGA PRIMARY KEY (BODE_COD);
ALTER TABLE BONOS_PAGO ADD CONSTRAINT PK_BONOS_PAGO PRIMARY KEY (BOPA_ID);
ALTER TABLE CAJAS ADD CONSTRAINT PK_CAJAS PRIMARY KEY (CAJA_ID);
ALTER TABLE CAJEROS ADD CONSTRAINT PK_CAJEROS PRIMARY KEY (CAJE_ID);
ALTER TABLE CAMBIA_COSTOS ADD CONSTRAINT PK_CAMBIA_COSTOS PRIMARY KEY (CAMC_ID, CAMC_ITEM);
ALTER TABLE CAMBIA_PRECIOS ADD CONSTRAINT PK_CAMBIA_PRECIOS PRIMARY KEY (CAPR_ID);
ALTER TABLE CAMBIODOC_ENTRADAS ADD CONSTRAINT PK_CAMBIODOC_ENTRADAS PRIMARY KEY (CADO_ID, CDEN_ITEM);
ALTER TABLE CAMBIODOC_SALIDAS ADD CONSTRAINT PK_CAMBIODOC_SALIDAS PRIMARY KEY (CADO_ID, CDSA_ITEM);
ALTER TABLE CAMBIO_ARTICULOS ADD CONSTRAINT PK_CAMBIO_ARTICULOS PRIMARY KEY (CAAR_ID, CAAR_ITEM);
ALTER TABLE CAMBIO_COSTO ADD CONSTRAINT PK_CAMBIO_COSTO PRIMARY KEY (CACO_ID);
ALTER TABLE CAMBIO_DOCUMENTOS ADD CONSTRAINT PK_CAMBIO_DOCUMENTOS PRIMARY KEY (CADO_ID);
ALTER TABLE CANAL ADD CONSTRAINT PK_CANAL PRIMARY KEY (CANA_ID);
ALTER TABLE CARGA_PRODUCTOS ADD CONSTRAINT PK_CARGA_PRODUCTOS PRIMARY KEY (CGPR_COD);
ALTER TABLE CARGA_REMESA ADD PRIMARY KEY (CGRM_ID);
ALTER TABLE CARTAS_NOMINA ADD CONSTRAINT PK_CARTAS_NOMINA PRIMARY KEY (CANO_ID);
ALTER TABLE CENTROS ADD CONSTRAINT PK_CENTROS PRIMARY KEY (PROY_COD, CENT_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 CHEQUERA ADD CONSTRAINT PK_CHEQUERA PRIMARY KEY (CUBA_COD, CHRA_ID);
ALTER TABLE CHEQUES ADD CONSTRAINT PK_CHEQUES PRIMARY KEY (CHEQ_ID);
ALTER TABLE CIERRE_ANUAL ADD CONSTRAINT PK_CIERRE_ANUAL PRIMARY KEY (CIAN_ID);
ALTER TABLE CIERRE_TERCEROS ADD CONSTRAINT PK_CIERRE_TERCEROS PRIMARY KEY (CITE_ID);
ALTER TABLE CIUDADES ADD CONSTRAINT PK_CIUDADES PRIMARY KEY (CIUD_COD);
ALTER TABLE CLASE_EGRESO ADD CONSTRAINT PK_CLASE_EGRESO PRIMARY KEY (CLEG_ID);
ALTER TABLE CLIENTES ADD CONSTRAINT PK_CLIENTES PRIMARY KEY (TERC_NIT);
ALTER TABLE CLIENTES_ALERTAS ADD CONSTRAINT PK_CLIENTES_ALERTAS PRIMARY KEY (TERC_NIT, CLAL_ITEM);
ALTER TABLE CLIENTES_FACTURACION_MASIVA ADD CONSTRAINT PK_CLIENTES_FACTURACION_MASIVA PRIMARY KEY (CLFA_ID);
ALTER TABLE CLIENTE_SUCURSALES ADD CONSTRAINT PK_CLIENTE_SUCURSALES PRIMARY KEY (TERC_NIT, CLCU_COD);
ALTER TABLE COBRADORES ADD CONSTRAINT PK_COBRADORES PRIMARY KEY (COBR_COD);
ALTER TABLE COCINA_COLA_FUNCION ADD CONSTRAINT PK_COCINA_COLA_FUNCION PRIMARY KEY (COFU_ID, COCF_ITEM);
ALTER TABLE COCINA_FUNCIONES ADD CONSTRAINT PK_COCINA_FUNCIONES PRIMARY KEY (COFU_ID);
ALTER TABLE COCINA_OPERARIOS ADD CONSTRAINT PK_COCINA_OPERARIOS PRIMARY KEY (COOP_ID);
ALTER TABLE COLORES ADD CONSTRAINT PK_COLORES PRIMARY KEY (COLR_ID);
ALTER TABLE COMISIONES ADD CONSTRAINT PK_COMISIONES PRIMARY KEY (VEND_COD, COMI_ID);
ALTER TABLE COMISIONES_POR_PAGAR ADD CONSTRAINT PK_COMISIONES_POR_PAGAR PRIMARY KEY (CMPP_ID);
ALTER TABLE COMISIONES_PUNTOS ADD CONSTRAINT PK_COMISIONES_PUNTOS PRIMARY KEY (COPU_COD);
ALTER TABLE COMISION_COBRO ADD CONSTRAINT PK_COMISION_COBRO PRIMARY KEY (COBR_COD, CMCB_ITEM);
ALTER TABLE COMPRAS_INTERNACIONALES ADD CONSTRAINT PK_COMPRAS_INT PRIMARY KEY (COIN_ID);
ALTER TABLE COMPRAS_INTERNACIONALES_DETALLE ADD CONSTRAINT PK_COMPRAS_INT_DETALLE PRIMARY KEY (COIN_ID, CIDE_ITEM);
ALTER TABLE COMPROBANTE_DETALLE ADD CONSTRAINT PK_COMPROBANTE_DETALLE PRIMARY KEY (ENCO_CONSEC, CODE_ITEM);
ALTER TABLE COMPROBANTE_DETALLE_NIIF ADD CONSTRAINT PK_COMPROBANTE_DETALLE_NIIF PRIMARY KEY (ENCO_CONSEC, CODE_ITEM);
ALTER TABLE COMPROBANTE_ENCABEZADO ADD CONSTRAINT PK_COMPROBANTE_ENCABEZADO PRIMARY KEY (ENCO_CONSEC);
ALTER TABLE CONCEPTOS ADD CONSTRAINT PK_CONCEPTOS PRIMARY KEY (CONC_COD);
ALTER TABLE CONCEPTOS_CUENTAS ADD CONSTRAINT PK_CONCEPTOS_CUENTAS PRIMARY KEY (CONC_COD, COCU_ITEM);
ALTER TABLE CONCEPTOS_CXPAGAR ADD CONSTRAINT PK_CONCEPTOS_CXPAGAR PRIMARY KEY (COCX_COD);
ALTER TABLE CONCEPTOS_NOMINA ADD CONSTRAINT PK_CONCEPTOS_NOMINA PRIMARY KEY (CONC_COD);
ALTER TABLE CONCEPTOS_NOMINA_REPORTE ADD CONSTRAINT PK_CONCEPTOS_NOMINA_REPORTE PRIMARY KEY (CONC_COD);
ALTER TABLE CONCEPTOS_PLANILLA ADD CONSTRAINT PK_CONCEPTOS_PLANILLA PRIMARY KEY (COPL_ID);
ALTER TABLE CONCEPTOS_TRANSPORTE ADD CONSTRAINT PK_CONCEPTOS_TRANSPORTE PRIMARY KEY (COTR_ID);
ALTER TABLE CONCEPTO_CONTABLE ADD CONSTRAINT PK_CONCEPTO_CONTABLE PRIMARY KEY (CONC_COD);
ALTER TABLE CONCILIACION_BANCARIA ADD CONSTRAINT PK_CONCILIACION_BANCARIA PRIMARY KEY (COBN_ID, COBN_ITEM);
ALTER TABLE CONCILIACION_DETALLE ADD CONSTRAINT PK_CONCILIACION_DETALLE PRIMARY KEY (COBN_ID, COBN_ITEM, COBN_DET);
ALTER TABLE CONCILIACION_ENCABEZADO ADD CONSTRAINT PK_CONCILIACION_ENCABEZADO PRIMARY KEY (COBN_ID);
ALTER TABLE CONCILIACION_OPERACIONES ADD CONSTRAINT PK_CONCILIACION_OPERACIONES PRIMARY KEY (CUBA_COD, COOP_OPER);
ALTER TABLE CONCILIACION_PAT ADD CONSTRAINT PK_CONCILIACION_PAT PRIMARY KEY (CUENTAREF);
ALTER TABLE CONCILIACION_PAT_DET ADD CONSTRAINT PK_CONCILIACION_PAT_DET PRIMARY KEY (COPD_ID, COPD_CONSEC);
ALTER TABLE CONCILIA_BANCO_CONTA_AUX ADD CONSTRAINT PK_CONCILIA_BANCO_CONTA_AUX PRIMARY KEY (COBC_TIPO, COBC_ID);
ALTER TABLE CONDUCTOR ADD CONSTRAINT PK_CONDUCTOR PRIMARY KEY (TERC_NIT, COND_FECHA);
ALTER TABLE CONFIGURACION ADD CONSTRAINT PK_CONFIGURACION PRIMARY KEY (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD);
ALTER TABLE CONFIGURACION_HORAS_EMPLEADO ADD CONSTRAINT PK_CONFIGURACION_NUMERO_HORAS PRIMARY KEY (TERC_NIT);
ALTER TABLE CONFIGURA_CERTRETE ADD CONSTRAINT PK_CONFIGURA_CERTRETE PRIMARY KEY (CFCR_CUENTA, CFCR_ITEM);
ALTER TABLE CONFIGURA_CERTRETEL ADD CONSTRAINT PK_CONFIGURA_CERTRETEL PRIMARY KEY (COCR_RENGLON);
ALTER TABLE CONFIGURA_CERTRETEL_CONC ADD CONSTRAINT PK_CONFIGURA_CERTRETEL_CONC PRIMARY KEY (COCR_RENGLON, CCRC_ITEM);
ALTER TABLE CONFIGURA_MEDIOSMAG ADD CONSTRAINT PK_CONFIGURA_MEDIOSMAG PRIMARY KEY (COME_ITEM);
ALTER TABLE CONFIGURA_POS ADD CONSTRAINT PK_CONFIGURA_POS PRIMARY KEY (CFGP_ID);
ALTER TABLE CONFIGURA_TIENDAV ADD CONSTRAINT PK_CONFIGURA_TIENDAV PRIMARY KEY (COTV_URLADMIN);
ALTER TABLE CONFIRMACION_DEPOSITO ADD CONSTRAINT PK_CONFIRMACION_DEPOSITO PRIMARY KEY (CODE_ID, OREM_ID, SLIM_ID);
ALTER TABLE CONSIGNA ADD CONSTRAINT PK_CONSIGNA PRIMARY KEY (CONS_ID);
ALTER TABLE CONSIGNA_DETALLE ADD CONSTRAINT PK_CONSIGNA_DETALLE PRIMARY KEY (CONS_ID, CODE_ITEM2);
ALTER TABLE CONSIGNA_RECIBOS ADD CONSTRAINT PK_CONSIGNA_RECIBOS PRIMARY KEY (CONS_ID, COND_ITEM);
ALTER TABLE CONSIGNA_TARJETAS ADD CONSTRAINT PK_CONSIGNA_TARJETAS PRIMARY KEY (COTJ_ID);
ALTER TABLE CONSIGNA_TARJETAS_DET ADD CONSTRAINT PK_CONSIGNA_TARJETAS_DET PRIMARY KEY (COTJ_ID, CTJD_ITEM);
ALTER TABLE CONSOLIDADO_FALTANTES ADD CONSTRAINT PK_CONSOLIDADO_FALTANTES PRIMARY KEY (COFA_ID, COFA_ITEM);
ALTER TABLE CONSOLIDADO_NOMINA ADD CONSTRAINT PK_CONSOLIDADO_NOMINA PRIMARY KEY (CONO_ID, CONO_ITEM);
ALTER TABLE CONSOLIDE_DOCS ADD CONSTRAINT PK_CONSOLIDE_DOCS PRIMARY KEY (CODO_ID, CODO_ITEM);
ALTER TABLE CONSOLIDE_FORMASP ADD CONSTRAINT PK_CONSOLIDE_FORMASP PRIMARY KEY (COFP_ID, COFP_ITEM);
ALTER TABLE CONSOLIDE_NOMINAS ADD CONSTRAINT PK_CONSOLIDE_NOMINAS PRIMARY KEY (CONN_ID, CONN_ITEM);
ALTER TABLE CONSULTA_BALANCE ADD CONSTRAINT PK_CONSULTA_BALANCE PRIMARY KEY (COBA_ANO, COBA_MES, CUENTA);
ALTER TABLE CONSUMOS ADD CONSTRAINT PK_CONSUMOS PRIMARY KEY (CONS_ID);
ALTER TABLE CONSUMO_DETALLE ADD CONSTRAINT PK_CONSUMO_DETALLE PRIMARY KEY (CONS_ID, CNDE_ITEM);
ALTER TABLE CONTABILIZACION ADD CONSTRAINT PK_CONTABILIZACION PRIMARY KEY (CNTB_ID);
ALTER TABLE CONTABILIZACION_DET ADD CONSTRAINT PK_CONTABILIZACION_DET PRIMARY KEY (CNTB_ID, CNDE_ITEM);
ALTER TABLE CONTABIL_ARTICULO ADD CONSTRAINT PK_CONTABIL_ARTICULO PRIMARY KEY (ARTI_COD);
ALTER TABLE CONTABIL_ARTICULO_NIIF ADD CONSTRAINT PK_CONTABIL_ARTICULO_N PRIMARY KEY (ARTI_COD);
ALTER TABLE CONTRATOS_COLEGIOS ADD CONSTRAINT PK_CONTRATOS_COLEGIOS PRIMARY KEY (CNCL_ID);
ALTER TABLE CORREDOR_RUTA ADD CONSTRAINT PK_CORREDOR_RUTA PRIMARY KEY (CORU_ID);
ALTER TABLE COSTOS ADD CONSTRAINT PK_COSTOS PRIMARY KEY (ARTI_COD, COST_FECHA, COST_ITEM)
USING DESCENDING INDEX PK_COSTOS;
ALTER TABLE COSTOS_NIIF ADD CONSTRAINT PK_COSTOS_NIIF PRIMARY KEY (ARTI_COD, COST_FECHA, COST_ITEM)
USING DESCENDING INDEX PK_COSTOS_NIIF;
ALTER TABLE COSTO_FACTURA ADD CONSTRAINT PK_COSTO_FACTURA PRIMARY KEY (FECHA, ARTICULO);
ALTER TABLE COSTO_VENTAS ADD CONSTRAINT PK_COSTO_VENTAS PRIMARY KEY (TIDO_COD, COVE_ID, COVE_ITEM);
ALTER TABLE COSTO_VENTAS_NIIF ADD CONSTRAINT PK_COSTO_VENTAS_N PRIMARY KEY (TIDO_COD, COVE_ID, COVE_ITEM);
ALTER TABLE COTIZACIONES ADD CONSTRAINT PK_COTIZACIONES PRIMARY KEY (COTI_ID);
ALTER TABLE COTIZACIONES_DETALLE ADD CONSTRAINT PK_COTIZACIONES_DETALLE PRIMARY KEY (COTI_ID, CTDE_ITEM);
ALTER TABLE COTIZACIONES_PROVEEDOR_DET ADD CONSTRAINT PK_COTIZACIONES_PROVEEDOR_DET PRIMARY KEY (COPR_ID, CPRD_ITEM);
ALTER TABLE COTIZACION_PROVEEDOR ADD CONSTRAINT PK_COTIZACION_PROVEEDOR PRIMARY KEY (COPR_ID);
ALTER TABLE COTIZACION_WEB ADD CONSTRAINT PK_COTIZACION_WEB PRIMARY KEY (COWE_ID);
ALTER TABLE COTIZACION_WEB_DETALLE ADD CONSTRAINT PK_COTI_WEB_DETALLE PRIMARY KEY (COWE_ID, COWD_ITEM);
ALTER TABLE CRM_ACTIVIDAD ADD CONSTRAINT PK_CRM_ACTIVIDAD PRIMARY KEY (CRAC_ID);
ALTER TABLE CRM_AGRUPACION ADD CONSTRAINT PK_CRM_AGRUPACION PRIMARY KEY (CRAG_ID);
ALTER TABLE CRM_ASESOR ADD CONSTRAINT PK_CRM_ASESOR PRIMARY KEY (CRAS_ID);
ALTER TABLE CRM_CAMPANA ADD CONSTRAINT PK_CRM_CAMPANA PRIMARY KEY (CRCM_ID);
ALTER TABLE CRM_CAMPANA_DETALLE ADD CONSTRAINT PK_CRM_CAMPANA_DETALLE PRIMARY KEY (CRCM_ID, CRCD_CLIENTE);
ALTER TABLE CRM_CAMPANA_MOTIVOS ADD CONSTRAINT PK_CRM_CAMPANA_MOTIVOS PRIMARY KEY (CRCM_ID, CRMO_ITEM);
ALTER TABLE CRM_CAMPANA_PLANILLA ADD CONSTRAINT PK_CRM_CAMPANA_PLANILLA PRIMARY KEY (CRCP_ID, CRCP_ITEM);
ALTER TABLE CRM_CAMPANA_RESPUESTAS ADD CONSTRAINT PK_CRM_CAMPANA_RESPUESTAS PRIMARY KEY (CRCM_ID, CRCR_ITEM);
ALTER TABLE CRM_CARGOS ADD CONSTRAINT PK_CRM_CARGOS PRIMARY KEY (CRCG_ID);
ALTER TABLE CRM_CLASE ADD CONSTRAINT PK_CRM_CLASE PRIMARY KEY (CRCL_ID);
ALTER TABLE CRM_CLIENTES ADD CONSTRAINT PK_CRMCLIENTE PRIMARY KEY (CRCL_NIT);
ALTER TABLE CRM_COMPROMISOS ADD CONSTRAINT PK_CRM_COMPROMISOS PRIMARY KEY (CRCO_ID);
ALTER TABLE CRM_CONTACTOS ADD CONSTRAINT PK_CRM_CONTACTOS PRIMARY KEY (CRCL_NIT, CRCO_ID);
ALTER TABLE CRM_ESTADO ADD CONSTRAINT PK_CRM_ESTADO PRIMARY KEY (CRES_ID);
ALTER TABLE CRM_EVENTOS ADD CONSTRAINT PK_CRM_EVENTOS PRIMARY KEY (CREV_ID);
ALTER TABLE CRM_EVENTOS_NOTAS ADD CONSTRAINT PK_CRM_EVENTOS_NOTAS PRIMARY KEY (CREV_ID, CEVN_NOTA);
ALTER TABLE CRM_EVENTO_MOTIVO ADD CONSTRAINT PK_CRM_EVENTO_MOTIVO PRIMARY KEY (CREM_ID);
ALTER TABLE CRM_EVENTO_RESPUESTA ADD CONSTRAINT PK_CRM_EVENTO_RESPUESTA PRIMARY KEY (CRER_ID);
ALTER TABLE CRM_PRODUCTOS ADD CONSTRAINT PK_CRM_PRODUCTOS PRIMARY KEY (CRPR_ID);
ALTER TABLE CRM_SUBPRODUCTOS ADD CONSTRAINT PK_CRM_SUBPRODUCTOS PRIMARY KEY (CRSP_ID, CRSP_ITEM);
ALTER TABLE CRM_TIPOCONTACTO ADD CONSTRAINT PK_CRM_TIPOCONTACTO PRIMARY KEY (CRTC_ID);
ALTER TABLE CRM_TIPOEVENTO ADD CONSTRAINT PK_CRM_TIPOEVENTO PRIMARY KEY (CRTE_ID);
ALTER TABLE CRM_TIPORELACION ADD CONSTRAINT PK_CRM_TIPORELACION PRIMARY KEY (CRTR_ID);
ALTER TABLE CRM_TIPO_ACTIVIDAD ADD CONSTRAINT PK_CRM_TIPO_ACTIVIDAD PRIMARY KEY (CRTA_ID);
ALTER TABLE CUENTAS ADD CONSTRAINT PK_CUENTAS PRIMARY KEY (CUEN_COD);
ALTER TABLE CUENTAS_BANCO ADD CONSTRAINT PK_CUENTAS_BANCO PRIMARY KEY (CUBA_COD);
ALTER TABLE CUENTAS_NIIF ADD CONSTRAINT PK_CUENTAS_NIIF PRIMARY KEY (CUEN_COD);
ALTER TABLE CUENTAS_NIIF_NORMA ADD CONSTRAINT PK_CUENTAS_NIIF_NORMA PRIMARY KEY (CUEN_COD, NNIF_ID, NNID_ITEM);
ALTER TABLE CUENTAS_REPORTE_CERTDET ADD CONSTRAINT PK_CUENTAS_REPORTE_CERTDET PRIMARY KEY (CRCD_ITEM, CRCD_CUENTA);
ALTER TABLE DENOMINACIONES ADD CONSTRAINT PK_DENOMINACIONES PRIMARY KEY (DENO_ID);
ALTER TABLE DEPARTAMENTO ADD CONSTRAINT PK_DEPARTAMENTO PRIMARY KEY (DPTO_COD);
ALTER TABLE DEPOSITOS ADD CONSTRAINT PK_DEPOSITOS PRIMARY KEY (DETO_COD, TERC_NIT);
ALTER TABLE DEPRECIACION ADD CONSTRAINT PK_DEPRECIACION PRIMARY KEY (DEPR_ID);
ALTER TABLE DEPRECIACION_DETALLE ADD CONSTRAINT PK_DEPRECIACION_DETALLE PRIMARY KEY (DEPR_ID, DEPD_ITEM);
ALTER TABLE DEPRECIACION_UNIDADES ADD CONSTRAINT PK_DEPRECIACION_UNIDADES PRIMARY KEY (DEPR_ID, DEPU_ITEM);
ALTER TABLE DESCUENTOS_PRECIOS ADD CONSTRAINT PK_DESCUENTOS_PRECIOS PRIMARY KEY (DCTP_ID);
ALTER TABLE DESCUENTOS_PRECIOS_CLI ADD CONSTRAINT PK_DESCUENTOS_PRECIOS_CLI PRIMARY KEY (DCTP_ID, TERC_NIT, ARTI_COD);
ALTER TABLE DESCUENTOS_PRECIOS_DET ADD CONSTRAINT PK_DESCUENTOS_PRECIOS_DET PRIMARY KEY (DCTP_ID, DCPD_ITEM);
ALTER TABLE DESENSAMBLES ADD CONSTRAINT PK_DESENSAMBLES PRIMARY KEY (DESE_ID);
ALTER TABLE DESENSAMBLES_DETALLE ADD CONSTRAINT PK_DESENSAMBLES_DETALLE PRIMARY KEY (DESE_ID, DESE_ITEM);
ALTER TABLE DETERIORO_CARTERA_DET ADD CONSTRAINT PK_DETERIORO_CARTERA_DET PRIMARY KEY (DECA_ID, DECD_ITEM);
ALTER TABLE DETERIORO_CARTERA_ENC ADD CONSTRAINT PK_DETERIORO_CARTERA_ENC PRIMARY KEY (DECA_ID);
ALTER TABLE DEVOLUCIONES_COMPRAS ADD CONSTRAINT PK_DEVOLUCIONES_COMPRAS PRIMARY KEY (DVCO_ID);
ALTER TABLE DEVOLUCIONES_COMPRAS_DET ADD CONSTRAINT PK_DEVOLUCIONES_COMPRAS_DET PRIMARY KEY (DVCO_ID, DVCD_ITEM);
ALTER TABLE DEVOLUCIONES_VENTAS ADD CONSTRAINT PK_DEVOLUCIONES_VENTAS PRIMARY KEY (DEVT_ID);
ALTER TABLE DEVOLUCIONES_VENTAS_DETALLE ADD CONSTRAINT PK_DEVOLUCIONES_VENTAS_DETALLE PRIMARY KEY (DEVT_ID, DVDE_ITEM);
ALTER TABLE DEVOLUCIONES_VENTAS_DOCRELA ADD CONSTRAINT PK_DEVENTAS_DOCRELA PRIMARY KEY (DEVT_ID, DVDR_TIPOREL, DVDR_IDREL);
ALTER TABLE DEVOLUCION_CHEQUES ADD CONSTRAINT PK_DEVOLUCION_CHEQUES PRIMARY KEY (DVCH_ID);
ALTER TABLE DEVOLUCION_COMPRAS_DOCRELA ADD CONSTRAINT PK_DEVOLUCION_COMPRAS_DOCRELA PRIMARY KEY (DVCO_ID);
ALTER TABLE DOCUMENTOS_CONTA ADD CONSTRAINT PK_DOCUMENTOS_CONTA PRIMARY KEY (CUEN_COD, DOCO_ID);
ALTER TABLE DOCUMENTOS_ESTADO ADD CONSTRAINT PK_DOCUMENTOS_ESTADO PRIMARY KEY (DOES_ID);
ALTER TABLE DOCUMENTOS_IMPORT_EMPLEADO ADD CONSTRAINT PK_DOCUMENTOS_IMPORT_EMPLEADO PRIMARY KEY (TERC_NIT, DOEM_ITEM);
ALTER TABLE DOCUMENTOS_PAGO_CAJA ADD CONSTRAINT PK_DOCUMENTOS_PAGO_CAJA PRIMARY KEY (DPCA_ID);
ALTER TABLE EDUCACION_FORMAL_EMPLEADO ADD CONSTRAINT PK_EDUCACION_FORMAL_EMPLEADO PRIMARY KEY (TERC_NIT, EDFO_ITEM);
ALTER TABLE EGRESOS ADD CONSTRAINT PK_EGRESOS PRIMARY KEY (EGRE_ID);
ALTER TABLE EGRESOS_BANCO ADD CONSTRAINT PK_EGRESOS_BANCO PRIMARY KEY (EGRE_ID);
ALTER TABLE EGRESOS_CAJA ADD CONSTRAINT PK_EGRESOS_CAJA PRIMARY KEY (EGRE_ID, EGCA_ITEM);
ALTER TABLE EGRESOS_CONTABILIDAD ADD CONSTRAINT PK_EGRESOS_CONTABILIDAD PRIMARY KEY (EGRE_ID, EGCO_ITEM);
ALTER TABLE EGRESOS_CRUCEC ADD CONSTRAINT PK_EGRESOS_CRUCEC PRIMARY KEY (EGRE_ID, EGCC_ITEM);
ALTER TABLE EGRESOS_DETALLE ADD CONSTRAINT PK_EGRESOS_DETALLE PRIMARY KEY (EGRE_ID, EGDE_ITEM);
ALTER TABLE EGRESOS_NOMINA ADD CONSTRAINT PK_EGRESOS_NOMINA PRIMARY KEY (EGNO_IDCONS);
ALTER TABLE EMPAQUES ADD CONSTRAINT PK_EMPAQUES PRIMARY KEY (EMPQ_ID);
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 ENSAMBLES ADD CONSTRAINT PK_ENSAMBLES PRIMARY KEY (ENSA_ID);
ALTER TABLE ENSAMBLES_DETALLE ADD CONSTRAINT PK_ENSAMBLES_DETALLE PRIMARY KEY (ENSA_ID, ESDE_ITEM);
ALTER TABLE ENSAMBLE_MAQUINA ADD CONSTRAINT PK_ENSAMBLE_MAQUINA PRIMARY KEY (ENMA_ID);
ALTER TABLE ENSAMBLE_OPERARIO ADD CONSTRAINT PK_ENSAMBLE_OPERARIO PRIMARY KEY (ENOP_ID);
ALTER TABLE ENSAMBLE_TURNO ADD CONSTRAINT PK_ENSAMBLE_TURNO PRIMARY KEY (ENSA_TURNO);
ALTER TABLE ENTRADAS ADD CONSTRAINT PK_ENTRADAS PRIMARY KEY (ENTR_ID);
ALTER TABLE ENTRADAS_DETALLE ADD CONSTRAINT PK_ENTRADAS_DETALLE PRIMARY KEY (ENTR_ID, ENDE_ITEM);
ALTER TABLE ENTRADAS_SALIDAS_EMPLEADO ADD CONSTRAINT PK_INGRESOS_ENTRADAS_EMPLEADO PRIMARY KEY (INEN_ID);
ALTER TABLE ENTREGADORES ADD CONSTRAINT PK_ENTREGADORES PRIMARY KEY (ENTG_ID);
ALTER TABLE ENTREGA_DOCUMENTOS ADD CONSTRAINT PK_ENTREGA_DOCUMENTOS PRIMARY KEY (TIDO_COD, ENDO_IDDOC);
ALTER TABLE ENVIO_AUTO ADD CONSTRAINT PK_ENVIO_AUTO PRIMARY KEY (ENVA_ID);
ALTER TABLE ENVIO_ERRORES ADD CONSTRAINT PK_ENVIO_ERRORES PRIMARY KEY (ENER_ID, ENER_ITEM);
ALTER TABLE ENVIO_RESUMDIA ADD CONSTRAINT PK_ENVIO_RESUMDIA PRIMARY KEY (PTVT_ID, ENRE_FECHA, ENRE_HORA);
ALTER TABLE ERRORES ADD CONSTRAINT PK_ERRORES PRIMARY KEY (ERRO_ITEM);
ALTER TABLE ERRORES_ENVIO_CORREO ADD CONSTRAINT PK_ERRORES_ENVIO_CORREO PRIMARY KEY (TERC_NIT, FECHA);
ALTER TABLE ERRORES_LOTES ADD PRIMARY KEY (ID);
ALTER TABLE ESTADO_ARTICULO ADD CONSTRAINT PK_ESTADO_ARTICULO PRIMARY KEY (ESAR_COD);
ALTER TABLE ESTRUCTURA ADD CONSTRAINT PK_ESTRUCTURA PRIMARY KEY (ESTR_NIVEL);
ALTER TABLE EVENTOS_VENTAS ADD CONSTRAINT PK_EVENTOS_VENTAS PRIMARY KEY (EVVE_ID);
ALTER TABLE EVENTO_EXISTENCIAS ADD CONSTRAINT PK_EVENTO_EXISTENCIAS PRIMARY KEY (EVEX_ID, EVEN_ID, ARTI_COD);
ALTER TABLE EXISTENCIA ADD CONSTRAINT PK_EXISTENCIA PRIMARY KEY (ARTI_COD, BODE_COD, EXIS_FECHA)
USING DESCENDING INDEX PK_EXISTENCIA;
ALTER TABLE EXISTENCIAS_ARTICULO_WEB ADD CONSTRAINT PK_EXISTENCIAS_ARTICULO_WEB PRIMARY KEY (ARTICULO, BODEGA);
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;
ALTER TABLE EXISTENCIA_TERCERO ADD CONSTRAINT PK_EXISTENCIA_TERCERO PRIMARY KEY (ARTI_COD, TERC_NIT, CLSU_COD, EXTE_FECHA);
ALTER TABLE EXPERIENCIA_LABORAL_EMPLEADO ADD CONSTRAINT PK_EXPERIENCIA_LABORAL_EMPLEADO PRIMARY KEY (TERC_NIT, EXLA_ITEM);
ALTER TABLE FACTOR_COSTO ADD CONSTRAINT PK_FACTOR_COSTO PRIMARY KEY (FACO_FECINI);
ALTER TABLE FACTOR_INVENTARIO ADD CONSTRAINT PK_FACTOR_INV PRIMARY KEY (FAIN_FECINI);
ALTER TABLE FACTURAS ADD CONSTRAINT PK_FACTURAS PRIMARY KEY (FACT_ID);
ALTER TABLE FACTURAS_COMPRA ADD CONSTRAINT PK_FACTURAS_COMPRA PRIMARY KEY (FACO_ID);
ALTER TABLE FACTURAS_COMPRAS_DETALLE ADD CONSTRAINT PK_FACTURAS_COMPRAS_DETALLE PRIMARY KEY (FACO_ID, FCDE_ITEM);
ALTER TABLE FACTURAS_CONTADO ADD CONSTRAINT PK_FACTURAS_CONTADO PRIMARY KEY (FCNT_ID);
ALTER TABLE FACTURAS_CONTADO_DETALLE ADD CONSTRAINT PK_FACTURAS_CONTADO_DETALLE PRIMARY KEY (FCNT_ID, FCND_ITEM);
ALTER TABLE FACTURAS_CONTADO_PAGO ADD CONSTRAINT PK_FACTURAS_CONTADO_PAGO PRIMARY KEY (FCNT_ID, FCNP_ITEM);
ALTER TABLE FACTURAS_DETALLE ADD CONSTRAINT PK_FACTURAS_DETALLE PRIMARY KEY (FACT_ID, FADE_ITEM);
ALTER TABLE FACTURAS_MES ADD CONSTRAINT PK_FACTURAS_MES PRIMARY KEY (FAME_NIT, FAME_SUCURSAL, FAME_ANO, FAME_MES);
ALTER TABLE FACTURA_ALQUILER ADD CONSTRAINT PK_FACTURA_ALQUILER PRIMARY KEY (FAAL_CLIENTE, FAAL_SUCURSAL);
ALTER TABLE FACTURA_CONCEPTO ADD CONSTRAINT PK_FACTURA_CONCEPTO PRIMARY KEY (FACC_ID);
ALTER TABLE FACTURA_CONCEPTO_ITEMS ADD CONSTRAINT PK_FACTURA_CONCEPTO_ITEMS PRIMARY KEY (FACC_ID, FACI_ITEM);
ALTER TABLE FACTURA_EMBALAJE ADD CONSTRAINT PK_FACTURA_EMBALAJE PRIMARY KEY (FACT_ID, TIEM_COD);
ALTER TABLE FACTURA_PROFORMA ADD CONSTRAINT PK_FACTURA_PROFORMA PRIMARY KEY (FAPO_ID);
ALTER TABLE FACTURA_PROFORMA_DET ADD CONSTRAINT PK_FACTURA_PROFORMA_DET PRIMARY KEY (FAPO_ID, FPDE_ITEM);
ALTER TABLE FACTURA_PROFORMA_GASTOS ADD CONSTRAINT PK_FACTURA_PROFORMA_GASTOS PRIMARY KEY (FAPO_ID, FPGA_ITEM);
ALTER TABLE FACTURA_WEB ADD CONSTRAINT PK_FACTURA_WEB PRIMARY KEY (FACW_ID);
ALTER TABLE FACTURA_WEB_DETALLE ADD CONSTRAINT PK_FACTURA_WEB_DETALLE PRIMARY KEY (FACW_ID, FAWD_ITEM);
ALTER TABLE FODO_SOL_PENSIONAL ADD CONSTRAINT PK_FODO_SOL_PENSIONAL PRIMARY KEY (FSPE_ITEM);
ALTER TABLE FORMAS_PAGO ADD CONSTRAINT PK_FORMAS_PAGO PRIMARY KEY (FOPA_ID);
ALTER TABLE FORMATOCONTABLE_DETALLE ADD CONSTRAINT PK_FORMATOCONTABLE_DETALLE PRIMARY KEY (FOCO_ID, FOCD_ITEM);
ALTER TABLE FORMATOCONTABLE_TEXTOS ADD CONSTRAINT PK_FORMATOCONTABLE_TEXTOS PRIMARY KEY (FOCO_ID, FOCD_ITEM);
ALTER TABLE FORMATOS ADD CONSTRAINT PK_FORMATOS PRIMARY KEY (TIDO_COD, PREF_PRE);
ALTER TABLE FORMATOS_CONTABLES ADD CONSTRAINT PK_FORMATOS_CONTABLES PRIMARY KEY (FOCO_ID);
ALTER TABLE FORMATO_DATOS ADD CONSTRAINT PK_FORMATO_DATOS PRIMARY KEY (TIDO_COD, PREF_PRE, DAFO_ITEM);
ALTER TABLE FORMATO_LINEAS ADD CONSTRAINT PK_FORMATO_LINEAS PRIMARY KEY (TIDO_COD, PREF_PRE, FOLI_ITEM);
ALTER TABLE FORMA_PAGOS ADD CONSTRAINT PK_FORMA_PAGOS PRIMARY KEY (FOPA_COD);
ALTER TABLE FORMA_PAGO_REMESA ADD CONSTRAINT PK_FORMA_PAGO_REMESA PRIMARY KEY (FPRM_COD);
ALTER TABLE FOTOS_ARTICULO ADD CONSTRAINT PK_FOTOS_ARTICULO PRIMARY KEY (ARTI_COD, FTAR_ITEM);
ALTER TABLE GASTOS_IMPORTACION ADD CONSTRAINT PK_GASTOS_IMPORTACION PRIMARY KEY (GAIN_ID);
ALTER TABLE GRUPO ADD CONSTRAINT PK_GRUPO PRIMARY KEY (GRUP_COD);
ALTER TABLE GRUPOS_PROVEEDORES ADD CONSTRAINT PK_GRUPOS_PROVEEDORES PRIMARY KEY (GRPR_COD);
ALTER TABLE GRUPO_CARTERA ADD CONSTRAINT PK_GRUPO_CARTERA PRIMARY KEY (GRCA_COD);
ALTER TABLE GRUPO_VENDEDOR ADD CONSTRAINT PK_GRUPO_VENDEDOR PRIMARY KEY (GRVR_COD);
ALTER TABLE HEMOLIFE_CLIENTES ADD CONSTRAINT PK_HEMOLIFE_CLIENTES PRIMARY KEY (HECL_NOMBRE);
ALTER TABLE HEMOLIFE_ENSAMBLES ADD CONSTRAINT PK_HEMOLIFE_ENSAMBLES PRIMARY KEY (HEEN_ID);
ALTER TABLE HEMOLIFE_EQUIVALENCIAS ADD CONSTRAINT PK_HEMOLIFE_EQUIVALENCIAS PRIMARY KEY (ARTI_COD);
ALTER TABLE HEMOLIFE_REMISIONES ADD CONSTRAINT PK_HEMOLIFE_REMISIONES PRIMARY KEY (HERE_ID, HERE_ITEM);
ALTER TABLE HISTORICO_VENTAS ADD CONSTRAINT PK_HISTORICO_VENTAS PRIMARY KEY (HIVE_ANO, HIVE_MES, SUCU_ID);
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, HOEM_DIA);
ALTER TABLE IMPORTACION ADD CONSTRAINT PK_IMPORTACION PRIMARY KEY (IMPO_ID);
ALTER TABLE IMPORTACION_INVENTARIO ADD CONSTRAINT PK_IMPORTACION_INVENTARIO PRIMARY KEY (IMIN_TIPO, IMIN_DATO);
ALTER TABLE IMPORTACION_LIQUIDACION ADD CONSTRAINT PK_IMPORTACION_LIQUIDACION PRIMARY KEY (IMPO_ID, IMLI_ITEM);
ALTER TABLE INCAPACIDADES ADD CONSTRAINT PK_INCAPACIDADES PRIMARY KEY (TERC_NIT, INCA_ID);
ALTER TABLE INGRESOS_EMPLEADO ADD CONSTRAINT PK_INGRESOS_EMPLEADO PRIMARY KEY (TERC_NIT, INEM_FECHA, INEM_INGRESO);
ALTER TABLE INTERFAZ_BANCOS ADD CONSTRAINT PK_INTERFAZ_BANCOS PRIMARY KEY (INBA_ID);
ALTER TABLE INTERFAZ_BANCOS_CTAS ADD CONSTRAINT PK_INTERFAZ_BANCOS_CTAS PRIMARY KEY (INBA_ID, INBC_ITEM);
ALTER TABLE INTERFAZ_BANCOS_NIIF ADD CONSTRAINT PK_INTERFAZ_BANCOS_N PRIMARY KEY (INBA_ID);
ALTER TABLE INTERFAZ_CAJA ADD CONSTRAINT PK_INTERFAZ_CAJA PRIMARY KEY (INCJ_ID);
ALTER TABLE INTERFAZ_CAJA_CTAS ADD CONSTRAINT PK_INTERFAZ_CAJA_CTAS PRIMARY KEY (INCJ_ID, INJC_ITEM);
ALTER TABLE INTERFAZ_CAJA_NIIF ADD CONSTRAINT PK_INTERFAZ_CAJA_N PRIMARY KEY (INCJ_ID);
ALTER TABLE INTERFAZ_CARTERA ADD CONSTRAINT PK_INTERFAZ_CARTERA PRIMARY KEY (INCA_ID);
ALTER TABLE INTERFAZ_CARTERA_CTAS ADD CONSTRAINT PK_INTERFAZ_CARTERA_CTAS PRIMARY KEY (INCA_ID, INCD_ITEM);
ALTER TABLE INTERFAZ_CARTERA_NIIF ADD CONSTRAINT PK_INTERFAZ_CARTERA_N PRIMARY KEY (INCA_ID);
ALTER TABLE INTERFAZ_COMPRAS ADD CONSTRAINT PK_INTERFAZ_COMPRAS PRIMARY KEY (INCO_ID);
ALTER TABLE INTERFAZ_COMPRAS_CTAS ADD CONSTRAINT PK_INTERCOMPRAS_CTAS PRIMARY KEY (INCO_ID, INCC_ITEM);
ALTER TABLE INTERFAZ_COMPRAS_NIIF ADD CONSTRAINT PK_INTERFAZ_COMPRAS_N PRIMARY KEY (INCO_ID);
ALTER TABLE INTERFAZ_CXPAGAR ADD CONSTRAINT PK_INTERFAZ_CXPAGAR PRIMARY KEY (INCP_ID);
ALTER TABLE INTERFAZ_CXPAGAR_CTAS ADD CONSTRAINT PK_INTERFAZ_CXPAGAR_CTAS PRIMARY KEY (INCP_ID, INPC_ITEM);
ALTER TABLE INTERFAZ_CXPAGAR_NIIF ADD CONSTRAINT PK_INTERFAZ_CXPAGAR_N PRIMARY KEY (INCP_ID);
ALTER TABLE INTERFAZ_INVENTARIO ADD CONSTRAINT PK_INTERINVEN PRIMARY KEY (ININ_ID);
ALTER TABLE INTERFAZ_INVENTARIO_CTAS ADD CONSTRAINT PK_INTERINVEN_CTAS PRIMARY KEY (ININ_ID, INIC_ITEM);
ALTER TABLE INTERFAZ_INVENTARIO_NIIF ADD CONSTRAINT PK_INTERINVEN_N PRIMARY KEY (ININ_ID);
ALTER TABLE INTERFAZ_NOMINA ADD CONSTRAINT PK_INTERFAZ_NOMINA PRIMARY KEY (INNO_ID);
ALTER TABLE INTERFAZ_TRANSPORTE ADD CONSTRAINT PK_INTERFAZ_TRANSPORTE PRIMARY KEY (INTR_ID);
ALTER TABLE INTERFAZ_TRANSPORTE_CTAS ADD CONSTRAINT PK_INTERFAZ_TRANSPORTE_CTAS PRIMARY KEY (INTR_ID, INTC_ITEM);
ALTER TABLE INTERFAZ_VENTAS ADD CONSTRAINT PK_INTERFAZ_VENTAS PRIMARY KEY (INVE_ID);
ALTER TABLE INTERFAZ_VENTAS_CTAS ADD CONSTRAINT PK_INTERVENTAS_CTAS PRIMARY KEY (INVE_ID, INVC_ITEM);
ALTER TABLE INTERFAZ_VENTAS_NIIF ADD CONSTRAINT PK_INTERFAZ_VENTAS_N PRIMARY KEY (INVE_ID);
ALTER TABLE LIQUIDACION ADD CONSTRAINT PK_LIQUIDACION PRIMARY KEY (TERC_NIT, LIQD_ID);
ALTER TABLE LIQUIDACION_RUTA_COLEGIO ADD CONSTRAINT PK_LIQUIDACION_RUTA_COLEGIO PRIMARY KEY (LIQR_ID);
ALTER TABLE LIQUIDACION_RUTA_CONC ADD CONSTRAINT PK_LIQUIDACION_RUTA_CONC PRIMARY KEY (LIQR_ID, LIQC_ITEM);
ALTER TABLE LIQUIDACION_RUTA_DET ADD CONSTRAINT PK_LIQUIDACION_RUTA_DET PRIMARY KEY (LIQR_ID, LIQD_ITEM);
ALTER TABLE LIQUIDACION_RUTA_EFE ADD CONSTRAINT PK_LIQUIDACION_RUTA_EFE PRIMARY KEY (LIQR_ID, LIQE_ITEM);
ALTER TABLE LISTAPREC_VENDEDOR ADD CONSTRAINT PK_LISTAPREC_VENDEDOR PRIMARY KEY (VEND_COD, LIPR_COD);
ALTER TABLE LISTAPRE_USUARIOS ADD CONSTRAINT PK_LISTAPRE_USUARIOS PRIMARY KEY (LIPR_COD, USER_COD);
ALTER TABLE LISTAS_VENDEDOR ADD CONSTRAINT PK_LISTAS_VENDEDOR PRIMARY KEY (LIVE_ID);
ALTER TABLE LISTA_ARTICULOS ADD CONSTRAINT PK_LISTA_ARTICULOS PRIMARY KEY (LIAR_ID);
ALTER TABLE LISTA_ARTICULOS_DET ADD CONSTRAINT PK_LISTA_ARTICULOS_DET PRIMARY KEY (LIAR_ID, ARTI_COD);
ALTER TABLE LISTA_PRECIOS ADD CONSTRAINT PK_LISTA_PRECIOS PRIMARY KEY (LIPR_COD);
ALTER TABLE LLAMADOS_ATENCION ADD CONSTRAINT PK_LLAMADOS_ATENCION PRIMARY KEY (LLAT_COD);
ALTER TABLE LOTES ADD CONSTRAINT PK_LOTES PRIMARY KEY (ARTI_COD, BODE_COD, LOTE_NRO);
ALTER TABLE LUGAR_INSPECCION ADD PRIMARY KEY (LUIN_COD);
ALTER TABLE MANIFIESTOS_CARGA_CONC ADD CONSTRAINT PK_MANIFIESTOS_CARGA_CONC PRIMARY KEY (MANC_ID, MNCC_ITEM);
ALTER TABLE MANIFIESTO_CARGA ADD CONSTRAINT PK_MANIFIESTO_CARGA PRIMARY KEY (MANC_ID);
ALTER TABLE MANIFIESTO_CARGA_DET ADD CONSTRAINT PK_MANIFIESTO_CARGA_DET PRIMARY KEY (MANC_ID, MNCD_ITEM);
ALTER TABLE MARCAS ADD CONSTRAINT PK_MARCAS PRIMARY KEY (MARC_COD);
ALTER TABLE MEDIOSMAG_ARCHIVOS ADD CONSTRAINT PK_MEDIOSMAG_ARCHIVOS PRIMARY KEY (MEDM_FORMATO);
ALTER TABLE MEDIOSMAG_ARCHIVOS2014 ADD CONSTRAINT PK_MEDIOSMAG_ARCHIVOS2014 PRIMARY KEY (MM14_ID);
ALTER TABLE MEDIOSMAG_CUENTAS ADD CONSTRAINT PK_MEDIOSMAG_CUENTAS PRIMARY KEY (MMCU_ITEM, MMCU_CONS);
ALTER TABLE MEDIOSMAG_DISTRITALES ADD CONSTRAINT PK_MEDIOSMAG_DISTRITALES PRIMARY KEY (MMDI_ARTICULO, MMDI_ANO);
ALTER TABLE MEDIOSMAG_DISTR_CUENTAS ADD CONSTRAINT PK_MEDIOSMAG_DISTR_CUENTAS PRIMARY KEY (MMDI_ARTICULO, MMDI_ANO, MMDC_ITEM);
ALTER TABLE MEDIOSMAG_DISTR_DATOS ADD CONSTRAINT PK_MEDIOSMAG_DISTR_DATOS PRIMARY KEY (MMDI_ARTICULO, MMDI_ANO, MMDD_ITEM);
ALTER TABLE MEDIOS_MAGNETICOS_DATOS ADD CONSTRAINT PK_MEDIOS_MAGNETICOS_DATOS PRIMARY KEY (MEMG_FORMATO, MEMG_ANO, MEMG_ITEM);
ALTER TABLE MEDIOS_TRANSPORTE ADD CONSTRAINT PK_MEDIOS_TRANSPORTE PRIMARY KEY (META_COD);
ALTER TABLE MENSAJERIA ADD CONSTRAINT PK_MENSAJERIA PRIMARY KEY (MENS_ID);
ALTER TABLE MODO_TRANSPORTE ADD CONSTRAINT PK_MODO_TRANSPORTE PRIMARY KEY (MOTA_COD);
ALTER TABLE MODULOS ADD CONSTRAINT PK_MODULOS PRIMARY KEY (PROG_ID, MODU_ID);
ALTER TABLE MOVIMIENTO_ARTICULO ADD CONSTRAINT PK_MOVIMIENTO_ARTICULO PRIMARY KEY (ARTI_COD, MVAR_CONS);
ALTER TABLE MOVIMIENTO_BANCO ADD CONSTRAINT PK_MOVIMIENTO_BANCO PRIMARY KEY (MOBA_ID);
ALTER TABLE MOVIMIENTO_CAJA ADD CONSTRAINT PK_MOVIMIENTO_CAJA PRIMARY KEY (MOCA_ID);
ALTER TABLE MOVIMIENTO_CARGO_EMPLEADO ADD CONSTRAINT PK_MOVIMIENTO_CARGO_EMPLEADO PRIMARY KEY (MVCE_ID);
ALTER TABLE MOVIMIENTO_CLIENTES ADD CONSTRAINT PK_MOVIMIENTO_CLIENTES PRIMARY KEY (MVCL_ID);
ALTER TABLE MOVIMIENTO_PROVEEDOR ADD CONSTRAINT PK_MOVIMIENTO_PROVEEDOR PRIMARY KEY (MVPR_ID);
ALTER TABLE MOVIMIENTO_SALARIO_EMPLEADO ADD CONSTRAINT PK_MOVIMIENTO_SALARIO_EMPLEADO PRIMARY KEY (MVSE_ID);
ALTER TABLE MOVIMIENTO_VINCUL_EMPLEADO ADD CONSTRAINT PK_MOVIMIENTO_VINCUL_EMPLEADO PRIMARY KEY (MVVE_ID);
ALTER TABLE NIVEL_FORMACION ADD CONSTRAINT PK_NIVEL_FORMACION PRIMARY KEY (NIVI_COD);
ALTER TABLE NOMBRES_COPIAS ADD CONSTRAINT PK_NOMBRES_COPIAS PRIMARY KEY (NOCO_ID);
ALTER TABLE NOMINA ADD CONSTRAINT PK_NOMINA PRIMARY KEY (NOMI_ID);
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);
ALTER TABLE NOMINA_COMISIONES ADD CONSTRAINT PK_NOMINA_COMISIONES PRIMARY KEY (NCOM_ID, NCOM_ITEM);
ALTER TABLE NOMINA_COMISIONES_PROV ADD CONSTRAINT PK_NOMINA_COMISIONES_PROV PRIMARY KEY (NCOP_ID, NCOP_ITEM);
ALTER TABLE NOMINA_CONCEPTOS ADD CONSTRAINT PK_NOMINA_CONCEPTOS_NOMI_ID PRIMARY KEY (NOCO_ITEM, NOMI_ID);
ALTER TABLE NOMINA_CONCEPTOS_PROV ADD CONSTRAINT PK_NOMINACONCEPTOSPROV_NOPO_ID PRIMARY KEY (NCOP_ITEM, NOPO_ID);
ALTER TABLE NOMINA_DEPARTAMENTO ADD CONSTRAINT PK_NOMINA_DEPARTAMENTO PRIMARY KEY (NOMI_ID, NODP_DEPTO);
ALTER TABLE NOMINA_DETALLE ADD CONSTRAINT PK_NOMINA_DETALLE PRIMARY KEY (NOMI_ID, TERC_NIT);
ALTER TABLE NOMINA_DETALLE_PROV ADD CONSTRAINT PK_NOMINA_DETALLE_PROV PRIMARY KEY (NOPO_ID, TERC_NIT);
ALTER TABLE NOMINA_HORASEXT ADD CONSTRAINT PK_NOMINA_HORASEXT PRIMARY KEY (TERC_NIT, NOEX_ANO, NOEX_PERIODIO);
ALTER TABLE NOMINA_NOVEDADES ADD CONSTRAINT PK_NOMINA_NOVEDADES PRIMARY KEY (NONO_ID);
ALTER TABLE NOMINA_NOVEDADES_DETALLE ADD CONSTRAINT PK_NOMINA_NOVEDADES_DETALLE PRIMARY KEY (NONO_ID, NNDE_ITEM);
ALTER TABLE NOMINA_PROV ADD CONSTRAINT PK_NOMINA_PROV PRIMARY KEY (NOPO_ID);
ALTER TABLE NOMINA_SALDINI ADD CONSTRAINT PK_NOMINA_SALDINI PRIMARY KEY (TERC_NIT);
ALTER TABLE NOMINA_UGPP_MESES ADD CONSTRAINT PK_NOMINA_UGPP_MESES PRIMARY KEY (NUGM_ID);
ALTER TABLE NOMINA_VALOR_PREDET ADD CONSTRAINT PK_NOMINA_VALPREDET PRIMARY KEY (NVPR_ID, NVPR_ITEM);
ALTER TABLE NORMAS_NIIF ADD CONSTRAINT PK_NORMAS_NIIF PRIMARY KEY (NNIF_ID);
ALTER TABLE NORMAS_NIIF_DETALLE ADD CONSTRAINT PK_NORMAS_NIIF_DETALLE PRIMARY KEY (NNIF_ID, NNID_ITEM);
ALTER TABLE NOTAS_CLIENTES ADD CONSTRAINT PK_NOTAS_CLIENTES PRIMARY KEY (NOCL_ID);
ALTER TABLE NOTAS_CREDITO ADD CONSTRAINT PK_NOTAS_CREDITO PRIMARY KEY (NCBC_ID);
ALTER TABLE NOTAS_CREDITO_CLIENTES ADD CONSTRAINT PK_NOTAS_CREDITO_CLIENTES PRIMARY KEY (NCCL_ID);
ALTER TABLE NOTAS_CREDITO_PROVEEDOR ADD CONSTRAINT PK_NOTAS_CREDITO_PROVEEDOR PRIMARY KEY (NCPR_ID);
ALTER TABLE NOTAS_DEBITO ADD CONSTRAINT PK_NOTAS_DEBITO PRIMARY KEY (NDBC_ID);
ALTER TABLE NOTAS_DEBITO_CLIENTES ADD CONSTRAINT PK_NOTAS_DEBITO_CLIENTES PRIMARY KEY (NDCL_ID);
ALTER TABLE NOTAS_DEBITO_PROVEEDOR ADD CONSTRAINT PK_NOTAS_DEBITO_PROVEEDOR PRIMARY KEY (NDPR_ID);
ALTER TABLE NOTAS_DOCUMENTO ADD CONSTRAINT PK_NOTAS_DOCUMENTO PRIMARY KEY (NODO_ID);
ALTER TABLE NOTAS_ESTADOS_FINANCIEROS ADD CONSTRAINT PK_NOTAS_ESTADOS_FINANCIEROS PRIMARY KEY (NOEF_ID);
ALTER TABLE NOTA_CREDITO_PROV_DET ADD CONSTRAINT PK_NOTA_CREDITO_PROV_DET PRIMARY KEY (NCPR_ID, NCPD_ITEM);
ALTER TABLE NOTA_DEBITO_PROV_DET ADD CONSTRAINT PK_NOTA_DEBITO_PROV_DET PRIMARY KEY (NDPR_ID, NDPD_ITEM);
ALTER TABLE NUMERO_COPIA ADD CONSTRAINT PK_NUMERO_COPIA PRIMARY KEY (TIDO_COD, NUCO_ID);
ALTER TABLE OPCIONES ADD CONSTRAINT PK_OPCIONES PRIMARY KEY (PROG_ID, MODU_ID, OPCI_ID);
ALTER TABLE ORDENES_COMPRA ADD CONSTRAINT PK_ORDENES_COMPRA PRIMARY KEY (ORDC_ID);
ALTER TABLE ORDENES_COMPRA_DETALLE ADD CONSTRAINT PK_ORDENES_COMPRA_DETALLE PRIMARY KEY (ORDC_ID, OCDE_ITEM);
ALTER TABLE ORDENES_COMPRA_DOCRELA ADD CONSTRAINT PK_ORDENES_COMPRA_DOCRELA PRIMARY KEY (ORDC_ID, ORCD_TIPOREL, ORCD_IDREL);
ALTER TABLE ORDENES_INVENTARIO ADD CONSTRAINT PK_ORDENES_INVENTARIO PRIMARY KEY (ORIN_ID);
ALTER TABLE ORDENINVENTARIO_DETALLE ADD CONSTRAINT PK_ORDENINVENTARIO_DETALLE PRIMARY KEY (ORIN_ID, ORID_ITEM);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT PK_ORDEN_EMBARQUE PRIMARY KEY (SLIM_ID, OREM_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_APORTES_EMPLEADOS ADD CONSTRAINT PK_PAGO_APORTES_EMPLEADOS PRIMARY KEY (PGAP_ID, TERC_NIT);
ALTER TABLE PAGO_APORTES_NOM ADD CONSTRAINT PK_PAGO_APORTES_NOM PRIMARY KEY (PGAP_ID, PGAP_IDNOM);
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 PAGO_NOMINA_EGRESOS ADD CONSTRAINT PK_PAGO_NOMINA_EGRESOS PRIMARY KEY (PGNO_ID, PGNE_ITEM);
ALTER TABLE PAISES ADD CONSTRAINT PK_PAISES PRIMARY KEY (PAIS_ID);
ALTER TABLE PARAMETROS_ANO ADD CONSTRAINT PK_PARAMETROS_ANO PRIMARY KEY (PAAN_ANO)
USING INDEX PK_ANO;
ALTER TABLE PARAMETROS_CONTABLES ADD CONSTRAINT PK_PARAMETROS_CONTABLES PRIMARY KEY (PACO_ID);
ALTER TABLE PARQUEADERO ADD CONSTRAINT PK_PARQUEADERO PRIMARY KEY (PARQ_ID);
ALTER TABLE PEDIDOS ADD CONSTRAINT PK_PEDIDOS PRIMARY KEY (PEDI_ID);
ALTER TABLE PEDIDOS_DETALLE ADD CONSTRAINT PK_PEDIDOS_DETALLE PRIMARY KEY (PEDI_ID, PEDE_ITEM);
ALTER TABLE PEDIDOS_DOCRELA ADD CONSTRAINT PK_PEDIDOS_DOCRELA PRIMARY KEY (PEDI_ID, PEDR_TIPOREL, PEDR_IDREL);
ALTER TABLE PEDIDO_WEB ADD CONSTRAINT PK_PEDIDO_WEB PRIMARY KEY (PEWE_ID);
ALTER TABLE PEDIDO_WEB_DETALLE ADD CONSTRAINT PK_PEDIDO_WEB_DETALLE PRIMARY KEY (PEWE_ID, PEWD_ITEM);
ALTER TABLE PENDIENTE_VENTAS ADD CONSTRAINT PK_PENDIENTE_VENTAS PRIMARY KEY (PEND_ID);
ALTER TABLE PENDIENTE_VENTAS_DETALLE ADD CONSTRAINT PK_PENDIENTE_VENTAS_DETALLE PRIMARY KEY (PEND_ID, PEVD_ITEM);
ALTER TABLE PERFIL_EMPLEADO ADD CONSTRAINT PK_PERFIL_EMPLEADO PRIMARY KEY (PEEM_ID);
ALTER TABLE PERFIL_EMPLEADO_DETALLE ADD CONSTRAINT PK_PERFIL_EMPLEADO_DETALLE PRIMARY KEY (PEEM_ID, CONC_COD);
ALTER TABLE PERIODO_PAGO ADD CONSTRAINT PK_PERIODO_PAGO PRIMARY KEY (PPAG_COD);
ALTER TABLE PERIODO_PAGO_NOMBRE ADD CONSTRAINT PK_PERIODO_PAGO_NOMBRE PRIMARY KEY (PPAG_COD, PNOM_ITEM);
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_PASAJEROS ADD CONSTRAINT PK_PLANILLA_PASAJEROS PRIMARY KEY (PLPA_ID);
ALTER TABLE PLANILLA_PASAJEROS_CON ADD CONSTRAINT PK_PLANILLA_PASAJEROS_CON PRIMARY KEY (PLPA_ID, PLPC_ITEM);
ALTER TABLE PLANILLA_PASAJEROS_DET ADD CONSTRAINT PK_PLANILLA_PASAJEROS_DET PRIMARY KEY (PLPA_ID, PLPA_ITEM);
ALTER TABLE PLANILLA_PASAJEROS_REM ADD CONSTRAINT PK_PLANILLA_PASAJEROS_REM PRIMARY KEY (PLPA_ID, PLPA_ITEM);
ALTER TABLE PLANTILLA_DETALLE ADD CONSTRAINT PK_PLANTILLA_DETALLE PRIMARY KEY (PLAN_ID, PLDE_ITEM);
ALTER TABLE PLANTILLA_DETALLE_NIIF ADD CONSTRAINT PK_PLANTILLA_DETALLE_N PRIMARY KEY (PLAN_ID, PLDE_ITEM);
ALTER TABLE PLANTILLA_ENCABEZADO ADD CONSTRAINT PK_PLANTILLA_ENCABEZADO PRIMARY KEY (PLAN_ID);
ALTER TABLE PLAN_PRODUCCION ADD CONSTRAINT PK_PLAN_PRODUCCION PRIMARY KEY (PLPR_ID);
ALTER TABLE PLAN_PRODUCCION_CONS ADD CONSTRAINT PK_PLAN_PRODUCCION_CONS PRIMARY KEY (PLPD_ID, PLPC_ITEM);
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_DET ADD CONSTRAINT PK_PLAN_PRODUCCION_DET PRIMARY KEY (PLPR_ID, PLPD_ITEM);
ALTER TABLE PLAN_PRODUCCION_PRODUCTOS ADD CONSTRAINT PK_PLAN_PRODUCCION_PRODUCTOS PRIMARY KEY (PLPR_ID, PLPD_ITEM, PLPP_NROCMOP);
ALTER TABLE PRECIOS_ARTICULO ADD CONSTRAINT PK_PRECIOS_ARTICULO PRIMARY KEY (LIPR_COD, ARTI_COD);
ALTER TABLE PREFIJOS ADD CONSTRAINT PK_PREFIJOS PRIMARY KEY (TIDO_COD, PREF_PRE);
ALTER TABLE PREFIJOS_BANCOS ADD CONSTRAINT PK_PREFIJOS_BANCOS PRIMARY KEY (TIDO_COD, CUBA_COD, PRBA_PREF);
ALTER TABLE PREFIJOS_CONTA ADD CONSTRAINT PK_PREFIJOS_CONTA PRIMARY KEY (TICO_COD, PRCO_PREF);
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 PRESUPUESTO ADD CONSTRAINT PK_PRESUPUESTO PRIMARY KEY (CUEN_COD, PRES_ANO, PRES_PERIODO);
ALTER TABLE PRESUPUESTO_VENTAS ADD CONSTRAINT PK_PRESUPUESTO_VENTAS PRIMARY KEY (VEND_COD, PRVE_ANO, PRVE_MES);
ALTER TABLE PRESUPUESTO_VENTAS_GRUPO ADD CONSTRAINT PK_PRESUPUESTO_VENTAS_GRUPO PRIMARY KEY (VEND_COD, GRUP_COD, SUBG_COD, PRVG_ANO, PRVG_MES);
ALTER TABLE PRESUPUESTO_VENTAS_MESES ADD CONSTRAINT PK_PRESUPUESTO_VENTAS_MESES PRIMARY KEY (PRVM_ANO, PRVM_MES);
ALTER TABLE PROCEDIMIENTOS_USUARIO ADD CONSTRAINT PK_PROCEDIMIENTOS_USUARIO PRIMARY KEY (PRUS_COD);
ALTER TABLE PRODUCCION_DEVOLUCION ADD CONSTRAINT PK_PRODUCCION_DEVOLUCION PRIMARY KEY (PRDD_ID);
ALTER TABLE PRODUCCION_DEVOLUCION_DET ADD CONSTRAINT PK_PRODUCCION_DEVOLUCION_DET PRIMARY KEY (PRDD_ID, PRDD_ITEM);
ALTER TABLE PRODUCCION_ENTRADA_DET ADD CONSTRAINT PK_PRODUCCION_ENTRADA PRIMARY KEY (PRDE_ID, PREN_ITEM);
ALTER TABLE PRODUCCION_ENTRADA_ENC ADD CONSTRAINT PK_PRODUCCION_ENTRADA_ENC PRIMARY KEY (PRDE_ID);
ALTER TABLE PRODUCCION_MONTAJE ADD CONSTRAINT PK_PRODUCCION_MONTAJE PRIMARY KEY (PROR_ID, PRMO_ITEM);
ALTER TABLE PRODUCCION_ORDEN ADD CONSTRAINT PK_PRODUCCION_ORDEN PRIMARY KEY (PROR_ID);
ALTER TABLE PRODUCCION_ORDEN_DETALLE ADD CONSTRAINT PK_PRODUCCION_ORDEN_DETALLE PRIMARY KEY (PROR_ID, PODE_ITEM);
ALTER TABLE PRODUCCION_SALIDA_DET ADD CONSTRAINT PK_PRODUCCION_SALIDA_DET PRIMARY KEY (PRSA_ID, PRSA_ITEM);
ALTER TABLE PRODUCCION_SALIDA_ENC ADD CONSTRAINT PK_PRODUCCION_SALIDA_ENC PRIMARY KEY (PRSA_ID);
ALTER TABLE PRODUCTO_MONTAJE ADD CONSTRAINT PK_PRODUCTO_MONTAJE PRIMARY KEY (ARTI_COD, PRMO_ITEM);
ALTER TABLE PROGRAMACION_PAGOS ADD CONSTRAINT PK_PROGRAMACION_PAGOS PRIMARY KEY (PRPG_FECHA, PRPG_TIPODOC, PRPG_IDDOC);
ALTER TABLE PROGRAMAS ADD CONSTRAINT PK_PROGRAMAS PRIMARY KEY (PROG_ID);
ALTER TABLE PROGRAM_VACACIONES ADD CONSTRAINT PK_PROGRAM_VACACIONES PRIMARY KEY (PRVA_ITEM);
ALTER TABLE PROMEDIO_SALIDAS ADD CONSTRAINT PK_PROMEDIO_SALIDAS PRIMARY KEY (ARTI_COD, BODE_COD, PRSA_FECHA)
USING DESCENDING INDEX PK_PROMEDIO_SALIDAS;
ALTER TABLE PROVEEDORES ADD CONSTRAINT PK_PROVEEDORES PRIMARY KEY (TERC_NIT);
ALTER TABLE PROVEEDOR_ARTICULO ADD CONSTRAINT PK_PROVEEDOR_ARTICULO PRIMARY KEY (TERC_NIT, ARTI_COD);
ALTER TABLE PROVISION_CARTERA ADD CONSTRAINT PK_PROVISION_CARTERA PRIMARY KEY (PRCA_ITEM);
ALTER TABLE PROYECTOS ADD CONSTRAINT PK_PROYECTOS PRIMARY KEY (PROY_COD);
ALTER TABLE PUC ADD CONSTRAINT PK_PUC PRIMARY KEY (TIPU_COD, PUC_COD);
ALTER TABLE PUESTOS ADD CONSTRAINT PK_PUESTOS PRIMARY KEY (PUES_COD);
ALTER TABLE PUNTOS_ARTICULOS ADD CONSTRAINT PK_PUNTOS_ARTICULOS PRIMARY KEY (PTAR_COD);
ALTER TABLE PUNTOS_CLIENTE ADD CONSTRAINT PK_PUNTOS_CLIENTE PRIMARY KEY (PTCL_ID);
ALTER TABLE PUNTOS_CLIENTE_ACUMULADO ADD CONSTRAINT PK_PUNTOS_CLIENTE_ACUMULADO PRIMARY KEY (TERC_NIT, PTCA_FECHA);
ALTER TABLE PUNTOS_DIASESPECIAL ADD CONSTRAINT PK_PUNTOS_DIASESPECIAL PRIMARY KEY (PTDE_ID);
ALTER TABLE PUNTOS_PREMIOS ADD CONSTRAINT PK_PUNTOS_PREMIOS PRIMARY KEY (PTPR_COD);
ALTER TABLE PUNTOS_REDENCION ADD CONSTRAINT PK_PUNTOS_REDENCION PRIMARY KEY (PTRE_ID);
ALTER TABLE PUNTOS_VENDEDOR ADD CONSTRAINT PK_PUNTOS_VENDEDOR PRIMARY KEY (PTVT_ID);
ALTER TABLE PUNTOS_VEND_REDENCION ADD CONSTRAINT PK_PUNTOS_VEND_REDENCION PRIMARY KEY (PTVR_ID);
ALTER TABLE PUNTO_VENTA ADD CONSTRAINT PK_PUNTO_VENTA PRIMARY KEY (PTVT_ID);
ALTER TABLE RECAUDO ADD CONSTRAINT PK_RECAUDO PRIMARY KEY (RECR_ID);
ALTER TABLE RECIBOS_CAJA ADD CONSTRAINT PK_RECIBOS_CAJA PRIMARY KEY (RECA_ID);
ALTER TABLE RECIBOS_CAJA_CRUCEC ADD CONSTRAINT PK_RECIBOS_CAJA_CRUCEC PRIMARY KEY (RECA_ID, RCCR_ITEM);
ALTER TABLE RECIBOS_CAJA_DETALLE ADD CONSTRAINT PK_RECIBOS_CAJA_DETALLE PRIMARY KEY (RECA_ID, RCDE_ITEM);
ALTER TABLE RECIBOS_CAJA_PAGO ADD CONSTRAINT PK_RECIBOS_CAJA_PAGO PRIMARY KEY (RECA_ID, RCPA_ITEM);
ALTER TABLE RECIBOS_PRESTAMOS ADD CONSTRAINT PK_RECIBOS_PRESTAMOS PRIMARY KEY (RECA_ID, PRNO_ID, PRCU_ITEM);
ALTER TABLE RECIBO_PROVISIONAL ADD CONSTRAINT PK_RECIBO_PROVISIONAL PRIMARY KEY (RCPR_ID);
ALTER TABLE RECIBO_PROVISIONAL_DETALLE ADD CONSTRAINT PK_RECIBO_PROVISIONAL_DETALLE PRIMARY KEY (RCPR_ID, RPDE_ITEM);
ALTER TABLE RECIBO_PROVISIONAL_PAGO ADD CONSTRAINT PK_RECIPROV_PAGO PRIMARY KEY (RCPR_ID, RPPA_ITEM);
ALTER TABLE REGISTRO_AUTOMATICO ADD CONSTRAINT PK_REGISTRO_AUTOMATICO PRIMARY KEY (REAU_COD);
ALTER TABLE REGISTRO_CONCEPTOS ADD CONSTRAINT PK_REGISTRO_CONCEPTOS PRIMARY KEY (REAU_COD, RECO_ITEM);
ALTER TABLE RELEVOS_COLEGIOS ADD CONSTRAINT PK_RELEVOS_COLEGIOS PRIMARY KEY (RELC_ID);
ALTER TABLE REMESAS_DESTINATARIO ADD CONSTRAINT PK_REMESAS_DESTINATARIO PRIMARY KEY (TERC_NIT);
ALTER TABLE REMISIONES_VENTA ADD CONSTRAINT PK_REMISIONES_VENTA PRIMARY KEY (REVT_ID);
ALTER TABLE REMISIONES_VENTA_DETALLE ADD CONSTRAINT PK_REMISIONES_VENTA_DETALLE PRIMARY KEY (REVT_ID, RVDE_ITEM);
ALTER TABLE REMISIONES_VENTA_DOCRELA ADD CONSTRAINT PK_REMIVENTA_DOCRELA PRIMARY KEY (REVT_ID, RVDR_TIPOREL, RVDR_IDREL);
ALTER TABLE REMISION_PROVEEDOR ADD CONSTRAINT PK_REMISION_PROVEEDOR PRIMARY KEY (REPR_ID);
ALTER TABLE REMISION_PROVEEDOR_DET ADD CONSTRAINT PK_REMISION_PROVEEDOR_DET PRIMARY KEY (REPR_ID, RPVD_ITEM);
ALTER TABLE REMISION_PROVEEDOR_DOCRELA ADD CONSTRAINT PK_REMISION_PROVEEDOR_DOCRELA PRIMARY KEY (REPR_ID, RPRD_TIPOREL, RPRD_IDREL);
ALTER TABLE REPLICACION_CONFIGURA ADD CONSTRAINT PK_REPLICACION_CONFIGURA PRIMARY KEY (REPC_TIPO, REPC_PREF, REPC_COMPANIA);
ALTER TABLE REPLICA_ARTICULO_ESTADO ADD CONSTRAINT PK_REPLICA_ARTICULO_ESTADO PRIMARY KEY (RPAE_ID);
ALTER TABLE REPLICA_COMPANIA ADD CONSTRAINT PK_REPLICA_COMPANIA PRIMARY KEY (RPCO_COD);
ALTER TABLE REPLICA_COMPRAS ADD CONSTRAINT PK_REPLICA_COMPRAS PRIMARY KEY (RPCM_COD, RPCM_PREF);
ALTER TABLE REPLICA_CONTA ADD CONSTRAINT PK_REPLICA_CONTA PRIMARY KEY (RPCO_ID);
ALTER TABLE REPLICA_CONTA_DETALLE ADD CONSTRAINT PK_REPLICA_CONTA_DETALLE PRIMARY KEY (RPCO_ID, RPCD_ITEM);
ALTER TABLE REPLICA_EVENTOS ADD CONSTRAINT PK_REPLICA_EVENTOS PRIMARY KEY (RPEV_ID);
ALTER TABLE REPLICA_VENTAS ADD CONSTRAINT PK_REPLICA_VENTAS PRIMARY KEY (RPVE_COD, RPVE_PREF, RPVE_PTVT);
ALTER TABLE REPORTES_MENSAJE ADD CONSTRAINT PK_REPORTES_MENSAJE PRIMARY KEY (REPM_ID);
ALTER TABLE REP_UTILIDAD ADD CONSTRAINT PK_REP_UTILIDAD PRIMARY KEY (ID, TIPO, CODIGO);
ALTER TABLE RESERVAS ADD CONSTRAINT PK_RESERVAS PRIMARY KEY (RESE_ID);
ALTER TABLE RESERVAS_DETALLE ADD CONSTRAINT PK_RESERVAS_DETALLE PRIMARY KEY (RESE_ID, RSDE_ITEM);
ALTER TABLE RESPUESTA_TIPOCUENTA ADD CONSTRAINT PK_RESPUESTA_TIPOCUENTA PRIMARY KEY (TICU_ITEM, RETC_ID);
ALTER TABLE RESUMEN_VENTAS ADD CONSTRAINT PK_RESUMEN_VENTAS PRIMARY KEY (RESU_FECHA, PTVT_ID);
ALTER TABLE RETENCIONES ADD CONSTRAINT PK_RETENCIONES PRIMARY KEY (RETE_ANO, RETE_ITEM);
ALTER TABLE RETENCION_MINIMA ADD CONSTRAINT PK_RETENCION_MINIMA PRIMARY KEY (RETM_ANO, RETM_ITEM);
ALTER TABLE RETIROS ADD CONSTRAINT PK_RETIROS PRIMARY KEY (RETI_ID);
ALTER TABLE REVISION_PRECIOS ADD CONSTRAINT PK_REVISION_PRECIOS PRIMARY KEY (RVPR_ID);
ALTER TABLE REVPRECIOS_DETALLE ADD CONSTRAINT PK_REVPRECIOS_DETALLE PRIMARY KEY (RVPR_ID, RVPD_ITEM);
ALTER TABLE RUTAS_COLEGIOS ADD CONSTRAINT PK_RUTAS_COLEGIOS PRIMARY KEY (RUTC_ID);
ALTER TABLE RUTAS_ENTREGA ADD CONSTRAINT PK_RUTAS_ENTREGA PRIMARY KEY (RUTA_ID);
ALTER TABLE RUTA_HORAS_PASAJEROS ADD CONSTRAINT PK_RUTA_HORAS_PASAJEROS PRIMARY KEY (RUTA_ID, RUHO_ITEM);
ALTER TABLE RUTA_PASAJEROS ADD CONSTRAINT PK_RUTA_PASAJEROS PRIMARY KEY (RUTA_ID);
ALTER TABLE RUTERO ADD CONSTRAINT PK_RUTERO PRIMARY KEY (RUTE_ID);
ALTER TABLE RUTERO_DETALLE ADD CONSTRAINT PK_RUTERO_DETALLE PRIMARY KEY (RUTE_ID, RUTD_ITEM);
ALTER TABLE RUTERO_FAC ADD CONSTRAINT PK_RUTERO_FAC PRIMARY KEY (TIDO_COD, RUTA_ID, RUTA_FECHA, RUTA_IDDOC);
ALTER TABLE RUTERO_RAZON ADD CONSTRAINT PK_RUTERO_RAZON PRIMARY KEY (RAZO_ID);
ALTER TABLE SALDOS_ACTIVO ADD CONSTRAINT PK_SALDOS_ACTIVO PRIMARY KEY (CUEN_COD, ACFJ_COD, SAAC_FECHA)
USING DESCENDING INDEX PK_SALDOS_ACTIVO;
ALTER TABLE SALDOS_ACTIVO_NIIF ADD CONSTRAINT PK_SALDOS_ACTIVO_NIIF PRIMARY KEY (CUEN_COD, ACFJ_COD, SAAC_FECHA)
USING DESCENDING INDEX PK_SALDOS_ACTIVO_NIIF;
ALTER TABLE SALDOS_ARTICULO ADD CONSTRAINT PK_SALDOS_ARTICULO PRIMARY KEY (CUEN_COD, ARTI_COD, SAAR_FECHA)
USING DESCENDING INDEX PK_SALDOS_ARTICULO;
ALTER TABLE SALDOS_ARTICULO_NIIF ADD CONSTRAINT PK_SALDOS_ARTICULO_NIIF PRIMARY KEY (CUEN_COD, ARTI_COD, SAAR_FECHA)
USING DESCENDING INDEX PK_SALDOS_ARTICULO_NIIF;
ALTER TABLE SALDOS_CENTROS ADD CONSTRAINT PK_SALDOS_CENTROS PRIMARY KEY (CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_CENTROS;
ALTER TABLE SALDOS_CENTROS_NIIF ADD CONSTRAINT PK_SALDOS_CENTROS_NIIF PRIMARY KEY (CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_CENTROS_NIIF;
ALTER TABLE SALDOS_CENTROS_TERCERO ADD CONSTRAINT PK_SALDOS_CENTROS_TERCERO PRIMARY KEY (CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_CENTROS_TERCERO;
ALTER TABLE SALDOS_CENTROS_TERCERO_NIIF ADD CONSTRAINT PK_SALDOS_CENTROS_TERCERO_NIIF PRIMARY KEY (CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_CENTROS_TERCERO_NIIF;
ALTER TABLE SALDOS_CUENTAS ADD CONSTRAINT PK_SALDOS_CUENTAS PRIMARY KEY (CUEN_COD, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_CUENTAS;
ALTER TABLE SALDOS_CUENTAS_NIIF ADD CONSTRAINT PK_SALDOS_CUENTAS_NIIF PRIMARY KEY (CUEN_COD, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_CUENTAS_NIIF;
ALTER TABLE SALDOS_DOCCONTA ADD CONSTRAINT PK_SALDOS_DOCCONTA PRIMARY KEY (CUEN_COD, DOCO_ID, SADC_FECHA);
ALTER TABLE SALDOS_DOC_CARTERA ADD CONSTRAINT PK_SALDOS_DOC_CARTERA PRIMARY KEY (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA);
ALTER TABLE SALDOS_DOC_CXPAGAR ADD CONSTRAINT PK_SALDOS_DOC_CXPAGAR PRIMARY KEY (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA);
ALTER TABLE SALDOS_INICIALES ADD CONSTRAINT PK_SALDOS_INICIALES PRIMARY KEY (SAIN_ITEM);
ALTER TABLE SALDOS_INICIALES_NIIF ADD CONSTRAINT PK_SALDOS_INICIALES_NIIF PRIMARY KEY (SAIN_ITEM);
ALTER TABLE SALDOS_INVENTARIO ADD CONSTRAINT PK_SALDOS_INVENTARIO PRIMARY KEY (CUEN_COD, ARTI_COD, SAIN_FECHA);
ALTER TABLE SALDOS_TERCEROS ADD CONSTRAINT PK_SALDOS_TERCEROS PRIMARY KEY (CUEN_COD, TERC_NIT, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_TERCEROS;
ALTER TABLE SALDOS_TERCEROS_NIIF ADD CONSTRAINT PK_SALDOS_TERCEROS_NIIF PRIMARY KEY (CUEN_COD, TERC_NIT, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_TERCEROS_NIIF;
ALTER TABLE SALDO_BANCOS ADD CONSTRAINT PK_SALDO_BANCOS PRIMARY KEY (CUBA_COD, SABA_FECHA);
ALTER TABLE SALDO_BANCOS_CONF ADD CONSTRAINT PK_SALDO_BANCOS_CONF PRIMARY KEY (CUBA_COD, SABA_FECHA);
ALTER TABLE SALDO_CAJA ADD CONSTRAINT PK_SALDO_CAJA PRIMARY KEY (CAJA_ID, SACA_FECHA);
ALTER TABLE SALDO_EFECTIVO ADD CONSTRAINT PK_SALDO_EFECTIVO PRIMARY KEY (SAEF_FECHA, CAJA_ID);
ALTER TABLE SALIDAS ADD CONSTRAINT PK_SALIDAS PRIMARY KEY (SALI_ID);
ALTER TABLE SALIDAS_DETALLE ADD CONSTRAINT PK_SALIDAS_DETALLE PRIMARY KEY (SALI_ID, SADE_ITEM);
ALTER TABLE SECCION ADD CONSTRAINT PK_SECCION PRIMARY KEY (DPTO_COD, SECC_COD);
ALTER TABLE SEGMENTOS ADD CONSTRAINT PK_SEGMENTOS PRIMARY KEY (SEGM_COD);
ALTER TABLE SEMILLAS_CLIMA ADD CONSTRAINT PK_SEMILLAS_CLIMA PRIMARY KEY (SECL_ID);
ALTER TABLE SEMILLAS_ESPECIES ADD CONSTRAINT PK_SEMILLAS_ESPECIES PRIMARY KEY (SEES_ID);
ALTER TABLE SEMILLAS_FERTILIDAD ADD CONSTRAINT PK_SEMILLAS_FERTILIDAD PRIMARY KEY (SEFE_ID);
ALTER TABLE SEMILLAS_FORMACION_ECO ADD CONSTRAINT PK_SEMILLAS_FORMACION_ECO PRIMARY KEY (SEFO_ID);
ALTER TABLE SEMILLAS_FUENTE ADD CONSTRAINT PK_SEMILLAS_FUENTE PRIMARY KEY (SEFU_ID);
ALTER TABLE SEMILLAS_HABITOS_CR ADD CONSTRAINT PK_SEMILLAS_HABITOS_CR PRIMARY KEY (SEHC_ID);
ALTER TABLE SEMILLAS_NOMBRES_ESPECIE ADD CONSTRAINT PK_SEMILLAS_NOMBRES_ESPECIE PRIMARY KEY (SENE_ID);
ALTER TABLE SEMILLAS_SIEMBRA ADD CONSTRAINT PK_SEMILLAS_SIEMBRA PRIMARY KEY (SESI_ID);
ALTER TABLE SEMILLAS_SUBLINEAS ADD CONSTRAINT PK_SEMILLAS_SUBLINEAS PRIMARY KEY (SESL_ID);
ALTER TABLE SEMILLAS_SUELO ADD CONSTRAINT PK_SEMILLAS_SUELO PRIMARY KEY (SESU_ID);
ALTER TABLE SEMILLAS_USOS ADD CONSTRAINT PK_SEMILLAS_USOS PRIMARY KEY (SEUS_ID);
ALTER TABLE SEMILLA_PROCEDENCIA ADD CONSTRAINT PK_SEMILLA_PROCEDENCIA PRIMARY KEY (SEPR_ID);
ALTER TABLE SERIALES_ARTICULO ADD CONSTRAINT PK_SERIALES_ARTICULO PRIMARY KEY (ARTI_COD, BODE_COD, SEAR_COD);
ALTER TABLE SERIALES_DOCUMENTO ADD CONSTRAINT PK_SERIALES_DOCUMENTO PRIMARY KEY (TIDO_COD, SEDO_IDDOC, SEDO_ITEM, SEDO_SERIAL, SEDO_ARTICULO, SEDO_BOD);
ALTER TABLE SOLICITUD_IMPORTACION ADD CONSTRAINT PK_SOLICITUD_IMPORTACION PRIMARY KEY (SLIM_ID);
ALTER TABLE SOLICITUD_IMPORTACION_DET ADD CONSTRAINT PK_SOLICITUD_IMPORTACION_DET PRIMARY KEY (SLIM_ID, SLDE_ITEM);
ALTER TABLE SOPORTE ADD CONSTRAINT PK_SOPORTE PRIMARY KEY (SOPO_ID);
ALTER TABLE SORTEOS_CONFIGURACION ADD CONSTRAINT PK_SORTEOS_CONFIGURACION PRIMARY KEY (SORC_ID);
ALTER TABLE SORTEO_FACTURA ADD CONSTRAINT PK_SORTEO_FACTURA PRIMARY KEY (SORT_ID);
ALTER TABLE STANDS ADD CONSTRAINT PK_STANDS PRIMARY KEY (ARTI_COD, STAND_BODEGA);
ALTER TABLE SUBGRUPO ADD CONSTRAINT PK_SUBGRUPO PRIMARY KEY (GRUP_COD, SUBG_COD);
ALTER TABLE SUBTIPO_COTIZANTE ADD CONSTRAINT PK_SUBTIPO_COTIZANTE PRIMARY KEY (TCOT_COD, STCO_COD);
ALTER TABLE SUCURSALES ADD CONSTRAINT PK_SUCURSALES PRIMARY KEY (SUCU_ID);
ALTER TABLE SUPERVISOR ADD CONSTRAINT PK_SUPERVISOR PRIMARY KEY (SUPE_ID);
ALTER TABLE TARIFAS_ARL ADD CONSTRAINT PK_TARIFAS_ARL PRIMARY KEY (TARL_ID);
ALTER TABLE TARIFAS_REMESAS ADD CONSTRAINT PK_TARIFAS_REMESAS PRIMARY KEY (TARM__ORIGEN, TARM_DESTINO);
ALTER TABLE TARIFA_IVA ADD CONSTRAINT PK_TARIFA_IVA PRIMARY KEY (TAIV_COD);
ALTER TABLE TARJETAS ADD CONSTRAINT PK_TARJETAS PRIMARY KEY (TARJ_COD);
ALTER TABLE TASA_CAMBIO_MONEDA ADD CONSTRAINT PK_TASA_CAMBIO_MONEDA PRIMARY KEY (TACA_ID);
ALTER TABLE TAXONOMIA ADD CONSTRAINT PK_TAXONOMIA PRIMARY KEY (TAXO_ID);
ALTER TABLE TAXONOMIA_CUENTAS ADD CONSTRAINT PK_TAXONOMIA_CUENTAS PRIMARY KEY (TAXO_ID, TAXE_ID, TAXD_ID, TAXC_ITEM);
ALTER TABLE TAXONOMIA_DETALLE ADD CONSTRAINT PK_TAXONOMIA_DETALLE PRIMARY KEY (TAXO_ID, TAXE_ID, TAXD_ITEM);
ALTER TABLE TAXONOMIA_ENCABEZA ADD CONSTRAINT PK_TAXONOMIA_ENCABEZA PRIMARY KEY (TAXO_ID, TAXE_ID);
ALTER TABLE TAXONOMIA_INSTANCIA ADD CONSTRAINT PK_TAXONOMIA_INSTANCIA PRIMARY KEY (TAIN_ID, TAXO_ID, TAXE_ID, TAXD_ID);
ALTER TABLE TERCEROS ADD CONSTRAINT PK_TERCEROS PRIMARY KEY (TERC_NIT);
ALTER TABLE TERCEROS_CONTACTOS ADD CONSTRAINT PK_TERCEROS_CONTACTOS PRIMARY KEY (TERC_NIT, TECC_ITEM);
ALTER TABLE TERCERO_DOCUMENTOS ADD CONSTRAINT PK_TERCERO_DOCUMENTOS PRIMARY KEY (TERC_NIT, TEDO_ITEM);
ALTER TABLE TERMINALES_NOMBRES ADD CONSTRAINT PK_TERMINALES_NOMBRES PRIMARY KEY (TERM_IP);
ALTER TABLE TERMINOS_COMERCIO_INT ADD CONSTRAINT PK_TERMINOS_COMERCIO_INT PRIMARY KEY (TERM_COD);
ALTER TABLE TERMINOS_ENTREGA ADD CONSTRAINT PK_TERMINOS_ENTREGA PRIMARY KEY (TEEN_ID);
ALTER TABLE TERMINOS_PAGO ADD CONSTRAINT PK_TERMINOS_PAGO PRIMARY KEY (TEPA_ID);
ALTER TABLE TIPOS_EMBARQUE ADD CONSTRAINT PK_TIPOS_EMBARQUE PRIMARY KEY (TIEM_COD);
ALTER TABLE TIPOS_MONEDA ADD CONSTRAINT PK_TIPOS_MONEDA PRIMARY KEY (TIMO_COD);
ALTER TABLE TIPOS_NOVEDAD ADD CONSTRAINT PK_TIPOS_NOVEDAD PRIMARY KEY (TNOV_COD);
ALTER TABLE TIPO_CARGA ADD CONSTRAINT PK_TIPO_CARGA PRIMARY KEY (TICA_COD);
ALTER TABLE TIPO_COMPROBANTE ADD CONSTRAINT PK_TIPO_COMPROBANTE PRIMARY KEY (TICO_COD);
ALTER TABLE TIPO_COTIZANTE ADD CONSTRAINT PK_TIPO_COTIZANTE PRIMARY KEY (TCOT_COD);
ALTER TABLE TIPO_CUENTAS ADD CONSTRAINT PK_TIPO_CUENTAS PRIMARY KEY (TICU_ITEM);
ALTER TABLE TIPO_DOCUMENTO ADD CONSTRAINT PK_TIPO_DOCUMENTO PRIMARY KEY (TIDO_COD);
ALTER TABLE TIPO_EMBALAJE ADD CONSTRAINT PK_TIPO_EMBALAJE PRIMARY KEY (TIEM_COD);
ALTER TABLE TIPO_GASTOS_IMPORTACION ADD CONSTRAINT PK_TIPO_GASTOS_IMPORTACION PRIMARY KEY (TIGI_COD);
ALTER TABLE TIPO_ID ADD CONSTRAINT PK_TIPO_ID PRIMARY KEY (TIID_COD);
ALTER TABLE TIPO_NOTADOC ADD CONSTRAINT PK_TIPO_NOTADOC PRIMARY KEY (TIND_ID);
ALTER TABLE TIPO_NOTA_CLIENTE ADD CONSTRAINT PK_TIPO_NOTA_CLIENTE PRIMARY KEY (TINO_COD);
ALTER TABLE TIPO_PUC ADD CONSTRAINT PK_TIPO_PUC PRIMARY KEY (TIPU_COD);
ALTER TABLE TIPO_VEHICULO ADD CONSTRAINT PK_TIPO_VEHICULO PRIMARY KEY (TIVH_COD);
ALTER TABLE TIPO_VINCULO_UGPP ADD CONSTRAINT PK_TIPO_VINCULO_UGPP PRIMARY KEY (TIVU_COD);
ALTER TABLE TIQUETE_PASAJERO ADD CONSTRAINT PK_TIQUETE_PASAJERO PRIMARY KEY (TIQP_ID);
ALTER TABLE TRANSPORTADORES_INTERNAC ADD CONSTRAINT PK_TRANSPORTADORES_INTERNAC PRIMARY KEY (TERC_NIT);
ALTER TABLE TRASFERENCIAS ADD CONSTRAINT PK_TRASFERENCIAS PRIMARY KEY (TRAN_ID);
ALTER TABLE TRASFERENCIAS_DETALLE ADD CONSTRAINT PK_TRASFERENCIAS_DETALLE PRIMARY KEY (TRAN_ID, TRAS_ITEM);
ALTER TABLE TRASLADOS ADD CONSTRAINT PK_TRASLADOS PRIMARY KEY (TRAS_ID);
ALTER TABLE TRASLADOS_CAJA ADD CONSTRAINT PK_TRASLADOS_CAJA PRIMARY KEY (TRCJ_ID);
ALTER TABLE TRASLADOS_CAJA_DET ADD CONSTRAINT PK_TRASLADOS_CAJA_DET PRIMARY KEY (TRCJ_ID, TRCD_ITEM);
ALTER TABLE TRASPORTADORES ADD CONSTRAINT PK_TRASPORTADORES PRIMARY KEY (TRSP_ID);
ALTER TABLE UNIDADES_CARGA ADD CONSTRAINT PK_UNIDADES_CARGA PRIMARY KEY (UNCA_COD);
ALTER TABLE UNIDAD_ARTICULO ADD CONSTRAINT PK_UNIDAD_ARTICULO PRIMARY KEY (ARTI_COD, UNAR_UNIDAD);
ALTER TABLE USUARIO ADD CONSTRAINT PK_USUARIO PRIMARY KEY (USER_COD);
ALTER TABLE VACACIONES ADD CONSTRAINT PK_VACACIONES PRIMARY KEY (VACA_ID);
ALTER TABLE VACACIONES_DETALLE ADD CONSTRAINT PK_VACACIONES_DETALLE PRIMARY KEY (VACA_ID, VACD_ITEM);
ALTER TABLE VACACIONES_DISFRUT ADD CONSTRAINT PK_VACACIONES_DISFRUT PRIMARY KEY (VADI_ID);
ALTER TABLE VACACIONES_DISFRUT_DET ADD CONSTRAINT PK_VACACIONES_DISFRUT_DET PRIMARY KEY (VADI_ID, VADE_ITEM);
ALTER TABLE VEHICULOS ADD CONSTRAINT PK_VEHICULOS PRIMARY KEY (VEHI_COD);
ALTER TABLE VEHICULOS_HISTORIA ADD CONSTRAINT PK_VEHICULOS_HISTORIA PRIMARY KEY (VEHI_COD, VEHH_FECHA);
ALTER TABLE VEHICULO_CARROCERIA ADD CONSTRAINT PK_VEHICULO_CARROCERIA PRIMARY KEY (VHCA_ID);
ALTER TABLE VEHICULO_COLOR ADD CONSTRAINT PK_VEHICULO_COLOR PRIMARY KEY (VHCO_COD);
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);
ALTER TABLE VENDEDORES ADD CONSTRAINT PK_VENDEDORES PRIMARY KEY (VEND_COD);
ALTER TABLE VENDEDORES_GRUPO ADD CONSTRAINT PK_VENDEDORES_GRUPO PRIMARY KEY (GRVE_ID, VEND_COD);
ALTER TABLE VENDEDOR_DOCUMENTOS ADD CONSTRAINT PK_VENDEDOR_DOCUMENTOS PRIMARY KEY (VEND_COD, VEDO_ITEM);
ALTER TABLE VENDEDOR_META ADD CONSTRAINT PK_VENDEDOR_META PRIMARY KEY (VEND_ID, VEME_FECHA);
ALTER TABLE VENTAS_MES ADD CONSTRAINT PK_VENTAS_MES PRIMARY KEY (MES);
ALTER TABLE ZONAS ADD CONSTRAINT PK_ZONAS PRIMARY KEY (ZONA_COD);


/******************************************************************************/
/***                              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 AJUSTES ADD CONSTRAINT FK_AJUSTES_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE AJUSTES ADD CONSTRAINT FK_AJUSTES_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE AJUSTES_DETALLE ADD CONSTRAINT FK_AJUSTESD_AJUSTES FOREIGN KEY (AJUS_ID) REFERENCES AJUSTES (AJUS_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE AJUSTES_DETALLE ADD CONSTRAINT FK_AJUSTESD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE AJUSTES_DETALLE ADD CONSTRAINT FK_AJUSTESD_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE ANTICIPOS_CLIENTE ADD CONSTRAINT FK_ANTICLIE_CLIENTE FOREIGN KEY (TERC_NIT) REFERENCES CLIENTES (TERC_NIT);
ALTER TABLE ANTICIPOS_CLIENTE ADD CONSTRAINT FK_ANTICLIE_COBRADOR FOREIGN KEY (COBR_COD) REFERENCES COBRADORES (COBR_COD);
ALTER TABLE ANTICIPOS_CLIENTE ADD CONSTRAINT FK_ANTICLIE_PREFIJO FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE ANTICIPOS_NOMINA ADD CONSTRAINT FK_ANTICIPO_FK_EMPLAD_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE ANTICIPOS_PROVEEDOR ADD CONSTRAINT FK_ANTIPROV_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE APLICACION_CLIENTE ADD CONSTRAINT FK_APLICLIENTE_CLIENTES FOREIGN KEY (TERC_NIT) REFERENCES CLIENTES (TERC_NIT);
ALTER TABLE APLICACION_CLIENTE ADD CONSTRAINT FK_APLICLIENTE_COBRADOR FOREIGN KEY (COBR_COD) REFERENCES COBRADORES (COBR_COD);
ALTER TABLE APLICACION_CLIENTE_CRUCE ADD CONSTRAINT FK_APLICACION_CLIENTE_CRUCE_1 FOREIGN KEY (APCL_ID) REFERENCES APLICACION_CLIENTE (APCL_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE APLICACION_CLIENTE_DETALLE ADD CONSTRAINT FK_APLICLIENTE_DETALLE FOREIGN KEY (APCL_ID) REFERENCES APLICACION_CLIENTE (APCL_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE APLICACION_PROVEEDOR_DETALLE ADD CONSTRAINT FK_APLICACION_PROVEEDOR FOREIGN KEY (APPR_ID) REFERENCES APLICACION_PROVEDOR (APPR_ID) ON DELETE CASCADE ON UPDATE CASCADE;
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 ARTICULO ADD CONSTRAINT FK_ARTICULO_GRUPO FOREIGN KEY (GRUP_COD) REFERENCES GRUPO (GRUP_COD);
ALTER TABLE ARTICULO ADD CONSTRAINT FK_ARTICULO_IVA FOREIGN KEY (TAIV_COD) REFERENCES TARIFA_IVA (TAIV_COD);
ALTER TABLE ARTICULO ADD CONSTRAINT FK_ARTICULO_MARCAS FOREIGN KEY (MARC_COD) REFERENCES MARCAS (MARC_COD);
ALTER TABLE ARTICULO ADD CONSTRAINT FK_ARTICULO_SUBGRUPO FOREIGN KEY (GRUP_COD, SUBG_COD) REFERENCES SUBGRUPO (GRUP_COD, SUBG_COD);
ALTER TABLE ARTICULOS_PRODUCTO ADD CONSTRAINT FK_ARTIPROD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ARTICULO_ALERTAS ADD CONSTRAINT FK_ARTICULO_ALERTAS_1 FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE AUTORIZACIONES ADD CONSTRAINT FK_AUTORIZAC_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE BARRAS_ARTICULO ADD CONSTRAINT FK_BARRAART_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CAJAS ADD CONSTRAINT FK_CAJERO_CAJAS FOREIGN KEY (CAJE_ID) REFERENCES CAJEROS (CAJE_ID);
ALTER TABLE CAMBIODOC_ENTRADAS ADD CONSTRAINT FK_CAMBIDOCE_CAMBIODOC FOREIGN KEY (CADO_ID) REFERENCES CAMBIO_DOCUMENTOS (CADO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CAMBIODOC_ENTRADAS ADD CONSTRAINT FK_CAMBIDOCE__FORMAPAGO FOREIGN KEY (FOPA_ID) REFERENCES FORMAS_PAGO (FOPA_ID);
ALTER TABLE CAMBIODOC_SALIDAS ADD CONSTRAINT FK_CAMBIDOCS_CAMBIODOC FOREIGN KEY (CADO_ID) REFERENCES CAMBIO_DOCUMENTOS (CADO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CAMBIODOC_SALIDAS ADD CONSTRAINT FK_CAMBIDOCS_FORMAPAGO FOREIGN KEY (FOPA_ID) REFERENCES FORMAS_PAGO (FOPA_ID);
ALTER TABLE CAMBIO_DOCUMENTOS ADD CONSTRAINT FK_CAMBIODOC_CAJAS FOREIGN KEY (CAJA_ID) REFERENCES CAJAS (CAJA_ID);
ALTER TABLE CAMBIO_DOCUMENTOS ADD CONSTRAINT FK_CAMBIODOC_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE CENTROS ADD CONSTRAINT FK_CENTROS_PROYECTO FOREIGN KEY (PROY_COD) REFERENCES PROYECTOS (PROY_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 CHEQUERA ADD CONSTRAINT FK_CHEQUERA_CUENTAS_ FOREIGN KEY (CUBA_COD) REFERENCES CUENTAS_BANCO (CUBA_COD);
ALTER TABLE CLIENTES ADD CONSTRAINT FK_CLIENTES_COBRADOR FOREIGN KEY (COBR_COD) REFERENCES COBRADORES (COBR_COD);
ALTER TABLE CLIENTES ADD CONSTRAINT FK_CLIENTES_SEGMENTOS FOREIGN KEY (SEGM_COD) REFERENCES SEGMENTOS (SEGM_COD);
ALTER TABLE CLIENTES ADD CONSTRAINT FK_CLIENTES_TERCEROS FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CLIENTES ADD CONSTRAINT FK_CLIENTES_ZONAS FOREIGN KEY (ZONA_COD) REFERENCES ZONAS (ZONA_COD);
ALTER TABLE CLIENTES_ALERTAS ADD CONSTRAINT FK_CLIENTES_ALERTAS_1 FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CLIENTE_SUCURSALES ADD CONSTRAINT FK_CLIENTE_SUCURSALES_1 FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE COMISIONES ADD CONSTRAINT FK_COMISION_VENDEDOR FOREIGN KEY (VEND_COD) REFERENCES VENDEDORES (VEND_COD);
ALTER TABLE COMISION_COBRO ADD CONSTRAINT FK_COMISION_COBRO FOREIGN KEY (COBR_COD) REFERENCES COBRADORES (COBR_COD) ON DELETE CASCADE;
ALTER TABLE COMPRAS_INTERNACIONALES ADD CONSTRAINT FK_COMP_INT_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE COMPRAS_INTERNACIONALES ADD CONSTRAINT FK_COMP_INT_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE COMPRAS_INTERNACIONALES ADD CONSTRAINT FK_COMP_INT_PROVEEDO FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
ALTER TABLE COMPRAS_INTERNACIONALES_DETALLE ADD CONSTRAINT FK_COMP_INT_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE COMPRAS_INTERNACIONALES_DETALLE ADD CONSTRAINT FK_COMP_INT_FACTCOMP FOREIGN KEY (COIN_ID) REFERENCES COMPRAS_INTERNACIONALES (COIN_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE COMPROBANTE_DETALLE ADD CONSTRAINT FK_COMPROBAD_COMPROBA FOREIGN KEY (ENCO_CONSEC) REFERENCES COMPROBANTE_ENCABEZADO (ENCO_CONSEC) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE COMPROBANTE_DETALLE ADD CONSTRAINT FK_COMPROBAD_CUENTAS FOREIGN KEY (CUEN_COD) REFERENCES CUENTAS (CUEN_COD);
ALTER TABLE COMPROBANTE_DETALLE_NIIF ADD CONSTRAINT FK_COMPROBAD_COMPROBA_NIIF FOREIGN KEY (ENCO_CONSEC) REFERENCES COMPROBANTE_ENCABEZADO (ENCO_CONSEC) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE COMPROBANTE_DETALLE_NIIF ADD CONSTRAINT FK_COMPROBAD_CUENTAS_NIIF FOREIGN KEY (CUEN_COD) REFERENCES CUENTAS_NIIF (CUEN_COD);
ALTER TABLE COMPROBANTE_ENCABEZADO ADD CONSTRAINT FK_COMPROBA_PREFIJOS FOREIGN KEY (TICO_COD, PRCO_PREF) REFERENCES PREFIJOS_CONTA (TICO_COD, PRCO_PREF);
ALTER TABLE CONCEPTOS_CUENTAS ADD CONSTRAINT FK_CONCCUEN_CONCEPTO FOREIGN KEY (CONC_COD) REFERENCES CONCEPTOS (CONC_COD) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CONCEPTOS_CUENTAS ADD CONSTRAINT FK_CONCCUEN_CUENTAS FOREIGN KEY (CUEN_COD) REFERENCES CUENTAS (CUEN_COD);
ALTER TABLE CONCEPTOS_FRECUENTES ADD CONSTRAINT FK_CONCEPTOS_FRECUENTES_1 FOREIGN KEY (TIDO_COD) REFERENCES TIPO_DOCUMENTO (TIDO_COD);
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;
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;
ALTER TABLE CONFIRMACION_DEPOSITO ADD CONSTRAINT FK_CONFIRMACION_DEPOSITO_2 FOREIGN KEY (SLIM_ID, OREM_ID) REFERENCES ORDEN_EMBARQUE (SLIM_ID, OREM_ID);
ALTER TABLE CONSIGNA_DETALLE ADD CONSTRAINT FK_CONSIGNAD_CONSIGNA FOREIGN KEY (CONS_ID) REFERENCES CONSIGNA (CONS_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CONSIGNA_DETALLE ADD CONSTRAINT FK_CONSIGNA_FORMAPAGO FOREIGN KEY (FOPA_ID) REFERENCES FORMAS_PAGO (FOPA_ID);
ALTER TABLE CONSIGNA_TARJETAS_DET ADD CONSTRAINT FK_CONSIGTARD_CONSIGTAR FOREIGN KEY (COTJ_ID) REFERENCES CONSIGNA_TARJETAS (COTJ_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CONSOLIDADO_NOMINA ADD CONSTRAINT FK_CONSOLIDADO_NOMINA_1 FOREIGN KEY (CONO_IDORI) REFERENCES NOMINA (NOMI_ID);
ALTER TABLE CONSUMO_DETALLE ADD CONSTRAINT FK_CONSUMODET_CONSUMO FOREIGN KEY (CONS_ID) REFERENCES CONSUMOS (CONS_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CONTABILIZACION_DET ADD CONSTRAINT FK_CONTABILDET_CONTABIL FOREIGN KEY (CNTB_ID) REFERENCES CONTABILIZACION (CNTB_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CONTABIL_ARTICULO ADD CONSTRAINT FK_CONTAART_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CONTABIL_ARTICULO_NIIF ADD CONSTRAINT FK_CONTAART_ARTICULO_N FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE COSTOS ADD CONSTRAINT FK_COSTOS_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE COSTOS_NIIF ADD CONSTRAINT FK_COSTOSN_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE COTIZACIONES ADD CONSTRAINT FK_COTIZACION_PTOVTA FOREIGN KEY (PTVT_ID) REFERENCES PUNTO_VENTA (PTVT_ID);
ALTER TABLE COTIZACIONES ADD CONSTRAINT FK_COTIZACI_CLIENTES FOREIGN KEY (TERC_NIT) REFERENCES CLIENTES (TERC_NIT);
ALTER TABLE COTIZACIONES ADD CONSTRAINT FK_COTIZACI_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE COTIZACIONES ADD CONSTRAINT FK_COTIZACI_VENDEDOR FOREIGN KEY (VEND_COD) REFERENCES VENDEDORES (VEND_COD);
ALTER TABLE COTIZACIONES_DETALLE ADD CONSTRAINT FK_COTIZACID_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE COTIZACIONES_DETALLE ADD CONSTRAINT FK_COTIZACID_COTIZACI FOREIGN KEY (COTI_ID) REFERENCES COTIZACIONES (COTI_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE COTIZACIONES_PROVEEDOR_DET ADD CONSTRAINT FK_COTIZPRVD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE COTIZACIONES_PROVEEDOR_DET ADD CONSTRAINT FK_COTIZPRVD_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE COTIZACIONES_PROVEEDOR_DET ADD CONSTRAINT FK_COTIZPRVD_COTIPROV FOREIGN KEY (COPR_ID) REFERENCES COTIZACION_PROVEEDOR (COPR_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE COTIZACION_PROVEEDOR ADD CONSTRAINT FK_COTIPROV_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE COTIZACION_PROVEEDOR ADD CONSTRAINT FK_COTIPROV_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE COTIZACION_PROVEEDOR ADD CONSTRAINT FK_COTIPROV_PROVEEDO FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
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_EVENTOS ADD CONSTRAINT FK_CRM_EVENTOS_1 FOREIGN KEY (CRCL_NIT) REFERENCES CRM_CLIENTES (CRCL_NIT);
ALTER TABLE CRM_EVENTO_RESPUESTA ADD CONSTRAINT FK_CRM_EVENTO_RESPUESTA_1 FOREIGN KEY (CRER_MOTIVO) REFERENCES CRM_EVENTO_MOTIVO (CREM_ID);
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 CUENTAS_BANCO ADD CONSTRAINT FK_CTABANCO_BANCOS FOREIGN KEY (BANC_COD) REFERENCES BANCOS (BANC_COD);
ALTER TABLE DEPOSITOS ADD CONSTRAINT FK_DEPOSITOS_2 FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);
ALTER TABLE DEPRECIACION_DETALLE ADD CONSTRAINT FK_DEPRECIACION_DETALLE_1 FOREIGN KEY (DEPR_ID) REFERENCES DEPRECIACION (DEPR_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DEPRECIACION_UNIDADES ADD CONSTRAINT FK_DEPRECIACION_UNIDADES_1 FOREIGN KEY (DEPR_ID) REFERENCES DEPRECIACION (DEPR_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DESENSAMBLES ADD CONSTRAINT FK_DESENSAMB_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE DESENSAMBLES ADD CONSTRAINT FK_DESENSAMB_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE DESENSAMBLES_DETALLE ADD CONSTRAINT FK_DESENSAMD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE DESENSAMBLES_DETALLE ADD CONSTRAINT FK_DESENSAMD_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE DESENSAMBLES_DETALLE ADD CONSTRAINT FK_DESENSAMD_DESENSAMB FOREIGN KEY (DESE_ID) REFERENCES DESENSAMBLES (DESE_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DEVOLUCIONES_COMPRAS ADD CONSTRAINT FK_DEVPROV_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE DEVOLUCIONES_COMPRAS ADD CONSTRAINT FK_DEVPROV_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE DEVOLUCIONES_COMPRAS ADD CONSTRAINT FK_DEVPROV_PROVEEDO FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
ALTER TABLE DEVOLUCIONES_COMPRAS_DET ADD CONSTRAINT FK_DEVPROVD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE DEVOLUCIONES_COMPRAS_DET ADD CONSTRAINT FK_DEVPROVD_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE DEVOLUCIONES_COMPRAS_DET ADD CONSTRAINT FK_DEVPROVD_DEVPROV FOREIGN KEY (DVCO_ID) REFERENCES DEVOLUCIONES_COMPRAS (DVCO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DEVOLUCIONES_VENTAS ADD CONSTRAINT FK_DEVOLVTA_CLIENTES FOREIGN KEY (TERC_NIT) REFERENCES CLIENTES (TERC_NIT);
ALTER TABLE DEVOLUCIONES_VENTAS ADD CONSTRAINT FK_DEVOLVTA_VENDEDOR FOREIGN KEY (VEND_COD) REFERENCES VENDEDORES (VEND_COD);
ALTER TABLE DEVOLUCIONES_VENTAS_DETALLE ADD CONSTRAINT FK_DEVOLUCIONES_VENTAS_DETALLE FOREIGN KEY (DEVT_ID) REFERENCES DEVOLUCIONES_VENTAS (DEVT_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DEVOLUCIONES_VENTAS_DETALLE ADD CONSTRAINT FK_DEVOLUCIONES_VENTAS_DETALLE_ FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE DEVOLUCIONES_VENTAS_DOCRELA ADD CONSTRAINT FK_DEVDOCREL_DEVENTAS FOREIGN KEY (DEVT_ID) REFERENCES DEVOLUCIONES_VENTAS (DEVT_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DEVOLUCION_COMPRAS_DOCRELA ADD CONSTRAINT FK_DEVCOMPRAS_DOCRELA FOREIGN KEY (DVCO_ID) REFERENCES DEVOLUCIONES_COMPRAS (DVCO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DOCUMENTOS_PAGO_CAJA ADD CONSTRAINT FK_DOCUCAJA_CAJAS FOREIGN KEY (CAJA_ID) REFERENCES CAJAS (CAJA_ID);
ALTER TABLE DOCUMENTOS_PAGO_CAJA ADD CONSTRAINT FK_DOCUCAJA_FORMAPAGO FOREIGN KEY (FOPA_ID) REFERENCES FORMAS_PAGO (FOPA_ID);
ALTER TABLE EDUCACION_FORMAL_EMPLEADO ADD CONSTRAINT FK_EDUCACION_FORMAL_EMPLEADO_2 FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE EGRESOS ADD CONSTRAINT FK_EGRESOS_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE EGRESOS ADD CONSTRAINT FK_EGRESOS_TERCERO FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);
ALTER TABLE EGRESOS_BANCO ADD CONSTRAINT FK_EGRESOS_BANCO FOREIGN KEY (EGRE_ID) REFERENCES EGRESOS (EGRE_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE EGRESOS_CAJA ADD CONSTRAINT FK_EGRECAJA_CAJAS FOREIGN KEY (CAJA_ID) REFERENCES CAJAS (CAJA_ID);
ALTER TABLE EGRESOS_CAJA ADD CONSTRAINT FK_EGRECAJA_EGRESOS FOREIGN KEY (EGRE_ID) REFERENCES EGRESOS (EGRE_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE EGRESOS_CAJA ADD CONSTRAINT FK_EGRECAJA_FORMAPAGO FOREIGN KEY (FOPA_ID) REFERENCES FORMAS_PAGO (FOPA_ID);
ALTER TABLE EGRESOS_CONTABILIDAD ADD CONSTRAINT FK_EGRECONTA_EGRESOS FOREIGN KEY (EGRE_ID) REFERENCES EGRESOS (EGRE_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;
ALTER TABLE EGRESOS_DETALLE ADD CONSTRAINT FK_EGRESOS_DETALLE FOREIGN KEY (EGRE_ID) REFERENCES EGRESOS (EGRE_ID) ON DELETE CASCADE ON UPDATE CASCADE;
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 ENSAMBLES ADD CONSTRAINT FK_ENSAMBLES_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE ENSAMBLES ADD CONSTRAINT FK_ENSAMBLES_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE ENSAMBLES_DETALLE ADD CONSTRAINT FK_ENSAMBLED_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE ENSAMBLES_DETALLE ADD CONSTRAINT FK_ENSAMBLED_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE ENSAMBLES_DETALLE ADD CONSTRAINT FK_ENSAMBLED__ENSAMBLES FOREIGN KEY (ENSA_ID) REFERENCES ENSAMBLES (ENSA_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ENTRADAS ADD CONSTRAINT FK_ENTRADAS_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE ENTRADAS ADD CONSTRAINT FK_ENTRADAS_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE ENTRADAS_DETALLE ADD CONSTRAINT FK_ENTRADADE_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE ENTRADAS_DETALLE ADD CONSTRAINT FK_ENTRADADE_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE ENTRADAS_DETALLE ADD CONSTRAINT FK_ENTRADADE_ENTRADAS FOREIGN KEY (ENTR_ID) REFERENCES ENTRADAS (ENTR_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE EXISTENCIA ADD CONSTRAINT FK_EXISTENC_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE EXISTENCIA ADD CONSTRAINT FK_EXISTENC_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
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);
ALTER TABLE EXPERIENCIA_LABORAL_EMPLEADO ADD CONSTRAINT FK_EXPERIENCIA_LABORAL_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE FACTURAS ADD CONSTRAINT FK_FACTURAS_CLIENTES FOREIGN KEY (TERC_NIT) REFERENCES CLIENTES (TERC_NIT);
ALTER TABLE FACTURAS ADD CONSTRAINT FK_FACTURAS_PTOVENTA FOREIGN KEY (PTVT_ID) REFERENCES PUNTO_VENTA (PTVT_ID);
ALTER TABLE FACTURAS ADD CONSTRAINT FK_FACTURAS_VENDEDOR FOREIGN KEY (VEND_COD) REFERENCES VENDEDORES (VEND_COD);
ALTER TABLE FACTURAS_COMPRA ADD CONSTRAINT FK_FACTCOMP_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE FACTURAS_COMPRA ADD CONSTRAINT FK_FACTCOMP_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE FACTURAS_COMPRA ADD CONSTRAINT FK_FACTCOMP_PROVEEDO FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
ALTER TABLE FACTURAS_COMPRAS_DETALLE ADD CONSTRAINT FK_FACTCOMPD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE FACTURAS_COMPRAS_DETALLE ADD CONSTRAINT FK_FACTCOMPD_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE FACTURAS_COMPRAS_DETALLE ADD CONSTRAINT FK_FACTCOMPD_FACTCOMP FOREIGN KEY (FACO_ID) REFERENCES FACTURAS_COMPRA (FACO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE FACTURAS_CONTADO_PAGO ADD CONSTRAINT FK_FACTURAS_CONTADO_PAGO_1 FOREIGN KEY (FCNT_ID) REFERENCES FACTURAS (FACT_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE FACTURAS_DETALLE ADD CONSTRAINT FK_FACTDET_FACTURAS FOREIGN KEY (FACT_ID) REFERENCES FACTURAS (FACT_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE FACTURAS_DETALLE ADD CONSTRAINT FK_FACTURADE_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE FACTURAS_DETALLE ADD CONSTRAINT FK_FACTURADE_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
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 FACTURA_PROFORMA ADD CONSTRAINT FK_FACTURA_PROFORMA_1 FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE FACTURA_PROFORMA ADD CONSTRAINT FK_SOLICITUD_FACTPROFORM_2 FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
ALTER TABLE FACTURA_PROFORMA ADD CONSTRAINT FK_SOLICITUD_FACTPROFORM_4 FOREIGN KEY (TIMO_COD) REFERENCES TIPOS_MONEDA (TIMO_COD);
ALTER TABLE FACTURA_PROFORMA_DET ADD CONSTRAINT FK_FACPRO_REFERENCE_FACPRO FOREIGN KEY (FAPO_ID) REFERENCES FACTURA_PROFORMA (FAPO_ID);
ALTER TABLE FACTURA_PROFORMA_DET ADD CONSTRAINT FK_FACTURA_PROFORMA_DET_1 FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE FORMATOCONTABLE_DETALLE ADD CONSTRAINT FK_FORMATOCONTABLE_DETALLE_1 FOREIGN KEY (FOCO_ID) REFERENCES FORMATOS_CONTABLES (FOCO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE FORMATOCONTABLE_TEXTOS ADD CONSTRAINT FK_FORMATOCONTABLE_TEXTOS_1 FOREIGN KEY (FOCO_ID) REFERENCES FORMATOS_CONTABLES (FOCO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE FORMATO_DATOS ADD CONSTRAINT FK_FORMATO_DATOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES FORMATOS (TIDO_COD, PREF_PRE) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE FORMATO_LINEAS ADD CONSTRAINT FK_FORMATO_LINEAS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES FORMATOS (TIDO_COD, PREF_PRE) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE HORARIO_EMPLEADO_DET ADD CONSTRAINT FK_HORARIO_EMPLEADO_DET_2 FOREIGN KEY (HOEM_ID) REFERENCES HORARIO_EMPLEADO (HOEM_ID);
ALTER TABLE INCAPACIDADES ADD CONSTRAINT FK_INCAPACI_FK_EMPLEA_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE INTERFAZ_BANCOS_CTAS ADD CONSTRAINT FK_INTERFAZ_BANCOS_CTAS FOREIGN KEY (INBA_ID) REFERENCES INTERFAZ_BANCOS (INBA_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE INTERFAZ_CAJA_CTAS ADD CONSTRAINT FK_INTERFAZ_CAJA_CTAS FOREIGN KEY (INCJ_ID) REFERENCES INTERFAZ_CAJA (INCJ_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE INTERFAZ_CARTERA_CTAS ADD CONSTRAINT FK_INTERFAZ_CARTERA_CTAS FOREIGN KEY (INCA_ID) REFERENCES INTERFAZ_CARTERA (INCA_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE INTERFAZ_COMPRAS_CTAS ADD CONSTRAINT FK_INTCOMPRACTAS_INTCOMPRA FOREIGN KEY (INCO_ID) REFERENCES INTERFAZ_COMPRAS (INCO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE INTERFAZ_CXPAGAR_CTAS ADD CONSTRAINT FK_INTERFAZ_CXPAGAR_CTAS FOREIGN KEY (INCP_ID) REFERENCES INTERFAZ_CXPAGAR (INCP_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE INTERFAZ_INVENTARIO_CTAS ADD CONSTRAINT FK_INTINVENCTAS_INTINVEN FOREIGN KEY (ININ_ID) REFERENCES INTERFAZ_INVENTARIO (ININ_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE INTERFAZ_VENTAS_CTAS ADD CONSTRAINT FK_INTVENTACTAS_INTVENTA FOREIGN KEY (INVE_ID) REFERENCES INTERFAZ_VENTAS (INVE_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE LIQUIDACION ADD CONSTRAINT FK_LIQUIDAC_FK_EMPLEA_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE LISTAPREC_VENDEDOR ADD CONSTRAINT FK_LISTAPRVN_LISTA_PR FOREIGN KEY (LIPR_COD) REFERENCES LISTA_PRECIOS (LIPR_COD);
ALTER TABLE LISTAPREC_VENDEDOR ADD CONSTRAINT FK_LISTAPRVN_VENDEDOR FOREIGN KEY (VEND_COD) REFERENCES VENDEDORES (VEND_COD);
ALTER TABLE LOTES ADD CONSTRAINT FK_LOTESART_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE MANIFIESTOS_CARGA_CONC ADD CONSTRAINT FK_MANIFIESTOS_CARGA_CONC_1 FOREIGN KEY (MANC_ID) REFERENCES MANIFIESTO_CARGA (MANC_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE MANIFIESTO_CARGA_DET ADD CONSTRAINT FK_MANIFIESTO_CARGA_DET_1 FOREIGN KEY (MANC_ID) REFERENCES MANIFIESTO_CARGA (MANC_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE MEDIOSMAG_CUENTAS ADD CONSTRAINT FK_MEDIOSMAG_CUENTAS_1 FOREIGN KEY (MMCU_ITEM) REFERENCES CONFIGURA_MEDIOSMAG (COME_ITEM) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE MEDIOSMAG_DISTR_CUENTAS ADD CONSTRAINT FK_MEDIOSMAG_DISTR_CUENTAS_1 FOREIGN KEY (MMDI_ARTICULO, MMDI_ANO) REFERENCES MEDIOSMAG_DISTRITALES (MMDI_ARTICULO, MMDI_ANO) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE MODULOS ADD CONSTRAINT FK_PROGRAMA FOREIGN KEY (PROG_ID) REFERENCES PROGRAMAS (PROG_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE MOVIMIENTO_ARTICULO ADD CONSTRAINT FK_MOVIARTI_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE MOVIMIENTO_ARTICULO ADD CONSTRAINT FK_MOVIARTI_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE MOVIMIENTO_BANCO ADD CONSTRAINT FK_MOVBCO_CUENTAS FOREIGN KEY (CUBA_COD) REFERENCES CUENTAS_BANCO (CUBA_COD);
ALTER TABLE MOVIMIENTO_CAJA ADD CONSTRAINT FK_MOVCAJA_CAJAS FOREIGN KEY (CAJA_ID) REFERENCES CAJAS (CAJA_ID);
ALTER TABLE MOVIMIENTO_CLIENTES ADD CONSTRAINT FK_MOVICLIE_CLIENTES FOREIGN KEY (TERC_NIT) REFERENCES CLIENTES (TERC_NIT);
ALTER TABLE MOVIMIENTO_PROVEEDOR ADD CONSTRAINT FK_MOVPROV_PROVEEDO FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
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;
ALTER TABLE NOMINA_COMISIONES ADD CONSTRAINT FK_NOMINA_COMISIONES_2 FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);
ALTER TABLE NOMINA_COMISIONES_PROV ADD CONSTRAINT FK_NOMINA_COMISIONES_PROV_2 FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (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_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 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_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;
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 NOMINA_NOVEDADES_DETALLE ADD CONSTRAINT FK_NOMINA_NOVEDADES_DETALLE_1 FOREIGN KEY (NONO_ID) REFERENCES NOMINA_NOVEDADES (NONO_ID);
ALTER TABLE NOMINA_VALOR_PREDET ADD CONSTRAINT FK_NOMINA_VALORPREDET FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);
ALTER TABLE NOTAS_CREDITO_CLIENTES ADD CONSTRAINT FK_NOTACRCLI_COBRADOR FOREIGN KEY (COBR_COD) REFERENCES COBRADORES (COBR_COD);
ALTER TABLE NOTAS_CREDITO_CLIENTES ADD CONSTRAINT FK_NOTACRC_CLIENTES FOREIGN KEY (TERC_NIT) REFERENCES CLIENTES (TERC_NIT);
ALTER TABLE NOTAS_CREDITO_CLIENTES ADD CONSTRAINT FK_NOTACRC_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE NOTAS_CREDITO_PROVEEDOR ADD CONSTRAINT FK_NOTACRP_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE NOTAS_DEBITO_CLIENTES ADD CONSTRAINT FK_NOTADBCLIE_COBRADOR FOREIGN KEY (COBR_COD) REFERENCES COBRADORES (COBR_COD);
ALTER TABLE NOTAS_DEBITO_CLIENTES ADD CONSTRAINT FK_NOTASDBCL_CLIENTES FOREIGN KEY (TERC_NIT) REFERENCES CLIENTES (TERC_NIT);
ALTER TABLE NOTAS_DEBITO_CLIENTES ADD CONSTRAINT FK_NOTASDBCL_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE NOTAS_DEBITO_PROVEEDOR ADD CONSTRAINT FK_NOTADBPR_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE OPCIONES ADD CONSTRAINT FK_OPCIONES_1 FOREIGN KEY (PROG_ID, MODU_ID) REFERENCES MODULOS (PROG_ID, MODU_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ORDENES_COMPRA ADD CONSTRAINT FK_ORDENCMP_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE ORDENES_COMPRA ADD CONSTRAINT FK_ORDENCMP_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE ORDENES_COMPRA ADD CONSTRAINT FK_ORDENCMP_PROVEEDO FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
ALTER TABLE ORDENES_COMPRA_DETALLE ADD CONSTRAINT FK_ORDENCMPD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE ORDENES_COMPRA_DETALLE ADD CONSTRAINT FK_ORDENCMPD_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE ORDENES_COMPRA_DETALLE ADD CONSTRAINT FK_ORDENCMPD_ORDENCMP FOREIGN KEY (ORDC_ID) REFERENCES ORDENES_COMPRA (ORDC_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ORDENES_COMPRA_DOCRELA ADD CONSTRAINT FK_ORDENES_COMPRA_DOCRELA FOREIGN KEY (ORDC_ID) REFERENCES ORDENES_COMPRA (ORDC_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ORDENES_INVENTARIO ADD CONSTRAINT FK_ORDENES_INVENTARIO_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE ORDENES_INVENTARIO ADD CONSTRAINT FK_ORDENINV_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE ORDENINVENTARIO_DETALLE ADD CONSTRAINT FK_ORDENINVD_ORDENINV FOREIGN KEY (ORIN_ID) REFERENCES ORDENES_INVENTARIO (ORIN_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ORDENINVENTARIO_DETALLE ADD CONSTRAINT FK_ORDENINVENTARIO_DET_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT FK_ORDEN_EMBARQUE_2 FOREIGN KEY (FOPA_COD) REFERENCES FORMAS_PAGO (FOPA_ID);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT FK_ORDEN_EMBARQUE_3 FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT FK_ORDEN_EMBARQUE_4 FOREIGN KEY (TRAN_NIT) REFERENCES TRANSPORTADORES_INTERNAC (TERC_NIT);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT FK_ORDEN_EM_REFERENCE_FORMA_PA FOREIGN KEY (FOPA_COD) REFERENCES FORMA_PAGOS (FOPA_COD);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT FK_SOLICITU_REFERENCE_LUGAR_IN FOREIGN KEY (LUIN_COD) REFERENCES LUGAR_INSPECCION (LUIN_COD);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT FK_SOLICITU_REFERENCE_MEDIOS_T FOREIGN KEY (META_COD) REFERENCES MEDIOS_TRANSPORTE (META_COD);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT FK_SOLICITU_REFERENCE_MODO_TRA FOREIGN KEY (MOTA_COD) REFERENCES MODO_TRANSPORTE (MOTA_COD);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT FK_SOLICITU_REFERENCE_TIPOS_EM FOREIGN KEY (TIEM_COD) REFERENCES TIPOS_EMBARQUE (TIEM_COD);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT FK_SOLICITU_REFERENCE_TIPO_CAR FOREIGN KEY (TICA_COD) REFERENCES TIPO_CARGA (TICA_COD);
ALTER TABLE ORDEN_EMBARQUE ADD CONSTRAINT FK_SOLICITU_REFERENCE_UNIDADES FOREIGN KEY (UNCA_COD) REFERENCES UNIDADES_CARGA (UNCA_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) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PAGO_NOMINA_EGRESOS ADD CONSTRAINT FK_PAGO_NOMINA_EGRESOS_1 FOREIGN KEY (PGNO_ID) REFERENCES PAGO_NOMINA (PGNO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PEDIDOS ADD CONSTRAINT FK_PEDIDOS_CLIENTES FOREIGN KEY (TERC_NIT) REFERENCES CLIENTES (TERC_NIT);
ALTER TABLE PEDIDOS ADD CONSTRAINT FK_PEDIDOS_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE PEDIDOS ADD CONSTRAINT FK_PEDIDOS_VENDEDOR FOREIGN KEY (VEND_COD) REFERENCES VENDEDORES (VEND_COD);
ALTER TABLE PEDIDOS_DETALLE ADD CONSTRAINT FK_PEDIDOSD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE PEDIDOS_DETALLE ADD CONSTRAINT FK_PEDIDOSD_PEDIDOS FOREIGN KEY (PEDI_ID) REFERENCES PEDIDOS (PEDI_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PEDIDOS_DOCRELA ADD CONSTRAINT FK_PEDIDOCREL_PEDIDO FOREIGN KEY (PEDI_ID) REFERENCES PEDIDOS (PEDI_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PENDIENTE_VENTAS_DETALLE ADD CONSTRAINT FK_PENDIENTE_VENTAS_DETALLE_1 FOREIGN KEY (PEND_ID) REFERENCES PENDIENTE_VENTAS (PEND_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PERIODO_PAGO_NOMBRE ADD CONSTRAINT FK_PERIODO_PAGO_NOMBRE_2 FOREIGN KEY (PPAG_COD) REFERENCES PERIODO_PAGO (PPAG_COD);
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;
ALTER TABLE PLANILLA_PASAJEROS_CON ADD CONSTRAINT FK_PLANILLA_PASAJEROS_CON_1 FOREIGN KEY (PLPA_ID) REFERENCES PLANILLA_PASAJEROS (PLPA_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PLANILLA_PASAJEROS_DET ADD CONSTRAINT FK_PLANILLA_PASAJEROS_DET_1 FOREIGN KEY (PLPA_ID) REFERENCES PLANILLA_PASAJEROS (PLPA_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PLANILLA_PASAJEROS_REM ADD CONSTRAINT FK_PLANILLA_PASAJEROS_REM_1 FOREIGN KEY (PLPA_ID) REFERENCES PLANILLA_PASAJEROS (PLPA_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PLANTILLA_DETALLE ADD CONSTRAINT FK_PLANTILLAD_CUENTAS FOREIGN KEY (CUEN_COD) REFERENCES CUENTAS (CUEN_COD);
ALTER TABLE PLANTILLA_DETALLE ADD CONSTRAINT FK_PLANTILLAD_PLANTILLA FOREIGN KEY (PLAN_ID) REFERENCES PLANTILLA_ENCABEZADO (PLAN_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PLANTILLA_DETALLE_NIIF ADD CONSTRAINT FK_PLANTILLADN_CUENTAS FOREIGN KEY (CUEN_COD) REFERENCES CUENTAS_NIIF (CUEN_COD);
ALTER TABLE PLANTILLA_DETALLE_NIIF ADD CONSTRAINT FK_PLANTILLADN_PLANTILLA FOREIGN KEY (PLAN_ID) REFERENCES PLANTILLA_ENCABEZADO (PLAN_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PLANTILLA_ENCABEZADO ADD CONSTRAINT FK_PLANTILLA_PREFIJOS FOREIGN KEY (TICO_COD, PRCO_PREF) REFERENCES PREFIJOS_CONTA (TICO_COD, PRCO_PREF);
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;
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;
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_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;
ALTER TABLE PRECIOS_ARTICULO ADD CONSTRAINT FK_PRECIOSART_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PRECIOS_ARTICULO ADD CONSTRAINT FK_PRECIOSART_LISTAPR FOREIGN KEY (LIPR_COD) REFERENCES LISTA_PRECIOS (LIPR_COD);
ALTER TABLE PREFIJOS ADD CONSTRAINT FK_PREFIJOS_TIPO_DOC FOREIGN KEY (TIDO_COD) REFERENCES TIPO_DOCUMENTO (TIDO_COD);
ALTER TABLE PREFIJOS_BANCOS ADD CONSTRAINT FK_PREFBCO_CUENTAS FOREIGN KEY (CUBA_COD) REFERENCES CUENTAS_BANCO (CUBA_COD);
ALTER TABLE PREFIJOS_CONTA ADD CONSTRAINT FK_PREFCONTA_TIPOCOM FOREIGN KEY (TICO_COD) REFERENCES TIPO_COMPROBANTE (TICO_COD);
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 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;
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_ENC ADD CONSTRAINT FK_PRODUCCION_ENTRADA_ENC_1 FOREIGN KEY (PROR_ID) REFERENCES PRODUCCION_ORDEN (PROR_ID);
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;
ALTER TABLE PRODUCCION_ORDEN ADD CONSTRAINT FK_PRODUCCION_ORDEN_1 FOREIGN KEY (PROR_PRODUCTO) REFERENCES ARTICULO (ARTI_COD);
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_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;
ALTER TABLE PROGRAM_VACACIONES ADD CONSTRAINT FK_PROGRAM_VACACIONES_2 FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE PROVEEDORES ADD CONSTRAINT FK_PROVEEDOR_GRUPOSPRV FOREIGN KEY (GRPR_COD) REFERENCES GRUPOS_PROVEEDORES (GRPR_COD);
ALTER TABLE PROVEEDORES ADD CONSTRAINT FK_PROVEEDOR_TERCEROS FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE PROVEEDOR_ARTICULO ADD CONSTRAINT FK_PROVARTI_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE PROVEEDOR_ARTICULO ADD CONSTRAINT FK_PROVARTI_PROVEEDOR FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
ALTER TABLE PUC ADD CONSTRAINT FK_PUC_TIPOPUC FOREIGN KEY (TIPU_COD) REFERENCES TIPO_PUC (TIPU_COD);
ALTER TABLE PUNTO_VENTA ADD CONSTRAINT FK_PTOVENTA_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE RECIBOS_CAJA ADD CONSTRAINT FK_RECICAJA_CAJAS FOREIGN KEY (CAJA_ID) REFERENCES CAJAS (CAJA_ID);
ALTER TABLE RECIBOS_CAJA ADD CONSTRAINT FK_RECICAJA_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
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 RECIBOS_CAJA_DETALLE ADD CONSTRAINT FK_RECICAJA_DETALLE_RECICAJA FOREIGN KEY (RECA_ID) REFERENCES RECIBOS_CAJA (RECA_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE RECIBOS_CAJA_PAGO ADD CONSTRAINT FK_RECICAJAP_FORMAPAGO FOREIGN KEY (FOPA_ID) REFERENCES FORMAS_PAGO (FOPA_ID);
ALTER TABLE RECIBOS_CAJA_PAGO ADD CONSTRAINT FK_RECICAJAP_RECICAJA FOREIGN KEY (RECA_ID) REFERENCES RECIBOS_CAJA (RECA_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE RECIBO_PROVISIONAL ADD CONSTRAINT FK_RECIPROV_CAJAS FOREIGN KEY (CAJA_ID) REFERENCES CAJAS (CAJA_ID);
ALTER TABLE RECIBO_PROVISIONAL ADD CONSTRAINT FK_RECIPROV_CLIENTES FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);
ALTER TABLE RECIBO_PROVISIONAL ADD CONSTRAINT FK_RECIPROV_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE RECIBO_PROVISIONAL ADD CONSTRAINT FK_RECIPROV_VENDEDOR FOREIGN KEY (VEND_COD) REFERENCES VENDEDORES (VEND_COD);
ALTER TABLE RECIBO_PROVISIONAL_DETALLE ADD CONSTRAINT FK_RECIPROVD_RECIPROV FOREIGN KEY (RCPR_ID) REFERENCES RECIBO_PROVISIONAL (RCPR_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE RECIBO_PROVISIONAL_PAGO ADD CONSTRAINT FK_RECIPROVP_FORMAPAGO FOREIGN KEY (FOPA_ID) REFERENCES FORMAS_PAGO (FOPA_ID);
ALTER TABLE RECIBO_PROVISIONAL_PAGO ADD CONSTRAINT FK_RECIPROVP_RECIPROV FOREIGN KEY (RCPR_ID) REFERENCES RECIBO_PROVISIONAL (RCPR_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE REGISTRO_CONCEPTOS ADD CONSTRAINT FK_REGICONC_CONCEPTO FOREIGN KEY (CONC_COD) REFERENCES CONCEPTOS (CONC_COD) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE REGISTRO_CONCEPTOS ADD CONSTRAINT FK_REGICONC_REGISTRO FOREIGN KEY (REAU_COD) REFERENCES REGISTRO_AUTOMATICO (REAU_COD) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE REMISIONES_VENTA ADD CONSTRAINT FK_REMIVTAS_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE REMISIONES_VENTA ADD CONSTRAINT FK_REMIVTAS_CLIENTES FOREIGN KEY (TERC_NIT) REFERENCES CLIENTES (TERC_NIT);
ALTER TABLE REMISIONES_VENTA ADD CONSTRAINT FK_REMIVTAS_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE REMISIONES_VENTA ADD CONSTRAINT FK_REMIVTAS_VENDEDOR FOREIGN KEY (VEND_COD) REFERENCES VENDEDORES (VEND_COD);
ALTER TABLE REMISIONES_VENTA_DETALLE ADD CONSTRAINT FK_REMIVTADE_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE REMISIONES_VENTA_DETALLE ADD CONSTRAINT FK_REMIVTADE_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE REMISIONES_VENTA_DETALLE ADD CONSTRAINT FK_REMIVTADE_REMIVTAS FOREIGN KEY (REVT_ID) REFERENCES REMISIONES_VENTA (REVT_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE REMISIONES_VENTA_DOCRELA ADD CONSTRAINT FK_REVTDOCREL_REMIVENTA FOREIGN KEY (REVT_ID) REFERENCES REMISIONES_VENTA (REVT_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE REMISION_PROVEEDOR ADD CONSTRAINT FK_REMIPROV_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE REMISION_PROVEEDOR ADD CONSTRAINT FK_REMIPROV_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE REMISION_PROVEEDOR ADD CONSTRAINT FK_REMIPROV_PROVEEDO FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
ALTER TABLE REMISION_PROVEEDOR_DET ADD CONSTRAINT FK_REMIPROVD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE REMISION_PROVEEDOR_DET ADD CONSTRAINT FK_REMIPROVD_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE REMISION_PROVEEDOR_DET ADD CONSTRAINT FK_REMIPROVD_REMIPROV FOREIGN KEY (REPR_ID) REFERENCES REMISION_PROVEEDOR (REPR_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE REMISION_PROVEEDOR_DOCRELA ADD CONSTRAINT FK_REMISION_PROVEEDOR_DOCRELA FOREIGN KEY (REPR_ID) REFERENCES REMISION_PROVEEDOR (REPR_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE RESERVAS ADD CONSTRAINT FK_RESERVAS_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE RESERVAS ADD CONSTRAINT FK_RESERVAS_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE RESERVAS_DETALLE ADD CONSTRAINT FK_RESERVASD_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE RESERVAS_DETALLE ADD CONSTRAINT FK_RESERVASD_RESERVAS FOREIGN KEY (RESE_ID) REFERENCES RESERVAS (RESE_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE RESPUESTA_TIPOCUENTA ADD CONSTRAINT FK_RESPTA_TIPOCUE FOREIGN KEY (TICU_ITEM) REFERENCES TIPO_CUENTAS (TICU_ITEM);
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;
ALTER TABLE RUTA_HORAS_PASAJEROS ADD CONSTRAINT FK_RUTA_HORAS_PASAJEROS_1 FOREIGN KEY (RUTA_ID) REFERENCES CORREDOR_RUTA (CORU_ID);
ALTER TABLE RUTA_PASAJEROS ADD CONSTRAINT FK_RUTA_PASAJEROS_1 FOREIGN KEY (RUTA_CORREDOR) REFERENCES CORREDOR_RUTA (CORU_ID);
ALTER TABLE RUTERO_DETALLE ADD CONSTRAINT FK_RUTERO_DETALLE_1 FOREIGN KEY (RUTE_ID) REFERENCES RUTERO (RUTE_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE SALDOS_ARTICULO_NIIF ADD CONSTRAINT FK_SALDARTI_ARTICULO_NIIF FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE SALDOS_CENTROS ADD CONSTRAINT FK_SALDOCENT_CENTROS FOREIGN KEY (PROY_COD, CENT_COD) REFERENCES CENTROS (PROY_COD, CENT_COD);
ALTER TABLE SALDOS_CENTROS_NIIF ADD CONSTRAINT FK_SALDOCENT_CENTROS_NIIF FOREIGN KEY (PROY_COD, CENT_COD) REFERENCES CENTROS (PROY_COD, CENT_COD);
ALTER TABLE SALDOS_CUENTAS ADD CONSTRAINT FK_SALDOCUENTA_CUENTAS FOREIGN KEY (CUEN_COD) REFERENCES CUENTAS (CUEN_COD);
ALTER TABLE SALDOS_CUENTAS_NIIF ADD CONSTRAINT FK_SALDOCUENTA_CUENTAS_NIIF FOREIGN KEY (CUEN_COD) REFERENCES CUENTAS_NIIF (CUEN_COD);
ALTER TABLE SALDO_BANCOS ADD CONSTRAINT FK_SALDOBCOS_CTASBCO FOREIGN KEY (CUBA_COD) REFERENCES CUENTAS_BANCO (CUBA_COD);
ALTER TABLE SALDO_BANCOS_CONF ADD CONSTRAINT FK_SALDOBCOSCONF_CTASBCO FOREIGN KEY (CUBA_COD) REFERENCES CUENTAS_BANCO (CUBA_COD);
ALTER TABLE SALDO_EFECTIVO ADD CONSTRAINT FK_SALDOEF_CAJAS FOREIGN KEY (CAJA_ID) REFERENCES CAJAS (CAJA_ID);
ALTER TABLE SALIDAS ADD CONSTRAINT FK_SALIDAS_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE SALIDAS ADD CONSTRAINT FK_SALIDAS_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE SALIDAS_DETALLE ADD CONSTRAINT FK_SALIDASD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE SALIDAS_DETALLE ADD CONSTRAINT FK_SALIDASD_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE SALIDAS_DETALLE ADD CONSTRAINT FK_SALIDASD_SALIDAS FOREIGN KEY (SALI_ID) REFERENCES SALIDAS (SALI_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE SECCION ADD CONSTRAINT FK_SECCION_FK_SECC_D_DEPARTAM FOREIGN KEY (DPTO_COD) REFERENCES DEPARTAMENTO (DPTO_COD);
ALTER TABLE SOLICITUD_IMPORTACION ADD CONSTRAINT FK_SOLICITUD_IMPORTACION_2 FOREIGN KEY (TERC_NIT) REFERENCES PROVEEDORES (TERC_NIT);
ALTER TABLE SOLICITUD_IMPORTACION ADD CONSTRAINT FK_SOLICITUD_IMPORTACION_3 FOREIGN KEY (TACA_ID) REFERENCES TASA_CAMBIO_MONEDA (TACA_ID);
ALTER TABLE SOLICITUD_IMPORTACION ADD CONSTRAINT FK_SOLICITUD_IMPORTACION_4 FOREIGN KEY (TIMO_COD) REFERENCES TIPOS_MONEDA (TIMO_COD);
ALTER TABLE SOLICITUD_IMPORTACION ADD CONSTRAINT FK_SOLICITU_REFERENCE_FORMA_PA FOREIGN KEY (FOPA_COD) REFERENCES FORMA_PAGOS (FOPA_COD);
ALTER TABLE SOLICITUD_IMPORTACION ADD CONSTRAINT FK_SOLICITU_REFERENCE_TERM_COM FOREIGN KEY (TERM_COD) REFERENCES TERMINOS_COMERCIO_INT (TERM_COD);
ALTER TABLE SOLICITUD_IMPORTACION_DET ADD CONSTRAINT FK_SOLICITU_REFERENCE_SOLICITU FOREIGN KEY (SLIM_ID) REFERENCES SOLICITUD_IMPORTACION (SLIM_ID);
ALTER TABLE SUBGRUPO ADD CONSTRAINT FK_SUBGRUPO_GRUPO FOREIGN KEY (GRUP_COD) REFERENCES GRUPO (GRUP_COD);
ALTER TABLE SUBTIPO_COTIZANTE ADD CONSTRAINT FK_SUBTIPO__FK_SUBTIP_TIPO_COT FOREIGN KEY (TCOT_COD) REFERENCES TIPO_COTIZANTE (TCOT_COD);
ALTER TABLE TASA_CAMBIO_MONEDA ADD CONSTRAINT FK_TASA_CAMBIO_MONEDA_2 FOREIGN KEY (TIMO_COD) REFERENCES TIPOS_MONEDA (TIMO_COD);
ALTER TABLE TAXONOMIA_DETALLE ADD CONSTRAINT FK_TAXONOMIA_DETALLE_1 FOREIGN KEY (TAXO_ID, TAXE_ID) REFERENCES TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE TAXONOMIA_ENCABEZA ADD CONSTRAINT FK_TAXONOMIA_ENCABEZA_1 FOREIGN KEY (TAXO_ID) REFERENCES TAXONOMIA (TAXO_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE TERCEROS_CONTACTOS ADD CONSTRAINT FK_TERCEROS_CONTACTOS_1 FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE TRANSPORTADORES_INTERNAC ADD CONSTRAINT FK_TRANSPORTADORES_INTERNAC_2 FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);
ALTER TABLE TRASFERENCIAS ADD CONSTRAINT FK_TRASFER_BODEGA FOREIGN KEY (BODE_COD) REFERENCES BODEGA (BODE_COD);
ALTER TABLE TRASFERENCIAS ADD CONSTRAINT FK_TRASFER_PREFIJOS FOREIGN KEY (TIDO_COD, PREF_PRE) REFERENCES PREFIJOS (TIDO_COD, PREF_PRE);
ALTER TABLE TRASFERENCIAS_DETALLE ADD CONSTRAINT FK_TRASFERD_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);
ALTER TABLE TRASFERENCIAS_DETALLE ADD CONSTRAINT FK_TRASFERD_TRASFER FOREIGN KEY (TRAN_ID) REFERENCES TRASFERENCIAS (TRAN_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE TRASLADOS_CAJA_DET ADD CONSTRAINT FK_TRASCAJADET_TRASCAJA FOREIGN KEY (TRCJ_ID) REFERENCES TRASLADOS_CAJA (TRCJ_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE UNIDAD_ARTICULO ADD CONSTRAINT FK_UNIDADART_ARTICULO FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE VACACIONES ADD CONSTRAINT FK_VACACION_FK_EMPLEA_EMPLEADO FOREIGN KEY (TERC_NIT) REFERENCES EMPLEADOS (TERC_NIT);
ALTER TABLE VACACIONES_DETALLE ADD CONSTRAINT FK_VACACIONES_DETALLE_1 FOREIGN KEY (VACA_ID) REFERENCES VACACIONES (VACA_ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE VACACIONES_DISFRUT_DET ADD CONSTRAINT FK_VACACIONES_DISFRUT_DET_2 FOREIGN KEY (VADI_ID) REFERENCES VACACIONES_DISFRUT (VADI_ID);
ALTER TABLE VEHICULOS ADD CONSTRAINT FK_VEHICULOS_TERCERO FOREIGN KEY (TERC_NIT) REFERENCES TERCEROS (TERC_NIT);


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX AJUSTES_IDX1 ON AJUSTES (AJUS_NUMERO);
CREATE INDEX AJUSTES_IDX2 ON AJUSTES (AJUS_FECHA);
CREATE INDEX ANTICIPOS_CLIENTE_IDX1 ON ANTICIPOS_CLIENTE (RECA_ID);
CREATE INDEX ANTICIPOS_PROVEEDOR_IDX1 ON ANTICIPOS_PROVEEDOR (EGRE_ID);
CREATE INDEX APERTURA_NIIF_DET_IDX1 ON APERTURA_NIIF_DET (APND_CUENTA);
CREATE INDEX APERTURA_NIIF_DET_IDX2 ON APERTURA_NIIF_DET (APND_CTANIIF);
CREATE INDEX APLICACION_CLIENTE_IDX1 ON APLICACION_CLIENTE (APCL_FECHA);
CREATE INDEX APLICACION_CLIENTE_DETALLE_IDX1 ON APLICACION_CLIENTE_DETALLE (ACDE_IDDOC);
CREATE INDEX ARTICULO_IDX1 ON ARTICULO (ARTI_DES);
CREATE INDEX AUDITORIA_IDX1 ON AUDITORIA (TIDO_COD, AUDI_IDDOC);
CREATE INDEX AUDITORIA_IDX2 ON AUDITORIA (AUDI_FECHA);
CREATE INDEX AUDITORIA_IDX3 ON AUDITORIA (AUDI_USUARIO);
CREATE INDEX AUDITORIA_IDX4 ON AUDITORIA (AUDI_COD, TIDO_COD, AUDI_IDDOC);
CREATE DESCENDING INDEX AUDITORIA_IDX5 ON AUDITORIA (AUDI_FECHA, AUDI_HORA);
CREATE INDEX AUTORIZACIONES_IDX1 ON AUTORIZACIONES (PREF_PRE);
CREATE INDEX CAMBIA_PRECIOS_IDX1 ON CAMBIA_PRECIOS (ARTI_COD, LIPR_COD, CAPR_FECHA);
CREATE INDEX CAMBIO_DOCUMENTOS_IDX1 ON CAMBIO_DOCUMENTOS (CADO_NUMERO);
CREATE INDEX CARGA_PRODUCTOS_IDX1 ON CARGA_PRODUCTOS (CGPR_DESC);
CREATE INDEX CLIENTES_IDX1 ON CLIENTES (CLIE_COD);
CREATE INDEX COMISIONES_POR_PAGAR_IDX1 ON COMISIONES_POR_PAGAR (CMPP_NIT);
CREATE INDEX COMISIONES_POR_PAGAR_IDX2 ON COMISIONES_POR_PAGAR (CMPP_VEND);
CREATE INDEX COMPROBANTE_DETALLE_IDX1 ON COMPROBANTE_DETALLE (CUEN_COD, TERC_NIT);
CREATE INDEX COMPROBANTE_DETALLE_IDX2 ON COMPROBANTE_DETALLE (TERC_NIT);
CREATE INDEX COMPROBANTE_DETALLE_NIIF_IDX1 ON COMPROBANTE_DETALLE_NIIF (CUEN_COD, TERC_NIT);
CREATE INDEX COMPROBANTE_DETALLE_NIIF_IDX2 ON COMPROBANTE_DETALLE_NIIF (TERC_NIT);
CREATE INDEX COMPROBANTE_ENCABEZADO_IDX1 ON COMPROBANTE_ENCABEZADO (ENCO_TIPOREF, ENCO_FECHA);
CREATE INDEX COMPROBANTE_ENCABEZADO_IDX2 ON COMPROBANTE_ENCABEZADO (ENCO_TIPOREF, ENCO_IDREF);
CREATE INDEX COMPROBANTE_ENCABEZADO_IDX3 ON COMPROBANTE_ENCABEZADO (ENCO_FECHA);
CREATE INDEX CONFIGURA_MEDIOSMAG_IDX1 ON CONFIGURA_MEDIOSMAG (COME_FORMATO);
CREATE INDEX CONSIGNA_IDX1 ON CONSIGNA (PRBA_PREF, CONS_NUMERO);
CREATE INDEX CONSIGNA_IDX2 ON CONSIGNA (CUBA_COD);
CREATE INDEX CONSIGNA_IDX3 ON CONSIGNA (CONS_FECHA);
CREATE INDEX CONSIGNA_TARJETAS_IDX1 ON CONSIGNA_TARJETAS (COTJ_FECHA);
CREATE INDEX CONSIGNA_TARJETAS_IDX2 ON CONSIGNA_TARJETAS (PREF_PRE, COTJ_NUMERO);
CREATE INDEX CONSOLIDADO_FALTANTES_IDX1 ON CONSOLIDADO_FALTANTES (COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, COFA_TIPODES);
CREATE INDEX CONSOLIDADO_FALTANTES_IDX2 ON CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, ARTI_COD);
CREATE INDEX CONSOLIDE_FALTANTES_IDX1 ON CONSOLIDE_FALTANTES (CEFA_IDORI, CEFA_TIPOORI, CEFA_TIPODES);
CREATE INDEX CONSOLIDE_FALTANTES_IDX2 ON CONSOLIDE_FALTANTES (CEFA_ID);
CREATE INDEX CONTABILIZACION_IDX1 ON CONTABILIZACION (CNTB_TIPOREF);
CREATE INDEX CONTABILIZACION_IDX2 ON CONTABILIZACION (CNTB_IDREF);
CREATE INDEX CONTABILIZACION_DET_IDX1 ON CONTABILIZACION_DET (CNTB_ID, CNDE_CUENTA);
CREATE INDEX COSTOS_IDX1 ON COSTOS (ARTI_COD, COST_IDMOV);
CREATE INDEX COSTOS_IDX2 ON COSTOS (COST_IDMOV);
CREATE INDEX COSTOSN_IDX1 ON COSTOS_NIIF (ARTI_COD, COST_IDMOV);
CREATE INDEX COSTOSN_IDX2 ON COSTOS_NIIF (COST_IDMOV);
CREATE INDEX COSTO_VENTAS_IDX1 ON COSTO_VENTAS (CTACOS);
CREATE INDEX COSTO_VENTAS_IDX2 ON COSTO_VENTAS (CTAINV);
CREATE INDEX COSTO_VENTAS_N_IDX1 ON COSTO_VENTAS_NIIF (CTACOS);
CREATE INDEX COSTO_VENTAS_N_IDX2 ON COSTO_VENTAS_NIIF (CTAINV);
CREATE INDEX COTIZACIONES_IDX1 ON COTIZACIONES (COTI_NUMERO);
CREATE INDEX COTIZACIONES_IDX2 ON COTIZACIONES (COTI_FECHA);
CREATE DESCENDING INDEX CRM_COMPROMISOS_IDX1 ON CRM_COMPROMISOS (CRCO_NIT, CRCO_FECHA);
CREATE INDEX CRM_COMPROMISOS_IDX2 ON CRM_COMPROMISOS (CRCO_NIT);
CREATE INDEX CRM_COMPROMISOS_IDX3 ON CRM_COMPROMISOS (CRCO_TIPODOC, CRCO_IDDOC);
CREATE INDEX CRM_EVENTOS_IDX1 ON CRM_EVENTOS (CREV_TIPO);
CREATE INDEX CRM_EVENTOS_IDX2 ON CRM_EVENTOS (CREV_ORIGEN);
CREATE DESCENDING INDEX CRM_EVENTOS_IDX3 ON CRM_EVENTOS (CRCL_NIT, CREV_FECHA);
CREATE INDEX CRM_EVENTOS_IDX4 ON CRM_EVENTOS (EVEN_PREF, EVEN_NUMERO);
CREATE INDEX DESENSAMBLES_IDX1 ON DESENSAMBLES (DESE_NUMERO);
CREATE INDEX DESENSAMBLES_IDX2 ON DESENSAMBLES (DESE_FECHA);
CREATE INDEX DEVOLUCIONES_COMPRAS_IDX1 ON DEVOLUCIONES_COMPRAS (DVCO_FECHA);
CREATE INDEX DEVOLUCIONES_COMPRAS_IDX2 ON DEVOLUCIONES_COMPRAS (DVCO_NUMERO);
CREATE INDEX DEVOLUCIONES_VENTAS_IDX1 ON DEVOLUCIONES_VENTAS (VEND_COD, DEVT_FECHA);
CREATE INDEX DEVOLUCIONES_VENTAS_IDX2 ON DEVOLUCIONES_VENTAS (PREF_PRE, DEVT_NUMERO);
CREATE INDEX DEVOLUCIONES_VENTAS_IDX3 ON DEVOLUCIONES_VENTAS (DEVT_FACTID, DEVT_ANULADO);
CREATE INDEX DEVOLUCIONES_VENTAS_IDX4 ON DEVOLUCIONES_VENTAS (DEVT_FECHA);
CREATE INDEX DEVOLUCION_CHEQUES_IDX1 ON DEVOLUCION_CHEQUES (PRBA_PREF, DVCH_NUMDOC);
CREATE INDEX DEVOLUCION_CHEQUES_IDX2 ON DEVOLUCION_CHEQUES (DVCH_CARTERA);
CREATE INDEX DEVOLUCION_CHEQUES_IDX3 ON DEVOLUCION_CHEQUES (DVCH_FECHA);
CREATE INDEX DOCUMENTOS_PAGO_CAJA_IDX1 ON DOCUMENTOS_PAGO_CAJA (DPCA_TIPOENT, DPCA_IDENT);
CREATE INDEX DOCUMENTOS_PAGO_CAJA_IDX2 ON DOCUMENTOS_PAGO_CAJA (FOPA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO);
CREATE INDEX EGRESOS_IDX1 ON EGRESOS (EGRE_TIPO, CAJA_ID);
CREATE INDEX EGRESOS_IDX2 ON EGRESOS (EGRE_NUMERO);
CREATE INDEX EGRESOS_CAJA_IDX1 ON EGRESOS_CAJA (EGCA_FECHA);
CREATE INDEX EMPLEADO_CONCEPTOS_IDX1 ON EMPLEADO_CONCEPTOS (CONC_COD);
CREATE INDEX ENSAMBLES_IDX1 ON ENSAMBLES (ENSA_NUMERO);
CREATE INDEX ENSAMBLES_IDX2 ON ENSAMBLES (ENSA_FECHA);
CREATE INDEX ENSAMBLES_IDX3 ON ENSAMBLES (ENSA_TIPOREF, ENSA_IDREF);
CREATE INDEX ENTRADAS_IDX1 ON ENTRADAS (ENTR_NUMERO);
CREATE INDEX ENTRADAS_IDX2 ON ENTRADAS (ENTR_FECHA);
CREATE INDEX FACTURAS_IDX1 ON FACTURAS (VEND_COD, FACT_FECHA);
CREATE INDEX FACTURAS_IDX2 ON FACTURAS (PREF_PRE, FACT_NUMERO);
CREATE INDEX FACTURAS_IDX3 ON FACTURAS (FACT_FECHA);
CREATE INDEX FACTURAS_IDX4 ON FACTURAS (FACT_CONSOLIDA);
CREATE INDEX FACTURAS_COMPRA_IDX1 ON FACTURAS_COMPRA (FACO_FECHA);
CREATE INDEX FACTURAS_COMPRA_IDX2 ON FACTURAS_COMPRA (FACO_CONSOLIDA);
CREATE INDEX FACTURAS_DETALLE_IDX1 ON FACTURAS_DETALLE (FACT_ID, ARTI_COD);
CREATE INDEX FACTURAS_DETALLE_IDX2 ON FACTURAS_DETALLE (FACT_ID, FADE_CANT);
CREATE INDEX HISTORICO_VENTAS_IDX1 ON HISTORICO_VENTAS (SUCU_ID);
CREATE INDEX INTERFAZ_BANCOS_IDX1 ON INTERFAZ_BANCOS (PREF_PRE);
CREATE INDEX INTERFAZ_BANCOS_IDX2 ON INTERFAZ_BANCOS (TIDO_COD);
CREATE INDEX INTERFAZ_BANCOS_IDX3 ON INTERFAZ_BANCOS (CUBA_COD);
CREATE INDEX INTERFAZ_CAJA_IDX1 ON INTERFAZ_CAJA (PREF_PRE);
CREATE INDEX INTERFAZ_CAJA_IDX2 ON INTERFAZ_CAJA (TIDO_COD);
CREATE INDEX INTERFAZ_CARTERA_IDX1 ON INTERFAZ_CARTERA (PREF_PRE);
CREATE INDEX INTERFAZ_CARTERA_IDX2 ON INTERFAZ_CARTERA (TIDO_COD);
CREATE INDEX INTERFAZ_COMPRAS_IDX1 ON INTERFAZ_COMPRAS (PREF_PRE);
CREATE INDEX INTERFAZ_COMPRAS_IDX2 ON INTERFAZ_COMPRAS (TIDO_COD);
CREATE INDEX INTERFAZ_INVENTARIO_IDX1 ON INTERFAZ_INVENTARIO (PREF_PRE);
CREATE INDEX INTERFAZ_INVENTARIO_IDX2 ON INTERFAZ_INVENTARIO (TIDO_COD);
CREATE INDEX INTERFAZ_NOMINA_IDX2 ON INTERFAZ_NOMINA (TIDO_COD);
CREATE INDEX INTERFAZ_VENTAS_IDX1 ON INTERFAZ_VENTAS (PREF_PRE);
CREATE INDEX INTERFAZ_VENTAS_IDX2 ON INTERFAZ_VENTAS (TIDO_COD);
CREATE INDEX LOTES_IDX1 ON LOTES (LOTE_ID);
CREATE DESCENDING INDEX MOVIMIENTO_ARTICULO_IDX1 ON MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_FECHA);
CREATE INDEX MOVIMIENTO_ARTICULO_IDX2 ON MOVIMIENTO_ARTICULO (MVAR_TIPODOC, MVAR_IDREF, MVAR_ITEM);
CREATE INDEX MOVIMIENTO_ARTICULO_IDX3 ON MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_FECHA);
CREATE INDEX MOVIMIENTO_ARTICULO_IDX4 ON MOVIMIENTO_ARTICULO (ARTI_COD, BODE_COD, MVAR_FECHA);
CREATE INDEX MOVIMIENTO_BANCO_IDX1 ON MOVIMIENTO_BANCO (MOBA_FECHA);
CREATE INDEX MOVIMIENTO_BANCO_IDX2 ON MOVIMIENTO_BANCO (MOBA_TIPOREF);
CREATE INDEX MOVIMIENTO_CAJA_IDX1 ON MOVIMIENTO_CAJA (MOCA_TIPOREF, MOCA_IDREF);
CREATE INDEX MOVIMIENTO_CAJA_IDX2 ON MOVIMIENTO_CAJA (MOCA_FECHA);
CREATE INDEX MOVIMIENTO_CLIENTES_IDX1 ON MOVIMIENTO_CLIENTES (MVCL_TIPOREF);
CREATE INDEX MOVIMIENTO_CLIENTES_IDX2 ON MOVIMIENTO_CLIENTES (MVCL_IDREF);
CREATE INDEX MOVIMIENTO_CLIENTES_IDX5 ON MOVIMIENTO_CLIENTES (MVCL_FECHA);
CREATE INDEX MOVIMIENTO_PROVEEDOR_IDX1 ON MOVIMIENTO_PROVEEDOR (MVPR_FECHA);
CREATE INDEX MOVIMIENTO_PROVEEDOR_IDX2 ON MOVIMIENTO_PROVEEDOR (MVPR_TIPOREF);
CREATE DESCENDING INDEX MOVIMIENTO_SALARIO_EMPLEAD_IDX1 ON MOVIMIENTO_SALARIO_EMPLEADO (TERC_NIT, MVSE_FECHA);
CREATE INDEX NOMINA_IDX1 ON NOMINA (NOMI_ANO, NOMI_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 NOTAS_CLIENTES_IDX1 ON NOTAS_CLIENTES (TERC_NIT, CLSU_COD);
CREATE INDEX NOTAS_CREDITO_IDX1 ON NOTAS_CREDITO (NCBC_FECHA);
CREATE INDEX NOTAS_CREDITO_IDX2 ON NOTAS_CREDITO (PRBA_PREF, NCBC_NUMERO);
CREATE INDEX NOTAS_CREDITO_IDX3 ON NOTAS_CREDITO (CUBA_COD);
CREATE INDEX NOTAS_CREDITO_CLIENTES_IDX1 ON NOTAS_CREDITO_CLIENTES (VEND_COD, NCCL_FECHA, NCCL_ANULADO);
CREATE INDEX NOTAS_CREDITO_CLIENTES_IDX2 ON NOTAS_CREDITO_CLIENTES (NCCL_FECHA);
CREATE INDEX NOTAS_CREDITO_CLIENTES_IDX3 ON NOTAS_CREDITO_CLIENTES (NCCL_NUMERO);
CREATE INDEX NOTAS_CREDITO_PROVEEDOR_IDX1 ON NOTAS_CREDITO_PROVEEDOR (NCPR_FECHA);
CREATE INDEX NOTAS_CREDITO_PROVEEDOR_IDX2 ON NOTAS_CREDITO_PROVEEDOR (NCPR_NUMERO);
CREATE INDEX NOTAS_DEBITO_IDX1 ON NOTAS_DEBITO (NDBC_FECHA);
CREATE INDEX NOTAS_DEBITO_IDX2 ON NOTAS_DEBITO (PRBA_PREF, NDBC_NUMERO);
CREATE INDEX NOTAS_DEBITO_IDX3 ON NOTAS_DEBITO (CUBA_COD);
CREATE INDEX NOTAS_DEBITO_CLIENTES_IDX1 ON NOTAS_DEBITO_CLIENTES (NDCL_FECHA);
CREATE INDEX NOTAS_DEBITO_CLIENTES_IDX2 ON NOTAS_DEBITO_CLIENTES (NDCL_NUMERO);
CREATE INDEX NOTAS_DEBITO_PROVEEDOR_IDX1 ON NOTAS_DEBITO_PROVEEDOR (NDPR_FECHA);
CREATE INDEX NOTAS_DEBITO_PROVEEDOR_IDX2 ON NOTAS_DEBITO_PROVEEDOR (NDPR_NUMERO);
CREATE INDEX NOTAS_DOCUMENTO_IDX1 ON NOTAS_DOCUMENTO (TIDO_COD, NODO_IDDOC);
CREATE INDEX ORDENES_COMPRA_IDX1 ON ORDENES_COMPRA (ORDC_ID, ORDC_FECHA);
CREATE INDEX ORDENES_COMPRA_IDX2 ON ORDENES_COMPRA (ORDC_VENCE);
CREATE INDEX ORDENES_COMPRA_IDX3 ON ORDENES_COMPRA (ORDC_FECHA);
CREATE INDEX ORDENES_COMPRA_IDX4 ON ORDENES_COMPRA (ORDC_CONSOLIDA);
CREATE INDEX ORDENES_COMPRA_DETALLE_IDX1 ON ORDENES_COMPRA_DETALLE (ARTI_COD, BODE_COD);
CREATE INDEX ORDENES_INVENTARIO_IDX1 ON ORDENES_INVENTARIO (ORIN_FECHA);
CREATE INDEX ORDENES_INVENTARIO_IDX2 ON ORDENES_INVENTARIO (ORIN_FECLLEGA);
CREATE INDEX ORDENINVENTARIO_DETALLE_IDX1 ON ORDENINVENTARIO_DETALLE (ARTI_COD);
CREATE INDEX PEDIDOS_IDX1 ON PEDIDOS (PEDI_ID, PEDI_FECHA);
CREATE INDEX PEDIDOS_IDX2 ON PEDIDOS (PREF_PRE, PEDI_NUMERO);
CREATE INDEX PEDIDOS_IDX3 ON PEDIDOS (PEDI_FECHA);
CREATE INDEX PEDIDOS_IDX4 ON PEDIDOS (PEDI_VENCE);
CREATE INDEX PEDIDOS_IDX5 ON PEDIDOS (PEDI_CONSOLIDA);
CREATE INDEX PREFIJOS_IDX1 ON PREFIJOS (SUCU_ID);
CREATE INDEX PREFIJOS_IDX2 ON PREFIJOS (PREF_PRE);
CREATE INDEX PRESTAMO_CUOTAS_IDX1 ON PRESTAMO_CUOTAS (PRCU_ANO, PRCU_PERIODO);
CREATE INDEX PRODUCCION_ORDEN_IDX1 ON PRODUCCION_ORDEN (PROR_MAQUINA);
CREATE INDEX PRODUCCION_ORDEN_IDX2 ON PRODUCCION_ORDEN (PROR_FECHA);
CREATE INDEX PUNTOS_CLIENTE_IDX1 ON PUNTOS_CLIENTE (PTCL_NIT);
CREATE INDEX PUNTOS_CLIENTE_IDX2 ON PUNTOS_CLIENTE (PTCL_FECHA);
CREATE INDEX RECIBOS_CAJA_IDX1 ON RECIBOS_CAJA (RECA_ID, RECA_FECHA);
CREATE INDEX RECIBOS_CAJA_IDX2 ON RECIBOS_CAJA (RECA_FECHA, RECA_ANULADO, COBR_COD);
CREATE INDEX RECIBOS_CAJA_IDX3 ON RECIBOS_CAJA (RECA_NUMERO);
CREATE INDEX RECIBOS_CAJA_DETALLE_IDX1 ON RECIBOS_CAJA_DETALLE (RECA_ID, RCDE_TIPODOC, RCDE_IDDOC);
CREATE INDEX RECIBOS_CAJA_DETALLE_IDX2 ON RECIBOS_CAJA_DETALLE (RCDE_TIPODOC, RCDE_IDDOC);
CREATE INDEX RECIBOS_CAJA_PAGO_IDX1 ON RECIBOS_CAJA_PAGO (RECA_ID, FOPA_ID);
CREATE INDEX REMISIONES_VENTA_IDX1 ON REMISIONES_VENTA (PTVT_ID);
CREATE INDEX REMISIONES_VENTA_IDX2 ON REMISIONES_VENTA (REVT_NUMERO);
CREATE INDEX REMISIONES_VENTA_IDX3 ON REMISIONES_VENTA (REVT_FECHA);
CREATE INDEX REMISIONES_VENTA_IDX4 ON REMISIONES_VENTA (REVT_CONSOLIDA);
CREATE INDEX REMISIONES_VENTA_IDX5 ON REMISIONES_VENTA (REVT_TRANSP);
CREATE INDEX REMISION_PROVEEDOR_IDX1 ON REMISION_PROVEEDOR (REPR_CONSOLIDA);
CREATE INDEX REPLICA_ARTICULO_ESTADO_IDX1 ON REPLICA_ARTICULO_ESTADO (RPAE_FECHA);
CREATE INDEX REPLICA_EVENTOS_IDX1 ON REPLICA_EVENTOS (RPEV_FECREG, RPEV_HORAREG);
CREATE INDEX REPORTES_AUX_IDX1 ON REPORTES_AUX (REPA_ARTICULO);
CREATE INDEX RESERVAS_IDX1 ON RESERVAS (RESE_FECHA);
CREATE INDEX RESERVAS_IDX2 ON RESERVAS (RESE_VENCE);
CREATE INDEX RESERVAS_DETALLE_IDX1 ON RESERVAS_DETALLE (ARTI_COD);
CREATE INDEX RUTERO_DETALLE_IDX1 ON RUTERO_DETALLE (RUTD_FACTID);
CREATE INDEX SALDOS_CUENTAS_IDX1 ON SALDOS_CUENTAS (SACU_FECHA);
CREATE INDEX SALDOS_CUENTAS_NIIF_IDX1 ON SALDOS_CUENTAS_NIIF (SACU_FECHA);
CREATE INDEX SALDOS_DOC_CARTERA_IDX1 ON SALDOS_DOC_CARTERA (TERC_NIT, SDCA_FECHA);
CREATE INDEX SALDOS_TERCEROS_IDX1 ON SALDOS_TERCEROS (TERC_NIT);
CREATE INDEX SALDOS_TERCEROS_NIIF_IDX1 ON SALDOS_TERCEROS_NIIF (TERC_NIT);
CREATE INDEX SALIDAS_IDX1 ON SALIDAS (SALI_NUMERO);
CREATE INDEX SALIDAS_IDX2 ON SALIDAS (SALI_FECHA);
CREATE INDEX TARIFA_IVA_IDX1 ON TARIFA_IVA (TAIV_PORC);
CREATE INDEX TERCEROS_IDX1 ON TERCEROS (TERC_CLIE);
CREATE INDEX TERCEROS_IDX2 ON TERCEROS (TERC_PROV);
CREATE INDEX TRASLADOS_IDX1 ON TRASLADOS (TRAS_FECHA);
CREATE INDEX TRASLADOS_IDX2 ON TRASLADOS (PRBA_PREF, TRAS_NUMERO);
CREATE INDEX TRASLADOS_IDX3 ON TRASLADOS (CUBA_COD);
CREATE INDEX TRASLADOS_CAJA_IDX1 ON TRASLADOS_CAJA (PREF_PRE, TRCJ_NUMERO);
CREATE INDEX TRASLADOS_CAJA_IDX2 ON TRASLADOS_CAJA (TRCJ_FECHA);
CREATE INDEX VENDEDORES_IDX1 ON VENDEDORES (PTVT_ID);


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/



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

/* Trigger: ACTIVOS_FIJOS_AD */
CREATE TRIGGER ACTIVOS_FIJOS_AD FOR ACTIVOS_FIJOS
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 144, 1, 'D', OLD.acfj_cod);
end
^

/* Trigger: ACTIVOS_FIJOS_AI */
CREATE TRIGGER ACTIVOS_FIJOS_AI FOR ACTIVOS_FIJOS
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 144, 1, 'I', NEW.acfj_cod);
end
^

/* Trigger: ACTIVOS_FIJOS_AU */
CREATE TRIGGER ACTIVOS_FIJOS_AU FOR ACTIVOS_FIJOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 144, 1, 'U', NEW.acfj_cod);
end
^

/* Trigger: ACTIVOS_FIJOS_BI */
CREATE TRIGGER ACTIVOS_FIJOS_BI FOR ACTIVOS_FIJOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.acfj_rescate is null) then
  new.acfj_rescate = 0;
if (new.acgr_id is null) then
    exception grupo_no_existe 'Debe indicar un grupo para el activo.';
end
^

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

/* Trigger: AJUSTES_AD */
CREATE TRIGGER AJUSTES_AD FOR AJUSTES
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 14, OLD.ajus_id, 'D', OLD.pref_pre || OLD.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
    begin
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_detalle_niif where enco_consec = :consec;
    end
  delete from comprobante_encabezado where enco_tiporef = 14 and enco_idref = old.ajus_id;
end
^

/* Trigger: AJUSTES_AI */
CREATE TRIGGER AJUSTES_AI FOR AJUSTES
ACTIVE AFTER INSERT POSITION 1
as
begin
IF ((NEW.AJUS_ID <> 0) AND (NEW.AJUS_ANULADO = 'N') AND (NEW.ajus_noajustar = 'N')) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 14, NEW.ajus_id, 'I', NEW.pref_pre || NEW.ajus_numero);
if ((NEW.ajus_pasada = 2) AND (NEW.ajus_anulado = 'N')) then
    BEGIN
    /* AGREGUE LOS ARTCULOS CON COINCIDENCIA EN PASADA 1 Y 2 A LOS RECONTADOS */
    EXECUTE procedure registre_coincidencias_conteo (NEW.ajus_fecha, NEW.bode_cod, NEW.ajus_stand, NEW.ajus_id);
    end
end
^

/* Trigger: AJUSTES_AU */
CREATE 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
       begin
       delete from comprobante_detalle where enco_consec = :consec;
       delete from comprobante_detalle_niif where enco_consec = :consec;
       end
    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
^

/* Trigger: AJUSTES_BI */
CREATE 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
^

/* Trigger: AJUSTES_DETALLE_AD */
CREATE TRIGGER AJUSTES_DETALLE_AD FOR AJUSTES_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
BEGIN
if ((OLD.ajus_id <> 0) AND (OLD.ajde_anulado = 'N'))then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 14) and (mvar_idref = OLD.ajus_id) and (mvar_item = OLD.ajus_item);
END
^

/* Trigger: AJUSTES_DETALLE_AI */
CREATE 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(8);
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
^

/* Trigger: AJUSTES_DETALLE_AU */
CREATE 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(8);
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
^

/* Trigger: AJUSTES_DETALLE_BI */
CREATE TRIGGER AJUSTES_DETALLE_BI FOR AJUSTES_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECHA DATE;
declare variable EXIST CHAR(1);
declare variable UNIDAD VARCHAR(8);
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);
SELECT ARTI_EXIST, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :EXIST, :UNIDAD;
/* INTENTE CONSOLIDAR EL REGISTRO */
if (EXIST = 'L') then
    BEGIN
    EXECUTE PROCEDURE saldo_lote_fecha(NEW.arti_cod, NEW.bode_cod, NEW.ajus_lote, :FECHA) returning_values (NEW.ajus_exant);
    if (EXISTS (select AJUS_ITEM FROM AJUSTES_DETALLE WHERE AJUS_ID = NEW.ajus_id AND BODE_COD = NEW.bode_cod AND ARTI_COD = NEW.arti_cod AND AJUS_LOTE = NEW.ajus_lote and ajus_item <> new.ajus_item)) THEN
        BEGIN
        UPDATE AJUSTES_DETALLE SET AJUS_EXNUE = (AJUS_EXNUE * AJUS_FACTOR) + (NEW.ajus_exnue * NEW.ajus_factor), AJUS_UNIDAD = :UNIDAD, AJUS_FACTOR = 1
            WHERE AJUS_ID = NEW.ajus_id AND BODE_COD = NEW.bode_cod AND ARTI_COD = NEW.arti_cod AND AJUS_LOTE = NEW.ajus_lote;
        NEW.ajde_anulado = 'S';
        END
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE saldo_inventario(NEW.arti_cod, NEW.bode_cod, :FECHA) returning_values (NEW.ajus_exant);
    if (EXISTS (select AJUS_ITEM FROM AJUSTES_DETALLE WHERE AJUS_ID = NEW.ajus_id AND BODE_COD = NEW.bode_cod AND ARTI_COD = NEW.arti_cod and ajus_item <> new.ajus_item)) THEN
        BEGIN
        UPDATE AJUSTES_DETALLE SET AJUS_EXNUE = (AJUS_EXNUE * AJUS_FACTOR) + (NEW.ajus_exnue * NEW.ajus_factor), AJUS_UNIDAD = :UNIDAD, AJUS_FACTOR = 1
            WHERE AJUS_ID = NEW.ajus_id AND BODE_COD = NEW.bode_cod AND ARTI_COD = NEW.arti_cod;
        NEW.ajde_anulado = 'S';
        END
    END
end
^

/* Trigger: AJUSTES_INFLACION_BD */
CREATE TRIGGER AJUSTES_INFLACION_BD FOR AJUSTES_INFLACION
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
DELETE FROM COMPROBANTE_DETALLE
  WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
UPDATE comprobante_encabezado
  SET ENCO_TIPOREF = 0
  WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
DELETE FROM COMPROBANTE_ENCABEZADO
  WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 2, OLD.ajus_id, 'D', OLD.prco_pref || OLD.enco_numero);
END
^

/* Trigger: AJUSTES_INFLACION_BI */
CREATE TRIGGER AJUSTES_INFLACION_BI FOR AJUSTES_INFLACION
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable CUENTA VARCHAR(20);
declare variable DB CHAR(1);
declare variable TERC CHAR(1);
declare variable CTAJUS VARCHAR(20);
declare variable CTACORR VARCHAR(20);
declare variable SALDO NUMERIC(15,2);
declare variable TERCERO VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable I INTEGER;
DECLARE VARIABLE ANO CHAR(4);
DECLARE VARIABLE MES INTEGER;
BEGIN
  /* Registre un comprobante */
  execute procedure cambie_id_comproba returning_values(NEW.ENCO_CONSEC);
  insert into comprobante_encabezado (tico_cod, prco_pref, enco_consec, enco_numero, enco_fecha, enco_concepto, enco_refer, enco_tiporef, enco_idref)
    values (new.tico_cod, new.prco_pref, new.enco_consec, new.enco_numero, NEW.AJUS_FECHA, NEW.ajus_conc, NEW.ajus_refer, 2, 0);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (PROY);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (CENTRO);
  I = 1;
  FOR SELECT CUEN_COD, CUEN_TERCERO, CUEN_AJUSDB, CUEN_CTAJUSTE, CUEN_CTACORRECION
    FROM CUENTAS WHERE CUEN_CTAJUSTE <> '' order by CUEN_COD
    INTO :CUENTA, :TERC, :DB, :CTAJUS, :CTACORR
  DO
    BEGIN
    ANO = SUBSTR(NEW.AJUS_FECHA, 1, 4);
    MES = CAST(SUBSTR(NEW.AJUS_FECHA, 5, 6) AS INTEGER);
    execute PROCEDURE SALDO_CUENTA_MES(:CUENTA, :ANO, :MES, 'S') returning_values (:SALDO);
    SALDO = ABS(SALDO);
    if (SALDO <> 0) then
      BEGIN
      if (:TERC = 'S') then
        TERCERO = NEW.TERC_NIT;
      ELSE
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (TERCERO);
      if (DB = 'S') then
        BEGIN
        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
          VALUES (new.enco_consec, :I, :CTAJUS, :TERCERO, :PROY, :CENTRO, NEW.ajus_conc, NEW.ajus_refer, :SALDO, NEW.ajus_paag, (:SALDO * NEW.AJUS_PAAG / 100), 0);
        I = I + 1;
        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
          VALUES (new.enco_consec, :I, :CTACORR, :TERCERO, :PROY, :CENTRO, NEW.ajus_conc, NEW.ajus_refer, :SALDO, NEW.ajus_paag, 0, (:SALDO * NEW.AJUS_PAAG / 100));
        END
      ELSE
        BEGIN
        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
          VALUES (new.enco_consec, :I, :CTAJUS, :TERCERO, :PROY, :CENTRO, NEW.ajus_conc, NEW.ajus_refer, :SALDO, NEW.ajus_paag, 0, (:SALDO * NEW.AJUS_PAAG / 100));
        I = I + 1;
        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
          VALUES (new.enco_consec, :I, :CTACORR, :TERCERO, :PROY, :CENTRO, NEW.ajus_conc, NEW.ajus_refer, :SALDO, NEW.ajus_paag, (:SALDO * NEW.AJUS_PAAG / 100), 0);
        END
      I = I + 1;
      END
    END
END
^

/* Trigger: AJUSTES_INFLACION_BU */
CREATE TRIGGER AJUSTES_INFLACION_BU FOR AJUSTES_INFLACION
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
  /* Grabe el ID asignado en comprobante encabezado  */
  if (new.ajus_id <> old.ajus_id) then
    update comprobante_encabezado
      set enco_idref = new.ajus_id
    where enco_consec = new.enco_consec;
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 2, NEW.ajus_id, 'U', NEW.prco_pref || NEW.enco_numero);
END
^

/* Trigger: AJUSTE_CIERRE_BI */
CREATE TRIGGER AJUSTE_CIERRE_BI FOR AJUSTE_CIERRE
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.ajci_id = GEN_ID(id_ajustecie, 1);
end
^

/* Trigger: ANTICIPOS_CLIENTE_AD */
CREATE 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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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
^

/* Trigger: ANTICIPOS_CLIENTE_AI */
CREATE 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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, 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), (NEW.ancl_rtcreem*-1), 0, 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_RCREE, 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, NEW.ancl_rtcreem, '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
^

/* Trigger: ANTICIPOS_CLIENTE_AU */
CREATE 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
              begin
              delete from comprobante_detalle where enco_consec = :consec;
              delete from comprobante_detalle_niif where enco_consec = :consec;
              end
            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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, 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), (NEW.ancl_rtcreem*-1), 0, 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_RCREE, 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, NEW.ancl_rtcreem, '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
^

/* Trigger: ANTICIPOS_CLIENTE_BI */
CREATE TRIGGER ANTICIPOS_CLIENTE_BI FOR ANTICIPOS_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
/* 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_rtcree IS NULL) then
    NEW.ancl_rtcree = 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_rtcreem IS NULL) then
    NEW.ancl_rtcreem = 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_rtcreem = NEW.ancl_rtcreem * 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
^

/* Trigger: ANTICIPOS_PROVEEDOR_AD */
CREATE 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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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
^

/* Trigger: ANTICIPOS_PROVEEDOR_AI */
CREATE 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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, 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), (NEW.anpr_rtcreem*-1), 0, 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_RCREE, 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, NEW.anpr_rtcreem, '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
^

/* Trigger: ANTICIPOS_PROVEEDOR_AU */
CREATE 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
              begin
              delete from comprobante_detalle where enco_consec = :consec;
              delete from comprobante_detalle_niif where enco_consec = :consec;
              end
            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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, 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), (NEW.anpr_rtcreem*-1), 0, 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_RCREE, 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, NEW.anpr_rtcreem, '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
^

/* Trigger: ANTICIPOS_PROVEEDOR_BI */
CREATE TRIGGER ANTICIPOS_PROVEEDOR_BI FOR ANTICIPOS_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable pregtasa CHAR(2);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.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_RTCREE IS NULL) then
    NEW.ANPR_RTCREE = 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_RTCREEM IS NULL) then
    NEW.ANPR_RTCREEM = 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_rtcreem = NEW.anpr_rtcreem * NEW.anpr_trm;
    NEW.anpr_dtofmonto = NEW.anpr_dtofmonto * NEW.anpr_trm;
    END
END
^

/* Trigger: APERTURA_NIIF_DET_AD */
CREATE TRIGGER APERTURA_NIIF_DET_AD FOR APERTURA_NIIF_DET
ACTIVE AFTER DELETE POSITION 0
as
declare variable TIPO CHAR(1);
begin
  /* Actualice el saldo consolidado */
  update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb - old.apnd_debito - old.apnd_recldb,
    a.apni_ajustecr = a.apni_ajustecr - old.apnd_credito - old.apnd_reclcr
    where a.cuen_cod = old.cuen_cod;
/* REGISTRE EL SALDO INICIAL */
select cuen_tipo from cuentas where cuen_cod = old.apnd_ctaniif into :tipo;
if (tipo = 'A') then
    begin
    update saldos_iniciales_niif s
        set s.sain_debito = s.sain_debito - OLD.apnd_debito - old.apnd_recldb,
            s.sain_credito = s.sain_credito - OLD.apnd_credito - old.apnd_reclcr
        where s.cuen_cod = OLD.apnd_ctaniif AND s.terc_nit = old.terc_nit and s.proy_cod = old.proy_cod and
            s.cent_cod = old.cent_cod and s.arti_cod = old.acti_cod;
    end
else
    begin
    update saldos_iniciales_niif s
        set s.sain_debito = s.sain_debito - OLD.apnd_debito - old.apnd_recldb,
            s.sain_credito = s.sain_credito - OLD.apnd_credito - old.apnd_reclcr
        where s.cuen_cod = OLD.apnd_ctaniif AND s.terc_nit = old.terc_nit and s.proy_cod = old.proy_cod and
            s.cent_cod = old.cent_cod;
    end
end
^

/* Trigger: APERTURA_NIIF_DET_AI */
CREATE TRIGGER APERTURA_NIIF_DET_AI FOR APERTURA_NIIF_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable TIPO CHAR(1);
begin
  /* Actualice el saldo consolidado */
update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb + new.apnd_debito,
    a.apni_ajustecr = a.apni_ajustecr + new.apnd_credito
    where a.cuen_cod = new.cuen_cod;
/* REGISTRE EL SALDO INICIAL */
if ((NEW.apnd_ctaniif IS NOT NULL) AND (NEW.apnd_ctaniif <> '')) then
  BEGIN
  if ((NEW.terc_nit IS NOT NULL) AND (NEW.terc_nit <> '')) then
    BEGIN
    if ((NEW.proy_cod IS NOT NULL) AND (NEW.proy_cod <> '') AND (NEW.cent_cod IS NOT NULL) AND (NEW.cent_cod <> '')) then
        BEGIN
        select cuen_tipo from cuentas where cuen_cod = new.apnd_ctaniif into :tipo;
        if (tipo = 'A') then
            begin
            if ((new.acti_cod is not null) AND (NEW.acti_cod <> '')) then
                begin
                if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = NEW.apnd_ctaniif and
                    TERC_NIT = NEW.terc_nit AND PROY_COD = NEW.proy_cod AND CENT_COD = NEW.cent_cod and ARTI_COD = NEW.ACTI_COD)) Then
                    begin
                    update saldos_iniciales_niif s set s.sain_debito = s.sain_debito + new.apnd_debito + new.apnd_recldb,
                        s.sain_credito = s.sain_credito + new.apnd_credito + new.apnd_reclcr
                        where s.cuen_cod = new.apnd_ctaniif and TERC_NIT = NEW.terc_nit AND ARTI_COD = NEW.ACTI_COD AND
                            PROY_COD = NEW.proy_cod AND CENT_COD = NEW.cent_cod;
                    end
                else
                    INSERT INTO SALDOS_INICIALES_NIIF (CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, DOCO_NUMERO, DOCO_VENCE, SAIN_DEBITO, SAIN_CREDITO, SAIN_TIPODOC)
                        VALUES (new.apnd_ctaniif, NEW.terc_nit, NEW.proy_cod, NEW.cent_cod, NEW.ACTI_COD, NULL, NULL, new.apnd_debito+new.apnd_recldb, new.apnd_credito+new.apnd_reclcr, NULL);
                end
            else
                exception articulo_no_existe 'No se indico el codigo del activo pata la cuenta NIIF ' || new.apnd_ctaniif;
            end
        else
            if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = NEW.apnd_ctaniif and
                TERC_NIT = NEW.terc_nit AND PROY_COD = NEW.proy_cod AND CENT_COD = NEW.cent_cod)) Then
                begin
                update saldos_iniciales_niif s set s.sain_debito = s.sain_debito + new.apnd_debito + new.apnd_recldb,
                    s.sain_credito = s.sain_credito + new.apnd_credito + new.apnd_reclcr
                    where s.cuen_cod = new.apnd_ctaniif and TERC_NIT = NEW.terc_nit AND
                        PROY_COD = NEW.proy_cod AND CENT_COD = NEW.cent_cod;
                end
            else
                INSERT INTO SALDOS_INICIALES_NIIF (CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, DOCO_NUMERO, DOCO_VENCE, SAIN_DEBITO, SAIN_CREDITO, SAIN_TIPODOC)
                    VALUES (new.apnd_ctaniif, NEW.terc_nit, NEW.proy_cod, NEW.cent_cod, NULL, NULL, NULL, new.apnd_debito+new.apnd_recldb, new.apnd_credito+new.apnd_reclcr, NULL);
        END
    ELSE
        exception centro_no_existe 'No se indico el centro de costos pata la cuenta NIIF ' || new.apnd_ctaniif;
    END
  ELSE
    exception tercero_no_existe 'No se indico el NIT para la cuenta NIIF ' || new.apnd_ctaniif;
  END
end
^

/* Trigger: APERTURA_NIIF_DET_AU */
CREATE TRIGGER APERTURA_NIIF_DET_AU FOR APERTURA_NIIF_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable TIPO CHAR(1);
begin
  /* Actualice el saldo consolidado */
  update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb - old.apnd_debito - old.apnd_recldb,
    a.apni_ajustecr = a.apni_ajustecr - old.apnd_credito - old.apnd_reclcr
    where a.cuen_cod = old.cuen_cod;
  update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb + new.apnd_debito + new.apnd_recldb,
    a.apni_ajustecr = a.apni_ajustecr + new.apnd_credito + new.apnd_reclcr
    where a.cuen_cod = new.cuen_cod;
/* REGISTRE EL SALDO INICIAL */
select cuen_tipo from cuentas where cuen_cod = old.apnd_ctaniif into :tipo;
if (tipo = 'A') then
    begin
    update saldos_iniciales_niif s
        set s.sain_debito = s.sain_debito - OLD.apnd_debito - old.apnd_recldb,
            s.sain_credito = s.sain_credito - OLD.apnd_credito - old.apnd_reclcr
        where s.cuen_cod = OLD.apnd_ctaniif AND s.terc_nit = old.terc_nit and s.proy_cod = old.proy_cod and
            s.cent_cod = old.cent_cod and s.arti_cod = old.acti_cod;
    end
else
    begin
    update saldos_iniciales_niif s
        set s.sain_debito = s.sain_debito - OLD.apnd_debito - old.apnd_recldb,
            s.sain_credito = s.sain_credito - OLD.apnd_credito - old.apnd_reclcr
        where s.cuen_cod = OLD.apnd_ctaniif AND s.terc_nit = old.terc_nit and s.proy_cod = old.proy_cod and
            s.cent_cod = old.cent_cod;
    end
if ((NEW.apnd_ctaniif IS NOT NULL) AND (NEW.apnd_ctaniif <> '')) then
  BEGIN
  if ((NEW.terc_nit IS NOT NULL) AND (NEW.terc_nit <> '')) then
    BEGIN
    if ((NEW.proy_cod IS NOT NULL) AND (NEW.proy_cod <> '') AND (NEW.cent_cod IS NOT NULL) AND (NEW.cent_cod <> '')) then
        BEGIN
        if (tipo = 'A') then
            begin
            if ((new.acti_cod is not null) AND (NEW.acti_cod <> '')) then
                begin
                if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = NEW.apnd_ctaniif and
                    TERC_NIT = NEW.terc_nit AND PROY_COD = NEW.proy_cod AND CENT_COD = NEW.cent_cod and arti_cod = new.acti_cod)) Then
                    begin
                    update saldos_iniciales_niif s set s.sain_debito = s.sain_debito + new.apnd_debito + new.apnd_recldb,
                        s.sain_credito = s.sain_credito + new.apnd_credito + new.apnd_reclcr
                        where s.cuen_cod = new.apnd_ctaniif and TERC_NIT = NEW.terc_nit AND
                            PROY_COD = NEW.proy_cod AND CENT_COD = NEW.cent_cod and arti_cod = new.acti_cod;
                    end
                  else
                    INSERT INTO SALDOS_INICIALES_NIIF (CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, DOCO_NUMERO, DOCO_VENCE, SAIN_DEBITO, SAIN_CREDITO, SAIN_TIPODOC)
                        VALUES (new.apnd_ctaniif, NEW.terc_nit, NEW.proy_cod, NEW.cent_cod, NEW.ACTI_COD, NULL, NULL, new.apnd_debito+new.apnd_recldb, new.apnd_credito+new.apnd_reclcr, NULL);
                end
            else
                exception articulo_no_existe 'No se indico el codigo del activo pata la cuenta NIIF ' || new.apnd_ctaniif;
            end
        else
            begin
            if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = NEW.apnd_ctaniif and
                TERC_NIT = NEW.terc_nit AND PROY_COD = NEW.proy_cod AND CENT_COD = NEW.cent_cod)) Then
                begin
                update saldos_iniciales_niif s set s.sain_debito = s.sain_debito + new.apnd_debito + new.apnd_recldb,
                    s.sain_credito = s.sain_credito + new.apnd_credito + new.apnd_reclcr
                    where s.cuen_cod = new.apnd_ctaniif and TERC_NIT = NEW.terc_nit AND
                        PROY_COD = NEW.proy_cod AND CENT_COD = NEW.cent_cod;
                end
              else
                INSERT INTO SALDOS_INICIALES_NIIF (CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, DOCO_NUMERO, DOCO_VENCE, SAIN_DEBITO, SAIN_CREDITO, SAIN_TIPODOC)
                    VALUES (new.apnd_ctaniif, NEW.terc_nit, NEW.proy_cod, NEW.cent_cod, NULL, NULL, NULL, new.apnd_debito+new.apnd_recldb, new.apnd_credito+new.apnd_reclcr, NULL);
            end
        END
    ELSE
        exception centro_no_existe 'No se indico el centro de costos pata la cuenta NIIF ' || new.apnd_ctaniif;
    END
  ELSE
    exception tercero_no_existe 'No se indico el NIT para la cuenta NIIF ' || new.apnd_ctaniif;
  END
end
^

/* Trigger: APERTURA_NIIF_DET_BI */
CREATE TRIGGER APERTURA_NIIF_DET_BI FOR APERTURA_NIIF_DET
ACTIVE BEFORE INSERT POSITION 0
as
begin
IF (NEW.apnd_debito IS NULL) THEN
    NEW.apnd_debito = 0;
IF (NEW.apnd_credito IS NULL) THEN
    NEW.apnd_credito = 0;
if (NEW.apnd_recldb IS NULL) then
    NEW.apnd_recldb = 0;
if (NEW.apnd_reclcr IS NULL) then
    NEW.apnd_reclcr = 0;
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);
end
^

/* Trigger: APERTURA_NIIF_DET_BU */
CREATE TRIGGER APERTURA_NIIF_DET_BU FOR APERTURA_NIIF_DET
ACTIVE BEFORE UPDATE POSITION 0
as
begin
IF (NEW.apnd_debito IS NULL) THEN
    NEW.apnd_debito = 0;
IF (NEW.apnd_credito IS NULL) THEN
    NEW.apnd_credito = 0;
if (NEW.apnd_recldb IS NULL) then
    NEW.apnd_recldb = 0;
if (NEW.apnd_reclcr IS NULL) then
    NEW.apnd_reclcr = 0;
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);
end
^

/* Trigger: APLICACION_CLIENTE_AD */
CREATE TRIGGER APLICACION_CLIENTE_AD FOR APLICACION_CLIENTE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
select enco_consec from comprobante_encabezado where enco_tiporef = 43 and enco_idref = old.apcl_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 43 and enco_idref = old.apcl_id;

DELETE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = OLD.APCL_id;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 43, OLD.apcl_id, 'D', OLD.pref_pre || OLD.apcl_numero);
END
^

/* Trigger: APLICACION_CLIENTE_AI */
CREATE TRIGGER APLICACION_CLIENTE_AI FOR APLICACION_CLIENTE
ACTIVE AFTER INSERT POSITION 1
as
begin
IF ((NEW.APCL_ID <> 0) AND (NEW.apcl_anulado = 'N')) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 43, NEW.apcl_id, 'I', NEW.pref_pre || NEW.apcl_numero);
end
^

/* Trigger: APLICACION_CLIENTE_AU */
CREATE TRIGGER APLICACION_CLIENTE_AU FOR APLICACION_CLIENTE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
if (new.apcl_anulado = 'S') then
    begin
    delete from movimiento_clientes WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = old.APCL_ID;
    select enco_consec from comprobante_encabezado where enco_tiporef = 43 and enco_idref = old.apcl_id into :consec;
    if (NOT consec is null) then
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    delete from comprobante_encabezado where enco_tiporef = 43 and enco_idref = old.apcl_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 43, NEW.apcl_id, 'A', NEW.pref_pre || NEW.apcl_numero);
    end
ELSE
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 43, NEW.apcl_id, 'U', NEW.pref_pre || NEW.apcl_numero);
/* si cambia un dato critico actualice el detalle */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.apcl_numero <> NEW.apcl_numero) or
    (OLD.apcl_fecha <> NEW.apcl_fecha)) then
    UPDATE aplicacion_cliente_detalle
        SET ACDE_TRANSMIT = 'N'
        WHERE APCL_ID = NEW.APCL_ID;
/* ACTUALICE LOS CAMPOS ANULADO Y TRANSMITIDO */
if (OLD.apcl_anulado <> NEW.apcl_anulado) then
    BEGIN
    UPDATE aplicacion_cliente_detalle SET ACDE_ANULADO = NEW.APCL_ANULADO WHERE APCL_ID = NEW.APCL_ID;
    UPDATE aplicacion_cliente_cruce SET APCR_ANULADO = NEW.APCL_ANULADO WHERE APCL_ID = NEW.APCL_ID;
    END
if (OLD.apcl_transmit <> NEW.apcl_transmit) then
    BEGIN
    UPDATE aplicacion_cliente_detalle SET ACDE_TRANSMIT = NEW.apcl_transmit WHERE APCL_ID = NEW.APCL_ID;
    UPDATE aplicacion_cliente_cruce SET APCR_TRANSMIT = NEW.apcl_transmit WHERE APCL_ID = NEW.APCL_ID;
    END
END
^

/* Trigger: APLICACION_CLIENTE_BI */
CREATE TRIGGER APLICACION_CLIENTE_BI FOR APLICACION_CLIENTE
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;
  /* 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
^

/* Trigger: APLICACION_CLIENTE_CRUCE_AD */
CREATE TRIGGER APLICACION_CLIENTE_CRUCE_AD FOR APLICACION_CLIENTE_CRUCE
ACTIVE AFTER DELETE POSITION 0
as
declare variable FEC DATE;
BEGIN
if (OLD.apcl_id <> 0) then
    BEGIN
    SELECT APCL_FECHA FROM aplicacion_cliente WHERE APCL_ID = OLD.apcl_id INTO :FEC;
    if (old.apcr_anulado = 'N') then
      begin
      UPDATE saldos_doc_cxpagar
        SET SDCP_ABONO = SDCP_ABONO - (old.apcr_aplicado+OLD.apcr_difcambio),
        SDCP_ABRTFTE = SDCP_ABRTFTE - old.apcr_rtfte,
        SDCP_ABRTIVA = SDCP_ABRTIVA - old.apcr_rtiva,
        SDCP_ABRTICA = SDCP_ABRTICA - old.apcr_rtica
        WHERE SDCP_TIPOREF = OLD.apcr_tipodoc AND SDCP_IDREF = OLD.apcr_iddoc AND SDCP_FECHA = :FEC;
      /* Deshaga el viejo */
      UPDATE movimiento_proveedor
        SET MVPR_MONTO = MVPR_MONTO - (OLD.apcr_aplicado+OLD.apcr_difcambio),
        MVPR_RTFTE = MVPR_RTFTE - OLD.apcr_rtfte,
        MVPR_RTIVA = MVPR_RTIVA - OLD.apcr_rtiva,
        MVPR_RTICA = MVPR_RTICA - OLD.apcr_rtica
        WHERE MVPR_TIPOREF = 43 AND MVPR_IDREF = OLD.apcl_id;
      end
    END
end
^

/* Trigger: APLICACION_CLIENTE_CRUCE_AI */
CREATE TRIGGER APLICACION_CLIENTE_CRUCE_AI FOR APLICACION_CLIENTE_CRUCE
ACTIVE AFTER INSERT POSITION 0
as
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable 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, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, TERC_NIT, APCL_TRM
    from aplicacion_cliente where APCL_ID = new.apcl_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.apcl_id <> 0) and (new.apcr_anulado = 'N')) then
    BEGIN
    OK = 'N';
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.apcr_tipodoc, new.apcr_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.apcr_prefijo || new.apcr_numero || ' es insuficiente.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.apcr_aplicado+NEW.apcr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.apcr_prefijo || new.apcr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo > (NEW.apcr_aplicado + NEW.apcr_rtfte + NEW.apcr_rtiva + NEW.apcr_rtica + NEW.apcr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.apcr_prefijo || new.apcr_numero || ' es insuficiente.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.apcr_aplicado+NEW.apcr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.apcr_prefijo || new.apcr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo < (NEW.apcr_aplicado + NEW.apcr_rtfte + NEW.apcr_rtiva + NEW.apcr_rtica + NEW.apcr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.apcr_prefijo || new.apcr_numero || ' es insuficiente.';
            end
        END
    if (OK = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.apcr_tipodoc and
            sdcp_idref = new.apcr_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.apcr_aplicado + NEW.apcr_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.apcr_rtfte,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.apcr_rtiva,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.apcr_rtica,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.apcr_tipodoc AND SDCP_IDREF = NEW.apcr_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.apcr_tipodoc, NEW.apcr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.apcr_aplicado+NEW.apcr_difcambio), NEW.apcr_rtfte, NEW.apcr_rtiva, NEW.apcr_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 = 43 AND MVPR_IDREF = NEW.apcl_id INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.apcr_aplicado + NEW.apcr_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.apcr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.apcr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.apcr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 43 AND MVPR_IDREF = NEW.apcl_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, 43, NEW.apcl_id, :FEC, :FEC, :CONCEPTO, (NEW.apcr_aplicado+NEW.apcr_difcambio), NEW.apcr_rtfte, NEW.apcr_rtiva, NEW.apcr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
end
^

/* Trigger: APLICACION_CLIENTE_CRUCE_AU */
CREATE TRIGGER APLICACION_CLIENTE_CRUCE_AU FOR APLICACION_CLIENTE_CRUCE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
BEGIN
select PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, TERC_NIT, APCL_TRM from aplicacion_cliente
    where APCL_id = new.apcl_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.apcl_id <> 0) and (old.apcr_anulado = 'N')) then
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = old.apcr_tipodoc and
        sdcp_idref = old.apcr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO - (old.apcr_aplicado + OLD.apcr_difcambio),
            SDCP_ABRTFTE = SDCP_ABRTFTE - old.apcr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA - old.apcr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA - old.apcr_rtica
            WHERE SDCP_TIPOREF = OLD.apcr_tipodoc AND SDCP_IDREF = OLD.apcr_iddoc AND SDCP_FECHA = :FEC;
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 43 AND MVPR_IDREF = OLD.apcl_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.apcr_aplicado + OLD.apcr_difcambio),
            MVPR_RTFTE = MVPR_RTFTE - OLD.apcr_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.apcr_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.apcr_rtica
            WHERE MVPR_TIPOREF = 43 AND MVPR_IDREF = OLD.apcl_id;
    END
if ((NEW.apcl_id <> 0) and (NEW.apcr_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.apcr_tipodoc, new.apcr_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.apcr_prefijo || new.apcr_numero || ' es insuficiente.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.apcr_aplicado+NEW.apcr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.apcr_prefijo || new.apcr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo > (NEW.apcr_aplicado + NEW.apcr_rtfte + NEW.apcr_rtiva + NEW.apcr_rtica + NEW.apcr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.apcr_prefijo || new.apcr_numero || ' es insuficiente.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.apcr_aplicado+NEW.apcr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.apcr_prefijo || new.apcr_numero || ' es insuficiente.';
            end
        ELSE
            begin
            if (saldo < (NEW.apcr_aplicado + NEW.apcr_rtfte + NEW.apcr_rtiva + NEW.apcr_rtica + NEW.apcr_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'El saldo del documento ' || new.apcr_prefijo || new.apcr_numero || ' es insuficiente.';
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.apcr_tipodoc and
        sdcp_idref = new.apcr_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + (NEW.apcr_aplicado + NEW.apcr_difcambio),
            SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.apcr_rtfte,
            SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.apcr_rtiva,
            SDCP_ABRTICA = SDCP_ABRTICA + NEW.apcr_rtica,
            SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = NEW.apcr_tipodoc AND SDCP_IDREF = NEW.apcr_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.apcr_tipodoc, NEW.apcr_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.apcr_aplicado + NEW.apcr_difcambio), NEW.apcr_rtfte, NEW.apcr_rtiva, NEW.apcr_rtica, 'N', 0, :TRM);
    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 43 AND MVPR_IDREF = NEW.apcl_id INTO :EXISTE;
    if (EXISTE = 'S') then
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.apcr_aplicado + NEW.apcr_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.apcr_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.apcr_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.apcr_rtica,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 43 AND MVPR_IDREF = NEW.apcl_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, 43, NEW.apcl_id, :FEC, :FEC, :CONCEPTO, (NEW.apcr_aplicado + NEW.apcr_difcambio), NEW.apcr_rtfte, NEW.apcr_rtiva, NEW.apcr_rtica, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
end
^

/* Trigger: APLICACION_CLIENTE_CRUCE_BI */
CREATE TRIGGER APLICACION_CLIENTE_CRUCE_BI FOR APLICACION_CLIENTE_CRUCE
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 NITR VARCHAR(20);
declare variable NITD 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);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT APCL_TRM FROM aplicacion_cliente WHERE APCL_ID = NEW.apcl_id INTO :TRM;
    SELECT MVPR_TRM FROM MOVIMIENTO_PROVEEDOR M WHERE M.mvpr_tiporef = NEW.apcr_tipodoc AND M.mvpr_idref = NEW.apcr_iddoc INTO :TRMDOC;
    NEW.apcr_difcambio = (NEW.apcr_aplicado) * (TRM - TRMDOC);
    NEW.apcr_aplicado = NEW.apcr_aplicado * :trmdoc;
    NEW.apcr_rtfte = NEW.apcr_rtfte * :trmdoc;
    NEW.apcr_rtiva = NEW.apcr_rtiva * :trmdoc;
    NEW.apcr_rtica = NEW.apcr_rtica * :trmdoc;
    end
if ((new.apcr_aplicado+new.apcr_rtfte+new.apcr_rtiva+new.apcr_rtica) = 0) then
    exception ABONO_CERO 'El monto del abono al documento ' || new.apcr_prefijo || new.apcr_numero || ' no puede ser cero.';
/* valide que la fecha no sea anterior al documento */
SELECT APCL_FECHA, TERC_NIT FROM aplicacion_cliente WHERE APCL_ID = NEW.apcl_id INTO :FECREC, :NITR;
SELECT MVPR_FECHA, TERC_NIT FROM movimiento_proveedor M
    WHERE M.mvpr_tiporef = NEW.apcr_tipodoc AND M.mvpr_idref = NEW.apcr_iddoc INTO :FECDOC, :NITD;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'LA APLICACION DE FECHA ' || :FECREC || ' INTENTA CRUZAR UN DOCUMENTO DE FECHA ' || FECDOC;
if (NITR <> NITD) then
    exception documento_de_otro_tercero 'LA APLICACION CON NIT ' || :nitr || ' INTENTA CRUZAR EL DOCUMENTO ' || NEW.apcr_prefijo || NEW.apcr_numero || ' DEL PROVEEDOR ' || :nitd;
end
^

/* Trigger: APLICACION_CLIENTE_DETALLE_AD */
CREATE 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,
            SDCA_ABRCREE = SDCA_ABRCREE - old.acde_rcree
        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,
            MVCL_RCREE = MVCL_RCREE - OLD.acde_rcree
        WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = OLD.APCL_ID;
    end
END
^

/* Trigger: APLICACION_CLIENTE_DETALLE_AI */
CREATE 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(8);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
declare variable FECRET DATE;
declare variable AUTORET VARCHAR(10);
declare variable FECRCREE DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable RCANTI 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, COBR_COD, APCL_TRM
        from aplicacion_cliente where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
    if (new.acde_tipodoc = 45) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM anticipos_cliente WHERE ANCL_ID = NEW.acde_iddoc INTO :RCANTI;
        if ((RCANTI = 0) or (RCANTI IS NULL)) then
            BEGIN
            exception anticpo_sin_origen;
            END
        END
    /* 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';
    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
    if (AUTORCREE <> '') then
        fecrcree = CAST(AUTORCREE AS DATE);
    else
        fecrcree = '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') 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
            IF (:FECRET < :FEC) THEN
                if (:fecrcree < :FEC) THEN
                    begin
                    if (saldo > (NEW.acde_aplicado + 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
                else
                    if (saldo > (NEW.acde_aplicado + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_rcree + NEW.acde_difcambio)) then
                        EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
            ELSE
                if (:fecrcree < :FEC) THEN
                    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
                else
                    begin
                    if (saldo > (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_rcree + 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
            IF (:FECRET < :FEC) THEN
                if (:fecrcree < :FEC) THEN
                    begin
                    if (saldo < (NEW.acde_aplicado + 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
                else
                    begin
                    if (saldo < (NEW.acde_aplicado + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_rcree + NEW.acde_difcambio)) then
                        EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.acde_prefijo || NEW.acde_numero || ' ES INSUFICIENTE.';
                    end
            ELSE
                if (:fecrcree < :FEC) THEN
                    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
                else
                    begin
                    if (saldo < (NEW.acde_aplicado + NEW.acde_rtfte + NEW.acde_rtiva + NEW.acde_rtica + NEW.acde_rcree + 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_ABRCREE = SDCA_ABRCREE + NEW.acde_rcree,
                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_ABRCREE, 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, NEW.acde_rcree, '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_RCREE = MVCL_RCREE + NEW.acde_rcree,
                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_RCREE, 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, NEW.acde_rcree, 'N', 'S', :PREFIJO, :NUMERO, NEW.acde_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
^

/* Trigger: APLICACION_CLIENTE_DETALLE_AU */
CREATE 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(8);
declare variable SALDO NUMERIC(18,2);
declare variable RETES CHAR(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
declare variable RCANTI INTEGER;
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,
        SDCA_ABRCREE = SDCA_ABRCREE - old.acde_rcree
        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,
        MVCL_RCREE = MVCL_RCREE - OLD.acde_rcree
        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, COBR_COD, APCL_TRM
        from aplicacion_CLIENTE
        where apcl_id = new.apcl_id
        into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :COBR, :TRM;
    if (new.acde_tipodoc = 45) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT RECA_ID FROM anticipos_cliente WHERE ANCL_ID = NEW.acde_iddoc INTO :RCANTI;
        if ((RCANTI = 0) or (RCANTI IS NULL)) then
            BEGIN
            exception anticpo_sin_origen;
            END
        END
    /* 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_rcree + 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_rcree + 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_ABRCREE = SDCA_ABRCREE + NEW.acde_rcree,
            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_ABRCREE, 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, NEW.acde_rcree, '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_RCREE = MVCL_RCREE + NEW.acde_rcree,
            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_RCREE,  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, NEW.ACDE_RCREE, 'N', 'S', :PREFIJO, :NUMERO, NEW.acde_sucursal, :COBR, :TRM);
    end
END
^

/* Trigger: APLICACION_CLIENTE_DETALLE_BI */
CREATE 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;
if (NEW.acde_sucursal IS NULL) then
    NEW.acde_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 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
^

/* Trigger: APLICACION_PROVEDOR_AD */
CREATE TRIGGER APLICACION_PROVEDOR_AD FOR APLICACION_PROVEDOR
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
select enco_consec from comprobante_encabezado where enco_tiporef = 53 and enco_idref = old.appr_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 53 and enco_idref = old.appr_id;

delete from consolidado_faltantes where cofa_tipodes = 53 and cofa_tipoori = 21 and cofa_iddes = old.appr_id;

DELETE FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = OLD.APpr_id;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 53, OLD.appr_id, 'D', OLD.pref_pre || OLD.appr_numero);
END
^

/* Trigger: APLICACION_PROVEDOR_AI */
CREATE TRIGGER APLICACION_PROVEDOR_AI FOR APLICACION_PROVEDOR
ACTIVE AFTER INSERT POSITION 0
as
begin
IF ((NEW.APPR_ID <> 0) AND (NEW.appr_anulado = 'N')) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 53, NEW.appr_id, 'I', NEW.pref_pre || NEW.appr_numero);
end
^

/* Trigger: APLICACION_PROVEDOR_AU */
CREATE TRIGGER APLICACION_PROVEDOR_AU FOR APLICACION_PROVEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
if (new.appr_anulado = 'S') then
    begin
    DELETE FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = OLD.APpr_id;
    select enco_consec from comprobante_encabezado where enco_tiporef = 53 and enco_idref = old.appr_id into :consec;
    if (NOT consec is null) then
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    delete from comprobante_encabezado where enco_tiporef = 53 and enco_idref = old.appr_id;
    delete from consolidado_faltantes where cofa_tipodes = 53 and cofa_tipoori = 21 and cofa_iddes = old.appr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 53, NEW.appr_id, 'A', NEW.pref_pre || NEW.appr_numero);
    end
else
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 53, NEW.appr_id, 'A', NEW.pref_pre || NEW.appr_numero);

/* si cambio la fecha o el numero actualice el detalle */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.appr_numero <> NEW.appr_numero) or
    (OLD.appr_fecha <> NEW.appr_fecha) ) then
    UPDATE aplicacion_proveedor_detalle
        SET APPD_TRANSMIT = 'N'
        WHERE APPR_ID = NEW.APPR_ID;
/* ACTUALICE LOS CAMPOS ANULADO Y TRANSMITIDO */
if (OLD.appr_anulado <> NEW.appr_anulado) then
    UPDATE aplicacion_proveedor_detalle
        SET APPD_ANULADO = NEW.APPR_ANULADO
        WHERE APPR_ID = NEW.APPR_ID;
if (OLD.appr_transmit <> NEW.appr_transmit) then
    UPDATE aplicacion_proveedor_detalle
        SET APPD_TRANSMIT = NEW.appr_transmit
        WHERE APPR_ID = NEW.APPR_ID;
END
^

/* Trigger: APLICACION_PROVEDOR_BI */
CREATE TRIGGER APLICACION_PROVEDOR_BI FOR APLICACION_PROVEDOR
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;
  /* 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
^

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

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

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

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

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

/* Trigger: APLICACION_PROVEEDOR_DETALLE_BI */
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);
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
^

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

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

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

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

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

end
^

/* Trigger: ARTICULOS_PRODUCTO_AD */
CREATE TRIGGER ARTICULOS_PRODUCTO_AD FOR ARTICULOS_PRODUCTO
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 128, 1, 'D', OLD.arti_cod);
end
^

/* Trigger: ARTICULOS_PRODUCTO_AI */
CREATE TRIGGER ARTICULOS_PRODUCTO_AI FOR ARTICULOS_PRODUCTO
ACTIVE AFTER INSERT POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 128, 1, 'I', New.arti_cod);
end
^

/* Trigger: ARTICULOS_PRODUCTO_AU */
CREATE TRIGGER ARTICULOS_PRODUCTO_AU FOR ARTICULOS_PRODUCTO
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 128, 1, 'U', OLD.arti_cod);
end
^

/* Trigger: ARTICULO_AD */
CREATE TRIGGER ARTICULO_AD FOR ARTICULO
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 101, 1, 'D', OLD.arti_cod);
end
^

/* Trigger: ARTICULO_AI */
CREATE 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);
declare variable HOY DATE;
declare variable PREFEAN VARCHAR(7);
declare variable CODBAR VARCHAR(15);
BEGIN
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 101, 1, 'I', NEW.arti_cod);
HOY = cast('NOW' AS DATE);
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 where LIPR_FECINI <= :HOY AND LIPR_FECFIN >= :HOY
    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
  BEGIN
  INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTARTFTE, COAR_CTARTFTEV, COAR_RTBASE, COAR_RTFTE, COAR_CTARTCREE, COAR_RTCREE, COAR_CTARTICA, COAR_RTICA, COAR_CTAIVADV, COAR_CTAIVADC)
    SELECT NEW.ARTI_COD, GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP, GRUP_CTARTCREE, GRUP_RTCREE, GRUP_CTARTICA, GRUP_RTICA, GRUP_CTAIVADV, GRUP_CTAIVADC
    FROM GRUPO G
    WHERE GRUP_COD = NEW.GRUP_COD;
  INSERT INTO contabil_articulo_niif (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTARTFTE, COAR_CTARTFTEV, COAR_CTARTCREE, COAR_CTARTICA, COAR_CTAIVADV, COAR_CTAIVADC)
    SELECT NEW.ARTI_COD, G.grup_ctainvniif, G.grup_ctaivacniif, G.grup_ctaivavniif, G.grup_ctavtaniif, G.grup_ctacosniif, G.grup_ctadevniif, G.grup_ctacmpniif, G.grup_ctartfcniif, G.grup_ctartfvniif, g.grup_ctartcrniif, g.grup_ctaricaniif, g.grup_ctaivdvniif, g.grup_ctaivdcniif
    FROM GRUPO G
    WHERE GRUP_COD = NEW.GRUP_COD;
  END
if (GRUP_TIVA = 'TARIFA IVA') then
  BEGIN
  INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTAIVADV, COAR_CTAIVADC)
    SELECT NEW.ARTI_COD, TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTADEV, TAIV_CTACOMP, TAIV_CTAIVADV, TAIV_CTAIVADC
    FROM TARIFA_IVA T
    WHERE TAIV_COD = NEW.taiv_cod;
  INSERT INTO contabil_articulo_niif (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTAIVADV, COAR_CTAIVADC)
    SELECT NEW.ARTI_COD, T.taiv_ctainvniif, T.taiv_ctaivacniif, T.taiv_ctaivavniif, T.taiv_ctavtaniif, T.taiv_ctacosniif, T.taiv_ctadevniif, T.taiv_ctacmpniif, T.taiv_ctaivdvniif, T.taiv_ctaivdcniif
    FROM TARIFA_IVA T
    WHERE TAIV_COD = NEW.taiv_cod;
  END
execute procedure lee_configuracion('INVENTARIO', 'ARTICULOS', 'PREFIJO EAN13 PARA CREAR CODIGOS DE BARRAS') returning_values (PREFEAN);
if (PREFEAN <> '') then
    BEGIN
    EXECUTE procedure CODIGO_BARRAS (NEW.arti_cod) returning_values (CODBAR);
    insert into BARRAS_ARTICULO (ARTI_COD, COBA_COD, COBA_DES, COBA_UNIDAD, COBA_ACTIVO)
        values (NEW.arti_cod, :codbar, NEW.arti_des, NEW.arti_unidad, 'S');
    END
END
^

/* Trigger: ARTICULO_ALERTAS_BI */
CREATE 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
^

/* Trigger: ARTICULO_AU */
CREATE TRIGGER ARTICULO_AU FOR ARTICULO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable GRUP_TIVA CHAR(10);
declare variable VTA CHAR(20);
declare variable IVAC CHAR(20);
declare variable IVAV CHAR(20);
declare variable INV CHAR(20);
declare variable COSTO CHAR(20);
declare variable DEV CHAR(20);
declare variable COMP CHAR(20);
declare variable RETC CHAR(20);
declare variable RETV CHAR(20);
declare variable RETB NUMERIC(18,2);
declare variable RETP NUMERIC(9,4);
declare variable IVADV CHAR(20);
declare variable IVADC CHAR(20);
declare variable NUMROWS INTEGER;
declare variable DATOS VARCHAR(4096);
begin
DATOS = 'ARTI_COD=' || OLD.ARTI_COD || '|GRUP_COD=' || OLD.GRUP_COD || '|SUBG_COD=' || OLD.SUBG_COD || '|MARC_COD=' || OLD.MARC_COD || 
'|ARTI_DES=' || OLD.ARTI_DES || '|ARTI_DESVAR=' || OLD.ARTI_DESVAR || '|ARTI_TIPO=' || OLD.ARTI_TIPO || '|ARTI_EXIST=' || OLD.ARTI_EXIST || 
'|ARTI_FECHA=' || OLD.ARTI_FECHA || '|ARTI_UNIDAD=' || OLD.ARTI_UNIDAD || '|ARTI_PRECIO=' || OLD.ARTI_PRECIO || '|ARTI_CONSUMO=' || OLD.ARTI_CONSUMO || 
'|ARTI_IMPOTRO=' || OLD.ARTI_IMPOTRO || '|ARTI_PESO=' || OLD.ARTI_PESO || '|ARTI_ANCHO=' || OLD.ARTI_ANCHO || '|ARTI_ALTO=' || OLD.ARTI_ALTO || 
'|ARTI_LARGO=' || OLD.ARTI_LARGO || '|ARTI_MAX=' || OLD.ARTI_MAX || '|ARTI_MIN=' || OLD.ARTI_MIN || '|ARTI_DIAS=' || OLD.ARTI_DIAS || '|ESAR_COD=' || OLD.ESAR_COD || 
'|ARTI_USUARIO=' || OLD.ARTI_USUARIO || '|TAIV_COD=' || OLD.TAIV_COD || '|ARTI_CLASE=' || OLD.ARTI_CLASE || '|ARTI_DIANALIS=' || OLD.ARTI_DIANALIS || 
'|ARTI_DESCORTA=' || OLD.ARTI_DESCORTA || '|ARTI_PRODCANT=' || OLD.ARTI_PRODCANT || '|ARTI_CICLO=' || OLD.ARTI_CICLO || '|ARTI_ENSAMBLE=' || OLD.ARTI_ENSAMBLE || 
'|ARTI_VALORBONO=' || OLD.ARTI_VALORBONO || '|ARTI_MERMA=' || OLD.ARTI_MERMA || '|ARTI_SOBRANTE=' || OLD.ARTI_SOBRANTE || '|ARTI_PORCSOBR=' || OLD.ARTI_PORCSOBR || 
'|ARTI_REUSOB=' || OLD.ARTI_REUSOB || '|ARTI_SOBTOT=' || OLD.ARTI_SOBTOT || '|ARTI_PORCARAN=' || OLD.ARTI_PORCARAN || '|ARTI_MERMAENT=' || OLD.ARTI_MERMAENT || 
'|ARTI_MERMAPOR=' || OLD.ARTI_MERMAPOR || '|ARTI_TERCERO=' || OLD.ARTI_TERCERO || '|ARTI_INVIMA=' || OLD.ARTI_INVIMA || '|ARTI_INALC=' || OLD.ARTI_INALC || 
'|ARTI_DTOMAX=' || OLD.ARTI_DTOMAX || '|ARTI_CUM=' || OLD.ARTI_CUM || '|ARTI_POSARANCEL=' || OLD.ARTI_POSARANCEL;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_DATOS)
    VALUES (USER, 101, 1, 'U', NEW.arti_cod, :DATOS);
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
if (new.arti_des <> old.arti_des) then
  begin
  select count(*) from barras_articulo where arti_cod = new.arti_cod into :numrows;
  if (numrows = 1) then
    update barras_articulo set coba_des = new.arti_des where arti_cod = new.arti_cod;
  end
if (new.grup_cod <> old.grup_cod) then
 begin
  if (GRUP_TIVA = 'GRUPOS') then
   BEGIN
    SELECT GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP, GRUP_CTAIVADV, GRUP_CTAIVADC
      FROM GRUPO G
      WHERE GRUP_COD = NEW.GRUP_COD
      into :INV, :IVAC, :IVAV, :VTA, :COSTO, :DEV, :COMP, :retc, :retv, :retb, :retp, :ivadv, :ivadc;
      update CONTABIL_ARTICULO
       SET COAR_CTAINV = :INV,
           COAR_CTAIVAC = :IVAC,
           COAR_CTAIVAV = :IVAV,
           COAR_CTAVNT = :VTA,
           COAR_CTACOS = :COSTO,
           COAR_CTADEV = :DEV,
           COAR_CTACOMP = :COMP,
           COAR_CTARTFTE = :retc,
           COAR_CTARTFTEV = :retv,
           COAR_RTFTE = :retp,
           COAR_CTAIVADV = :IVADV,
           COAR_CTAIVADC = :IVADC,
           COAR_RTBASE = :retb
        WHERE ARTI_COD = NEW.ARTI_COD;
   END
 end
if (new.taiv_cod <> old.taiv_cod) then
 begin
  if (GRUP_TIVA = 'TARIFA IVA') then
   BEGIN
    SELECT TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTACOMP, TAIV_CTADEV, TAIV_CTAIVADV, TAIV_CTAIVADC
      FROM TARIFA_IVA T
      WHERE TAIV_COD = NEW.taiv_cod
      into :INV, :IVAC, :IVAV, :VTA, :COSTO, :COMP, :DEV, :ivadv, :IVADC;
      update CONTABIL_ARTICULO
       SET COAR_CTAINV = :INV,
           COAR_CTAIVAC = :IVAC,
           COAR_CTAIVAV = :IVAV,
           COAR_CTAVNT = :VTA,
           COAR_CTACOS = :COSTO,
           COAR_CTADEV = :DEV,
           COAR_CTACOMP = :COMP,
           COAR_CTAIVADV = :IVADV,
           COAR_CTAIVADC = :IVADC
        WHERE ARTI_COD = NEW.ARTI_COD;
   END
 end
end
^

/* Trigger: ARTICULO_BD */
CREATE 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
^

/* Trigger: ARTICULO_BI */
CREATE 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 articulo con el codigo ' || 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';
  if (new.arti_tercero is null) then
    new.arti_tercero = 'N';
  if (new.arti_inalc is null) then
    new.arti_inalc = 0;
  if (new.ARTI_MERMAENT is null) then
    new.ARTI_MERMAENT = 'N';
  NEW.arti_dec2799 = 'N';
end
^

/* Trigger: ARTICULO_BU */
CREATE TRIGGER ARTICULO_BU FOR ARTICULO
ACTIVE BEFORE UPDATE POSITION 0
AS
declare variable numrows integer;
declare variable inaex CHAR(2);
declare variable saldo numeric(18,2);
declare variable tarvie double precision ;
declare variable tarnue double precision ;
declare variable lista integer;
declare variable fijo double precision;
BEGIN
new.arti_fecha = cast('now' as DATE);
if (NEW.esar_cod <> OLD.esar_cod) then
    BEGIN
    if (NEW.esar_cod = 'I') then
        BEGIN
        execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PERMITIR INACTIVAR ARTICULOS CON EXISTENCIA') returning_values (:INAEX);
        if (INAEX = 'NO') then
            BEGIN
            execute procedure saldo_total_inventario (NEW.arti_cod, CAST('NOW' AS DATE)) returning_values (:SALDO);
            if (SALDO <> 0) then
                exception articulo_con_existencia 'El articulo ' || new.arti_cod || ' no puede inactivarse ya que aÃƒÂºn tiene existencias.';
            END
        END
    END
/* 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
if (new.taiv_cod <> old.taiv_cod) then
    begin
    if (new.arti_cambpreciva = 'S') then
        begin
        select taiv_porc from tarifa_iva where taiv_cod = old.taiv_cod into :tarvie;
        select taiv_porc from tarifa_iva where taiv_cod = new.taiv_cod into :tarnue;
        for select lipr_cod, prar_fijo from precios_articulo pa where arti_cod = new.arti_cod and
            exists (select lipr_cod from lista_precios where lipr_modif = 'S' and lipr_cod = pa.lipr_cod)
            into :lista, :fijo
            do
            begin
            fijo = (fijo / (100 + :tarvie)) * (100 + :tarnue);
            update precios_articulo pa set prar_fijo = :fijo
                where arti_cod = new.arti_cod and lipr_cod  = :lista;
            end
        end
    end
new.arti_cambpreciva = 'N';
END
^

/* Trigger: ARTICULO_DOCUMENTOS_BI */
CREATE TRIGGER ARTICULO_DOCUMENTOS_BI FOR ARTICULO_DOCUMENTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
select max(ardo_item)+1 from articulo_documentos where arti_cod = new.arti_cod into new.ardo_item;
if (new.ardo_item is null) then
    new.ardo_item = 1;
end
^

/* Trigger: AUDITORIA_AI */
CREATE TRIGGER AUDITORIA_AI FOR AUDITORIA
ACTIVE AFTER INSERT POSITION 0
as
declare variable CIA VARCHAR(3);
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable TRANSMIT CHAR(1);
declare variable TIPOREF INTEGER;
declare variable usreplica VARCHAR(20);
begin
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'NOMBRE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (USREPLICA);
if (NEW.audi_usuario <> :usreplica) then
    begin
    /* SI HAY REPLICACION INSERTE LOS EVENTOS */
    if ((NEW.tido_cod >= 10) AND (NEW.tido_cod <= 89)) THEN
        BEGIN
        /* DOCUMENTOS */
        if (NEW.tido_cod = 31) then
            BEGIN
            PREF = SUBSTRING(NEW.audi_cod FROM 1 FOR STRLEN(NEW.audi_cod)-8);
            NUMERO = SUBSTRING(NEW.audi_cod FROM STRLEN(PREF)+1 FOR 8);
            SELECT FACT_TRANSMIT FROM FACTURAS WHERE FACT_ID = NEW.audi_iddoc INTO :TRANSMIT;
            END
        ELSE
            BEGIN
            PREF = SUBSTRING(NEW.audi_cod FROM 1 FOR STRLEN(NEW.audi_cod)-6);
            NUMERO = SUBSTRING(NEW.audi_cod FROM STRLEN(PREF)+1 FOR 6);
            TRANSMIT = 'N';
            END
    
        if (TRANSMIT = 'N') then
            FOR SELECT REPC_COMPANIA FROM replicacion_configura
                WHERE REPC_TIPO = NEW.tido_cod AND REPC_REPLICA = 'S' AND ((REPC_PREF = :PREF) or (REPC_PREF = ''))
                INTO :CIA
                DO
                BEGIN
                INSERT INTO replica_eventos (RPEV_COMPANIA, RPEV_TIPO, RPEV_IDDOC, RPEV_PREF, RPEV_NUMERO, RPEV_CODIGO, RPEV_OPER, RPEV_FECREG, RPEV_HORAREG)
                    VALUES(:CIA,  NEW.tido_cod, NEW.audi_iddoc, :PREF, :NUMERO, NEW.audi_cod, NEW.audi_oper, NEW.audi_fecha, NEW.audi_hora);
                END
        END
    if ((NEW.tido_cod = 101) or ((NEW.tido_cod >= 124) AND (NEW.tido_cod <= 129))
        or ((NEW.tido_cod >= 201) AND (NEW.tido_cod <= 205))) then
        BEGIN
       /* ARTICULOS */
        if (NEW.tido_cod = 126) then
            BEGIN
            FOR SELECT REPC_COMPANIA FROM replicacion_configura
                WHERE REPC_TIPO = 126 AND REPC_REPLICA = 'S'
                INTO :CIA
                DO
                BEGIN
                INSERT INTO replica_eventos (RPEV_COMPANIA, RPEV_TIPO, RPEV_IDDOC, RPEV_PREF, RPEV_NUMERO, RPEV_CODIGO, RPEV_OPER, RPEV_FECREG, RPEV_HORAREG)
                    VALUES(:cia,  NEW.tido_cod, NEW.audi_iddoc, NULL, NULL, NEW.audi_cod, NEW.audi_oper, NEW.audi_fecha, NEW.audi_hora);
                END
            END
        else
            BEGIN
            FOR SELECT REPC_COMPANIA FROM replicacion_configura
                WHERE REPC_TIPO = NEW.tido_cod AND REPC_REPLICA = 'S'
                INTO :CIA
                DO
                BEGIN
                INSERT INTO replica_eventos (RPEV_COMPANIA, RPEV_TIPO, RPEV_IDDOC, RPEV_PREF, RPEV_NUMERO, RPEV_CODIGO, RPEV_OPER, RPEV_FECREG, RPEV_HORAREG)
                    VALUES(:cia,  NEW.tido_cod, NULL, NULL, NULL, NEW.audi_cod, NEW.audi_oper, NEW.audi_fecha, NEW.audi_hora);
                END
            END
        END
    if (((NEW.tido_cod >= 102) AND (NEW.tido_cod <= 109)) or (NEW.tido_cod = 208) or (NEW.tido_cod = 209) or (NEW.tido_cod = 210)) THEN
        BEGIN
        /* TERCERO, CLIENTES, PROVEEDORES, VENDEDORES, COBRADORES, AUTORIZACIONES, ZONAS, GRUPOS */
        FOR SELECT REPC_COMPANIA FROM replicacion_configura
            WHERE REPC_TIPO = NEW.tido_cod AND REPC_REPLICA = 'S'
            INTO :CIA
            DO
            BEGIN
            INSERT INTO replica_eventos (RPEV_COMPANIA, RPEV_TIPO, RPEV_IDDOC, RPEV_PREF, RPEV_NUMERO, RPEV_CODIGO, RPEV_OPER, RPEV_FECREG, RPEV_HORAREG)
                VALUES(:cia,  NEW.tido_cod, NULL, NULL, NULL, NEW.audi_cod, NEW.audi_oper, NEW.audi_fecha, NEW.audi_hora);
            END
        END
    if ((NEW.tido_cod >= 111) AND (NEW.tido_cod <= 117)) THEN
        BEGIN
        /* INTERFACES */
        FOR SELECT REPC_COMPANIA FROM replicacion_configura
            WHERE REPC_TIPO = NEW.tido_cod AND REPC_REPLICA = 'S'
            INTO :CIA
            DO
            BEGIN
            INSERT INTO replica_eventos (RPEV_COMPANIA, RPEV_TIPO, RPEV_IDDOC, RPEV_PREF, RPEV_NUMERO, RPEV_CODIGO, RPEV_OPER, RPEV_FECREG, RPEV_HORAREG)
                VALUES(:cia,  NEW.tido_cod, NEW.audi_iddoc, NULL, NULL, NEW.audi_cod, NEW.audi_oper, NEW.audi_fecha, NEW.audi_hora);
            END
        END
    if (NEW.tido_cod = 235) THEN
        BEGIN
        /* PUNTOS CLIENTES */
        FOR SELECT REPC_COMPANIA FROM replicacion_configura
            WHERE REPC_TIPO = NEW.tido_cod AND REPC_REPLICA = 'S'
            INTO :CIA
            DO
            BEGIN
            INSERT INTO replica_eventos (RPEV_COMPANIA, RPEV_TIPO, RPEV_IDDOC, RPEV_PREF, RPEV_NUMERO, RPEV_CODIGO, RPEV_OPER, RPEV_FECREG, RPEV_HORAREG)
                VALUES(:cia,  NEW.tido_cod, NEW.audi_iddoc, NULL, NULL, NEW.audi_cod, NEW.audi_oper, NEW.audi_fecha, NEW.audi_hora);
            END
        END
    end
end
^

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

/* Trigger: AUTORIZACIONES_AD */
CREATE TRIGGER AUTORIZACIONES_AD FOR AUTORIZACIONES
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (107, 31, 'D', OLD.auto_numero);
end
^

/* Trigger: AUTORIZACIONES_AI */
CREATE TRIGGER AUTORIZACIONES_AI FOR AUTORIZACIONES
ACTIVE AFTER INSERT POSITION 0
as
begin
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (107, 31, 'I', NEW.auto_numero);
end
^

/* Trigger: AUTORIZACIONES_AU */
CREATE TRIGGER AUTORIZACIONES_AU FOR AUTORIZACIONES
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (107, 31, 'U', NEW.auto_numero);
end
^

/* Trigger: AUTORIZACIONES_BI */
CREATE TRIGGER AUTORIZACIONES_BI FOR AUTORIZACIONES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable numrows integer;
BEGIN
  execute procedure COMPLETA_CEROS8(NEW.auto_inicial) returning_values (NEW.auto_inicial);
  execute procedure COMPLETA_CEROS8(NEW.auto_final) returning_values (NEW.auto_final);
  if (new.auto_contado is null) then
    new.auto_contado = 'N';
  if (new.auto_avisar is null) then
    new.auto_avisar = 100;
  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
^

/* Trigger: AUTORIZACIONES_CARTERA_BI */
CREATE TRIGGER AUTORIZACIONES_CARTERA_BI FOR AUTORIZACIONES_CARTERA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECINI DATE;
begin
/* llene cupo, cartera, etc */
if (new.auca_nit <> '') then
    begin
    SELECT CLIE_CUPO, CLIE_DIAS FROM CLIENTES WHERE TERC_NIT = NEW.auca_nit INTO new.auca_cupo, NEW.auca_dias;
    if (new.auca_cupo IS NULL) then
        new.auca_cupo = 0;
    SELECT SUM(SALDO) FROM VENCIDO_CLIENTE (NEW.auca_nit, NEW.auca_fecha, '0', 'N') INTO new.auca_cartera;
    if (new.auca_cartera IS NULL) then
        new.auca_cartera = 0;
    new.auca_cupo = new.auca_cupo - new.auca_cartera;
    FECINI = NEW.auca_fecha - 30;
    SELECT MFACTURAS - MDEVOLUCIONES + IVAFACT - IVADEV + CONSUMOF - CONSUMOD
        FROM ventas_cliente(NEW.auca_nit, :FECINI, NEW.auca_fecha, 0) INTO NEW.auca_ventas;
    SELECT AVG(DIAS), sum(SALDO) FROM cartera_cliente(NEW.auca_nit, NEW.auca_fecha, '0', 0, 'N', 0)
        INTO NEW.auca_diasr, NEW.AUCA_SALDO;
    end
end
^

/* Trigger: BARRAS_ARTICULO_AD */
CREATE TRIGGER BARRAS_ARTICULO_AD FOR BARRAS_ARTICULO
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 125, 1, 'D', OLD.arti_cod);
end
^

/* Trigger: BARRAS_ARTICULO_AI */
CREATE TRIGGER BARRAS_ARTICULO_AI FOR BARRAS_ARTICULO
ACTIVE AFTER INSERT POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 125, 1, 'I', NEW.arti_cod);
end
^

/* Trigger: BARRAS_ARTICULO_AU */
CREATE TRIGGER BARRAS_ARTICULO_AU FOR BARRAS_ARTICULO
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 125, 1, 'U', OLD.arti_cod);
end
^

/* Trigger: BODEGA_BI */
CREATE TRIGGER BODEGA_BI FOR BODEGA
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.bode_activa IS NULL) then
    NEW.bode_activa = 'S';
end
^

/* Trigger: BONOS_PAGO_BD */
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
^

/* Trigger: CAMBIA_COSTOS_AD */
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;
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
^

/* Trigger: CAMBIA_COSTOS_AI */
CREATE 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
^

/* Trigger: CAMBIA_COSTOS_AU */
CREATE 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
^

/* Trigger: CAMBIA_PRECIOS_BI */
CREATE TRIGGER CAMBIA_PRECIOS_BI FOR CAMBIA_PRECIOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.capr_id = GEN_ID(id_cambprecio, 1);
NEW.capr_fecha = CAST('NOW' AS DATE);
NEW.capr_usuario = USER;
end
^

/* Trigger: CAMBIODOC_ENTRADAS_AD */
CREATE 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
^

/* Trigger: CAMBIODOC_ENTRADAS_AI */
CREATE TRIGGER CAMBIODOC_ENTRADAS_AI FOR CAMBIODOC_ENTRADAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
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
^

/* Trigger: CAMBIODOC_ENTRADAS_AU */
CREATE TRIGGER CAMBIODOC_ENTRADAS_AU FOR CAMBIODOC_ENTRADAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
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
^

/* Trigger: CAMBIODOC_SALIDAS_AD */
CREATE TRIGGER CAMBIODOC_SALIDAS_AD FOR CAMBIODOC_SALIDAS
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CAJA INTEGER;
declare variable FEC DATE;
BEGIN
if ((OLD.CADO_ID <> 0) AND (OLD.cdsa_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_debitos = moca_debitos - OLD.cdsa_monto
        where moca_tiporef = 63 and moca_idref = OLD.cado_id and caja_id = :CAJA;

    if (OLD.FOPA_ID <> 1) then
        /* BORRE EL DOCUMENTO EN CAJA */
        DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE DPCA_TIPOENT = 63 AND DPCA_IDENT = OLD.CADO_ID AND
            DPCA_BANCO = OLD.CDSA_BANCO AND DPCA_CUENTA = OLD.CDSA_CUENTA AND DPCA_NUMERO = OLD.CDSA_NUMERO;
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO(:CAJA, :FEC, OLD.CDSA_MONTO, 'S');
    END
END
^

/* Trigger: CAMBIODOC_SALIDAS_AI */
CREATE TRIGGER CAMBIODOC_SALIDAS_AI FOR CAMBIODOC_SALIDAS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable CAJA INTEGER;
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable EXISTE CHAR(1);
BEGIN
if ((NEW.CADO_ID <> 0) AND (NEW.cdsa_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_debitos = moca_debitos + new.cdsa_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, NEW.cdsa_monto, 0, 'S', new.cado_id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    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.CDSA_BANCO, NEW.CDSA_CUENTA, NEW.CDSA_NUMERO, NEW.CDSA_FECHA, NEW.CDSA_MONTO, 63, NEW.CADO_ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO(:CAJA, :FEC, NEW.CDSA_MONTO, 'N');
    END
END
^

/* Trigger: CAMBIODOC_SALIDAS_AU */
CREATE TRIGGER CAMBIODOC_SALIDAS_AU FOR CAMBIODOC_SALIDAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable CAJA INTEGER;
declare variable FEC DATE;
declare variable CONC VARCHAR(60);
declare variable EXISTE CHAR(1);
BEGIN
if ((OLD.CADO_ID <> 0) and (old.cdsa_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_debitos = moca_debitos - OLD.cdsa_monto
        where moca_tiporef = 63 and moca_idref = OLD.cado_id and caja_id = :CAJA;

    /* BORRE EL DOCUMENTO EN CAJA */
    if (OLD.FOPA_ID <> 1) then
        DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE DPCA_TIPOENT = 63 AND DPCA_IDENT = OLD.CADO_ID AND
            DPCA_BANCO = OLD.CDSA_BANCO AND DPCA_CUENTA = OLD.CDSA_CUENTA AND DPCA_NUMERO = OLD.CDSA_NUMERO;
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO(:CAJA, :FEC, OLD.CDSA_MONTO, 'S');
    END
if ((NEW.CADO_ID <> 0) and (NEW.cdsa_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_debitos = moca_debitos + new.cdsa_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, NEW.cdsa_monto, 0, 'S', new.cado_id);
        
    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.CDSA_BANCO, NEW.CDSA_CUENTA, NEW.CDSA_NUMERO, NEW.CDSA_FECHA, NEW.CDSA_MONTO, 63, NEW.CADO_ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO(:CAJA, :FEC, NEW.CDSA_MONTO, 'N');
    END
END
^

/* Trigger: CAMBIODOC_SALIDAS_BI */
CREATE 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
^

/* Trigger: CAMBIO_ARTICULOS_BI */
CREATE TRIGGER CAMBIO_ARTICULOS_BI FOR CAMBIO_ARTICULOS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMSAL VARCHAR(8);
declare variable DESCR VARCHAR(60);
declare variable UNIDAD VARCHAR(8);
declare variable TIVA NUMERIC(9,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable VENCE DATE;
begin
  /* MIRE SI YA HAY ID DE SALIDA ASIGNADO */
  SELECT CAAR_IDSAL FROM cambio_articulos WHERE CAAR_ID = NEW.CAAR_ID INTO NEW.CAAR_IDSAL;
  if (NEW.CAAR_IDSAL IS NULL) then
    BEGIN
    NEW.caar_idsal = GEN_ID(id_salida, 1);
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 12 AND PREF_PRE = NEW.caar_prefsal INTO :numsal;  
    /* REGISTRE LA SALIDA */
    insert into SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER,
        SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS, SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS,
        TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
    values (NEW.caar_idsal, 12, NEW.caar_prefsal, NEW.caar_bodega, :numsal, NEW.caar_fecha, NEW.caar_concepto, NULL, 0,
          0, 'N', NULL, 'N', 'N', NULL, NULL, NULL, 0, USER, 'N');
    END
  SELECT  ARTI_DES, ARTI_UNIDAD, TAIV_PORC, ARTI_CONSUMO FROM ARTICULO A, tarifa_iva T
    WHERE ARTI_COD = NEW.arti_cods AND A.taiv_cod = T.taiv_cod INTO :DESCR, :UNIDAD, :TIVA, :CONSUMO;
 TOTAL = NEW.caar_cant * NEW.caar_costo;
  insert into SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
    SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO,
    SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
  values (NEW.caar_idsal, NEW.caar_item, NEW.arti_cods, NEW.caar_bodega, NEW.caar_cant, :UNIDAD, NEW.caar_lote, 1, :DESCR,
          NULL, :tiva, (:TOTAL * :TIVA / 100), :CONSUMO, NEW.arti_cods, 'N', NEW.caar_costo, (:TOTAL + (:TOTAL * :TIVA / 100)), 'N');

  /* MIRE SI YA HAY ID DE ENTRADA ASIGNADO */
  SELECT CAAR_IDENT FROM cambio_articulos WHERE CAAR_ID = NEW.CAAR_ID INTO NEW.CAAR_IDENT;
  if (NEW.CAAR_IDENT IS NULL) then
      BEGIN
      NEW.caar_ident = GEN_ID(id_entrada, 1);
      SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 11 AND PREF_PRE = NEW.caar_prefent INTO :numsal;
      /* REGISTRE LA ENTRADA */
      insert into ENTRADAS (ENTR_ID, TIDO_COD, PREF_PRE, BODE_COD, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER,
        ENTR_TIPOREF, ENTR_IDREF, ENTR_IMPTOS, ENTR_NOMTERC, ENTR_ANULADO, ENTR_TRANSMIT, ENTR_OBS,
        TERC_NIT, ENTR_USUARIO, NUMOK, ENTR_ORDEN, ENTR_ORDENID)
      values (NEW.caar_ident, 11, NEW.caar_prefent, NEW.caar_bodega, :numsal, NEW.caar_fecha, NEW.caar_concepto, NULL, 0,
          0, 'N', NULL, 'N', 'N', NULL, NULL, USER, 'N', NULL, 0);
      END
  SELECT  ARTI_DES, ARTI_UNIDAD, TAIV_PORC, ARTI_CONSUMO FROM ARTICULO A, tarifa_iva T
    WHERE ARTI_COD = NEW.arti_code AND A.taiv_cod = T.taiv_cod INTO :DESCR, :UNIDAD, :TIVA, :CONSUMO;
  SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = NEW.caar_lote AND ARTI_COD = NEW.arti_cods AND BODE_COD = NEW.caar_bodega INTO :vence;
  TOTAL = NEW.caar_cant * NEW.caar_costo;
  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, ENDE_COSTON, ENDE_TOTALN)
  values (NEW.caar_ident, NEW.caar_item, NEW.arti_code, NEW.caar_bodega, NEW.caar_cant, :UNIDAD, NEW.caar_costo, NEW.caar_lote, 1,
          :descr, NULL, 0, 0, :TIVA, (:TOTAL * :TIVA / 100), (:CONSUMO * NEW.caar_cant),
          NEW.arti_code, (:TOTAL + (:TOTAL * :TIVA / 100)), 'N', 'N', :VENCE, NULL, NEW.caar_costo, (:TOTAL + (:TOTAL * :TIVA / 100)));
end
^

/* Trigger: CAMBIO_COSTO_AD */
CREATE TRIGGER CAMBIO_COSTO_AD FOR CAMBIO_COSTO
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 10) and (mvar_idref = old.caco_id) and (mvar_item = 1);
select enco_consec from comprobante_encabezado where enco_tiporef = 10 and enco_idref = old.caco_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 10 and enco_idref = old.caco_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 10, OLD.caco_id, 'D', OLD.pref_pre || OLD.caco_numero);
end
^

/* Trigger: CAMBIO_COSTO_AI */
CREATE TRIGGER CAMBIO_COSTO_AI FOR CAMBIO_COSTO
ACTIVE AFTER INSERT POSITION 0
as
declare variable CODBOD VARCHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable ESLOTE CHAR(1);
declare variable LOTE VARCHAR(20);
begin
IF ((NEW.caco_id <> 0) AND (NEW.caco_anulado = 'N')) THEN
  BEGIN
  FOR SELECT BODE_COD FROM BODEGA INTO :CODBOD
    do
    BEGIN
    EXECUTE PROCEDURE saldo_inventario(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA) returning_values (:SALDO);
    if (SALDO <> 0) then
      BEGIN
      SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = NEW.ARTI_COD INTO :ESLOTE;
      if (ESLOTE = 'L') then
        begin
        for select LOTE, SALDO from saldo_lotes_fecha(new.arti_cod, :codbod, new.caco_fecha)
            into :lote, :saldo
            do
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA, 10, NEW.caco_id, new.caco_concepto, :SALDO, NEW.CACO_NVOCOSTO, NEW.CACO_NVOCOSTON, 'N', :lote, new.pref_pre, new.caco_numero, 1);
        end
      else
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA, 10, NEW.caco_id, new.caco_concepto, :SALDO, NEW.CACO_NVOCOSTO, NEW.CACO_NVOCOSTON, 'N', null, new.pref_pre, new.caco_numero, 1);
      END
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 10, NEW.caco_id, 'I', NEW.pref_pre || NEW.caco_numero);
  END
end
^

/* Trigger: CAMBIO_COSTO_AU */
CREATE TRIGGER CAMBIO_COSTO_AU FOR CAMBIO_COSTO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec INTEGER;
declare variable CODBOD VARCHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable ESLOTE CHAR(1);
declare variable LOTE VARCHAR(20);
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.caco_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 10 and enco_idref = old.caco_id into :consec;
    if (NOT consec is null) then
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    delete from comprobante_encabezado where enco_tiporef = 10 and enco_idref = old.caco_id;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 10) and (mvar_idref = new.caco_id) and (mvar_item = 1);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 10, NEW.caco_id, 'A', NEW.pref_pre || NEW.caco_numero);
    END
ELSE
    BEGIN
    if ((OLD.caco_id <> 0) AND (OLD.caco_anulado = 'N')) then
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 10) and (mvar_idref = new.caco_id) and (mvar_item = 1);
    if ((NEW.caco_id <> 0) AND (NEW.caco_anulado = 'N')) then
      begin
      FOR SELECT BODE_COD FROM BODEGA INTO :CODBOD
        do
        BEGIN
        EXECUTE PROCEDURE saldo_inventario(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA) returning_values (:SALDO);
        if (SALDO <> 0) then
          BEGIN
          SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = NEW.ARTI_COD INTO :ESLOTE;
          if (ESLOTE = 'L') then
            begin
            for select LOTE, SALDO from saldo_lotes_fecha(new.arti_cod, :codbod, new.caco_fecha)
                into :lote, :saldo
                do
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                    VALUES(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA, 10, NEW.caco_id, new.caco_concepto, :SALDO, NEW.CACO_NVOCOSTO, NEW.CACO_NVOCOSTON, 'N', :lote, new.pref_pre, new.caco_numero, 1);
            end
          else
              INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA, 10, NEW.caco_id, new.caco_concepto, :SALDO, NEW.CACO_NVOCOSTO, NEW.CACO_NVOCOSTON, 'N', null, new.pref_pre, new.caco_numero, 1);
          END
        END
      end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 10, NEW.caco_id, 'U', NEW.pref_pre || NEW.caco_numero);
    END
end
^

/* Trigger: CAMBIO_COSTO_BI */
CREATE TRIGGER CAMBIO_COSTO_BI FOR CAMBIO_COSTO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 10 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.caco_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 10 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.caco_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 10 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.caco_numero) returning_values (NEW.caco_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM cambio_costo WHERE PREF_PRE = NEW.PREF_PRE AND CACO_NUMERO = NEW.caco_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un cambio de costo con el nÃºmero ' || new.pref_pre || new.caco_numero;
end
^

/* Trigger: CAMBIO_DOCUMENTOS_AD */
CREATE TRIGGER CAMBIO_DOCUMENTOS_AD FOR CAMBIO_DOCUMENTOS
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 63, old.cado_id, 'D', old.pref_pre || old.cado_numero);
end
^

/* Trigger: CAMBIO_DOCUMENTOS_AI */
CREATE TRIGGER CAMBIO_DOCUMENTOS_AI FOR CAMBIO_DOCUMENTOS
ACTIVE AFTER INSERT POSITION 1
as
begin
IF (NEW.CADO_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 63, NEW.cado_id, 'I', NEW.pref_pre || NEW.cado_numero);
end
^

/* Trigger: CAMBIO_DOCUMENTOS_AU */
CREATE TRIGGER CAMBIO_DOCUMENTOS_AU FOR CAMBIO_DOCUMENTOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
/* SI CAMBIO UN DATO CRITICO REPROCESE EL DETALLE */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.cado_numero <> NEW.cado_numero) or
    (OLD.cado_fecha <> NEW.cado_fecha) ) then
    BEGIN
    UPDATE CAMBIODOC_ENTRADAS SET CDEN_TRANSMIT = 'N' WHERE CADO_ID = OLD.CADO_ID;
    UPDATE CAMBIODOC_SALIDAS SET CDSA_TRANSMIT = 'N' WHERE CADO_ID = OLD.CADO_ID;
    END
if (OLD.CADO_ANULADO <> NEW.CADO_ANULADO) then
    BEGIN
    UPDATE CAMBIODOC_ENTRADAS SET CDEN_ANULADO = NEW.CADO_ANULADO WHERE CADO_ID = OLD.CADO_ID;
    UPDATE CAMBIODOC_SALIDAS SET CDSA_ANULADO = NEW.CADO_ANULADO WHERE CADO_ID = OLD.CADO_ID;
    END
if (OLD.CADO_TRANSMIT <> NEW.CADO_TRANSMIT) then
    BEGIN
    UPDATE CAMBIODOC_ENTRADAS SET CDEN_TRANSMIT = NEW.CADO_TRANSMIT WHERE CADO_ID = OLD.CADO_ID;
    UPDATE CAMBIODOC_SALIDAS SET CDSA_TRANSMIT = NEW.CADO_TRANSMIT WHERE CADO_ID = OLD.CADO_ID;
    END
if (NEW.cado_anulado = 'S') then
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 63, NEW.cado_id, 'A', NEW.pref_pre || NEW.cado_numero);
ELSE
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER,63, NEW.cado_id, 'U', NEW.pref_pre || NEW.cado_numero);
end
^

/* Trigger: CAMBIO_DOCUMENTOS_BI */
CREATE TRIGGER CAMBIO_DOCUMENTOS_BI FOR CAMBIO_DOCUMENTOS
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 = 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
^

/* Trigger: CARGA_REMESA_AD */
CREATE TRIGGER CARGA_REMESA_AD FOR CARGA_REMESA
ACTIVE AFTER DELETE POSITION 0
as
declare variable ABONOS integer;
declare variable CONSEC integer;
begin
if ((OLD.cgrm_id <> 0) AND (OLD.cgrm_anulado = 'N')) then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = old.tido_cod and enco_idref = old.cgrm_id into :consec;
    if (NOT consec is null) then
        begin
        delete from comprobante_detalle where enco_consec = :consec;
        delete from comprobante_detalle_niif where enco_consec = :consec;
        end
    delete from comprobante_encabezado where enco_tiporef = old.tido_cod and enco_idref = old.cgrm_id;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, old.tido_cod, OLD.cgrm_id, 'D', OLD.cgrm_pref || OLD.cgrm_numero);

    if (OLD.cgrm_fpago = 'R') then
        BEGIN
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = old.tido_cod AND SDCA_IDREF = OLD.cgrm_id AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) then
            BEGIN
            /* BORRE EL REGISTRO PREVIO */
            delete from saldos_doc_cartera where sdca_tiporef = old.tido_cod and sdca_idref = old.cgrm_id;
            delete from movimiento_clientes where (mvcl_tiporef = old.tido_cod) and (mvcl_idref = old.cgrm_id);
            END
        else
            exception DOCUMENTO_CON_ABONOS;
        END
    if ((OLD.cgrm_fpago = 'C') AND (OLD.cgrm_caja <> 0) AND (OLD.cgrm_caja IS NOT NULL)) then
        BEGIN
        DELETE FROM MOVIMIENTO_CAJA WHERE moca_tiporef = old.tido_cod and moca_idref = OLD.cgrm_id;
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (OLD.cgrm_caja, OLD.cgrm_fecha, OLD.cgrm_total, 'S');
        END
    END
end
^

/* Trigger: CARGA_REMESA_AI */
CREATE TRIGGER CARGA_REMESA_AI FOR CARGA_REMESA
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONC VARCHAR(60);
begin
IF ((NEW.cgrm_id <> 0) AND (NEW.cgrm_anulado = 'N')) THEN
  BEGIN
  /* AFECTE LA CAJA O LA CARTERA */
  if ((NEW.cgrm_fpago = 'C') AND (NEW.cgrm_caja <> 0) AND (NEW.cgrm_caja IS NOT NULL)) then
    BEGIN
    CONC = 'REMESA No. ' || NEW.cgrm_pref || NEW.cgrm_numero;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), NEW.cgrm_caja, new.tido_cod, NEW.cgrm_pref, NEW.cgrm_numero, NEW.cgrm_fecha, :Conc, NEW.cgrm_total, 0, 'S', new.cgrm_id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (NEW.cgrm_caja, NEW.cgrm_fecha, NEW.cgrm_total, 'N');
    END
  if (NEW.cgrm_fpago = 'R') then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (new.tido_cod, NEW.cgrm_id, NEW.cgrm_fecha, NEW.cgrm_nit, 0, 0, 0, 0, 0, 0, 0, 'S', NEW.cgrm_total);
    /* Registre el movimiento del cliente */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.cgrm_nit, new.tido_cod, NEW.cgrm_id, NEW.cgrm_fecha, NEW.cgrm_fecha, :CONC, NEW.cgrm_total, 0, 0, 0, 'S', 'N', NEW.cgrm_pref, NEW.cgrm_numero, '01', NEW.cgrm_vend);
    END

  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, new.tido_cod, NEW.cgrm_id, 'I', NEW.cgrm_pref || NEW.cgrm_numero);
  END
end
^

/* Trigger: CARGA_REMESA_AU */
CREATE TRIGGER CARGA_REMESA_AU FOR CARGA_REMESA
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable CONSEC INTEGER;
declare variable NUMRDC VARCHAR(12);
begin
if (new.cgrm_manif = old.cgrm_manif) then
    begin
    if (NEW.cgrm_anulado <> OLD.cgrm_anulado) then
        begin
        if (NEW.cgrm_anulado = 'S') then
            BEGIN
            select enco_consec from comprobante_encabezado where enco_tiporef = old.tido_cod and enco_idref = old.cgrm_id into :consec;
            if (NOT consec is null) then
              begin
              delete from comprobante_detalle where enco_consec = :consec;
              delete from comprobante_detalle_niif where enco_consec = :consec;
              end
            delete from comprobante_encabezado where enco_tiporef = old.tido_cod and enco_idref = old.cgrm_id;
            INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
                VALUES (USER, NEW.tido_cod, NEW.cgrm_id, 'A', NEW.cgrm_pref || NEW.cgrm_numero);
            delete from saldos_doc_cartera where sdca_tiporef = old.tido_cod and sdca_idref = old.cgrm_id;
            delete from movimiento_clientes where (mvcl_tiporef = old.tido_cod) and (mvcl_idref = old.cgrm_id);
            if ((OLD.cgrm_fpago = 'C') AND (OLD.cgrm_caja <> 0) AND (OLD.cgrm_caja IS NOT NULL)) then
                BEGIN
                DELETE FROM MOVIMIENTO_CAJA WHERE moca_tiporef = old.tido_cod and moca_idref = OLD.cgrm_id;
                EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (OLD.cgrm_caja, OLD.cgrm_fecha, OLD.cgrm_total, 'S');
                end
            END
        end
    else
        INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
            VALUES (USER, NEW.tido_cod, NEW.cgrm_id, 'U', NEW.cgrm_pref || NEW.cgrm_numero);

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

/* Trigger: CARGA_REMESA_BI */
CREATE TRIGGER CARGA_REMESA_BI FOR CARGA_REMESA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.cgrm_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.cgrm_pref INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.cgrm_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.cgrm_pref;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.cgrm_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.cgrm_pref;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.cgrm_numero) returning_values (NEW.cgrm_numero);
    NEW.cgrm_numok = 'S';
    END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM carga_remesa WHERE CGRM_PREF = NEW.cgrm_pref AND CGRM_NUMERO = NEW.cgrm_numero AND TIDO_COD = NEW.tido_cod INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;end
^

/* Trigger: CENTROS_BD */
CREATE 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
^

/* Trigger: CHEQUES_AD */
CREATE TRIGGER CHEQUES_AD FOR CHEQUES
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* deshaga lo viejo */
DELETE FROM MOVIMIENTO_BANCO
    WHERE MOBA_TIPODOC = 72 AND MOBA_IDREF = OLD.cheq_id;
DELETE FROM MOVIMIENTO_BANCO
    WHERE MOBA_TIPOREF = 72 AND MOBA_IDREF = OLD.cheq_id;
select enco_consec from comprobante_encabezado where enco_tiporef = 72 and enco_idref = old.cheq_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 72 and enco_idref = old.cheq_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 72, OLD.cheq_id, 'D', OLD.prba_pref || OLD.cheq_numero, OLD.cuba_cod);
END
^

/* Trigger: CHEQUES_AI */
CREATE TRIGGER CHEQUES_AI FOR CHEQUES
ACTIVE AFTER INSERT POSITION 0
as
declare variable conc varchar(60);
begin
  /* Actualice el movimiento del banco */
if ((new.cheq_id <> 0) AND (NEW.CHEQ_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, 72, NEW.PRBA_PREF, NEW.cheq_numero, NEW.cheq_fecha, NEW.cheq_concepto, NEW.cheq_monto, 'N', new.cheq_id, 72);
    if (new.cheq_gmfmonto <> 0) then
      begin
      conc = 'GMF EN CHEQUE No. ' || NEW.PRBA_PREF || NEW.CHEQ_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.cheq_numero, NEW.cheq_fecha, :conc, NEW.cheq_gmfmonto, 'N', new.cheq_id, 72);
      end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 72, NEW.CHEQ_id, 'I', NEW.prba_pref || NEW.CHEQ_numero, NEW.cuba_cod);
    end
end
^

/* Trigger: CHEQUES_AU */
CREATE TRIGGER CHEQUES_AU FOR CHEQUES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
BEGIN
if (NEW.cheq_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 72 and enco_idref = old.cheq_id into :consec;
    if (NOT consec is null) then
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    delete from comprobante_encabezado where enco_tiporef = 72 and enco_idref = old.cheq_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 72, NEW.cheq_id, 'A', NEW.prba_pref || NEW.CHEQ_numero, NEW.cuba_cod);
    END
if ((new.cheq_id <> 0) AND (NEW.CHEQ_ANULADO = 'N')) then
    begin
    /* grabe lo nuevo */
    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, 72, NEW.PRBA_PREF, NEW.cheq_numero, NEW.cheq_fecha, NEW.cheq_concepto, NEW.cheq_monto, 'N', new.cheq_id, 72);
    if (new.cheq_gmfmonto <> 0) then
        begin
        conc = 'GMF EN CHEQUE No. ' || NEW.PRBA_PREF || NEW.CHEQ_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.cheq_numero, NEW.cheq_fecha, :conc, NEW.cheq_gmfmonto, 'N', new.cheq_id, 72);
        end
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 72, NEW.cheq_id, 'U', NEW.prba_pref || NEW.CHEQ_numero, NEW.cuba_cod);
    end
END
^

/* Trigger: CHEQUES_BI */
CREATE TRIGGER CHEQUES_BI FOR CHEQUES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable conf CHAR(2);
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;
if (new.cheq_confirma is null) then
    begin
    execute procedure lee_configuracion ('BANCOS', 'CHEQUES', 'ASUMIR ENTREGA CONFIRMADA DE LOS CHEQUES GIRADOS') returning_values (:conf);
    if (conf = 'SI') then
        new.cheq_confirma = 'S';
    else
        new.cheq_confirma = 'N';
    end
END
^

/* Trigger: CHEQUES_BU */
CREATE TRIGGER CHEQUES_BU FOR CHEQUES
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if ((OLD.cheq_anulado = 'N') AND (OLD.cheq_id <> 0)) then
    begin
    /* esta anulando */
    if (NEW.cheq_anulado = 'S') then
        UPDATE MOVIMIENTO_BANCO
            SET MOBA_CONCEPTO = 'ANULADO', MOBA_TOTAL = 0
            WHERE MOBA_TIPODOC = 72 AND MOBA_IDREF = OLD.cheq_id;
    else
        DELETE FROM MOVIMIENTO_BANCO
            WHERE MOBA_TIPODOC = 72 AND MOBA_IDREF = OLD.cheq_id;
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPOREF = 72 AND MOBA_IDREF = OLD.cheq_id;
    end
end
^

/* Trigger: CIERRE_ANUAL_AD */
CREATE TRIGGER CIERRE_ANUAL_AD FOR CIERRE_ANUAL
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 5, OLD.cian_id, 'D', OLD.prco_pref || OLD.enco_numero);
end
^

/* Trigger: CIERRE_ANUAL_AI */
CREATE TRIGGER CIERRE_ANUAL_AI FOR CIERRE_ANUAL
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.CIAN_ID <> 0) THEN
  INSERT INTO AUDITORIA(audi_usuario, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 5, NEW.cian_id, 'I', NEW.prco_pref || NEW.enco_numero);
end
^

/* Trigger: CIERRE_ANUAL_AU */
CREATE TRIGGER CIERRE_ANUAL_AU FOR CIERRE_ANUAL
ACTIVE AFTER UPDATE POSITION 1
as
begin
  INSERT INTO AUDITORIA(audi_usuario, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 5, NEW.cian_id, 'U', NEW.prco_pref || NEW.enco_numero);
end
^

/* Trigger: CIERRE_ANUAL_BD */
CREATE TRIGGER CIERRE_ANUAL_BD FOR CIERRE_ANUAL
ACTIVE BEFORE DELETE POSITION 0
AS
BEGIN
DELETE FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
DELETE FROM comprobante_detalle_niif WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
UPDATE comprobante_encabezado
  SET ENCO_TIPOREF = 0
  WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
DELETE FROM COMPROBANTE_ENCABEZADO
  WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
END
^

/* Trigger: CIERRE_ANUAL_BI */
CREATE TRIGGER CIERRE_ANUAL_BI FOR CIERRE_ANUAL
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable UTILIDAD NUMERIC(15,2);
declare variable SALDO NUMERIC(15,2);
declare variable CUENTA VARCHAR(20);
declare variable CUENTAU VARCHAR(20);
declare variable CUENTAP VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable I INTEGER;
BEGIN
/* Registre un comprobante */
UTILIDAD = 0;
NEW.cian_id = GEN_ID(ID_CIERANUAL, 1);
execute procedure cambie_id_comproba returning_values(NEW.ENCO_CONSEC);
insert into comprobante_encabezado (tico_cod, prco_pref, enco_consec, enco_numero, enco_fecha, enco_concepto, enco_refer, enco_tiporef, enco_idref, ENCO_DESCONTABLE)
    values (new.tico_cod, new.prco_pref, new.enco_consec, new.enco_numero, new.cian_fecha, NEW.cian_concepto, NEW.cian_refer, 5, 0, 'S');
if (NEW.cian_niif IS NULL) then
    NEW.cian_niif = 'C';
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NIT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (PROY);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (CENTRO);
if ((NEW.cian_niif = 'C') or (NEW.cian_niif = 'A'))  then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CUENTA DE UTILIDAD DEL EJERCICIO') RETURNING_VALUES (CUENTAU);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CUENTA DE PERDIDA DEL EJERCICIO') RETURNING_VALUES (CUENTAP);
    I = 1;
    FOR SELECT distinct cuen_cod, proy_cod, cent_cod, terc_nit from saldos_centros_tercero
        WHERE cuen_cod > '4' and cuen_cod < '8' order by cuen_cod, proy_cod, cent_cod, terc_nit into :CUENTA, :PROY, :CENTRO, :NIT
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_CENTRO_TERCERO(:CUENTA, :PROY, :CENTRO, :NIT, NEW.CIAN_FECHA) RETURNING_VALUES (SALDO);
        if (SALDO <> 0) then
            BEGIN
            UTILIDAD = UTILIDAD + SALDO;
            if (SALDO > 0) then
                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
                  VALUES (new.enco_consec, :I, :CUENTA, :NIT, :PROY, :CENTRO, NEW.CIAN_concepto, NEW.CIAN_refer, 0, 0, 0, :SALDO, 'S');
            ELSE
                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
                  VALUES (new.enco_consec, :I, :CUENTA, :NIT, :PROY, :CENTRO, NEW.CIAN_concepto, NEW.CIAN_refer, 0, 0, ABS(:SALDO), 0, 'S');
            I = I + 1;
            END
        END
    if (UTILIDAD > 0) then
        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
          VALUES (new.enco_consec, :I, :CUENTAP, :NIT, :PROY, :CENTRO, NEW.CIAN_concepto, NEW.CIAN_refer, 0, 0, :UTILIDAD, 0, 'S');
    ELSE
        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
          VALUES (new.enco_consec, :I, :CUENTAU, :NIT, :PROY, :CENTRO, NEW.CIAN_concepto, NEW.CIAN_refer, 0, 0, 0, ABS(:UTILIDAD), 'S');
    END
if ((NEW.cian_niif = 'N') or (NEW.cian_niif = 'A'))  then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CUENTA DE UTILIDAD DEL EJERCICIO NIIF') RETURNING_VALUES (CUENTAU);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CUENTA DE PERDIDA DEL EJERCICIO NIIF') RETURNING_VALUES (CUENTAP);
    I = 100000;
    FOR SELECT distinct cuen_cod, proy_cod, cent_cod, terc_nit from saldos_centros_tercero_niif
        WHERE cuen_cod > '4' and cuen_cod < '8' order by cuen_cod, proy_cod, cent_cod, terc_nit
        into :CUENTA, :PROY, :CENTRO, :NIT
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_centro_tercero_niif(:CUENTA, :PROY, :CENTRO, :NIT, NEW.CIAN_FECHA) RETURNING_VALUES (SALDO);
        if (SALDO <> 0) then
            BEGIN
            UTILIDAD = UTILIDAD + SALDO;
            if (SALDO > 0) then
                INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
                  VALUES (new.enco_consec, :I, :CUENTA, :NIT, :PROY, :CENTRO, NEW.CIAN_concepto, NEW.CIAN_refer, 0, 0, 0, :SALDO);
            ELSE
                INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
                  VALUES (new.enco_consec, :I, :CUENTA, :NIT, :PROY, :CENTRO, NEW.CIAN_concepto, NEW.CIAN_refer, 0, 0, ABS(:SALDO), 0);
            I = I + 1;
            END
        END
    if (UTILIDAD > 0) then
        INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
          VALUES (new.enco_consec, :I, :CUENTAP, :NIT, :PROY, :CENTRO, NEW.CIAN_concepto, NEW.CIAN_refer, 0, 0, :UTILIDAD, 0);
    ELSE
        INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
          VALUES (new.enco_consec, :I, :CUENTAU, :NIT, :PROY, :CENTRO, NEW.CIAN_concepto, NEW.CIAN_refer, 0, 0, 0, ABS(:UTILIDAD));
    END
END
^

/* Trigger: CIERRE_ANUAL_BU */
CREATE TRIGGER CIERRE_ANUAL_BU FOR CIERRE_ANUAL
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
/* Grabe el ID asignado en comprobante encabezado  */
if (new.cian_id <> old.cian_id) then
    update comprobante_encabezado
      set enco_idref = new.cian_id
    where enco_consec = new.enco_consec;
END
^

/* Trigger: CIERRE_TERCEROS_AD */
CREATE TRIGGER CIERRE_TERCEROS_AD FOR CIERRE_TERCEROS
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 4, OLD.cite_id, 'D', OLD.prco_pref || OLD.enco_numero);
end
^

/* Trigger: CIERRE_TERCEROS_AI */
CREATE TRIGGER CIERRE_TERCEROS_AI FOR CIERRE_TERCEROS
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.CITE_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 4, NEW.cite_id, 'I', NEW.prco_pref || NEW.enco_numero);
end
^

/* Trigger: CIERRE_TERCEROS_AU */
CREATE TRIGGER CIERRE_TERCEROS_AU FOR CIERRE_TERCEROS
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 4, NEW.cite_id, 'U', NEW.prco_pref || NEW.enco_numero);
end
^

/* Trigger: CIERRE_TERCEROS_BD */
CREATE TRIGGER CIERRE_TERCEROS_BD FOR CIERRE_TERCEROS
ACTIVE BEFORE DELETE POSITION 0
AS
BEGIN
DELETE FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
DELETE FROM comprobante_detalle_niif WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
UPDATE comprobante_encabezado
  SET ENCO_TIPOREF = 0
  WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
DELETE FROM COMPROBANTE_ENCABEZADO
  WHERE ENCO_CONSEC = OLD.ENCO_CONSEC;
END
^

/* Trigger: CIERRE_TERCEROS_BI */
CREATE TRIGGER CIERRE_TERCEROS_BI FOR CIERRE_TERCEROS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable SALDO NUMERIC(15,2);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable I INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable CUENTA VARCHAR(20);
BEGIN
/* Registre un comprobante */
new.cite_id =  gen_id(id_cierterc, 1);
execute procedure cambie_id_comproba returning_values(NEW.ENCO_CONSEC);
insert into comprobante_encabezado (tico_cod, prco_pref, enco_consec, enco_numero, enco_fecha, enco_concepto, enco_refer, enco_tiporef, enco_idref, ENCO_DESCONTABLE)
    values (new.tico_cod, new.prco_pref, NEW.enco_consec, new.enco_numero, new.cite_fecha, NEW.cite_concepto, NEW.cite_refer, 4, 0, 'S');
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (PROY);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (CENTRO);
if ((NEW.cite_niif = 'C') or (NEW.cite_niif = 'A'))  then
    BEGIN
    I = 1;
    FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_AFECTABLE = 'S' AND SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(NEW.cuen_cod)) = NEW.cuen_cod
        INTO :CUENTA
        DO
        BEGIN
        SUMA = 0;
        FOR SELECT TERC_NIT FROM TERCEROS INTO :NIT
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO(:CUENTA, :NIT, NEW.CITE_FECHA) RETURNING_VALUES (SALDO);
            if (SALDO <> 0) then
                BEGIN
                if (SALDO > 0) then
                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
                        VALUES (NEW.enco_consec, :I, :CUENTA, :NIT, :PROY, :CENTRO, NEW.CITE_concepto, NEW.CITE_refer, :SALDO*-1, 100, 0, ABS(:SALDO), 'S');
                ELSE
                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
                        VALUES (NEW.enco_consec, :I, :CUENTA, :NIT, :PROY, :CENTRO, NEW.CITE_concepto, NEW.CITE_refer, :SALDO, 100, ABS(:SALDO), 0, 'S');
                SUMA = SUMA + SALDO;
                I = I + 1;
                END
            END
        if (SUMA > 0) then
            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
                VALUES (NEW.enco_consec, :I, :CUENTA, NEW.TERC_NIT, :PROY, :CENTRO, NEW.CITE_concepto, NEW.CITE_refer, :SUMA, 100, ABS(:SUMA), 0, 'S');
        ELSE
            if (SUMA <> 0) then
                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
                    VALUES (NEW.enco_consec, :I, :CUENTA, NEW.TERC_NIT, :PROY, :CENTRO, NEW.CITE_concepto, NEW.CITE_refer, :SUMA, 100*-1, 0, ABS(:SUMA), 'S');
        I = I + 1;
        END
    END
if ((NEW.cite_niif = 'N') or (NEW.cite_niif = 'A'))  then
    BEGIN
    I = 100000;
    SUMA = 0;
    FOR SELECT TERC_NIT FROM TERCEROS INTO :NIT
    DO
        BEGIN
        EXECUTE PROCEDURE saldo_tercero_niif(NEW.CUEN_COD, :NIT, NEW.CITE_FECHA) RETURNING_VALUES (SALDO);
        if (SALDO <> 0) then
          BEGIN
          if (SALDO > 0) then
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
              VALUES (NEW.enco_consec, :I, NEW.CUEN_COD, :NIT, :PROY, :CENTRO, NEW.CITE_concepto, NEW.CITE_refer, :SALDO*-1, 100, 0, ABS(:SALDO));
          ELSE
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
                VALUES (NEW.enco_consec, :I, NEW.CUEN_COD, :NIT, :PROY, :CENTRO, NEW.CITE_concepto, NEW.CITE_refer, :SALDO, 100, ABS(:SALDO), 0);
          SUMA = SUMA + SALDO;
          I = I + 1;
          END
        END
    if (SUMA > 0) then
        INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
          VALUES (NEW.enco_consec, :I, NEW.CUEN_COD, NEW.TERC_NIT, :PROY, :CENTRO, NEW.CITE_concepto, NEW.CITE_refer, :SUMA, 100, ABS(:SUMA), 0);
    ELSE
        if (SUMA <> 0) then
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
              VALUES (NEW.enco_consec, :I, NEW.CUEN_COD, NEW.TERC_NIT, :PROY, :CENTRO, NEW.CITE_concepto, NEW.CITE_refer, :SUMA, 100*-1, 0, ABS(:SUMA));
    END
END
^

/* Trigger: CIERRE_TERCEROS_BU */
CREATE TRIGGER CIERRE_TERCEROS_BU FOR CIERRE_TERCEROS
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
  /* Grabe el ID asignado en comprobante encabezado  */
  if (new.cite_id <> old.cite_id) then
    update comprobante_encabezado
      set enco_idref = new.cite_id
    where enco_consec = new.enco_consec;
END
^

/* Trigger: CLIENTES_AD */
CREATE TRIGGER CLIENTES_AD FOR CLIENTES
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 103, 1, 'D', OLD.terc_nit);
end
^

/* Trigger: CLIENTES_AI */
CREATE 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, CLSU_ACTIVO)
    VALUES (NEW.TERC_NIT, '01', :NOMBRE, :DIR, :CIU, :TEL, NEW.vend_cod, NEW.cobr_cod, NEW.zona_cod, NEW.lipr_cod, 'S');
UPDATE CRM_CLIENTES
SET CRCL_USUARIO = USER,
    CRCL_ANIV = NEW.clie_aniv,
    CRCL_ESTERCERO = 'S',
    ZONA_COD = NEW.zona_cod,
    VEND_COD = NEW.vend_cod,
    COBR_COD = NEW.cobr_cod,
    GRCA_COD = NEW.grca_cod,
    CRCL_MAILCART = NEW.clie_mailcart
WHERE (CRCL_NIT = NEW.terc_nit);

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 103, 1, 'I', NEW.terc_nit);
end
^

/* Trigger: CLIENTES_AU */
CREATE TRIGGER CLIENTES_AU FOR CLIENTES
ACTIVE AFTER UPDATE POSITION 0
as
declare variable NUMROWS INTEGER;
declare variable ACTSUC CHAR(2);
declare variable DATOS VARCHAR(4096);
begin
/* SI TIENE UNA SOLA SUCURSAL ACTUALICELA AL CAMBIAR EL PRINCIPAL */
execute procedure lee_configuracion('CARTERA', 'GENERAL', 'ACTUALIZAR AUTOMATICAMENTE NOMBRE Y UBICACION DE LA SUCURSAL EN CLIENTES CON UNA SOLA SUCURSAL') returning_values (:ACTSUC);
if (ACTSUC = 'SI') then
    BEGIN
    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
    END
UPDATE CRM_CLIENTES
SET CRCL_USUARIO = USER,
    CRCL_ANIV = NEW.clie_aniv,
    CRCL_ESTERCERO = 'S',
    ZONA_COD = NEW.zona_cod,
    VEND_COD = NEW.vend_cod,
    COBR_COD = NEW.cobr_cod,
    GRCA_COD = NEW.grca_cod,
    CRCL_MAILCART = NEW.clie_mailcart
WHERE (CRCL_NIT = NEW.terc_nit);

DATOS = 'TERC_NIT=' || OLD.TERC_NIT || '|CLIE_COD=' || OLD.CLIE_COD || '|CLIE_ESTADO=' || OLD.CLIE_ESTADO || '|CLIE_RTEFTE=' || OLD.CLIE_RTEFTE || '|CLIE_RTEIVA=' || OLD.CLIE_RTEIVA || 
'|CLIE_RTEICA=' || OLD.CLIE_RTEICA || '|CLIE_RTFTEBASE=' || OLD.CLIE_RTFTEBASE || '|CLIE_DTOMAX=' || OLD.CLIE_DTOMAX || '|CLIE_CUPO=' || OLD.CLIE_CUPO || '|COBR_COD=' || OLD.COBR_COD || 
'|VEND_COD=' || OLD.VEND_COD || '|ZONA_COD=' || OLD.ZONA_COD || '|LIPR_COD=' || OLD.LIPR_COD || '|CLIE_DIAS=' || OLD.CLIE_DIAS || '|CLIE_FECHA=' || OLD.CLIE_FECHA || 
'|CLIE_ANIV=' || OLD.CLIE_ANIV || '|CLIE_USUARIO=' || OLD.CLIE_USUARIO || '|GRCA_COD=' || OLD.GRCA_COD || '|CLIE_DIASBLOQ=' || OLD.CLIE_DIASBLOQ || '|CLIE_DETALLE=' || OLD.CLIE_DETALLE || 
'|CLIE_FACC=' || OLD.CLIE_FACC || '|CLIE_INSTRUCCIONES=' || OLD.CLIE_INSTRUCCIONES || '|CLIE_PEDIDOS=' || OLD.CLIE_PEDIDOS || '|CLIE_VALORMES=' || OLD.CLIE_VALORMES || 
'|CLIE_INSTCARTERA=' || OLD.CLIE_INSTCARTERA || '|CLIE_RESALTAR=' || OLD.CLIE_RESALTAR || '|CLIE_MAILCART=' || OLD.CLIE_MAILCART || '|CLIE_RTICABASE=' || OLD.CLIE_RTICABASE || 
'|CLIE_LNGT=' || OLD.CLIE_LNGT || '|CLIE_LATI=' || OLD.CLIE_LATI || '|CLIE_CALIFICA=' || OLD.CLIE_CALIFICA || '|CLIE_RTCREE=' || OLD.CLIE_RTCREE;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_DATOS)
    VALUES (USER, 103, 1, 'U', NEW.terc_nit, :DATOS);
end
^

/* Trigger: CLIENTES_BD */
CREATE 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
^

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

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

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

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

/* Trigger: CLIENTES_FACTURACION_MASIVA_BI */
CREATE TRIGGER CLIENTES_FACTURACION_MASIVA_BI FOR CLIENTES_FACTURACION_MASIVA
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.clfa_id = gen_id(id_clifact, 1);
end
^

/* Trigger: CLIENTE_SUCURSALES_AD */
CREATE TRIGGER CLIENTE_SUCURSALES_AD FOR CLIENTE_SUCURSALES
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_RAZON)
    VALUES (USER, 152, 1, 'D', OLD.terc_nit, OLD.clcu_cod);
end
^

/* Trigger: CLIENTE_SUCURSALES_AI */
CREATE TRIGGER CLIENTE_SUCURSALES_AI FOR CLIENTE_SUCURSALES
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_RAZON)
    VALUES (USER, 152, 1, 'I', NEW.terc_nit, NEW.clcu_cod);
end
^

/* Trigger: CLIENTE_SUCURSALES_AU */
CREATE TRIGGER CLIENTE_SUCURSALES_AU FOR CLIENTE_SUCURSALES
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_RAZON)
    VALUES (USER, 152, 1, 'U', NEW.terc_nit, NEW.clcu_cod);
end
^

/* Trigger: CLIENTE_SUCURSALES_BD */
CREATE TRIGGER CLIENTE_SUCURSALES_BD FOR CLIENTE_SUCURSALES
ACTIVE BEFORE DELETE POSITION 0
as
begin
if (exists (select m.mvcl_id from movimiento_clientes m where terc_nit = old.terc_nit and m.mvcl_sucursal = old.clcu_cod)) then
    exception cliente_con_movimiento 'No puede eliminar la sucursal ' || old.clcu_cod || ' del ciente ' || old.terc_nit || ' porque tiene movimientos.';
end
^

/* Trigger: CLIENTE_SUCURSALES_BI */
CREATE TRIGGER CLIENTE_SUCURSALES_BI FOR CLIENTE_SUCURSALES
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.clsu_activo is null) then
    new.clsu_activo = 'S';
end
^

/* Trigger: CLIENTE_SUCURSALES_BU */
CREATE TRIGGER CLIENTE_SUCURSALES_BU FOR CLIENTE_SUCURSALES
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (old.clcu_cod <> new.clcu_cod) then
    if (exists (select m.mvcl_id from movimiento_clientes m where terc_nit = old.terc_nit and m.mvcl_sucursal = old.clcu_cod)) then
        exception cliente_con_movimiento 'No puede cambiar la sucursal ' || old.clcu_cod || ' del ciente ' || old.terc_nit || ' porque tiene movimientos.';
end
^

/* Trigger: COBRADORES_AD */
CREATE TRIGGER COBRADORES_AD FOR COBRADORES
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (105, 1, 'D', OLD.cobr_cod);
end
^

/* Trigger: COBRADORES_AI */
CREATE TRIGGER COBRADORES_AI FOR COBRADORES
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (105, 1, 'I', NEW.cobr_cod);
end
^

/* Trigger: COBRADORES_AU */
CREATE TRIGGER COBRADORES_AU FOR COBRADORES
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (105, 1, 'U', NEW.cobr_cod);
end
^

/* Trigger: COBRADORES_BD */
CREATE 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
^

/* Trigger: COCINA_COLA_FUNCION_BI */
CREATE TRIGGER COCINA_COLA_FUNCION_BI FOR COCINA_COLA_FUNCION
ACTIVE BEFORE INSERT POSITION 0
as
declare variable ITEM integer;
declare variable TIEMPOF smallint;
declare variable TIEMPOO smallint;
begin
if (new.cocf_item is null) then
    begin
    select max(cocf_item) from cocina_cola_funcion where cofu_id = new.cofu_id into :item;
    if (:item is null) then
        new.cocf_item = 1;
    else
        new.cocf_item = :item+1;
    end
NEW.cpcf_fecha = CAST ('NOW' AS DATE);
NEW.cocf_hora = CAST ('NOW' AS TIME);
if ((new.cocf_articulo <> '') and (new.cocf_articulo is not null)) then
    begin
    select arti_tiempof, arti_tiempoo from articulo where arti_cod = new.cocf_articulo into :tiempof, :tiempoo;
    new.cocf_tiempof = :tiempof;
    new.cocf_tiempoo = :tiempoo;
    end
end
^

/* Trigger: COCINA_COLA_FUNCION_BU */
CREATE TRIGGER COCINA_COLA_FUNCION_BU FOR COCINA_COLA_FUNCION
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if ((new.cocf_operario is not null) and (new.cocf_tiempoini is null)) then
    NEW.cocf_tiempoini = CAST ('NOW' AS TIME);
if (NEW.cocf_entregado = 'S') then
    begin
    NEW.cocf_tiempoe = CAST ('NOW' AS TIME);
    new.cocf_tiemporeal = datediff(minute from new.cocf_hora to new.cocf_tiempoe);
    end
end
^

/* Trigger: COMISION_COBRO_BI */
CREATE TRIGGER COMISION_COBRO_BI FOR COMISION_COBRO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable ITEM INTEGER;
begin
ITEM = 0;
SELECT CMCB_ITEM FROM comision_cobro WHERE CMCB_DIASINI <= NEW.cmcb_diasini AND CMCB_DIASFIN >= NEW.cmcb_diasini AND COBR_COD = NEW.cobr_cod INTO ITEM;
if (ITEM <> 0) then
    exception rango_dias_inconsistente;
SELECT CMCB_ITEM FROM COMISION_COBRO WHERE CMCB_DIASFIN <= NEW.cmcb_diasfin AND CMCB_DIASFIN >= NEW.cmcb_diasfin AND COBR_COD = NEW.cobr_cod INTO ITEM;
if (ITEM <> 0) then
    exception rango_dias_inconsistente;
/* VALIDE QUE UN NUEVO RANGO NO CONTENGA A OTROS PREVIOS */
SELECT CMCB_ITEM FROM comision_cobro WHERE CMCB_DIASINI > NEW.cmcb_diasini AND CMCB_DIASFIN < NEW.cmcb_diasfin AND COBR_COD = NEW.cobr_cod INTO ITEM;
if (ITEM <> 0) then
    exception rango_dias_inconsistente;   
end
^

/* Trigger: COMISION_COBRO_BU */
CREATE TRIGGER COMISION_COBRO_BU FOR COMISION_COBRO
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable ITEM INTEGER;
begin
ITEM = 0;
/* VALIDE QUE NO SE CRUCEN DOS RANGOS */
SELECT CMCB_ITEM FROM comision_cobro WHERE CMCB_ITEM <> NEW.cmcb_item AND CMCB_DIASINI <= NEW.cmcb_diasini AND CMCB_DIASFIN >= NEW.cmcb_diasini AND COBR_COD = NEW.cobr_cod INTO ITEM;
if (ITEM <> 0) then
    exception rango_dias_inconsistente;
SELECT CMCB_ITEM FROM COMISION_COBRO WHERE CMCB_ITEM <> NEW.cmcb_item AND CMCB_DIASFIN <= NEW.cmcb_diasfin AND CMCB_DIASFIN >= NEW.cmcb_diasfin AND COBR_COD = NEW.cobr_cod INTO ITEM;
if (ITEM <> 0) then
    exception rango_dias_inconsistente;
/* VALIDE QUE UN NUEVO RANGO NO CONTENGA A OTROS PREVIOS */
SELECT CMCB_ITEM FROM comision_cobro WHERE CMCB_ITEM <> NEW.cmcb_item AND CMCB_DIASINI > NEW.cmcb_diasini AND CMCB_DIASFIN < NEW.cmcb_diasfin AND COBR_COD = NEW.cobr_cod INTO ITEM;
if (ITEM <> 0) then
    exception rango_dias_inconsistente;   
end
^

/* Trigger: COMPROBANTE_DETALLE_AD */
CREATE 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);
declare variable REPNIIF CHAR(1);
declare variable TICO CHAR(3);
declare variable NUMERO VARCHAR(12);
BEGIN
SELECT ENCO_FECHA, ENCO_REPNIIF, TICO_COD, PRCO_PREF || ENCO_NUMERO FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_CONSEC = OLD.ENCO_CONSEC INTO :FECHA, :REPNIIF, :TICO, :NUMERO;
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
if (REPNIIF = 'S') then
    BEGIN
    /* BORRE LA REPLICACION ANTERIOR (PUDO CAMBIAR TERCERO, CENTRO, VALORES, ETC. */
    DELETE FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = OLD.ENCO_CONSEC AND CODE_ITEM = OLD.code_item;
    END
IF (not exists (select AUDI_ID from auditoria where tido_cod = 1 and audi_iddoc = OLD.enco_consec and audi_fecha = CAST('NOW' as DATE))) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1, OLD.enco_consec, 'D', :numero, :tico);
END
^

/* Trigger: COMPROBANTE_DETALLE_AI */
CREATE TRIGGER COMPROBANTE_DETALLE_AI FOR COMPROBANTE_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
declare variable TIPO CHAR(1);
declare variable CTANIIF VARCHAR(20);
declare variable REPNIIF CHAR(1);
declare variable ANONIIF CHAR(4);
declare variable TICO CHAR(3);
declare variable NUMERO VARCHAR(12);
BEGIN
SELECT ENCO_FECHA, ENCO_REPNIIF, TICO_COD, PRCO_PREF || ENCO_NUMERO FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA, :REPNIIF, :TICO, :NUMERO;
/* ACTUALICE LOS SALDOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  else
    if (TIPO = 'A') then
      EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  END
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
/* GRABE EL EQUIVALENTE NIIF */
EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE APERTURA NIIF') returning_values (:ANONIIF);
if ((SUBSTRING(FECHA FROM 1 FOR 4) >= :ANONIIF) AND (REPNIIF = 'S')) then
    BEGIN
    SELECT CUEN_EQNIIF FROM CUENTAS WHERE CUEN_COD = NEW.cuen_cod INTO :CTANIIF;
    if ((CTANIIF IS NOT NULL) AND (CTANIIF <> '')) then
        INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
            VALUES (NEW.ENCO_CONSEC, NEW.CODE_ITEM, :ctaniif, NEW.CODE_CONCEPTO, NEW.CODE_REFER, NEW.CODE_DEBITO, NEW.CODE_CREDITO,
            NEW.CODE_BASE, NEW.CODE_PORC, NEW.TERC_NIT, NEW.PROY_COD, NEW.CENT_COD, NEW.DOCO_VENCE, NEW.ARTI_COD, NEW.CODE_TIPOAPL, NEW.CODE_TIPONUE, NEW.CONC_COD, NEW.CNDE_DOCNUMERO, NEW.CNDE_DOCAPLICA, NEW.CODE_DESCONTABLE);
    END
IF (not exists (select AUDI_ID from auditoria where tido_cod = 1 and audi_iddoc = new.enco_consec and audi_fecha = CAST('NOW' as DATE))) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1, NEW.enco_consec, 'I', :numero, :tico);
END
^

/* Trigger: COMPROBANTE_DETALLE_AU */
CREATE 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);
declare variable NUMERO VARCHAR(12);
declare variable TICO VARCHAR(3);
declare variable CTANIIF VARCHAR(20);
declare variable REPNIIF CHAR(1);
begin
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA, ENCO_REPNIIF, PRCO_PREF || ENCO_NUMERO, TICO_COD
    FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA, :REPNIIF, :NUMERO, :TICO;
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
/* GRABE EL EQUIVALENTE NIIF */
if (REPNIIF = 'S') then
    BEGIN
    /* BORRE LA REPLICACION ANTERIOR (PUDO CAMBIAR TERCERO, CENTRO, VALORES, ETC. */
    DELETE FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = OLD.ENCO_CONSEC AND CODE_ITEM = OLD.code_item;
    /* GENERE LA NUEVA */
    SELECT CUEN_EQNIIF FROM CUENTAS WHERE CUEN_COD = NEW.cuen_cod INTO :CTANIIF;
    if ((CTANIIF IS NOT NULL) AND (CTANIIF <> '')) then
        INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
            VALUES (NEW.ENCO_CONSEC, NEW.CODE_ITEM, :ctaniif, NEW.CODE_CONCEPTO, NEW.CODE_REFER, NEW.CODE_DEBITO, NEW.CODE_CREDITO,
            NEW.CODE_BASE, NEW.CODE_PORC, NEW.TERC_NIT, NEW.PROY_COD, NEW.CENT_COD, NEW.DOCO_VENCE, NEW.ARTI_COD, NEW.CODE_TIPOAPL, NEW.CODE_TIPONUE, NEW.CONC_COD, NEW.CNDE_DOCNUMERO, NEW.CNDE_DOCAPLICA, NEW.CODE_DESCONTABLE);
    END
IF (not exists (select AUDI_ID from auditoria where tido_cod = 1 and audi_iddoc = new.enco_consec and audi_fecha = CAST('NOW' as DATE))) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1, NEW.enco_consec, 'U', :numero, :tico);
END
^

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

/* Trigger: COMPROBANTE_DETALLE_NIIF_AD */
CREATE TRIGGER COMPROBANTE_DETALLE_NIIF_AD FOR COMPROBANTE_DETALLE_NIIF
ACTIVE AFTER DELETE POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
declare variable TICO CHAR(3);
declare variable NUMERO VARCHAR(12);
BEGIN
SELECT ENCO_FECHA, TICO_COD, PRCO_PREF || ENCO_NUMERO FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_CONSEC = OLD.ENCO_CONSEC INTO :FECHA, :TICO, :NUMERO;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE actualice_saldo_cent_terc_niif(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_NIIF(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO_NIIF(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA_NIIF(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS_NIIF WHERE CUEN_COD = OLD.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO_NIIF(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo_NIIF(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
IF (not exists (select AUDI_ID from auditoria where tido_cod = 1001 and audi_iddoc = OLD.enco_consec and audi_fecha = CAST('NOW' as DATE))) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1001, OLD.enco_consec, 'U', :numero, :tico);
END
^

/* Trigger: COMPROBANTE_DETALLE_NIIF_AI */
CREATE TRIGGER COMPROBANTE_DETALLE_NIIF_AI FOR COMPROBANTE_DETALLE_NIIF
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
declare variable TIPO CHAR(1);
declare variable TICO CHAR(3);
declare variable NUMERO VARCHAR(12);
BEGIN
SELECT ENCO_FECHA, TICO_COD, PRCO_PREF || ENCO_NUMERO FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA, :TICO, :NUMERO;
/* ACTUALICE LOS SALDOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA_NIIF(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO_NIIF(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS_NIIF WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO_NIIF(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  else
    if (TIPO = 'A') then
      EXECUTE PROCEDURE actualice_saldo_activo_NIIF(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  END
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_NIIF(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE actualice_saldo_cent_terc_niif(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
IF (not exists (select AUDI_ID from auditoria where tido_cod = 1001 and audi_iddoc = NEW.enco_consec and audi_fecha = CAST('NOW' as DATE))) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1001, NEW.enco_consec, 'U', :numero, :tico);
END
^

/* Trigger: COMPROBANTE_DETALLE_NIIF_AU */
CREATE TRIGGER COMPROBANTE_DETALLE_NIIF_AU FOR COMPROBANTE_DETALLE_NIIF
ACTIVE AFTER UPDATE POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
declare variable NUMERO VARCHAR(12);
declare variable TICO VARCHAR(3);
begin
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA, PRCO_PREF || ENCO_NUMERO, TICO_COD FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA, :NUMERO, :TICO;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE actualice_saldo_cent_terc_niif(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_NIIF(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO_NIIF(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA_NIIF(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS_NIIF WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO_NIIF(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo_NIIF(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
/* GRABE LOS NUEVOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA_NIIF(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO_NIIF(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_NIIF(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE actualice_saldo_cent_terc_niif(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS_NIIF WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO_NIIF(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo_NIIF(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  END
IF (not exists (select AUDI_ID from auditoria where tido_cod = 1001 and audi_iddoc = new.enco_consec and audi_fecha = CAST('NOW' as DATE))) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1001, NEW.enco_consec, 'U', :numero, :tico);
END
^

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

/* Trigger: COMPROBANTE_ENCABEZADO_AD */
CREATE TRIGGER COMPROBANTE_ENCABEZADO_AD FOR COMPROBANTE_ENCABEZADO
ACTIVE AFTER DELETE POSITION 0
as
declare variable CIA VARCHAR(3);
begin
if (old.enco_tiporef = 31) then
    FOR SELECT REPC_COMPANIA FROM replicacion_configura
    WHERE REPC_TIPO = 1 AND REPC_REPLICA = 'S' AND ((REPC_PREF = old.prco_pref) or (REPC_PREF = ''))
    INTO :CIA
        DO
        BEGIN
        INSERT INTO replica_eventos (RPEV_COMPANIA, RPEV_TIPO, RPEV_IDDOC, RPEV_PREF, RPEV_NUMERO, RPEV_CODIGO, RPEV_OPER, RPEV_FECREG, RPEV_HORAREG)
        VALUES(:cia,  1, old.enco_consec, NULL, NULL, old.prco_pref || old.enco_numero, 'D', cast('now' as DATE), cast('now' as TIME));
        END
if (not exists (select enco_consec from comprobante_detalle where enco_consec = old.enco_consec)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 1, OLD.enco_consec, 'D', OLD.prco_pref || OLD.enco_numero, OLD.tico_cod);
end
^

/* Trigger: COMPROBANTE_ENCABEZADO_AI */
CREATE TRIGGER COMPROBANTE_ENCABEZADO_AI FOR COMPROBANTE_ENCABEZADO
ACTIVE AFTER INSERT POSITION 1
as
declare variable CIA VARCHAR(3);
begin
IF (NEW.ENCO_CONSEC <> 0) THEN
    begin
    if (NEW.enco_tiporef = 31) then
        FOR SELECT REPC_COMPANIA FROM replicacion_configura
            WHERE REPC_TIPO = 1 AND REPC_REPLICA = 'S' AND ((REPC_PREF = new.prco_pref) or (REPC_PREF = ''))
            INTO :CIA
            DO
            BEGIN
            INSERT INTO replica_eventos (RPEV_COMPANIA, RPEV_TIPO, RPEV_IDDOC, RPEV_PREF, RPEV_NUMERO, RPEV_CODIGO, RPEV_OPER, RPEV_FECREG, RPEV_HORAREG)
                VALUES(:cia,  1, new.enco_consec, NULL, NULL, new.prco_pref || new.enco_numero, 'I', cast('now' as DATE), cast('now' as TIME));
            END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
      VALUES (USER, 1, NEW.enco_consec, 'I', NEW.prco_pref || NEW.enco_numero, NEW.tico_cod);
    end
end
^

/* Trigger: COMPROBANTE_ENCABEZADO_AU */
CREATE TRIGGER COMPROBANTE_ENCABEZADO_AU FOR COMPROBANTE_ENCABEZADO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CIA VARCHAR(3);
begin
if (NEW.enco_tiporef = 31) then
    FOR SELECT REPC_COMPANIA FROM replicacion_configura
        WHERE REPC_TIPO = 1 AND REPC_REPLICA = 'S' AND ((REPC_PREF = NEW.prco_pref) or (REPC_PREF = ''))
        INTO :CIA
        DO
        BEGIN
        INSERT INTO replica_eventos (RPEV_COMPANIA, RPEV_TIPO, RPEV_IDDOC, RPEV_PREF, RPEV_NUMERO, RPEV_CODIGO, RPEV_OPER, RPEV_FECREG, RPEV_HORAREG)
            VALUES(:cia,  1, NEW.enco_consec, NULL, NULL, NEW.prco_pref || NEW.enco_numero, 'U', cast('now' as DATE), cast('now' as TIME));
        END
if (not exists (select enco_consec from comprobante_detalle where enco_consec = new.enco_consec)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 1, NEW.enco_consec, 'U', NEW.prco_pref || NEW.enco_numero, NEW.tico_cod);
end
^

/* Trigger: COMPROBANTE_ENCABEZADO_BD */
CREATE 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
^

/* Trigger: COMPROBANTE_ENCABEZADO_BI */
CREATE 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);
declare variable NIIFEQ CHAR(13);
declare variable ANONIIF CHAR(4);
BEGIN
if (NEW.enco_descontable IS NULL) then
    NEW.enco_descontable = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'GENERAR COMPROBANTES DE NIIF POR INTERFAZ O EQUIVALENCIAS') RETURNING_VALUES (:niifeq);
IF (NIIFEQ = 'INTERFAZ') THEN
  BEGIN
  if (NEW.enco_repniif is null) then
    NEW.enco_repniif = 'N';
  END
ELSE
    BEGIN
    EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE APERTURA NIIF') returning_values (:ANONIIF);
    if (SUBSTRING(NEW.enco_fecha FROM 1 FOR 4) >= :ANONIIF) then
        NEW.enco_repniif = 'S';
    ELSE
        NEW.enco_repniif = 'N';
    END
/* 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 numero ' || new.tico_cod || ' ' || new.prco_pref || new.enco_numero;
        END
    END
END
^

/* Trigger: COMPROBANTE_ENCABEZADO_BU */
CREATE TRIGGER COMPROBANTE_ENCABEZADO_BU FOR COMPROBANTE_ENCABEZADO
ACTIVE BEFORE UPDATE POSITION 0
AS
declare variable DESCUA CHAR(2);
declare variable SUMDEB NUMERIC(18,2);
declare variable SUMCRE NUMERIC(18,2);
BEGIN
if (NEW.ENCO_FECHA <> OLD.ENCO_FECHA) then
    exception cambio_fecha;
if (NEW.enco_consec <> OLD.enco_consec) then
    BEGIN
    /* VA A CAMBIAR EL ID LUEGO YA ESTA TODO EL DETALLE REGISTRADO */
    /* VERIFIQUE QUE ESTE CUADRADO */
    EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'PERMITIR COMPROBANTES DESCUADRADOS') returning_values (DESCUA);
    if (DESCUA = 'NO') then
        BEGIN
        SELECT SUM(CODE_DEBITO), SUM(CODE_CREDITO) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = OLD.ENCO_CONSEC INTO :SUMDEB, :SUMCRE;
        if (SUMDEB <> SUMCRE) then
            EXCEPTION comprobante_descuadrado;
        END
    END
END
^

/* Trigger: CONCEPTOS_CUENTAS_BI */
CREATE TRIGGER CONCEPTOS_CUENTAS_BI FOR CONCEPTOS_CUENTAS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.cocu_base IS NULL) then
    NEW.cocu_base = 'FIN';
if (NEW.cocu_porc IS NULL) then
    NEW.cocu_porc = 0;
if (NEW.cocu_monto IS NULL) then
    NEW.cocu_monto = 0;
if (NEW.cocu_debito IS NULL) then
    NEW.cocu_debito = 'S';
end
^

/* Trigger: CONCEPTOS_NOMINA_AD */
CREATE TRIGGER CONCEPTOS_NOMINA_AD FOR CONCEPTOS_NOMINA
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 96, OLD.conc_cod, 'D', OLD.conc_cod);
end
^

/* Trigger: CONCEPTOS_NOMINA_AI */
CREATE TRIGGER CONCEPTOS_NOMINA_AI FOR CONCEPTOS_NOMINA
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 96, NEW.conc_cod, 'I', NEW.conc_cod);
end
^

/* Trigger: CONCEPTOS_NOMINA_AU */
CREATE TRIGGER CONCEPTOS_NOMINA_AU FOR CONCEPTOS_NOMINA
ACTIVE AFTER UPDATE POSITION 0
as
declare variable DATOS VARCHAR(4096);
begin
DATOS = 'CONC_COD=' || OLD.CONC_COD || '|CONC_NOMBRE=' || OLD.CONC_NOMBRE || '|CONC_DEDUC=' || OLD.CONC_DEDUC || '|CONC_FECINI=' || OLD.CONC_FECINI || '|CONC_FECFIN=' || OLD.CONC_FECFIN || 
'|CONC_PORC=' || OLD.CONC_PORC || '|CONC_BASE=' || OLD.CONC_BASE || '|CONC_ENTIDAD=' || OLD.CONC_ENTIDAD || '|CONC_MONTO=' || OLD.CONC_MONTO || '|CONC_CTAGAST=' || OLD.CONC_CTAGAST || 
'|CONC_DIAS=' || OLD.CONC_DIAS || '|CONC_MODIFI=' || OLD.CONC_MODIFI || '|CONC_PROMEDIO=' || OLD.CONC_PROMEDIO || '|CONC_TODOSPER=' || OLD.CONC_TODOSPER || '|CONC_PROV=' || OLD.CONC_PROV || 
'|CONC_PERACTUAL=' || OLD.CONC_PERACTUAL || '|CONC_APORTE=' || OLD.CONC_APORTE || '|CONC_APLICAPROM=' || OLD.CONC_APLICAPROM || '|CONC_PERPROMEDIO=' || OLD.CONC_PERPROMEDIO || 
'|CONC_OTROCONC=' || OLD.CONC_OTROCONC || '|CONC_CODOTROCONC=' || OLD.CONC_CODOTROCONC || '|CONC_SALARIO=' || OLD.CONC_SALARIO || '|CONC_CTACXP=' || OLD.CONC_CTACXP || 
'|CONC_NOMCORTO=' || OLD.CONC_NOMCORTO || '|CONC_GTOEMPR=' || OLD.CONC_GTOEMPR || '|CONC_CXP=' || OLD.CONC_CXP || '|CONC_CART=' || OLD.CONC_CART || '|CONC_TOMSAL=' || OLD.CONC_TOMSAL || 
'|CONC_BENEFIC=' || OLD.CONC_BENEFIC || '|CONC_ORDEN=' || OLD.CONC_ORDEN || '|CONC_REPOI=' || OLD.CONC_REPOI || '|CONC_CTASAVP=' || OLD.CONC_CTASAVP || '|CONC_PPAGO=' || OLD.CONC_PPAGO || 
'|CONC_DIASINC=' || OLD.CONC_DIASINC || '|CONC_PAGOVAC=' || OLD.CONC_PAGOVAC || '|CONC_ACTIVO=' || OLD.CONC_ACTIVO || '|CONC_BASERT=' || OLD.CONC_BASERT || '|CONC_BASEAP=' || OLD.CONC_BASEAP || 
'|CONC_BASEPR=' || OLD.CONC_BASEPR || '|CONC_BENPAG=' || OLD.CONC_BENPAG || '|CONC_PRESTAMO=' || OLD.CONC_PRESTAMO;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_DATOS)
    VALUES (USER, 96, NEW.conc_cod, 'U', NEW.conc_cod, :DATOS);
end
^

/* Trigger: CONCEPTOS_NOMINA_BD */
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
^

/* Trigger: CONCEPTOS_NOMINA_BI */
CREATE TRIGGER CONCEPTOS_NOMINA_BI FOR CONCEPTOS_NOMINA
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.conc_activo is null) then
    new.conc_activo = 'S';
if (new.conc_prestamo is null) then
    new.conc_prestamo = 'N';
end
^

/* Trigger: CONCEPTO_CONTABLE_BD */
CREATE TRIGGER CONCEPTO_CONTABLE_BD FOR CONCEPTO_CONTABLE
ACTIVE BEFORE DELETE POSITION 0
as
begin
  /* VERIFIQUE QUE NO LO HAYAN USADO */
  if (EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE WHERE CONC_COD = OLD.conc_cod)) then
    exception concepto_contable_usado;
end
^

/* Trigger: CONCEPTO_CONTABLE_BU */
CREATE TRIGGER CONCEPTO_CONTABLE_BU FOR CONCEPTO_CONTABLE
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (new.conc_cod <> old.conc_cod) then
    begin
     /* VERIFIQUE QUE NO LO HAYAN USADO */
    if (EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE WHERE CONC_COD = OLD.conc_cod)) then
      exception concepto_contable_usado;
    end
end
^

/* Trigger: CONCILIACION_ENCABEZADO_AD */
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
^

/* Trigger: CONCILIACION_ENCABEZADO_AI */
CREATE 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
^

/* Trigger: CONCILIACION_ENCABEZADO_AU */
CREATE 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
^

/* Trigger: CONCILIACION_ENCABEZADO_BI */
CREATE TRIGGER CONCILIACION_ENCABEZADO_BI FOR CONCILIACION_ENCABEZADO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
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 conciliacion con el numero ' || new.cobn_prefijo || new.cobn_numero;
end
^

/* Trigger: CONCILIACION_PAT_DET_BI */
CREATE TRIGGER CONCILIACION_PAT_DET_BI FOR CONCILIACION_PAT_DET
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.copd_dif = (NEW.copd_db2649 - NEW.copd_dbniif) - (NEW.copd_cr2649 - NEW.copd_crniif);
end
^

/* Trigger: CONCILIACION_PAT_DET_BU */
CREATE TRIGGER CONCILIACION_PAT_DET_BU FOR CONCILIACION_PAT_DET
ACTIVE BEFORE UPDATE POSITION 0
as
begin
NEW.copd_dif = (NEW.copd_db2649 - NEW.copd_dbniif) - (NEW.copd_cr2649 - NEW.copd_crniif);
end
^

/* Trigger: CONFIGURACION_AU */
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_DATOS)
    VALUES (USER, 140, 0, 'U', NEW.conf_modulo, NEW.conf_categoria || ',' || NEW.conf_propiedad || ',' || NEW.conf_valor);
end
^

/* Trigger: CONFIGURA_CERTRETE_BI */
CREATE TRIGGER CONFIGURA_CERTRETE_BI FOR CONFIGURA_CERTRETE
ACTIVE BEFORE INSERT POSITION 0
as
begin
select max(cfcr_item+1) from configura_certrete where cfcr_cuenta = new.cfcr_cuenta into new.cfcr_item;
if (new.cfcr_item is null) then
    new.cfcr_item = 1;
end
^

/* Trigger: CONFIGURA_LINKFTP_BI */
CREATE TRIGGER CONFIGURA_LINKFTP_BI FOR CONFIGURA_LINKFTP
ACTIVE BEFORE INSERT POSITION 0
as
begin
    if ((NEW.cflk_puerto IS NULL) or (NEW.cflk_puerto = 0)) THEN
        NEW.cflk_puerto = 21;
end
^

/* Trigger: CONSIGNA_AD */
CREATE 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_detalle_niif where enco_consec = :consec;
    delete from comprobante_encabezado where enco_consec = :consec;
    end
end
^

/* Trigger: CONSIGNA_AI */
CREATE TRIGGER CONSIGNA_AI FOR CONSIGNA
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.CONS_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 71, NEW.cons_id, 'I', NEW.prba_pref || NEW.cons_numero, NEW.cuba_cod);
end
^

/* Trigger: CONSIGNA_AU */
CREATE TRIGGER CONSIGNA_AU FOR CONSIGNA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
if (new.cons_anulado = 'S') then
    begin
    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_detalle_niif where enco_consec = :consec;
        end
    delete from comprobante_encabezado where enco_tiporef = 71 and enco_idref = old.cons_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
            VALUES (USER, 71, NEW.cons_id, 'A', NEW.prba_pref || NEW.cons_numero, NEW.cuba_cod);
    end
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 71, NEW.cons_id, 'U', NEW.prba_pref || NEW.cons_numero, NEW.cuba_cod);

/* SI CAMBIA UN DATO CRITICO REPROCESO EL DETALLE */
if ((OLD.cons_fecha <> NEW.cons_fecha) OR
    (OLD.prba_pref <> NEW.prba_pref) OR
    (OLD.cons_numero <> NEW.cons_numero) ) then
    BEGIN
    UPDATE CONSIGNA_DETALLE
        SET CODE_TRANSMIT = 'N'
        WHERE CONS_ID = NEW.CONS_ID;
    UPDATE consigna_recibos
        SET COND_TRANSMIT = 'N'
        WHERE CONS_ID = NEW.CONS_ID;
    END
if (OLD.cons_anulado <> NEW.cons_anulado) then
    BEGIN
    UPDATE CONSIGNA_DETALLE
        SET CODE_ANULADO = NEW.cons_anulado
        WHERE CONS_ID = NEW.CONS_ID;
    UPDATE consigna_recibos
        SET COND_ANULADO = NEW.cons_anulado
        WHERE CONS_ID = NEW.CONS_ID;
    END
if (OLD.cons_transmit <> NEW.cons_transmit) then
    BEGIN
    UPDATE CONSIGNA_DETALLE
        SET CODE_TRANSMIT = NEW.cons_TRANSMIT
        WHERE CONS_ID = NEW.CONS_ID;
    UPDATE consigna_recibos
        SET COND_TRANSMIT = NEW.cons_TRANSMIT
        WHERE CONS_ID = NEW.CONS_ID;
    END
END
^

/* Trigger: CONSIGNA_BI */
CREATE TRIGGER CONSIGNA_BI FOR CONSIGNA
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 = 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 consignacion con el numero ' || new.prba_pref || new.cons_numero;
END
^

/* Trigger: CONSIGNA_DETALLE_AD */
CREATE 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
ELSE
    BEGIN
    DELETE FROM MOVIMIENTO_BANCO WHERE moba_tipodoc = 71 and moba_idref = old.cons_id and MOBA_TOTAL = 0;
    END
END
^

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

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

/* Trigger: CONSIGNA_DETALLE_AU */
CREATE 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(8);
declare variable Existe char(1);
BEGIN
if (NEW.code_devuelto = OLD.code_devuelto) then
    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 = 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 = new.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
END
^

/* Trigger: CONSIGNA_DETALLE_BI */
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
^

/* Trigger: CONSIGNA_RECIBOS_AD */
CREATE TRIGGER CONSIGNA_RECIBOS_AD FOR CONSIGNA_RECIBOS
ACTIVE AFTER DELETE POSITION 0
as
begin
if (OLD.cond_recid <> 0) then
    BEGIN
    /* BORRE EL DETALLE DE LA CONSIGNACION */
    DELETE FROM consigna_detalle WHERE CONS_ID = OLD.cons_id AND code_item2 = OLD.cond_item;
    /* BORRE EL RECIBO Y VUELVA A GRABARLO */
    DELETE FROM recibos_caja_detalle WHERE RECA_ID = OLD.cond_recid;
    DELETE FROM recibos_caja_pago WHERE RECA_ID = OLD.cond_recid;
    DELETE FROM recibos_caja WHERE RECA_ID = OLD.cond_recid;
    END
end
^

/* Trigger: CONSIGNA_RECIBOS_AI */
CREATE TRIGGER CONSIGNA_RECIBOS_AI FOR CONSIGNA_RECIBOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable FEC DATE;
begin
/* GRABE EL DETALLE DE LA CONSIGNACION */
select C.cons_fecha from consigna C where cons_id = new.cons_id into :fec;
if (exists (select cons_id from consigna_detalle where cons_id = new.cons_id and fopa_id = new.fopa_id and
    code_banco = new.cond_banco and code_cuenta = new.cond_cuenta and code_numero = new.cond_numero)) then
    update consigna_detalle
        set code_monto = code_monto + new.cond_monto  + new.cond_exedente
        where cons_id = new.cons_id and fopa_id = new.fopa_id and code_banco = new.cond_banco and
        code_cuenta = new.cond_cuenta and code_numero = new.cond_numero;
else
    INSERT INTO CONSIGNA_DETALLE (CONS_ID, CODE_ITEM2, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO,
        CODE_ANULADO, CODE_TRANSMIT, CODE_DEVUELTO, CAJA_ID)
        VALUES (NEW.cons_id, NEW.cond_item, NEW.fopa_id, NEW.cond_banco, NEW.cond_cuenta, NEW.cond_numero, :fec, NEW.cond_monto+new.cond_exedente,
        'N', 'N', 'N', NEW.caja_id);
end
^

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

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

/* Trigger: CONSIGNA_TARJETAS_AD */
CREATE 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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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
^

/* Trigger: CONSIGNA_TARJETAS_AI */
CREATE 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
^

/* Trigger: CONSIGNA_TARJETAS_AU */
CREATE 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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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
^

/* Trigger: CONSIGNA_TARJETAS_BI */
CREATE TRIGGER CONSIGNA_TARJETAS_BI FOR CONSIGNA_TARJETAS
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 = 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
^

/* Trigger: CONSIGNA_TARJETAS_DET_AD */
CREATE 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
^

/* Trigger: CONSIGNA_TARJETAS_DET_AI */
CREATE 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(8);
declare variable Existe char(1);
declare variable VALFP char(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
if ((new.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
^

/* Trigger: CONSIGNA_TARJETAS_DET_AU */
CREATE 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(8);
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
^

/* Trigger: CONSIGNA_TARJETAS_DET_BI */
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
^

/* Trigger: CONSOLIDADO_FALTANTES_BI */
CREATE TRIGGER CONSOLIDADO_FALTANTES_BI FOR CONSOLIDADO_FALTANTES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable cant numeric(18,4);
declare variable cantori numeric(18,4);
begin
if (new.cofa_cantcr is null) then
    new.cofa_cantcr = 0;
if (new.cofa_cantcr <> 0) then
    begin
    cantori = 0;
    select sum(cofa_cantcr) from consolidado_faltantes
        where cofa_tipoori = new.cofa_tipoori and cofa_idori = new.cofa_idori 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_cantcr) > cantori) then
        exception cantidad_cruce_mayor 'La cantidad a cruzar (' || new.cofa_cantcr || ') del articulo ' || new.arti_cod || ' es mayor a la cantidad original (' || :cantori || ') menos lo previamente cruzado (' || :cant || ')';
    end
end
^

/* Trigger: CONSOLIDADO_FALTANTES_BU */
CREATE 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_CANTCR <> 0) then
    begin
    cantori = 0;
    select sum(cofa_cantcr) from consolidado_faltantes
        where cofa_tipoori = new.cofa_tipoori and cofa_idori = new.cofa_idori and cofa_itemori = new.cofa_itemori
        and cofa_id <> new.cofa_id
        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 = 34) then
        select pede_cant * pede_factor from pedidos_detalle where pedi_id = new.cofa_idori and pede_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 (new.cofa_tipoori = 23) then
        select ocde_cant * ocde_factor from ordenes_compra_detalle where ordc_id = new.cofa_idori and ocde_item = new.cofa_itemori
        into :cantori;
    if ((cantori > 0) and (cant + new.cofa_cantcr) > cantori) then
        exception cantidad_cruce_mayor 'La cantidad a cruzar (' || new.cofa_cantcr || ') del articulo ' || new.arti_cod || ' es mayor a la cantidad original (' || :cantori || ') menos lo previamente cruzado (' || :cant || ')';
    end
end
^

/* Trigger: CONSOLIDADO_FALTANTES_BU2 */
CREATE TRIGGER CONSOLIDADO_FALTANTES_BU2 FOR CONSOLIDADO_FALTANTES
INACTIVE BEFORE UPDATE POSITION 1
as
begin
if (NEW.cofa_tipoori = 35) then
    new.cofa_cantcr = 0;
end
^

/* 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_valor is null) then
    new.cono_valor = 0;
if (new.cono_abono is null) then
    new.cono_abono = NEW.cono_valor;
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
^

/* Trigger: CONSUMOS_AD */
CREATE TRIGGER CONSUMOS_AD FOR CONSUMOS
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 32, OLD.cons_id, 'D', OLD.pref_pre || OLD.cons_numero);
end
^

/* Trigger: CONSUMOS_AI */
CREATE TRIGGER CONSUMOS_AI FOR CONSUMOS
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.CONS_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 32, NEW.cons_id, 'I', NEW.pref_pre || NEW.cons_numero);
end
^

/* Trigger: CONSUMOS_AU */
CREATE TRIGGER CONSUMOS_AU FOR CONSUMOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
/* SI EL CAMPO QUE CAMBIA ES CRITICO ACTUALICE EL DETALLE */
if ((OLD.cons_fecha <> NEW.cons_fecha) OR
    (OLD.pref_pre <> NEW.pref_pre) OR
    (OLD.cons_numero <> NEW.cons_numero)) then
    UPDATE CONSUMO_DETALLE SET CNDE_TRANSMIT = 'N'
        WHERE CONS_ID = NEW.CONS_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.cons_anulado <> NEW.cons_anulado) then
    UPDATE CONSUMO_DETALLE SET CNDE_ANULADO = NEW.cons_anulado
        WHERE CONS_ID = NEW.CONS_ID;
if (OLD.cons_transmit <> NEW.cons_transmit) then
    UPDATE CONSUMO_DETALLE SET CNDE_TRANSMIT = NEW.cons_transmit
        WHERE CONS_ID = NEW.CONS_ID;
if (NEW.cons_anulado = 'S') then
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (32, NEW.cons_id, 'A', NEW.pref_pre || NEW.cons_numero);
ELSE
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (32, NEW.cons_id, 'U', NEW.pref_pre || NEW.cons_numero);
end
^

/* Trigger: CONSUMOS_BI */
CREATE TRIGGER CONSUMOS_BI FOR CONSUMOS
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 = 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
^

/* Trigger: CONSUMO_DETALLE_AD */
CREATE TRIGGER CONSUMO_DETALLE_AD FOR CONSUMO_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
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);
END
^

/* Trigger: CONSUMO_DETALLE_AI */
CREATE 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(8);
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
^

/* Trigger: CONSUMO_DETALLE_AU */
CREATE 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(8);
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
^

/* Trigger: CONSUMO_DETALLE_BI */
CREATE TRIGGER CONSUMO_DETALLE_BI FOR CONSUMO_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  NEW.cnde_dtomonto = NEW.cnde_prunit * NEW.cnde_dtoporc / 100;
END
^

/* Trigger: CONTABILIZACION_DET_BI */
CREATE TRIGGER CONTABILIZACION_DET_BI FOR CONTABILIZACION_DET
ACTIVE BEFORE INSERT POSITION 0
as
DECLARE VARIABLE ES_TERCERO CHAR(1);
DECLARE VARIABLE ES_CENTRO CHAR(1);
declare variable ctadesc varchar(20);
begin
/****si cnde_cuenta is null traiga la cuenta para descuadres***/
if (new.cnde_item < 100000) then
    begin
    if ((new.cnde_cuenta is null) or (NEW.CNDE_CUENTA = '')) then
      begin
       EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctadesc);
       if (ctadesc <> '') then
          new.cnde_cuenta = :ctadesc;
      end
    
    SELECT CUEN_TERCERO, CUEN_CENTRO FROM CUENTAS
        WHERE CUEN_COD = NEW.cnde_cuenta INTO :ES_TERCERO, :ES_CENTRO;
    if (ES_TERCERO <> 'S') then
        NEW.cnde_terc = NULL;
    if (ES_CENTRO <> 'S') then
        BEGIN
        NEW.cnde_proy = NULL;
        NEW.cnde_centro = NULL;
        END
    end
else
    begin
    if ((new.cnde_cuenta is null) or (NEW.CNDE_CUENTA = '')) then
      begin
       EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA NIIF PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctadesc);
       if (ctadesc <> '') then
          new.cnde_cuenta = :ctadesc;
      end
    
    SELECT CUEN_TERCERO, CUEN_CENTRO FROM CUENTAS_NIIF
        WHERE CUEN_COD = NEW.cnde_cuenta INTO :ES_TERCERO, :ES_CENTRO;
    if (ES_TERCERO <> 'S') then
        NEW.cnde_terc = NULL;
    if (ES_CENTRO <> 'S') then
        BEGIN
        NEW.cnde_proy = NULL;
        NEW.cnde_centro = NULL;
        END
    end
if (new.cnde_terc = '') then
    new.cnde_terc = null;
if (new.cnde_proy = '') then
    new.cnde_proy = null;
if (new.cnde_centro = '') then
    new.cnde_centro = null;
end
^

/* Trigger: CONTABIL_ARTICULO_AD */
CREATE TRIGGER CONTABIL_ARTICULO_AD FOR CONTABIL_ARTICULO
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 127, 1, 'D', OLD.arti_cod);
end
^

/* Trigger: CONTABIL_ARTICULO_AI */
CREATE TRIGGER CONTABIL_ARTICULO_AI FOR CONTABIL_ARTICULO
ACTIVE AFTER INSERT POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 127, 1, 'I', NEW.arti_cod);
end
^

/* Trigger: CONTABIL_ARTICULO_AU */
CREATE TRIGGER CONTABIL_ARTICULO_AU FOR CONTABIL_ARTICULO
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 127, 1, 'U', OLD.arti_cod);
end
^

/* Trigger: CONTABIL_ARTICULO_N_AD */
CREATE TRIGGER CONTABIL_ARTICULO_N_AD FOR CONTABIL_ARTICULO_NIIF
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 1127, 1, 'D', OLD.arti_cod);
end
^

/* Trigger: CONTABIL_ARTICULO_N_AI */
CREATE TRIGGER CONTABIL_ARTICULO_N_AI FOR CONTABIL_ARTICULO_NIIF
ACTIVE AFTER INSERT POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 1127, 1, 'I', NEW.arti_cod);
end
^

/* Trigger: CONTABIL_ARTICULO_N_AU */
CREATE TRIGGER CONTABIL_ARTICULO_N_AU FOR CONTABIL_ARTICULO_NIIF
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 1127, 1, 'U', OLD.arti_cod);
end
^

/* Trigger: CONTRATOS_COLEGIOS_AD */
CREATE TRIGGER CONTRATOS_COLEGIOS_AD FOR CONTRATOS_COLEGIOS
ACTIVE AFTER DELETE POSITION 0
as
begin
UPDATE CLIENTES C SET C.clie_valormes = 0 WHERE TERC_NIT = old.cncl_padre;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 181, old.cncl_id, 'D', old.cncl_numero);
end
^

/* Trigger: CONTRATOS_COLEGIOS_AI */
CREATE TRIGGER CONTRATOS_COLEGIOS_AI FOR CONTRATOS_COLEGIOS
ACTIVE AFTER INSERT POSITION 0
as
begin
insert into CLIENTE_SUCURSALES (TERC_NIT, CLCU_COD, CLSU_NOMBRE, CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, VEND_COD,
                                COBR_COD, ZONA_COD, LIPR_COD, CLSU_ACTIVO, CLSU_VALORMES, GRCA_COD, CLSU_DEC1818)
    select new.cncl_padre, new.cncl_numero, new.cncl_nombre, terc_dir, terc_ciu, terc_tel, vend_cod,
        cobr_cod, zona_cod, lipr_cod, 'S', new.cncl_valor, grca_cod, 'N'
        from terceros t, clientes c where t.terc_nit = c.terc_nit and t.terc_nit = new.cncl_padre;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 181, NEW.cncl_id, 'I', NEW.cncl_numero);
end
^

/* Trigger: CONTRATOS_COLEGIOS_AU */
CREATE TRIGGER CONTRATOS_COLEGIOS_AU FOR CONTRATOS_COLEGIOS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable terc_dir varchar(60);
declare variable terc_ciu varchar(40);
declare variable terc_tel varchar(40);
declare variable vend_cod integer;
declare variable cobr_cod integer;
declare variable zona_cod varchar(3);
declare variable lipr_cod integer;
declare variable grca_cod integer;
begin
select terc_dir, terc_ciu, terc_tel, vend_cod, cobr_cod, zona_cod, lipr_cod, grca_cod
    from terceros t, clientes c where t.terc_nit = c.terc_nit and t.terc_nit = new.cncl_padre
    into :terc_dir, :terc_ciu, :terc_tel, :vend_cod, :cobr_cod, :zona_cod, :lipr_cod, :grca_cod;

update or insert into CLIENTE_SUCURSALES (TERC_NIT, CLCU_COD, CLSU_NOMBRE, CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, VEND_COD,
                                COBR_COD, ZONA_COD, LIPR_COD, CLSU_ACTIVO, CLSU_VALORMES, GRCA_COD, CLSU_DEC1818)
    values (new.cncl_padre, new.cncl_numero, new.cncl_nombre, :terc_dir, :terc_ciu, :terc_tel, :vend_cod,
        :cobr_cod, :zona_cod, :lipr_cod, 'S', new.cncl_valor, :grca_cod, 'N');
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 181, NEW.cncl_id, 'U', NEW.cncl_numero);
end
^

/* Trigger: CONTRATOS_COLEGIOS_BI */
CREATE TRIGGER CONTRATOS_COLEGIOS_BI FOR CONTRATOS_COLEGIOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.cncl_id = GEN_ID(id_contratoc, 1);
end
^

/* Trigger: COSTOS_BI */
CREATE TRIGGER COSTOS_BI FOR COSTOS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable ITEM INTEGER;
begin
/* calcule el nro de item */
SELECT MAX(COST_ITEM) FROM COSTOS WHERE ARTI_COD = NEW.arti_cod AND COST_FECHA = NEW.cost_fecha INTO :item;
if (:item IS NULL) then
    NEW.cost_item = 0;
ELSE    
    NEW.cost_item = :ITEM + 1;
end
^

/* Trigger: COSTOS_NIIF_BI */
CREATE TRIGGER COSTOS_NIIF_BI FOR COSTOS_NIIF
ACTIVE BEFORE INSERT POSITION 0
as
declare variable ITEM INTEGER;
begin
/* calcule el nro de item */
SELECT MAX(COST_ITEM) FROM COSTOS_NIIF WHERE ARTI_COD = NEW.arti_cod AND COST_FECHA = NEW.cost_fecha INTO :item;
if (:item IS NULL) then
    NEW.cost_item = 0;
ELSE    
    NEW.cost_item = :ITEM + 1;
end
^

/* Trigger: COTIZACIONES_AD */
CREATE 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
^

/* Trigger: COTIZACIONES_AI */
CREATE 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
^

/* Trigger: COTIZACIONES_AU */
CREATE 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
^

/* Trigger: COTIZACIONES_BI */
CREATE TRIGGER COTIZACIONES_BI FOR COTIZACIONES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
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
^

/* Trigger: COTIZACIONES_DETALLE_AD */
CREATE TRIGGER COTIZACIONES_DETALLE_AD FOR COTIZACIONES_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
declare variable CONSOLIDA INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
begin
if ((OLD.coti_id <> 0) AND (OLD.ctde_anulado = 'N')) then
    begin
    select COTI_CONSOLIDA from cotizaciones where coti_id = old.coti_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        BEGIN
        /* DESHAGA LOS PENDIENTES */
        CANTAUX = old.ctde_cant * old.ctde_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    end
end
^

/* Trigger: COTIZACIONES_DETALLE_AI */
CREATE TRIGGER COTIZACIONES_DETALLE_AI FOR COTIZACIONES_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
begin
if ((NEW.coti_id <> 0) and (new.ctde_anulado = 'N')) then
    BEGIN
    select COTI_CONSOLIDA from cotizaciones where COTI_id = new.coti_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.coti_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.ctde_cant * new.ctde_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.coti_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.coti_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            end
        end
    END
end
^

/* Trigger: COTIZACIONES_DETALLE_AU */
CREATE TRIGGER COTIZACIONES_DETALLE_AU FOR COTIZACIONES_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
begin
if ((OLD.coti_id <> 0) AND (OLD.ctde_anulado = 'N')) then
  if ((OLD.ctde_cant * OLD.ctde_factor <> NEW.ctde_cant * NEW.ctde_factor) or (OLD.ctde_total <> NEW.ctde_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.ctde_anulado = 'S')) then
    begin
    select COTI_CONSOLIDA from cotizaciones where coti_id = old.coti_id into :CONSOLIDA;
    if (CONSOLIDA <> 0) then
        BEGIN
        /* DESHAGA LOS PENDIENTES */
        CANTAUX = old.ctde_cant * old.ctde_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    end
if ((NEW.coti_id <> 0) and (new.ctde_anulado = 'N')) then
    BEGIN
    select COTI_CONSOLIDA from cotizaciones where COTI_id = new.coti_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.coti_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.ctde_cant * new.ctde_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.coti_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.coti_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            end
        end
    END
END
^

/* Trigger: COTIZACIONES_DETALLE_BI */
CREATE TRIGGER COTIZACIONES_DETALLE_BI FOR COTIZACIONES_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable DEC1818 CHAR(1);
declare variable PREF VARCHAR(4);
BEGIN
SELECT PREF_PRE FROM cotizaciones WHERE COTI_ID = NEW.coti_id INTO :pref;
select grup_dec1818 from grupo g, articulo a where a.arti_cod = new.arti_cod and a.grup_cod = g.grup_cod into :DEC1818;
if (DEC1818 = 'S') then
    BEGIN
    SELECT PREF_DEC1818 FROM PREFIJOS WHERE TIDO_COD = 35 AND PREF_PRE = :pref INTO :DEC1818;
    if (DEC1818 = 'S') then
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'TARIFA DE IVA PARA PRODUCTOS EXENTOS DECRETO 1818 DE 2015') returning_values (new.ctde_tiva);
    ELSE
        select taiv_cod from articulo where arti_cod = new.arti_cod into new.ctde_tiva;
    END
ELSE
    select taiv_cod from articulo where arti_cod = new.arti_cod into new.ctde_tiva;
/* CALCULE EL MONTO DEL DESCUENTO */
NEW.CTDE_DTOMONTO = NEW.ctde_prunit * NEW.ctde_dtoporc / 100;
if (NEW.lipr_cod IS NULL) then
    BEGIN
    SELECT LIPR_COD FROM clientes CL, COTIZACIONES C WHERE CL.TERC_NIT = C.terc_nit AND C.coti_id = NEW.coti_id INTO NEW.lipr_cod;
    if (NEW.lipr_cod IS NULL) then
        SELECT FIRST 1 p.LIPR_COD FROM PRECIOS_ARTICULO p, lista_precios l, usuario u
            WHERE ARTI_COD = NEW.arti_cod and p.prar_fijo <> 0 and l.lipr_cod = p.lipr_cod and u.user_cod = USER and
            ((l.sucu_id = u.sucu_id) or (l.sucu_id = 0) or (u.sucu_id = 0)) order by p.lipr_cod into new.lipr_cod;
    END
END
^

/* Trigger: COTIZACIONES_PROVEEDOR_DET_AI */
CREATE TRIGGER COTIZACIONES_PROVEEDOR_DET_AI FOR COTIZACIONES_PROVEEDOR_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable COSTO NUMERIC(18,2);
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);
BEGIN
if ((NEW.copr_id <> 0) AND (NEW.cprd_anulado = 'N')) then
    BEGIN
    select copr_fecha, terc_nit, COPR_IMPTOS, COPR_DTOMONTO, COPR_ADICIONAL, COPR_EXTRA, COPR_TOTAL, COPR_IVAMONTO
        from cotizacion_proveedor where copr_id = new.copr_id
        into :fec, :NIT, :IVAINC, :DTOPIE, :adicional,  :extra, :total, :ivamonto;

    execute procedure factor_unidad_cant(new.arti_cod, new.cprd_unidad) returning_values(factor);
    COSTO = ((new.cprd_prunit - NEW.cprd_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.cprd_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 = new.cprd_prunit * (1 - (new.cprd_dtoporc/100)), PVAR_COD = NEW.cprd_codprov, PVAR_UNIDAD = NEW.cprd_unidad, PVAR_FACTOR = NEW.cprd_factor
            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, PVAR_UNIDAD, PVAR_FACTOR)
            VALUES (:NIT, NEW.ARTI_COD, new.cprd_prunit * (1 - (new.cprd_dtoporc/100)), :FEC, NEW.cprd_codprov, NEW.cprd_desc, NEW.cprd_unidad, NEW.cprd_factor);
     END
    end
END
^

/* Trigger: COTIZACIONES_PROVEEDOR_DET_AU */
CREATE TRIGGER COTIZACIONES_PROVEEDOR_DET_AU FOR COTIZACIONES_PROVEEDOR_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable factor numeric(18,4);
declare variable EXISTE CHAR(1);
declare variable NIT VARCHAR(20);
declare variable COSTO NUMERIC(18,2);
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);
BEGIN
if ((NEW.copr_id <> 0) AND (NEW.cprd_anulado = 'N')) then
    BEGIN
    select copr_fecha, terc_nit, COPR_IMPTOS, COPR_DTOMONTO, COPR_ADICIONAL, COPR_EXTRA, COPR_TOTAL, COPR_IVAMONTO
            from cotizacion_proveedor where copr_id = new.copr_id
            into :fec, :NIT, :IVAINC, :DTOPIE, :adicional,  :extra, :total, :ivamonto;

    execute procedure factor_unidad_cant(new.arti_cod, new.cprd_unidad) returning_values(factor);
    COSTO = ((new.cprd_prunit - NEW.cprd_dtomonto) / :factor);
    if (IVAINC = 'S') then
        COSTO = COSTO / (1 + NEW.cprd_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.cprd_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.cprd_codprov,NEW.cprd_desc);
     END
    END
END
^

/* Trigger: COTIZACIONES_PROVEEDOR_DET_BI */
CREATE TRIGGER COTIZACIONES_PROVEEDOR_DET_BI FOR COTIZACIONES_PROVEEDOR_DET
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  /* CALCULE EL MONTO DEL DESCUENTO */
  NEW.CPRD_DTOMONTO = NEW.cprd_prunit * NEW.cprd_dtoporc / 100;
END
^

/* Trigger: COTIZACION_PROVEEDOR_AD */
CREATE TRIGGER COTIZACION_PROVEEDOR_AD FOR COTIZACION_PROVEEDOR
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 25, OLD.copr_id, 'D', OLD.pref_pre || OLD.copr_numero);
end
^

/* Trigger: COTIZACION_PROVEEDOR_AI */
CREATE TRIGGER COTIZACION_PROVEEDOR_AI FOR COTIZACION_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.COPR_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 25, NEW.copr_id, 'I', NEW.pref_pre || NEW.copr_numero);
end
^

/* Trigger: COTIZACION_PROVEEDOR_AU */
CREATE TRIGGER COTIZACION_PROVEEDOR_AU FOR COTIZACION_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
as
begin
/* SI SE ANULO ANULE EL DETALLE */
if (OLD.copr_anulado <> NEW.copr_anulado) then
    UPDATE cotizaciones_proveedor_det SET CPRD_ANULADO = NEW.copr_anulado
        WHERE COPR_ID = NEW.copr_id;
if (OLD.copr_transmit <> NEW.copr_transmit) then
    UPDATE cotizaciones_proveedor_det SET CPRD_TRANSMIT = NEW.copr_transmit
        WHERE COPR_ID = NEW.copr_id;
if (NEW.copr_anulado = 'S') then
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 25, NEW.copr_id, 'A', NEW.pref_pre || NEW.copr_numero);
ELSE
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 25, NEW.copr_id, 'U', NEW.pref_pre || NEW.copr_numero);
end
^

/* Trigger: COTIZACION_PROVEEDOR_BI */
CREATE TRIGGER COTIZACION_PROVEEDOR_BI FOR COTIZACION_PROVEEDOR
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 = 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
^

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

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

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

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

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

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

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

/* Trigger: COTIZACION_WEB_DETALLE_BI */
CREATE TRIGGER COTIZACION_WEB_DETALLE_BI FOR COTIZACION_WEB_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable itemax integer;
declare variable UNIDAD VARCHAR(8);
declare variable DTOGRUPO VARCHAR(10);
declare variable DTOG NUMERIC(9,4);
declare variable DTOL NUMERIC(9,4);
declare variable IVAP NUMERIC(18,2);
declare variable NIT VARCHAR(20);
declare variable PREF VARCHAR(4);
declare variable IVAINC CHAR(1);
declare variable ICOINC char(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
/* LOS IMPUESTOS DEPENDEN DEL ENCABEZADO */
SELECT COWE_PREF, TERC_NIT FROM cotizacion_web P WHERE COWE_ID = NEW.cowe_id INTO :PREF, :NIT;
if (NEW.LIPR_COD IS NULL) then
    SELECT LIPR_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO NEW.LIPR_COD;

if (new.cowd_item is null) then
    begin
    select max(cowd_item) from cotizacion_web_detalle where cowe_id = new.cowe_id into :itemax;
    if (itemax is null) then
        new.cowd_item = 1;
    else
        new.cowd_item = :itemax + 1;
    end
if (new.arti_cod is null) then
    begin
    SELECT FIRST 1 ARTI_COD, COBA_UNIDAD from BARRAS_ARTICULO WHERE COBA_COD = new.cowd_codbar AND COBA_ACTIVO = 'S'
        INTO new.arti_cod, :UNIDAD;
    if (new.arti_cod is null) then
        begin
        SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = new.cowd_codbar and esar_cod = 'A'
            INTO new.arti_cod, :UNIDAD;
        if (new.arti_cod is null) then
            exception articulo_no_existe 'No se encontro el artÃ­culo ' || new.cowd_codbar;
        ELSE
            if (new.cowd_unidad is null) then
                NEW.cowd_unidad = :UNIDAD;
        end
    else
        if (new.cowd_unidad is null) then
            NEW.cowd_unidad = :UNIDAD;
    end
if (new.cowd_desc is null) then
    SELECT ARTI_DES from ARTICULO WHERE ARTI_COD = new.arti_cod INTO new.cowd_desc;

EXECUTE PROCEDURE factor_unidad_cant(NEW.arti_cod, NEW.cowd_unidad) returning_values(NEW.cowd_factor);

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

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

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

/* CALCULE EL IVA, CONSUMO Y TOTAL */
SELECT PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 35 AND PREF_PRE = :PREF INTO :IVAINC;
SELECT TAIV_PORC FROM tarifa_iva T, ARTICULO A WHERE T.taiv_cod = A.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :IVAP;
new.cowd_ivap = :ivap;
if ((new.cowd_ivamonto is null) or (NEW.cowd_ivamonto = 0)) then
    begin
    if (IVAINC = 'N') then
        begin
        if (ICOINC = 'SI') then
            new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) - new.cowd_consumo) / 100) * :IVAP;
        else
            new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom)) / 100) * :IVAP;
        end
    else
        new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) - new.cowd_consumo) / (100 + :IVAP)) * :IVAP;
    end
if (ICOINC = 'SI') then
    new.cowd_total = (new.cowd_cant * (new.cowd_prunit - new.cowd_dtom));
else
    new.cowd_total = (new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) + new.cowd_consumo);
if (IVAINC = 'N') then
    new.cowd_total = new.cowd_total + new.cowd_ivamonto;
end
^

/* Trigger: CRM_CAMPANA_BI */
CREATE TRIGGER CRM_CAMPANA_BI FOR CRM_CAMPANA
ACTIVE BEFORE INSERT POSITION 0
as
begin
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
^

/* Trigger: CRM_CAMPANA_DETALLE_BI */
CREATE TRIGGER CRM_CAMPANA_DETALLE_BI FOR CRM_CAMPANA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable fecha date;
declare variable fechai date;
declare variable hora time;
declare variable horai1 time;
declare variable horaf1 time;
declare variable horai2 time;
declare variable horaf2 time;
declare variable DURA INTEGER;
declare variable evento integer;
declare variable conc varchar(60);
begin
select c.crcm_fecini, c.crcm_horaini1, c.crcm_horafin1, c.crcm_horaini2, c.crcm_horafin2, C.crcm_duracion
    from crm_campana c where crcm_id = new.crcm_id into :fechai, :horai1, :horaf1, :horai2, :horaf2, :dura;
SELECT FIRST 1 CRCD_FECCONTAC, CRCD_HORACONTAC FROM crm_campana_detalle
    WHERE CRCM_ID = NEW.crcm_id ORDER BY CRCD_FECCONTAC DESC, CRCD_HORACONTAC DESC
    INTO :fecha,  :HORA;
if ((FECHA IS NULL) or (HORA IS NULL)) then
    BEGIN
    FECHA = FECHAI;
    HORA = HORAI1 - (DURA * 60);
    END
HORA = HORA + (DURA * 60);
if (HORA > HORAF1) then
    BEGIN
    if (HORA > HORAI2) then
        BEGIN
        if (HORA > HORAF2) then
            BEGIN
            FECHA = FECHA + 1;
            HORA = HORAI1;
            END
        END
    else
        HORA = HORAI2;
    END
NEW.crcd_feccontac = :FECHA;
NEW.crcd_horacontac = :hora;
/* inserte el compromiso en la agenda */
if (new.crcd_asesor is not null) then
    begin
    select c.crcm_tipoeven, c.crcm_nombre
        from crm_campana c where crcm_id = new.crcm_id into :evento, :conc;
    new.crcd_evento = 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 (new.crcd_evento, New.crcd_cliente, NEW.crcd_feccontac, NEW.crcd_HORAcontac, :EVENTO, :CONC, NEW.crcd_asesor, 'N', NEW.crcd_horacontac, 0, 'N', 'N', CAST ('NOW' AS DATE), USER);
    end
end
^

/* Trigger: CRM_CLIENTES_AI */
CREATE 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
        insert into clientes (terc_nit, clie_cod, clie_estado, zona_cod, vend_cod, cobr_cod, grca_cod, clie_aniv, clie_mailcart)
            values (new.crcl_nit, new.crcl_nit, 'A', new.zona_cod, new.vend_cod, new.cobr_cod, new.grca_cod, new.crcl_aniv, new.crcl_mailcart);
        end
    END
end
^

/* Trigger: CRM_CLIENTES_AU */
CREATE TRIGGER CRM_CLIENTES_AU FOR CRM_CLIENTES
ACTIVE AFTER UPDATE POSITION 0
as
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
        insert into clientes (terc_nit, clie_cod, clie_estado, zona_cod, vend_cod, cobr_cod, grca_cod, clie_aniv, clie_mailcart)
            values (new.crcl_nit, new.crcl_nit, 'A', new.zona_cod, new.vend_cod, new.cobr_cod, new.grca_cod, new.crcl_aniv, new.crcl_mailcart);
        end
    END
end
^

/* Trigger: CRM_CLIENTES_BD */
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
^

/* Trigger: CRM_CLIENTES_BI */
CREATE 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
    BEGIN
    EXECUTE PROCEDURE lee_configuracion ('CRM', 'PROSPECTOS', 'CREAR PROSPECTO AUTOMATICAMENTE COMO CLIENTE') returning_values (:TERC);
    if (TERC = 'SI') then
        NEW.crcl_estercero = 'S';
    else
        NEW.crcl_estercero = 'N';
    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
^

/* Trigger: CRM_CLIENTES_BU */
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
^

/* Trigger: CRM_COMPROMISOS_AD */
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
^

/* Trigger: CRM_COMPROMISOS_AI */
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
^

/* Trigger: CRM_COMPROMISOS_AU */
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
^

/* Trigger: CRM_COMPROMISOS_BI */
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);
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
^

/* Trigger: CRM_CONTACTOS_AD */
CREATE TRIGGER CRM_CONTACTOS_AD FOR CRM_CONTACTOS
ACTIVE AFTER DELETE POSITION 0
as
begin
DELETE FROM terceros_contactos WHERE TERC_NIT = OLD.crcl_nit AND TECC_ITEM = OLD.crco_id;
end
^

/* Trigger: CRM_CONTACTOS_AI */
CREATE TRIGGER CRM_CONTACTOS_AI FOR CRM_CONTACTOS
ACTIVE AFTER INSERT POSITION 0
as
begin
if (NEW.crco_replica = 'S') then
    BEGIN
    if (EXISTS (SELECT TERC_NIT FROM terceros_contactos WHERE TERC_NIT = NEW.crcl_nit AND TECC_ITEM = NEW.crco_id)) then
        UPDATE terceros_contactos SET TECC_NOMBRE = NEW.crco_nombre,
            TECC_CARGO = NEW.crco_cargo, TECC_TELEFONOS = NEW.crco_telefonos, TECC_EMAIL = NEW.crco_email,
            TECC_FAX = NEW.crco_fax, TECC_CEL = NEW.crco_cel
            WHERE TERC_NIT = NEW.crcl_nit AND TECC_ITEM = NEW.crco_id;
    ELSE
        insert into terceros_contactos (TERC_NIT, TECC_ITEM, TECC_NOMBRE, TECC_CARGO, TECC_TELEFONOS, TECC_EMAIL, TECC_FAX, TECC_CEL)
            VALUES(NEW.crcl_nit, NEW.crco_id, NEW.crco_nombre, NEW.crco_cargo, NEW.crco_telefonos, NEW.crco_email, NEW.crco_fax, NEW.crco_cel);
    END
end
^

/* Trigger: CRM_CONTACTOS_AU */
CREATE TRIGGER CRM_CONTACTOS_AU FOR CRM_CONTACTOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (NEW.crco_replica = 'S') then
    BEGIN
    if (EXISTS (SELECT TERC_NIT FROM terceros_contactos WHERE TERC_NIT = NEW.crcl_nit AND TECC_ITEM = NEW.crco_id)) then
        UPDATE terceros_contactos SET TECC_NOMBRE = NEW.crco_nombre,
            TECC_CARGO = NEW.crco_cargo, TECC_TELEFONOS = NEW.crco_telefonos, TECC_EMAIL = NEW.crco_email,
            TECC_FAX = NEW.crco_fax, TECC_CEL = NEW.crco_cel
            WHERE TERC_NIT = NEW.crcl_nit AND TECC_ITEM = NEW.crco_id;
    ELSE
        insert into terceros_contactos (TERC_NIT, TECC_ITEM, TECC_NOMBRE, TECC_CARGO, TECC_TELEFONOS, TECC_EMAIL, TECC_FAX, TECC_CEL)
            VALUES(NEW.crcl_nit, NEW.crco_id, NEW.crco_nombre, NEW.crco_cargo, NEW.crco_telefonos, NEW.crco_email, NEW.crco_fax, NEW.crco_cel);
    END
end
^

/* Trigger: CRM_CONTACTOS_BI */
CREATE TRIGGER CRM_CONTACTOS_BI FOR CRM_CONTACTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.crco_replica IS NULL) then
    NEW.crco_replica = 'S';
end
^

/* Trigger: CRM_EVENTOS_BI */
CREATE TRIGGER CRM_EVENTOS_BI FOR CRM_EVENTOS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
begin
if ((new.crev_id = 0) or (new.crev_id is null)) then
    new.crev_id = gen_id(id_evento, 1);
if (new.even_pref is null) then
    SELECT FIRST 1 PREF_PRE FROM PREFIJOS WHERE TIDO_COD = 301 AND PREF_ACTIVO = 'S' INTO NEW.even_pref;
    
/* Actualice el contador del prefijo */
SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 301 AND PREF_PRE = NEW.even_pref INTO :NUMERO, :AUTOM;
/* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
if (AUTOM = 'S') then
    BEGIN
    NEW.even_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
      WHERE TIDO_COD = 301 AND PREF_PRE = NEW.even_pref;
    END
ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.even_numero AS INTEGER)) then
        UPDATE PREFIJOS
            SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
            WHERE TIDO_COD = 301 AND PREF_PRE = NEW.even_pref;
    END
EXECUTE PROCEDURE COMPLETA_CEROS (NEW.even_numero) returning_values (NEW.even_numero);

/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM crm_eventos WHERE EVEN_PREF = NEW.even_pref AND EVEN_NUMERO = NEW.even_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un evento con el numero ' || new.even_pref || new.even_numero;
end
^

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

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

/* Trigger: CUENTAS_AU */
CREATE TRIGGER CUENTAS_AU FOR CUENTAS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ACTIVO VARCHAR(20);
begin
if ((new.cuen_tipo = 'A') and (old.cuen_tipo <> 'A')) then
    begin
    /* asigne el activo predeterminado */
    execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'CODIGO DE ACTIVO FIJO PREDETERMINADO') returning_values (ACTIVO);
    update comprobante_detalle set arti_cod = :ACTIVO WHERE CUEN_COD = NEW.cuen_cod AND ARTI_COD IS NULL;
    end
end
^

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

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

END
^

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

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

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

/* Trigger: CUENTAS_NIIF_AU */
CREATE TRIGGER CUENTAS_NIIF_AU FOR CUENTAS_NIIF
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ACTIVO VARCHAR(20);
begin
if ((new.cuen_tipo = 'A') and (old.cuen_tipo <> 'A')) then
    begin
    /* asigne el activo predeterminado */
    execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'CODIGO DE ACTIVO FIJO PREDETERMINADO') returning_values (ACTIVO);
    update comprobante_detalle set arti_cod = :ACTIVO WHERE CUEN_COD = NEW.cuen_cod AND ARTI_COD IS NULL;
    end
end
^

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

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

END
^

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

/* Trigger: DEPRECIACION_AI */
CREATE TRIGGER DEPRECIACION_AI FOR DEPRECIACION
ACTIVE AFTER INSERT POSITION 0
as
declare variable COD VARCHAR(20);
declare variable I INTEGER;
begin
I = 0;
FOR SELECT ACFJ_COD FROM activos_fijos WHERE ACFJ_ACTIVO = 'S' AND ACFJ_DEP = 'S' order by acfj_cod
    INTO :COD
    DO
    BEGIN
    I = I + 1;
    INSERT INTO depreciacion_detalle (DEPR_ID, DEPD_ITEM, ACFJ_COD) VALUES (NEW.depr_id, :I, :COD);
    END
end
^

/* Trigger: DEPRECIACION_BD */
CREATE TRIGGER DEPRECIACION_BD FOR DEPRECIACION
ACTIVE BEFORE DELETE POSITION 0
as
begin
  /* elimine el comprobante contable */
  delete from comprobante_detalle where enco_consec = old.enco_consec;
  delete from comprobante_detalle_niif where enco_consec = old.enco_consec;
  delete from comprobante_encabezado where enco_consec = old.enco_consec;
end
^

/* Trigger: DEPRECIACION_BI */
CREATE TRIGGER DEPRECIACION_BI FOR DEPRECIACION
ACTIVE BEFORE INSERT POSITION 0
as
begin
/* Registre un comprobante */
execute procedure cambie_id_comproba returning_values(NEW.enco_consec);
insert into comprobante_encabezado (tico_cod, prco_pref, enco_consec, enco_numero, enco_fecha, enco_concepto, enco_refer, enco_tiporef, enco_idref, ENCO_DESCONTABLE, enco_repniif)
    values (new.tico_cod, new.prco_pref, NEW.enco_consec, new.enco_numero, new.depr_fecha, NEW.depr_conc, NULL, 8, 0, 'S', 'N');

end
^

/* Trigger: DEPRECIACION_DETALLE_AI */
CREATE TRIGGER DEPRECIACION_DETALLE_AI FOR DEPRECIACION_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable CTADEPD VARCHAR(20);
declare variable CTADEPC VARCHAR(20);
declare variable CTADEPND VARCHAR(20);
declare variable CTADEPNC VARCHAR(20);
declare variable IDC INTEGER;
declare variable I INTEGER;
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYUNI VARCHAR(4);
declare variable CENTROUNI VARCHAR(4);
declare variable CONC VARCHAR(60);
declare variable ANONIIF CHAR(4);
declare variable FECHA CHAR(8);
declare variable PORC NUMERIC(18,2);
declare variable ITEM INTEGER;
declare variable NIIF CHAR(1);
begin
I = 0;
/* CONTABILICE */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NIT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (PROYUNI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (CENTROUNI);
SELECT A.acfj_ctadepd, A.acfj_ctadepc, A.acfj_ctaniifd, A.acfj_ctaniifc FROM activos_fijos A
    WHERE A.acfj_cod = NEW.acfj_cod INTO :ctadepd, :ctadepc, :ctadepnd, :ctadepnc;
if ((ctadepd IS NULL) or (ctadepd = '')) then
    exception activo_sin_cuenta 'debe indicar la cuenta de depreciacion debito para el activo ' || new.acfj_cod;
if ((ctadepc IS NULL) or (ctadepc = '')) then
    exception activo_sin_cuenta 'debe indicar la cuenta de depreciacion credito para el activo ' || new.acfj_cod;
SELECT D.enco_consec, D.depr_conc, D.depr_niif FROM DEPRECIACION D WHERE D.depr_id = NEW.depr_id
    INTO :IDC, :CONC, :NIIF;
CONC = CONC || 'Activo:' || new.acfj_cod;
if ((NIIF = 'A') or (NIIF = 'C')) then
    BEGIN
    ITEM = 0;
    SELECT CUEN_CENTRO FROM CUENTAS WHERE CUEN_COD = :ctadepd INTO :CENTRO;
    if (CENTRO = 'S') then
        FOR SELECT C.acce_proy, C.acce_centro, C.acce_porc/100 FROM activos_centros C WHERE C.acfj_cod = NEW.acfj_cod
            INTO :proy, :centro, :PORC
            DO
            BEGIN
            ITEM = ITEM + 1;
            /* COLGAP */
            if (EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE
                WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepd AND ARTI_COD = NEW.acfj_cod AND PROY_COD = :PROY AND CENT_COD = :CENTRO)) then
                UPDATE comprobante_detalle D SET D.code_debito = D.code_debito + NEW.depd_monto*:PORC
                    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepd AND ARTI_COD = NEW.acfj_cod AND PROY_COD = :PROY AND CENT_COD = :CENTRO;
            ELSE
                BEGIN
                select max(CODE_ITEM + 1) FROM comprobante_detalle WHERE ENCO_CONSEC = :IDC INTO :I;
                if (I IS NULL) then
                    i = 1;
                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE, ARTI_COD)
                    VALUES (:IDC, :I, :ctadepd, :NIT, :PROY, :CENTRO, :conc, NULL, 0, 0, NEW.depd_monto*:PORC, 0, 'S', NEW.acfj_cod);
                END
            END
    if (ITEM = 0) then
        BEGIN
        /* COLGAP */
        if (EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE
            WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepd AND ARTI_COD = NEW.acfj_cod)) then
            UPDATE comprobante_detalle D SET D.code_debito = D.code_debito + NEW.depd_monto
                WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepd AND ARTI_COD = NEW.acfj_cod;
        ELSE
            BEGIN
            select max(CODE_ITEM + 1) FROM comprobante_detalle WHERE ENCO_CONSEC = :IDC INTO :I;
            if (I IS NULL) then
                i = 1;
            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE, ARTI_COD)
                VALUES (:IDC, :I, :ctadepd, :NIT, :PROYUNI, :CENTROUNI, :conc, NULL, 0, 0, NEW.depd_monto, 0, 'S', NEW.acfj_cod);
            END
        END
    
    ITEM = 0;
    SELECT CUEN_CENTRO FROM CUENTAS WHERE CUEN_COD = :ctadepc INTO :CENTRO;
    if (CENTRO = 'S') then
        FOR SELECT C.acce_proy, C.acce_centro, C.acce_porc/100 FROM activos_centros C WHERE C.acfj_cod = NEW.acfj_cod
            INTO :proy, :centro, :PORC
            DO
            BEGIN
            ITEM = ITEM + 1;
            if (EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE
                WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepc AND ARTI_COD = NEW.acfj_cod AND PROY_COD = :PROY AND CENT_COD = :CENTRO)) then
                UPDATE comprobante_detalle D SET D.code_credito = D.code_credito + NEW.depd_monto*:PORC
                    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepc AND ARTI_COD = NEW.acfj_cod AND PROY_COD = :PROY AND CENT_COD = :CENTRO;
            ELSE
                BEGIN
                select max(CODE_ITEM + 1) FROM comprobante_detalle WHERE ENCO_CONSEC = :IDC INTO :I;
                if (I IS NULL) then
                    i = 1;
                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE, ARTI_COD)
                    VALUES (:IDC, :I, :ctadepc, :NIT, :PROY, :CENTRO, :conc, NULL, 0, 0, 0, NEW.depd_monto*:PORC, 'S', NEW.acfj_cod);
                END
            END
    if (ITEM = 0) then
        BEGIN
        if (EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE
            WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepc AND ARTI_COD = NEW.acfj_cod)) then
            UPDATE comprobante_detalle D SET D.code_credito = D.code_credito + NEW.depd_monto*:PORC
                WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepc AND ARTI_COD = NEW.acfj_cod;
        ELSE
            BEGIN
            select max(CODE_ITEM + 1) FROM comprobante_detalle WHERE ENCO_CONSEC = :IDC INTO :I;
            if (I IS NULL) then
                i = 1;
            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE, ARTI_COD)
                VALUES (:IDC, :I, :ctadepc, :NIT, :PROYUNI, :CENTROUNI, :conc, NULL, 0, 0, 0, NEW.depd_monto, 'S', NEW.acfj_cod);
            END
        END
    END
if ((NIIF = 'A') or (NIIF = 'N')) then
    BEGIN
    /* NIIF */
    EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE APERTURA NIIF') returning_values (:ANONIIF);
    SELECT ENCO_FECHA FROM comprobante_encabezado WHERE ENCO_CONSEC = :idc INTO :FECHA;
    if (SUBSTRING(:FECHA FROM 1 FOR 4) >= :ANONIIF) then
        BEGIN
        ITEM = 0;
        SELECT CUEN_CENTRO FROM cuentas_niif WHERE CUEN_COD = :ctadepnd INTO :CENTRO;
        if (CENTRO = 'S') then
            FOR SELECT C.acce_proy, C.acce_centro, C.acce_porc/100 FROM activos_centros C WHERE C.acfj_cod = NEW.acfj_cod
                INTO :proy, :centro, :PORC
                DO
                BEGIN
                ITEM = ITEM + 1;
                if (EXISTS (SELECT ENCO_CONSEC FROM comprobante_detalle_niif
                    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnd AND ARTI_COD = NEW.acfj_cod AND PROY_COD = :proy AND CENT_COD = :centro)) then
                    UPDATE comprobante_detalle_niif D SET D.code_debito = D.code_debito + NEW.depd_monton
                        WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnd AND ARTI_COD = NEW.acfj_cod AND PROY_COD = :proy AND CENT_COD = :centro;
                ELSE
                    BEGIN
                    select max(CODE_ITEM + 1) FROM comprobante_detalle_niif WHERE ENCO_CONSEC = :IDC INTO :I;
                    if (I IS NULL) then
                        i = 1;
                    INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE, ARTI_COD)
                        VALUES (:IDC, :I, :ctadepnd, :NIT, :PROY, :CENTRO, :conc, NULL, 0, 0, NEW.depd_monton, 0, 'S', NEW.acfj_cod);
                    END
                END
        if (ITEM = 0) then
            BEGIN
            if (EXISTS (SELECT ENCO_CONSEC FROM comprobante_detalle_niif
                WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnd AND ARTI_COD = NEW.acfj_cod)) then
                UPDATE comprobante_detalle_niif D SET D.code_debito = D.code_debito + NEW.depd_monton
                    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnd AND ARTI_COD = NEW.acfj_cod;
            ELSE
                BEGIN
                select max(CODE_ITEM + 1) FROM comprobante_detalle_niif WHERE ENCO_CONSEC = :IDC INTO :I;
                if (I IS NULL) then
                    i = 1;
                INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE, ARTI_COD)
                    VALUES (:IDC, :I, :ctadepnd, :NIT, :PROYUNI, :CENTROUNI, :conc, NULL, 0, 0, NEW.depd_monton, 0, 'S', NEW.acfj_cod);
                END
            END
        ITEM = 0;
        SELECT CUEN_CENTRO FROM cuentas_niif WHERE CUEN_COD = :ctadepnc INTO :CENTRO;
        if (CENTRO = 'S') then
            FOR SELECT C.acce_proy, C.acce_centro, C.acce_porc/100 FROM activos_centros C WHERE C.acfj_cod = NEW.acfj_cod
                INTO :proy, :centro, :PORC
                DO
                BEGIN
                ITEM = ITEM + 1;
                if (EXISTS (SELECT ENCO_CONSEC FROM comprobante_detalle_niif
                    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnc AND ARTI_COD = NEW.acfj_cod AND PROY_COD = :proy AND CENT_COD = :centro)) then
                    UPDATE comprobante_detalle_niif D SET D.code_credito = D.code_credito + NEW.depd_monton*:PORC
                        WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnc AND ARTI_COD = NEW.acfj_cod AND PROY_COD = :proy AND CENT_COD = :centro;
                ELSE
                    BEGIN
                    select max(CODE_ITEM + 1) FROM comprobante_detalle_niif WHERE ENCO_CONSEC = :IDC INTO :I;
                    if (I IS NULL) then
                        i = 1;
                    INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE, ARTI_COD)
                        VALUES (:IDC, :I, :ctadepnc, :NIT, :PROY, :CENTRO, :conc, NULL, 0, 0, 0, NEW.depd_monton*:PORC, 'S', NEW.acfj_cod);
                    END
                END
        if (ITEM = 0) then
            BEGIN
            if (EXISTS (SELECT ENCO_CONSEC FROM comprobante_detalle_niif
                WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnc AND ARTI_COD = NEW.acfj_cod)) then
                UPDATE comprobante_detalle_niif D SET D.code_credito = D.code_credito + NEW.depd_monton
                    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnc AND ARTI_COD = NEW.acfj_cod;
            ELSE
                BEGIN
                select max(CODE_ITEM + 1) FROM comprobante_detalle_niif WHERE ENCO_CONSEC = :IDC INTO :I;
                if (I IS NULL) then
                    i = 1;
                INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE, ARTI_COD)
                    VALUES (:IDC, :I, :ctadepnc, :NIT, :PROYUNI, :CENTROUNI, :conc, NULL, 0, 0, 0, NEW.depd_monton, 'S', NEW.acfj_cod);
                END
            END
        END
    END
end
^

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

/* Trigger: DEPRECIACION_DETALLE_BI */
CREATE TRIGGER DEPRECIACION_DETALLE_BI FOR DEPRECIACION_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECHA CHAR(8);
declare variable FECULT CHAR(8);
declare variable TIPO INTEGER;
declare variable FECING DATE;
declare variable MESESD INTEGER;
declare variable MESESDN INTEGER;
declare variable DEP CHAR(1);
declare variable UNI CHAR(1);
declare variable RESCATE NUMERIC(18,2);
declare variable UNITOT INTEGER;
declare variable VALORI NUMERIC(18,2);
declare variable ANO INTEGER;
declare variable ANOU INTEGER;
declare variable MES INTEGER;
declare variable MESU INTEGER;
declare variable DIA INTEGER;
declare variable DIAU INTEGER;
declare variable FECAUX DATE;
declare variable NIIF CHAR(1);
declare variable mesrest smallint;
declare variable mesrestn smallint;
begin
SELECT DEPR_FECHA, DEPR_NIIF FROM depreciacion WHERE DEPR_ID = NEW.depr_id INTO :FECHA, :NIIF;
SELECT AG.acgr_tipodep, A.acfj_fecing, A.acfj_dep, A.acfj_unidades, A.acfj_unitot, A.acfj_mesdep, A.acfj_depniif, A.acfj_rescate
    FROM activos_grupos AG, activos_fijos A WHERE A.acgr_id = AG.acgr_id AND A.acfj_cod = NEW.acfj_cod
    INTO :TIPO, :FECING, :DEP, :UNI, :UNITOT, :MESESD, :MESESDN, :RESCATE;
if (DEP = 'S') then
    BEGIN
    SELECT SUM(DD.depd_meses), SUM(DD.depd_mesesn) FROM depreciacion_detalle DD
        WHERE DD.acfj_cod = new.acfj_cod INTO :mesrest, :mesrestn;
    if (MESREST IS NULL) then
        MESREST = 0;
    if (MESRESTN IS NULL) then
        MESRESTN = 0;
    
    if (TIPO = 1) then
        BEGIN
        /* LINEA RECTA: DEP = (VRORIG / MESESDEP) * MESES A DEPRECIAR */
        /* DEPRECIACION COLGAP */
        if ((NIIF = 'A') or (NIIF = 'C'))  then
            BEGIN
            /* CALCULE MESES A DEPRECIAR DESDE LA ULTIMA */
            SELECT MAX(D.depr_fecha) FROM depreciacion_detalle DD, DEPRECIACION D
                WHERE D.depr_id = DD.depr_id AND ACFJ_COD = NEW.acfj_cod AND DEPR_FECHA <= :FECHA AND DD.depd_monto <> 0
                INTO :FECULT;
            if (FECULT IS NULL) then
                execute procedure fecha_a_conta(FECING) returning_values (:FECULT);
            if (fecult < FECHA) then
                BEGIN
                /* SI LA FECHA DE DEPRECIACION O INGRESO ES MENOR A LA FECHA DE DEPRECIACION HAGALA */
                ANO = SUBSTR(FECHA, 1, 4);
                MES = SUBSTR(FECHA, 5, 6);
                DIA = SUBSTR(FECHA, 7, 8);
                IF (DIA > 30) then
                    DIA = 30;
                if (MES = 2) then
                    if (DIA >= 28) then
                        DIA = 30;
                ANOU = SUBSTR(FECULT, 1, 4);
                MESU = SUBSTR(FECULT, 5, 6);
                DIAU = SUBSTR(FECULT, 7, 8);
                if (DIAU > 30) then
                    DIAU = 30;
                if (MESU = 2) then
                    if (DIAU >= 28) then
                        DIAU = 30;
                /* CALCULE LOS DIAS */
                if (mesesd * 30 > mesrest) then
                    begin
                    NEW.depd_meses = (ANO-ANOU)*360+(MES-MESU)*30+(DIA-DIAU);
                    EXECUTE PROCEDURE activo_valor(NEW.acfj_cod, :FECHA, 'N') returning_values (VALORI);
                    if (VALORI > 0) then
                        BEGIN
                        if (MESESD > (NEW.depd_meses/30)) then
                            NEW.depd_monto = (VALORI / (MESESD*30)) * NEW.depd_meses;
                        ELSE
                            BEGIN
                            NEW.depd_meses = MESESD * 30;
                            NEW.depd_monto = VALORI;
                            END
                        END
                    else
                        begin
                        NEW.depd_meses = 0;
                        NEW.depd_monto = 0;
                        end
                    end
                else
                    begin
                    NEW.depd_meses = 0;
                    NEW.depd_monto = 0;
                    end
                EXECUTE PROCEDURE activo_valor(NEW.acfj_cod, :FECHA, 'S') returning_values (VALORI);
                if (VALORI > 0) then
                    BEGIN
                    if (NEW.depd_monto > :VALORI) then
                        NEW.depd_monto = :VALORI;
                    END
                else
                    begin
                    NEW.depd_meses = 0;
                    NEW.depd_monto = 0;
                    end
                end
            end
        if ((NIIF = 'A') or (NIIF = 'N'))  then
            BEGIN
            /* DEPRECIACION NIIF */
            /* CALCULE MESES A DEPRECIAR DESDE LA ULTIMA */
            SELECT MAX(D.depr_fecha) FROM depreciacion_detalle DD, DEPRECIACION D
                WHERE D.depr_id = DD.depr_id AND ACFJ_COD = NEW.acfj_cod AND DEPR_FECHA <= :FECHA AND DD.depd_monton <> 0
                INTO :FECULT;
            if (FECULT IS NULL) then
                execute procedure fecha_a_conta(FECING) returning_values (:FECULT);
            if (fecult < FECHA) then
                BEGIN
                ANO = SUBSTR(FECHA, 1, 4);
                MES = SUBSTR(FECHA, 5, 6);
                DIA = SUBSTR(FECHA, 7, 8);
                IF (DIA > 30) then
                    DIA = 30;
                if (MES = 2) then
                    if (DIA >= 28) then
                        DIA = 30;
                ANOU = SUBSTR(FECULT, 1, 4);
                MESU = SUBSTR(FECULT, 5, 6);
                DIAU = SUBSTR(FECULT, 7, 8);
                if (DIAU > 30) then
                    DIAU = 30;
                if (MESU = 2) then
                    if (DIAU >= 28) then
                        DIAU = 30;
                if (mesesdn * 30 > mesrestn) then
                    begin
                    NEW.depd_mesesn = (ANO-ANOU)*360+(MES-MESU)*30+(DIA-DIAU);
                    EXECUTE PROCEDURE activo_valor_niif(NEW.acfj_cod, :FECHA, 'N') returning_values (VALORI);
                    if ((VALORI-rescate) > 0) then
                        BEGIN
                        if (mesesdn > (NEW.depd_mesesn/30)) then
                            NEW.depd_monton = ((VALORI-rescate) / (:mesesdn*30)) * NEW.depd_mesesn;
                        ELSE
                            BEGIN
                            NEW.depd_mesesn = mesesdn * 30;
                            NEW.depd_monton = (VALORI-rescate);
                            END
                        EXECUTE PROCEDURE activo_valor_niif(NEW.acfj_cod, :FECHA, 'S') returning_values (VALORI);
                        END
                    ELSE
                        BEGIN
                        NEW.depd_mesesn = 0;
                        NEW.depd_monton = 0;
                        END
                    end
                else
                    begin
                    NEW.depd_mesesn = 0;
                    NEW.depd_monton = 0;
                    end
                if ((VALORI-rescate) > 0) then
                    BEGIN
                    if (NEW.depd_monton > :VALORI) then
                        NEW.depd_monton = :VALORI;
                    END
                else
                    begin
                    NEW.depd_mesesn = 0;
                    NEW.depd_monton = 0;
                    end
                END
            ELSE
                BEGIN
                NEW.depd_mesesn = 0;
                NEW.depd_monton = 0;
                END
            END
        END
    if (TIPO = 2) then
        BEGIN
        /* UNIDADES */
        if ((UNI = 'S') AND (UNITOT <> 0)) then
            BEGIN
            if ((NIIF = 'A') or (NIIF = 'C'))  then
                BEGIN
                /* DEPRECIACION COLGAP */
                EXECUTE PROCEDURE activo_valor(NEW.acfj_cod, :FECHA, 'N') returning_values (VALORI);
                NEW.depd_monto = (VALORI / unitot) * NEW.depd_unidades;
                EXECUTE PROCEDURE activo_valor(NEW.acfj_cod, :FECHA, 'S') returning_values (VALORI);
                if (NEW.depd_monto > :VALORI) then
                    NEW.depd_monto = :VALORI;
                END
            if ((NIIF = 'A') or (NIIF = 'N'))  then
                BEGIN
                /* DEPRECIACION NIIF */
                EXECUTE PROCEDURE activo_valor_niif(NEW.acfj_cod, :FECHA, 'N') returning_values (VALORI);
                NEW.depd_monton = ((VALORI-rescate) / unitot) * NEW.depd_unidades;
                EXECUTE PROCEDURE activo_valor_niif(NEW.acfj_cod, :FECHA, 'S') returning_values (VALORI);
                if (NEW.depd_monton > :VALORI) then
                    NEW.depd_monton = :VALORI;
                END
            END
        END
    END
end
^

/* Trigger: DESCUENTOS_PRECIOS_BI */
CREATE TRIGGER DESCUENTOS_PRECIOS_BI FOR DESCUENTOS_PRECIOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.dctp_fami is null) then
    NEW.dctp_fami = '';
if (NEW.dctp_grupo is null) then
    NEW.dctp_grupo = '';
if (NEW.dctp_marca is null) then
    NEW.dctp_marca = '';
if (NEW.dctp_famibase is null) then
    NEW.dctp_famibase = '';
if (NEW.dctp_grupobase is null) then
    NEW.dctp_grupobase = '';
if (NEW.dctp_marcabase is null) then
    NEW.dctp_marcabase = '';
if (NEW.dctp_listaa is null) then
    NEW.dctp_listaa = 0;
end
^

/* Trigger: DESENSAMBLES_AD */
CREATE TRIGGER DESENSAMBLES_AD FOR DESENSAMBLES
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
delete from movimiento_articulo where (mvar_tipodoc = 16) and (mvar_idref = old.DESE_id) and (mvar_item = 0);
select enco_consec from comprobante_encabezado where enco_tiporef = 16 and enco_idref = old.dese_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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, OLD.dese_id, 'D', OLD.pref_pre || OLD.dese_numero);
END
^

/* Trigger: DESENSAMBLES_AI */
CREATE 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
^

/* Trigger: DESENSAMBLES_AU */
CREATE 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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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
^

/* Trigger: DESENSAMBLES_BI */
CREATE 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
^

/* Trigger: DESENSAMBLES_DETALLE_AD */
CREATE TRIGGER DESENSAMBLES_DETALLE_AD FOR DESENSAMBLES_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
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);
END
^

/* Trigger: DESENSAMBLES_DETALLE_AI */
CREATE 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(8);
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
^

/* Trigger: DESENSAMBLES_DETALLE_AU */
CREATE 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(8);
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
^

/* Trigger: DETERIORO_CARTERA_DET_AD */
CREATE TRIGGER DETERIORO_CARTERA_DET_AD FOR DETERIORO_CARTERA_DET
ACTIVE AFTER DELETE POSITION 0
as
declare variable FECHA DATE;
begin
if ((OLD.deca_id <> 0) AND (OLD.decd_anulado = 'N')) then
    BEGIN
    if ((OLD.decd_idnota IS NOT NULL) AND (OLD.decd_idnota <> 0)) then
        BEGIN
        UPDATE NOTAS_DEBITO_CLIENTES SET NDCL_ANULADO = 'S' WHERE NDCL_ID = old.decd_idnota;
        END
    else
        BEGIN
        SELECT DECA_FECHA FROM DETERIORO_CARTERA_ENC WHERE DECA_ID = old.deca_id INTO :FECHA;
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + OLD.decd_monto
            WHERE MVCL_TIPOREF = 47 AND MVCL_IDREF = OLD.deca_id;
        UPDATE saldos_doc_cartera
            SET SDCA_DETERIORO = SDCA_DETERIORO - OLD.decd_monto
            WHERE sdca_tiporef = old.decd_tipodoc and sdca_idref = old.decd_iddoc and sdca_fecha = :FECHA;
        END
    END
end
^

/* Trigger: DETERIORO_CARTERA_DET_AI */
CREATE TRIGGER DETERIORO_CARTERA_DET_AI FOR DETERIORO_CARTERA_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable CONCEPTO VARCHAR(60);
declare variable FECHA DATE;
declare variable COBR INTEGER;
declare variable EXISTE CHAR(1);
declare variable PREFNOTA VARCHAR(4);
declare variable IDCNT INTEGER;
declare variable IDINT INTEGER;
declare variable NOMINTER VARCHAR(60);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
begin
if ((NEW.deca_id <> 0) and (new.decd_anulado = 'N')) then
    BEGIN
    SELECT PREF_PRE, DECA_NUMERO, DECA_FECHA, DECA_CONCEPTO, DECA_PREFND FROM DETERIORO_CARTERA_ENC WHERE DECA_ID = NEW.deca_id
        INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :PREFNOTA;
    SELECT COBR_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :COBR;
    if (prefnota IS NULL) then
        BEGIN
        /* Registre el movimiento del proveedor */
        EXISTE = 'N';
        SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 47 AND MVCL_IDREF = NEW.deca_id INTO :EXISTE;
        if (EXISTE = 'S') then
            begin
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO + NEW.decd_monto
                WHERE MVCL_TIPOREF = 47 AND MVCL_IDREF = NEW.deca_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_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
              VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 47, NEW.deca_id, :fecha, :fecha, :concepto, NEW.decd_monto, 0, 0, 0, 0, 'N', 'S', :pref, :numero, '01', :cobr, 0);
        /* Registre el nuevo saldo del documento */
        select 'S' from saldos_doc_cartera where sdca_tiporef = NEW.decd_tipodoc and sdca_idref = NEW.decd_iddoc and sdca_fecha = :FECHA into :EXISTE;
        if (Existe = 'S') then
            UPDATE saldos_doc_cartera
                SET SDCA_DETERIORO = SDCA_DETERIORO + NEW.decd_monto
                WHERE sdca_tiporef = NEW.decd_tipodoc and sdca_idref = NEW.decd_iddoc and sdca_fecha = :FECHA;
        else
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE,
                SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM, SDCA_DETERIORO)
                VALUES (NEW.decd_tipodoc, NEW.decd_iddoc, :FECHA, NEW.terc_nit, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'N', 0, 0, NEW.decd_monto);
        end
    ELSE
        BEGIN
        /* grabe la nota */
        execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'NOMBRE DE INTERFAZ CONTABLE PARA NOTAS POR DETERIORO DE CARTERA')
          returning_values (NOMINTER);
        INSERT INTO NOTAS_DEBITO_CLIENTES (NDCL_ID, TERC_NIT, TIDO_COD, PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_VENCE,
            NDCL_CONC, 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,
            NDCL_COMIPORC, NDCL_COMIMONTO, COBR_COD, NDCL_ANULADO, NDCL_TRANSMIT, NDCL_USUARIO, NDCL_SUCURSAL, NUMOK,
            VEND_COD, NDCL_TRM, NDCL_EXENTO, NDCL_BASE1, NDCL_IVA1, NDCL_BASE2, NDCL_IVA2, NDCL_BASE3, NDCL_IVA3, NDCL_RTCREE, NDCL_RTCREEM)
            VALUES (NEW.decd_idnota, new.terc_nit, 41, :prefnota, '000001', :FECHA, :FECHA,
            'DETERIORO DE CARTERA A ' || :FECHA, new.decd_monto, 0, 0, 0, 0, 0,
            0, 0, 0, :FECHA, 0, 0, NULL, 0, 0, :COBR, 'N', 'N', USER, '01', 'N',
            :COBR, 1, NEW.decd_monto, 0, 0, 0, 0, 0, 0, 0, 0);

        select max(INCA_ID) from interfaz_cartera where TIDO_COD = 41 and PREF_PRE = :prefnota and INCA_NOMBRE = :nominter
            into :IDINT;
        execute procedure contabil_notadbcl (NEW.decd_idnota, :idint) returning_values (:ERROR, :VER, :idcnt);
        if (ERROR = 0) then
            execute procedure contabil_notadbcl_niif (NEW.decd_idnota, :idint, :idcnt) returning_values (:ERROR, :VER);
        if (ERROR = 0) then
            execute procedure CONTABILIZA_PENDIENTE (:idcnt);
        END
    END
end
^

/* Trigger: DETERIORO_CARTERA_DET_AU */
CREATE TRIGGER DETERIORO_CARTERA_DET_AU FOR DETERIORO_CARTERA_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable CONCEPTO VARCHAR(60);
declare variable FECHA DATE;
declare variable COBR INTEGER;
declare variable EXISTE CHAR(1);
declare variable PREFNOTA VARCHAR(4);
declare variable IDCNT INTEGER;
declare variable IDINT INTEGER;
declare variable NOMINTER VARCHAR(60);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
begin
if ((OLD.deca_id <> 0) AND (OLD.decd_anulado = 'N')) then
    BEGIN
    if ((OLD.decd_idnota IS NOT NULL) AND (OLD.decd_idnota <> 0)) then
        BEGIN
        if (NEW.decd_anulado = 'S') then
            DELETE FROM notas_debito_clientes WHERE NDCL_ID = OLD.decd_idnota;
        ELSE
            UPDATE NOTAS_DEBITO_CLIENTES SET NDCL_ANULADO = 'S' WHERE NDCL_ID = old.decd_idnota;
        END
    else
        BEGIN
        SELECT DECA_FECHA FROM DETERIORO_CARTERA_ENC WHERE DECA_ID = old.deca_id INTO :FECHA;
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + OLD.decd_monto
            WHERE MVCL_TIPOREF = 47 AND MVCL_IDREF = OLD.deca_id;
        UPDATE saldos_doc_cartera
            SET SDCA_DETERIORO = SDCA_DETERIORO - OLD.decd_monto
            WHERE sdca_tiporef = old.decd_tipodoc and sdca_idref = old.decd_iddoc and sdca_fecha = :FECHA;
        END
    END
if ((NEW.deca_id <> 0) and (new.decd_anulado = 'N')) then
    BEGIN
    SELECT PREF_PRE, DECA_NUMERO, DECA_FECHA, DECA_CONCEPTO, DECA_PREFND FROM DETERIORO_CARTERA_ENC WHERE DECA_ID = NEW.deca_id
        INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :PREFNOTA;
    SELECT COBR_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :COBR;
    if (prefnota IS NULL) then
        BEGIN
        /* Registre el movimiento del proveedor */
        EXISTE = 'N';
        SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 47 AND MVCL_IDREF = NEW.deca_id INTO :EXISTE;
        if (EXISTE = 'S') then
            begin
            UPDATE movimiento_clientes
                SET MVCL_MONTO = MVCL_MONTO + NEW.decd_monto
                WHERE MVCL_TIPOREF = 47 AND MVCL_IDREF = NEW.deca_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_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
              VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 47, NEW.deca_id, :fecha, :fecha, :concepto, NEW.decd_monto, 0, 0, 0, 0, 'N', 'S', :pref, :numero, '01', :cobr, 0);
        /* Registre el nuevo saldo del documento */
        select 'S' from saldos_doc_cartera where sdca_tiporef = NEW.decd_tipodoc and sdca_idref = NEW.decd_iddoc and sdca_fecha = :FECHA into :EXISTE;
        if (Existe = 'S') then
            UPDATE saldos_doc_cartera
                SET SDCA_DETERIORO = SDCA_DETERIORO + NEW.decd_monto
                WHERE sdca_tiporef = NEW.decd_tipodoc and sdca_idref = NEW.decd_iddoc and sdca_fecha = :FECHA;
        else
            INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE,
                SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM, SDCA_DETERIORO)
                VALUES (NEW.decd_tipodoc, NEW.decd_iddoc, :FECHA, NEW.terc_nit, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'N', 0, 0, NEW.decd_monto);
        end
    ELSE
        BEGIN
        /* grabe la nota */
        execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'NOMBRE DE INTERFAZ CONTABLE PARA NOTAS POR DETERIORO DE CARTERA')
          returning_values (NOMINTER);
        INSERT INTO NOTAS_DEBITO_CLIENTES (NDCL_ID, TERC_NIT, TIDO_COD, PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_VENCE,
            NDCL_CONC, 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,
            NDCL_COMIPORC, NDCL_COMIMONTO, COBR_COD, NDCL_ANULADO, NDCL_TRANSMIT, NDCL_USUARIO, NDCL_SUCURSAL, NUMOK,
            VEND_COD, NDCL_TRM, NDCL_EXENTO, NDCL_BASE1, NDCL_IVA1, NDCL_BASE2, NDCL_IVA2, NDCL_BASE3, NDCL_IVA3, NDCL_RTCREE, NDCL_RTCREEM)
            VALUES (new.decd_idnota, new.terc_nit, 41, :prefnota, '000001', :FECHA, :FECHA,
            'DETERIORO CARTERA DOCUMENTO ' || NEW.decd_prefdoc || NEW.decd_numdoc || ' A ' || :FECHA, new.decd_monto, 0, 0, 0, 0, 0,
            0, 0, 0, :FECHA, 0, 0, NULL, 0, 0, :COBR, 'N', 'N', USER, '01', 'N',
            :COBR, 1, NEW.decd_monto, 0, 0, 0, 0, 0, 0, 0, 0);

        select max(INCA_ID) from interfaz_cartera where TIDO_COD = 41 and PREF_PRE = :prefnota and INCA_NOMBRE = :nominter
            into :IDINT;
        execute procedure contabil_notadbcl (new.decd_idnota, :idint) returning_values (:ERROR, :VER, :idcnt);
        if (ERROR = 0) then
            execute procedure contabil_notadbcl_niif (new.decd_idnota, :idint, :idcnt) returning_values (:ERROR, :VER);
        if (ERROR = 0) then
            execute procedure CONTABILIZA_PENDIENTE (:idcnt);
        END
    END
end
^

/* Trigger: DETERIORO_CARTERA_DET_BI */
CREATE TRIGGER DETERIORO_CARTERA_DET_BI FOR DETERIORO_CARTERA_DET
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PREFNOTA VARCHAR(4);
begin
if (NEW.decd_monto <> 0) then
    BEGIN
    SELECT DECA_PREFND FROM DETERIORO_CARTERA_ENC WHERE DECA_ID = NEW.deca_id
        INTO :PREFNOTA;
    if (prefnota IS NOT NULL) then
        NEW.decd_idnota = gen_id(id_notadbcli, 1);
    END
end
^

/* Trigger: DETERIORO_CARTERA_ENC_AD */
CREATE TRIGGER DETERIORO_CARTERA_ENC_AD FOR DETERIORO_CARTERA_ENC
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
BEGIN
if (old.deca_anulado = 'N') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 47 and enco_idref = old.deca_id into :consec;
    if (NOT consec is null) then
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    delete from comprobante_encabezado where enco_tiporef = 47 and enco_idref = old.deca_id;
    end
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 47, OLD.deca_id, 'D', OLD.pref_pre || OLD.deca_numero);
end
^

/* Trigger: DETERIORO_CARTERA_ENC_AI */
CREATE TRIGGER DETERIORO_CARTERA_ENC_AI FOR DETERIORO_CARTERA_ENC
ACTIVE AFTER INSERT POSITION 0
as
begin
if ((NEW.deca_id <> 0) and (new.deca_anulado = 'N')) then
    BEGIN
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 47, NEW.deca_id, 'I', NEW.pref_pre || NEW.deca_numero);
    END
end
^

/* Trigger: DETERIORO_CARTERA_ENC_AU */
CREATE TRIGGER DETERIORO_CARTERA_ENC_AU FOR DETERIORO_CARTERA_ENC
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.deca_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 47 and enco_idref = old.deca_id into :consec;
    if (NOT consec is null) then
        begin
        delete from comprobante_detalle where enco_consec = :consec;
        delete from comprobante_detalle_niif where enco_consec = :consec;
        end
    delete from comprobante_encabezado where enco_tiporef = 47 and enco_idref = old.deca_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 47, NEW.deca_id, 'A', NEW.pref_pre || NEW.deca_numero);
    END
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 47, NEW.deca_id, 'U', NEW.pref_pre || NEW.deca_numero);
end
^

/* Trigger: DETERIORO_CARTERA_ENC_BI */
CREATE TRIGGER DETERIORO_CARTERA_ENC_BI FOR DETERIORO_CARTERA_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.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 47 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.deca_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 47 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.deca_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 47 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.deca_numero) returning_values (NEW.deca_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM deterioro_cartera_enc WHERE PREF_PRE = NEW.PREF_PRE AND DECA_NUMERO = NEW.deca_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un deterioro con el nÃºmero ' || new.pref_pre || new.deca_numero;
end
^

/* Trigger: DEVOLUCIONES_COMPRAS_AD */
CREATE 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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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_CANTCR = 0 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
^

/* Trigger: DEVOLUCIONES_COMPRAS_AI */
CREATE 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
    if ((new.dvco_remid IS NULL) or (new.dvco_remid = 0)) 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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, 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), (NEW.dvco_rtcreem*-1), 0, 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_RCREE, 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, NEW.dvco_rtcreem, 'N', 'N', NEW.pref_pre, NEW.DVCO_numero, NEW.dvco_trm);
            END
        end
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DVCO_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.dvco_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR 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
^

/* Trigger: DEVOLUCIONES_COMPRAS_AU */
CREATE 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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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
    if ((old.dvco_remid IS NULL) or (old.dvco_remid = 0)) 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);
            END
        else
            exception DOCUMENTO_CON_ABONOS 'La devoluciÃ³n ' || old.pref_pre || old.dvco_numero || 'tiene abonos registrados.';
        end
    /* ACTUALICE LA CONSOLIDACION */
    if (OLD.DVCO_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_CANTCR = 0 WHERE COFA_ID = OLD.dvco_consolida;
    END
/* registre lo nuevo */
if ((new.DVCO_id <> 0) and (new.dvco_anulado = 'N')) then
    begin
    if ((new.dvco_remid IS NULL) or (new.dvco_remid = 0)) 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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, 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), (NEW.dvco_rtcreem*-1), 0, 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_RCREE, 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, NEW.dvco_rtcreem, 'N', 'N', NEW.pref_pre, NEW.DVCO_numero, NEW.dvco_trm);
            END
        end
    /* ACTUALICE LA CONSOLIDACION */
    if (NEW.DVCO_CONSOLIDA <> 0) then
        UPDATE consolidado_faltantes SET COFA_IDDES = NEW.dvco_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR 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
^

/* Trigger: DEVOLUCIONES_COMPRAS_BI */
CREATE TRIGGER DEVOLUCIONES_COMPRAS_BI FOR DEVOLUCIONES_COMPRAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable pregtasa CHAR(2);
declare variable NOFACT 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;
if (new.dvco_remid is null) then
    new.dvco_remid = 0;
execute procedure LEE_CONFIGURACION ('COMPRAS','DEVOLUCIONES','PERMITIR DEVOLVER ARTICULOS NO FACTURADOS') returning_values (:NOFACT);
if ((NOFACT = 'NO') AND (NEW.dvco_factid = 0) AND (NEW.dvco_remid = 0)) then
    exception factura_no_existe 'No se encontrÃ³ la factura de compra o remisiÃ³n de proveedor a devolver.';

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
^

/* Trigger: DEVOLUCIONES_COMPRAS_DET_AD */
CREATE 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;
declare variable IDREM 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, DVCO_REMID FROM DEVOLUCIONES_COMPRAS
        WHERE DVCO_ID = OLD.DVCO_ID INTO :ID, :IDREM;
    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
    if (IDREM <> 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 RPVD_ITEM, RPVD_CANT, RPVD_FACTOR, RPVD_DEVUELTO
                FROM remision_proveedor_det
                WHERE REPR_ID = :IDREM 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 remision_proveedor_det
                        SET RPVD_DEVUELTO = 0
                        WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                ELSE
                    BEGIN
                    UPDATE remision_proveedor_det
                        SET RPVD_DEVUELTO = RPVD_DEVUELTO - :CANTAUX
                        WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        else
            begin
            FOR SELECT RPVD_ITEM, RPVD_CANT, RPVD_FACTOR, RPVD_DEVUELTO
                FROM remision_proveedor_det
                WHERE REPR_ID = :IDREM AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod and RPVD_LOTE = OLD.dvcd_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > (CANT * FACTOR - DEVUELTO)) then
                    BEGIN
                    UPDATE remision_proveedor_det
                        SET RPVD_DEVUELTO = 0
                        WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                ELSE
                    BEGIN
                    UPDATE remision_proveedor_det
                        SET RPVD_DEVUELTO = RPVD_DEVUELTO - :CANTAUX
                        WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        END
    END
END
^

/* Trigger: DEVOLUCIONES_COMPRAS_DET_AI */
CREATE 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(8);
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;
declare variable REMI VARCHAR(10);
declare variable IDREM INTEGER;
declare variable devrem CHAR(6);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
if ((NEW.dvco_id <> 0) and (new.dvcd_anulado = 'N')) then
    BEGIN
    select dvco_fecha, pref_pre, dvco_numero, terc_nit, dvco_factura, DVCO_FACTID, dvco_remision, dvco_remid
        from devoluciones_compras where dvco_id = new.dvco_id into :fec, :Pref, :Num, :Nit, :Fact, :ID, :remi, :idrem;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvcd_unidad) returning_values(factor);
    if (idrem <> 0) then
        CONC = 'DEVOLUCION COMPRA No.' || PREF || NUM || ' - REMISION ' || REMI;
    else
        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 */
    if (((ID <> 0) or (SINFACT = 'SI')) AND ((IDREM IS NULL) or (IDREM = 0))) then
        BEGIN
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 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 (CANTAUX > 0) then
                        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 (CANTAUX > 0) then
                        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
    if ((idrem <> 0) and (devrem = '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 (idrem <> 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 RPVD_ITEM, RPVD_CANT, RPVD_FACTOR, RPVD_DEVUELTO
                    FROM remision_proveedor_det
                    WHERE REPR_ID = :idrem 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 remision_proveedor_det
                            SET RPVD_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                    ELSE
                        BEGIN
                        UPDATE remision_proveedor_det
                            SET RPVD_DEVUELTO = RPVD_DEVUELTO + :CANTAUX
                            WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                    END
                end
            else
                begin
                FOR SELECT RPVD_ITEM, RPVD_CANT, RPVD_FACTOR, RPVD_DEVUELTO
                    FROM remision_proveedor_det
                    WHERE REPR_ID = :IDREM AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND RPVD_LOTE = NEW.dvcd_lote
                    INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                    DO
                    BEGIN
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE remision_proveedor_det
                            SET RPVD_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                      ELSE
                        BEGIN
                        UPDATE remision_proveedor_det
                            SET RPVD_DEVUELTO = RPVD_DEVUELTO + :CANTAUX
                            WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                        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 || ' ' || cantaux || '-' || EXIST;
            END
        END
    END
END
^

/* Trigger: DEVOLUCIONES_COMPRAS_DET_AU */
CREATE 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(8);
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;
declare variable REMI VARCHAR(10);
declare variable IDREM INTEGER;
declare variable devrem CHAR(6);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
/* 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, DVCO_REMID FROM DEVOLUCIONES_COMPRAS
        WHERE DVCO_ID = OLD.DVCO_ID INTO :ID, :IDREM;
    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
    /* DESHAGA LO DEVUELTO EN LA REMISION */
    if (IDREM <> 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 RPVD_ITEM, RPVD_CANT, RPVD_FACTOR, RPVD_DEVUELTO
                FROM remision_proveedor_det
                WHERE REPR_ID = :IDREM 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 remision_proveedor_det
                        SET RPVD_DEVUELTO = 0
                        WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                ELSE
                    BEGIN
                    UPDATE remision_proveedor_det
                        SET RPVD_DEVUELTO = RPVD_DEVUELTO - :CANTAUX
                        WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                END
            end
        else
            begin
            FOR SELECT RPVD_ITEM, RPVD_CANT, RPVD_FACTOR, RPVD_DEVUELTO
                FROM remision_proveedor_det
                WHERE REPR_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod and RPVD_LOTE = OLD.dvcd_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > (CANT * FACTOR - DEVUELTO)) then
                    BEGIN
                    UPDATE remision_proveedor_det
                        SET RPVD_DEVUELTO = 0
                        WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                    CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                    END
                ELSE
                    BEGIN
                    UPDATE remision_proveedor_det
                        SET RPVD_DEVUELTO = RPVD_DEVUELTO - :CANTAUX
                        WHERE REPR_ID = :IDREM AND RPVD_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, DVCO_FACTID, DVCO_REMISION, DVCO_REMID
        from devoluciones_compras where dvco_id = new.dvco_id into :fec, :Pref, :Num, :Nit, Fact, :ID, :REMI, :IDREM;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvcd_unidad) returning_values(factor);
    if (idrem <> 0) then
        CONC = 'DEVOLUCION COMPRA No.' || PREF || NUM || ' - REMISION ' || REMI;
    else
        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 */
    if (((ID <> 0) or (SINFACT = 'SI')) AND ((IDREM IS NULL) or (IDREM = 0))) then
        BEGIN
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 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
    if ((IDREM <> 0) AND (devrem = '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 (IDREM <> 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 RPVD_ITEM, RPVD_CANT, RPVD_FACTOR, RPVD_DEVUELTO
                    FROM remision_proveedor_det
                    WHERE REPR_ID = :IDREM 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 remision_proveedor_det
                            SET RPVD_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                    ELSE
                        BEGIN
                        UPDATE remision_proveedor_det
                            SET RPVD_DEVUELTO = RPVD_DEVUELTO + :CANTAUX
                            WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                    END
                end
            else
                begin
                FOR SELECT RPVD_ITEM, RPVD_CANT, RPVD_FACTOR, RPVD_DEVUELTO
                    FROM remision_proveedor_det
                    WHERE REPR_ID = :IDREM AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND RPVD_LOTE = NEW.dvcd_lote
                    INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                    DO
                    BEGIN
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE remision_proveedor_det
                            SET RPVD_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                      ELSE
                        BEGIN
                        UPDATE remision_proveedor_det
                            SET RPVD_DEVUELTO = RPVD_DEVUELTO + :CANTAUX
                            WHERE REPR_ID = :IDREM AND RPVD_ITEM = :ITEM;
                        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
        END
    end
END
^

/* Trigger: DEVOLUCIONES_COMPRAS_DET_BI */
CREATE TRIGGER DEVOLUCIONES_COMPRAS_DET_BI FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable trm numeric(18,2);
declare variable DEC1818 CHAR(1);
BEGIN
if (new.dvcd_dtoporc is null) then
    new.dvcd_dtoporc = 0;
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.dvcd_unidad) returning_values (new.dvcd_factor);
/* CALCULE EL MONTO DEL DESCUENTO */
NEW.DVCD_DTOMONTO = NEW.dvcd_prunit * NEW.dvcd_dtoporc / 100;
select dvco_trm, dvco_dec1818 from devoluciones_compras where dvco_id = new.dvco_id into :trm, :dec1818;
if (DEC1818 = 'S') then
    BEGIN
    select grup_dec1818 from grupo g, articulo a where a.arti_cod = new.arti_cod and a.grup_cod = g.grup_cod into :DEC1818;
    if (DEC1818 = 'S') then
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'TARIFA DE IVA PARA PRODUCTOS EXENTOS DECRETO 1818 DE 2015') returning_values NEW.dvcd_tiva;
    ELSE
        select taiv_cod from articulo where arti_cod = new.arti_cod into new.dvcd_tiva;
    END
ELSE
    select taiv_cod from articulo where arti_cod = new.arti_cod into new.dvcd_tiva;

/* si estaba en otra moneda convierta a pesos */
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
^

/* Trigger: DEVOLUCIONES_VENTAS_AD */
CREATE 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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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

/* SI SE HIZO EGRESO ANULELA */
ID = 0;
SELECT COFA_IDDES FROM consolidado_faltantes WHERE COFA_TIPODES = 62 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id INTO :ID;
if (ID <> 0) then
    BEGIN
    DELETE FROM egresos_crucec WHERE EGRE_ID = :ID;
    DELETE FROM egresos_caja WHERE EGRE_ID = :ID;
    DELETE FROM egresos WHERE EGRE_ID = :ID;
    delete from consolidado_faltantes WHERE COFA_TIPODES = 62 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
^

/* Trigger: DEVOLUCIONES_VENTAS_AI */
CREATE 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(8);
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 RCREE NUMERIC(18,2);
declare variable DTOF NUMERIC(18,2);
declare variable AGENCIA INTEGER;
declare variable IDC INTEGER;
declare variable ERROR INTEGER;
declare variable PREFAP CHAR(2);
declare variable EGREAUTO CHAR(2);
declare variable CAJA INTEGER;
declare variable CONTADO CHAR(1);
declare variable RETES CHAR(2);
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable FECDOC DATE;
declare variable ABONO NUMERIC(18,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)) and new.devt_devrem = 'N') 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_RCREE,
            SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, 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), (NEW.devt_rtcreem*-1),
            0, 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_RCREE, 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, NEW.devt_rtcreem, '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_CANTCR = COFA_CANT * COFA_FACTOR 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, 'Devolucion 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, 'Devolucion 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) and (new.devt_total <> 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, 'Devolucion No. ' || new.pref_pre || new.devt_numero, 7);
        
            EXECUTE PROCEDURE SALDOS_FACTURA(NEW.devt_factid, '9999/12/31') returning_values (:SALDO, :rtfte, :rtiva, :rtica, :rcree);
            if ((new.devt_aplica = 'S') AND (SALDO >= (NEW.devt_total-NEW.devt_RTFTEMONTO-NEW.devt_rtivamonto-NEW.devt_rticamonto-NEW.devt_rtcreem)) AND (RTFTE >= NEW.devt_RTFTEMONTO) AND (RTIVA >= NEW.devt_rtivamonto) AND (RTICA >= NEW.devt_rticamonto) AND (RCREE >= NEW.devt_rtcreem)) 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;

                execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PREFIJO PARA APLICACIONES AUTOMATICAS IGUAL A PREFIJO DEVOLUCION') returning_values (:PREFAP);
                if (PREFAP = 'SI') then
                    BEGIN
                    PREF = NEW.pref_pre;
                    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 43 and pref_activo = 'S' AND PREF_PRE = :PREF INTO :numero;
                    END
                else
                    SELECT FIRST 1 PREF_PRE, PREF_ACTUAL FROM PREFIJOS WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0) or (SUCU_ID = 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;
                EXECUTE PROCEDURE busca_id_doc_cartera(33, NEW.pref_pre, NEW.devt_numero, NEW.terc_nit, NEW.devt_fecha)
                    returning_values (:IDC, :SALDO, :rtfte, :rtiva, :rtica, :rcree, :DTOF, :ERROR);
                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_RCREE,
                    ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                    VALUES (:ID, 1, 33, NEW.devt_id, NEW.pref_pre, NEW.devt_numero, :SALDO, :rtfte, :rtiva, :rtica, :rcree, '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_RCREE,
                    ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                    VALUES (:ID, 2, 31, NEW.devt_factid, :pref, :numero, :SALDO*-1, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, '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_CANTCR)
                    VALUES (1, :IDC, 43, 33, NEW.devt_id, :ID, 1);
                end
            else
                begin
                /* si la configuraciOn lo indica haga el egreso */
                EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER EGRESO AUTOMATICO EN DEVOLUCIONES DE VENTAS DE CONTADO') returning_values (EGREAUTO);
                if (EGREAUTO = 'SI') then
                    BEGIN
                    SELECT AUTO_CONTADO FROM AUTORIZACIONES A, FACTURAS F WHERE A.AUTO_NUMERO = F.auto_numero AND F.fact_id = NEW.devt_factid AND F.pref_pre = A.pref_pre INTO :CONTADO;
                    if (CONTADO = 'S') then
                        BEGIN
                        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PREFIJO PARA EGRESOS DE CAJA POR DEVOLUCIONES DE CONTADO') returning_values (PREF);
                        if ((PREF = '') or (PREF IS NULL))  then
                            PREF = NEW.pref_pre;
                        SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 and pref_activo = 'S' AND PREF_PRE = :PREF INTO :numero;
                        SELECT CAJA_ID FROM punto_venta WHERE PTVT_ID = NEW.ptvt_id INTO :CAJA;
                        ID = GEN_ID(id_egresos, 1);
                        execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
                        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
                        if (AUTORCREE <> '') then
                            FAUTORCREE = CAST(AUTORCREE AS DATE);
                        else
                            FAUTORCREE = '9999/12/31';
                        SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = 31) AND (SDCA_IDREF = NEW.devt_factid) AND (SDCA_MONTO <> 0) INTO :FECDOC;
--                        if (RETES = 'SI') then
                            begin
                            ABONO = NEW.devt_total - NEW.devt_rtftemonto - NEW.devt_rtivamonto - NEW.devt_rticamonto;
                            if (FAUTORCREE > FECDOC) then
                                BEGIN
                                ABONO = ABONO - NEW.devt_rtcreem;
                                RCREE = NEW.devt_rtcreem;
                                END
                            else    
                                RCREE = 0;
                            end
--                        ELSE
--                            ABONO = NEW.devt_total;
                        INSERT INTO EGRESOS (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO,
                            EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF, EGRE_OBS, EGRE_TIPOMOVBCO, EGRE_IDMOVBCO,
                            EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_USUARIO, NUMOK, CLEG_ID, EGRE_TRM)
                            VALUES (:ID, 62, :PREF, :NUMERO, NEW.devt_fecha, 'DEVOLUCION CONTADO No.' || NEW.pref_pre || NEW.devt_numero, :ABONO,
                            NEW.devt_rtftemonto, NEW.devt_rtivamonto, NEW.devt_rticamonto, 0, NULL, NULL, NULL,
                            NEW.devt_nomterc, 'N', 'N', NEW.terc_nit, '4', :CAJA, USER, 'N', 0, 1);
    
                        INSERT INTO EGRESOS_CRUCEC (EGRE_ID, EGCC_ITEM, EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO,
                            EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA, EGCC_RCREE,
                            EGCC_DTOF, EGCC_SUCURSAL, EGCC_ANULADO, EGCC_TRANSMIT, EGCC_IDDOC, EGCC_DIFCAMBIO)
                            VALUES (:ID, 1, 33, NEW.pref_pre, NEW.devt_numero, :ABONO*-1, NEW.devt_rtftemonto*-1, NEW.devt_rtivamonto*-1, NEW.devt_rticamonto*-1, :RCREE*-1,
                            0, NEW.devt_sucursal, 'N', 'N', NEW.devt_id, 0);
                        
                        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 (:ID, 1, :CAJA, 1, NULL, NULL, NULL, NEW.devt_fecha, :ABONO, 'N', 'N');
                        IDC = gen_id(id_cons, 1);
                        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                            VALUES (:IDC, 0, 62, 33, NEW.devt_id);
                        INSERT INTO CONSOLIDADO_FALTANTES (COFA_ITEM, COFA_ID, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_IDDES, COFA_CANTCR)
                            VALUES (1, :IDC, 62, 33, NEW.devt_id, :ID, 1);
                        END
                    END
                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, 'Devolucion 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
^

/* Trigger: DEVOLUCIONES_VENTAS_AU */
CREATE 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(8);
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 RCREE NUMERIC(18,2);
declare variable DTOF NUMERIC(18,2);
declare variable AGENCIA INTEGER;
declare variable IDC INTEGER;
declare variable ERROR INTEGER;
declare variable PREFAP CHAR(2);
declare variable EGREAUTO CHAR(2);
declare variable CAJA INTEGER;
declare variable CONTADO CHAR(1);
declare variable RETES CHAR(2);
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable FECDOC DATE;
declare variable ABONO NUMERIC(18,2);
declare variable NUMEGRE VARCHAR(8);
declare variable NUMOK CHAR(1);
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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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;

    /* SI SE HIZO EGRESO ANULELO */
    ID = 0;
    SELECT COFA_IDDES FROM consolidado_faltantes WHERE COFA_TIPODES = 62 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id INTO :ID;
    if (ID <> 0) then
        UPDATE egresos SET EGRE_ANULADO = 'S' WHERE EGRE_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
    /* SI SE HIZO EGRESO ANULELO */
    ID = 0;
    SELECT COFA_IDDES FROM consolidado_faltantes WHERE COFA_TIPODES = 62 AND COFA_TIPOORI = 33 AND COFA_IDORI = OLD.devt_id INTO :ID;
    if (ID <> 0) then
        BEGIN
        UPDATE egresos SET EGRE_ANULADO = 'S' WHERE EGRE_ID = :ID;
        SELECT EGRE_NUMERO FROM EGRESOS WHERE EGRE_ID = :ID INTO :NUMEGRE;
        DELETE FROM EGRESOS WHERE EGRE_ID = :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_CANTCR = 0 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_CANTCR = 0 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_RCREE,
                SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, 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), (NEW.devt_rtcreem*-1),
                0, 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_RCREE, 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, NEW.devt_rtcreem, '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, :rcree);
                if ((new.devt_aplica = 'S') AND (SALDO >= (NEW.devt_total-NEW.devt_RTFTEMONTO-NEW.devt_rtivamonto-NEW.devt_rticamonto-NEW.devt_rtcreem)) AND (RTFTE >= NEW.devt_RTFTEMONTO) AND (RTIVA >= NEW.devt_rtivamonto) AND (RTICA >= NEW.devt_rticamonto) AND (rcree >= NEW.devt_rtcreem)) 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;
                    execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PREFIJO PARA APLICACIONES AUTOMATICAS IGUAL A PREFIJO DEVOLUCION') returning_values (:PREFAP);
                    if (PREFAP = 'SI') then
                        BEGIN
                        PREF = NEW.pref_pre;
                        SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 43 and pref_activo = 'S' AND PREF_PRE = :PREF INTO :numero;
                        END
                    else
                        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;
                    EXECUTE PROCEDURE busca_id_doc_cartera(33, NEW.pref_pre, NEW.devt_numero, NEW.terc_nit, NEW.devt_fecha)
                        returning_values (:IDC, :SALDO, :rtfte, :rtiva, :rtica, :rcree, :DTOF, :ERROR);
                    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_RCREE,
                        ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                        VALUES (:ID, 1, 33, NEW.devt_id, NEW.pref_pre, NEW.devt_numero, :SALDO, :rtfte, :rtiva, :rtica, :rcree,
                        '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_RCREE,
                        ACDE_ANULADO, ACDE_TRANSMIT, ACDE_DIFCAMBIO)
                        VALUES (:ID, 2, 31, NEW.devt_factid, :pref, :numero, :SALDO*-1, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1,
                        '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_CANTCR)
                        VALUES (1, :IDC, 43, 33, NEW.devt_id, :ID, 1);
                    end
                ELSE
                    BEGIN
                    /* si la configuraciOn lo indica haga el egreso */
                    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER EGRESO AUTOMATICO EN DEVOLUCIONES DE VENTAS DE CONTADO') returning_values (EGREAUTO);
                    if (EGREAUTO = 'SI') then
                        BEGIN
                        SELECT AUTO_CONTADO FROM AUTORIZACIONES A, FACTURAS F WHERE A.AUTO_NUMERO = F.auto_numero AND F.fact_id = NEW.devt_factid AND F.pref_pre = A.pref_pre INTO :CONTADO;
                        if (CONTADO = 'S') then
                            BEGIN
                            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PREFIJO PARA EGRESOS DE CAJA POR DEVOLUCIONES DE CONTADO') returning_values (PREF);
                            if ((PREF = '') or (PREF IS NULL))  then
                                PREF = NEW.pref_pre;
                            SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 and pref_activo = 'S' AND PREF_PRE = :PREF INTO :numero;
                            SELECT CAJA_ID FROM punto_venta WHERE PTVT_ID = NEW.ptvt_id INTO :CAJA;
                            ID = GEN_ID(id_egresos, 1);
                            execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
                            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
                            if (AUTORCREE <> '') then
                                FAUTORCREE = CAST(AUTORCREE AS DATE);
                            else
                                FAUTORCREE = '9999/12/31';
                            SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = 31) AND (SDCA_IDREF = NEW.devt_factid) AND (SDCA_MONTO <> 0) INTO :FECDOC;
--                            if (RETES = 'SI') then
                                begin
                                ABONO = NEW.devt_total - NEW.devt_rtftemonto - NEW.devt_rtivamonto - NEW.devt_rticamonto;
                                if (FAUTORCREE > FECDOC) then
                                    BEGIN
                                    ABONO = ABONO - NEW.devt_rtcreem;
                                    RCREE = NEW.devt_rtcreem;
                                    END
                                else    
                                    RCREE = 0;
                                end
                            if (NUMEGRE <> '') then
                                BEGIN
                                NUMERO = :NUMEGRE;
                                NUMOK = 'S';
                                END
                            ELSE
                                NUMOK = 'N';
                            INSERT INTO EGRESOS (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO,
                                EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF, EGRE_OBS, EGRE_TIPOMOVBCO, EGRE_IDMOVBCO,
                                EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_USUARIO, NUMOK, CLEG_ID, EGRE_TRM)
                                VALUES (:ID, 62, :PREF, :NUMERO, NEW.devt_fecha, 'DEVOLUCION CONTADO No.' || NEW.pref_pre || NEW.devt_numero, :ABONO,
                                NEW.devt_rtftemonto, NEW.devt_rtivamonto, NEW.devt_rticamonto, 0, NULL, NULL, NULL,
                                NEW.devt_nomterc, 'N', 'N', NEW.terc_nit, '4', :CAJA, USER, :NUMOK, 0, 1);
        
                            INSERT INTO EGRESOS_CRUCEC (EGRE_ID, EGCC_ITEM, EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO,
                                EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA, EGCC_RCREE,
                                EGCC_DTOF, EGCC_SUCURSAL, EGCC_ANULADO, EGCC_TRANSMIT, EGCC_IDDOC, EGCC_DIFCAMBIO)
                                VALUES (:ID, 1, 33, NEW.pref_pre, NEW.devt_numero, :ABONO*-1, NEW.devt_rtftemonto*-1, NEW.devt_rtivamonto*-1, NEW.devt_rticamonto*-1, :RCREE*-1,
                                0, NEW.devt_sucursal, 'N', 'N', NEW.devt_id, 0);
                            
                            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 (:ID, 1, :CAJA, 1, NULL, NULL, NULL, NEW.devt_fecha, :ABONO, 'N', 'N');
                            IDC = gen_id(id_cons, 1);
                            INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                                VALUES (:IDC, 0, 62, 33, NEW.devt_id);
                            INSERT INTO CONSOLIDADO_FALTANTES (COFA_ITEM, COFA_ID, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_IDDES, COFA_CANTCR)
                                VALUES (1, :IDC, 62, 33, NEW.devt_id, :ID, 1);
                            END
                        END
                    END
                end
            end
        /* ACTUALICE LA CONSOLIDACION */
        if (NEW.DEVT_CONSOLIDA <> 0) then
            UPDATE consolidado_faltantes SET COFA_IDDES = NEW.devt_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR 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
^

/* Trigger: DEVOLUCIONES_VENTAS_BI */
CREATE TRIGGER DEVOLUCIONES_VENTAS_BI FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
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);
declare variable UNICOB VARCHAR(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_devrem is null) then
    NEW.devt_devrem = 'N';
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.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 (:unicob);
    if (UNICOB = 'SI') then
        NEW.cobr_cod = NEW.vend_cod;
    ELSE
        NEW.cobr_cod = :CODCOBR;
    END
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
^

/* Trigger: DEVOLUCIONES_VENTAS_DETALLE_AD */
CREATE 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 DEVUELTO NUMERIC(18, 4);
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable devrem CHAR(6);
declare variable EXIST CHAR(1);
declare variable devremter CHAR(1);
declare variable fec date;
declare variable NIT varchar(20);
declare variable SUCURSAL VARCHAR(10);
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, devt_devrem, devt_fecha, terc_nit, devt_sucursal
        FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = OLD.DEVT_ID INTO :ID, :devremter, :fec, :nit, :sucursal;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0
                INTO :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_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 AND FADE_CANT > 0
                INTO :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_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD
                    INTO :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_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 :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_DEVUELTO, PEDE_ITEM
                FROM pedidos_detalle
                WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD
                INTO :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
    if ((devremter = 'S')) then
        BEGIN
        CANTAUX = old.dvde_cant * old.dvde_factor;
        FOR SELECT R.REVT_ID, RVDE_ITEM, RVDE_DEVUELTO
            FROM remisiones_venta_detalle RD, remisiones_venta R
            WHERE R.REVT_ID = RD.REVT_ID AND TERC_NIT = :NIT AND REVT_SUCURSAL = :sucursal AND ARTI_COD = OLD.ARTI_COD
            AND RVDE_DEVUELTO > 0 AND REVT_FECHA < :fec AND REVT_ANULADO = 'N'
            order by revt_fecha desc, revt_id desc, rvde_item desc
                INTO :IDREM, ITEM, :DEVUELTO
            DO
            BEGIN
            if (CANTAUX > 0) then
                begin
                if (DEVUELTO < CANTAUX) then
                  BEGIN
                  UPDATE remisiones_venta_detalle
                    SET RVDE_DEVUELTO = 0
                    WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = OLD.ARTI_COD;
                  CANTAUX = CANTAUX - 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 = OLD.ARTI_COD;
                  CANTAUX = 0;
                  END
                end
            else
                break;
            END
        end

    END
END
^

/* Trigger: DEVOLUCIONES_VENTAS_DETALLE_AI */
CREATE TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable fecfac date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable DEVUELTO NUMERIC(18,4);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18, 4);
declare variable CNTFAC NUMERIC(18, 4);
declare variable FACT VARCHAR(12);
declare variable COSTO NUMERIC(18,2);
declare variable ULTIMO NUMERIC(18,2);
declare variable devnof CHAR(2);
declare variable numrows INTEGER;
declare variable OK CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
declare variable IDREM INTEGER;
declare variable devrem CHAR(6);
declare variable EXIST CHAR(1);
declare variable FACMARCA VARCHAR(2);
declare variable PREFDOS VARCHAR(4);
declare variable IDF2 INTEGER;
declare variable DEVREMTER CHAR(1);
declare variable SUCURSAL VARCHAR(10);
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, DEVT_IDFMAR, DEVT_SUCURSAL, DEVT_DEVREM
        from devoluciones_ventas where devt_id = new.devt_id into :fec, :Pref, :Num, :Nit, :Fact, :idrem, :ID, :idped, :idf2, :sucursal, :devremter;
    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','ARTICULOS','SEPARAR ARTICULOS SEGUN LA MARCA EN FACTURAS INDEPENDIENTES') RETURNING_VALUES (FACMARCA);
    if (FACMARCA = 'SI') then
        BEGIN
        /* BUSQUE EL PREFIJO ASOCIADO A LA MARCA */
        PREFDOS = NULL;
        SELECT MAX(A.PREF_PRE) FROM autorizaciones A, ARTICULO M, PREFIJOS P, USUARIO U
            WHERE AUTO_MARCA = M.MARC_COD AND M.arti_cod = NEW.arti_cod AND P.pref_pre = A.pref_pre AND P.tido_cod = 31
            AND USER_COD = USER AND ((P.sucu_id = 0) or (P.sucu_id = U.sucu_id))
            INTO :PREFDOS;
        if ((PREFDOS IS NULL) or (IDF2 IS NOT NULL))  then
            FACMARCA = 'NO'; -- SI ES LA SEGUNDA FACTURA O NO HAY PREFIJO ASOCIADO HAGALO NORMAL
        ELSE
            BEGIN
            IDF2 = NULL;
            SELECT DEVT_ID FROM devoluciones_ventas WHERE PREF_PRE = :PREFDOS AND DEVT_IDFMAR = NEW.devt_id INTO :IDF2;
            /* SI NO EXISTE UNA FACTURA ASOCIADA DE ESA MARCA INSERTELA */
            if (IDF2 IS NULL) then
                BEGIN
                EXECUTE PROCEDURE cambie_id_devolclie returning_values (:IDF2);

                INSERT INTO DEVOLUCIONES_VENTAS (DEVT_ID, VEND_COD, TERC_NIT, TIDO_COD, PREF_PRE, PTVT_ID, DEVT_NUMERO,
                    DEVT_FECHA, DEVT_OBS, DEVT_IVAINC, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO,
                    DEVT_EXTRA, DEVT_RTFTEPORC, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO,
                    DEVT_ANULADO, DEVT_TRANSMIT, DEVT_TOTAL, DEVT_NOMTERC, DEVT_RTFTEMONTO, DEVT_DTOPOR, DEVT_DTOMONTO,
                    BODE_COD, DEVT_FACTURA, DEVT_FACTID, DEVT_NROCOPIA, DEVT_CONSOLIDA, DEVT_USUARIO, DEVT_SUCURSAL, NUMOK,
                    COBR_COD, DEVT_FACTOR, DEVT_REMISION, DEVT_REMID, DEVT_TRM, DEVT_DTOIT1, DEVT_DTOIT2, DEVT_DTOIT3,
                    DEVT_CONFIRMACXC, DEVT_PEDIDO, DEVT_PEDID, DEVT_APLICA, DEVT_DEC2799, DEVT_RTCREE, DEVT_RTCREEM, DEVT_IDFMAR)
                    SELECT :IDF2, VEND_COD, TERC_NIT, 33, :prefdos, PTVT_ID, DEVT_NUMERO,
                    DEVT_FECHA, DEVT_OBS, DEVT_IVAINC, DEVT_COMIPORC, DEVT_COMIMONTO, 0, 0,
                    0, DEVT_RTFTEPORC, DEVT_RTIVAPORC, 0, DEVT_RTICAPORC, 0,
                    DEVT_ANULADO, DEVT_TRANSMIT, 0, DEVT_NOMTERC, 0, DEVT_DTOPOR, DEVT_DTOMONTO,
                    BODE_COD, DEVT_FACTURA, DEVT_FACTID, 0, DEVT_CONSOLIDA, DEVT_USUARIO, DEVT_SUCURSAL, 'N', 
                    COBR_COD, 1, DEVT_REMISION, 0, DEVT_TRM, 0, 0, 0,
                    DEVT_CONFIRMACXC, DEVT_PEDIDO, 0, 'N', DEVT_DEC2799, DEVT_RTCREE, 0, NEW.devt_id
                    FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = NEW.devt_id;
                END
            /* INSERTE EL ITEM EN LA DEVOLUCION */

            INSERT INTO DEVOLUCIONES_VENTAS_DETALLE (DEVT_ID, DVDE_ITEM, BODE_COD, ARTI_COD, DVDE_CANT, DVDE_UNIDAD, DVDE_LOTE,
                DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_FACTOR, DVDE_DESC,
                DVDE_OBS, DVDE_CODBAR, DVDE_TOTAL, DVDE_ANULADO, DVDE_TRANSMIT, DVDE_REFERENCIA, LOTE_VENCE, DVDE_FACTORLISTA,
                DVDE_DTO1, DVDE_DTO2, DVDE_DTO3, DVDE_DTOM1, DVDE_DTOM2, DVDE_DTOM3, DVDE_TIVA, DVDE_INALCP, DVDE_INACM)
                VALUES (:IDF2, NEW.dvde_item, NEW.bode_cod, NEW.ARTI_COD, NEW.dvde_cant, NEW.dvde_unidad, NEW.dvde_lote,
                NEW.dvde_prunit, NEW.dvde_dtoporc, NEW.dvde_dtomonto, NEW.dvde_ivaporc, NEW.dvde_ivamonto, NEW.dvde_consumo, NEW.dvde_factor, NEW.dvde_desc,
                NEW.dvde_obs, NEW.dvde_codbar, NEW.dvde_total, NEW.dvde_anulado, NEW.dvde_transmit, NEW.dvde_referencia, NEW.lote_vence, NEW.dvde_factorlista,
                NEW.dvde_dto1, NEW.dvde_dto2, NEW.dvde_dto3, NEW.dvde_dtom1, NEW.dvde_dtom2, NEW.dvde_dtom3, NEW.dvde_tiva, NEW.dvde_inalcp, NEW.dvde_inacm);
            /* actualice el total de la devolucion */
            UPDATE devoluciones_ventas
                SET DEVT_TOTAL = DEVT_TOTAL + NEW.dvde_total,
                DEVT_IVAMONTO = DEVT_IVAMONTO + NEW.dvde_ivamonto,
                DEVT_DTOMONTO = (DEVT_TOTAL-DEVT_IVAMONTO) * DEVT_DTOPOR / 100,
                DEVT_RTFTEMONTO = (DEVT_TOTAL-DEVT_IVAMONTO) * DEVT_RTFTEPORC / 100,
                DEVT_RTIVAMONTO = DEVT_IVAMONTO * DEVT_RTIVAPORC / 100,
                DEVT_RTICAMONTO = (DEVT_TOTAL-DEVT_IVAMONTO) * DEVT_RTICAPORC / 100,
                DEVT_RTCREEM = (DEVT_TOTAL-DEVT_IVAMONTO) * DEVT_RTCREE / 100
                WHERE DEVT_ID = :IDF2;
            END
        END
    if (FACMARCA = 'NO') then
        BEGIN
        /* si la factura afecto el inventario, afectelo */
        execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:devnof);
        if (devnof = 'SI') then
            OK = 'S';
        else
            BEGIN
            if (id <> 0) then
                begin
                SELECT SUM(FADE_CANT * FADE_FACTOR) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ARTI_COD = NEW.arti_cod INTO :cntfac;
                /* verifique si afecto el inventario */
                select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :id and arti_cod = new.arti_cod into :numrows;
                if (numrows > 0) then
                    OK = 'S';
                else
                    BEGIN
                    /* busque remisiones que pudieron afectarlo */
                    /* primero posteriores a la factura */
                    select sum(cofa_cantcr) from consolidado_faltantes where cofa_tipoori = 31 and cofa_idori = :id and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_cantcr <> 0 into :cantaux;
                    if ((cantaux <> 0) and (cantaux is not null)) then
                        BEGIN
                        if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                            OK = 'S';
                        ELSE
                            OK = 'N';
                        END
                    else
                        begin
                        /* si no, anteriores a la factura */
                        select sum(cofa_cantcr) from consolidado_faltantes C, FACTURAS f where f.fact_consolida = c.cofa_id and cofa_tipoori = 32 and f.fact_id = :id and cofa_tipodes = 31 and arti_cod = new.arti_cod and cofa_cantcr <> 0 into :cantaux;
                        if ((cantaux <> 0) and (cantaux is not null)) then
                            OK = 'S';
                        else
                            BEGIN
                            /* si hacen pedido automatico, puede que la remisiÃƒÆ’Ã†â€™Ãƒâ€šÃ‚Â³n este hecha con el pedido */
                            EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
                            if (PEDAUTO = 'SI') then
                                BEGIN
                                SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = right(F.fact_numero,6) AND F.fact_id = :id INTO :IDped;
                                select sum(cofa_cantcr) from consolidado_faltantes where cofa_tipoori = 34 and cofa_idori = :idped and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_cantcr <> 0 into :cantaux;
                                if ((cantaux <> 0) and (cantaux is not null)) then
                                    if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                                        OK = 'S';
                                    else
                                        OK = 'N';
                                else
                                    OK = 'N';
                                END
                            ELSE
                                OK = 'N';
                            END
                        end
                    END
                end
            else
              if ((idrem <> 0) and (devrem = 'SI')) then
                begin
                /* verifique si afecto el inventario */
                select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 32 and mvar_idref = :idrem and arti_cod = new.arti_cod into :numrows;
                if (numrows > 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
              ELSE
                if (devremter = 'S') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_tercero_fecha(NEW.arti_cod, :nit, :sucursal, :fec) returning_values (:cantaux);
                    if (NEW.dvde_cant * NEW.dvde_factor > :cantaux) then
                        exception devolucion_mayor 'El articulo ' || new.arti_cod || ' no fue remisionado o la cantidad (' || (new.dvde_cant * new.dvde_factor) || ') es mayor (' || :cantaux || ')';
                    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, CLSU_COD)
                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, :sucursal);
            end
        /* ACTUALICE LO DEVUELTO EN LA FACTURA */
        select ARTI_EXIST from ARTICULO where ARTI_COD = new.ARTI_COD into :EXIST;
        if (ID <> 0) then
            BEGIN
            CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
            if (EXIST <> 'L') then
                begin
                FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                    FROM FACTURAS_DETALLE
                    WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD and FADE_CANT > 0
                    INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                    DO
                    BEGIN
                    if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                        if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                          BEGIN
                          UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = (:CANT * :FACTOR)
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                          CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                          END
                        ELSE
                          BEGIN
                          UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                          CANTAUX = 0;
                          END
                    END
                end
            else
                begin
                FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                    FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod
                        AND FADE_LOTE = NEW.dvde_lote AND FADE_CANT > 0
                    INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                    DO
                    BEGIN
                    if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                        if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                          BEGIN
                          UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = (:CANT * :FACTOR)
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                          CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                          END
                        ELSE
                          BEGIN
                          UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                          CANTAUX = 0;
                          END
                    END
                end
            if (CANTAUX > 0) then
                EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
            END
        if ((idrem <> 0) and (devrem = 'SI')) then
            BEGIN
            CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
            if (EXIST <> 'L') then
                begin
                FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD
                    INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                    DO
                    BEGIN
                    if (CANTAUX > 0) then
                        if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                          BEGIN
                          UPDATE remisiones_venta_detalle
                            SET RVDE_DEVUELTO = (:CANT * :FACTOR)
                            WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                          CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                          END
                        ELSE
                          BEGIN
                          UPDATE remisiones_venta_detalle
                            SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                            WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                          CANTAUX = 0;
                          END
                    END
                end
            else
                begin
                FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND RVDE_LOTE = NEW.dvde_lote
                    INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                    DO
                    BEGIN
                    if (CANTAUX > 0) then
                        if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                          BEGIN
                          UPDATE remisiones_venta_detalle
                            SET RVDE_DEVUELTO = (:CANT * :FACTOR)
                            WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                          CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                          END
                        ELSE
                          BEGIN
                          UPDATE remisiones_venta_detalle
                            SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                            WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                          CANTAUX = 0;
                          END
                    END
                end
            if (CANTAUX > 0) then
                EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la remisionada del articulo ' || new.arti_cod;
            END
        if ((devremter = 'S')) then
            BEGIN
            CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
            FOR SELECT R.REVT_ID, RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle RD, remisiones_venta R
                WHERE R.REVT_ID = RD.REVT_ID AND TERC_NIT = :NIT AND REVT_SUCURSAL = :sucursal AND ARTI_COD = NEW.ARTI_COD
                AND RVDE_DEVUELTO < (RVDE_CANT * RVDE_FACTOR) AND REVT_FECHA < :fec AND REVT_ANULADO = 'N'
                order by revt_fecha, revt_id, rvde_item
                    INTO :IDREM, 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 ((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
END
^

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

/* Trigger: DEVOLUCIONES_VENTAS_DETALLE_BI */
CREATE 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);
declare variable DEC1818 CHAR(1);
declare variable PREF VARCHAR(4);
BEGIN
if (new.dvde_cant is null) then
    new.dvde_cant = 0;
if (new.dvde_prunit is null) then
    new.dvde_prunit = 0;
if (new.dvde_dtoporc is null) then
    new.dvde_dtoporc = 0;
if (new.dvde_ivaporc is null) then
    new.dvde_ivaporc = 0;
if (new.dvde_ivamonto is null) then
    new.dvde_ivamonto = 0;
if (new.dvde_consumo is null) then
    new.dvde_consumo = 0;
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.dvde_unidad) returning_values (new.dvde_factor);
/* CALCULE EL MONTO DEL DESCUENTO */
NEW.DVDE_DTOMONTO = NEW.dvde_prunit * NEW.dvde_dtoporc / 100;
/* si estaba en otra moneda convierta a pesos */
select devt_trm, devt_ivainc, pref_pre from devoluciones_ventas where devt_id = new.devt_id into :trm, :ivainc, :pref;
if ((NEW.dvde_total IS NULL) or (NEW.dvde_total = 0)) then
    BEGIN
    NEW.dvde_total = NEW.dvde_cant * (NEW.dvde_prunit - NEW.dvde_dtomonto);
    if (IVAINC = 'N') then
        NEW.dvde_total = NEW.dvde_total + NEW.dvde_ivamonto + NEW.dvde_consumo;
    END
if (trm <> 1) then
    begin
    new.dvde_prunit = new.dvde_prunit * trm;
    new.dvde_dtomonto = new.dvde_dtomonto * trm;
    new.dvde_ivamonto = new.dvde_ivamonto * trm;
    new.dvde_consumo = new.dvde_consumo * trm;
    new.dvde_total = new.dvde_total * trm;
    end
select grup_dec1818 from grupo g, articulo a where a.arti_cod = new.arti_cod and a.grup_cod = g.grup_cod into :DEC1818;
if (DEC1818 = 'S') then
    BEGIN
    SELECT PREF_DEC1818 FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = :pref INTO :DEC1818;
    if (DEC1818 = 'S') then
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'TARIFA DE IVA PARA PRODUCTOS EXENTOS DECRETO 1818 DE 2015') returning_values (new.dvde_tiva);
    ELSE
        select taiv_cod from articulo where arti_cod = new.arti_cod into new.dvde_tiva;
    END
ELSE
    select taiv_cod from articulo where arti_cod = new.arti_cod into new.dvde_tiva;
END
^

/* Trigger: DEVOLUCION_CHEQUES_AD */
CREATE TRIGGER DEVOLUCION_CHEQUES_AD FOR DEVOLUCION_CHEQUES
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
declare variable ABONOS INTEGER;
begin
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
        ABONOS = 0;
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 77 AND SDCA_IDREF = OLD.dvch_id AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) 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
            exception DOCUMENTO_CON_ABONOS 'La devolucion de cheque ' || OLD.prba_pref || OLD.dvch_numdoc || ' tiene abonos registrados.';
        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
    /* BORRE LA DEV. */
    DELETE FROM MOVIMIENTO_BANCO
        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
select enco_consec from comprobante_encabezado where enco_tiporef = 77 and enco_idref = old.dvch_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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, OLD.dvch_id, 'D', OLD.prba_pref || OLD.dvch_numdoc, OLD.cuba_cod);
end
^

/* Trigger: DEVOLUCION_CHEQUES_AI */
CREATE 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 and CODE_DEVUELTO = 'N';
  /* ACTUALICE LA CARTERA O LA CAJA */
  if (NEW.dvch_cartera = 'S') then
    BEGIN
    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);
    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);
    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
^

/* Trigger: DEVOLUCION_CHEQUES_AU */
CREATE TRIGGER DEVOLUCION_CHEQUES_AU FOR DEVOLUCION_CHEQUES
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
declare variable ABONOS 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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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
        /* Verifique si habia abonos a la devolucion */
        ABONOS = 0;
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 77 AND SDCA_IDREF = OLD.dvch_id AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) 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
            exception DOCUMENTO_CON_ABONOS 'La devolucion de cheque ' || OLD.prba_pref || OLD.dvch_numdoc || ' tiene abonos registrados.';
        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  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);
        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);
        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
^

/* Trigger: DEVOLUCION_CHEQUES_BI */
CREATE TRIGGER DEVOLUCION_CHEQUES_BI FOR DEVOLUCION_CHEQUES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
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
    if ((new.terc_nit is null) or (new.terc_nit = '')) then
        exception tercero_no_existe 'Debe indicar la identificacion del cliente para afectar la cartera';
    else
        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;
        if ((new.dvch_sucursal is null) or (new.dvch_sucursal = ''))  then
            select first 1 clcu_cod from cliente_sucursales where terc_nit = new.terc_nit into new.dvch_sucursal;
        end
    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 'La forma de pago ' || new.dvch_banco || ' ' || new.dvch_cuenta || ' ' || new.dvch_nroch || ' ya existe en caja.';
END
^

/* Trigger: DOCUMENTOS_IMPORT_EMPLEADO_BI */
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
^

/* Trigger: DOCUMENTOS_PAGO_CAJA_BD */
CREATE TRIGGER DOCUMENTOS_PAGO_CAJA_BD FOR DOCUMENTOS_PAGO_CAJA
ACTIVE BEFORE DELETE POSITION 0
as
declare variable OK CHAR(1);
declare variable IDCON INTEGER;
begin
/* No deje borrar un documento que ya haya salido */
OK = 'N';
if (old.dpca_idsal <> 0) then
    BEGIN
    if ((OLD.dpca_tiposal = 71) AND (OLD.dpca_tipoent = 61)) then
        BEGIN
        SELECT CONS_ID FROM RECIBOS_CAJA WHERE RECA_ID = OLD.dpca_ident INTO :IDCON;
        if (OLD.dpca_idsal = :IDCON) then
            OK = 'S';
        END
    if (OK = 'N') then
        exception documento_pago_salido 'La forma de pago ' || old.dpca_banco || ' ' || old.dpca_cuenta || ' ' || old.dpca_numero || ' ya fue utilizada.';
    END
end
^

/* Trigger: DOCUMENTOS_PAGO_CAJA_BI */
CREATE TRIGGER DOCUMENTOS_PAGO_CAJA_BI FOR DOCUMENTOS_PAGO_CAJA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMROWS integer;
begin
/* verifique que no exista en caja antes */
SELECT COUNT(*) FROM documentos_pago_caja WHERE caja_id = new.caja_id AND fopa_id = new.fopa_id and dpca_banco = NEW.dpca_banco AND
    dpca_cuenta = NEW.dpca_cuenta AND dpca_numero = NEW.dpca_numero AND dpca_tiposal = 0 and dpca_idsal = 0
    INTO :NUMROWS;
if (numrows > 0) then
    exception documento_pago_salido 'La forma de pago ' || new.dpca_banco || ' ' || new.dpca_cuenta || ' ' || new.dpca_numero || ' ya existe en la caja.';
end
^

/* Trigger: DOCUMENTOS_PAGO_CAJA_BU */
CREATE TRIGGER DOCUMENTOS_PAGO_CAJA_BU FOR DOCUMENTOS_PAGO_CAJA
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable tiposal integer;
declare variable idsal integer;
begin
if ((new.dpca_tiposal <> 0) and (new.dpca_idsal <> 0))  then
  begin
  /* valide que el documento de salida  existe*/
  select first 1 d.dpca_tiposal, d.dpca_idsal from documentos_pago_caja d
    where d.caja_id = new.caja_id and d.fopa_id = new.fopa_id and d.dpca_banco = new.dpca_banco and d.dpca_cuenta = new.dpca_cuenta and d.dpca_numero = new.dpca_numero
    order by d.dpca_id desc
    into :tiposal, :idsal;
  if ((tiposal <> 0) or (idsal <> 0))  then
    exception documento_pago_salido 'El documento de pago ' || new.fopa_id || ' ' || new.dpca_banco || ' ' || new.dpca_cuenta || ' ' || new.dpca_numero || ' ya no existe en la caja ' || new.caja_id;
  end
end
^

/* Trigger: EGRESOS_AD */
CREATE TRIGGER EGRESOS_AD FOR EGRESOS
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
if ((OLD.egre_id <> 0) AND (OLD.egre_anulado = 'N')) then
  BEGIN
  /* BORRE EL TRASLADO A CAJA */
  if (OLD.EGRE_ID <> 0) then
    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
  /* borre la contabilizaciÃ³n */
  select enco_consec from comprobante_encabezado where enco_tiporef = 62 and enco_idref = old.egre_id into :consec;
  if (NOT consec is null) then
    begin
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_detalle_niif where enco_consec = :consec;
    end
  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, OLD.egre_id, 'D', OLD.pref_pre || OLD.egre_numero);
  END
END
^

/* Trigger: EGRESOS_AI */
CREATE TRIGGER EGRESOS_AI FOR EGRESOS
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
/* CUANDO TIPO = 2 (TRASLADO A CAJA) REGISTRAR EL INGRESO EN CAJA */
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, 'I', NEW.pref_pre || NEW.egre_numero);
    END
END
^

/* Trigger: EGRESOS_AU */
CREATE 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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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
^

/* Trigger: EGRESOS_BANCO_AD */
CREATE TRIGGER EGRESOS_BANCO_AD FOR EGRESOS_BANCO
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
  /* BORRE EL ANTERIOR */
  if (OLD.EGRE_ID <> 0) 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
END
^

/* Trigger: EGRESOS_BANCO_AI */
CREATE 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
^

/* Trigger: EGRESOS_BANCO_AU */
CREATE 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
^

/* Trigger: EGRESOS_BANCO_BI */
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
^

/* Trigger: EGRESOS_BI */
CREATE TRIGGER EGRESOS_BI FOR EGRESOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if (new.terc_nit is null) then
    exception tercero_no_existe 'Debe indicar un tercero para el egreso.';
if (new.egre_rtcree is null) then
    new.egre_rtcree = 0;
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_rtcree = NEW.egre_rtcree * 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
^

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

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

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

/* Trigger: EGRESOS_CAJA_BI */
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
^

/* Trigger: EGRESOS_CRUCEC_AD */
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 - OLD.egcc_difcambio,
            SDCA_ABRTFTE = SDCA_ABRTFTE - old.egcc_rtfte,
            SDCA_ABRTIVA = SDCA_ABRTIVA - old.egcc_rtiva,
            SDCA_ABRTICA = SDCA_ABRTICA - old.egcc_rtica,
            SDCA_ABRCREE = SDCA_ABRCREE - old.egcc_rcree
            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,
            MVCL_RCREE = MVCL_RCREE - OLD.egcc_rcree
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = OLD.egre_id and MVCL_SUCURSAL = OLD.egcc_sucursal;
        end
    END
END
^

/* Trigger: EGRESOS_CRUCEC_AI */
CREATE 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);
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable FECDOC DATE;
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
      begin
      EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
      if (AUTORCREE <> '') then
        FAUTORCREE = CAST(AUTORCREE AS DATE);
      else
        FAUTORCREE = '9999/12/31';
      SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = NEW.egcc_tipodoc) AND (SDCA_IDREF = NEW.egcc_iddoc) AND (SDCA_MONTO <> 0) INTO :FECDOC;
      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 || :saldo || ' ES MAYOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio);
            end
        ELSE
            begin
            if (FAUTORCREE <= FECDOC) then
                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 || :saldo || ' ES MAYOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio);
                end
            else
                begin
                if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || :saldo || ' ES MAYOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio);
                end
            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 || :saldo || ' ES MENOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_dtof + NEW.egcc_difcambio);
            end
        ELSE
            begin
            if (FAUTORCREE <= FECDOC) then
                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 || :saldo || ' ES MENOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_dtof + NEW.egcc_difcambio);
                end
            else
                begin
                if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || :saldo || ' ES MENOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio);
                end
            end
        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_ABRCREE = SDCA_ABRCREE + NEW.egcc_rcree,
                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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, NEW.egcc_rcree, '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_RCREE = MVCL_RCREE + NEW.egcc_rcree,
                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_RCREE, 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, NEW.egcc_rcree, '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
^

/* Trigger: EGRESOS_CRUCEC_AU */
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(8);
declare variable SALDO NUMERIC(18,2);
declare variable RETES char(2);
declare variable COBR INTEGER;
declare variable TRM NUMERIC(18,2);
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable FECDOC DATE;
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,
        SDCA_ABRCREE = SDCA_ABRCREE - old.egcc_rcree
        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,
        MVCL_RCREE = MVCL_RCREE - OLD.egcc_rcree
        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
      begin
      EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
      if (AUTORCREE <> '') then
        FAUTORCREE = CAST(AUTORCREE AS DATE);
      else
        FAUTORCREE = '9999/12/31';
      SELECT MIN(SDCA_FECHA) FROM SALDOS_DOC_CARTERA WHERE (SDCA_TIPOREF = NEW.egcc_tipodoc) AND (SDCA_IDREF = NEW.egcc_iddoc) AND (SDCA_MONTO <> 0) INTO :FECDOC;
      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 || :saldo || ' ES MAYOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio);
            end
        ELSE
            begin
            if (FAUTORCREE <= FECDOC) then
                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 || :saldo || ' ES MAYOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio);
                end
            else
                begin
                if (saldo > (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || :saldo || ' ES MAYOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio);
                end
            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 || :saldo || ' ES MENOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio);
            end
        ELSE
            begin
            if (FAUTORCREE <= FECDOC) then
                begin
                if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || :saldo || ' ES MENOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio);
                end
            else
                begin
                if (saldo < (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || :saldo || ' ES MENOR QUE EL ABONO ' || (NEW.egcc_abono + NEW.egcc_rtfte + NEW.egcc_rtiva + NEW.egcc_rtica + NEW.egcc_rcree + NEW.egcc_dtof + NEW.egcc_difcambio);
                end
            end
        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
        /* 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_ABRCREE = SDCA_ABRCREE + NEW.egcc_rcree,
            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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (NEW.egcc_tipodoc, NEW.egcc_iddoc, :FEC, :NIT, 0, 0, 0, 0, (NEW.egcc_abono+NEW.egcc_dtof+NEW.egcc_difcambio), NEW.egcc_rtfte, NEW.egcc_rtiva, NEW.egcc_rtica, NEW.egcc_rcree, '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_RCREE = MVCL_RCREE + NEW.egcc_rcree,
                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_RCREE, 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, NEW.egcc_rcree, 'N', 'S', :PREFIJO, :NUMERO, NEW.egcc_sucursal, :COBR, :TRM);
    END
END
^

/* Trigger: EGRESOS_CRUCEC_BI */
CREATE 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);
declare variable FECREC DATE;
declare variable FECDOC DATE;
declare variable OTROSTERC CHAR(2);
declare variable NITE VARCHAR(20);
declare variable NITDOC VARCHAR(20);
begin
if (NEW.egcc_sucursal IS NULL) then
    NEW.egcc_sucursal = '01';
if (NEW.egcc_rcree IS NULL) then
    NEW.egcc_rcree = 0;
/* 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);
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 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_rcree = NEW.egcc_rcree * :trmdoc;
    NEW.egcc_dtof = NEW.egcc_dtof * :trmdoc;
    END
if ((new.egcc_abono+new.egcc_rtfte+new.egcc_rtiva+new.egcc_rtica+new.egcc_rcree+new.egcc_dtof) = 0) then
    exception ABONO_CERO 'El monto del abono al documento ' || new.egcc_prefijo || new.egcc_numero || ' no puede ser cero.';
SELECT EGRE_FECHA, TERC_NIT FROM EGRESOS WHERE EGRE_ID = NEW.egre_id INTO :FECREC, :NITE;
SELECT MVCL_FECHA, TERC_NIT FROM movimiento_clientes M WHERE M.mvcl_tiporef = NEW.egcc_tipodoc AND M.mvcl_idref = NEW.egcc_iddoc INTO :FECDOC, :NITDOC;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'EL EGRESO DE FECHA ' || :FECREC || ' INTENTA CRUZAR UN DOCUMENTO DE FECHA ' || FECDOC;
if ((otrosterc = 'NO') AND (NITE <> NITDOC)) then
    exception documento_de_otro_tercero 'EL EGRESO CON NIT ' || :nite || ' INTENTA CRUZAR EL DOCUMENTO ' || NEW.egcc_prefijo || NEW.egcc_numero || ' DEL CLIENTE ' || :nitdoc;
end
^

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

/* Trigger: EGRESOS_DETALLE_AI */
CREATE TRIGGER EGRESOS_DETALLE_AI FOR EGRESOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
declare variable NITDOC VARCHAR(20);
BEGIN
/* Abone el documento referenciado en EGRESOS_DETALLE */
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM
    from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
        EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono+NEW.egde_dtof-NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_rcree + new.egde_dtof - NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_rcree + NEW.egde_dtof - NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        if (exists (select sdcp_idref from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC)) then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                    SDCP_ABRCREE = SDCP_ABRCREE + NEW.egde_rcree,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_IDDOC AND SDCP_FECHA = :FEC;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof-NEW.egde_difcambio), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, NEW.egde_rcree, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :NITDOC;
    if (EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC)) then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_RCREE = MVPR_RCREE + NEW.egde_rcree,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NITDOC, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof-NEW.egde_difcambio), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, NEW.egde_rcree, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

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

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

/* Trigger: EMPLEADOS_AD */
CREATE TRIGGER EMPLEADOS_AD FOR EMPLEADOS
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 95, 1, 'D', OLD.terc_nit);
end
^

/* Trigger: EMPLEADOS_AI */
CREATE 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_salario <> 0) and (new.empl_salario is not null)) then
    begin
    INSERT INTO MOVIMIENTO_SALARIO_EMPLEADO (MVSE_ID, TERC_NIT, MVSE_FECHA, MVSE_SALARIO, MVSE_NOVEDAD)
        VALUES (1, new.terc_nit, new.empl_fecing, new.empl_salario, 'N');
    end
if ((new.empl_cargo <> '') and (new.empl_cargo is not null)) then
    begin
    INSERT INTO MOVIMIENTO_CARGO_EMPLEADO (MVCE_ID, TERC_NIT, MVCE_FECHA, MVCE_CARGO)
        VALUES (1, new.terc_nit, new.empl_fecing, new.empl_cargo);
    end
if ((new.empl_tipovinc <> 0) and (new.empl_tipovinc is not null)) then
    begin
    INSERT INTO movimiento_vincul_empleado (MVVE_ID, TERC_NIT, MVVE_FECHA, TIVU_COD)
        VALUES (1, new.terc_nit, new.empl_fecing, new.empl_tipovinc);
    end
if (NEW.empl_fecing IS NOT NULL) then
    INSERT INTO ingresos_empleado (TERC_NIT, INEM_FECHA, INEM_INGRESO)
        VALUES(NEW.terc_nit, NEW.empl_fecing, 'S');
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 95, 1, 'I', NEW.terc_nit);
END
^

/* Trigger: EMPLEADOS_AU */
CREATE TRIGGER EMPLEADOS_AU FOR EMPLEADOS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable datos varchar(4096);
begin
if ((NEW.empl_perfil <> OLD.empl_perfil) or ((OLD.empl_perfil IS NULL) AND (NEW.empl_perfil IS NOT NULL))) THEN
    BEGIN
    DELETE FROM empleado_conceptos WHERE TERC_NIT = NEW.terc_nit;
    INSERT INTO EMPLEADO_CONCEPTOS (TERC_NIT, CONC_COD, EMCO_FECINI, EMCO_FECFIN, EMCO_MONTO, EMCO_PORC, EMPL_ENTIDAD,
        EMCO_PPAGO, EMCO_PERPROM, EMCO_APLICPROM, EMCO_LUQUIDAPER, EMCO_MENSUAL, EMCO_TOMSAL)
        SELECT NEW.terc_nit, CN.CONC_COD, CN.conc_fecini, CN.conc_fecfin, CN.conc_monto, CN.conc_porc, CN.conc_entidad,
        CN.conc_ppago, CN.conc_perpromedio, CN.conc_promedio, CN.conc_ppago, 'N', 0
            FROM conceptos_nomina CN, perfil_empleado_detalle P WHERE P.peem_id = NEW.empl_perfil AND P.conc_cod = CN.conc_cod;
    END
DATOS = 'TERC_NIT=' || OLD.terc_nit || '|TCOT_COD=' || OLD.TCOT_COD || '|STCO_COD=' || OLD.STCO_COD || '|EMPL_FECING=' || OLD.EMPL_FECING || '|EMPL_FECNAC=' || OLD.EMPL_FECNAC || 
'|EMPL_FECRET=' || OLD.EMPL_FECRET || '|EMPL_SALARIO=' || OLD.EMPL_SALARIO || '|EMPL_SALINTEG=' || OLD.EMPL_SALINTEG || '|EMPL_SALVAR=' || OLD.EMPL_SALVAR || 
'|EMPL_SEXO=' || OLD.EMPL_SEXO || '|EMPL_ESTCIVIL=' || OLD.EMPL_ESTCIVIL || '|EMPL_CARGO=' || OLD.EMPL_CARGO || '|EMPL_PPAGO=' || OLD.EMPL_PPAGO || '|EMPL_SUCUR=' || OLD.EMPL_SUCUR || 
'|EMPL_DPTO=' || OLD.EMPL_DPTO || '|EMPL_SECC=' || OLD.EMPL_SECC || '|EMPL_AREA=' || OLD.EMPL_AREA || '|EMPL_EPS=' || OLD.EMPL_EPS || '|EMPL_UPCADIC=' || OLD.EMPL_UPCADIC || 
'|EMPL_ARP=' || OLD.EMPL_ARP || '|EMPL_AFP=' || OLD.EMPL_AFP || '|EMPL_EXTRANJ=' || OLD.EMPL_EXTRANJ || '|EMPL_AFPESP=' || OLD.EMPL_AFPESP || '|EMPL_AFPVOLTR=' || OLD.EMPL_AFPVOLTR || 
'|EMPL_AFPVOLTRAPOR=' || OLD.EMPL_AFPVOLTRAPOR || '|EMPL_AFPVOLNORET=' || OLD.EMPL_AFPVOLNORET || '|EMPL_AFPVOLEM=' || OLD.EMPL_AFPVOLEM || '|EMPL_AFPVOLEMAPOR=' || OLD.EMPL_AFPVOLEMAPOR || 
'|EMPL_AFC=' || OLD.EMPL_AFC || '|EMPL_AUXTR=' || OLD.EMPL_AUXTR || '|EMPL_BANCO=' || OLD.EMPL_BANCO || '|EMPL_CUENTA=' || OLD.EMPL_CUENTA || '|EMPL_TIPOCTA=' || OLD.EMPL_TIPOCTA || 
'|EMPL_FORMPAGO=' || OLD.EMPL_FORMPAGO || '|EMPL_CCF=' || OLD.EMPL_CCF || '|EMPL_TIPOCOMI=' || OLD.EMPL_TIPOCOMI || '|EMPL_CONTRANOS=' || OLD.EMPL_CONTRANOS || 
'|EMPL_TIPOCONT=' || OLD.EMPL_TIPOCONT || '|PROY_COD=' || OLD.PROY_COD || '|CENT_COD=' || OLD.CENT_COD || '|EMPL_DEDDEP=' || OLD.EMPL_DEDDEP || '|EMPL_DEDINTV=' || OLD.EMPL_DEDINTV || 
'|EMPL_DEDAFC=' || OLD.EMPL_DEDAFC || '|EMPL_DEDMEDP=' || OLD.EMPL_DEDMEDP || '|EMPL_PERFIL=' || OLD.EMPL_PERFIL || '|EMPL_DEDSALUD=' || OLD.EMPL_DEDSALUD || 
'|EMPL_FACSAL=' || OLD.EMPL_FACSAL || '|EMPL_HORAS=' || OLD.EMPL_HORAS || '|EMPL_ALTORIESGO=' || OLD.EMPL_ALTORIESGO || '|EMPL_IDPILA=' || OLD.EMPL_IDPILA || 
'|EMPL_TIPOIDPILA=' || OLD.EMPL_TIPOIDPILA || '|EMPL_TIPOVINC=' || OLD.EMPL_TIPOVINC;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_DATOS)
    VALUES (USER, 95, 1, 'U', NEW.terc_nit, :DATOS);
end
^

/* Trigger: EMPLEADOS_BD0 */
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
^

/* Trigger: EMPLEADOS_BI */
CREATE TRIGGER EMPLEADOS_BI FOR EMPLEADOS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PROY VARCHAR(4);
declare variable CENT VARCHAR(4);
begin
if (NEW.tcot_cod IS NULL) then
    NEW.tcot_cod = 1;
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_horas is null) then
    new.empl_horas = 240;
if (new.empl_tipoidpila is null) then
    select terc_tipoid from terceros where terc_nit = new.terc_nit into new.empl_tipoidpila;
if (new.empl_idpila is null) then
    new.empl_idpila = new.terc_nit;
if (new.empl_tipovinc is null) then
    new.empl_tipovinc = 1;
if (new.empl_altoriesgo is null) then
    new.empl_altoriesgo = 'N';
if (new.empl_salinteg is null) then
    new.empl_salinteg = 'N';
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
^

/* Trigger: EMPLEADOS_BU */
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_horas is null) then
    new.empl_horas = 240;
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
^

/* Trigger: EMPLEADO_CONCEPTOS_AD */
CREATE TRIGGER EMPLEADO_CONCEPTOS_AD FOR EMPLEADO_CONCEPTOS
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 97, OLD.conc_cod, 'I', OLD.terc_nit);
end
^

/* Trigger: EMPLEADO_CONCEPTOS_AI */
CREATE TRIGGER EMPLEADO_CONCEPTOS_AI FOR EMPLEADO_CONCEPTOS
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 97, NEW.conc_cod, 'I', NEW.terc_nit);
end
^

/* Trigger: EMPLEADO_CONCEPTOS_AU */
CREATE TRIGGER EMPLEADO_CONCEPTOS_AU FOR EMPLEADO_CONCEPTOS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable DATOS VARCHAR(4096);
begin
DATOS = 'TERC_NIT=' || OLD.TERC_NIT || '|CONC_COD=' || OLD.CONC_COD || '|EMCO_FECINI=' || OLD.EMCO_FECINI || '|EMCO_FECFIN=' || OLD.EMCO_FECFIN || '|EMCO_MONTO=' || OLD.EMCO_MONTO || 
'|EMCO_PORC=' || OLD.EMCO_PORC || '|EMPL_ENTIDAD=' || OLD.EMPL_ENTIDAD || '|EMCO_PPAGO=' || OLD.EMCO_PPAGO || '|EMCO_PERPROM=' || OLD.EMCO_PERPROM || '|EMCO_APLICPROM=' || OLD.EMCO_APLICPROM || 
'|EMCO_LUQUIDAPER=' || OLD.EMCO_LUQUIDAPER || '|EMCO_MENSUAL=' || OLD.EMCO_MENSUAL || '|EMCO_TOMSAL=' || OLD.EMCO_TOMSAL || '|EMCO_ACTIVO=' || OLD.EMCO_ACTIVO || 
'|EMCO_CTAGASTO=' || OLD.EMCO_CTAGASTO || '|EMCO_CTAPAGAR=' || OLD.EMCO_CTAPAGAR;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_DATOS)
    VALUES (USER, 97, NEW.conc_cod, 'U', NEW.terc_nit, :DATOS);
end
^

/* Trigger: EMPLEADO_CONCEPTOS_BI */
CREATE TRIGGER EMPLEADO_CONCEPTOS_BI FOR EMPLEADO_CONCEPTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.emco_activo is null) then
    new.emco_activo = 'S';
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
^

/* 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;
if (it is null) then
it = 0;
new.emll_item = IT+1;
end
^

/* Trigger: ENSAMBLES_AD */
CREATE 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_detalle_niif where enco_consec = :consec;
  end
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
^

/* Trigger: ENSAMBLES_AI */
CREATE TRIGGER ENSAMBLES_AI FOR ENSAMBLES
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable ARTPRIN VARCHAR(2);
declare variable COSTSOBR 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
      begin
      execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'COSTEAR MATERIAL SOBRANTE AL COSTO DEL PRODUCTO TERMINADO') returning_values (:COSTSOBR);
      if (COSTSOBR = 'NO') then
        COSTO = 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)
        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
    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
^

/* Trigger: ENSAMBLES_AU */
CREATE 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_detalle_niif where enco_consec = :consec;
      end
    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
^

/* Trigger: ENSAMBLES_BI */
CREATE 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
^

/* Trigger: ENSAMBLES_DETALLE_AD */
CREATE TRIGGER ENSAMBLES_DETALLE_AD FOR ENSAMBLES_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
/* Anule el anterior */
if ((old.ensa_id <> 0) and (old.esde_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 15) and (mvar_idref = old.enSA_id) and (mvar_item = old.esde_item);
END
^

/* Trigger: ENSAMBLES_DETALLE_AI */
CREATE 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(8);
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
^

/* Trigger: ENSAMBLES_DETALLE_AU */
CREATE 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(8);
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
^

/* Trigger: ENTRADAS_AD */
CREATE TRIGGER ENTRADAS_AD FOR ENTRADAS
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
if ((old.entr_ordenid <> 0) and (old.entr_ordenid is not null)) then
    update ordenes_inventario set ORIN_ANULADO = 'N' where ORIN_ID = old.entr_ordenid;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 11, OLD.entr_id, 'D', OLD.pref_pre || OLD.entr_numero);
select enco_consec from comprobante_encabezado where enco_tiporef = 11 and enco_idref = old.entr_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 11 and enco_idref = old.entr_id;
end
^

/* Trigger: ENTRADAS_AI */
CREATE TRIGGER ENTRADAS_AI FOR ENTRADAS
ACTIVE AFTER INSERT POSITION 0
as
begin
IF ((NEW.ENTR_ID <> 0) AND (NEW.entr_anulado = 'N')) THEN
  BEGIN
  /* ANULE LA ORDEN SI LA HAY*/
  if ((new.entr_ordenid <> 0) and (new.entr_ordenid is not null)) then
     update ordenes_inventario set ORIN_ANULADO = 'S' where ORIN_ID = new.entr_ordenid;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 11, NEW.entr_id, 'I', NEW.pref_pre || NEW.entr_numero);
  END
end
^

/* Trigger: ENTRADAS_AU */
CREATE TRIGGER ENTRADAS_AU FOR ENTRADAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.entr_anulado = 'S') then
    BEGIN
    if ((old.entr_ordenid <> 0) and (old.entr_ordenid is not null)) then
        update ordenes_inventario set ORIN_ANULADO = 'N' where ORIN_ID = old.entr_ordenid;
    select enco_consec from comprobante_encabezado where enco_tiporef = 11 and enco_idref = old.entr_id into :consec;
    if (NOT consec is null) then
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    delete from comprobante_encabezado where enco_tiporef = 11 and enco_idref = old.entr_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 11, NEW.entr_id, 'A', NEW.pref_pre || NEW.entr_numero);
    END
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 11, NEW.entr_id, 'U', NEW.pref_pre || NEW.entr_numero);

if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.entr_numero <> NEW.entr_numero) or
    (OLD.entr_fecha <> NEW.entr_fecha)) then
    UPDATE ENTRADAS_DETALLE SET ENDE_TRANSMIT = 'N' WHERE ENTR_ID = NEW.ENTR_ID;
if (OLD.entr_anulado <> NEW.entr_anulado) then
    UPDATE ENTRADAS_DETALLE SET ENDE_ANULADO = NEW.entr_anulado WHERE ENTR_ID = NEW.ENTR_ID;
if (OLD.entr_transmit <> NEW.entr_transmit) then
    UPDATE ENTRADAS_DETALLE SET ENDE_TRANSMIT = NEW.entr_transmit WHERE ENTR_ID = NEW.ENTR_ID;
END
^

/* Trigger: ENTRADAS_BI */
CREATE TRIGGER ENTRADAS_BI FOR ENTRADAS
ACTIVE BEFORE INSERT POSITION 1
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;
  /* 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
^

/* Trigger: ENTRADAS_DETALLE_AD */
CREATE TRIGGER ENTRADAS_DETALLE_AD FOR ENTRADAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 11) and (mvar_idref = old.entr_id) and (mvar_item = old.ende_item);
END
^

/* Trigger: ENTRADAS_DETALLE_AI */
CREATE 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(8);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable COSTON 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);
    COSTON = (new.ende_coston * ((100 - NEW.ende_dtoporc)/100) / :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
            BEGIN
            COSTO = COSTO - NEW.ende_consumo;
            COSTON = COSTON - NEW.ende_consumo;
            END
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        COSTON = COSTON / (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_COSTONIIF, 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, :coston, '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
^

/* Trigger: ENTRADAS_DETALLE_AU */
CREATE 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(8);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable COSTON 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) or (old.ende_coston <> new.ende_coston))) 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);
    if (old.ende_costo <> new.ende_costo) then
        begin
        COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            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.ende_coston <> new.ende_coston) then
        BEGIN
        COSTO = ((new.ende_coston * ((100 - NEW.ende_dtoporc)/100)) / :factor);
        if (IVAINC = 'S') then
            BEGIN
            if (icoinc = 'SI') then
                COSTO = COSTO - NEW.ende_consumo;
            COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
            END
        UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo WHERE MVAR_CONS = :IDMOV;
        EXECUTE PROCEDURE actualice_costo_niif(old.arti_cod, :fec, :costo, old.ende_cant*:factor, 'S', 'S', :IDMOV, 11);
        EXECUTE PROCEDURE actualice_costo_niif(new.arti_cod, :fec, :costo, new.ende_cant*:factor, 'S', 'N', :IDMOV, 11);
        if (exists (SELECT cost_fecha from costos_niif WHERE (arti_cod = new.arti_cod) AND (cost_fecha > :fec))) then
            EXECUTE PROCEDURE chequeo_costos_niif(NEW.arti_cod, :fec + 1);
        END
    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);
    COSTON = (new.ende_coston * ((100 - NEW.ende_dtoporc)/100) / :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
            begin
            COSTO = COSTO - NEW.ende_consumo;
            COSTON = COSTON - NEW.ende_consumo;
            end
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        COSTON = COSTON / (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_COSTONIIF, 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, :COSTON, '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
^

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

/* Trigger: ENTREGA_DOCUMENTOS_AD */
CREATE TRIGGER ENTREGA_DOCUMENTOS_AD FOR ENTREGA_DOCUMENTOS
ACTIVE AFTER DELETE POSITION 0
as
declare variable intcont CHAR(2);
declare variable IDC INTEGER;
begin
if (OLD.tido_cod = 31) then
    BEGIN
    if (OLD.endo_fechae IS NOT NULL) then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'REGISTRAR COMPROBANTE CONTABLE POR LA ENTREGA DE MERCANCIA') returning_values (:INTCONT);
        if (INTCONT = 'SI') then
            BEGIN
            select enco_consec from comprobante_encabezado where enco_tiporef = 30 and enco_idref = old.endo_iddoc into :IDC;
            if (NOT IDC is null) then
              begin
              delete from comprobante_detalle where enco_consec = :IDC;
              delete from comprobante_detalle_niif where enco_consec = :IDC;
              end
            delete from comprobante_encabezado where enco_tiporef = 30 and enco_idref = old.endo_iddoc;
            END
        END
    END
end
^

/* Trigger: ENTREGA_DOCUMENTOS_AI */
CREATE TRIGGER ENTREGA_DOCUMENTOS_AI FOR ENTREGA_DOCUMENTOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable intcont CHAR(2);
declare variable EXISTE CHAR(1);
declare variable IDC INTEGER;
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable cent char(1);
declare variable VER CHAR(1);
declare variable DESC_RTES CHAR(2);
declare variable TOTAL NUMERIC(18,2);
declare variable NETO NUMERIC(18,2);
declare variable cuenta varchar(20);
declare variable tipocuen char(1);
declare variable ERRORC INTEGER;
declare variable NIT VARCHAR(20);
begin
if ((NEW.tido_cod = 31) AND (NEW.endo_fechae IS NOT NULL)) then
    BEGIN
    UPDATE FACTURAS SET FACT_ENTREGA = NEW.endo_fechal WHERE FACT_ID = NEW.endo_iddoc;
    EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'REGISTRAR COMPROBANTE CONTABLE POR LA ENTREGA DE MERCANCIA') returning_values (:INTCONT);
    if (INTCONT = 'SI') then
        BEGIN
        /* CONTABILIZACION */
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
        EXISTE = 'N';
        SELECT FIRST 1 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_CARTERA, INVE_CTAVENTAS, INVE_CTACARTERA, INVE_CONFIRMAR, INVE_CENTRO
            FROM INTERFAZ_VENTAS
            WHERE TIDO_COD = 30
            INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :CARTERA, :CTAVENTAS, :CTACARTERA, :VER, :CENT;
        if (EXISTE = 'S') then
            BEGIN
            /* BORRE CUALQUIER CONTABILIZACION PREVIA */
            DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 30 AND CNTB_IDREF = NEW.endo_iddoc;
            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 = NEW.endo_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 = NEW.endo_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 = NEW.endo_iddoc AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;

            SELECT PREF_PRE, FACT_NUMERO, TERC_NIT, FACT_TOTAL, FACT_TOTAL-FACT_RTFTEMONTO-FACT_RTIVAMONTO-FACT_RTICAMONTO
                FROM FACTURAS WHERE FACT_ID = NEW.endo_iddoc INTO :PREF, :NUM, :NIT, :TOTAL, :NETO;
            NUMERO = PREF || NUM;

            EXECUTE PROCEDURE FECHA_A_CONTA(NEW.endo_fechae) returning_values (:FECHA);
            /* ENCABEZADO CONTABLE */
            IDC = GEN_ID(ID_CONTABILIZA, 1);
            CONC = 'RADICACION FV No.' || NUMERO;
            INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, 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, '', 30, NEW.endo_iddoc, :PREF, :NUM, 'N');
            if (desc_rtes = 'SI') then
                TOTAL = NETO;
            IF (VENTAS = 'K') THEN
                BEGIN
                if (TOTAL <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(30, NEW.endo_iddoc, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        exception cuenta_no_existe 'La cuenta ' || :CUENTA || ' no existe o no es afectable.';
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, 1, :CUENTA, :CONC, '', 0, :TOTAL, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    END /* MONTO <> 0 */
                END
            IF (cartera = 'K') THEN
                BEGIN
                if (TOTAL <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(30, NEW.endo_iddoc, :ctacartera, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        exception cuenta_no_existe 'La cuenta ' || :CUENTA || ' no existe o no es afectable.';
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, 2, :CUENTA, :CONC, '', :TOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    END
                END
            END
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        END
    END
end
^

/* Trigger: ENTREGA_DOCUMENTOS_AU */
CREATE TRIGGER ENTREGA_DOCUMENTOS_AU FOR ENTREGA_DOCUMENTOS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable intcont CHAR(2);
declare variable EXISTE CHAR(1);
declare variable IDC INTEGER;
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable cent char(1);
declare variable VER CHAR(1);
declare variable DESC_RTES CHAR(2);
declare variable TOTAL NUMERIC(18,2);
declare variable NETO NUMERIC(18,2);
declare variable cuenta varchar(20);
declare variable tipocuen char(1);
declare variable ERRORC INTEGER;
declare variable NIT VARCHAR(20);
begin
  /* SI ES FACTURA ACTUALICE LA FECHA DE ENTREGA */
if (NEW.tido_cod = 31) then
    BEGIN
    if ((NEW.endo_fechae IS NOT NULL) AND (OLD.endo_fechae IS NULL)) then
        BEGIN
        UPDATE FACTURAS SET FACT_ENTREGA = NEW.endo_fechal WHERE FACT_ID = NEW.endo_iddoc;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'REGISTRAR COMPROBANTE CONTABLE POR LA ENTREGA DE MERCANCIA') returning_values (:INTCONT);
        if (INTCONT = 'SI') then
            BEGIN
            /* CONTABILIZACION */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
            EXISTE = 'N';
            SELECT FIRST 1 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_CARTERA, INVE_CTAVENTAS, INVE_CTACARTERA, INVE_CONFIRMAR, INVE_CENTRO
                FROM INTERFAZ_VENTAS
                WHERE TIDO_COD = 30
                INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :CARTERA, :CTAVENTAS, :CTACARTERA, :VER, :CENT;
            if (EXISTE = 'S') then
                BEGIN
                /* BORRE CUALQUIER CONTABILIZACION PREVIA */
                DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 30 AND CNTB_IDREF = NEW.endo_iddoc;
                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 = NEW.endo_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 = NEW.endo_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 = NEW.endo_iddoc AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    
                SELECT PREF_PRE, FACT_NUMERO, TERC_NIT, FACT_TOTAL, FACT_TOTAL-FACT_RTFTEMONTO-FACT_RTIVAMONTO-FACT_RTICAMONTO
                    FROM FACTURAS WHERE FACT_ID = NEW.endo_iddoc INTO :PREF, :NUM, :NIT, :TOTAL, :NETO;
                NUMERO = PREF || NUM;
    
                EXECUTE PROCEDURE FECHA_A_CONTA(NEW.endo_fechae) returning_values (:FECHA);
                /* ENCABEZADO CONTABLE */
                IDC = GEN_ID(ID_CONTABILIZA, 1);
                CONC = 'RADICACION FV No.' || NUMERO;
                INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, 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, '', 30, NEW.endo_iddoc, :PREF, :NUM, 'N');
                if (desc_rtes = 'SI') then
                    TOTAL = NETO;
                IF (VENTAS = 'K') THEN
                    BEGIN
                    if (TOTAL <> 0) then
                        BEGIN
                        EXECUTE PROCEDURE CUENTA_INTERFAZ(30, NEW.endo_iddoc, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                        if (ERRORC <> 0) then
                            exception cuenta_no_existe 'La cuenta ' || :CUENTA || ' no existe o no es afectable.';
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, 1, :CUENTA, :CONC, '', 0, :TOTAL, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END /* MONTO <> 0 */
                    END
                IF (cartera = 'K') THEN
                    BEGIN
                    if (TOTAL <> 0) then
                        BEGIN
                        EXECUTE PROCEDURE CUENTA_INTERFAZ(30, NEW.endo_iddoc, :ctacartera, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                        if (ERRORC <> 0) then
                            exception cuenta_no_existe 'La cuenta ' || :CUENTA || ' no existe o no es afectable.';
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, 2, :CUENTA, :CONC, '', :TOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
            END
        END
    if ((NEW.endo_fechae IS NULL) AND (OLD.endo_fechae IS NOT NULL)) then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'REGISTRAR COMPROBANTE CONTABLE POR LA ENTREGA DE MERCANCIA') returning_values (:INTCONT);
        if (INTCONT = 'SI') then
            BEGIN
            select enco_consec from comprobante_encabezado where enco_tiporef = 30 and enco_idref = old.endo_iddoc into :IDC;
            if (NOT IDC is null) then
              begin
              delete from comprobante_detalle where enco_consec = :IDC;
              delete from comprobante_detalle_niif where enco_consec = :IDC;
              end
            delete from comprobante_encabezado where enco_tiporef = 30 and enco_idref = old.endo_iddoc;
            END
        END
    END
end
^

/* Trigger: ENVIO_ERRORES_BI */
CREATE TRIGGER ENVIO_ERRORES_BI FOR ENVIO_ERRORES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable numrows integer;
begin
select max(ener_item) from envio_errores where ener_id = new.ener_id into :numrows;
if (numrows is null) then
    new.ener_item = 1;
else
    new.ener_item = :numrows + 1;
end
^

/* Trigger: ERRORES_LOTES_BI */
CREATE TRIGGER ERRORES_LOTES_BI FOR ERRORES_LOTES
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.id = GEN_ID(id_errores, 1);
end
^

/* Trigger: EVENTOS_VENTAS_BI */
CREATE TRIGGER EVENTOS_VENTAS_BI FOR EVENTOS_VENTAS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.evve_exis IS NULL) then
    NEW.evve_exis = 'S';
if (NEW.evve_cupo IS NULL) then
    NEW.evve_cupo = 'S';
end
^

/* Trigger: EXISTENCIA_BI */
CREATE 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 || ' en la bodega ' || new.bode_cod || ' quedara negativa en ' || (NEW.EXIS_SALDO + NEW.EXIS_ENTR - NEW.EXIS_SAL) || ' en ' || new.exis_fecha;
    END
END
^

/* Trigger: EXISTENCIA_BU */
CREATE 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 || ' quedara negativa en ' || (NEW.EXIS_SALDO + NEW.EXIS_ENTR - NEW.EXIS_SAL) || ' en ' || new.exis_fecha;
    END
END
^

/* Trigger: EXISTENCIA_TERCERO_AD */
CREATE TRIGGER EXISTENCIA_TERCERO_AD FOR EXISTENCIA_TERCERO
ACTIVE AFTER DELETE POSITION 0
as
begin
/*  Recorra los registros de fechas posteriores actualizando el saldo anterior */
UPDATE existencia_tercero
    SET exte_saldo = exte_saldo - (old.exte_entr - old.exte_sal)
    WHERE arti_cod = old.arti_cod and terc_nit = old.terc_nit and clsu_cod = old.clsu_cod and exte_fecha > old.exte_fecha;
end
^

/* Trigger: EXISTENCIA_TERCERO_AU */
CREATE TRIGGER EXISTENCIA_TERCERO_AU FOR EXISTENCIA_TERCERO
ACTIVE AFTER UPDATE POSITION 0
as
begin
/*  Recorra los registros de fechas posteriores actualizando el saldo anterior */
UPDATE existencia_tercero
    SET exte_saldo = exte_saldo - (old.exte_entr - old.exte_sal)
    WHERE arti_cod = old.arti_cod and terc_nit = old.terc_nit and clsu_cod = old.clsu_cod and exte_fecha > old.exte_fecha;
UPDATE existencia_tercero
    SET exte_saldo = exte_saldo + (new.exte_entr - new.exte_sal)
    WHERE arti_cod = new.arti_cod and terc_nit = new.terc_nit and clsu_cod = new.clsu_cod and exte_fecha > new.exte_fecha;
if ((new.exte_entr = 0) and (new.exte_sal = 0)) then
    delete from existencia_tercero where arti_cod = new.arti_cod and terc_nit = new.terc_nit and clsu_cod = new.clsu_cod and exte_fecha = new.exte_fecha;
end
^

/* Trigger: EXISTENCIA_TERCERO_BI */
CREATE TRIGGER EXISTENCIA_TERCERO_BI FOR EXISTENCIA_TERCERO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable fec date;
begin
if (new.exte_sal is null) then
    new.exte_sal = 0;
if (new.exte_entr is null) then
    new.exte_entr = 0;
select max(exte_fecha) from existencia_tercero where arti_cod = new.arti_cod and clsu_cod = new.clsu_cod and terc_nit = new.terc_nit
    into :fec;
if (fec is null) then
    new.exte_saldo = 0;
else
    begin
    select exte_saldo+exte_entr-exte_sal from existencia_tercero
        where arti_cod = new.arti_cod and clsu_cod = new.clsu_cod and terc_nit = new.terc_nit and exte_fecha = :fec into new.exte_saldo;
    end
/*  Recorra los registros de fechas posteriores actualizando el saldo anterior */
UPDATE existencia_tercero
    SET exte_saldo = exte_saldo + (new.exte_entr - new.exte_sal)
    WHERE arti_cod = new.arti_cod and terc_nit = new.terc_nit and clsu_cod = new.clsu_cod and exte_fecha > new.exte_fecha;
end
^

/* Trigger: FACTCOMP_DETALLE_AD */
CREATE TRIGGER FACTCOMP_DETALLE_AD FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable fec date;
declare variable CONSOLIDA INTEGER;
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
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);
    DELETE FROM SALIDAS WHERE SALI_TIPOREF = 21 AND SALI_IDREF = OLD.faco_id;
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
    /* LOS PENDIENTES */
    if (CONSOLIDA <> 0) then
        BEGIN
        CANTAUX = old.fcde_cant * old.fcde_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    enD
END
^

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

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

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

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

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

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

/* Trigger: FACTCOMP_DETALLE_BI */
CREATE TRIGGER FACTCOMP_DETALLE_BI FOR FACTURAS_COMPRAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable trm numeric(18,2);
declare variable DEC1818 CHAR(1);
BEGIN
  /* CALCULE EL MONTO DEL DESCUENTO */
  if (new.fcde_cant is null) then
    new.fcde_cant = 0;
  if (new.fcde_prunit is null) then
    new.fcde_prunit = 0;
  if (new.fcde_dtoporc is null) then
    new.fcde_dtoporc = 0;
  if (new.fcde_ivaporc is null) then
    new.fcde_ivaporc = 0;
  if (new.fcde_ivamonto is null) then
    new.fcde_ivamonto = 0;
  if (new.fcde_consumo is null) then
    new.fcde_consumo = 0;
  NEW.FCDE_DTOMONTO = NEW.fcde_prunit * NEW.fcde_dtoporc / 100;
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.fcde_unidad) returning_values (new.fcde_factor);
select faco_trm, faco_dec1818 from facturas_compra where faco_id = new.faco_id into :trm, :dec1818;
if (DEC1818 = 'S') then
    BEGIN
    select grup_dec1818 from grupo g, articulo a where a.arti_cod = new.arti_cod and a.grup_cod = g.grup_cod into :DEC1818;
    if (DEC1818 = 'S') then
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'TARIFA DE IVA PARA PRODUCTOS EXENTOS DECRETO 1818 DE 2015') returning_values NEW.fcde_tiva;
    ELSE
        select taiv_cod from articulo where arti_cod = new.arti_cod into new.fcde_tiva;
    END
ELSE
    select taiv_cod from articulo where arti_cod = new.arti_cod into new.fcde_tiva;

/* si estaba en otra moneda convierta a pesos */
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
^

/* Trigger: FACTPRO_DETALLE_AD */
CREATE TRIGGER FACTPRO_DETALLE_AD FOR FACTURA_PROFORMA_DET
ACTIVE AFTER DELETE POSITION 0
AS
declare variable fec date;
declare variable CONSOLIDA INTEGER;
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
BEGIN
if ((old.fpde_anulado = 'N') and (OLD.fapo_id <> 0)) then
    begin
    select fapo_fecha, fapo_consolidado from factura_proforma where fapo_id = old.fapo_id into :fec, :consolida;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 137) and (mvar_idref = old.fapo_id) and (mvar_item = old.fpde_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
        CANTAUX = old.fpde_cant * old.fpde_factor;
        for select COFA_ITEM, (COFA_CANT*COFA_FACTOR) from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    enD
END
^

/* Trigger: FACTPRO_DETALLE_AI */
CREATE TRIGGER FACTPRO_DETALLE_AI FOR FACTURA_PROFORMA_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable fecaux date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,6);
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 COSTO NUMERIC(18,2);
declare variable NUMPED VARCHAR(30);
declare variable CONSO VARCHAR(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 CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
declare variable ESTADO CHAR(1);
declare variable TRM numeric(18,4);
declare variable FECCIE date;
declare variable AFECEXIS varchar(8);
BEGIN
if ((NEW.fapo_id <> 0) and (new.fpde_anulado = 'N')) then
    BEGIN
    select fapo_fecha, pref_pre, fapo_numero, terc_nit, fapo_solimp, fapo_CONSOLIDADO, fapo_feccie,
        fapo_TOTAL, fapo_EXTRA, fapo_IVAMONTO, fapo_ADICIONAL, fapo_DTOMONTO, fapo_estado, taca_monto
        from factura_proforma FP where fapo_id = new.fapo_id
        into :fec, :Pref, :Num, :Nit, :numped, :CONSOLIDA, :FECCIE,
        :total, :extra, :ivamonto, :adicional, :dtopie, :estado, :TRM;
    conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || numped;
    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 lee_configuracion('IMPORTACION', 'FACTURA PRO', 'AFECTAR INVENTARIO CON CIERRE O REGISTRO') returning_values (:AFECEXIS);
    execute procedure factor_unidad_cant(new.arti_cod, new.fpde_unidad) returning_values(factor);
    CANTAUX = NEW.fpde_cant * :factor;
    if (cantaux <> 0) then
        COSTO = (new.fpde_total - NEW.fpde_ivamonto) / :CANTAUX;
    else
        COSTO = 0;
    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 ((INVFAC = 'SI') and ((ESTADO = 'C') or (:afecexis = 'REGISTRO'))) then
        begin
        if (:afecexis = 'REGISTRO') then
            feccie = fec;
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_LOTE, MVAR_COSTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, GEN_ID(ID_MOVARTI,1), NEW.BODE_COD, :feccie, 137, NEW.fapo_id,
          :CONC, :factor * new.fpde_cant, NEW.fpde_lote, :COSTO, 'S', :Pref, :Num, NEW.fpde_item, :Nit);

        if (COSTO > 0 ) then
          BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          COSTO = ((new.fpde_prunit - NEW.fpde_dtomonto) / :factor);
          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, pvar_trm, PVAR_UNIDAD, PVAR_FACTOR)
                VALUES (:Nit, NEW.ARTI_COD, NEW.fpde_prunit * (1 - (NEW.fpde_dtoporc/100)), :feccie, NEW.fpde_codprov,NEW.fpde_desc, :trm, NEW.fpde_unidad, NEW.fpde_factor);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :feccie, PVAR_COD = NEW.fpde_codprov, PVAR_TRM = :TRM, PVAR_COSTO = NEW.fpde_prunit * (1 - (NEW.fpde_dtoporc/100)), PVAR_UNIDAD = NEW.fpde_unidad, PVAR_FACTOR = NEW.fpde_factor
                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 */
    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.fapo_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.fpde_cant * new.fpde_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.fapo_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.fapo_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            end
        END
    END
END
^

/* Trigger: FACTPRO_DETALLE_AU */
CREATE TRIGGER FACTPRO_DETALLE_AU FOR FACTURA_PROFORMA_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux 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,6);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable NUMPED VARCHAR(30);
declare variable CONSO VARCHAR(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 CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
declare variable ESTADO CHAR(1);
declare variable TRM numeric(18,2);
declare variable FECCIE DATE;
declare variable IDMOV INTEGER;
declare variable AFECEXIS varchar(8);
BEGIN
/* deshaga lo viejo */
execute procedure lee_configuracion('IMPORTACION', 'FACTURA PRO', 'AFECTAR INVENTARIO CON CIERRE O REGISTRO') returning_values (:AFECEXIS);
IDMOV = NULL;
/* deshaga lo viejo */
if ((old.fpde_anulado = 'N') and (OLD.fapo_id <> 0)) then
    begin
    select fapo_fecha, fapo_consolidado, FAPO_ESTADO, TACA_MONTO, FAPO_FECCIE
        from factura_proforma where fapo_id = old.fapo_id
        into :fec, :consolida, :estado, :TRM, :FECCIE;
    if (EXISTS (SELECT MVAR_CONS FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 137) and (mvar_idref = old.fapo_id) and (mvar_item = old.fpde_item))) then
        BEGIN
        SELECT MVAR_CONS FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 137) and (mvar_idref = old.fapo_id) and (mvar_item = old.fpde_item) INTO :IDMOV;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 137) and (mvar_idref = old.fapo_id) and (mvar_item = old.fpde_item);
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        END
    /* LOS PENDIENTES */
    if (CONSOLIDA <> 0) then
        BEGIN
        CANTAUX = old.fpde_cant * old.fpde_factor;
        for select COFA_ITEM, (COFA_CANT*COFA_FACTOR) from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    end
/* Registre el nuevo */
if ((new.fpde_anulado = 'N') and (new.fapo_id <> 0)) then
    BEGIN
    select fapo_fecha, pref_pre, fapo_numero, terc_nit, fapo_solimp, fapo_consolidado, fapo_dtomonto, fapo_adicional,
        fapo_total, fapo_ivamonto, fapo_extra, fapo_estado
        from factura_proforma where fapo_id = new.fapo_id
        into :fec, :Pref, :Num, :Nit, :numped, :consolida, :dtopie, :adicional, :total, :ivamonto, :extra, :estado;
    conc = 'FACTURA DE COMPRA No.' || PREF || NUM || '-' || NUMPED;
    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 ((INVFAC = 'SI') and ((ESTADO = 'C') or (:afecexis = 'REGISTRO'))) then
        begin
        if (idmov is null) then
            idmov = GEN_ID(ID_MOVARTI,1);
        execute procedure factor_unidad_cant(new.arti_cod, new.fpde_unidad) returning_values(factor);
        CANTAUX = NEW.fpde_cant * :factor;
        if (cantaux <> 0) then
            COSTO = (new.fpde_total + NEW.fpde_flete + NEW.fpde_seguro + NEW.fpde_otrogto) / :CANTAUX;
        else
            COSTO = 0;
        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 (:afecexis = 'REGISTRO') then
            feccie = fec;
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_LOTE, MVAR_COSTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, :IDMOV, NEW.BODE_COD, :FECCIE, 137, NEW.fapo_id,
          :CONC, :factor * new.fpde_cant, NEW.fpde_lote, :COSTO, 'S', :Pref, :Num, NEW.fpde_item, :Nit);
        if (COSTO > 0 ) then
          BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          COSTO = ((new.fpde_prunit - NEW.fpde_dtomonto) / :factor);
          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, pvar_trm, PVAR_UNIDAD, PVAR_FACTOR)
                VALUES (:Nit, NEW.ARTI_COD, NEW.fpde_prunit * (1 - (NEW.fpde_dtoporc/100)), :feccie, NEW.fpde_codprov,NEW.fpde_desc, :trm, NEW.fpde_unidad, NEW.fpde_factor);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_FECHA = :feccie, PVAR_COD = NEW.fpde_codprov, PVAR_TRM = :TRM, PVAR_COSTO = NEW.fpde_prunit * (1 - (NEW.fpde_dtoporc/100)), PVAR_UNIDAD = NEW.fpde_unidad, PVAR_FACTOR = NEW.fpde_factor
                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);
        if (CONSO = 'NO') then
            update consolidado_faltantes set COFA_IDDES = new.fapo_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.fpde_cant * new.fpde_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.fapo_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.fapo_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            end
        end
    END
END
^

/* Trigger: FACTPRO_DETALLE_BI */
CREATE TRIGGER FACTPRO_DETALLE_BI FOR FACTURA_PROFORMA_DET
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  /* CALCULE EL MONTO DEL DESCUENTO */
  if (new.fpde_cant is null) then
    new.fpde_cant = 0;
  if (new.fpde_prunit is null) then
    new.fpde_prunit = 0;
  if (new.fpde_dtoporc is null) then
    new.fpde_dtoporc = 0;
  if (new.fpde_ivaporc is null) then
    new.fpde_ivaporc = 0;
  if (new.fpde_ivamonto is null) then
    new.fpde_ivamonto = 0;
  if (new.fpde_consumo is null) then
    new.fpde_consumo = 0;
  if (new.fpde_flete is null) then
    new.fpde_flete = 0;
  if (new.fpde_seguro is null) then
    new.fpde_seguro = 0;
  if (new.fpde_otrogto is null) then
    new.fpde_otrogto = 0;
  NEW.fpde_DTOMONTO = NEW.fpde_prunit * NEW.fpde_dtoporc / 100;
  new.fpde_totgtos = new.fpde_ivamonto + new.fpde_flete + new.fpde_seguro + new.fpde_otrogto;
  execute procedure factor_unidad_cant(new.arti_cod, new.fpde_unidad) returning_values (new.fpde_factor);

END
^

/* Trigger: FACTURAS_AD */
CREATE TRIGGER FACTURAS_AD FOR FACTURAS
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable consec INTEGER;
declare variable factmes char(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
/* 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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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);

        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 = RIGHT(OLD.fact_numero,6);
            END
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La factura ' || old.pref_pre || old.fact_numero || ' tiene abonos registrados.';

    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
^

/* Trigger: FACTURAS_AI */
CREATE 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(8);
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(8));
                update prefijos set pref_actual = :NUMERO WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
                END
            end
        END
    /* Registre el movimiento del cliente */
    if (STRLEN(NEW.FACT_NOMCLIENTE) > 40) then
        CONC = 'FV No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || SUBSTR(NEW.FACT_NOMCLIENTE, 1, 40);
    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_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 31, NEW.FACT_ID, NEW.FACT_FECHA, NEW.FACT_VENCE, :CONC, NEW.FACT_TOTAL, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAMONTO, NEW.fact_rtcreem, 'S', 'N', NEW.pref_pre, NEW.FACT_numero, new.fact_sucursal, NEW.cobr_cod, NEW.fact_trm);
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, NEW.FACT_ID, NEW.FACT_fecha, NEW.terc_nit, NEW.FACT_rtftemonto, NEW.FACT_rtivamonto, NEW.FACT_rticamonto, NEW.fact_rtcreem, 0, 0, 0, 0, 0, 'S', NEW.FACT_TOTAL, NEW.fact_trm);
    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, RIGHT(NEW.FACT_NUMERO,6), NEW.FACT_FECHA, :DIAS, NEW.FACT_DESPACHO, NEW.FACT_OBS, NEW.FACT_IVAINC, NEW.FACT_NOMCLIENTE, NEW.FACT_DTOPOR, NEW.FACT_DTOMONTO, NEW.FACT_ADICIONAL, NEW.FACT_IVAMONTO, NEW.FACT_EXTRA, NEW.FACT_TOTAL, 'N', 'N', NEW.PTVT_ID, NULL, NEW.FACT_RTFTEPOR, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAPOR, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAPOR, NEW.FACT_RTICAMONTO, NEW.fact_sucursal);
        END
    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
^

/* Trigger: FACTURAS_AU */
CREATE TRIGGER FACTURAS_AU FOR FACTURAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable AUX VARCHAR(100);
declare variable CONC VARCHAR(60);
declare variable PEDAUTO CHAR(2);
declare variable DIAS INTEGER;
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable NUMROWS INTEGER;
declare variable consec INTEGER;
declare variable ESPOS CHAR(1);
declare variable UNIVND CHAR(2);
declare variable fecalq date;
BEGIN
/* borre la contabilizacion */
if (NEW.fact_anulado = 'S') then
    BEGIN
    select faal_fecha from factura_alquiler where faal_cliente = old.terc_nit and faal_sucursal = old.fact_sucursal into :fecalq;
    if ((fecalq is not null) and (fecalq = old.fact_fecha)) then
        begin
        select first 1 fact_fecha from facturas where fact_anulado = 'N' and terc_nit = old.terc_nit and fact_sucursal = old.fact_sucursal
            and fact_fecha < :fecalq order by fact_fecha desc into :fecalq;
        update factura_alquiler set faal_fecha = :fecalq where faal_cliente = old.terc_nit and faal_sucursal = old.fact_sucursal;
        end
    select enco_consec from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id into :consec;
    if (NOT consec is null) then
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    delete from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id;

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

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

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

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

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

if ((new.fact_vence - new.fact_fecha) > 999) then
    exception fecha_no_valida 'El vencimiento es mayor a 999 dias. Revise el vencimiento en el documento.';
/* verifique si es el cumpleanos del cliente */
select clie_aniv from clientes where terc_nit = new.terc_nit into :feccli;
if ((EXTRACT(MONTH FROM FECCLI) = EXTRACT(month FROM NEW.fact_fecha)) AND (EXTRACT(DAY FROM FECCLI) = EXTRACT(DAY FROM NEW.fact_fecha))) then
    BEGIN
    EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'FACTOR DE MULTIPLICACION DE PUNTOS ACUMULADOS EN FECHA DE CUMPLEAÑOS DEL CLIENTE')
        returning_values (NEW.fact_ptosclifac);
    END
if (NEW.FACT_PTOSCLIFAC IS NULL) then
    NEW.FACT_PTOSCLIFAC = 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_rtcreem = NEW.fact_rtcreem * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    NEW.fact_anticipo = NEW.fact_anticipo * 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

/* VALIDE EL ESTADO DEL CLIENTE */
SELECT C.clie_estado FROM CLIENTES C WHERE TERC_NIT = NEW.terc_nit INTO :ESTADO;
if (ESTADO <> 'A') then
    exception CLIENTE_INACTIVO 'El cliente ' || new.terc_nit || ' esta inactivo o en No vender.';

OK = 'S';
if (NEW.numok = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.FACT_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(8));
        UPDATE PREFIJOS
            SET PREF_ACTUAL = :NUMERO
            WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.FACT_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(8))
                WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS8 (NEW.FACT_numero) returning_values (NEW.FACT_numero);
    NEW.numok = 'S';
    END

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
        if (NEW.fact_autocar <> 0) then
            BEGIN
            MOTIVOAU = '';
            USUARIO = '';
            SELECT AC.auca_motivo, AC.auca_usuario FROM autorizaciones_cartera AC WHERE AC.auca_id = NEW.fact_autocar
                INTO :MOTIVOAU, :USUARIO;
            if ((MOTIVOAU = 'C') AND (USUARIO <> '')) then
                OK = 'S';
            ELSE
                OK = 'N';
            END
        ELSE
            OK = 'N';
        /* VERIFIQUE EL CUPO DE CREDITO */
        if (OK = 'N') 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
    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;

  /* 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 numero ' || 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
^

/* Trigger: FACTURAS_BU */
CREATE TRIGGER FACTURAS_BU FOR FACTURAS
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable DISCRENS CHAR(2);
declare variable UNIVND CHAR(2);
begin
if (NEW.vend_cod <> OLD.vend_cod) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'COMISIONES', 'UNIFICAR CODIGOS DE VENDEDORES Y COBRADORES') returning_values (:UNIVND);
    if (UNIVND = 'SI') then
        NEW.cobr_cod = NEW.vend_cod;
    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 ((OLD.fact_transmit = 'S') AND (NEW.fact_transmit = 'N')) then
    BEGIN
    execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'DISCRIMINAR COMPONENTES EN ENSAMBLES AUTOMATICOS FACTURADOS') returning_values (:discrens);
    if (discrens = 'SI') then
        BEGIN
        SELECT SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = NEW.fact_id INTO NEW.FACT_IVAMONTO;
        END
    END
end
^

/* Trigger: FACTURAS_COMPRA_AD */
CREATE TRIGGER FACTURAS_COMPRA_AD FOR FACTURAS_COMPRA
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS INTEGER;
declare variable consec INTEGER;
declare variable ID 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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 21 and enco_idref = old.faco_id;
/* SI SE HIZO APLICACION ANULELA */
ID = 0;
SELECT COFA_IDDES FROM consolidado_faltantes WHERE COFA_TIPODES = 53 AND COFA_TIPOORI = 21 AND COFA_IDORI = OLD.faco_id INTO :ID;
if (ID <> 0) then
    BEGIN
    DELETE FROM aplicacion_proveedor_detalle WHERE APPR_ID = :ID;
    DELETE FROM aplicacion_provedor WHERE APPR_ID = :ID;
    delete from consolidado_faltantes WHERE COFA_TIPODES = 53 AND COFA_TIPOORI = 21 AND COFA_IDORI = OLD.faco_id;
    END


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);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La factura de compra ' || old.pref_pre || old.faco_numero || ' tiene abonos registrados.';
    END
END
^

/* Trigger: FACTURAS_COMPRA_AI */
CREATE TRIGGER FACTURAS_COMPRA_AI FOR FACTURAS_COMPRA
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable APLICA CHAR(2);
declare variable PREFAP VARCHAR(4);
declare variable ID INTEGER;
declare variable IDA INTEGER;
declare variable nomtipod VARCHAR(8);
declare variable nomtipoF VARCHAR(8);
declare variable PREFIJO VARCHAR(4);
declare variable numero varchar(8);
declare variable NUMAP varchar(8);
declare variable NUMPROV varchar(15);
declare variable SALDOF NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable RTFTEF NUMERIC(18,2);
declare variable RTIVAF NUMERIC(18,2);
declare variable RTICAF NUMERIC(18,2);
declare variable RTCREE NUMERIC(18,2);
declare variable DTOF NUMERIC(18,2);
declare variable IDC INTEGER;
declare variable ERROR INTEGER;
declare variable SUBEMPRESA INTEGER;
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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, 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, NEW.faco_rtcreem, 0, 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_RCREE, 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, NEW.faco_rtcreem, '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);
    /* aplique el anticipo si lo hay */
    execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'HACER APLICACION AUTOMATICA DE ANTICIPOS DEL PROVEEDOR AL GRABAR LA FACTURA DE COMPRA') returning_values (:APLICA);
    if (APLICA = 'SI') then
        begin
        SELECT SUCU_ID FROM PREFIJOS WHERE TIDO_COD = 21 AND PREF_PRE = NEW.pref_pre INTO :SUBEMPRESA;
        if (SUBEMPRESA IS NULL) then
            SUBEMPRESA = 0;
        EXECUTE PROCEDURE busca_id_doc_cxpagar(21, NEW.pref_pre, NEW.faco_numero, NEW.terc_nit, NEW.faco_fecha)
            returning_values (:IDC, :SALDOF, :rtftef, :rtivaf, :rticaf, :rtcree, :DTOF, :ERROR, :NUMPROV);
        /* busque si hay anticipos sin aplicar */
        FOR SELECT MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO
            FROM MOVIMIENTO_PROVEEDOR M, PREFIJOS P
            WHERE TERC_NIT = new.terc_nit AND MVPR_FECHA <= new.faco_fecha AND MVPR_ABONO = 'N' AND P.tido_cod = M.mvpr_tiporef AND MVPR_TIPOREF = 55 and
            P.pref_pre = M.mvpr_prefijo AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            INTO :ID, :PREFIJO, :NUMERO
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cxpagar(55, ID, new.faco_fecha, 0) returning_values (SALDO);
            if (ABS(SALDO) >= SALDOF) then
                begin
                IDA = gen_id(id_aplicaprov, 1);
                SELECT FIRST 1 PREF_PRE, PREF_ACTUAL FROM PREFIJOS P WHERE TIDO_COD = 53 AND PREF_ACTIVO = 'S' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :PREFAP, :NUMAP;
                SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 55 INTO :nomtipod;
                SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 21 INTO :nomtipof;
                
                INSERT INTO APLICACION_PROVEDOR (APPR_ID, TIDO_COD, PREF_PRE, APPR_NUMERO, APPR_CONC, APPR_OBS,
                    APPR_ANULADO, APPR_TRANSMIT, TERC_NIT, APPR_FECHA, APPR_USUARIO, NUMOK, APPR_TRM)
                    VALUES (:IDA, 53, :PREFAP, :NUMAP, 'APLICACION ' || :nomtipod || ' ' || NEW.pref_pre || NEW.faco_numero || ' A ' || :nomtipof || ' ' || :PREFIJO || :NUMERO, null,
                    'N', 'N', NEW.terc_nit, NEW.faco_fecha, USER, 'N', 1);

                INSERT INTO APLICACION_PROVEEDOR_DETALLE (APPR_ID, APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, APPD_APLICADO,
                    APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPD_RCREE, APPD_ANULADO, APPD_TRANSMIT, APPD_PREFIJO, APPD_NUMERO, APPD_DIFCAMBIO)
                    VALUES (:IDA, 1, 21, NEW.faco_id, :SALDOF, :rtftef, :rtivaf, :rticaf, :rtcree, 'N', 'N', NEW.pref_pre, NEW.faco_numero, 0);

                INSERT INTO APLICACION_PROVEEDOR_DETALLE (APPR_ID, APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, APPD_APLICADO,
                    APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPD_RCREE, APPD_ANULADO, APPD_TRANSMIT, APPD_PREFIJO, APPD_NUMERO, APPD_DIFCAMBIO)
                    VALUES (:IDA, 2, 55, :ID, :SALDOF*-1, :rtftef*-1, :rtivaf*-1, :rticaf*-1, :rtcree*-1, 'N', 'N', :prefijo, :numero, 0);

                IDC = gen_id(id_cons, 1);
                INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                    VALUES (:IDC, 0, 53, 21, NEW.faco_id);
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ITEM, COFA_ID, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_IDDES, COFA_CANTCR)
                    VALUES (1, :IDC, 53, 21, NEW.faco_id, :IDA, 1);
                end
            end
        end
    END
END
^

/* Trigger: FACTURAS_COMPRA_AU */
CREATE 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;
declare variable APLICA CHAR(2);
declare variable PREFAP VARCHAR(4);
declare variable ID INTEGER;
declare variable IDA INTEGER;
declare variable nomtipod VARCHAR(8);
declare variable nomtipoF VARCHAR(8);
declare variable PREFIJO VARCHAR(4);
declare variable numero varchar(8);
declare variable NUMAP varchar(8);
declare variable NUMPROV varchar(15);
declare variable SALDOF NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable RTFTEF NUMERIC(18,2);
declare variable RTIVAF NUMERIC(18,2);
declare variable RTICAF NUMERIC(18,2);
declare variable RTCREE NUMERIC(18,2);
declare variable DTOF NUMERIC(18,2);
declare variable IDC INTEGER;
declare variable ERROR INTEGER;
declare variable SUBEMPRESA 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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    delete from comprobante_encabezado where enco_tiporef = 21 and enco_idref = old.faco_id;
    /* SI SE HIZO APLICACION ANULELA */
    ID = 0;
    SELECT COFA_IDDES FROM consolidado_faltantes WHERE COFA_TIPODES = 53 AND COFA_TIPOORI = 21 AND COFA_IDORI = OLD.faco_id INTO :ID;
    if (ID <> 0) then
        UPDATE aplicacion_provedor SET APPR_ANULADO = 'S' WHERE APPR_ID = :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
/* SI CAMBIA VENDEDOR O VENCIMIENTO ACTUALICE EL MOVIMIENTO_CLIENTE */
if (OLD.faco_vence <> NEW.faco_vence)  then
    BEGIN
    UPDATE movimiento_proveedor M SET M.mvpr_vence = NEW.faco_vence
        WHERE M.mvpr_tiporef = 21 AND M.mvpr_idref = NEW.faco_id;
    END
else
    begin
    /* 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);
            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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, 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, NEW.faco_rtcreem, 0, 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_RCREE, 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, NEW.faco_rtcreem, '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);
        /* aplique el anticipo si lo hay */
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'HACER APLICACION AUTOMATICA DE ANTICIPOS DEL PROVEEDOR AL GRABAR LA FACTURA DE COMPRA') returning_values (:APLICA);
        if (APLICA = 'SI') then
            begin
            SELECT SUCU_ID FROM PREFIJOS WHERE TIDO_COD = 21 AND PREF_PRE = NEW.pref_pre INTO :SUBEMPRESA;
            if (SUBEMPRESA IS NULL) then
                SUBEMPRESA = 0;
            EXECUTE PROCEDURE busca_id_doc_cxpagar(21, NEW.pref_pre, NEW.faco_numero, NEW.terc_nit, NEW.faco_fecha)
                returning_values (:IDC, :SALDOF, :rtftef, :rtivaf, :rticaf, :rtcree, :DTOF, :ERROR, :NUMPROV);
            /* busque si hay anticipos sin aplicar */
            FOR SELECT MVPR_IDREF, MVPR_PREFIJO, MVPR_NUMERO
                FROM MOVIMIENTO_PROVEEDOR M, PREFIJOS P
                WHERE TERC_NIT = new.terc_nit AND MVPR_FECHA <= new.faco_fecha AND MVPR_ABONO = 'N' AND P.tido_cod = M.mvpr_tiporef AND MVPR_TIPOREF = 55 and
                P.pref_pre = M.mvpr_prefijo AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :ID, :PREFIJO, :NUMERO
                DO
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cxpagar(55, ID, new.faco_fecha, 0) returning_values (SALDO);
                if (ABS(SALDO) >= SALDOF) then
                    begin
                    IDA = gen_id(id_aplicaprov, 1);
                    SELECT FIRST 1 PREF_PRE, PREF_ACTUAL FROM PREFIJOS P WHERE TIDO_COD = 53 AND PREF_ACTIVO = 'S' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                        INTO :PREFAP, :NUMAP;
                    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 55 INTO :nomtipod;
                    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 21 INTO :nomtipof;
                    
                    INSERT INTO APLICACION_PROVEDOR (APPR_ID, TIDO_COD, PREF_PRE, APPR_NUMERO, APPR_CONC, APPR_OBS,
                        APPR_ANULADO, APPR_TRANSMIT, TERC_NIT, APPR_FECHA, APPR_USUARIO, NUMOK, APPR_TRM)
                        VALUES (:IDA, 53, :PREFAP, :NUMAP, 'APLICACION ' || :nomtipof || ' ' || NEW.pref_pre || NEW.faco_numero || ' A ' || :nomtipod || ' ' || :PREFIJO || :NUMERO, null,
                        'N', 'N', NEW.terc_nit, NEW.faco_fecha, USER, 'N', 1);
    
                    INSERT INTO APLICACION_PROVEEDOR_DETALLE (APPR_ID, APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, APPD_APLICADO,
                        APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPD_RCREE, APPD_ANULADO, APPD_TRANSMIT, APPD_PREFIJO, APPD_NUMERO, APPD_DIFCAMBIO)
                        VALUES (:IDA, 1, 21, NEW.faco_id, :SALDOF, :rtftef, :rtivaf, :rticaf, :rtcree, 'N', 'N', NEW.pref_pre, NEW.faco_numero, 0);
    
                    INSERT INTO APLICACION_PROVEEDOR_DETALLE (APPR_ID, APPD_ITEM, APPD_TIPODOC, APPD_IDDOC, APPD_APLICADO,
                        APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPD_RCREE, APPD_ANULADO, APPD_TRANSMIT, APPD_PREFIJO, APPD_NUMERO, APPD_DIFCAMBIO)
                        VALUES (:IDA, 2, 55, :ID, :SALDOF*-1, :rtftef*-1, :rtivaf*-1, :rticaf*-1, :rtcree*-1, 'N', 'N', :prefijo, :numero, 0);
    
                    IDC = gen_id(id_cons, 1);
                    INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                        VALUES (:IDC, 0, 53, 21, NEW.faco_id);
                    INSERT INTO CONSOLIDADO_FALTANTES (COFA_ITEM, COFA_ID, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_IDDES, COFA_CANTCR)
                        VALUES (1, :IDC, 53, 21, NEW.faco_id, :IDA, 1);
                    end
                end
            end
        end
    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
^

/* Trigger: FACTURAS_COMPRA_BI */
CREATE TRIGGER FACTURAS_COMPRA_BI FOR FACTURAS_COMPRA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if (NEW.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;
if ((NEW.faco_dtomonto <> 0) AND ((NEW.faco_dtoporc = 0) or (NEW.faco_dtoporc IS NULL))) then
    BEGIN
    NEW.faco_dtoporc = (NEW.faco_dtomonto * 100) / (NEW.faco_total - NEW.faco_ivamonto - NEW.faco_adicional + NEW.faco_dtomonto);
    END
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
^

/* Trigger: FACTURAS_CONTADO_AI */
CREATE TRIGGER FACTURAS_CONTADO_AI FOR FACTURAS_CONTADO
ACTIVE AFTER INSERT POSITION 0
as
begin
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 31, NEW.fcnt_id, 'I', NEW.pref_pre || NEW.fcnt_numero);
  /* Trigger text */
end
^

/* Trigger: FACTURAS_CONTADO_BI */
CREATE TRIGGER FACTURAS_CONTADO_BI FOR FACTURAS_CONTADO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
begin
  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.FCNT_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.FCNT_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.FCNT_numero) returning_values (NEW.FCNT_numero);
    NEW.numok = 'S';
    END
end
^

/* Trigger: FACTURAS_CONTADO_PAGO_AD */
CREATE TRIGGER FACTURAS_CONTADO_PAGO_AD FOR FACTURAS_CONTADO_PAGO
ACTIVE AFTER DELETE POSITION 0
as
declare variable IDR INTEGER;
declare variable MONTO NUMERIC(18,2);
begin
/* BORRE EL ANTERIOR */
SELECT RECA_ID FROM RECIBOS_CAJA_DETALLE WHERE RCDE_TIPODOC = 31 AND RCDE_IDDOC = OLD.fcnt_id INTO :IDR;
DELETE FROM recibos_caja_pago WHERE RECA_ID = :IDR AND RCPA_ITEM = OLD.fcnp_item;
if (NOT EXISTS (SELECT RECA_ID FROM RECIBOS_CAJA_PAGO WHERE RECA_ID = :IDR)) then
    BEGIN
    /* BORRE EL ENCABEZADO Y DETALLE POR DOCUMENTO */
    update RECIBOS_CAJA_DETALLE SET RCDE_ABONO = RCDE_ABONO - OLD.FCNP_MONTO WHERE RECA_ID = :IDR AND RCDE_ITEM = 1;
    UPDATE RECIBOS_CAJA SET RECA_MONTO = RECA_MONTO - OLD.FCNP_MONTO WHERE RECA_ID = :IDR;
    SELECT RECA_MONTO FROM RECIBOS_CAJA WHERE RECA_ID = :IDR INTO :monto;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO = 0) then
        BEGIN
        DELETE FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDR;
        DELETE FROM RECIBOS_CAJA WHERE RECA_ID = :IDR;
        END
    END
end
^

/* Trigger: FACTURAS_CONTADO_PAGO_AI */
CREATE TRIGGER FACTURAS_CONTADO_PAGO_AI FOR FACTURAS_CONTADO_PAGO
ACTIVE AFTER INSERT POSITION 0
as
declare variable CARTERA CHAR(1);
declare variable CAJA INTEGER;
declare variable PUNTO INTEGER;
declare variable CONTADO CHAR(1);
declare variable PREFR VARCHAR(4);
declare variable NUMR VARCHAR(8);
declare variable IDR INTEGER;
declare variable FECHA DATE;
declare variable PREFF VARCHAR(4);
declare variable NUMF VARCHAR(8);
declare variable NIT VARCHAR(20);
declare variable NOMCLI VARCHAR(60);
declare variable VEND INTEGER;
declare variable MONTO NUMERIC(18,2);
declare variable SUCURSAL VARCHAR(20);
declare variable PEDIDO VARCHAR(20);
declare variable IDPED INTEGER;
declare variable PREFA VARCHAR(4);
declare variable NUMA VARCHAR(8);
declare variable IDA INTEGER;
declare variable MONTOA NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable RTFTEA NUMERIC(18,2);
declare variable RTIVAA NUMERIC(18,2);
declare variable RTICAA NUMERIC(18,2);
declare variable RTCREA NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable ITEMR INTEGER;
declare variable TRANSMIT CHAR(1);
declare variable antitot NUMERIC(18,2);
begin
/* SI NO ES DE CARTERA GENERE UN RECIBO */
select F.PTVT_ID, P.caja_id, fact_fecha, F.pref_pre, fact_numero, F.terc_nit, fact_nomcliente, F.vend_cod, fact_total, fact_ivamonto,
    fact_rtftemonto, fact_rtivamonto, fact_rticamonto, fact_sucursal, FACT_PEDIDO, FACT_TRANSMIT
    FROM FACTURAS F, PUNTO_VENTA P WHERE F.fact_id = NEW.fcnt_id AND F.PTVT_ID = P.ptvt_id
    INTO :PUNTO, :CAJA, :FECHA, :PREFF, :NUMF, :NIT, :NOMCLI, : VEND, :MONTO, :IVAMONTO,
    :rtfte, :rtiva, :rtica, :SUCURSAL, :PEDIDO, :TRANSMIT;
/* si la autorizacion es de contado, haga el recibo */
select first 1 auto_contado, auto_prefrdc from autorizaciones where pref_pre = :preff into :contado, :prefr;
if ((CONTADO = 'S') AND (TRANSMIT = 'N')) then
    BEGIN
    ANTITOT = 0;
    IDR = 0;
    SELECT RECA_ID FROM RECIBOS_CAJA_DETALLE WHERE RCDE_TIPODOC = 31 AND RCDE_IDDOC = NEW.fcnt_id AND RCDE_ANULADO = 'N'
        INTO :IDR;
    if (IDR IS NULL) then
        IDR = 0;
    if (IDR = 0) then
        BEGIN
        SELECT PREF_ACTUAL FROM PREFIJOS WHERE PREF_PRE = :PREFR AND TIDO_COD = 61 INTO :NUMR;
        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, :prefr, :numr, :fecha, 'CANCELA FACTURA ' || :preff || :NUMF || ' PUNTO ' || :punto, NEW.fcnp_monto,
            :rtfte, :rtiva, :rtica, 0, NULL, :NIT, :nomcli, '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, NEW.fcnt_id, :preff, :numf, new.fcnp_monto, :rtfte, :rtiva, :rtica, 0, 'N', 'N', '', :sucursal);
        END
    else
        begin
        update recibos_caja set reca_monto = reca_monto + new.fcnp_monto
            where reca_id = :idr;
        update recibos_caja_detalle set rcde_abono = rcde_abono + new.fcnp_monto
            where reca_id = :idr and rcde_item = 1;
        end
    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, NEW.fcnp_item, NEW.fopa_id, NEW.fcnp_banco, NEW.fcnp_cuenta, NEW.fcnp_numero, NEW.fcnp_fecha, (NEW.fcnp_monto-:antitot), 'N', 'N', :ivamonto);
    END
end
^

/* Trigger: FACTURAS_CONTADO_PAGO_AU */
CREATE TRIGGER FACTURAS_CONTADO_PAGO_AU FOR FACTURAS_CONTADO_PAGO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CARTERA CHAR(1);
declare variable CAJA INTEGER;
declare variable PUNTO INTEGER;
declare variable CONTADO CHAR(1);
declare variable PREFR VARCHAR(4);
declare variable NUMR VARCHAR(8);
declare variable IDR INTEGER;
declare variable FECHA DATE;
declare variable PREFF VARCHAR(4);
declare variable NUMF VARCHAR(8);
declare variable NIT VARCHAR(20);
declare variable NOMCLI VARCHAR(60);
declare variable VEND INTEGER;
declare variable MONTO NUMERIC(18,2);
declare variable SUCURSAL VARCHAR(20);
declare variable PEDIDO VARCHAR(20);
declare variable IDPED INTEGER;
declare variable PREFA VARCHAR(4);
declare variable NUMA VARCHAR(8);
declare variable IDA INTEGER;
declare variable MONTOA NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable RTFTEA NUMERIC(18,2);
declare variable RTIVAA NUMERIC(18,2);
declare variable RTICAA NUMERIC(18,2);
declare variable RTCREA NUMERIC(18,2);
declare variable ITEMR INTEGER;
declare variable TRANSMIT CHAR(1);
begin
/* BORRE EL ANTERIOR */
IDR = 0;
SELECT FIRST 1 RECA_ID FROM RECIBOS_CAJA_DETALLE WHERE RCDE_TIPODOC = 31 AND RCDE_IDDOC = OLD.fcnt_id AND RCDE_ANULADO = 'N' INTO :IDR;
if (IDR <> 0) then
    BEGIN
    DELETE FROM recibos_caja_pago WHERE RECA_ID = :IDR AND RCPA_ITEM = OLD.fcnp_item;
    if (NOT EXISTS (SELECT RECA_ID FROM RECIBOS_CAJA_PAGO WHERE RECA_ID = :IDR)) then
        BEGIN
        /* BORRE EL ENCABEZADO Y DETALLE POR DOCUMENTO */
        update RECIBOS_CAJA_DETALLE SET RCDE_ABONO = RCDE_ABONO - OLD.FCNP_MONTO WHERE RECA_ID = :IDR AND RCDE_ITEM = 1;
        UPDATE RECIBOS_CAJA SET RECA_MONTO = RECA_MONTO - OLD.FCNP_MONTO WHERE RECA_ID = :IDR;
        SELECT RECA_MONTO FROM RECIBOS_CAJA WHERE RECA_ID = :IDR INTO :monto;
        if (MONTO IS NULL) then
            MONTO = 0;
        if (MONTO = 0) then
            BEGIN
            DELETE FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDR;
            DELETE FROM RECIBOS_CAJA WHERE RECA_ID = :IDR;
            END
        END
    END
/* GRABE EL NUEVO */
if (NEW.fcnp_anulado = 'N') then
    BEGIN
    /* SI NO ES DE CARTERA GENERE UN RECIBO */
    select F.PTVT_ID, P.caja_id, fact_fecha, F.pref_pre, fact_numero, F.terc_nit, fact_nomcliente, F.vend_cod, fact_total, FACT_IVAMONTO,
        fact_sucursal, FACT_PEDIDO, FACT_TRANSMIT
        FROM FACTURAS F, PUNTO_VENTA P WHERE F.fact_id = NEW.fcnt_id AND F.PTVT_ID = P.ptvt_id
        INTO :PUNTO, :CAJA, :FECHA, :PREFF, :NUMF, :NIT, :NOMCLI, : VEND, :MONTO, :IVAMONTO, :SUCURSAL, :PEDIDO, :TRANSMIT;
    /* si la autorizacion es de contado, haga el recibo */
    select first 1 auto_contado, auto_prefrdc from autorizaciones where pref_pre = :preff into :contado, :prefr;
    if ((CONTADO = 'S') AND (TRANSMIT = 'N')) then
        BEGIN
        IDR = 0;
        SELECT RECA_ID FROM RECIBOS_CAJA_DETALLE WHERE RCDE_TIPODOC = 31 AND RCDE_IDDOC = NEW.fcnt_id AND RCDE_ANULADO = 'N'
            INTO :IDR;
        if (IDR IS NULL) then
            IDR = 0;
        if (IDR = 0) then
            BEGIN
            SELECT PREF_ACTUAL FROM PREFIJOS WHERE PREF_PRE = :PREFR AND TIDO_COD = 61 INTO :NUMR;
            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, :prefr, :numr, :fecha, 'CANCELA FACTURA ' || :preff || :NUMF || ' PUNTO ' || :punto, NEW.fcnp_monto,
                0, 0, 0, 0, NULL, :NIT, :nomcli, '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, NEW.fcnt_id, :preff, :numf, new.fcnp_monto, 0, 0, 0, 0, 'N', 'N', '', :sucursal);
            END
        else
            begin
            update recibos_caja set reca_monto = reca_monto + new.fcnp_monto
                where reca_id = :idr;
            update recibos_caja_detalle set rcde_abono = rcde_abono + new.fcnp_monto
                where reca_id = :idr and rcde_item = 1;
            end
        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, NEW.fcnp_item, NEW.fopa_id, NEW.fcnp_banco, NEW.fcnp_cuenta, NEW.fcnp_numero, NEW.fcnp_fecha, NEW.fcnp_monto, 'N', 'N', :IVAMONTO);
        END
    END
end
^

/* Trigger: FACTURAS_CONTADO_PAGO_BI */
CREATE TRIGGER FACTURAS_CONTADO_PAGO_BI FOR FACTURAS_CONTADO_PAGO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMROWS INTEGER;
declare variable FPBONO INTEGER;
declare variable nummax VARCHAR(6);
declare variable FPCONS CHAR(2);
begin
if (NEW.fopa_id <> 1) then
  BEGIN
  /* verifique que la forma de pago no exista en cualquier caja */
  execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'FORMA DE PAGO PARA BONOS FACTURADOS') returning_values (:FPBONO);
  if (NEW.fopa_id <> :fpbono) then
    BEGIN
    SELECT COUNT(*) FROM documentos_pago_caja WHERE fopa_id = new.fopa_id and dpca_banco = NEW.fcnp_banco AND
        dpca_cuenta = NEW.fcnp_cuenta AND dpca_numero = NEW.fcnp_numero AND dpca_tiposal = 0 and dpca_idsal = 0
        INTO :NUMROWS;
    if (numrows > 0) then
        begin
        execute procedure lee_configuracion('CAJA', 'RECIBOS', 'USAR NUMERACION CONSECUTIVA PARA LAS FORMAS DE PAGO') returning_values (:FPCONS);
        if (FPCONS = 'SI') then
            BEGIN
            SELECT MAX(DPCA_NUMERO) FROM documentos_pago_caja WHERE fopa_id = new.fopa_id and dpca_banco = NEW.fcnp_banco AND
                dpca_cuenta = NEW.fcnp_cuenta AND DPCA_NUMERO < '999999' INTO :NUMMAX;
            NEW.fcnp_numero = CAST((CAST(NUMMAX AS INTEGER) + 1) AS VARCHAR(6));
            EXECUTE PROCEDURE completa_ceros(NEW.fcnp_numero) returning_values (NEW.fcnp_numero);
            SELECT COUNT(*) FROM documentos_pago_caja WHERE fopa_id = new.fopa_id and dpca_banco = NEW.fcnp_banco AND
                dpca_cuenta = NEW.fcnp_cuenta AND dpca_numero = NEW.fcnp_numero AND dpca_tiposal = 0 and dpca_idsal = 0
                INTO :NUMROWS;
            END
        if (numrows > 0) then
            exception documento_pago_salido 'La forma de pago ' || NEW.fopa_id || ' ' || new.fcnp_banco || ' ' || new.fcnp_cuenta || ' ' || new.fcnp_numero || ' ya existe en la caja.';
        end
    END
  END
end
^

/* Trigger: FACTURAS_DETALLE_AD */
CREATE 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(8);
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 factmes char(2);
declare variable CONSO 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);
    if ((OLD.fade_idpend <> 0) AND (OLD.fade_itempend <> 0)) then
        BEGIN
        /* ACTUALICE EL IDFACT EN EL PENDIENTE */
        UPDATE pendiente_ventas_detalle D SET D.pevd_idfact = 0 WHERE D.pend_id = OLD.fade_idpend AND D.pevd_item = OLD.fade_itempend;
        END
    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
            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 = null, COFA_CANTCR = 0, COFA_FECDES = null
                    where COFA_ID = :consolida;
            else
                begin
                CANTAUX = old.fade_cant * old.fade_factor;
                for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
                    where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
                    into :ITEM, :CANT
                    do
                    begin
                    if ((CANTAUX > 0) and (CANT > 0)) then
                        begin
                        if (CANTAUX > CANT) then
                            BEGIN
                            update consolidado_faltantes
                                set COFA_IDDES = 0, COFA_CANTCR = 0
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - CANT;
                            END
                        ELSE
                            BEGIN
                            update consolidado_faltantes
                                set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                        end
                    end
                end
            end
        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
^

/* Trigger: FACTURAS_DETALLE_AI */
CREATE TRIGGER FACTURAS_DETALLE_AI FOR FACTURAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable NOMCLI VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable PEDAUTO CHAR(2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable CANTPEND NUMERIC(18,4);
declare variable factmes char(2);
declare variable ano integer;
declare variable mes integer;
declare variable MESES integer;
declare variable grpfm VARCHAR(3);
declare variable grp VARCHAR(3);
declare variable SUCURSAL VARCHAR(10);
declare variable FACMARCA VARCHAR(2);
declare variable PREFDOS VARCHAR(4);
declare variable IDF2 INTEGER;
declare variable AUTO2 VARCHAR(20);
BEGIN
select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida, fact_sucursal, fact_idfmar
    from facturas where fact_id = new.fact_id
    into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida, :sucursal, :idf2;
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','SEPARAR ARTICULOS SEGUN LA MARCA EN FACTURAS INDEPENDIENTES') RETURNING_VALUES (FACMARCA);
    if (FACMARCA = 'SI') then
        BEGIN
        /* BUSQUE EL PREFIJO ASOCIADO A LA MARCA */
        PREFDOS = NULL;
        SELECT MAX(A.PREF_PRE), MAX(AUTO_NUMERO) FROM autorizaciones A, ARTICULO M, PREFIJOS P, USUARIO U
            WHERE AUTO_MARCA = M.MARC_COD AND M.arti_cod = NEW.arti_cod AND P.pref_pre = A.pref_pre AND P.tido_cod = 31
            AND USER_COD = USER AND ((P.sucu_id = 0) or (P.sucu_id = U.sucu_id))
            INTO :PREFDOS, :AUTO2;
        if ((PREFDOS IS NULL) or (IDF2 IS NOT NULL))  then
            FACMARCA = 'NO'; -- SI ES LA SEGUNDA FACTURA O NO HAY PREFIJO ASOCIADO HAGALO NORMAL
        ELSE
            BEGIN
            IDF2 = NULL;
            SELECT FACT_ID FROM FACTURAS WHERE PREF_PRE = :PREFDOS AND FACT_IDFMAR = NEW.fact_id INTO :IDF2;
            /* SI NO EXISTE UNA FACTURA ASOCIADA DE ESA MARCA INSERTELA */
            if (IDF2 IS NULL) then
                BEGIN
                EXECUTE PROCEDURE cambie_id_factura returning_values (:IDF2);
                INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO, FACT_VENCE,
                    FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO,
                    FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR,
                    FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION,
                    FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA, FACT_RECIBIDO, FACT_USUARIO,
                    FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM,
                    FACT_ANTICIPO, FACT_GARANTIA, FACT_DEC2799, FACT_COMIP, FACT_FECINI, FACT_FECFIN, FACT_ENTREGA, FACT_RTCREE, FACT_RTCREEM, FACT_IDFMAR)
                    SELECT :IDF2, PTVT_ID, VEND_COD, TERC_NIT, :AUTO2, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO, FACT_VENCE,
                    FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, 0, 0,
                    FACT_RTFTEPOR, 0, FACT_RTIVAPOR, 0, FACT_RTICAPOR, 0, 0, FACT_DTOFPOR,
                    0, FACT_DTOFFECHA, :prefdos, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION,
                    FACT_ANULADO, FACT_TRANSMIT, 0, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA, 0, FACT_USUARIO,
                    FACT_SUCURSAL, 'N', COBR_COD, 1, FACT_DETCLI, FACT_DETCLINOM, 0, 0, 0, FACT_TRM,
                    0, FACT_GARANTIA, 0, FACT_COMIP, FACT_FECINI, FACT_FECFIN, FACT_ENTREGA, FACT_RTCREE, 0, NEW.fact_id
                    FROM FACTURAS WHERE FACT_ID = NEW.fact_id;
                END
            /* INSERTE EL ITEM EN LA FACTURA */
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE, FADE_PRUNIT,
                FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR, FADE_DESC, FADE_OBS,
                FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA, FADE_ANULADO, FADE_TRANSMIT,
                FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE,
                FADE_PORCBASE, FADE_IDPEND, FADE_ITEMPEND, FADE_TIVA, FADE_INALCP, FADE_INALCM)
                VALUES (:IDF2, NEW.fade_item, NEW.BODE_COD, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_LOTE, NEW.FADE_PRUNIT,
                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_REMISIONADO, NEW.FADE_DEVUELTO, NEW.FADE_TOTAL, NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_ANULADO, NEW.FADE_TRANSMIT,
                NEW.FADE_FACTORLISTA, NEW.FADE_DTO1, NEW.FADE_DTO2, NEW.FADE_DTO3, NEW.FADE_DTOM1, NEW.FADE_DTOM2, NEW.FADE_DTOM3, NEW.FADE_CAJAS, NEW.FADE_BASE,
                NEW.FADE_PORCBASE, NEW.FADE_IDPEND, NEW.FADE_ITEMPEND, NEW.FADE_TIVA, NEW.FADE_INALCP, NEW.FADE_INALCM);
            /* actualice el total de la factura */
            UPDATE FACTURAS
                SET FACT_TOTAL = FACT_TOTAL + NEW.fade_total,
                FACT_IVAMONTO = FACT_IVAMONTO + NEW.fade_ivamonto,
                FACT_DTOMONTO = (FACT_TOTAL-FACT_IVAMONTO) * FACT_DTOPOR / 100,
                FACT_DTOFMONTO = (FACT_TOTAL-FACT_IVAMONTO) * FACT_DTOFPOR / 100,
                FACT_RTFTEMONTO = (FACT_TOTAL-FACT_IVAMONTO) * FACT_RTFTEPOR / 100,
                FACT_RTIVAMONTO = FACT_IVAMONTO * FACT_RTIVAPOR / 100,
                FACT_RTICAMONTO = (FACT_TOTAL-FACT_IVAMONTO) * FACT_RTICAPOR / 100,
                FACT_RTCREEM = (FACT_TOTAL-FACT_IVAMONTO) * FACT_RTCREE / 100
                WHERE FACT_ID = :IDF2;
            END
        END
    if (FACMARCA = 'NO') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo IS NULL) then
            Tipo = 0;
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
        if (ESPOS = 'S') then
            BEGIN
            INVFAC = 'SI';
            PEDAUTO = 'NO';
            END
        /* si se hizo con base en una remisiÂ¢n no afecte inventario */
        if ((Tipo <> 32) and (INVFAC = 'SI')) then
            begin
            CANTPEND = 0;
            if ((NEW.fade_idpend <> 0) AND (NEW.fade_itempend <> 0)) then
                BEGIN
                select d.pevd_cant * d.pevd_factor from pendiente_ventas_detalle D WHERE D.pend_id = NEW.fade_idpend AND D.pevd_item = NEW.fade_itempend into :cantpend;
                if ((new.fade_cant * new.fade_factor) < cantpend) then
                    exception cantidad_cruce_mayor 'La cantidad facturada ' || cast(new.fade_cant * new.fade_factor as varchar(20)) || ' no puede ser menor al pendiente previamente grabado' || cast(:cantpend as varchar(20));
                /* ACTUALICE EL IDFACT EN EL PENDIENTE */
                UPDATE pendiente_ventas_detalle D SET D.pevd_idfact = NEW.fact_id WHERE D.pend_id = NEW.fade_idpend AND D.pevd_item = NEW.fade_itempend AND ((D.pevd_idfact IS NULL) or (D.pevd_idfact = 0));
                END
            if (STRLEN(NOMCLI) > 40) then
                CONC = 'FV No.' || :pref || :num || '-' || SUBSTR(NOMCLI, 1, 40);
            ELSE
                CONC = 'FV No.' || :pref || :NUM || '-' || NOMCLI;
            if ((((new.fade_factor * new.fade_cant) - cantpend) > 0) or (new.fade_cant < 0))  then
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
                    :CONC, new.fade_factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
            end
        if (PEDAUTO = 'SI') then
            BEGIN
            INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
                VALUES (GEN_ID(id_pedido,0), NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
            END
        ELSE
            BEGIN
            if (CONSOLIDA <> 0) then
                BEGIN
                EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
                if (CONSO = 'NO') then
                    update consolidado_faltantes set COFA_IDDES = new.fact_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                        where COFA_ID = :consolida;
                ELSE
                    BEGIN
                    CANTAUX = new.fade_cant * new.fade_factor;
                    for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                        where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                        into :ITEM, :CANT
                        do
                        begin
                        if ((CANTAUX > 0) and (CANT > 0))then
                            if (CANT < CANTAUX) then
                                begin
                                update consolidado_faltantes
                                    set COFA_IDDES = new.fact_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                                    where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                                CANTAUX = CANTAUX - CANT;
                                end
                            else
                                begin
                                update consolidado_faltantes
                                    set COFA_IDDES = new.fact_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                                    where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                                CANTAUX = 0;
                                end
                        end
                    END
                END
            END
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
        if (BONOS = 'SI') then
            BEGIN
            SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
            if (VRBONO <> 0) then
                BEGIN
                I = 1;
                WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                    BEGIN
                    INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                        VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                    I = I + 1;
                    END
                END
            END
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
        if (factmes = 'SI') Then
            begin
            execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:grpfm);
            SELECT GRUP_COD FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :GRP;
            if (GRP = :GRPFM) then
                BEGIN
                /* actualice el control de facturacion */
                ano = extract(year from :fec);
                mes = extract(month from :fec);
                MESES = NEW.fade_cant;
                UPDATE movimiento_clientes SET MVCL_CONC = NEW.FADE_DESC || ' MES' WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
                while (meses > 0) DO
                    BEGIN
                    if (exists (select fame_nit from facturas_mes where fame_nit = :nit and fame_sucursal = :sucursal and fame_ano = :ano and fame_mes = :mes)) then
                        exception mes_ya_facturado 'El cliente ' || :NIT || '-' || :sucursal || ' ya tiene una factura de ' || :ano || '-' || :mes;
                    else
                        INSERT INTO facturas_mes (FAME_NIT, FAME_ANO, FAME_MES, FAME_IDFACT, FAME_SUCURSAL)
                            VALUES (:nit, :ANO, :MES, NEW.fact_id, :sucursal);
                    UPDATE movimiento_clientes SET MVCL_CONC = MVCL_CONC || ' ' || :MES WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
                    MES = MES + 1;
                    MESES = MESES - 1;
                    END
                END
            end
        END
    END
END
^

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

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

/* Trigger: FACTURAS_DETALLE_BI */
CREATE TRIGGER FACTURAS_DETALLE_BI FOR FACTURAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable TRM numeric(18,2);
declare variable IVAINC CHAR(1);
declare variable DISCRENS CHAR(2);
declare variable FECHA DATE;
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR double precision;
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable IVAPR numeric(18,2);
declare variable IVAPRM numeric(18,2);
declare variable IVATOT numeric(18,2);
declare variable TOTALPR numeric(18,2);
declare variable CONSUMOPR numeric(18,2);
declare variable COSTOT numeric(18,2);
declare variable ITEM INTEGER;
declare variable ARTIC VARCHAR(20);
declare variable DEC1818 CHAR(1);
declare variable PREF VARCHAR(4);
declare variable EXAR CHAR(1);
declare variable NIT VARCHAR(20);
declare variable OK CHAR(1);
declare variable TOTAL numeric(18,2);
declare variable DTOP 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;
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.fade_unidad) returning_values (new.fade_factor);

SELECT FACT_FECHA, TERC_NIT, FACT_TOTAL FROM FACTURAS WHERE FACT_ID = NEW.fact_id INTO :FECHA, :NIT, :TOTAL;
/* 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, pref_pre from facturas where fact_id = new.fact_id into :trm, :ivainc, :pref;
if ((NEW.FADE_TOTAL IS NULL) or (NEW.fade_total = 0)) then
    BEGIN
    NEW.FADE_TOTAL = NEW.FADE_CANT * (NEW.FADE_PRUNIT - NEW.FADE_DTOMONTO);
    if (IVAINC = 'N') then
        NEW.FADE_TOTAL = NEW.fade_total + NEW.fade_ivamonto + NEW.fade_consumo;
    END
if (trm <> 1) then
    begin
    new.fade_prunit = new.fade_prunit * trm;
    new.fade_dtomonto = new.fade_dtomonto * trm;
    new.fade_ivamonto = new.fade_ivamonto * trm;
    new.fade_consumo = new.fade_consumo * trm;
    new.fade_dtom1 = new.fade_dtom1 * trm;
    new.fade_dtom2 = new.fade_dtom2 * trm;
    new.fade_dtom3 = new.fade_dtom3 * trm;
    new.fade_total = new.fade_total * trm;
    end
select GRUP_DEC1818, ARTI_EXIST from grupo G, articulo a where a.arti_cod = new.arti_cod and a.grup_cod = G.grup_cod
    into :DEC1818, :EXAR;
if (DEC1818 = 'S') then
    BEGIN
    SELECT PREF_DEC1818 FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :pref INTO :DEC1818;
    if (DEC1818 = 'S') then
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'TARIFA DE IVA PARA PRODUCTOS EXENTOS DECRETO 1818 DE 2015') returning_values NEW.fade_tiva;
    ELSE
        select taiv_cod from articulo where arti_cod = new.arti_cod into new.fade_tiva;
    END
ELSE
    select taiv_cod from articulo where arti_cod = new.arti_cod into new.fade_tiva;
if (EXAR = 'L') then
    BEGIN
    if (NEW.fade_lote IS NULL) then
        BEGIN
        select BODE_LOTES FROM BODEGA WHERE BODE_COD = NEW.bode_cod INTO :EXAR;
        if (EXAR = 'N') then
            NEW.fade_lote = '1';
        END
    END
/* si es un ensamble automatico y la configuracion lo indica desglocelo */
execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'DISCRIMINAR COMPONENTES EN ENSAMBLES AUTOMATICOS FACTURADOS') returning_values (:discrens);
if (discrens = 'SI') then
    BEGIN
    if (exists (select arti_cod from articulo a where arti_cod = new.arti_cod and arti_ensamble = 'S')) then
        BEGIN
        /* EL COSTO TOTAL */
        COSTOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP FROM articulos_producto WHERE ARTI_COD = NEW.arti_cod
            INTO :CANTPR, :UNIPR, :CODPR
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, :fecha, :UNIPR) returning_values (:COSTO);
            COSTOT = COSTOT + (COSTO * CANTPR);
            END
        ITEM = NEW.fade_item * 200;
        /* DESGLOCE EL PRECIO COMPONENTE POR COMPONENTE */
        IVATOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, A.arti_des, T.taiv_porc, a.arti_consumo
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :despr, :IVAPR, :consumopr
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, :fecha, :UNIPR) returning_values (:COSTO);
            if (COSTOT <> 0) then
                COSTO = (NEW.fade_prunit-NEW.fade_dtomonto) * COSTO / COSTOT;
            else
                COSTO = 0;
            ivaprm = costo * ivapr / 100;
            ivatot = ivatot + ivaprm;
            TOTALPR = CANTPR * COSTO;
            if (IVAINC = 'N') then
                TOTALPR = totalPR + ivaprm + consumopr;
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3,
                FADE_CAJAS, FADE_BASE, FADE_PORCBASE)
                VALUES (NEW.fact_id, :ITEM, NEW.bode_cod, :CODPR, :cantpr * NEW.fade_cant * NEW.fade_factor, :unipr, NULL,
                :COSTO, 0, 0, :ivapr, :ivaprm, :consumopr, :factor,
                :despr, NULL, :CODPR, 0, 0, :totalpr, NEW.lipr_cod, new.fade_item || '-' || new.arti_cod,
                'N', 'N', 0, 0, 0, 0, 0, 0, 0, NULL, 0, 0);
            ITEM = ITEM + 1;
            END
        /* DEJE EL ARTICULO ORIGINAL SIN PRECIO */
        NEW.fade_prunit = 0;
        NEW.fade_dtomonto = 0;
        NEW.fade_ivamonto = 0;
        NEW.fade_consumo = 0;
        NEW.fade_total = 0;
        END
    END
/* descuentos por articulo */
EXECUTE PROCEDURE VALIDE_DESCUENTO(NEW.arti_cod, :NIT, :TOTAL, NEW.fade_cant * NEW.fade_factor) returning_values (NEW.fade_iddto, :ok, :DTOP);
if (OK = 'S') then
    BEGIN
    if (NOT EXISTS (SELECT DCTP_ID FROM descuentos_precios_cli WHERE DCTP_ID = NEW.fade_iddto AND TERC_NIT = :NIT AND ARTI_COD = NEW.arti_cod)) then
        insert into DESCUENTOS_PRECIOS_CLI (DCTP_ID, DCPC_ITEM, TERC_NIT, ARTI_COD, DCPC_VENTA)
            values (NEW.fade_iddto, 1, :NIT, NEW.arti_cod, NEW.fade_cant * NEW.fade_factor);
    else
        update descuentos_precios_cli set dcpc_venta = dcpc_venta + NEW.fade_cant * NEW.fade_factor
            WHERE DCTP_ID = NEW.fade_iddto AND TERC_NIT = :NIT AND ARTI_COD = NEW.arti_cod;
    END
if ((NEW.fade_idpend <> 0) AND (NEW.fade_itempend <> 0)) then
    BEGIN
    /* valide que el articulo sea correcto */
    select arti_cod from pendiente_ventas_detalle p where p.pend_id = new.fade_idpend and p.pevd_item = new.fade_itempend into :artic;
    if (NEW.arti_cod = :ARTIC) then
        NEW.fade_remisionado = NEW.fade_cant * NEW.fade_factor;
    else    
        exception articulo_no_existe 'El articulo pendiente ' || :artic || ' no corresponde al articulo facturado ' || new.arti_cod || 'Id:' || new.fade_idpend || '-' || new.fade_itempend;
    END
END
^

/* Trigger: FACTURAS_DETALLE_BU */
CREATE TRIGGER FACTURAS_DETALLE_BU FOR FACTURAS_DETALLE
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (new.fade_cant > 0) then
    begin
    if (new.fade_devuelto > new.fade_cant * new.fade_factor) then
        exception cantidad_cruce_mayor 'La cantidad devuelta es superior a la facturada.';
    if (new.fade_remisionado > new.fade_cant * new.fade_factor) then
        exception cantidad_cruce_mayor 'La cantidad pendiente es superior a la facturada.';
    end
end
^

/* Trigger: FACTURA_CONCEPTO_BI */
CREATE 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
^

/* Trigger: FACTURA_PROFORMA_AD */
CREATE TRIGGER FACTURA_PROFORMA_AD FOR FACTURA_PROFORMA
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS INTEGER;
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
select enco_consec from comprobante_encabezado where enco_tiporef = 137 and enco_idref = old.fapo_id into :consec;
if (NOT consec is null) then
  delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 137 and enco_idref = old.fapo_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 137, OLD.fapo_id, 'D', old.pref_pre || old.fapo_numero);

if ((OLD.fapo_id <> 0) AND (OLD.fapo_anulado = 'N')) then
    BEGIN
/*    SELECT COUNT(*) FROM devoluciones_compras WHERE DVCO_FACTID = OLD.fapo_id INTO :abonos;
    if (abonos > 0) then
        exception documento_devuelto;
    ABONOS = 0;
    select COUNT(*) FROM saldos_doc_cxpagar WHERE SDCP_TIPOREF = 21 AND SDCP_IDREF = OLD.fapo_ID AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then */
        BEGIN
        delete from saldos_doc_cxpagar where sdcp_tiporef = 137 and sdcp_idref = old.fapo_id;
        delete from movimiento_proveedor where (mvpr_tiporef = 137) and (mvpr_idref = old.fapo_id);
        /* ACTUALICE LA CONSOLIDACION */
        if (OLD.fapo_CONSOLIDADO <> 0) then
            UPDATE consolidado_faltantes SET COFA_CANTCR = 0 WHERE COFA_ID = OLD.fapo_consolidado;
        END
/*        else
            exception DOCUMENTO_CON_ABONOS;*/
    END
END
^

/* Trigger: FACTURA_PROFORMA_AI */
CREATE TRIGGER FACTURA_PROFORMA_AI FOR FACTURA_PROFORMA
ACTIVE AFTER INSERT POSITION 0
AS
declare variable CONC VARCHAR(60);
BEGIN
if ((NEW.fapo_ID <> 0) and (new.fapo_anulado = 'N')) then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO saldos_doc_cxpagar(SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_ABONO, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (137, NEW.fapo_ID, NEW.fapo_fecha, NEW.terc_nit, 0, 'S', NEW.fapo_total, NEW.taca_monto);
    /* Registre el movimiento del cliente */
    CONC = 'IMPORTACION No.' || NEW.PREF_PRE || NEW.fapo_NUMERO;
    INSERT INTO movimiento_proveedor(MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO,MVPR_TRM,MVPR_TIPOMON)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 137, NEW.fapo_ID, NEW.fapo_FECHA, NEW.fapo_VENCE, :CONC, NEW.fapo_total, 'S', 'N', NEW.pref_pre, NEW.fapo_numero,NEW.taca_monto,NEW.TIMO_COD);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 137, NEW.fapo_id, 'I', NEW.pref_pre || NEW.fapo_numero);
    END
END
^

/* Trigger: FACTURA_PROFORMA_AU */
CREATE TRIGGER FACTURA_PROFORMA_AU FOR FACTURA_PROFORMA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable consec INTEGER;
BEGIN
if ((old.fapo_id <> 0) AND (OLD.fapo_anulado = 'N')) then
    begin
    /* VERIFIQUE QUE NO HAY DEVOLUCIONES */
    /*    SELECT COUNT(*) FROM devoluciones_compras WHERE DVCO_FACTID = OLD.fapo_id AND DVCO_ANULADO = 'N' INTO :abonos;
    if (abonos > 0) then
        exception documento_devuelto;
    */
    ABONOS = 0;
    delete from saldos_doc_cxpagar where sdcp_tiporef = 137 and sdcp_idref = old.fapo_id;
    delete from movimiento_proveedor where (mvpr_tiporef = 137) and (mvpr_idref = old.fapo_id);
/*    if (OLD.fapo_CONSOLIDADO <> 0) then
            UPDATE consolidado_faltantes SET COFA_CANTCR = 0 WHERE COFA_ID = OLD.fapo_consolidado;*/
        
    if ((NEW.fapo_id <> 0) AND (NEW.fapo_anulado = 'N')) then
        begin
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT,  SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (137, NEW.fapo_ID, NEW.fapo_fecha, NEW.terc_nit, 0, 0, 0, 0, 'N', NEW.fapo_total, NEW.TACA_MONTO);
        /* Registre el movimiento del proveedor */
        CONC = 'IMPORTACION No.' || NEW.PREF_PRE || NEW.fapo_NUMERO;
        INSERT INTO movimiento_proveedor(MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, mvpr_trm, MVPR_TIPOMON)
            VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 137, NEW.fapo_ID, NEW.fapo_FECHA, NEW.fapo_vence, :CONC, NEW.fapo_total, 'S', 'N', NEW.pref_pre, NEW.fapo_numero, new.taca_monto,NEW.TIMO_COD);
        end
    /* si cambia numero o fecha cambie los detalles */
    if ((OLD.pref_pre <> NEW.pref_pre) or
        (OLD.fapo_numero <> NEW.fapo_numero) or
        (OLD.fapo_fecha <> NEW.fapo_fecha)) then
        UPDATE factura_proforma_det SET fpde_TRANSMIT = 'N' WHERE fapo_ID = NEW.fapo_ID;
    /* ACTUALICE EL ANULADO EN LOS DETALLES */
    if (OLD.fapo_anulado <> NEW.fapo_anulado) then
        begin
        UPDATE factura_proforma_det SET fpde_ANULADO = NEW.fapo_anulado WHERE fapo_ID = NEW.fapo_ID;
        UPDATE factura_proforma_gastos SET fpga_ANULADO = NEW.fapo_anulado WHERE fapo_ID = NEW.fapo_ID;
        end
    if (OLD.fapo_transmit <> NEW.fapo_transmit) then
        UPDATE factura_proforma_det SET fpde_TRANSMIT = NEW.fapo_transmit WHERE fapo_ID = NEW.fapo_ID;
    if (OLD.fapo_estado <> NEW.fapo_estado) then
        UPDATE factura_proforma_det SET fpde_TRANSMIT = NEW.fapo_transmit WHERE fapo_ID = NEW.fapo_ID;

    if ((OLD.fapo_anulado = 'N') and (NEW.fapo_anulado = 'S')) then
        begin
        INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
            VALUES (USER, 137, NEW.fapo_id, 'A', NEW.pref_pre || NEW.fapo_numero);
        select enco_consec from comprobante_encabezado where enco_tiporef = 137 and enco_idref = old.fapo_id into :consec;
        if (NOT consec is null) then
          delete from comprobante_detalle where enco_consec = :consec;
        delete from comprobante_encabezado where enco_tiporef = 137 and enco_idref = old.fapo_id;
        end
    else
        INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
            VALUES (USER, 137, NEW.fapo_id, 'U', NEW.pref_pre || NEW.fapo_numero);
    END
END
^

/* Trigger: FACTURA_PROFORMA_BI */
CREATE TRIGGER FACTURA_PROFORMA_BI FOR FACTURA_PROFORMA
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 = 137 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.fapo_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 137 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.fapo_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 137 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.fapo_numero) returning_values (NEW.fapo_numero);
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM factura_proforma WHERE PREF_PRE = NEW.PREF_PRE AND fapo_NUMERO = NEW.fapo_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
if (new.fapo_estado = 'C') then
    if (new.fapo_feccie is null) then
        new.fapo_feccie = new.fapo_fecha;
END
^

/* Trigger: FACTURA_PROFORMA_DET_BU */
CREATE TRIGGER FACTURA_PROFORMA_DET_BU FOR FACTURA_PROFORMA_DET
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  if (new.fpde_cant is null) then
    new.fpde_cant = 0;
  if (new.fpde_prunit is null) then
    new.fpde_prunit = 0;
  if (new.fpde_dtoporc is null) then
    new.fpde_dtoporc = 0;
  if (new.fpde_ivaporc is null) then
    new.fpde_ivaporc = 0;
  if (new.fpde_ivamonto is null) then
    new.fpde_ivamonto = 0;
  if (new.fpde_consumo is null) then
    new.fpde_consumo = 0;
  if (new.fpde_flete is null) then
    new.fpde_flete = 0;
  if (new.fpde_seguro is null) then
    new.fpde_seguro = 0;
  if (new.fpde_otrogto is null) then
    new.fpde_otrogto = 0;
  new.fpde_totgtos = new.fpde_ivamonto + new.fpde_flete + new.fpde_seguro + new.fpde_otrogto;
  NEW.fpde_DTOMONTO = NEW.fpde_prunit * NEW.fpde_dtoporc / 100;
  new.fpde_total = new.fpde_cant * (new.fpde_prunit - NEW.fpde_DTOMONTO);
  execute procedure factor_unidad_cant(new.arti_cod, new.fpde_unidad) returning_values (new.fpde_factor);
end
^

/* Trigger: FACTURA_PROFORMA_GASTOS_AD */
CREATE TRIGGER FACTURA_PROFORMA_GASTOS_AD FOR FACTURA_PROFORMA_GASTOS
ACTIVE AFTER DELETE POSITION 0
as
declare variable tipo integer;
begin
if ((old.fapo_id <> 0) AND (OLD.fpga_anulado = 'N')) then
    begin
    SELECT TIGI_TIPODOC FROM tipo_gastos_importacion
        WHERE TIGI_COD = old.tigi_cod INTO :TIPO;
    if (TIPO = 51) then
        update notas_debito_proveedor set ndpr_anulado = 'S' where ndpr_id = old.fpga_idgto;
    else
        update notas_credito_proveedor set ncpr_anulado = 'S' where ncpr_id = old.fpga_idgto;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 138, OLD.fapo_id, 'A', OLD.fpga_numprov);
    end
end
^

/* Trigger: FACTURA_PROFORMA_GASTOS_AI */
CREATE TRIGGER FACTURA_PROFORMA_GASTOS_AI FOR FACTURA_PROFORMA_GASTOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable tipo char(1);
declare variable liquida char(1);
declare variable total double precision;
declare variable totitem double precision;
declare variable item integer;
declare variable gasto double precision;
begin
if (new.fpga_trm <> 0) then
    gasto = new.fpga_valor * new.fpga_trm;
/* calcule la proporcion por item ya sea por peso, volumen, cantidad o valor */
select t.tigi_tipo, t.tigi_liquidacion from tipo_gastos_importacion t where t.tigi_cod = new.tigi_cod
    into :tipo, :liquida;
if (liquida = 'C') then
    begin
    /* cubicaje-volumen */
    select sum(fd.fpde_volumen) from factura_proforma_det fd where fd.fapo_id = new.fapo_id into :total;
    for select fd.fpde_item, fd.fpde_volumen from factura_proforma_det fd where fd.fapo_id = new.fapo_id
        into :item, :totitem
        do
        begin
        if (tipo = 'F') then
            update factura_proforma_det fd
                set fd.fpde_flete = fpde_flete + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'S') then
            update factura_proforma_det fd
                set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'I') then
            update factura_proforma_det fd
                set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'O') then
            update factura_proforma_det fd
                set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        end
    end
if (liquida = 'P') then
    begin
    /* peso */
    select sum(fd.fpde_peso) from factura_proforma_det fd where fd.fapo_id = new.fapo_id into :total;
    for select fd.fpde_item, fd.fpde_peso from factura_proforma_det fd where fd.fapo_id = new.fapo_id
        into :item, :totitem
        do
        begin
        if (tipo = 'F') then
            update factura_proforma_det fd
                set fd.fpde_flete = fpde_flete + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'S') then
            update factura_proforma_det fd
                set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'I') then
            update factura_proforma_det fd
                set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'O') then
            update factura_proforma_det fd
                set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        end
    end
if (liquida = 'T') then
    begin
    /* cantidad total */
    select sum(fd.fpde_cant * fd.fpde_factor) from factura_proforma_det fd where fd.fapo_id = new.fapo_id into :total;
    for select fd.fpde_item, fd.fpde_cant * fd.fpde_factor from factura_proforma_det fd where fd.fapo_id = new.fapo_id
        into :item, :totitem
        do
        begin
        if (tipo = 'F') then
            update factura_proforma_det fd
                set fd.fpde_flete = fpde_flete + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'S') then
            update factura_proforma_det fd
                set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'I') then
            update factura_proforma_det fd
                set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'O') then
            update factura_proforma_det fd
                set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        end
    end
if (liquida = 'V') then
    begin
    /* valor */
    select sum(fd.fpde_fob) from factura_proforma_det fd where fd.fapo_id = new.fapo_id into :total;
    for select fd.fpde_item, fd.fpde_fob from factura_proforma_det fd where fd.fapo_id = new.fapo_id
        into :item, :totitem
        do
        begin
        if (tipo = 'F') then
            update factura_proforma_det fd
                set fd.fpde_flete = fpde_flete + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'S') then
            update factura_proforma_det fd
                set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'I') then
            update factura_proforma_det fd
                set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        if (tipo = 'O') then
            update factura_proforma_det fd
                set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :totitem / :total)
            where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
        end
    end
end
^

/* Trigger: FACTURA_PROFORMA_GASTOS_AI0 */
CREATE TRIGGER FACTURA_PROFORMA_GASTOS_AI0 FOR FACTURA_PROFORMA_GASTOS
ACTIVE AFTER INSERT POSITION 0
AS
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 138, NEW.fapo_id, 'I', NEW.fpga_numprov);
end
^

/* Trigger: FACTURA_PROFORMA_GASTOS_AU0 */
CREATE TRIGGER FACTURA_PROFORMA_GASTOS_AU0 FOR FACTURA_PROFORMA_GASTOS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable tipodoc integer;
declare variable tipo char(1);
declare variable liquida char(1);
declare variable total double precision;
declare variable totitem double precision;
declare variable item integer;
declare variable gasto double precision;
begin
if ((old.fapo_id <> 0) AND (OLD.fpga_anulado = 'N')) then
    begin
    if ((NEW.fapo_id <> 0) AND (NEW.fpga_anulado = 'S')) then
        begin
        if (new.fpga_trm <> 0) then
            gasto = new.fpga_valor * new.fpga_trm;
        /* calcule la proporcion por item ya sea por peso, volumen, cantidad o valor */
        select t.tigi_tipo, t.tigi_liquidacion, TIGI_TIPODOC from tipo_gastos_importacion t where t.tigi_cod = new.tigi_cod
            into :tipo, :liquida, :TIPODOC;
        if (liquida = 'C') then
            begin
            /* cubicaje-volumen */
            select sum(fd.fpde_volumen) from factura_proforma_det fd where fd.fapo_id = new.fapo_id into :total;
            for select fd.fpde_item, fd.fpde_volumen from factura_proforma_det fd where fd.fapo_id = new.fapo_id
                into :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update factura_proforma_det fd
                        set fd.fpde_flete = fpde_flete - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'S') then
                    update factura_proforma_det fd
                        set fd.fpde_seguro = fd.fpde_seguro - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'I') then
                    update factura_proforma_det fd
                        set fd.fpde_ivamonto = fd.fpde_ivamonto - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'O') then
                    update factura_proforma_det fd
                        set fd.fpde_otrogto = fd.fpde_otrogto - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                end
            end
        if (liquida = 'P') then
            begin
            /* peso */
            select sum(fd.fpde_peso) from factura_proforma_det fd where fd.fapo_id = new.fapo_id into :total;
            for select fd.fpde_item, fd.fpde_peso from factura_proforma_det fd where fd.fapo_id = new.fapo_id
                into :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update factura_proforma_det fd
                        set fd.fpde_flete = fpde_flete - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'S') then
                    update factura_proforma_det fd
                        set fd.fpde_seguro = fd.fpde_seguro - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'I') then
                    update factura_proforma_det fd
                        set fd.fpde_ivamonto = fd.fpde_ivamonto - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'O') then
                    update factura_proforma_det fd
                        set fd.fpde_otrogto = fd.fpde_otrogto - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                end
            end
        if (liquida = 'T') then
            begin
            /* cantidad total */
            select sum(fd.fpde_cant * fd.fpde_factor) from factura_proforma_det fd where fd.fapo_id = new.fapo_id into :total;
            for select fd.fpde_item, fd.fpde_cant * fd.fpde_factor from factura_proforma_det fd where fd.fapo_id = new.fapo_id
                into :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update factura_proforma_det fd
                        set fd.fpde_flete = fpde_flete - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'S') then
                    update factura_proforma_det fd
                        set fd.fpde_seguro = fd.fpde_seguro - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'I') then
                    update factura_proforma_det fd
                        set fd.fpde_ivamonto = fd.fpde_ivamonto - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'O') then
                    update factura_proforma_det fd
                        set fd.fpde_otrogto = fd.fpde_otrogto - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                end
            end
        if (liquida = 'V') then
            begin
            /* valor */
            select sum(fd.fpde_fob) from factura_proforma_det fd where fd.fapo_id = new.fapo_id into :total;
            for select fd.fpde_item, fd.fpde_fob from factura_proforma_det fd where fd.fapo_id = new.fapo_id
                into :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update factura_proforma_det fd
                        set fd.fpde_flete = fpde_flete - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'S') then
                    update factura_proforma_det fd
                        set fd.fpde_seguro = fd.fpde_seguro - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'I') then
                    update factura_proforma_det fd
                        set fd.fpde_ivamonto = fd.fpde_ivamonto - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                if (tipo = 'O') then
                    update factura_proforma_det fd
                        set fd.fpde_otrogto = fd.fpde_otrogto - (:gasto * :totitem / :total)
                    where fd.fapo_id = new.fapo_id and fd.fpde_item = :item;
                end
            end
        if (TIPODOC = 51) then
            update notas_debito_proveedor set ndpr_anulado = 'S' where ndpr_id = old.fpga_idgto;
        else
            update notas_credito_proveedor set ncpr_anulado = 'S' where ncpr_id = old.fpga_idgto;
        INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
            VALUES (USER, 138, NEW.fapo_id, 'A', NEW.fpga_numprov);
        end
    END
end
^

/* Trigger: FACTURA_PROFORMA_GASTOS_BI0 */
CREATE TRIGGER FACTURA_PROFORMA_GASTOS_BI0 FOR FACTURA_PROFORMA_GASTOS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable TIPO INTEGER;
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable CTACONTA VARCHAR(15);
declare variable CTAGASTO VARCHAR(15);
declare variable IDC INTEGER;
declare variable IDI INTEGER;
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
begin
 if (new.fpga_valorcub is null) then
    new.fpga_valorcub = 0;
 if (new.fpga_valorcpes is null) then
    new.fpga_valorcpes = 0;
 if (new.fpga_valorcant is null) then
    new.fpga_valorcant = 0;
SELECT TIGI_PREF, TIGI_CTACONTA, TIGI_CTAGASTO, TIGI_TIPODOC FROM tipo_gastos_importacion WHERE TIGI_COD = NEW.tigi_cod
    INTO :PREF, :CTACONTA, :CTAGASTO, :TIPO;
if (TIPO = 51) then
    BEGIN
    NEW.fpga_idgto = GEN_ID(id_notadbprov,1);
    /* grabe el gasto */
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 51 AND PREF_PRE = :PREF INTO :NUMERO;
    SELECT FP.fapo_proy, FP.fapo_centro FROM factura_proforma FP WHERE FP.fapo_id = NEW.fapo_id
        INTO :PROY, :CENTRO;
    
    INSERT INTO NOTAS_DEBITO_PROVEEDOR (NDPR_ID, TERC_NIT, TIDO_COD, PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_CONC, 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, NDPR_ANULADO, NDPR_TRANSMIT,
        NDPR_PROY, NDPR_CENTRO, NDPR_CTACAUSA, NDPR_CTAPAGAR, NDPR_NUMPROV, NDPR_USUARIO, NUMOK, NDPR_TRM, NDPR_BASERTFTE,
        NDPR_BASE1, NDPR_IVA1, NDPR_BASE2, NDPR_IVA2, NDPR_BASE0, ARTI_COD, NDPR_RTCREE, NDPR_RTCREEM, NDPR_MONEDA,
        NDPR_TIPOAPL, NDPR_NUMAPL, NDPR_INALCM, NDPR_FACID, NDPR_BASE3, NDPR_IVA3, NDPR_CTACAUSAN, NDPR_CTAPAGARN)
        VALUES (new.fpga_idgto, new.terc_nit, 51, :PREF, :NUMERO, NEW.fpga_fecha, NEW.fpga_conc, NEW.fpga_vence,
        NEW.fpga_valor, NEW.fpga_ivaporc, NEW.fpga_ivamonto, NEW.fpga_rtfteporc, NEW.fpga_rtftemonto, NEW.fpga_rtivaporc, NEW.fpga_rtivamonto,
        NEW.fpga_rticaporc, NEW.fpga_rticamonto, NULL, 0, 0, NULL, 'N', 'N',
        :PROY, :CENTRO, :ctagasto, :ctaconta, NEW.fpga_numprov, USER, 'N', NEW.fpga_trm, NEW.fpga_baseret,
        NEW.fpga_basegr, NEW.fpga_ivamonto, 0, 0, NEW.fpga_baseex, NULL, NEW.fpga_rtcree, NEW.fpga_rtcreem, NEW.fpga_moneda,
        0, NULL, 0, 0, 0, 0, NULL, NULL);
    SELECT FIRST 1 INCP_ID FROM interfaz_cxpagar WHERE PREF_PRE = :pref AND TIDO_COD = 51 INTO :IDI;
    EXECUTE PROCEDURE contabil_notadbpr (new.fpga_idgto, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    END
ELSE
    BEGIN
    NEW.fpga_idgto = GEN_ID(id_notacrprov,1);
    /* grabe el DESCUENTO */
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 52 AND PREF_PRE = :PREF INTO :NUMERO;

    INSERT INTO NOTAS_CREDITO_PROVEEDOR (NCPR_ID, TERC_NIT, TIDO_COD, PREF_PRE, NCPR_NUMERO, NCPR_FECHA, NCPR_CONC, NCPR_MONTO,
        NCPR_IVAPORC, NCPR_IVAMONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO,
        NCPR_DTOFECHA, NCPR_DTOFPORC, NCPR_DTOFMONTO, NCPR_OBS, NCPR_ANULADO, NCPR_TRANSMIT, ARTI_COD, NCPR_CTACAUSA, NCPR_CTAPAGAR,
        NCPR_USUARIO, NUMOK, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2, NCPR_RTCREE, NCPR_RTCREEM, NCPR_BASERTFTE,
        NCPR_INALCM, NCPR_FACID, NCPR_BASE3, NCPR_IVA3, NCPR_CTACAUSAN, NCPR_CTAPAGARN, NCPR_NUMPROV, NCPR_MONEDA, NCPR_TRM)
        VALUES (new.fpga_idgto, new.terc_nit, 52, :PREF, :NUMERO, NEW.fpga_fecha, NEW.fpga_conc, NEW.fpga_valor,
        NEW.fpga_ivaporc, NEW.fpga_ivamonto, NEW.fpga_rtfteporc, NEW.fpga_rtftemonto, NEW.fpga_rtivaporc, NEW.fpga_rtivamonto, NEW.fpga_rticaporc, NEW.fpga_rticamonto,
        NULL, 0, 0, NULL, 'N', 'N', NULL, :ctagasto, :ctaconta,
        USER, 'N', NEW.fpga_baseex, NEW.fpga_basegr, 0, NEW.fpga_ivamonto, 0, NEW.fpga_rtcree, NEW.fpga_rtcreem, NEW.fpga_valor-NEW.fpga_ivamonto,
        0, NULL, 0, 0, NULL, NULL, NEW.fpga_numprov, NEW.fpga_moneda, NEW.fpga_trm);
    SELECT FIRST 1 INCP_ID FROM interfaz_cxpagar WHERE PREF_PRE = :pref AND TIDO_COD = 52 INTO :IDI;
    EXECUTE PROCEDURE contabil_notacrpr (new.fpga_idgto, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    END
end
^

/* Trigger: FACTURA_PROFORMA_GASTOS_BU */
CREATE TRIGGER FACTURA_PROFORMA_GASTOS_BU FOR FACTURA_PROFORMA_GASTOS
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable TIPO INTEGER;
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable CTACONTA VARCHAR(15);
declare variable CTAGASTO VARCHAR(15);
declare variable IDC INTEGER;
declare variable IDI INTEGER;
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
begin
if (OLD.fpga_idgto IS NULL) then
    BEGIN
    SELECT TIGI_PREF, TIGI_CTACONTA, TIGI_CTAGASTO, TIGI_TIPODOC FROM tipo_gastos_importacion WHERE TIGI_COD = NEW.tigi_cod
        INTO :PREF, :CTACONTA, :CTAGASTO, :TIPO;
    if (TIPO = 51) then
        BEGIN
        NEW.fpga_idgto = GEN_ID(id_notadbprov,1);
        /* grabe el gasto */
        SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 51 AND PREF_PRE = :PREF INTO :NUMERO;
        INSERT INTO NOTAS_DEBITO_PROVEEDOR (NDPR_ID, TERC_NIT, TIDO_COD, PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_CONC, 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, NDPR_ANULADO, NDPR_TRANSMIT,
            NDPR_PROY, NDPR_CENTRO, NDPR_CTACAUSA, NDPR_CTAPAGAR, NDPR_NUMPROV, NDPR_USUARIO, NUMOK, NDPR_TRM,
            NDPR_BASE1, NDPR_IVA1, NDPR_BASE2, NDPR_IVA2, NDPR_BASE0, ARTI_COD, NDPR_RTCREE, NDPR_RTCREEM, NDPR_MONEDA,
            NDPR_TIPOAPL, NDPR_NUMAPL, NDPR_INALCM, NDPR_FACID, NDPR_BASE3, NDPR_IVA3, NDPR_CTACAUSAN, NDPR_CTAPAGARN)
            VALUES (new.fpga_idgto, new.terc_nit, 51, :PREF, :NUMERO, NEW.fpga_fecha, NEW.fpga_conc, NEW.fpga_vence,
            NEW.fpga_valor, NEW.fpga_ivaporc, NEW.fpga_ivamonto, NEW.fpga_rtfteporc, NEW.fpga_rtftemonto, NEW.fpga_rtivaporc, NEW.fpga_rtivamonto,
            NEW.fpga_rticaporc, NEW.fpga_rticamonto, NULL, 0, 0, NULL, 'N', 'N',
            NULL, NULL, :ctagasto, :ctaconta, NEW.fpga_numprov, USER, 'N', NEW.fpga_trm,
            NEW.fpga_basegr, NEW.fpga_ivamonto, 0, 0, NEW.fpga_baseex, NULL, NEW.fpga_rtcree, NEW.fpga_rtcreem, NEW.fpga_moneda,
            0, NULL, 0, 0, 0, 0, NULL, NULL);
        SELECT FIRST 1 INCP_ID FROM interfaz_cxpagar WHERE PREF_PRE = :pref AND TIDO_COD = 51 INTO :IDI;
        EXECUTE PROCEDURE contabil_notadbpr (new.fpga_idgto, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
        if (ERROR = 0) then
            EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        END
    ELSE
        BEGIN
        NEW.fpga_idgto = GEN_ID(id_notacrprov,1);
        /* grabe el DESCUENTO */
        SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 52 AND PREF_PRE = :PREF INTO :NUMERO;
    
        INSERT INTO NOTAS_CREDITO_PROVEEDOR (NCPR_ID, TERC_NIT, TIDO_COD, PREF_PRE, NCPR_NUMERO, NCPR_FECHA, NCPR_CONC, NCPR_MONTO,
            NCPR_IVAPORC, NCPR_IVAMONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO,
            NCPR_DTOFECHA, NCPR_DTOFPORC, NCPR_DTOFMONTO, NCPR_OBS, NCPR_ANULADO, NCPR_TRANSMIT, ARTI_COD, NCPR_CTACAUSA, NCPR_CTAPAGAR,
            NCPR_USUARIO, NUMOK, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2, NCPR_RTCREE, NCPR_RTCREEM,
            NCPR_INALCM, NCPR_FACID, NCPR_BASE3, NCPR_IVA3, NCPR_CTACAUSAN, NCPR_CTAPAGARN, NCPR_NUMPROV, NCPR_MONEDA, NCPR_TRM)
            VALUES (new.fpga_idgto, new.terc_nit, 52, :PREF, :NUMERO, NEW.fpga_fecha, NEW.fpga_conc, NEW.fpga_valor,
            NEW.fpga_ivaporc, NEW.fpga_ivamonto, NEW.fpga_rtfteporc, NEW.fpga_rtftemonto, NEW.fpga_rtivaporc, NEW.fpga_rtivamonto, NEW.fpga_rticaporc, NEW.fpga_rticamonto,
            NULL, 0, 0, NULL, 'N', 'N', NULL, :ctagasto, :ctaconta,
            USER, 'N', NEW.fpga_baseex, NEW.fpga_basegr, 0, NEW.fpga_ivamonto, 0, NEW.fpga_rtcree, NEW.fpga_rtcreem,
            0, NULL, 0, 0, NULL, NULL, NEW.fpga_numprov, NEW.fpga_moneda, NEW.fpga_trm);
        SELECT FIRST 1 INCP_ID FROM interfaz_cxpagar WHERE PREF_PRE = :pref AND TIDO_COD = 52 INTO :IDI;
        EXECUTE PROCEDURE contabil_notacrpr (new.fpga_idgto, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
        if (ERROR = 0) then
            EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        END
    END
end
^

/* Trigger: FACTURA_WEB_AD */
CREATE TRIGGER FACTURA_WEB_AD FOR FACTURA_WEB
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 234, OLD.facw_id, 'D', OLD.terc_nit);
end
^

/* Trigger: FACTURA_WEB_AI */
CREATE TRIGGER FACTURA_WEB_AI FOR FACTURA_WEB
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 236, NEW.facw_id, 'I', NEW.terc_nit);
end
^

/* Trigger: FACTURA_WEB_AU */
CREATE TRIGGER FACTURA_WEB_AU FOR FACTURA_WEB
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 234, NEW.facw_id, 'U', NEW.terc_nit);
end
^

/* Trigger: FACTURA_WEB_BI */
CREATE TRIGGER FACTURA_WEB_BI FOR FACTURA_WEB
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECSERVER CHAR(2);
begin
if (NEW.facw_fecha IS NULL) then
    NEW.facw_fecha = CAST ('NOW' AS DATE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.facw_fecha = CAST ('NOW' AS DATE);
if (new.facw_sucursal is null) then
    select first 1 clcu_cod from cliente_sucursales where terc_nit = new.terc_nit into new.facw_sucursal;

SELECT PT.pref_pre FROM PUNTO_VENTA PT, VENDEDORES V WHERE V.vend_cod = new.vend_cod AND V.ptvt_id = PT.ptvt_id INTO new.facw_pref;
if (NEW.facw_ivamonto IS NULL) then
    NEW.facw_ivamonto = 0;
if (NEW.facw_total IS NULL) then
    NEW.facw_total = 0;
if (NEW.facw_dtoporc IS NULL) then
    NEW.facw_dtoporc = 0;
ELSE
    if (NEW.facw_dtomonto IS NULL) then
        NEW.facw_dtomonto = (NEW.facw_total - NEW.facw_ivamonto) * NEW.facw_dtoporc / 100;
if (NEW.facw_adicional IS NULL) then
    NEW.facw_adicional = 0;
if (NEW.facw_extra IS NULL) then
    NEW.facw_extra = 0;
if (NEW.facw_rtfteporc IS NULL) then
    NEW.facw_rtfteporc = 0;
if (NEW.facw_rtivaporc IS NULL) then
    NEW.facw_rtivaporc = 0;
if (NEW.facw_rticaporc IS NULL) then
    NEW.facw_rticaporc = 0;
if (NEW.facw_entrega IS NULL) then
    NEW.facw_entrega = NEW.facw_fecha;
end
^

/* Trigger: FACTURA_WEB_BU */
CREATE TRIGGER FACTURA_WEB_BU FOR FACTURA_WEB
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
begin
if (NEW.facw_dtoporc IS NULL) then
    NEW.facw_dtoporc = 0;
ELSE
    if ((NEW.facw_dtomonto IS NULL) or (new.facw_dtomonto = 0)) then
        NEW.facw_dtomonto = (NEW.facw_total - NEW.facw_ivamonto) * NEW.facw_dtoporc / 100;
if (NEW.facw_adicional IS NULL) then
    NEW.facw_adicional = 0;
if (NEW.facw_extra IS NULL) then
    NEW.facw_extra = 0;
if (NEW.facw_rtfteporc IS NULL) then
    NEW.facw_rtfteporc = 0;
if (NEW.facw_rtivaporc IS NULL) then
    NEW.facw_rtivaporc = 0;
if (NEW.facw_rticaporc IS NULL) then
    NEW.facw_rticaporc = 0;
/* actualice los totales del encabezado */
SELECT SUM(FAWD_TOTAL), SUM(FAWD_IVAMONTO) FROM factura_web_detalle PD
    WHERE FACW_ID = NEW.facw_id INTO :TOTAL, :IVAMONTO;

NEW.facw_ivamonto = :IVAMONTO * (100 - new.facw_dtoporc) / 100;
NEW.facw_total = :TOTAL - NEW.facw_dtomonto + NEW.facw_adicional + NEW.facw_extra;
end
^

/* Trigger: FACTURA_WEB_DETALLE_AD */
CREATE TRIGGER FACTURA_WEB_DETALLE_AD FOR FACTURA_WEB_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
begin
/* actualice los totales del encabezado */
SELECT SUM(fawd_total), SUM(FAWD_IVAMONTO) FROM factura_web_detalle FD
    WHERE FACW_ID = OLD.facw_id INTO :TOTAL, :IVAMONTO;
if (total is null) then
    TOTAL = 0;
if (IVAMONTO is null) then
    IVAMONTO = 0;
UPDATE FACTURA_WEB
    SET FACW_IVAMONTO = :IVAMONTO * (100 - FACW_DTOPORC) / 100,
        FACW_DTOMONTO = (:TOTAL - :IVAMONTO) * FACW_DTOPORC / 100,
        FACW_TOTAL = :TOTAL - FACW_DTOMONTO + FACW_ADICIONAL + FACW_EXTRA
    WHERE FACW_ID = OLD.facw_id;
end
^

/* Trigger: FACTURA_WEB_DETALLE_AI */
CREATE TRIGGER FACTURA_WEB_DETALLE_AI FOR FACTURA_WEB_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
begin
/* actualice los totales del encabezado */
SELECT SUM(fawd_total), SUM(FAWD_IVAMONTO) FROM factura_web_detalle FD
    WHERE FACW_ID = NEW.facw_id INTO :TOTAL, :IVAMONTO;
UPDATE FACTURA_WEB
    SET FACW_IVAMONTO = :IVAMONTO * (100 - FACW_DTOPORC) / 100,
        FACW_DTOMONTO = (:TOTAL - :IVAMONTO) * FACW_DTOPORC / 100,
        FACW_TOTAL = :TOTAL - FACW_DTOMONTO + FACW_ADICIONAL + FACW_EXTRA
    WHERE FACW_ID = NEW.facw_id;
end
^

/* Trigger: FACTURA_WEB_DETALLE_AU */
CREATE TRIGGER FACTURA_WEB_DETALLE_AU FOR FACTURA_WEB_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
begin
/* actualice los totales del encabezado */
SELECT SUM(fawd_total), SUM(FAWD_IVAMONTO) FROM factura_web_detalle FD
    WHERE FACW_ID = NEW.facw_id INTO :TOTAL, :IVAMONTO;
UPDATE FACTURA_WEB
    SET FACW_IVAMONTO = :IVAMONTO * (100 - FACW_DTOPORC) / 100,
        FACW_DTOMONTO = (:TOTAL - :IVAMONTO) * FACW_DTOPORC / 100,
        FACW_TOTAL = :TOTAL - FACW_DTOMONTO + FACW_ADICIONAL + FACW_EXTRA
    WHERE FACW_ID = NEW.facw_id;
end
^

/* Trigger: FACTURA_WEB_DETALLE_BI */
CREATE TRIGGER FACTURA_WEB_DETALLE_BI FOR FACTURA_WEB_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable UNIDAD VARCHAR(8);
declare variable DTOGRUPO VARCHAR(10);
declare variable DTOG NUMERIC(9,4);
declare variable DTOL NUMERIC(9,4);
declare variable IVAP NUMERIC(18,2);
declare variable BOD VARCHAR(2);
declare variable PREF VARCHAR(4);
declare variable IVAINC CHAR(1);
declare variable ICOINC char(2);
declare variable DIGITOS INTEGER;
begin
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
execute procedure lee_configuracion('FACTURACION','DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (DIGITOS);
/* el item */
if (new.fawd_item is null) then
  begin
  SELECT MAX(fawd_item)+1 FROM factura_web_detalle WHERE facw_id = NEW.facw_id INTO NEW.fawd_item;
  if (NEW.fawd_item IS NULL) then
    NEW.fawd_item = 1;
  end
if (new.arti_cod is null) then
    begin
    SELECT FIRST 1 ARTI_COD, COBA_UNIDAD from BARRAS_ARTICULO WHERE COBA_COD = new.fawd_codbar AND COBA_ACTIVO = 'S'
        INTO new.arti_cod, :UNIDAD;
    if (new.arti_cod is null) then
        begin
        SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = new.fawd_codbar and esar_cod = 'A'
            INTO new.arti_cod, :UNIDAD;
        if (new.arti_cod is null) then
            exception articulo_no_existe 'No se encontro el artÃ­culo ' || new.fawd_codbar;
        ELSE
            if (new.fawd_unidad is null) then
                NEW.fawd_unidad = :UNIDAD;
        end
    else
        if (new.fawd_unidad is null) then
            NEW.fawd_unidad = :UNIDAD;
    end
EXECUTE PROCEDURE factor_unidad_cant(NEW.arti_cod, NEW.fawd_unidad) returning_values(NEW.fawd_factor);

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

if ((NEW.fawd_dto1 IS NULL) or (new.fawd_dto1 = 0)) then
    BEGIN
    select prar_dto1 from precios_articulo where arti_cod = NEW.arti_cod and lipr_cod = new.lipr_cod INTO NEW.fawd_dto1;
    if (NEW.fawd_dto1 IS NULL) then
        NEW.fawd_dto1 = 0;
    END
if ((NEW.fawd_dto2 IS NULL) or (new.fawd_dto2 = 0)) then
    BEGIN
    select prar_dto2 from precios_articulo where arti_cod = NEW.arti_cod and lipr_cod = new.lipr_cod INTO NEW.fawd_dto2;
    if (NEW.fawd_dto2 IS NULL) then
        NEW.fawd_dto2 = 0;
    END
if (NEW.fawd_dto3 IS NULL) then
    NEW.fawd_dto3 = 0;
/* CALCULE EL MONTO DEL DESCUENTO */
new.fawd_dtom = new.fawd_prunit * new.fawd_dtop / 100;
if (new.fawd_dto1m is null) then
    new.fawd_dto1m = round((new.fawd_cant * (new.fawd_prunit - new.fawd_dtom)) * new.fawd_dto1, :digitos*-1);
if (new.fawd_dto2m is null) then
    new.fawd_dto2m = round((new.fawd_cant * (new.fawd_prunit - new.fawd_dtom) - new.fawd_dto1m) * new.fawd_dto2, :digitos*-1);
if (new.fawd_dto3m is null) then
    new.fawd_dto3m = round((new.fawd_cant * (new.fawd_prunit - new.fawd_dtom) - new.fawd_dto1m - new.fawd_dto2m) * new.fawd_dto3, :digitos*-1);

/* LA BODEGA Y LOS IMPUESTOS DEPENDEN DEL ENCABEZADO */
SELECT PT.BODE_COD, FACW_PREF FROM factura_web f, PUNTO_VENTA PT, VENDEDORES V
    WHERE FACW_ID = NEW.facw_id AND f.vend_cod = V.vend_cod AND PT.ptvt_id = V.ptvt_id
    INTO :BOD, :PREF;
if (new.bode_cod is null) then
    new.bode_cod = :BOD;

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

/* CALCULE EL IVA, CONSUMO Y TOTAL */
SELECT PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IVAINC;
SELECT TAIV_PORC FROM tarifa_iva T, ARTICULO A WHERE T.taiv_cod = A.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :IVAP;
new.fawd_ivap = :ivap;
if ((new.fawd_ivamonto is null) or (NEW.fawd_ivamonto = 0)) then
    begin
    if (IVAINC = 'N') then
        begin
        if (ICOINC = 'SI') then
            new.fawd_ivamonto = round(((new.fawd_cant * (new.fawd_prunit - new.fawd_dtom) - new.fawd_dto1m - new.fawd_dto2m - new.fawd_dto3m - new.fawd_consumo) / 100) * :IVAP, :digitos*-1);
        else
            new.fawd_ivamonto = round(((new.fawd_cant * (new.fawd_prunit - new.fawd_dtom) - new.fawd_dto1m - new.fawd_dto2m - new.fawd_dto3m) / 100) * :IVAP, :digitos*-1);
        end
    else
        new.fawd_ivamonto = round(((new.fawd_cant * (new.fawd_prunit - new.fawd_dtom) - new.fawd_dto1m - new.fawd_dto2m - new.fawd_dto3m - new.fawd_consumo) / (100 + :IVAP)) * :IVAP, :digitos*-1);
    end
if ((new.fawd_total is null) or (new.fawd_total = 0)) then
    begin
    if (ICOINC = 'SI') then
        new.fawd_total = round((new.fawd_cant * (new.fawd_prunit - new.fawd_dtom) - new.fawd_dto1m - new.fawd_dto2m - new.fawd_dto3m), :digitos*-1);
    else
        new.fawd_total = round((new.fawd_cant * (new.fawd_prunit - new.fawd_dtom) - new.fawd_dto1m - new.fawd_dto2m - new.fawd_dto3m + new.fawd_consumo), :digitos*-1);
    if (IVAINC = 'N') then
        new.fawd_total = new.fawd_total + new.fawd_ivamonto;
    end

end
^

/* Trigger: FLUJO_EFECTIVO_BI */
CREATE TRIGGER FLUJO_EFECTIVO_BI FOR FLUJO_EFECTIVO
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (NEW.flef_niif IS NULL) then
    NEW.flef_niif = 'N';
end
^

/* Trigger: FORMAS_PAGO_BI */
CREATE TRIGGER FORMAS_PAGO_BI FOR FORMAS_PAGO
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.fopa_consigna IS NULL) then
    NEW.fopa_consigna = 'N';
end
^

/* Trigger: FORMATOS_AD */
CREATE TRIGGER FORMATOS_AD FOR FORMATOS
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1000+old.tido_cod, 1, 'D', old.pref_pre);
end
^

/* Trigger: FORMATOS_AI */
CREATE TRIGGER FORMATOS_AI FOR FORMATOS
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1000+new.tido_cod, 1, 'I', new.pref_pre);
end
^

/* Trigger: FORMATOS_AU */
CREATE TRIGGER FORMATOS_AU FOR FORMATOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1000+new.tido_cod, 1, 'U', new.pref_pre);
end
^

/* Trigger: FORMATOS_BI */
CREATE TRIGGER FORMATOS_BI FOR FORMATOS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  /* vaores por defecto */
  if (new.form_paginas is null) then
    new.form_paginas = 'S';
  if (new.form_entrelinea is null) then
    new.form_entrelinea = 35;
  if (new.form_font is null) then
    new.form_font = 'Arial';
  if (new.form_fsize is null) then
    new.form_fsize = 9;
END
^

/* Trigger: FORMATO_DATOS_AD */
CREATE TRIGGER FORMATO_DATOS_AD FOR FORMATO_DATOS
ACTIVE AFTER DELETE POSITION 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+old.tido_cod) and audi_cod = old.pref_pre
    and audi_fecha = cast('now' as date) and (audi_hora - cast('now' as time)) < 1000)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+old.tido_cod, 1, 'U', old.pref_pre);
end
^

/* Trigger: FORMATO_DATOS_AI */
CREATE TRIGGER FORMATO_DATOS_AI FOR FORMATO_DATOS
ACTIVE AFTER INSERT POSITION 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+new.tido_cod) and audi_cod = new.pref_pre
    and audi_fecha = cast('now' as date) and (cast('now' as time)-audi_hora) < 60)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+new.tido_cod, 1, 'U', new.pref_pre);
end
^

/* Trigger: FORMATO_DATOS_AU */
CREATE TRIGGER FORMATO_DATOS_AU FOR FORMATO_DATOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+new.tido_cod) and audi_cod = new.pref_pre
    and audi_fecha = cast('now' as date) and (audi_hora - cast('now' as time)) < 1000)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+new.tido_cod, 1, 'U', new.pref_pre);
end
^

/* Trigger: FORMATO_DATOS_BI */
CREATE 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
^

/* Trigger: FORMATO_LINEAS_AD */
CREATE TRIGGER FORMATO_LINEAS_AD FOR FORMATO_LINEAS
ACTIVE AFTER DELETE POSITION 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+old.tido_cod) and audi_cod = old.pref_pre
    and audi_fecha = cast('now' as date) and (audi_hora - cast('now' as time)) < 1000)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+old.tido_cod, 1, 'U', old.pref_pre);
end
^

/* Trigger: FORMATO_LINEAS_AI */
CREATE TRIGGER FORMATO_LINEAS_AI FOR FORMATO_LINEAS
ACTIVE AFTER INSERT POSITION 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+new.tido_cod) and audi_cod = new.pref_pre
    and audi_fecha = cast('now' as date) and (audi_hora - cast('now' as time)) < 1000)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+new.tido_cod, 1, 'U', new.pref_pre);
end
^

/* Trigger: FORMATO_LINEAS_AU */
CREATE TRIGGER FORMATO_LINEAS_AU FOR FORMATO_LINEAS
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+new.tido_cod) and audi_cod = new.pref_pre
    and audi_fecha = cast('now' as date) and (cast('now' as time)-audi_hora) < 60)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+new.tido_cod, 1, 'U', new.pref_pre);
end
^

/* Trigger: FOTOS_ARTICULO_BI */
CREATE TRIGGER FOTOS_ARTICULO_BI FOR FOTOS_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
as
begin
select max(ftar_item)+1 from fotos_articulo where arti_cod = new.arti_cod into new.ftar_item;
if (new.ftar_item is null) then
    new.ftar_item = 1;
end
^

/* Trigger: GASTOS_IMPORTACION_AD */
CREATE TRIGGER GASTOS_IMPORTACION_AD FOR GASTOS_IMPORTACION
ACTIVE AFTER DELETE POSITION 0
as
declare variable tipo integer;
begin
if ((old.gain_id <> 0) AND (OLD.gain_anulado = 'N')) then
    begin
    SELECT TIGI_TIPODOC FROM tipo_gastos_importacion
        WHERE TIGI_COD = old.tigi_cod INTO :TIPO;
    if (TIPO = 51) then
        update notas_debito_proveedor set ndpr_anulado = 'S' where ndpr_id = old.gain_idgto;
    else
        update notas_credito_proveedor set ncpr_anulado = 'S' where ncpr_id = old.gain_idgto;
    end
end
^

/* Trigger: GASTOS_IMPORTACION_AU0 */
CREATE TRIGGER GASTOS_IMPORTACION_AU0 FOR GASTOS_IMPORTACION
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable tipo integer;
begin
if ((old.gain_id <> 0) AND (OLD.gain_anulado = 'N')) then
    begin
    if ((NEW.gain_id <> 0) AND (NEW.gain_anulado = 'S')) then
        begin
        SELECT TIGI_TIPODOC FROM tipo_gastos_importacion
            WHERE TIGI_COD = old.tigi_cod INTO :TIPO;
        if (TIPO = 51) then
            update notas_debito_proveedor set ndpr_anulado = 'S' where ndpr_id = old.gain_idgto;
        else
            update notas_credito_proveedor set ncpr_anulado = 'S' where ncpr_id = old.gain_idgto;
        end
    END
end
^

/* Trigger: GASTOS_IMPORTACION_BI0 */
CREATE TRIGGER GASTOS_IMPORTACION_BI0 FOR GASTOS_IMPORTACION
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable TIPO INTEGER;
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable CTACONTA VARCHAR(15);
declare variable CTAGASTO VARCHAR(15);
declare variable IDC INTEGER;
declare variable IDI INTEGER;
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
begin
 if (new.gain_valorcub is null) then
    new.gain_valorcub = 0;
 if (new.gain_valorcpes is null) then
    new.gain_valorcpes = 0;
 if (new.gain_valorcant is null) then
    new.gain_valorcant = 0;
SELECT TIGI_PREF, TIGI_CTACONTA, TIGI_CTAGASTO, TIGI_TIPODOC FROM tipo_gastos_importacion WHERE TIGI_COD = NEW.tigi_cod
    INTO :PREF, :CTACONTA, :CTAGASTO, :TIPO;

if (TIPO = 51) then
    BEGIN
    NEW.gain_idgto = GEN_ID(id_notadbprov,1);
    /* grabe el gasto */
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 51 AND PREF_PRE = :PREF INTO :NUMERO;
    SELECT I.impo_ctainv FROM IMPORTACION I WHERE i.impo_id = NEW.gain_idimpor
        INTO :ctagasto;
    INSERT INTO NOTAS_DEBITO_PROVEEDOR (NDPR_ID, TERC_NIT, TIDO_COD, PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_CONC, 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, NDPR_ANULADO, NDPR_TRANSMIT,
        NDPR_PROY, NDPR_CENTRO, NDPR_CTACAUSA, NDPR_CTAPAGAR, NDPR_NUMPROV, NDPR_USUARIO, NUMOK, NDPR_TRM,
        NDPR_BASE1, NDPR_IVA1, NDPR_BASE2, NDPR_IVA2, NDPR_BASE0, ARTI_COD, NDPR_RTCREE, NDPR_RTCREEM, NDPR_MONEDA,
        NDPR_TIPOAPL, NDPR_NUMAPL, NDPR_INALCM, NDPR_FACID, NDPR_BASE3, NDPR_IVA3, NDPR_CTACAUSAN, NDPR_CTAPAGARN, NDPR_BASERTFTE)
        VALUES (new.gain_idgto, new.terc_nit, 51, :PREF, :NUMERO, NEW.gain_fecha, NEW.gain_conc, NEW.gain_vence,
        NEW.gain_valor, NEW.gain_ivaporc, NEW.gain_ivamonto, NEW.gain_rtfteporc, NEW.gain_rtftemonto, NEW.gain_rtivaporc, NEW.gain_rtivamonto,
        NEW.gain_rticaporc, NEW.gain_rticamonto, NULL, 0, 0, NULL, 'N', 'N',
        new.gain_PROY, NEW.gain_centro, :ctagasto, :ctaconta, NEW.gain_numprov, USER, 'N', NEW.gain_trm,
        NEW.gain_basegr, NEW.gain_ivamonto, 0, 0, NEW.gain_baseex, NULL, NEW.gain_rtcree, NEW.gain_rtcreem, NEW.gain_moneda,
        0, NULL, 0, 0, 0, 0, NULL, NULL, NEW.gain_baseret);
    SELECT FIRST 1 INCP_ID FROM interfaz_cxpagar WHERE PREF_PRE = :pref AND TIDO_COD = 51 INTO :IDI;
    EXECUTE PROCEDURE contabil_notadbpr (new.gain_idgto, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    END
ELSE
    BEGIN
    NEW.gain_idgto = GEN_ID(id_notacrprov,1);
    /* grabe el DESCUENTO */
    SELECT I.impo_ctainv FROM IMPORTACION I WHERE I.impo_id = new.gain_idimpor
        INTO :ctagasto;
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 52 AND PREF_PRE = :PREF INTO :NUMERO;

    INSERT INTO NOTAS_CREDITO_PROVEEDOR (NCPR_ID, TERC_NIT, TIDO_COD, PREF_PRE, NCPR_NUMERO, NCPR_FECHA, NCPR_CONC, NCPR_MONTO,
        NCPR_IVAPORC, NCPR_IVAMONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO,
        NCPR_DTOFECHA, NCPR_DTOFPORC, NCPR_DTOFMONTO, NCPR_OBS, NCPR_ANULADO, NCPR_TRANSMIT, ARTI_COD, NCPR_CTACAUSA, NCPR_CTAPAGAR,
        NCPR_USUARIO, NUMOK, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2, NCPR_RTCREE, NCPR_RTCREEM,
        NCPR_INALCM, NCPR_FACID, NCPR_BASE3, NCPR_IVA3, NCPR_CTACAUSAN, NCPR_CTAPAGARN, NCPR_NUMPROV, NCPR_MONEDA, NCPR_TRM, NCPR_BASERTFTE)
        VALUES (new.gain_idgto, new.terc_nit, 52, :PREF, :NUMERO, NEW.gain_fecha, NEW.gain_conc, NEW.gain_valor,
        NEW.gain_ivaporc, NEW.gain_ivamonto, NEW.gain_rtfteporc, NEW.gain_rtftemonto, NEW.gain_rtivaporc, NEW.gain_rtivamonto, NEW.gain_rticaporc, NEW.gain_rticamonto,
        NULL, 0, 0, NULL, 'N', 'N', NULL, :ctagasto, :ctaconta,
        USER, 'N', NEW.gain_baseex, NEW.gain_basegr, 0, NEW.gain_ivamonto, 0, NEW.gain_rtcree, NEW.gain_rtcreem,
        0, NULL, 0, 0, NULL, NULL, NEW.gain_numprov, NEW.gain_moneda, NEW.gain_trm, NEW.gain_baseret);
    SELECT FIRST 1 INCP_ID FROM interfaz_cxpagar WHERE PREF_PRE = :pref AND TIDO_COD = 52 INTO :IDI;
    EXECUTE PROCEDURE contabil_notacrpr (new.gain_idgto, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    END
end
^

/* Trigger: GRUPOS_PROVEEDORES_AD */
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
^

/* Trigger: GRUPOS_PROVEEDORES_AI */
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
^

/* Trigger: GRUPOS_PROVEEDORES_AU */
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
^

/* Trigger: GRUPO_AD */
CREATE TRIGGER GRUPO_AD FOR GRUPO
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 201, 1, 'D', OLD.grup_cod);
end
^

/* Trigger: GRUPO_AI */
CREATE TRIGGER GRUPO_AI FOR GRUPO
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 201, 1, 'I', NEW.grup_cod);
end
^

/* Trigger: GRUPO_AU */
CREATE TRIGGER GRUPO_AU FOR GRUPO
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 201, 1, 'U', NEW.grup_cod);
end
^

/* Trigger: GRUPO_BI */
CREATE TRIGGER GRUPO_BI FOR GRUPO
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.grup_dec1818 IS NULL) then
    NEW.grup_dec1818 = 'N';
end
^

/* Trigger: GRUPO_CARTERA_AD */
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
^

/* Trigger: GRUPO_CARTERA_AI */
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
^

/* Trigger: GRUPO_CARTERA_AU */
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
^

/* Trigger: HEMOLIFE_ENSAMBLES_AI */
CREATE TRIGGER HEMOLIFE_ENSAMBLES_AI FOR HEMOLIFE_ENSAMBLES
ACTIVE AFTER INSERT POSITION 0
as
declare variable IDENS INTEGER;
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 IVAE NUMERIC(9,4);
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable ESTADO CHAR(1);
declare variable DISCRENS CHAR(2);
declare variable EXIS CHAR(1);
declare variable DESENT VARCHAR(60);
declare variable UNIENT VARCHAR(8);
declare variable IVAENT NUMERIC(9,4);
declare variable CANTA double precision;
declare variable CANTB double precision;
declare variable CANTC double precision;
begin
if (new.heen_transmit = 'S') then
    begin
    select arti_des, arti_unidad, t.taiv_porc, A.arti_exist
        from articulo a, tarifa_iva t where a.taiv_cod = t.taiv_cod and arti_cod = new.heen_codeq
        into :descr, :unidad, :ivae, :EXIS;
    if (new.cant_prod <> 0) then
        begin
        if (:EXIS <> 'N') then
            BEGIN
            /* grabe un ensamble */
            IDENS = gen_id(id_ensamble, 1);
        
            /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
            select sum(arpr_porc) from articulos_producto where arti_cod = NEW.heen_codeq into :total;
            COSTOTOT = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO, TAIV_PORC
                FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                WHERE P.ARTI_COD = NEW.heen_codeq AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR, :IVA
                DO
                BEGIN
                EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.heen_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.cant_prod * 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 * new.cant_prod;
                    END
                COSTOTOT = COSTOTOT + COSTO * CANTPR;
                END
            if (NEW.cant_prod <> 0) then
                COSTO = costotot / NEW.cant_prod;
            else
                COSTO = 0;
            INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
                ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF,ENSA_ITEMREF)
                VALUES (:IDENS, 15, 'ENS', NEW.bode_cod, '000001', new.heen_fecha, 'PRODUCCION DIA ' || NEW.heen_fecha, '', new.cant_prod, :unidad, 1, 'N', 'N',
                NEW.heen_codeq, :descr, NEW.heen_codeq, NULL, NULL, NULL, USER, 'N', :costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, 0, 0, 0);
            /* 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.heen_codeq 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.heen_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.cant_prod * 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 * new.cant_prod; /* * 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
        ELSE
            BEGIN
            /* SI ES EL CODIGO B DE UN ENSABLE HAGA UNA ENTRADA */
            IDENS = GEN_ID(id_entrada, 1);
            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 (:idens, 11, 'ENT', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA PRODUCCION ' || NEW.heen_codeq,
                NULL, 0, 0, 'N', NULL, 'N', 'N', NULL, NULL, 'N', USER);
            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(:idens, 1, NEW.heen_codeq, NEW.bode_cod, NEW.cant_prod, :unidad, 0,
                NULL, 1, :descr, NULL, 0, 0, :IVAE, 0, 0, NEW.heen_codeq, 0, 'N', 'N', NULL, NULL);
            END
        /* AFERESIS, SAQUE A, B Y C Y ENTRE CUP PARA LA VENTA */
        if ((EXISTS (SELECT ENDE_ITEM FROM ENTRADAS E, ENTRADAS_DETALLE D WHERE E.entr_id = D.entr_id AND D.arti_cod = '320136' AND E.entr_fecha = NEW.heen_fecha)) AND
            (EXISTS (SELECT ENSA_ID FROM ensambles WHERE arti_cod = '320135' AND ensa_fecha = NEW.heen_fecha)) ) then
            BEGIN
            /* SI ES AFERESIS O ERITRO AFERESIS HAGA LA SALIDA PARA LUEGO HACER LA ENTRADA TOTAL */
            COSTOTOT = 0;
            IDENS = GEN_ID(id_salida, 1);
            INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
                SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
                VALUES (:idens, 12, 'SAL', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA PRODUCCION ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
                NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
            EXECUTE PROCEDURE costo_promedio('320135', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320135' into :desent, :unient, :ivaent;
            SELECT ENSA_CANT FROM ENSAMBLES WHERE ENSA_FECHA = NEW.heen_fecha AND ARTI_COD = '320135' INTO :canta;
            if (CANTA IS NULL) then
                CANTA = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 1, '320135', NEW.bode_cod, :canta, :unient, null, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTO * CANTA;
            /* B */
            EXECUTE PROCEDURE costo_promedio('320136', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320136' into :desent, :unient, :ivaent;
            SELECT ENDE_CANT FROM entradas E, entradas_detalle D WHERE E.entr_id = D.entr_id AND E.entr_fecha = NEW.heen_fecha AND ARTI_COD = '320136' INTO :cantb;
            if (CANTB IS NULL) then
                CANTB = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 2, '320136', NEW.bode_cod, :cantb, :unient, null, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTOTOT + (COSTO * CANTB);
            if (EXISTS (SELECT ensa_id FROM ensambles ES WHERE arti_cod = '320137' AND ensa_fecha = NEW.heen_fecha)) then
                BEGIN
                EXECUTE PROCEDURE costo_promedio('320137', NEW.heen_fecha) returning_values (:COSTO);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320137' into :desent, :unient, :ivaent;
                SELECT ENSA_CANT FROM ensambles WHERE ensa_fecha = NEW.heen_fecha AND ARTI_COD = '320137' INTO :cantc;
                if (CANTC IS NULL) then
                    CANTC = 0;
                INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                    SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                    VALUES (:IDENS, 3, '320137', NEW.bode_cod, :cantc, :unient, null, 1,
                    :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
                costotot = COSTOTOT + (COSTO * CANTC);
                END
            CANTPR = CANTA+CANTB+CANTC;
            /* LA ENTRADA AL CODIGO CUP */
            if (CANTPR > 0) then
                BEGIN
                IDENS = GEN_ID(id_entrada, 1);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320131' into :desent, :unient, :ivaent;
                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 (:idens, 11, 'ENT', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA PRODUCCION ' || NEW.heen_fecha,
                    NULL, 0, 0, 'N', NULL, 'N', 'N', NULL, NULL, 'N', USER);
                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(:idens, 1, '320131', NEW.bode_cod, :CANTPR, :unient, :COSTOTOT/:CANTPR,
                    NULL, 1, :desent, NULL, 0, 0, :IVAENT, (:COSTO * :cantpr / 100 * :IVAENT), 0, '320131', :COSTO * :cantpr, 'N', 'N', NULL, NULL);
                END
            END
        /* ERITRO AFERESIS, SAQUE A Y B Y CARGE EL CUP PARA LA VENTA */
        if ((EXISTS (SELECT ENDE_ITEM FROM ENTRADAS E, ENTRADAS_DETALLE D WHERE E.entr_id = D.entr_id AND D.arti_cod = '320245' AND E.entr_fecha = NEW.heen_fecha)) AND
            (EXISTS (SELECT ENSA_ID FROM ensambles WHERE arti_cod = '320244' AND ensa_fecha = NEW.heen_fecha)) ) then
            BEGIN
            /* SI ES AFERESIS O ERITRO AFERESIS HAGA LA SALIDA PARA LUEGO HACER LA ENTRADA TOTAL */
            COSTOTOT = 0;
            IDENS = GEN_ID(id_salida, 1);
            INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
                SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
                VALUES (:idens, 12, 'SAL', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA PRODUCCION ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
                NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
            EXECUTE PROCEDURE costo_promedio('320244', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320244' into :desent, :unient, :ivaent;
            SELECT ENSA_CANT FROM ENSAMBLES WHERE ENSA_FECHA = NEW.heen_fecha AND ARTI_COD = '320144' INTO :canta;
            if (CANTA IS NULL) then
                CANTA = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 1, '320244', NEW.bode_cod, :canta, :unient, null, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTO * CANTA;
            /* B */
            EXECUTE PROCEDURE costo_promedio('320245', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320245' into :desent, :unient, :ivaent;
            SELECT ENDE_CANT FROM entradas E, entradas_detalle D WHERE E.entr_id = D.entr_id AND E.entr_fecha = NEW.heen_fecha AND ARTI_COD = '320136' INTO :cantb;
            if (CANTB IS NULL) then
                CANTB = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 2, '320245', NEW.bode_cod, :cantb, :unient, null, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTOTOT + (COSTO * CANTB);
            CANTPR = CANTA+CANTB;
            /* LA ENTRADA AL CODIGO CUP */
            if (CANTPR > 0) then
                BEGIN
                IDENS = GEN_ID(id_entrada, 1);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320241' into :desent, :unient, :ivaent;
                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 (:idens, 11, 'ENT', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA PRODUCCION ' || NEW.heen_fecha,
                    NULL, 0, 0, 'N', NULL, 'N', 'N', NULL, NULL, 'N', USER);
                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(:idens, 1, '320241', NEW.bode_cod, :CANTPR, :unient, :COSTOTOT/:CANTPR,
                    NULL, 1, :desent, NULL, 0, 0, :IVAENT, (:COSTO * :cantpr / 100 * :IVAENT), 0, '320241', :COSTO * :cantpr, 'N', 'N', NULL, NULL);
                END
            END
        /* PLAQUETA AFERESIS IRRADIADA */
        if ((EXISTS (SELECT ENDE_ITEM FROM ENTRADAS E, ENTRADAS_DETALLE D WHERE E.entr_id = D.entr_id AND D.arti_cod = '320139' AND E.entr_fecha = NEW.heen_fecha)) AND
            (EXISTS (SELECT ENSA_ID FROM ensambles WHERE arti_cod = '320138' AND ensa_fecha = NEW.heen_fecha)) ) then
            BEGIN
            /* SI ES AFERESIS O ERITRO AFERESIS HAGA LA SALIDA PARA LUEGO HACER LA ENTRADA TOTAL */
            COSTOTOT = 0;
            IDENS = GEN_ID(id_salida, 1);
            INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
                SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
                VALUES (:idens, 12, 'SAL', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA PRODUCCION ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
                NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
            EXECUTE PROCEDURE costo_promedio('320138', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320138' into :desent, :unient, :ivaent;
            SELECT ENSA_CANT FROM ENSAMBLES WHERE ENSA_FECHA = NEW.heen_fecha AND ARTI_COD = '320138' INTO :canta;
            if (CANTA IS NULL) then
                CANTA = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 1, '320138', NEW.bode_cod, :canta, :unient, null, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTO * CANTA;
            /* B */
            EXECUTE PROCEDURE costo_promedio('320139', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320139' into :desent, :unient, :ivaent;
            SELECT ENDE_CANT FROM entradas E, entradas_detalle D WHERE E.entr_id = D.entr_id AND E.entr_fecha = NEW.heen_fecha
                AND ARTI_COD = '320139' INTO :cantb;
            if (CANTB IS NULL) then
                CANTB = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 2, '320139', NEW.bode_cod, :cantb, :unient, null, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTOTOT + (COSTO * CANTB);
            if (EXISTS (SELECT ensa_id FROM ensambles ES WHERE arti_cod = '320239' AND ensa_fecha = NEW.heen_fecha)) then
                BEGIN
                EXECUTE PROCEDURE costo_promedio('320239', NEW.heen_fecha) returning_values (:COSTO);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320239' into :desent, :unient, :ivaent;
                SELECT ENSA_CANT FROM ensambles WHERE ensa_fecha = NEW.heen_fecha AND ARTI_COD = '320239' INTO :cantc;
                if (CANTC IS NULL) then
                    CANTC = 0;
                INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                    SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                    VALUES (:IDENS, 3, '320239', NEW.bode_cod, :cantc, :unient, null, 1,
                    :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
                costotot = COSTOTOT + (COSTO * CANTC);
                END
            CANTPR = CANTA+CANTB+CANTC;
            /* LA ENTRADA AL CODIGO CUP */
            if (CANTPR > 0) then
                BEGIN
                IDENS = GEN_ID(id_entrada, 1);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320133' into :desent, :unient, :ivaent;
                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 (:idens, 11, 'ENT', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA PRODUCCION ' || NEW.heen_fecha,
                    NULL, 0, 0, 'N', NULL, 'N', 'N', NULL, NULL, 'N', USER);
                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(:idens, 1, '320133', NEW.bode_cod, :CANTPR, :unient, :COSTOTOT/:CANTPR,
                    NULL, 1, :desent, NULL, 0, 0, :IVAENT, (:COSTO * :cantpr / 100 * :IVAENT), 0, '320133', :COSTO * :cantpr, 'N', 'N', NULL, NULL);
                END
            END
        /* ERITRO AFERESSS IRRADIADA */
        if ((EXISTS (SELECT ENDE_ITEM FROM ENTRADAS E, ENTRADAS_DETALLE D WHERE E.entr_id = D.entr_id AND D.arti_cod = '320247' AND E.entr_fecha = NEW.heen_fecha)) AND
            (EXISTS (SELECT ENSA_ID FROM ensambles WHERE arti_cod = '320246' AND ensa_fecha = NEW.heen_fecha)) ) then
            BEGIN
            /* SI ES AFERESIS O ERITRO AFERESIS HAGA LA SALIDA PARA LUEGO HACER LA ENTRADA TOTAL */
            COSTOTOT = 0;
            IDENS = GEN_ID(id_salida, 1);
            INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
                SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
                VALUES (:idens, 12, 'SAL', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA PRODUCCION ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
                NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
            EXECUTE PROCEDURE costo_promedio('320246', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320246' into :desent, :unient, :ivaent;
            SELECT ENSA_CANT FROM ENSAMBLES WHERE ENSA_FECHA = NEW.heen_fecha AND ARTI_COD = '320246' INTO :canta;
            if (CANTA IS NULL) then
                CANTA = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 1, '320246', NEW.bode_cod, :canta, :unient, null, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTO * CANTA;
            /* B */
            EXECUTE PROCEDURE costo_promedio('320247', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320247' into :desent, :unient, :ivaent;
            SELECT ENDE_CANT FROM entradas E, entradas_detalle D WHERE E.entr_id = D.entr_id AND E.entr_fecha = NEW.heen_fecha AND ARTI_COD = '320136' INTO :cantb;
            if (CANTB IS NULL) then
                CANTB = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 2, '320247', NEW.bode_cod, :cantb, :unient, null, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTOTOT + (COSTO * CANTB);
            CANTPR = CANTA+CANTB;
            /* LA ENTRADA AL CODIGO CUP */
            if (CANTPR > 0) then
                BEGIN
                IDENS = GEN_ID(id_entrada, 1);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320243' into :desent, :unient, :ivaent;
                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 (:idens, 11, 'ENT', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA PRODUCCION ' || NEW.heen_fecha,
                    NULL, 0, 0, 'N', NULL, 'N', 'N', NULL, NULL, 'N', USER);
                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(:idens, 1, '320243', NEW.bode_cod, :CANTPR, :unient, :COSTOTOT/:CANTPR,
                    NULL, 1, :desent, NULL, 0, 0, :IVAENT, (:COSTO * :cantpr / 100 * :IVAENT), 0, '320243', :COSTO * :cantpr, 'N', 'N', NULL, NULL);
                END
            END
        END
    if (new.cant_desc <> 0) then
        begin
        /* grabe un ensamble */
        IDENS = gen_id(id_ensamble, 1);
        /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.heen_codeq into :total;
        COSTOTOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO, TAIV_PORC
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.heen_codeq AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR, :IVA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.heen_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.cant_desc * 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 * new.cant_desc;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            END
        if (NEW.cant_desc <> 0) then
            COSTO = costotot / NEW.cant_desc;
        else
            COSTO = 0;
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF,ENSA_ITEMREF)
            VALUES (:IDENS, 15, 'DES', NEW.bode_cod, '000001', new.heen_fecha, 'PRODUCCION DIA ' || NEW.heen_fecha, '', new.cant_desc, :unidad, 1, 'N', 'N',
            NEW.heen_codeq, :descr, NEW.heen_codeq, NULL, NULL, NULL, USER, 'N', :costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, 0, 0, 0);
        COSTOTOT = COSTO;
        /* 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.heen_codeq 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.heen_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.cant_desc * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * new.cant_desc; /* * 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
        /* Y ADICIONAL LA SALIDA POR SER DESCARTE */
        IDENS = GEN_ID(id_salida, 1);
        INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
            SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
            VALUES (:idens, 12, 'DES', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA DESCARTES DE ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
            NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
        INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
            SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
            VALUES (:IDENS, 1, NEW.heen_codeq, NEW.bode_cod, NEW.CANT_DESC, :unidad, null, 1,
            :descr, NULL, :IVAE, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
        end
    if (new.cant_dev <> 0) then
        begin
        /* Y ADICIONAL LA SALIDA POR SER DESCARTE */
        IDENS = GEN_ID(id_salida, 1);
        INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
            SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
            VALUES (:idens, 12, 'DEV', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA DEVOLUCIONES DE ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
            NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
        INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
            SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
            VALUES (:IDENS, 1, NEW.heen_codeq, NEW.bode_cod, NEW.CANT_DEV, :unidad, null, 1,
            :descr, NULL, :IVAE, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
        end
    if (new.cat_canje <> 0) then
        begin
        /* Y ADICIONAL LA SALIDA POR SER DESCARTE */
        IDENS = GEN_ID(id_salida, 1);
        INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
            SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
            VALUES (:idens, 12, 'CANJ', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA CANJE No ' || NEW.alba_numero, new.alba_numero, 0, 0, 'N',
            NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
        INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
            SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
            VALUES (:IDENS, 1, NEW.heen_codeq, NEW.bode_cod, NEW.CAT_CANJE, :unidad, null, 1,
            :descr, NULL, :IVAE, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
        end
    if (new.cant_entr <> 0) then
        begin
        /* ENTRADA POR CANJE */
        IDENS = GEN_ID(id_entrada, 1);
        EXECUTE PROCEDURE costo_promedio(NEW.heen_codeq, NEW.heen_fecha) returning_values (:COSTO);
        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 (:idens, 11, 'CANJ', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA POR CANJE ' || NEW.alba_numero,
            new.alba_numero, 0, 0, 'N', new.terc_nom, 'N', 'N', NULL, NULL, 'N', USER);
        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(:idens, 1, NEW.heen_codeq, NEW.bode_cod, NEW.cant_entr, :unidad, :COSTO,
            NULL, 1, :descr, NULL, 0, 0, :IVAE, (:COSTO * NEW.cant_entr / 100 * :IVAE), 0, NEW.heen_codeq, :COSTO * NEW.cant_entr, 'N', 'N', NULL, NULL);
        end
    end
end
^

/* Trigger: HEMOLIFE_ENSAMBLES_AU */
CREATE TRIGGER HEMOLIFE_ENSAMBLES_AU FOR HEMOLIFE_ENSAMBLES
ACTIVE AFTER UPDATE POSITION 0
as
declare variable IDENS INTEGER;
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 IVAE NUMERIC(9,4);
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable ESTADO CHAR(1);
declare variable DISCRENS CHAR(2);
declare variable EXIS CHAR(1);
declare variable DESENT VARCHAR(60);
declare variable UNIENT VARCHAR(8);
declare variable IVAENT NUMERIC(9,4);
declare variable CANTA double precision;
declare variable CANTB double precision;
declare variable CANTC double precision;
declare variable LOTE VARCHAR(20);
declare variable LOTEVEN DATE;
declare variable EXISCOM CHAR(1);
declare variable ERROR integer;
declare variable VER char(2);
declare variable IDC integer;
declare variable IDINT integer;
begin
if ((old.heen_transmit = 'N') and (new.heen_transmit = 'S')) then
    begin
    select arti_des, arti_unidad, t.taiv_porc, A.arti_exist
        from articulo a, tarifa_iva t where a.taiv_cod = t.taiv_cod and arti_cod = new.heen_codeq
        into :descr, :unidad, :ivae, :EXIS;
    if (new.cant_prod <> 0) then
        begin
        if (:EXIS <> 'N') then
            BEGIN
            if (EXIS = 'L') then
                BEGIN
                LOTE = CAST(NEW.heen_fecha AS VARCHAR(10));
                LOTEVEN = NEW.heen_fecha + 90;
                END
            ELSE
                BEGIN
                LOTE = NULL;
                LOTEVEN = NULL;
                END
            /* grabe un ensamble */
            IDENS = gen_id(id_ensamble, 1);
        
            /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
            select sum(arpr_porc) from articulos_producto where arti_cod = NEW.heen_codeq into :total;
            COSTOTOT = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO, TAIV_PORC
                FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                WHERE P.ARTI_COD = NEW.heen_codeq AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR, :IVA
                DO
                BEGIN
                EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.heen_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.cant_prod * 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 * new.cant_prod;
                    END
                COSTOTOT = COSTOTOT + COSTO * CANTPR;
                END
            if (NEW.cant_prod <> 0) then
                COSTO = costotot / NEW.cant_prod;
            else
                COSTO = 0;
            INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
                ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF,ENSA_ITEMREF)
                VALUES (:IDENS, 15, 'ENS', NEW.bode_cod, '000001', new.heen_fecha, 'PRODUCCION DIA ' || NEW.heen_fecha, '', new.cant_prod, :unidad, 1, 'N', 'N',
                NEW.heen_codeq, :descr, NEW.heen_codeq, :LOTE, NULL, NULL, USER, 'N', :costo, :LOTEVEN, NULL, 0, null,  NULL, 0, NEW.bode_cod, 0, 0, 0);
            /* 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, ARTI_EXIST
                FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                WHERE P.ARTI_COD = NEW.heen_codeq AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR, :EXISCOM
                DO
                BEGIN
                ITEM = ITEM + 1;
                EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.heen_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.cant_prod * 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 * new.cant_prod; /* * pesopr; */
                    END
                if (EXISCOM = 'L') then
                    EXECUTE PROCEDURE seleccione_lote (:CODPR, NEW.bode_cod, :cantpr * :FACTOR) returning_values (LOTE);
                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, :LOTE, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
                END
            /* contabilice el ensamble */
            select max(ININ_ID) from interfaz_inventario where TIDO_COD = 15 and PREF_PRE = 'ENS' into :IDINT;
            execute procedure contabil_ensamble (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
            if (ERROR = 0) then
                execute procedure CONTABILIZA_PENDIENTE (:IDC);
            END
        ELSE
            BEGIN
            /* SI ES EL CODIGO B DE UN ENSABLE HAGA UNA ENTRADA */
            IDENS = GEN_ID(id_entrada, 1);
            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 (:idens, 11, 'ENT', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA PRODUCCION ' || NEW.heen_codeq,
                NULL, 0, 0, 'N', NULL, 'N', 'N', NULL, NULL, 'N', USER);
            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(:idens, 1, NEW.heen_codeq, NEW.bode_cod, NEW.cant_prod, :unidad, 0,
                :LOTE, 1, :descr, NULL, 0, 0, :IVAE, 0, 0, NEW.heen_codeq, 0, 'N', 'N', :LOTEVEN, NULL);
            /* contabilice la entrada */
            select max(ININ_ID) from interfaz_inventario where TIDO_COD = 11 and PREF_PRE = 'ENT' into :IDINT;
            execute procedure contabil_entrada (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
            if (ERROR = 0) then
                execute procedure CONTABILIZA_PENDIENTE (:IDC);
            END
        /* AFERESIS, SAQUE A, B Y C Y ENTRE CUP PARA LA VENTA */
        if ((EXISTS (SELECT ENDE_ITEM FROM ENTRADAS E, ENTRADAS_DETALLE D WHERE E.entr_id = D.entr_id AND D.arti_cod = '320136' AND E.entr_fecha = NEW.heen_fecha)) AND
            (EXISTS (SELECT ENSA_ID FROM ensambles WHERE arti_cod = '320135' AND ensa_fecha = NEW.heen_fecha)) ) then
            BEGIN
            /* SI ES AFERESIS O ERITRO AFERESIS HAGA LA SALIDA PARA LUEGO HACER LA ENTRADA TOTAL */
            COSTOTOT = 0;
            IDENS = GEN_ID(id_salida, 1);
            INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
                SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
                VALUES (:idens, 12, 'SAL', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA PRODUCCION ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
                NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
            EXECUTE PROCEDURE costo_promedio('320135', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320135' into :desent, :unient, :ivaent;
            SELECT ENSA_CANT FROM ENSAMBLES WHERE ENSA_FECHA = NEW.heen_fecha AND ARTI_COD = '320135' INTO :canta;
            if (CANTA IS NULL) then
                CANTA = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 1, '320135', NEW.bode_cod, :canta, :unient, :LOTE, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTO * CANTA;
            /* B */
            EXECUTE PROCEDURE costo_promedio('320136', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320136' into :desent, :unient, :ivaent;
            SELECT ENDE_CANT FROM entradas E, entradas_detalle D WHERE E.entr_id = D.entr_id AND E.entr_fecha = NEW.heen_fecha AND ARTI_COD = '320136' INTO :cantb;
            if (CANTB IS NULL) then
                CANTB = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 2, '320136', NEW.bode_cod, :cantb, :unient, :LOTE, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTOTOT + (COSTO * CANTB);
            if (EXISTS (SELECT ensa_id FROM ensambles ES WHERE arti_cod = '320137' AND ensa_fecha = NEW.heen_fecha)) then
                BEGIN
                EXECUTE PROCEDURE costo_promedio('320137', NEW.heen_fecha) returning_values (:COSTO);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320137' into :desent, :unient, :ivaent;
                SELECT ENSA_CANT FROM ensambles WHERE ensa_fecha = NEW.heen_fecha AND ARTI_COD = '320137' INTO :cantc;
                if (CANTC IS NULL) then
                    CANTC = 0;
                INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                    SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                    VALUES (:IDENS, 3, '320137', NEW.bode_cod, :cantc, :unient, :LOTE, 1,
                    :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
                costotot = COSTOTOT + (COSTO * CANTC);
                END
            CANTPR = CANTA+CANTB+CANTC;
            /* contabilice la salida */
            select max(ININ_ID) from interfaz_inventario where TIDO_COD = 12 and PREF_PRE = 'SAL' into :IDINT;
            execute procedure contabil_salida (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
            if (ERROR = 0) then
                execute procedure CONTABILIZA_PENDIENTE (:IDC);

            /* LA ENTRADA AL CODIGO CUP */
            if (CANTPR > 0) then
                BEGIN
                IDENS = GEN_ID(id_entrada, 1);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320131' into :desent, :unient, :ivaent;
                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 (:idens, 11, 'ENT', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA PRODUCCION ' || NEW.heen_fecha,
                    NULL, 0, 0, 'N', NULL, 'N', 'N', NULL, NULL, 'N', USER);
                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(:idens, 1, '320131', NEW.bode_cod, :CANTPR, :unient, :COSTOTOT/:CANTPR,
                    :LOTE, 1, :desent, NULL, 0, 0, :IVAENT, (:COSTO * :cantpr / 100 * :IVAENT), 0, '320131', :COSTO * :cantpr, 'N', 'N', :LOTEVEN, NULL);
                /* contabilice la entrada */
                select max(ININ_ID) from interfaz_inventario where TIDO_COD = 11 and PREF_PRE = 'ENT' into :IDINT;
                execute procedure contabil_entrada (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
                if (ERROR = 0) then
                    execute procedure CONTABILIZA_PENDIENTE (:IDC);
                END
            END
        /* ERITRO AFERESIS, SAQUE A Y B Y CARGE EL CUP PARA LA VENTA */
        if ((EXISTS (SELECT ENDE_ITEM FROM ENTRADAS E, ENTRADAS_DETALLE D WHERE E.entr_id = D.entr_id AND D.arti_cod = '320245' AND E.entr_fecha = NEW.heen_fecha)) AND
            (EXISTS (SELECT ENSA_ID FROM ensambles WHERE arti_cod = '320244' AND ensa_fecha = NEW.heen_fecha)) ) then
            BEGIN
            /* SI ES AFERESIS O ERITRO AFERESIS HAGA LA SALIDA PARA LUEGO HACER LA ENTRADA TOTAL */
            COSTOTOT = 0;
            IDENS = GEN_ID(id_salida, 1);
            INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
                SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
                VALUES (:idens, 12, 'SAL', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA PRODUCCION ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
                NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
            EXECUTE PROCEDURE costo_promedio('320244', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320244' into :desent, :unient, :ivaent;
            SELECT ENSA_CANT FROM ENSAMBLES WHERE ENSA_FECHA = NEW.heen_fecha AND ARTI_COD = '320144' INTO :canta;
            if (CANTA IS NULL) then
                CANTA = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 1, '320244', NEW.bode_cod, :canta, :unient, :LOTE, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTO * CANTA;
            /* B */
            EXECUTE PROCEDURE costo_promedio('320245', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320245' into :desent, :unient, :ivaent;
            SELECT ENDE_CANT FROM entradas E, entradas_detalle D WHERE E.entr_id = D.entr_id AND E.entr_fecha = NEW.heen_fecha AND ARTI_COD = '320136' INTO :cantb;
            if (CANTB IS NULL) then
                CANTB = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 2, '320245', NEW.bode_cod, :cantb, :unient, :LOTE, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTOTOT + (COSTO * CANTB);
            CANTPR = CANTA+CANTB;
            /* contabilice la salida */
            select max(ININ_ID) from interfaz_inventario where TIDO_COD = 12 and PREF_PRE = 'SAL' into :IDINT;
            execute procedure contabil_salida (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
            if (ERROR = 0) then
                execute procedure CONTABILIZA_PENDIENTE (:IDC);

            /* LA ENTRADA AL CODIGO CUP */
            if (CANTPR > 0) then
                BEGIN
                IDENS = GEN_ID(id_entrada, 1);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320241' into :desent, :unient, :ivaent;
                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 (:idens, 11, 'ENT', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA PRODUCCION ' || NEW.heen_fecha,
                    NULL, 0, 0, 'N', NULL, 'N', 'N', NULL, NULL, 'N', USER);
                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(:idens, 1, '320241', NEW.bode_cod, :CANTPR, :unient, :COSTOTOT/:CANTPR,
                    :LOTE, 1, :desent, NULL, 0, 0, :IVAENT, (:COSTO * :cantpr / 100 * :IVAENT), 0, '320241', :COSTO * :cantpr, 'N', 'N', NULL, NULL);
                /* contabilice la entrada */
                select max(ININ_ID) from interfaz_inventario where TIDO_COD = 11 and PREF_PRE = 'ENT' into :IDINT;
                execute procedure contabil_entrada (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
                if (ERROR = 0) then
                    execute procedure CONTABILIZA_PENDIENTE (:IDC);
                END
            END
        /* PLAQUETA AFERESIS IRRADIADA */
        if ((EXISTS (SELECT ENDE_ITEM FROM ENTRADAS E, ENTRADAS_DETALLE D WHERE E.entr_id = D.entr_id AND D.arti_cod = '320139' AND E.entr_fecha = NEW.heen_fecha)) AND
            (EXISTS (SELECT ENSA_ID FROM ensambles WHERE arti_cod = '320138' AND ensa_fecha = NEW.heen_fecha)) ) then
            BEGIN
            /* SI ES AFERESIS O ERITRO AFERESIS HAGA LA SALIDA PARA LUEGO HACER LA ENTRADA TOTAL */
            COSTOTOT = 0;
            IDENS = GEN_ID(id_salida, 1);
            INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
                SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
                VALUES (:idens, 12, 'SAL', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA PRODUCCION ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
                NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
            EXECUTE PROCEDURE costo_promedio('320138', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320138' into :desent, :unient, :ivaent;
            SELECT ENSA_CANT FROM ENSAMBLES WHERE ENSA_FECHA = NEW.heen_fecha AND ARTI_COD = '320138' INTO :canta;
            if (CANTA IS NULL) then
                CANTA = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 1, '320138', NEW.bode_cod, :canta, :unient, :LOTE, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTO * CANTA;
            /* B */
            EXECUTE PROCEDURE costo_promedio('320139', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320139' into :desent, :unient, :ivaent;
            SELECT ENDE_CANT FROM entradas E, entradas_detalle D WHERE E.entr_id = D.entr_id AND E.entr_fecha = NEW.heen_fecha
                AND ARTI_COD = '320139' INTO :cantb;
            if (CANTB IS NULL) then
                CANTB = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 2, '320139', NEW.bode_cod, :cantb, :unient, :LOTE, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTOTOT + (COSTO * CANTB);
            if (EXISTS (SELECT ensa_id FROM ensambles ES WHERE arti_cod = '320239' AND ensa_fecha = NEW.heen_fecha)) then
                BEGIN
                EXECUTE PROCEDURE costo_promedio('320239', NEW.heen_fecha) returning_values (:COSTO);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320239' into :desent, :unient, :ivaent;
                SELECT ENSA_CANT FROM ensambles WHERE ensa_fecha = NEW.heen_fecha AND ARTI_COD = '320239' INTO :cantc;
                if (CANTC IS NULL) then
                    CANTC = 0;
                INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                    SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                    VALUES (:IDENS, 3, '320239', NEW.bode_cod, :cantc, :unient, :LOTE, 1,
                    :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
                costotot = COSTOTOT + (COSTO * CANTC);
                END
            CANTPR = CANTA+CANTB+CANTC;
            /* contabilice la salida */
            select max(ININ_ID) from interfaz_inventario where TIDO_COD = 12 and PREF_PRE = 'SAL' into :IDINT;
            execute procedure contabil_salida (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
            if (ERROR = 0) then
                execute procedure CONTABILIZA_PENDIENTE (:IDC);
            /* LA ENTRADA AL CODIGO CUP */
            if (CANTPR > 0) then
                BEGIN
                IDENS = GEN_ID(id_entrada, 1);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320133' into :desent, :unient, :ivaent;
                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 (:idens, 11, 'ENT', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA PRODUCCION ' || NEW.heen_fecha,
                    NULL, 0, 0, 'N', NULL, 'N', 'N', NULL, NULL, 'N', USER);
                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(:idens, 1, '320133', NEW.bode_cod, :CANTPR, :unient, :COSTOTOT/:CANTPR,
                    :LOTE, 1, :desent, NULL, 0, 0, :IVAENT, (:COSTO * :cantpr / 100 * :IVAENT), 0, '320133', :COSTO * :cantpr, 'N', 'N', :LOTEVEN, NULL);
                /* contabilice el ensamble */
                select max(ININ_ID) from interfaz_inventario where TIDO_COD = 11 and PREF_PRE = 'ENT' into :IDINT;
                execute procedure contabil_entrada (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
                if (ERROR = 0) then
                    execute procedure CONTABILIZA_PENDIENTE (:IDC);
                END
            END
        /* ERITRO AFERESSS IRRADIADA */
        if ((EXISTS (SELECT ENDE_ITEM FROM ENTRADAS E, ENTRADAS_DETALLE D WHERE E.entr_id = D.entr_id AND D.arti_cod = '320247' AND E.entr_fecha = NEW.heen_fecha)) AND
            (EXISTS (SELECT ENSA_ID FROM ensambles WHERE arti_cod = '320246' AND ensa_fecha = NEW.heen_fecha)) ) then
            BEGIN
            /* SI ES AFERESIS O ERITRO AFERESIS HAGA LA SALIDA PARA LUEGO HACER LA ENTRADA TOTAL */
            COSTOTOT = 0;
            IDENS = GEN_ID(id_salida, 1);
            INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
                SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
                VALUES (:idens, 12, 'SAL', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA PRODUCCION ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
                NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
            EXECUTE PROCEDURE costo_promedio('320246', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320246' into :desent, :unient, :ivaent;
            SELECT ENSA_CANT FROM ENSAMBLES WHERE ENSA_FECHA = NEW.heen_fecha AND ARTI_COD = '320246' INTO :canta;
            if (CANTA IS NULL) then
                CANTA = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 1, '320246', NEW.bode_cod, :canta, :unient, :LOTE, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTO * CANTA;
            /* B */
            EXECUTE PROCEDURE costo_promedio('320247', NEW.heen_fecha) returning_values (:COSTO);
            select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = '320247' into :desent, :unient, :ivaent;
            SELECT ENDE_CANT FROM entradas E, entradas_detalle D WHERE E.entr_id = D.entr_id AND E.entr_fecha = NEW.heen_fecha AND ARTI_COD = '320136' INTO :cantb;
            if (CANTB IS NULL) then
                CANTB = 0;
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDENS, 2, '320247', NEW.bode_cod, :cantb, :unient, :LOTE, 1,
                :desent, NULL, :ivaent, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
            costotot = COSTOTOT + (COSTO * CANTB);
            CANTPR = CANTA+CANTB;
            /* contabilice la salida */
            select max(ININ_ID) from interfaz_inventario where TIDO_COD = 12 and PREF_PRE = 'SAL' into :IDINT;
            execute procedure contabil_salida (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
            if (ERROR = 0) then
                execute procedure CONTABILIZA_PENDIENTE (:IDC);
            /* LA ENTRADA AL CODIGO CUP */
            if (CANTPR > 0) then
                BEGIN
                IDENS = GEN_ID(id_entrada, 1);
                select arti_des, arti_unidad, t.taiv_porc from articulo a, tarifa_iva t
                    where a.taiv_cod = t.taiv_cod and arti_cod = '320243' into :desent, :unient, :ivaent;
                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 (:idens, 11, 'ENT', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA PRODUCCION ' || NEW.heen_fecha,
                    NULL, 0, 0, 'N', NULL, 'N', 'N', NULL, NULL, 'N', USER);
                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(:idens, 1, '320243', NEW.bode_cod, :CANTPR, :unient, :COSTOTOT/:CANTPR,
                    :LOTE, 1, :desent, NULL, 0, 0, :IVAENT, (:COSTO * :cantpr / 100 * :IVAENT), 0, '320243', :COSTO * :cantpr, 'N', 'N', :LOTEVEN, NULL);
                /* contabilice la entrada */
                select max(ININ_ID) from interfaz_inventario where TIDO_COD = 11 and PREF_PRE = 'ENT' into :IDINT;
                execute procedure contabil_entrada (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
                if (ERROR = 0) then
                    execute procedure CONTABILIZA_PENDIENTE (:IDC);
                END
            END
        END
    if (new.cant_desc <> 0) then
        begin
        /* grabe un ensamble */
        IDENS = gen_id(id_ensamble, 1);
        /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
        select sum(arpr_porc) from articulos_producto where arti_cod = NEW.heen_codeq into :total;
        COSTOTOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO, TAIV_PORC
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.heen_codeq AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR, :IVA
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.heen_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.cant_desc * 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 * new.cant_desc;
                END
            COSTOTOT = COSTOTOT + COSTO * CANTPR;
            END
        if (NEW.cant_desc <> 0) then
            COSTO = costotot / NEW.cant_desc;
        else
            COSTO = 0;
        INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
            ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF,ENSA_ITEMREF)
            VALUES (:IDENS, 15, 'DES', NEW.bode_cod, '000001', new.heen_fecha, 'PRODUCCION DIA ' || NEW.heen_fecha, '', new.cant_desc, :unidad, 1, 'N', 'N',
            NEW.heen_codeq, :descr, NEW.heen_codeq, :LOTE, NULL, NULL, USER, 'N', :costo, :LOTEVEN, NULL, 0, null,  NULL, 0, NEW.bode_cod, 0, 0, 0);
        COSTOTOT = COSTO;
        /* 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, ARTI_EXIST
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.heen_codeq AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR, :EXISCOM
            DO
            BEGIN
            ITEM = ITEM + 1;
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.heen_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.cant_desc * PESO;
                CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                    CANTPR = CANTPR * (100 + mermapr) / 100;
                UNIPR = 'GRAMO';
                END
            ELSE
                BEGIN
                CANTPR = CANTPR * new.cant_desc; /* * pesopr * FACTOR; */
                END
            if (EXISCOM = 'L') then
                EXECUTE PROCEDURE seleccione_lote (:CODPR, NEW.bode_cod, :cantpr * :FACTOR) returning_values (LOTE);
    
            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, :LOTE, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        /* contabilice el ensamble */
        select max(ININ_ID) from interfaz_inventario where TIDO_COD = 15 and PREF_PRE = 'DES' into :IDINT;
        execute procedure contabil_ensamble (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
        if (ERROR = 0) then
            execute procedure CONTABILIZA_PENDIENTE (:IDC);

        /* Y ADICIONAL LA SALIDA POR SER DESCARTE */
        IDENS = GEN_ID(id_salida, 1);
        INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
            SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
            VALUES (:idens, 12, 'DES', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA DESCARTES DE ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
            NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
        INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
            SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
            VALUES (:IDENS, 1, NEW.heen_codeq, NEW.bode_cod, NEW.CANT_DESC, :unidad, :LOTE, 1,
            :descr, NULL, :IVAE, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
        /* contabilice la salida */
        select max(ININ_ID) from interfaz_inventario where TIDO_COD = 12 and PREF_PRE = 'DES' into :IDINT;
        execute procedure contabil_salida (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
        if (ERROR = 0) then
            execute procedure CONTABILIZA_PENDIENTE (:IDC);
        end
    if (new.cant_dev <> 0) then
        begin
        /* Y ADICIONAL LA SALIDA POR SER DESCARTE */
        IDENS = GEN_ID(id_salida, 1);
        INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
            SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
            VALUES (:idens, 12, 'DEV', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA DEVOLUCIONES DE ' || NEW.HEEN_FECHA, NULL, 0, 0, 'N',
            NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
        INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
            SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
            VALUES (:IDENS, 1, NEW.heen_codeq, NEW.bode_cod, NEW.CANT_DEV, :unidad, :LOTE, 1,
            :descr, NULL, :IVAE, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
        /* contabilice la salida */
        select max(ININ_ID) from interfaz_inventario where TIDO_COD = 12 and PREF_PRE = 'DEV' into :IDINT;
        execute procedure contabil_salida (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
        if (ERROR = 0) then
            execute procedure CONTABILIZA_PENDIENTE (:IDC);
        end
    if (new.cat_canje <> 0) then
        begin
        /* Y ADICIONAL LA SALIDA POR SER DESCARTE */
        IDENS = GEN_ID(id_salida, 1);
        INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
            SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
            VALUES (:idens, 12, 'CANJ', NEW.bode_cod, '000001', NEW.HEEN_FECHA, 'SALIDA CANJE No ' || NEW.alba_numero, new.alba_numero, 0, 0, 'N',
            NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
        INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
            SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
            VALUES (:IDENS, 1, NEW.heen_codeq, NEW.bode_cod, NEW.CAT_CANJE, :unidad, :LOTE, 1,
            :descr, NULL, :IVAE, 0, 0, NEW.heen_codeq, 'N', 0, 0, 'N');
        /* contabilice la salida */
        select max(ININ_ID) from interfaz_inventario where TIDO_COD = 12 and PREF_PRE = 'CANJ' into :IDINT;
        execute procedure contabil_salida (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
        if (ERROR = 0) then
            execute procedure CONTABILIZA_PENDIENTE (:IDC);
        end
    if (new.cant_entr <> 0) then
        begin
        /* ENTRADA POR CANJE */
        IDENS = GEN_ID(id_entrada, 1);
        EXECUTE PROCEDURE costo_promedio(NEW.heen_codeq, NEW.heen_fecha) returning_values (:COSTO);
        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 (:idens, 11, 'CANJ', '000001', NEW.bode_cod, NEW.heen_fecha, 'ENTRADA POR CANJE ' || NEW.alba_numero,
            new.alba_numero, 0, 0, 'N', new.terc_nom, 'N', 'N', NULL, NULL, 'N', USER);
        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(:idens, 1, NEW.heen_codeq, NEW.bode_cod, NEW.cant_entr, :unidad, :COSTO,
            :LOTE, 1, :descr, NULL, 0, 0, :IVAE, (:COSTO * NEW.cant_entr / 100 * :IVAE), 0, NEW.heen_codeq, :COSTO * NEW.cant_entr, 'N', 'N', NULL, NULL);
        /* contabilice la entrada */
        select max(ININ_ID) from interfaz_inventario where TIDO_COD = 11 and PREF_PRE = 'CANJ' into :IDINT;
        execute procedure contabil_entrada (:idens, :idint) returning_values (:ERROR, :VER, :IDC);
        if (ERROR = 0) then
            execute procedure CONTABILIZA_PENDIENTE (:IDC);
        end
    end
end
^

/* Trigger: HEMOLIFE_ENSAMBLES_BI */
CREATE TRIGGER HEMOLIFE_ENSAMBLES_BI FOR HEMOLIFE_ENSAMBLES
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.heen_id = gen_id(id_hemolife, 1);
if (NEW.bode_cod IS NULL) then
    NEW.bode_cod = '02';
/* VERIFIQUE QUE EL CODIGO EXISTA */
if (NEW.arti_cod IS NULL) then
    exception articulo_no_existe 'Debe indicar el codigo del articulo.';
else
    BEGIN
    SELECT ARTI_COD FROM hemolife_equivalencias WHERE CODLAB = NEW.arti_cod AND BODE_COD = NEW.bode_cod INTO NEW.heen_codeq;
    if (NEW.heen_codeq IS NULL) then
        SELECT ARTI_COD FROM hemolife_equivalencias WHERE CODLAB = NEW.arti_cod INTO NEW.heen_codeq;
    if (NEW.heen_codeq IS NULL) then
        exception articulo_no_existe 'No se encontro equivalencia para el codigo ' || new.arti_cod;
    else
        if (not exists (select arti_cod from articulo where arti_cod = new.heen_codeq) ) then
            exception articulo_no_existe 'No se encontro el articulo ' || new.arti_cod || ' - ' || NEW.heen_codeq;
    END
end
^

/* Trigger: HEMOLIFE_REMISIONES_AI */
CREATE TRIGGER HEMOLIFE_REMISIONES_AI FOR HEMOLIFE_REMISIONES
ACTIVE AFTER INSERT POSITION 0
as
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable unidad varchar(8);
declare variable VEND INTEGER;
begin
if (new.here_transmit = 'S') then
    begin
    if (new.here_cant <> 0) then
        begin
        select revt_id from remisiones_venta where revt_transp = new.here_id and revt_anulado = 'N' into :ID;
        if ((id is null) or (id = 0)) then
            begin
            /* encabezado */
            id = gen_id(id_remiclie, 1);
            ITEM = 0;
            select vend_cod from clientes where terc_nit = new.here_nit into :vend;

            insert into REMISIONES_VENTA (REVT_ID, TERC_NIT, VEND_COD, BODE_COD, TIDO_COD, PREF_PRE, REVT_NUMERO, REVT_FECHA,
               REVT_CONC, REVT_OBS, REVT_DESPACHO, REVT_IVAINC, REVT_ANULADO, REVT_TRANSMIT,
               REVT_NOMTERC, REVT_TOTAL, REVT_IVAMONTO, PTVT_ID, LIPR_COD, REVT_COTIZACI, REVT_PEDIDO,
               REVT_FACTURA, REVT_NROCOPIA, REVT_TRANSP, REVT_CONSOLIDA, REVT_USUARIO, REVT_SUCURSAL,
               NUMOK, REVT_TRM, REMI_PENDIENTE, REVT_FLETE, REVT_VEHICULO, REVT_VRFLETE)
             values (:ID, new.here_nit, :vend, NEW.bode_cod, 32, 'REC', '000001', NEW.here_fecha, 'REMISION ' || NEW.here_producto || ' A ' || substring(NEW.here_nombre FROM 1 FOR 40),
                     NULL, NULL, 'N', 'N', 'N', NEW.here_nombre, NEW.here_cant * NEW.here_prunit,
                     0, 1, 1, NULL, NULL, NULL, 0, NEW.here_id, NULL, USER, new.here_sucursal, 'N', 1, NULL, 'N', NULL, 0);
            end
        else
            begin
            UPDATE REMISIONES_VENTA SET REVT_TOTAL = REVT_TOTAL + NEW.here_cant * NEW.here_prunit
                WHERE REVT_ID = :ID;
            SELECT MAX(RVDE_ITEM) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID INTO :ITEM;
            end
        ITEM = ITEM + 1;
        select arti_unidad from articulo a where arti_cod = new.arti_cod into :unidad;
        insert into REMISIONES_VENTA_DETALLE (REVT_ID, RVDE_ITEM, BODE_COD, ARTI_COD, RVDE_CANT, RVDE_UNIDAD, RVDE_LOTE,
          RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO,
          RVDE_CONSUMO, RVDE_FACTOR, RVDE_DESC, RVDE_OBS, RVDE_CODBAR, RVDE_FACTURADO,
          RVDE_TOTAL, RVDE_ANULADO, RVDE_TRANSMIT, RVDE_REFERENCIA, LIPR_COD, RVDE_DEVUELTO,
          RVDE_CAJAS, RVDE_INALCP, RVDE_INALCM, RVDE_TIVA)
        values (:ID, :ITEM, NEW.bode_cod, NEW.arti_cod, NEW.here_cant, :UNIDAD, NULL, NEW.here_prunit, 0, 0, 0, 0, 0, 1, NEW.here_nomprod, NULL, NEW.arti_cod,
            0, NEW.here_cant * NEW.here_prunit, 'N', 'N', NEW.here_producto, 1, 0, 0, 0, 0, 0);
        end
    end
end
^

/* Trigger: HEMOLIFE_REMISIONES_AU */
CREATE TRIGGER HEMOLIFE_REMISIONES_AU FOR HEMOLIFE_REMISIONES
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable unidad varchar(8);
declare variable VEND INTEGER;
begin
if (new.here_transmit = 'S') then
    begin
    if (new.here_cant <> 0) then
        begin
        select revt_id from remisiones_venta where revt_transp = new.here_id and revt_anulado = 'N' into :ID;
        if ((id is null) or (id = 0)) then
            begin
            /* encabezado */
            id = gen_id(id_remiclie, 1);
            ITEM = 0;
            select vend_cod from clientes where terc_nit = new.here_nit into :vend;

            insert into REMISIONES_VENTA (REVT_ID, TERC_NIT, VEND_COD, BODE_COD, TIDO_COD, PREF_PRE, REVT_NUMERO, REVT_FECHA,
               REVT_CONC, REVT_OBS, REVT_DESPACHO, REVT_IVAINC, REVT_ANULADO, REVT_TRANSMIT,
               REVT_NOMTERC, REVT_TOTAL, REVT_IVAMONTO, PTVT_ID, LIPR_COD, REVT_COTIZACI, REVT_PEDIDO,
               REVT_FACTURA, REVT_NROCOPIA, REVT_TRANSP, REVT_CONSOLIDA, REVT_USUARIO, REVT_SUCURSAL,
               NUMOK, REVT_TRM, REMI_PENDIENTE, REVT_FLETE, REVT_VEHICULO, REVT_VRFLETE)
             values (:ID, new.here_nit, :vend, NEW.bode_cod, 32, 'REC', '000001', NEW.here_fecha, 'REMISION ' || NEW.here_producto || ' A ' || substring(NEW.here_nombre FROM 1 FOR 40),
                     NULL, NULL, 'N', 'N', 'N', NEW.here_nombre, NEW.here_cant * NEW.here_prunit,
                     0, 1, 1, NULL, NULL, NULL, 0, NEW.here_id, NULL, USER, new.here_sucursal, 'N', 1, NULL, 'N', NULL, 0);
            end
        else
            begin
            UPDATE REMISIONES_VENTA SET REVT_TOTAL = REVT_TOTAL + NEW.here_cant * NEW.here_prunit
                WHERE REVT_ID = :ID;
            SELECT MAX(RVDE_ITEM) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID INTO :ITEM;
            end
        ITEM = ITEM + 1;
        select arti_unidad from articulo a where arti_cod = new.arti_cod into :unidad;
        insert into REMISIONES_VENTA_DETALLE (REVT_ID, RVDE_ITEM, BODE_COD, ARTI_COD, RVDE_CANT, RVDE_UNIDAD, RVDE_LOTE,
          RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO,
          RVDE_CONSUMO, RVDE_FACTOR, RVDE_DESC, RVDE_OBS, RVDE_CODBAR, RVDE_FACTURADO,
          RVDE_TOTAL, RVDE_ANULADO, RVDE_TRANSMIT, RVDE_REFERENCIA, LIPR_COD, RVDE_DEVUELTO,
          RVDE_CAJAS, RVDE_INALCP, RVDE_INALCM, RVDE_TIVA)
        values (:ID, :ITEM, NEW.bode_cod, NEW.arti_cod, NEW.here_cant, :UNIDAD, NULL, NEW.here_prunit, 0, 0, 0, 0, 0, 1, NEW.here_nomprod, NULL, NEW.arti_cod,
            0, NEW.here_cant * NEW.here_prunit, 'N', 'N', NEW.here_producto, 1, 0, 0, 0, 0, 0);
        end
    end
END
^

/* Trigger: IMPORTACION_AD */
CREATE TRIGGER IMPORTACION_AD FOR IMPORTACION
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 133, OLD.impo_id, 'D', OLD.impo_pref || OLD.impo_numero);
end
^

/* Trigger: IMPORTACION_AI */
CREATE TRIGGER IMPORTACION_AI FOR IMPORTACION
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 133, NEW.impo_id, 'I', NEW.impo_pref || NEW.impo_numero);
end
^

/* Trigger: IMPORTACION_AU */
CREATE TRIGGER IMPORTACION_AU FOR IMPORTACION
ACTIVE AFTER UPDATE POSITION 0
as
begin
/* ACTUALICE LOS ANULADOS Y TRASMITIDOS */
if (NEW.impo_anulado <> OLD.impo_anulado) then
    begin
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 133, NEW.impo_id, 'A', NEW.impo_pref || NEW.impo_numero);
    end
ELSE
    BEGIN
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 133, NEW.impo_id, 'U', NEW.impo_pref || NEW.impo_numero);
    END
end
^

/* Trigger: IMPORTACION_BI */
CREATE TRIGGER IMPORTACION_BI FOR IMPORTACION
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.impo_cerrada IS NULL) then
    NEW.impo_cerrada = 'N';
/* Actualice el contador del prefijo */
SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 133 AND PREF_PRE = NEW.impo_pref INTO :NUMERO, :AUTOM;
/* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
if (AUTOM = 'S') then
    BEGIN
    NEW.impo_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 133 AND PREF_PRE = NEW.impo_pref;
    END
ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.impo_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 133 AND PREF_PRE = NEW.impo_pref;
    END
EXECUTE PROCEDURE COMPLETA_CEROS (NEW.impo_numero) returning_values (NEW.impo_numero);
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM importacion WHERE impo_pref = NEW.impo_pref AND IMPO_NUMERO = NEW.impo_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
  /* Trigger text */
end
^

/* Trigger: IMPORTACION_LIQUIDACION_BI */
CREATE TRIGGER IMPORTACION_LIQUIDACION_BI FOR IMPORTACION_LIQUIDACION
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.imli_fletes IS NULL) then
    NEW.imli_fletes = 0;
if (NEW.imli_seguros IS NULL) then
    NEW.imli_seguros = 0;
if (NEW.imli_imptos IS NULL) then
    NEW.imli_imptos = 0;
if (NEW.imli_otros IS NULL) then
    NEW.imli_otros = 0;
end
^

/* Trigger: INTERFAZ_BANCOS_AD */
CREATE TRIGGER INTERFAZ_BANCOS_AD FOR INTERFAZ_BANCOS
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 111, old.inba_id, 'D', old.pref_pre);
end
^

/* Trigger: INTERFAZ_BANCOS_AI */
CREATE TRIGGER INTERFAZ_BANCOS_AI FOR INTERFAZ_BANCOS
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.INBA_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 111, NEW.inba_id, 'I', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_BANCOS_AU */
CREATE TRIGGER INTERFAZ_BANCOS_AU FOR INTERFAZ_BANCOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 111, NEW.inba_id, 'U', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_BANCOS_CTAS_BI */
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
^

/* Trigger: INTERFAZ_BANCOS_CTAS_BU */
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
^

/* Trigger: INTERFAZ_BANCOS_NIIF_AD */
CREATE TRIGGER INTERFAZ_BANCOS_NIIF_AD FOR INTERFAZ_BANCOS_NIIF
ACTIVE AFTER DELETE POSITION 0
as
declare variable PREF CHAR(4);
begin
SELECT PREF_PRE FROM INTERFAZ_BANCOS WHERE INBA_ID = OLD.INBA_ID INTO :PREF;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1111, old.inba_id, 'D', :pref);
end
^

/* Trigger: INTERFAZ_BANCOS_NIIF_AI */
CREATE TRIGGER INTERFAZ_BANCOS_NIIF_AI FOR INTERFAZ_BANCOS_NIIF
ACTIVE AFTER INSERT POSITION 0
as
declare variable PREF CHAR(4);
begin
SELECT PREF_PRE FROM INTERFAZ_BANCOS WHERE INBA_ID = NEW.INBA_ID INTO :PREF;
IF (NEW.INBA_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1111, NEW.inba_id, 'I', :pref);
end
^

/* Trigger: INTERFAZ_BANCOS_NIIF_AU */
CREATE TRIGGER INTERFAZ_BANCOS_NIIF_AU FOR INTERFAZ_BANCOS_NIIF
ACTIVE AFTER UPDATE POSITION 0
as
declare variable PREF CHAR(4);
begin
SELECT PREF_PRE FROM INTERFAZ_BANCOS WHERE INBA_ID = NEW.INBA_ID INTO :PREF;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1111, NEW.inba_id, 'U', :pref);
end
^

/* Trigger: INTERFAZ_CAJA_AD */
CREATE TRIGGER INTERFAZ_CAJA_AD FOR INTERFAZ_CAJA
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 112, old.incj_id, 'D', OLD.pref_pre);
end
^

/* Trigger: INTERFAZ_CAJA_AI */
CREATE TRIGGER INTERFAZ_CAJA_AI FOR INTERFAZ_CAJA
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.INCJ_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 112, NEW.incj_id, 'I', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_CAJA_AU */
CREATE TRIGGER INTERFAZ_CAJA_AU FOR INTERFAZ_CAJA
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 112, NEW.incj_id, 'U', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_CAJA_CTAS_BI */
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
^

/* Trigger: INTERFAZ_CAJA_CTAS_BU */
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
^

/* Trigger: INTERFAZ_CARTERA_AD */
CREATE TRIGGER INTERFAZ_CARTERA_AD FOR INTERFAZ_CARTERA
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 113, OLD.inca_id, 'D', OLD.pref_pre);
end
^

/* Trigger: INTERFAZ_CARTERA_AI */
CREATE TRIGGER INTERFAZ_CARTERA_AI FOR INTERFAZ_CARTERA
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.INCA_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 113, NEW.inca_id, 'I', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_CARTERA_AU */
CREATE TRIGGER INTERFAZ_CARTERA_AU FOR INTERFAZ_CARTERA
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 113, NEW.inca_id, 'U', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_CARTERA_CTAS_BI */
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
^

/* Trigger: INTERFAZ_CARTERA_CTAS_BU */
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
^

/* Trigger: INTERFAZ_COMPRAS_AD */
CREATE TRIGGER INTERFAZ_COMPRAS_AD FOR INTERFAZ_COMPRAS
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 114, OLD.inco_id, 'D', OLD.pref_pre);
end
^

/* Trigger: INTERFAZ_COMPRAS_AI */
CREATE TRIGGER INTERFAZ_COMPRAS_AI FOR INTERFAZ_COMPRAS
ACTIVE AFTER INSERT POSITION 0
as
begin               
IF (NEW.INCO_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 114, NEW.inco_id, 'I', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_COMPRAS_AU */
CREATE TRIGGER INTERFAZ_COMPRAS_AU FOR INTERFAZ_COMPRAS
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 114, NEW.inco_id, 'U', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_COMPRAS_CTAS_BI */
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
^

/* Trigger: INTERFAZ_COMPRAS_CTAS_BU */
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
^

/* Trigger: INTERFAZ_CXPAGAR_AD */
CREATE TRIGGER INTERFAZ_CXPAGAR_AD FOR INTERFAZ_CXPAGAR
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 115, OLD.incp_id, 'D', OLD.pref_pre);
end
^

/* Trigger: INTERFAZ_CXPAGAR_AI */
CREATE TRIGGER INTERFAZ_CXPAGAR_AI FOR INTERFAZ_CXPAGAR
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.INCP_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 115, NEW.incp_id, 'I', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_CXPAGAR_AU */
CREATE TRIGGER INTERFAZ_CXPAGAR_AU FOR INTERFAZ_CXPAGAR
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 115, NEW.incp_id, 'U', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_CXPAGAR_CTAS_BI */
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
^

/* Trigger: INTERFAZ_CXPAGAR_CTAS_BU */
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
^

/* Trigger: INTERFAZ_INVENTARIO_AD */
CREATE TRIGGER INTERFAZ_INVENTARIO_AD FOR INTERFAZ_INVENTARIO
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 116, OLD.inin_id, 'D', OLD.pref_pre);
end
^

/* Trigger: INTERFAZ_INVENTARIO_AI */
CREATE TRIGGER INTERFAZ_INVENTARIO_AI FOR INTERFAZ_INVENTARIO
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.ININ_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 116, NEW.inin_id, 'I', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_INVENTARIO_AU */
CREATE TRIGGER INTERFAZ_INVENTARIO_AU FOR INTERFAZ_INVENTARIO
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 116, NEW.inin_id, 'U', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_INVENTARIO_CTAS_BI */
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
^

/* Trigger: INTERFAZ_INVENTARIO_CTAS_BU */
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
^

/* Trigger: INTERFAZ_INVENTARIO_N_AD */
CREATE TRIGGER INTERFAZ_INVENTARIO_N_AD FOR INTERFAZ_INVENTARIO_NIIF
ACTIVE AFTER DELETE POSITION 0
as
declare variable PREF CHAR(4);
begin
SELECT PREF_PRE FROM INTERFAZ_INVENTARIO WHERE ININ_ID = OLD.ININ_ID INTO :PREF;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1116, OLD.inin_id, 'D', :pref);
end
^

/* Trigger: INTERFAZ_INVENTARIO_N_AI */
CREATE TRIGGER INTERFAZ_INVENTARIO_N_AI FOR INTERFAZ_INVENTARIO_NIIF
ACTIVE AFTER INSERT POSITION 0
as
declare variable PREF CHAR(4);
begin
SELECT PREF_PRE FROM INTERFAZ_INVENTARIO WHERE ININ_ID = NEW.ININ_ID INTO :PREF;
IF (NEW.ININ_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1116, NEW.inin_id, 'I', :pref);
end
^

/* Trigger: INTERFAZ_INVENTARIO_N_AU */
CREATE TRIGGER INTERFAZ_INVENTARIO_N_AU FOR INTERFAZ_INVENTARIO_NIIF
ACTIVE AFTER UPDATE POSITION 0
as
declare variable PREF CHAR(4);
begin
SELECT PREF_PRE FROM INTERFAZ_INVENTARIO WHERE ININ_ID = NEW.ININ_ID INTO :PREF;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1116, NEW.inin_id, 'U', :pref);
end
^

/* Trigger: INTERFAZ_VENTAS_AD */
CREATE TRIGGER INTERFAZ_VENTAS_AD FOR INTERFAZ_VENTAS
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 117, OLD.inve_id, 'D', OLD.pref_pre);
end
^

/* Trigger: INTERFAZ_VENTAS_AI */
CREATE TRIGGER INTERFAZ_VENTAS_AI FOR INTERFAZ_VENTAS
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.INVE_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 117, NEW.inve_id, 'I', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_VENTAS_AU */
CREATE TRIGGER INTERFAZ_VENTAS_AU FOR INTERFAZ_VENTAS
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 117, NEW.inve_id, 'U', NEW.pref_pre);
end
^

/* Trigger: INTERFAZ_VENTAS_CTAS_BI */
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
^

/* Trigger: INTERFAZ_VENTAS_CTAS_BU */
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
^

/* Trigger: LIQUIDACION_AD */
CREATE TRIGGER LIQUIDACION_AD FOR LIQUIDACION
ACTIVE AFTER DELETE POSITION 0
as
declare variable IDPR INTEGER;
declare variable ITEMPR INTEGER;
declare variable PRESTAMO NUMERIC(18,2);
declare variable MONTO NUMERIC(18,2);
begin
if ((OLD.liqd_vacid IS NOT NULL) AND (OLD.liqd_vacid <> 0)) then
    BEGIN
    DELETE FROM vacaciones_detalle WHERE vaca_id = OLD.liqd_vacid;
    DELETE FROM vacaciones WHERE vaca_id = OLD.liqd_vacid;
    END
/* BORRE LA NOMINA */
if ((OLD.liqd_nomid IS NOT NULL) AND (OLD.liqd_nomid <> 0)) then
    BEGIN
    DELETE FROM nomina_conceptos WHERE NOMI_ID = OLD.liqd_nomid;
    DELETE FROM NOMINA WHERE NOMI_ID = OLD.liqd_nomid;
    END
UPDATE EMPLEADOS SET EMPL_FECRET = null WHERE TERC_NIT = old.terc_nit;
DELETE FROM ingresos_empleado WHERE TERC_NIT = OLD.terc_nit AND INEM_FECHA = OLD.liqd_fecha AND INEM_INGRESO = 'N';

/* SI GRABO COMPROBANTE DE AJUSTE DE PROVISIONES BORRELO */
DELETE FROM COMPROBANTE_DETALLE CD
    WHERE EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = 99 AND ENCO_IDREF = OLD.liqd_id AND ENCO_CONSEC = CD.enco_consec);
DELETE FROM comprobante_encabezado WHERE ENCO_TIPOREF = 99 AND ENCO_IDREF = OLD.liqd_id ;

/* VUELVA A DEJAR PENDIENTES LAS CUOTAS PAGADAS CON LA LIQUIDACION */
PRESTAMO = OLD.liqd_dsprestamo;
FOR SELECT P.prno_id, P.prcu_item, P.prcu_monto from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
    where PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = OLD.TERC_NIT AND P.prcu_nomiid = OLD.liqd_nomid
    into :IDPR, ITEMPR, :MONTO
    DO
    BEGIN
    if (PRESTAMO > 0) then
        if (PRESTAMO >= MONTO) then
            BEGIN
            update PRESTAMO_CUOTAS P set PRCU_OK = 'N', PRCU_ABONO = 0, PRCU_NOMIID = 0
                where P.prno_id = :IDPR and P.prcu_item = :ITEMPR;
            PRESTAMO = PRESTAMO - MONTO;
            END
        else
            BEGIN
            update PRESTAMO_CUOTAS P set PRCU_OK = 'N', PRCU_ABONO = PRCU_ABONO - :prestamo, PRCU_NOMIID = 0
                where P.prno_id = :IDPR and P.prcu_item = :ITEMPR;
            PRESTAMO = 0;
            END
    END
/* anule los abonos de cartera */
update nomina_cartera_detalle nd set nd.ncde_anulado = 'S' where nd.ncar_id = old.liqd_idcar;
delete from nomina_cartera where ncar_id = old.liqd_idcar;
end
^

/* Trigger: LIQUIDACION_AI */
CREATE TRIGGER LIQUIDACION_AI FOR LIQUIDACION
ACTIVE AFTER INSERT POSITION 0
AS
declare variable PERIODICIDAD INTEGER;
declare variable IDPR INTEGER;
declare variable ITEMPR INTEGER;
BEGIN
SELECT EMPL_PPAGO FROM EMPLEADOS WHERE TERC_NIT = NEW.terc_nit INTO :periodicidad;
UPDATE EMPLEADOS SET EMPL_FECRET = NEW.liqd_fecha WHERE TERC_NIT = NEW.terc_nit;
INSERT INTO ingresos_empleado (TERC_NIT, INEM_FECHA, INEM_INGRESO) VALUES (NEW.terc_nit, NEW.liqd_fecha, 'N');

/* marque las novedades usadas en esta nomina */
update nomina_novedades_detalle ND
    SET NOMI_ID = NEW.liqd_nomid
    WHERE ND.NNDE_PERIODO = NEW.liqd_periodo AND ND.NNDE_ANO = EXTRACT(YEAR FROM NEW.liqd_fecha) AND
    EXISTS (SELECT NONO_ID FROM nomina_novedades WHERE NONO_ID = ND.nono_id AND TERC_NIT = NEW.terc_nit AND NONO_PPAGO = :periodicidad);
/* marque horas usadas */
update nomina_horasext ND
    set nd.noex_nomid = new.liqd_nomid
    where ND.noex_periodio = new.liqd_periodo and ND.noex_ano = EXTRACT(YEAR FROM NEW.liqd_fecha) and nd.terc_nit = new.terc_nit and nd.noex_periodicidad = :periodicidad;
/* LOS PRESTAMOS PENDIENTES MARQUELOS COMO PAGADOS */
FOR SELECT P.prno_id, P.prcu_item from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
    where PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = NEW.TERC_NIT AND PRCU_MONTO > PRCU_ABONO
    into :IDPR, ITEMPR
    DO
    update PRESTAMO_CUOTAS P set PRCU_OK = 'S', PRCU_ABONO = PRCU_MONTO, PRCU_NOMIID = NEW.liqd_nomid
        where P.prno_id = :IDPR and P.prcu_item = :ITEMPR;
END
^

/* Trigger: LIQUIDACION_BI */
CREATE TRIGGER LIQUIDACION_BI FOR LIQUIDACION
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PERIODIC INTEGER;
declare variable ANO CHAR(4);
declare variable CONC INTEGER;
declare variable MONTO NUMERIC(18, 2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_deduc char(1);
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable salario char(1);
declare variable gtoempr char(1);
declare variable conc_aplicaprom char(1);
declare variable ITEM INTEGER;
declare variable conc_modifi char(1);
declare variable CAUSAPROV CHAR(2);
declare variable VALOR NUMERIC(18, 2);
declare variable basefsp integer;
declare variable porcdd numeric(9,4);
declare variable deddp char(1);
declare variable dedd numeric(18,2);
declare variable dedv numeric(18,2);
declare variable dedmp numeric(18,2);
declare variable maxdd numeric(18,2);
declare variable maxdv numeric(18,2);
declare variable maxdmp numeric(18,2);
declare variable PENS numeric(18,2);
declare variable SALU numeric(18,2);
declare variable UVT numeric(18,2);
declare variable EX25 numeric(18,2);
declare variable MASUVT numeric(18,2);
declare variable MENOSUVT numeric(18,2);
declare variable DEDSALUD numeric(18,2);
declare variable DEDPEN numeric(18,2);
declare variable FSP numeric(18,2);
declare variable APPENS numeric(18,2);
declare variable APSALU numeric(18,2);
declare variable BASEPEN numeric(18,2);
declare variable TOTDEV numeric(18,2);
declare variable RETFTE numeric(18,2);
declare variable BASERT numeric(18,2);
declare variable BASERM numeric(18,2);
declare variable RETMIN numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
declare variable DIAS INTEGER;
declare variable IDC INTEGER;
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCOMP VARCHAR(4);
declare variable CTARECUP VARCHAR(20);
declare variable CTAPROV VARCHAR(20);
declare variable CTACXP VARCHAR(20);
declare variable FECCONTA CHAR(8);
declare variable SALDOPRV numeric(18,2);
declare variable PROY CENTRO;
declare variable CENTRO CENTRO;
declare variable ITEMC INTEGER;
declare variable TIPO 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 RCREE NUMERIC(18,2);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable codsuc VARCHAR(10);
begin
SELECT empl_salinteg, EMPL_PPAGO FROM EMPLEADOS WHERE TERC_NIT = NEW.terc_nit INTO :salinteg, :periodic;
execute procedure periodo_nom_fechaf(NEW.liqd_fecha, :PERIODIC) returning_values (new.liqd_periodo, :ano);
if (new.liqd_vacacion <> 0) then
    begin
    /* GRABE LAS VACACIONES COMPENSADAS */
    NEW.liqd_vacid = GEN_ID(ID_VACACIONES,1);
    DIAS = FLOOR(NEW.liqd_vacacion * 720 / NEW.liqd_basevac);
    INSERT INTO VACACIONES(VACA_ID, TERC_NIT, VACA_FECHA, VACA_DIAS, VACA_SALARIO, VACA_MONTO,
        VACA_OK, VACA_PERIODO, VACA_FECFIN, VACA_DIASSOL, VACA_PAGONOM, VACA_DISFR, VACA_DIASACU, VACA_FECINI)
        VALUES (NEW.liqd_vacid, NEW.terc_nit, NEW.liqd_fecha, :DIAS, NEW.liqd_basevac, NEW.liqd_vacacion,
        'S', NEW.liqd_periodo, NEW.liqd_fecha, :DIAS, 'S', 'N', :DIAS, NEW.liqd_fecha);
    INSERT INTO vacaciones_detalle(VACA_ID, VACD_ITEM, VACD_ANO, VACD_PERIODO, VACD_PERIODICIDAD, VACD_PAGANOM, VACD_DIAS, VACD_MONTO)
        VALUES(NEW.liqd_vacid, 1, EXTRACT(year FROM NEW.liqd_fecha), NEW.liqd_periodo, :periodic, 'S', :DIAS, NEW.liqd_vacacion);
    end
/* CANCELE LA CARTERA */
if (new.liqd_dscartera <> 0) then
    begin
    new.liqd_idcar = gen_id(id_nomicomi, 1);
    item = 0;
    insert into NOMINA_CARTERA (NCAR_ID, NCAR_PERIODICIDAD, TERC_NIT, NCAR_ANO, NCAR_PERIODO, NCAR_MONTO, NCAR_FECHA)
        values (new.liqd_idcar, :periodic, NEW.TERC_NIT, EXTRACT(YEAR FROM NEW.liqd_fecha), NEW.liqd_periodo, NEW.liqd_dscartera, NEW.liqd_fecha);
    FOR SELECT CODSUC, TIPO, ID, PREFIJO, numero, SALDO, RTFTE, RTIVA, RTICA, RCREE
        FROM CARTERA_CLIENTE(NEW.terc_nit, NEW.liqd_fecha, '0', 0, 'N', 0)
        into :CODSUC, :TIPO, :IDDOC, :PREFIJO, :numero, :SALDO, :RTFTE, :RTIVA, :RTICA, :RCREE
        DO
        BEGIN
        ITEM = ITEM + 1;
        insert into NOMINA_CARTERA_DETALLE (NCAR_ID, NCDE_ITEM, NCDE_TIPODOC, NCDE_IDDOC, NCDE_PREFIJO, NCDE_NUMERO, NCDE_ABONO,
            NCDE_RTFTE, NCDE_RTIVA, NCDE_RTICA, NCDE_DTOF, NCDE_ANULADO, NCDE_TRANSMIT,
            NCDE_COMIP, NCDE_SUCURSAL, NCDE_DIFCAMBIO, NCDE_OK, NCDE_RCREE)
            values (new.liqd_idcar, :ITEM, :TIPO, :IDDOC, :PREFIJO, :NUMERO, :SALDO, :RTFTE,
                :RTIVA, :RTICA, 0, 'N', 'N', 0, :CODSUC, 0, 'S', :RCREE);
        END
    end
/* INSERTE UNA NOMINA POR PAGAR-PERIODICIDAD 4 */
execute procedure CAMBIE_ID_NOMINA returning_values(NEW.liqd_nomid);
insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK, NOMI_CONC, NOMI_TIPO)
    values (NEW.liqd_nomid, NEW.liqd_fecha, 'N', 4, NEW.liqd_periodo, :ANO, 'S', 'LIQUIDACION EMPLEADO ' || NEW.TERC_NIT, 'L');
ITEM = 1;
/* INSERTE LOS DETALLES INCLUIDOS */
FOR SELECT CONC_COD, VALOR, ENTIDAD FROM causa_nomina_empleado(NEW.liqd_fecha, NEW.terc_nit, NEW.liqd_diaslab, 'P', 'N')
    INTO :CONC, :MONTO, :ENTIDAD
    DO
    BEGIN
    if (MONTO < 0) then
        MONTO = MONTO * -1;
    SELECT CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR
        FROM conceptos_nomina WHERE CONC_COD = :conc
        INTO :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR;
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, :conc, NEW.terc_nit, :monto, :entidad, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.liqd_periodo, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
    ITEM = ITEM + 1;
    END
FOR SELECT CONC_COD, VALOR, ENTIDAD FROM causa_nomina_empleado(NEW.liqd_fecha, NEW.terc_nit, NEW.liqd_diaslab, 'B', 'N')
    INTO :CONC, :MONTO, :ENTIDAD
    DO
    BEGIN
    if (MONTO < 0) then
        MONTO = MONTO * -1;
    SELECT CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR
        FROM conceptos_nomina WHERE CONC_COD = :conc
        INTO :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR;
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, :conc, NEW.terc_nit, :monto, :entidad, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.liqd_periodo, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
    ITEM = ITEM + 1;
    END
FOR SELECT CONC_COD, VALOR, ENTIDAD FROM causa_nomina_empleado(NEW.liqd_fecha, NEW.terc_nit, NEW.liqd_diaslab, 'A', 'N')
    INTO :CONC, :MONTO, :ENTIDAD
    DO
    BEGIN
    SELECT CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR
        FROM conceptos_nomina WHERE CONC_COD = :conc
        INTO :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR;
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, :conc, NEW.terc_nit, :monto, :entidad, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.liqd_periodo, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
    ITEM = ITEM + 1;
    END
execute procedure lee_configuracion('NOMINA', 'LIQUIDACION', 'INCLUIR PROVISIONES EN LIQUIDACION DEFINITIVA') returning_values (CAUSAPROV);
if (causaprov = 'SI') then
    FOR SELECT CONC_COD, VALOR, ENTIDAD FROM causa_nomina_empleado(NEW.liqd_fecha, NEW.terc_nit, NEW.liqd_diaslab, 'V', 'N')
        INTO :CONC, :MONTO, :ENTIDAD
        DO
        BEGIN
        SELECT CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR
            FROM conceptos_nomina WHERE CONC_COD = :conc
            INTO :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR;
        insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
            values (NEW.liqd_nomid, :ITEM, :conc, NEW.terc_nit, :monto, :entidad, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.liqd_periodo, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
        ITEM = ITEM + 1;
        END
/* HAGA LA CONTABILIZACION DE LOS AJUSTES DE PROVISIONES */
execute PROCEDURE lee_configuracion('NOMINA', 'LIQUIDACION', 'TIPO DE COMPROBANTE CONTABLE A GENERAR PARA AJUSTAR LAS PROVISIONES') returning_values (:TIPOCOMP);
execute PROCEDURE lee_configuracion('NOMINA', 'LIQUIDACION', 'PREFIJO COMPROBANTE CONTABLE A GENERAR PARA AJUSTAR LAS PROVISIONES') returning_values (:prefcomp);
IDC = 0;
if ((TIPOCOMP <> '') AND (PREFCOMP <> '')) then
    BEGIN
    IDC = GEN_ID(id_comproba, 1);
    EXECUTE PROCEDURE fecha_a_conta(NEW.liqd_fecha) returning_values (:fecconta);
    insert into COMPROBANTE_ENCABEZADO (ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, ENCO_CONCEPTO,
        ENCO_REFER, ENCO_TIPOREF, ENCO_IDREF, ENCO_USUARIO, TERC_NIT, ENCO_NOMTERC,
        ENCO_MONTO, ENCO_DESCONTABLE, ENCO_MANDANTE, ENCO_REPNIIF, ENCO_OBS, ENCO_CONTANIIF)
    values (:IDC, :tipocomp, :prefcomp, '000001', :fecconta, 'AJUSTE PROVISIONES LIQUIDACION EMPLEADO ' || NEW.terc_nit,
        NULL, 99, NEW.liqd_id, USER, NEW.terc_nit, NULL, 0, 'S', NULL, 'S', NULL, 'N');
    SELECT E.proy_cod, E.cent_cod FROM empleados E WHERE TERC_NIT = NEW.terc_nit INTO :proy, :centro;
    EXECUTE PROCEDURE lee_configuracion ('NOMINA', 'LIQUIDACION', 'CUENTA CONTABLE DE RECUPERACION SI PROVISION MAYOR AL PAGO DE CESANTIA, PRIMA O VACACIONES') returning_values (ctarecup);
    END
/* AGREGUE LOS CONCEPTOS DE LA LIQUIDACION */
/* INDEMINZACION */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 961, NEW.terc_nit, NEW.liqd_indemnizacion, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
/* CESANTIA */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 969, NEW.terc_nit, NEW.liqd_cesantia, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
/* CALCULE DIFERENCIA PROVISIONES */
if (IDC <> 0) then
    BEGIN
    SALDOPRV = 0;
    ITEMC = 0;
    SELECT CONC_CTAGAST FROM conceptos_nomina WHERE CONC_COD = 969 INTO :ctaprov;
    EXECUTE PROCEDURE saldo_tercero(:ctaprov, NEW.terc_nit, :fecconta) returning_values (:SALDOPRV);
    SALDOPRV = SALDOPRV + NEW.liqd_cesantia;
    SELECT FIRST 1 CONC_CTAGAST FROM conceptos_nomina CN, empleado_conceptos EC WHERE EC.conc_cod = CN.conc_cod AND EC.terc_nit = NEW.terc_nit
        AND ((EC.CONC_COD = 912) or (EC.CONC_COD = 913) OR (EC.CONC_COD = 937) or (EC.CONC_COD = 1015)) INTO :ctacxp;
    if (SALDOPRV > 0) then
        BEGIN
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctaprov, 'AJUSTE CESANTIA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, 0, :saldoprv, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctacxp, 'AJUSTE CESANTIA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, :saldoprv, 0, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        END
    if (SALDOPRV < 0) then
        BEGIN
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctaprov, 'AJUSTE CESANTIA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, ABS(:saldoprv), 0, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        ITEMC = ITEMC + 1;
        if ((ctarecup is not null) and (ctarecup <> ''))  then
            ctacxp = ctarecup;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctacxp, 'AJUSTE CESANTIA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, 0, ABS(:saldoprv), 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        END
    END
/* INT. CESANTIA */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 968, NEW.terc_nit, NEW.liqd_intces, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
if (IDC <> 0) then
    BEGIN
    SALDOPRV = 0;
    SELECT CONC_CTAGAST FROM conceptos_nomina WHERE CONC_COD = 968 INTO :ctaprov;
    EXECUTE PROCEDURE saldo_tercero(:ctaprov, NEW.terc_nit, :fecconta) returning_values (:SALDOPRV);
    SALDOPRV = SALDOPRV + NEW.liqd_intces;
    SELECT FIRST 1 CONC_CTAGAST FROM conceptos_nomina CN, empleado_conceptos EC WHERE EC.conc_cod = CN.conc_cod AND EC.terc_nit = NEW.terc_nit
        AND ((EC.CONC_COD = 923) or (EC.CONC_COD = 924) OR (EC.CONC_COD = 941) or (EC.CONC_COD = 1019)) INTO :ctacxp;
    if (SALDOPRV > 0) then
        BEGIN
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctaprov, 'AJUSTE INT. CESANTIA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, 0, :saldoprv, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctacxp, 'AJUSTE INT. CESANTIA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, :saldoprv, 0, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        END
    if (SALDOPRV < 0) then
        BEGIN
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctaprov, 'AJUSTE INT. CESANTIA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, ABS(:saldoprv), 0, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        ITEMC = ITEMC + 1;
        if ((ctarecup is not null) and (ctarecup <> ''))  then
            ctacxp = ctarecup;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctacxp, 'AJUSTE INT. CESANTIA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, 0, ABS(:saldoprv), 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        END
    END
/* PRIMA */
if (EXTRACT(MONTH FROM NEW.liqd_fecha) > 6) then
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, 967, NEW.terc_nit, NEW.liqd_prima, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ELSE
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, 966, NEW.terc_nit, NEW.liqd_prima, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
if (IDC <> 0) then
    BEGIN
    SALDOPRV = 0;
    SELECT CONC_CTAGAST FROM conceptos_nomina WHERE CONC_COD = 967 INTO :ctaprov;
    EXECUTE PROCEDURE saldo_tercero(:ctaprov, NEW.terc_nit, :fecconta) returning_values (:SALDOPRV);
    SALDOPRV = SALDOPRV + NEW.liqd_prima;
    SELECT FIRST 1 CONC_CTAGAST FROM conceptos_nomina CN, empleado_conceptos EC WHERE EC.conc_cod = CN.conc_cod AND EC.terc_nit = NEW.terc_nit
        AND ((EC.CONC_COD = 925) or (EC.CONC_COD = 927) OR (EC.CONC_COD = 942) or (EC.CONC_COD = 1020)) INTO :ctacxp;
    if (SALDOPRV > 0) then
        BEGIN
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctaprov, 'AJUSTE PRIMA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, 0, :saldoprv, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctacxp, 'AJUSTE PRIMA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, :saldoprv, 0, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        END
    if (SALDOPRV < 0) then
        BEGIN
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctaprov, 'AJUSTE PRIMA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, ABS(:saldoprv), 0, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        ITEMC = ITEMC + 1;
        if ((ctarecup is not null) and (ctarecup <> ''))  then
            ctacxp = ctarecup;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctacxp, 'AJUSTE PRIMA LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, 0, ABS(:saldoprv), 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        END
    END
/* VACACIONES */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 950, NEW.terc_nit, NEW.liqd_vacacion, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
if (IDC <> 0) then
    BEGIN
    SALDOPRV = 0;
    SELECT CONC_CTAGAST FROM conceptos_nomina WHERE CONC_COD = 950 INTO :ctaprov;
    EXECUTE PROCEDURE saldo_tercero(:ctaprov, NEW.terc_nit, :fecconta) returning_values (:SALDOPRV);
    SALDOPRV = SALDOPRV + NEW.liqd_vacacion;
    SELECT FIRST 1 CONC_CTAGAST FROM conceptos_nomina CN, empleado_conceptos EC WHERE EC.conc_cod = CN.conc_cod AND EC.terc_nit = NEW.terc_nit
        AND ((EC.CONC_COD = 929) or (EC.CONC_COD = 930) OR (EC.CONC_COD = 944) or (EC.CONC_COD = 1021)) INTO :ctacxp;
    if (SALDOPRV > 0) then
        BEGIN
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctaprov, 'AJUSTE VACACIONES LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, 0, :saldoprv, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctacxp, 'AJUSTE VACACIONES LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, :saldoprv, 0, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        END
    if (SALDOPRV < 0) then
        BEGIN
        ITEMC = ITEMC + 1;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctaprov, 'AJUSTE VACACIONES LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, ABS(:saldoprv), 0, 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        ITEMC = ITEMC + 1;
        if ((ctarecup is not null) and (ctarecup <> ''))  then
            ctacxp = ctarecup;
        insert into COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL,
            CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
        values (:IDC, :ITEMC, :ctacxp, 'AJUSTE VACACIONES LIQUIDACION EMPLEADO ' || NEW.terc_nit, NULL, 0, ABS(:saldoprv), 0,
            0, NEW.terc_nit, :proy, :centro, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'S');
        END
    END
/* DESCUENTO PRESTAMOS */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 922, NEW.terc_nit, NEW.liqd_dsprestamo, NULL, 'S', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
/* CARTERA */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 954, NEW.terc_nit, NEW.liqd_dscartera, NULL, 'S', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
/* RETENCION EN LA FUENTE */
if (EXISTS (SELECT E.terc_nit FROM empleado_conceptos E WHERE TERC_NIT = NEW.terc_nit AND CONC_COD = 962)) Then  --RETEFTE
    begin
    SELECT E.emco_monto FROM empleado_conceptos E WHERE TERC_NIT = NEW.terc_nit AND CONC_COD = 962 into :valor;
    BASERT = 0;
    if ((valor is null) or (valor  = 0)) then
        begin
        SELECT paan_salinteg, PAAN_SALMINIMO, PAAN_DEDDEP, PAAN_MAXDEDDEP*PAAN_UVT, PAAN_MAXDEDMP, PAAN_MAXDEDAFC, PAAN_AFPTR, PAAN_EPSTR, PAAN_UVT
            FROM parametros_ano WHERE PAAN_ANO = :ANO
            INTO :TAR_SALINTEG, SMLV, :PORCDD, :MAXDD, :MAXDMP, :MAXDV, :PENS, :SALU, :UVT;
        select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
            where N.nomi_id = NC.nomi_id AND N.nomi_id = NEW.liqd_nomid
            and NC.CONC_COD = C.CONC_COD and C.conc_basert = 'S' AND c.conc_benefic = 'N' and
            NC.TERC_NIT = NEW.terc_nit and c.conc_cod <> 950 into :valor;
        if (valor is null) then
            valor = 0;
        TOTDEV = VALOR;
        ENTIDAD = NEW.terc_nit;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'VALOR', :VALOR, new.liqd_nomid, 962);
        /* exenciones */
        SELECT EMPL_DEDDEP, EMPL_DEDINTV, EMPL_DEDAFC+EMPL_AFPVOLNORET,EMPL_DEDMEDP,EMPL_DEDSALUD FROM empleados WHERE TERC_NIT = NEW.terc_nit
            INTO :DEDDP, :DEDV, :DEDPEN, :DEDMP, :DEDSALUD;
        if (DEDV IS NULL) THEN
            DEDV = 0;
        if (DEDMP IS NULL) THEN
            DEDMP = 0;
        if (DEDSALUD IS NULL) THEN
            DEDSALUD = 0;
        if (DEDPEN IS NULL) THEN
            DEDPEN = 0;
        /* APORTES A PENSIONES */
        FSP = 0;
    
        if ((VALOR / SMLV) < 25) then
            BEGIN
            if (salinteg = 'S') then
                BASEPEN = VALOR * tar_salinteg/100;
            else
                BASEPEN = VALOR;
            END
        else
            BASEPEN = SMLV * 25;
    
        if (:PERIODIC = 1) Then
            BASEFSP = FLOOR(BASEPEN / smlv);
        else
            if (:PERIODIC = 2) then
                BASEFSP = FLOOR(BASEPEN*2 / smlv);
            else
                BASEFSP = FLOOR(BASEPEN*4 / smlv);
        if (BASEFSP >= 4) then
             BEGIN
             SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= :BASEFSP AND
                 FSPE_SMLVFIN >= :BASEFSP INTO :porcen;
             FSP = basepen * PORCEN/100;
             END
        APPENS = BASEPEN * PENS/100;
        if (NOT EXISTS (SELECT CONC_COD FROM empleado_conceptos EC WHERE EC.terc_nit = NEW.terc_nit and
            (EC.conc_cod = 904) or (EC.conc_cod = 921))) then
            BEGIN
            /* NO APORTA A PENSIONES */
            BASEPEN = 0;
            BASEFSP = 0;
            FSP = 0;
            APPENS = 0;
            END
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'BASEPEN', :BASEPEN, new.liqd_nomid, 962);
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'FSP', :FSP, new.liqd_nomid, 962);
        APSALU = BASEPEN * SALU/100;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'APPENS', :APPENS, new.liqd_nomid, 962);
        if (DEDV > (MAXDV * UVT)) then
            DEDV = MAXDV*UVT;
        if (DEDMP > (MAXDMP*UVT)) then
            DEDMP = MAXDMP*UVT;
        if (periodic = 2) then
            valor = valor * 2;
        if (periodic = 3) then
            valor = valor * 4;
        select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
            where N.nomi_id = NC.nomi_id AND NC.CONC_COD = C.CONC_COD and C.conc_basert = 'S' AND c.conc_benefic = 'S' and
            NC.TERC_NIT = NEW.terc_nit AND N.nomi_id = NEW.liqd_nomid into :beneficios;
        if (beneficios is null) then
            beneficios = 0;
        VALOR = VALOR + BENEFICIOS;
        TOTDEV = TOTDEV + BENEFICIOS;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'BENEFICIOS', :beneficios, new.liqd_nomid, 962);
        DEDPEN = DEDPEN + FSP + appens;
        if (DEDPEN > VALOR * 0.3) then
            DEDPEN = VALOR * 0.3;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'VACACIONES', NEW.liqd_vacacion, new.liqd_nomid, 962);
        VALOR = VALOR + NEW.liqd_vacacion;
        TOTDEV = TOTDEV + NEW.liqd_vacacion;
        if (DEDDP = 'S') then
            BEGIN
            DEDD = VALOR * PORCDD / 100;
            if (DEDD > MAXDD) then
                DEDD = MAXDD;
            INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'DEDDP', :DEDD, new.liqd_nomid, 962);
            END
        ELSE
            DEDD = 0;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'DEDPEN', :dedpen, new.liqd_nomid, 962);
        VALOR = VALOR - DEDPEN;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'VALOR - DEDPEN', :VALOR, new.liqd_nomid, 962);
        VALOR = VALOR - DEDV - DEDMP;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'VALOR - DEDV-DEDMP', :VALOR, new.liqd_nomid, 962);
        VALOR = VALOR - DEDD;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'VALOR - DEDD', :VALOR, new.liqd_nomid, 962);
        VALOR = VALOR - DEDSALUD;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'VALOR - DEDSALUD', :VALOR, new.liqd_nomid, 962);
        EX25 = VALOR * 0.25;
        if (EX25 > 240*UVT) then
            EX25 = 240*UVT;
        VALOR = VALOR - EX25;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'VALOR - EX25', :VALOR, new.liqd_nomid, 962);
    
        PORCEN = NULL;
        SELECT FIRST 1 RETE_PORC, RETE_MASUVT, RETE_MENOSUVT FROM RETENCIONES WHERE RETE_DESDE <= :VALOR AND RETE_HASTA >= :VALOR AND RETE_ANO = :ANO
            INTO :PORCEN, :MASUVT, :MENOSUVT;
        if (PORCEN IS NULL) then
            PORCEN = 0;
        if (PORCEN <> 0) then
            BEGIN
            BASERT = VALOR;
            INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'PORCEN', :PORCEN, new.liqd_nomid, 962);
            INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'MENOSUVT', :MENOSUVT*:UVT, new.liqd_nomid, 962);
            INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'MASUVT', :MASUVT*:UVT, new.liqd_nomid, 962);
            VALOR = ((:VALOR - (:MENOSUVT*UVT)) * (:PORCEN /100)) + (MASUVT * UVT);
            VALOR = ROUND(:valor, -3);
            INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'RETENCION', :VALOR, new.liqd_nomid, 962);
            END
        ELSE
            VALOR = 0;
        retfte = VALOR;
        /* AHORA LA RETENCION MINIMA */
        VALOR = TOTDEV - appens - apsalu - fsp;
        BASERM = VALOR;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'BASE RET MINIMA', :VALOR, new.liqd_nomid, 962);
        VALOR = VALOR / UVT;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'BASE RETMIN EN UVT', :VALOR, new.liqd_nomid, 962);
        SELECT FIRST 1 RETM_HASTA FROM retencion_minima WHERE RETM_ANO = :ANO
            ORDER BY RETM_HASTA INTO :RETMIN;
        if (VALOR > RETMIN) then
            BEGIN
            PORCEN = NULL;
            SELECT FIRST 1 RETM_RETE FROM retencion_minima WHERE RETM_HASTA <= :VALOR AND RETM_ANO = :ANO
                ORDER BY RETM_HASTA DESC
                INTO :PORCEN;
            if (PORCEN IS NULL) then
                PORCEN = 0;
            END
        ELSE
            PORCEN = 0;
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'PORCENTAJE RETMIN', :PORCEN, new.liqd_nomid, 962);
        if (PORCEN <> 0) then
            VALOR = PORCEN * UVT;
        else
            VALOR = 0;
        VALOR = ROUND(:valor, -3);
        INSERT INTO valores_nomina VALUES(NEW.terc_nit, 'RET MINIMA', :VALOR, new.liqd_nomid, 962);
        if (VALOR < RETFTE) then
            VALOR = RETFTE;
        ELSE
            BASERT = BASERM;
        end
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR, NOCO_BASE)
        values (NEW.liqd_nomid, :ITEM, 962, NEW.terc_nit, :VALOR, NULL, 'S', 'N', 'S', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N', :BASERT);
    ITEM = ITEM + 1;
    END
end
^

/* Trigger: LIQUIDACION_RUTA_COLEGIO_AD */
CREATE TRIGGER LIQUIDACION_RUTA_COLEGIO_AD FOR LIQUIDACION_RUTA_COLEGIO
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
if ((old.liqr_id <> 0) AND (OLD.liqr_anulado = 'N')) then
    begin
    update notas_debito_proveedor set ndpr_anulado = 'S' where ndpr_id = old.liqr_idnd;
    DELETE FROM notas_debito_proveedor where ndpr_id = old.liqr_idnd;
    select enco_consec from comprobante_encabezado where enco_tiporef = 182 and enco_idref = old.liqr_id into :consec;
    if (NOT consec is null) then
       begin
       delete from comprobante_detalle where enco_consec = :consec;
       delete from comprobante_detalle_niif where enco_consec = :consec;
       delete from comprobante_encabezado where enco_tiporef = 182 and enco_idref = old.liqr_id;
       end
    end
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 182, OLD.liqr_id, 'D', OLD.liqr_numero);
end
^

/* Trigger: LIQUIDACION_RUTA_COLEGIO_AI */
CREATE TRIGGER LIQUIDACION_RUTA_COLEGIO_AI FOR LIQUIDACION_RUTA_COLEGIO
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 182, NEW.liqr_id, 'I', NEW.liqr_numero);
end
^

/* Trigger: LIQUIDACION_RUTA_COLEGIO_AU */
CREATE TRIGGER LIQUIDACION_RUTA_COLEGIO_AU FOR LIQUIDACION_RUTA_COLEGIO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec integer;
begin
if ((old.liqr_id <> 0) AND (OLD.liqr_anulado = 'N')) then
    begin
    if ((NEW.liqr_id <> 0) AND (NEW.liqr_anulado = 'S')) then
        BEGIN
        update notas_debito_proveedor set ndpr_anulado = 'S' where ndpr_id = old.liqr_idnd;
        END
    end
if (new.liqr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 182 and enco_idref = old.liqr_id into :consec;
    if (NOT consec is null) then
       begin
       delete from comprobante_detalle where enco_consec = :consec;
       delete from comprobante_detalle_niif where enco_consec = :consec;
       delete from comprobante_encabezado where enco_tiporef = 182 and enco_idref = old.liqr_id;
       end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 182, NEW.liqr_id, 'A', NEW.liqr_numero);
    end
else
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 182, NEW.liqr_id, 'U', NEW.liqr_numero);
end
^

/* Trigger: LIQUIDACION_RUTA_COLEGIO_BI */
CREATE TRIGGER LIQUIDACION_RUTA_COLEGIO_BI FOR LIQUIDACION_RUTA_COLEGIO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable NOMRUTA VARCHAR(60);
declare variable PROY CENTRO;
declare variable CENTRO CENTRO;
declare variable CTAPAGAR ctaconta;
declare variable CTAGASTO ctaconta;
declare variable IDC INTEGER;
declare variable IDI INTEGER;
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
begin
if (NEW.liqr_numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 182 AND PREF_PRE = '0000' INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.liqr_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 182 AND PREF_PRE = '0000';
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.liqr_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 182 AND PREF_PRE = '0000';
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.liqr_numero) returning_values (NEW.liqr_numero);
  NEW.liqr_numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM liquidacion_ruta_colegio WHERE LIQR_NUMERO = NEW.liqr_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una liquidacion con el numero ' || new.liqr_numero;
/* GENERE LA CUENTA POR PAGAR */
NEW.liqr_idnd = GEN_ID(id_notadbprov,1);
/* grabe el gasto */
SELECT FIRST 1 PREF_PRE, PREF_ACTUAL, PREF_PROY, PREF_CENTRO FROM PREFIJOS P WHERE TIDO_COD = 51 AND pref_activo = 'S'
    INTO :PREF, :NUMERO, :PROY, :CENTRO;
EXECUTE PROCEDURE lee_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE POR PAGAR EN LIQUIDACION DE RUTAS DE COLEGIOS')
    returning_values (CTAPAGAR);
EXECUTE PROCEDURE lee_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE DEBITO EN LIQUIDACION DE RUTAS DE COLEGIOS')
    returning_values (ctagasto);
SELECT R.rutc_nombre FROM rutas_colegios R WHERE R.rutc_id = NEW.liqr_ruta INTO :NOMRUTA;
INSERT INTO NOTAS_DEBITO_PROVEEDOR (NDPR_ID, TERC_NIT, TIDO_COD, PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_CONC, 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, NDPR_ANULADO, NDPR_TRANSMIT,
    NDPR_PROY, NDPR_CENTRO, NDPR_CTACAUSA, NDPR_CTAPAGAR, NDPR_NUMPROV, NDPR_USUARIO, NUMOK, NDPR_TRM, NDPR_BASERTFTE,
    NDPR_BASE1, NDPR_IVA1, NDPR_BASE2, NDPR_IVA2, NDPR_BASE0, ARTI_COD, NDPR_RTCREE, NDPR_RTCREEM, NDPR_MONEDA,
    NDPR_TIPOAPL, NDPR_NUMAPL, NDPR_INALCM, NDPR_FACID, NDPR_BASE3, NDPR_IVA3, NDPR_CTACAUSAN, NDPR_CTAPAGARN)
    VALUES (new.liqr_idnd, new.liqr_conductor, 51, :PREF, :NUMERO, NEW.liqr_fecha, 'LIQUIDACION RUTA ' || SUBSTRING(:nomruta FROM 1 FOR 40), NEW.liqr_fecha,
    NEW.liqr_apagar, 0, 0, NEW.liqr_rtftepor, NEW.liqr_rtftemonto, 0, 0,
    NEW.liqr_rticapor, NEW.liqr_rticamonto, NULL, 0, 0, NEW.liqr_obs, 'N', 'N',
    :PROY, :CENTRO, :ctagasto, :ctapagar, NEW.liqr_numero, USER, 'N', 1, NEW.liqr_vrcontratos,
    0, 0, 0, 0, NEW.liqr_apagar, NULL, 0, 0, 0,
    0, NULL, 0, 0, 0, 0, NULL, NULL);
SELECT FIRST 1 INCP_ID FROM interfaz_cxpagar WHERE PREF_PRE = :pref AND TIDO_COD = 51 INTO :IDI;
EXECUTE PROCEDURE contabil_notadbpr (new.liqr_idnd, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
if (ERROR = 0) then
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
end
^

/* Trigger: LISTA_PRECIOS_AI */
CREATE TRIGGER LISTA_PRECIOS_AI FOR LISTA_PRECIOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable ARTI VARCHAR(20);
declare variable CONS NUMERIC(18,2);
begin
FOR SELECT ARTI_COD, ARTI_CONSUMO FROM ARTICULO ORDER BY ARTI_COD INTO :ARTI, :CONS
    DO
    BEGIN
    INSERT INTO PRECIOS_ARTICULO (LIPR_COD, ARTI_COD, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, PRAR_AUTO, PRAR_CONSUMO, PRAR_COMI, PRAR_COMIMONTO, PRAR_CANTMIN)
        VALUES (NEW.lipr_cod, :ARTI, 0, NEW.lipr_margen, NEW.lipr_util, NEW.lipr_auto, :CONS, NEW.lipr_comi, NEW.lipr_comimonto, 0.1);
    END
end
^

/* Trigger: LISTA_PRECIOS_BI */
CREATE TRIGGER LISTA_PRECIOS_BI FOR LISTA_PRECIOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.sucu_id is null) then
    new.sucu_id = 0;
if (NEW.lipr_diasem IS NULL) then
    NEW.lipr_diasem = 0;
end
^

/* Trigger: LOTES_AI */
CREATE 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_ENT, EXLO_SALDO)
    VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.lote_nro, NEW.lote_fecha, 0, 0, NEW.lote_cant);
END
^

/* Trigger: LOTES_BD */
CREATE 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
^

/* Trigger: LOTES_BI */
CREATE TRIGGER LOTES_BI FOR LOTES
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
/* coloque el ID */
new.lote_id = gen_ID(ID_LOTE, 1);
if (NEW.LOTE_VENCE IS NULL) then
    begin
    if (EXISTS(select ENTR_ID from entradas_detalle where ARTI_COD = NEW.ARTI_COD AND ENDE_LOTE = NEW.LOTE_NRO)) then
        select MAX(LOTE_VENCE) from entradas_detalle where ARTI_COD = NEW.ARTI_COD AND ENDE_LOTE = NEW.LOTE_NRO INTO NEW.LOTE_VENCE;
    else if (EXISTS(select TRAN_ID from trasferencias_detalle where ARTI_COD = NEW.ARTI_COD AND TRAS_LOTEDES = NEW.LOTE_NRO)) then
        select MAX(LOTE_VENCE) from trasferencias_detalle where ARTI_COD = NEW.ARTI_COD AND TRAS_LOTEDES = NEW.LOTE_NRO INTO NEW.LOTE_VENCE;
    else if (EXISTS(select TRAN_ID from trasferencias_detalle where ARTI_COD = NEW.ARTI_COD AND TRAS_LOTE = NEW.LOTE_NRO)) then
        select MAX(LOTE_VENCE) from trasferencias_detalle where ARTI_COD = NEW.ARTI_COD AND TRAS_LOTE = NEW.LOTE_NRO INTO NEW.LOTE_VENCE;
    else if (EXISTS(select ENSA_ID from ENSAMBLES where ARTI_COD = NEW.ARTI_COD AND ENSA_LOTE = NEW.LOTE_NRO)) then
        select MAX(LOTE_VENCE) from ENSAMBLES where ARTI_COD = NEW.ARTI_COD AND ENSA_LOTE = NEW.LOTE_NRO INTO NEW.LOTE_VENCE;
    else if (EXISTS(select FACO_ID from facturas_compras_detalle where ARTI_COD = NEW.ARTI_COD AND FCDE_LOTE = NEW.LOTE_NRO)) then
        select MAX(LOTE_VENCE) from facturas_compras_detalle where ARTI_COD = NEW.ARTI_COD AND FCDE_LOTE = NEW.LOTE_NRO INTO NEW.LOTE_VENCE;
    else if (EXISTS(select REPR_ID from remision_proveedor_det where ARTI_COD = NEW.ARTI_COD AND RPVD_LOTE = NEW.LOTE_NRO)) then
        select MAX(LOTE_VENCE) from remision_proveedor_det where ARTI_COD = NEW.ARTI_COD AND RPVD_LOTE = NEW.LOTE_NRO INTO NEW.LOTE_VENCE;
    else if (EXISTS(select DEVT_ID from devoluciones_ventas_detalle where ARTI_COD = NEW.ARTI_COD AND DVDE_LOTE = NEW.LOTE_NRO)) then
        select MAX(LOTE_VENCE) from devoluciones_ventas_detalle where ARTI_COD = NEW.ARTI_COD AND DVDE_LOTE = NEW.LOTE_NRO INTO NEW.LOTE_VENCE;
    else if (EXISTS(select FAPO_ID from factura_proforma_det where ARTI_COD = NEW.ARTI_COD AND FPDE_LOTE = NEW.LOTE_NRO)) then
        select MAX(FPDE_LOTEV) from factura_proforma_det where ARTI_COD = NEW.ARTI_COD AND FPDE_LOTE = NEW.LOTE_NRO INTO NEW.LOTE_VENCE;
    end
END
^

/* Trigger: LOTES_BU */
CREATE TRIGGER LOTES_BU FOR LOTES
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
  /* VERIFIQUE QUE NO QUEDE NEGATIVO */
  if (NEW.LOTE_SALDO < 0) then
    EXCEPTION LOTE_NEGATIVO 'La existencias (' || OLD.lote_saldo || ') del lote ' || new.lote_nro || ' del artÃ­culo ' || new.arti_cod || ' en la bodega ' || new.bode_cod || ' el ' || new.lote_fecha || ' es insuficiente para el movimiento ' || (old.lote_saldo-new.lote_saldo);
END
^

/* Trigger: MANIFIESTO_CARGA_AD */
CREATE TRIGGER MANIFIESTO_CARGA_AD FOR MANIFIESTO_CARGA
ACTIVE AFTER DELETE POSITION 0
as
declare variable CONSEC INTEGER;
declare variable ABONOS INTEGER;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 89 and enco_idref = old.manc_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 89 and enco_idref = old.manc_id;
if ((OLD.manc_id <> 0) and (old.manc_anulado = 'N')) then
    BEGIN
    /* Verifique si habia abonos al MANIFIESTO */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 89 AND SDCP_IDREF = OLD.manc_id AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 89 and sdcp_idref = old.manc_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 89) and (mvpr_idref = old.manc_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El manifiesto tiene abonos de cuentas por pagar.';
    ABONOS = 0;
    select COUNT(*) FROM saldos_doc_cartera WHERE SDCA_TIPOREF = 89 AND SDCA_IDREF = OLD.manc_id AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 89 and sdca_idref = old.manc_id;
        delete from movimiento_clientes where (mvcl_tiporef = 89) and (mvcl_idref = old.manc_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El manifiesto tiene abonos de cartera.';
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 89, OLD.manc_id, 'D', OLD.manc_pref || OLD.manc_numero);
    END
end
^

/* Trigger: MANIFIESTO_CARGA_AI */
CREATE TRIGGER MANIFIESTO_CARGA_AI FOR MANIFIESTO_CARGA
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONC VARCHAR(60);
declare variable NIT VARCHAR(20);
declare variable VEND INTEGER;
begin
IF ((NEW.manc_id <> 0)  AND (NEW.manc_anulado = 'N')) THEN
  BEGIN
  SELECT TERC_NIT FROM vehiculos WHERE vehi_cod = NEW.manc_vehiculo INTO :NIT;
  /* AFECTE LA CXPAGAR O CXCOBRAR */
  if (NEW.manc_apagar > 0) then
    BEGIN
    CONC = 'MANIFIESTO DE CARGA No. ' || NEW.manc_pref || NEW.manc_numero;
    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, NEW.manc_id, NEW.manc_fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', NEW.manc_apagar);
    /* 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), :NIT, 89, NEW.manc_id, NEW.manc_fecha, NEW.manc_fecha, :CONC, NEW.manc_apagar, 0, 0, 0, 'S', 'N', NEW.manc_pref, NEW.manc_numero);
    END
  ELSE
    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 (89, NEW.manc_id, NEW.manc_fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', ABS(NEW.manc_apagar));
    /* Registre el movimiento del cliente */
    SELECT VEND_COD FROM USUARIO where USER_COD = USER INTO :VEND;
    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, 89, NEW.manc_id, NEW.manc_fecha, NEW.manc_fecha, :CONC, ABS(NEW.manc_apagar), 0, 0, 0, 'S', 'N', NEW.manc_pref, NEW.manc_numero, '01', :vend);
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 89, NEW.manc_id, 'I', NEW.manc_pref || NEW.manc_numero);
  END
end
^

/* Trigger: MANIFIESTO_CARGA_AU */
CREATE TRIGGER MANIFIESTO_CARGA_AU FOR MANIFIESTO_CARGA
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CONSEC INTEGER;
declare variable ABONOS INTEGER;
declare variable CONC VARCHAR(60);
declare variable NIT VARCHAR(20);
declare variable VEND INTEGER;
begin
if ((OLD.manc_id <> 0) and (old.manc_anulado = 'N')) then
    BEGIN
    /* Verifique si habia abonos al MANIFIESTO */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 89 AND SDCP_IDREF = OLD.manc_id AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 89 and sdcp_idref = old.manc_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 89) and (mvpr_idref = old.manc_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El manifiesto tiene abonos de cuentas por pagar.';
    ABONOS = 0;
    select COUNT(*) FROM saldos_doc_cartera WHERE SDCA_TIPOREF = 89 AND SDCA_IDREF = OLD.manc_id AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 89 and sdca_idref = old.manc_id;
        delete from movimiento_clientes where (mvcl_tiporef = 89) and (mvcl_idref = old.manc_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS 'El manifiesto tiene abonos de cartera.';
    END
IF ((NEW.manc_id <> 0)  AND (NEW.manc_anulado = 'N')) THEN
    BEGIN
    SELECT TERC_NIT FROM vehiculos WHERE vehi_cod = NEW.manc_vehiculo INTO :NIT;
    /* AFECTE LA CXPAGAR O CXCOBRAR */
    if (NEW.manc_apagar > 0) then
        BEGIN
        CONC = 'MANIFIESTO DE CARGA No. ' || NEW.manc_pref || NEW.manc_numero;
        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, NEW.manc_id, NEW.manc_fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', NEW.manc_apagar);
        /* 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), :NIT, 89, NEW.manc_id, NEW.manc_fecha, NEW.manc_fecha, :CONC, NEW.manc_apagar, 0, 0, 0, 'S', 'N', NEW.manc_pref, NEW.manc_numero);
        END
    ELSE
        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 (89, NEW.manc_id, NEW.manc_fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', ABS(NEW.manc_apagar));
        /* Registre el movimiento del cliente */
        SELECT VEND_COD FROM USUARIO where USER_COD = USER INTO :VEND;
        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, 89, NEW.manc_id, NEW.manc_fecha, NEW.manc_fecha, :CONC, ABS(NEW.manc_apagar), 0, 0, 0, 'S', 'N', NEW.manc_pref, NEW.manc_numero, '01', :vend);
        END
    END
/* ACTUALICE LOS ANULADOS Y TRASMITIDOS */
if (NEW.manc_anulado <> OLD.manc_anulado) then
    BEGIN
    if (NEW.manc_anulado = 'S') then
        BEGIN
        select enco_consec from comprobante_encabezado where enco_tiporef = 89 and enco_idref = old.manc_id into :consec;
        if (NOT consec is null) then
          begin
          delete from comprobante_detalle where enco_consec = :consec;
          delete from comprobante_detalle_niif where enco_consec = :consec;
          end
        delete from comprobante_encabezado where enco_tiporef = 89 and enco_idref = old.manc_id;
        INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
            VALUES (USER, 89, NEW.manc_id, 'A', NEW.manc_pref || NEW.manc_numero);
        END
    UPDATE manifiesto_carga_det SET MNCD_ANULADO = NEW.manc_anulado WHERE MANC_ID = NEW.manc_id;
    UPDATE manifiestos_carga_conc SET MNCC_ANULADO = NEW.manc_anulado WHERE MANC_ID = NEW.manc_id;
    END
ELSE
    BEGIN
    if (NEW.manc_transmit <> OLD.manc_transmit) then
        BEGIN
        UPDATE manifiesto_carga_det SET MNCD_TRANSMIT = NEW.manc_transmit WHERE MANC_ID = NEW.manc_id;
        UPDATE manifiestos_carga_conc SET MNCC_TRANSMIT = NEW.manc_transmit WHERE MANC_ID = NEW.manc_id;
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 89, NEW.manc_id, 'U', NEW.manc_pref || NEW.manc_numero);
    END
end
^

/* Trigger: MANIFIESTO_CARGA_BI */
CREATE TRIGGER MANIFIESTO_CARGA_BI FOR MANIFIESTO_CARGA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.manc_numok = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 89 AND PREF_PRE = NEW.manc_pref INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.manc_numero = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 89 AND PREF_PRE = NEW.manc_pref;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.manc_numero AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 89 AND PREF_PRE = NEW.manc_pref;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.manc_numero) returning_values (NEW.manc_numero);
    NEW.manc_numok = 'S';
    END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM manifiesto_carga WHERE MANC_PREF = NEW.manc_pref AND MANC_NUMERO = NEW.manc_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
SELECT V.terc_nit FROM VEHICULOS V WHERE VEHI_COD = NEW.manc_vehiculo INTO NEW.manc_asoc;
end
^

/* Trigger: MANIFIESTO_CARGA_DET_AD */
CREATE TRIGGER MANIFIESTO_CARGA_DET_AD FOR MANIFIESTO_CARGA_DET
ACTIVE AFTER DELETE POSITION 0
as
begin
if ((old.manc_id <> 0) and (old.mncd_anulado = 'N')) then
    begin
    update carga_remesa set cgrm_manif = 0 where cgrm_id = old.mncd_remesa;
    end
end
^

/* Trigger: MANIFIESTO_CARGA_DET_AI */
CREATE TRIGGER MANIFIESTO_CARGA_DET_AI FOR MANIFIESTO_CARGA_DET
ACTIVE AFTER INSERT POSITION 0
as
begin
  /* actualice el id de la planilla o manifiesto */
  update carga_remesa set cgrm_manif = new.manc_id where cgrm_id = new.mncd_remesa;
end
^

/* Trigger: MANIFIESTO_CARGA_DET_AU */
CREATE TRIGGER MANIFIESTO_CARGA_DET_AU FOR MANIFIESTO_CARGA_DET
ACTIVE AFTER UPDATE POSITION 0
as
begin
if ((old.manc_id <> 0) and (old.mncd_anulado = 'N')) then
    begin
    update carga_remesa set cgrm_manif = 0 where cgrm_id = old.mncd_remesa;
    end
if ((new.manc_id <> 0) and (new.mncd_anulado = 'N')) then
    begin
    update carga_remesa set cgrm_manif = new.manc_id where cgrm_id = new.mncd_remesa;
    end
end
^

/* Trigger: MARCAS_AD */
CREATE TRIGGER MARCAS_AD FOR MARCAS
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 129, 1, 'D', OLD.MARC_COD);
end
^

/* Trigger: MARCAS_AI */
CREATE TRIGGER MARCAS_AI FOR MARCAS
ACTIVE AFTER INSERT POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 129, 1, 'I', NEW.MARC_COD);
end
^

/* Trigger: MARCAS_AU */
CREATE TRIGGER MARCAS_AU FOR MARCAS
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 129, 1, 'U', OLD.MARC_COD);
end
^

/* Trigger: MENSAJERIA_BI */
CREATE 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;
if (new.mens_destino = 'Todos') then
    begin
    NEW.MENS_LEIDO = 'S';
    insert into MENSAJERIA (MENS_AUTOR, MENS_MENSAJE, MENS_FECHA, MENS_HORA, MENS_NIVEL, MENS_DESTINO, MENS_LEIDO)
        select NEW.MENS_AUTOR, NEW.MENS_MENSAJE, NEW.MENS_FECHA, NEW.MENS_HORA, NEW.MENS_NIVEL, USER_COD, 'N'
            from USUARIO WHERE USER_COD <> USER;
    end

end
^

/* Trigger: MENSAJERIA_BU */
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
^

/* Trigger: MOVIMIENTO_ARTICULO_AD */
CREATE 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);
      EXECUTE PROCEDURE actualice_costo_niif(old.arti_cod, old.mvar_fecha, old.mvar_costoniif, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      EXECUTE PROCEDURE chequeo_costos_niif(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      END
  /* BORRE LOS SERIALES DEL DOCUMENTO */
  UPDATE seriales_documento S SET S.sedo_confirma = 'N'
      WHERE S.tido_cod = OLD.mvar_tipodoc AND S.sedo_iddoc = OLD.mvar_idref AND S.sedo_item = OLD.mvar_item AND S.sedo_bod = OLD.bode_cod;
  if (LOTE = 'T') then
    begin
    if (old.mvar_entrada = 'S') then
        BEGIN
        UPDATE existencia_tercero
            SET EXTE_ENTR = EXTE_ENTR - OLD.mvar_cant
            WHERE TERC_NIT = OLD.terc_nit AND EXTE_FECHA = OLD.MVAR_FECHA AND ARTI_COD = OLD.ARTI_COD AND CLSU_COD = OLD.clsu_cod;
        END
    else
        BEGIN
        UPDATE existencia_tercero
            SET EXTE_SAL = EXTE_SAL - OLD.mvar_cant
            WHERE TERC_NIT = OLD.terc_nit AND EXTE_FECHA = OLD.MVAR_FECHA AND ARTI_COD = OLD.ARTI_COD AND CLSU_COD = OLD.clsu_cod;
        END
    end
  /* actualice existencias */
  if (OLD.mvar_tipodoc <> 10) then
      BEGIN
      if (old.mvar_entrada = 'S') then
        BEGIN
        execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
        if (LOTE = 'L') then
            BEGIN
            UPDATE LOTES
                set lote_saldo = lote_saldo - old.mvar_cant
                where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
            UPDATE EXISTENCIA_LOTE
                SET EXLO_ENT = EXLO_ENT - OLD.mvar_cant
                WHERE LOTE_NRO = OLD.MVAR_LOTE AND EXLO_FECHA = OLD.MVAR_FECHA AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
            END
        END
      else
        BEGIN
        execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
        if (LOTE = 'L') then
            BEGIN
            UPDATE LOTES
                set lote_saldo = lote_saldo + old.mvar_cant
                where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL - OLD.mvar_cant
                WHERE LOTE_NRO = OLD.MVAR_LOTE AND EXLO_FECHA = OLD.MVAR_FECHA AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
            END

        SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
        if ((ENSAMBLE = 'S') AND (OLD.mvar_entrada = 'N')) then
            delete from ensambles where ensa_tiporef = old.mvar_tipodoc and ensa_idref = old.mvar_idref AND ENSA_ITEMREF = OLD.mvar_item;
        END
    END
END
^

/* Trigger: MOVIMIENTO_ARTICULO_AI */
CREATE TRIGGER MOVIMIENTO_ARTICULO_AI FOR MOVIMIENTO_ARTICULO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable NROLOTE VARCHAR(15);
declare variable EXCESO NUMERIC(18,4);
declare variable ACCION VARCHAR(10);
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 actualice_costo_niif(new.arti_cod, new.mvar_fecha, new.mvar_costoniif, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      EXECUTE PROCEDURE chequeo_costos_niif(NEW.arti_cod, NEW.mvar_fecha);
      END
  if (LOTE = 'S') then
    /* CONFIRME LOS SERIALES */
      UPDATE seriales_documento S SET S.sedo_confirma = 'S'
          WHERE S.tido_cod = NEW.mvar_tipodoc AND S.sedo_iddoc = NEW.mvar_idref AND S.sedo_item = NEW.mvar_item AND S.sedo_bod = NEW.bode_cod;
  if (LOTE = 'T') then
      begin
      if (new.mvar_entrada = 'S') then
        begin
        if (EXISTS (SELECT TERC_NIT FROM existencia_tercero WHERE TERC_NIT = NEW.terc_nit AND CLSU_COD = NEW.clsu_cod AND EXTE_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod)) then
            BEGIN
            UPDATE existencia_tercero
                SET EXTE_ENTR = EXTE_ENTR + NEW.mvar_cant
                WHERE TERC_NIT = NEW.terc_nit AND CLSU_COD = NEW.clsu_cod AND EXTE_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD;
            END
        ELSE
            BEGIN
            INSERT INTO existencia_tercero (ARTI_COD, TERC_NIT, CLSU_COD, EXTE_FECHA, EXTE_SAL, EXTE_ENTR)
                VALUES (NEW.ARTI_COD, NEW.terc_nit, NEW.clsu_cod, NEW.MVAR_FECHA, 0, NEW.MVAR_CANT);
            END
        end
      ELSE
          if (NEW.mvar_tipodoc <> 31) then
              BEGIN
              if (EXISTS (SELECT TERC_NIT FROM existencia_tercero WHERE TERC_NIT = NEW.terc_nit AND CLSU_COD = NEW.clsu_cod AND EXTE_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod)) then
                BEGIN
                UPDATE existencia_tercero
                    SET EXTE_SAL = EXTE_SAL + NEW.mvar_cant
                    WHERE TERC_NIT = NEW.terc_nit AND EXTE_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND CLSU_COD = NEW.clsu_cod;
                END
              ELSE
                BEGIN
                INSERT INTO existencia_tercero (ARTI_COD, TERC_NIT, CLSU_COD, EXTE_FECHA, EXTE_SAL, EXTE_ENTR)
                    VALUES (NEW.ARTI_COD, NEW.terc_nit, NEW.clsu_cod, NEW.MVAR_FECHA, NEW.MVAR_CANT, 0);
                END
              END
/*          else    NO HAGA NADA POR AHORA
              BEGIN
              -- LAS FACTURAS RESTAN INVENTARIO POR TERCERO
              if (EXISTS (SELECT TERC_NIT FROM existencia_tercero WHERE TERC_NIT = NEW.terc_nit AND EXTE_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND CLSU_COD = NEW.clsu_cod)) then
                BEGIN
                UPDATE existencia_tercero
                    SET EXTE_ENTR = EXTE_ENTR + NEW.mvar_cant
                    WHERE TERC_NIT = NEW.terc_nit AND EXTE_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND CLSU_COD = NEW.clsu_cod;
                END
              ELSE
                BEGIN
                INSERT INTO existencia_tercero (ARTI_COD, TERC_NIT, CLSU_COD, EXTE_FECHA, EXTE_ENTR, EXTE_SAL)
                    VALUES (NEW.ARTI_COD, NEW.terc_nit, NEW.clsu_cod, NEW.MVAR_FECHA, NEW.MVAR_CANT, 0);
                END
              END   */
      end
  else
      begin
      if (new.mvar_tipodoc <> 10) then
        begin
        /* actualice existencias */
        if (new.mvar_entrada = 'S') then
          BEGIN
          if ((new.mvar_tipodoc = 11) or (new.mvar_tipodoc = 21) or (new.mvar_tipodoc = 22))  then
            begin
            /* Verifique que no quede negativo */
            EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'EXISTENCIAS', 'ACCION A TOMAR SI LA EXISTENCIA QUEDA POR ENCIMA DEL MAXIMO AL REGISTRAR COMPRAS/ENTRADAS') returning_values (:ACCION);
            if (ACCION = 'PROHIBIR') then
                begin
                execute procedure maximo_articulo(new.arti_cod, new.mvar_fecha, new.bode_cod, NEW.mvar_cant) returning_values (:exceso);
                if (:EXCESO > 0) then
                    EXCEPTION existencia_sobre_maximo 'La existencia del articulo ' || new.arti_cod || ' quedara sobre el maximo en la bodega ' || new.bode_cod || ' en ' || new.mvar_fecha;
                end
            end
          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 numero de lote para el articulo ' || new.arti_cod;
            ELSE
              BEGIN
              if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote)) THEN
                UPDATE LOTES
                  set lote_saldo = lote_saldo + new.mvar_cant
                  where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
              ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                  VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);
    
              if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod)) then
                BEGIN
                UPDATE EXISTENCIA_LOTE
                    SET EXLO_ENT = EXLO_ENT + NEW.mvar_cant
                    WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
                END
              ELSE
                BEGIN
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, 0, NEW.MVAR_CANT);
                END
              END
            END
    
          if (NEW.mvar_tipodoc = 33) then
            BEGIN
            SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod
                INTO :ensamble, :unidad, :descr;
            if (ENSAMBLE = 'S') then
                BEGIN
                /* DESENSAMBLE EL PRODUCTO DEVUELTO */
                IDENS = gen_id(id_desensamble, 1);
                EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
                INSERT INTO DESENSAMBLES(DESE_ID, TIDO_COD, PREF_PRE, BODE_COD, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, DESE_CANT, DESE_UNIDAD, DESE_FACTOR, DESE_ANULADO, DESE_TRANSMIT,
                    ARTI_COD, DESE_DESC, DESE_CODBAR, DESE_LOTE, DESE_OBS, TERC_NIT, DESE_USUARIO, NUMOK, DESE_TIPOREF, DESE_IDREF, DESE_ITEMREF)
                    VALUES (:IDENS, 16, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', new.mvar_cant, :unidad, 1, 'N', 'N',
                    NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_tipodoc, NEW.mvar_idref, NEW.mvar_item);
                ITEM = 0;
                FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO
                    FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                    WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                    INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
                    DO
                    BEGIN
                    ITEM = ITEM + 1;
                    EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
                    EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                    IVAM = costo * cantpr * iva / 100;
                    SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = :codpr INTO :LOTE;
                    if (LOTE = 'L') then
                        begin
                        if ((new.mvar_lote is not null) and (new.mvar_lote <> '')) then
                            SELECT MIN(ESDE_LOTE) FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                                E.arti_cod = NEW.arti_cod AND E.ensa_lote = NEW.mvar_lote AND D.arti_cod = :codpr INTO :nrolote;
                        else
                            SELECT first 1 ESDE_LOTE FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                                E.arti_cod = NEW.arti_cod AND E.ensa_fecha <= NEW.mvar_fecha AND D.arti_cod = :codpr
                                order by ensa_fecha desc INTO :nrolote;
                        end
                    else
                        nrolote = '';
                    INSERT INTO desensambles_detalle(DESE_ID, DESE_ITEM, ARTI_COD, BODE_COD, DEDE_CANT, DEDE_UNIDAD, DEDE_COSTO, DEDE_LOTE, DEDE_FACTOR, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_CODBAR, DEDE_ANULADO, DEDE_TRANSMIT, DEDE_DESC, DEDE_TOTAL, DEDE_OBS)
                        VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr * NEW.mvar_cant, :unipr, :costo, :nrolote, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, NULL);
                    END
                END
            END
          END
        else
          BEGIN
          execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
          /* ACTUALICE LA EXISTENCIA DEL LOTE */
          if (LOTE = 'L') then
            if (NEW.mvar_lote IS NULL) then
              EXCEPTION LOTE_NEGATIVO 'Debe indicar un numero de lote para el articulo ' || new.arti_cod;
            ELSE
              BEGIN
              /* Actualice el saldo historico del lote */
              if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod)) then
                BEGIN
                UPDATE EXISTENCIA_LOTE
                    SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                    WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
                END
              ELSE
                BEGIN
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT, 0);
                END
              if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote)) THEN
                UPDATE LOTES
                  set lote_saldo = lote_saldo - new.mvar_cant
                  where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
              else
                EXCEPTION LOTE_NEGATIVO 'No se encontro el lote ' || new.mvar_lote || ' para el articulo ' || new.arti_cod;
              END
          if (NEW.mvar_cant < 0) then
            BEGIN
            SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod
                INTO :ensamble, :unidad, :descr;
            if (ENSAMBLE = 'S') then
                BEGIN
                /* DESENSAMBLE EL PRODUCTO DEVUELTO */
                IDENS = gen_id(id_desensamble, 1);
                EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
                INSERT INTO DESENSAMBLES(DESE_ID, TIDO_COD, PREF_PRE, BODE_COD, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, DESE_CANT, DESE_UNIDAD, DESE_FACTOR, DESE_ANULADO, DESE_TRANSMIT,
                    ARTI_COD, DESE_DESC, DESE_CODBAR, DESE_LOTE, DESE_OBS, TERC_NIT, DESE_USUARIO, NUMOK, DESE_TIPOREF, DESE_IDREF, DESE_ITEMREF)
                    VALUES (:IDENS, 16, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', (new.mvar_cant*-1), :unidad, 1, 'N', 'N',
                    NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_tipodoc, NEW.mvar_idref, NEW.mvar_item);
                ITEM = 0;
                FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                    WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                    INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
                    DO
                    BEGIN
                    ITEM = ITEM + 1;
                    EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
                    EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                    IVAM = costo * cantpr * iva / 100;
                    SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = :codpr INTO :LOTE;
                    if (LOTE = 'L') then
                        begin
                        if ((new.mvar_lote is not null) and (new.mvar_lote <> '')) then
                            SELECT MIN(ESDE_LOTE) FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                                E.arti_cod = NEW.arti_cod AND E.ensa_lote = NEW.mvar_lote AND D.arti_cod = :codpr INTO :nrolote;
                        else
                            SELECT first 1 ESDE_LOTE FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                                E.arti_cod = NEW.arti_cod AND E.ensa_fecha <= NEW.mvar_fecha AND D.arti_cod = :codpr
                                order by ensa_fecha desc INTO :nrolote;
                        end
                    else
                        nrolote = '';
                    INSERT INTO desensambles_detalle(DESE_ID, DESE_ITEM, ARTI_COD, BODE_COD, DEDE_CANT, DEDE_UNIDAD, DEDE_COSTO, DEDE_LOTE, DEDE_FACTOR, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_CODBAR, DEDE_ANULADO, DEDE_TRANSMIT, DEDE_DESC, DEDE_TOTAL, DEDE_OBS)
                        VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr * (NEW.mvar_cant*-1), :unipr, :costo, :nrolote, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, NULL);
                    END
                END
            end
          end
        END
    end
END
^

/* Trigger: MOVIMIENTO_ARTICULO_BD */
CREATE TRIGGER MOVIMIENTO_ARTICULO_BD FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE DELETE POSITION 0
as
declare variable ensamble char(1);
begin
SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
if ((ENSAMBLE = 'S') AND (OLD.mvar_entrada = 'S') AND (OLD.mvar_tipodoc = 33)) then
    delete from desensambles where dese_tiporef = old.mvar_tipodoc and dese_idref = old.mvar_idref AND DESE_ITEMREF = OLD.mvar_item;
end
^

/* Trigger: MOVIMIENTO_ARTICULO_BI */
CREATE TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR double precision;
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
declare variable ESTADO CHAR(1);
declare variable DISCRENS CHAR(2);
declare variable BODLOTE CHAR(1);
declare variable PRECIO NUMERIC(18,2);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST, ESAR_COD
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE, :ESTADO;
if (ESTADO = 'I') then
    exception ARTICULO_INACTIVO 'El articulo ' || new.arti_cod || ' esta inactivo.';

if (LOTE = 'L') then
    BEGIN
    SELECT BODE_LOTES FROM BODEGA WHERE BODE_COD = NEW.bode_cod INTO :BODLOTE;
    if (BODLOTE = 'N') then
      NEW.mvar_lote = '1';

      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 indico un lote para el articulo ' || new.arti_cod;
            end
    END
if (LOTE = 'T') then
    begin
    if (new.mvar_entrada = 'S') then
        begin
        if (NEW.mvar_tipodoc <> 33) then
            begin
            /* TODO LO QUE INGRESA QUEDA A NOMBRE DE LA EMPRESA */
            EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
            NEW.clsu_cod = '01';
            end
        end
    ELSE
        BEGIN
        if (NEW.terc_nit IS NULL) then
            EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
        if (NEW.clsu_cod IS NULL) then
            NEW.clsu_cod = '01';
        END
    end
if (new.mvar_tipodoc <> 10) then
    begin
    /* ENSAMBLE EL PRODUCTO */
    SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
    execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'DISCRIMINAR COMPONENTES EN ENSAMBLES AUTOMATICOS FACTURADOS') returning_values (:discrens);
    if ((:discrens <> 'SI') or ((NEW.mvar_tipodoc <> 31) AND (NEW.mvar_tipodoc <> 32))) then
    if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
        BEGIN
        /* verifique si la existecia es insufieciente */
        execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
        if (NEW.mvar_cant > :SALDO) then
            BEGIN
            if (SALDO > 0) then
                SALDO = NEW.mvar_cant - :SALDO;
            else
                SALDO = NEW.mvar_cant;
            IDENS = gen_id(id_ensamble, 1);
            EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
            /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
            select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
            COSTOTOT = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO
                FROM articulos_producto P, ARTICULO A
                WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp
                INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR
                DO
                BEGIN
                EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                IVAM = costo * cantpr * iva / 100;
                if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                    BEGIN
                    /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                    CANTPR = :SALDO * PESO;
                    CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                    if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                        CANTPR = CANTPR * (100 + mermapr) / 100;
                    END
                ELSE
                    BEGIN
                    CANTPR = CANTPR * :SALDO;
                    END
                COSTOTOT = COSTOTOT + COSTO * CANTPR;
                END
            if (NEW.mvar_cant <> 0) then
                COSTO = costotot / NEW.mvar_cant;
            else
                COSTO = 0;
            INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
                ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF,ENSA_ITEMREF)
                VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
                NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', :costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref, NEW.mvar_item);
            /* LOS DETALLES DEL ENSAMBLE */
            ITEM = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO, ARPR_PRECIO
                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, :PRECIO
                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, ESDE_PRECIO)
                    VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0, :PRECIO);
                END
            END
        END
    end
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END
^

/* Trigger: MOVIMIENTO_ARTICULO_BU */
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
^

/* Trigger: MOVIMIENTO_BANCO_AD */
CREATE TRIGGER MOVIMIENTO_BANCO_AD FOR MOVIMIENTO_BANCO
ACTIVE AFTER DELETE POSITION 0
AS
declare variable OK CHAR(1);
BEGIN
OK = 'N';
  /* actualice el saldo */
  if (old.moba_db = 'S') then
    begin
    execute procedure sume_saldo_banco(old.cuba_cod, old.moba_fecha, old.moba_total, 'S');
    if (old.moba_tipodoc <> 72) then
        OK = 'S';
    ELSE
        SELECT CH.cheq_confirma FROM cheques CH WHERE CH.cheq_id = old.moba_idref INTO :OK;
    if (OK = 'S') then
        execute procedure sume_saldo_banco_conf(old.cuba_cod, old.moba_fecha, old.moba_total, 'S');
    end
  else
    begin
    execute procedure reste_saldo_banco(old.cuba_cod, old.moba_fecha, old.moba_total, 'S');
    if (old.moba_tipodoc <> 72) then
        OK = 'S';
    ELSE
        SELECT CH.cheq_confirma FROM cheques CH WHERE CH.cheq_id = old.moba_idref INTO :OK;
    if (OK = 'S') then
        execute procedure reste_saldo_banco_conf(old.cuba_cod, old.moba_fecha, old.moba_total, 'S');
    end
END
^

/* Trigger: MOVIMIENTO_BANCO_AI */
CREATE TRIGGER MOVIMIENTO_BANCO_AI FOR MOVIMIENTO_BANCO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable OK CHAR(1);
BEGIN
OK = 'N';
/* actualice SALDO DEL BANCO */
if (new.moba_db = 'S') then
    BEGIN
    execute procedure sume_saldo_banco(new.cuba_cod, new.moba_fecha, new.moba_total, 'N');
    if (NEW.moba_tipodoc <> 72) then
        OK = 'S';
    ELSE
        SELECT CH.cheq_confirma FROM cheques CH WHERE CH.cheq_id = NEW.moba_idref INTO :OK;
    if (OK = 'S') then
        execute procedure sume_saldo_banco_conf(new.cuba_cod, new.moba_fecha, new.moba_total, 'N');
    END
else
    BEGIN
    execute procedure reste_saldo_banco(new.cuba_cod, new.moba_fecha, new.moba_total, 'N');
    if (NEW.moba_tipodoc <> 72) then
        OK = 'S';
    ELSE
        SELECT CH.cheq_confirma FROM cheques CH WHERE CH.cheq_id = NEW.moba_idref INTO :OK;
    if (OK = 'S') then
        execute procedure reste_saldo_banco_conf(new.cuba_cod, new.moba_fecha, new.moba_total, 'N');
    END
END
^

/* Trigger: MOVIMIENTO_BANCO_AU */
CREATE TRIGGER MOVIMIENTO_BANCO_AU FOR MOVIMIENTO_BANCO
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable OK CHAR(1);
BEGIN
OK = 'N';
  /* deshaga lo viejo */
  if (old.moba_db = 'S') then
    begin
    execute procedure sume_saldo_banco(old.cuba_cod, old.moba_fecha, old.moba_total, 'S');
    if (old.moba_tipodoc <> 72) then
        OK = 'S';
    ELSE
        SELECT CH.cheq_confirma FROM cheques CH WHERE CH.cheq_id = old.moba_idref INTO :OK;
    if (OK = 'S') then
        execute procedure sume_saldo_banco_conf(old.cuba_cod, old.moba_fecha, old.moba_total, 'S');
    end
  else
    begin
    execute procedure reste_saldo_banco(old.cuba_cod, old.moba_fecha, old.moba_total, 'S');
    if (old.moba_tipodoc <> 72) then
        OK = 'S';
    ELSE
        SELECT CH.cheq_confirma FROM cheques CH WHERE CH.cheq_id = old.moba_idref INTO :OK;
    if (OK = 'S') then
        execute procedure reste_saldo_banco_conf(old.cuba_cod, old.moba_fecha, old.moba_total, 'S');
    end
  /* actualice SALDO DEL BANCO */
  if (new.moba_db = 'S') then
    begin
    execute procedure sume_saldo_banco(new.cuba_cod, new.moba_fecha, new.moba_total, 'N');
    if (NEW.moba_tipodoc <> 72) then
        OK = 'S';
    ELSE
        SELECT CH.cheq_confirma FROM cheques CH WHERE CH.cheq_id = NEW.moba_idref INTO :OK;
    if (OK = 'S') then
        execute procedure sume_saldo_banco_conf(new.cuba_cod, new.moba_fecha, new.moba_total, 'N');
    end
  else
    begin
    execute procedure reste_saldo_banco(new.cuba_cod, new.moba_fecha, new.moba_total, 'N');
    if (NEW.moba_tipodoc <> 72) then
        OK = 'S';
    ELSE
        SELECT CH.cheq_confirma FROM cheques CH WHERE CH.cheq_id = NEW.moba_idref INTO :OK;
    if (OK = 'S') then
        execute procedure reste_saldo_banco_conf(new.cuba_cod, new.moba_fecha, new.moba_total, 'N');
    end

/* SI QUEDO EN CEROS EL MONTO ELIMINE EL REGISTRO */
if ((new.moba_total = 0) AND (NEW.MOBA_CONCEPTO <> 'ANULADO')) then
    DELETE FROM movimiento_banco WHERE MOBA_ID = new.moba_id;
END
^

/* Trigger: MOVIMIENTO_BANCO_BI */
CREATE TRIGGER MOVIMIENTO_BANCO_BI FOR MOVIMIENTO_BANCO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable TIPO VARCHAR(10);
begin
/* SI NO TIENE CONCEPTO COLOQUE EL TIPO NUMERO Y FECHA DEL MOVIMIENTO */
if ((NEW.moba_concepto IS NULL) or (NEW.moba_concepto = '')) then
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = NEW.moba_tipodoc INTO :TIPO;
    NEW.moba_concepto = TIPO || ' ' || NEW.moba_pref || NEW.moba_numero || ' DE ' || NEW.moba_fecha;
    END
end
^

/* Trigger: MOVIMIENTO_CAJA_AD */
CREATE TRIGGER MOVIMIENTO_CAJA_AD FOR MOVIMIENTO_CAJA
ACTIVE AFTER DELETE POSITION 0
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
^

/* Trigger: MOVIMIENTO_CAJA_AI */
CREATE TRIGGER MOVIMIENTO_CAJA_AI FOR MOVIMIENTO_CAJA
ACTIVE AFTER INSERT POSITION 0
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
^

/* Trigger: MOVIMIENTO_CAJA_AU */
CREATE TRIGGER MOVIMIENTO_CAJA_AU FOR MOVIMIENTO_CAJA
ACTIVE AFTER UPDATE POSITION 0
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
^

/* Trigger: MOVIMIENTO_CARGO_EMPLEADO_BI */
CREATE TRIGGER MOVIMIENTO_CARGO_EMPLEADO_BI FOR MOVIMIENTO_CARGO_EMPLEADO
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (exists (select mvce_id from movimiento_cargo_empleado where terc_nit = new.terc_nit and mvce_fecha = new.mvce_fecha) ) then
    EXCEPTION cambio_cargo_existe;
else
    new.mvce_id = GEN_ID(id_movcargoemp,1);
end
^

/* Trigger: MOVIMIENTO_CLIENTES_AU */
CREATE 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
^

/* Trigger: MOVIMIENTO_CLIENTES_BI */
CREATE TRIGGER MOVIMIENTO_CLIENTES_BI FOR MOVIMIENTO_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable POR_CTA CHAR(2);
begin
if (new.sucu_id is null) then
    new.sucu_id = 0;
if (new.mvcl_vence < new.mvcl_fecha) then
    exception vencimiento_incorrecto;
/* 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
        BEGIN
        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;
        IF ((NEW.sucu_id = 0) or (NEW.sucu_id IS NULL)) THEN
            SELECT SUCU_ID FROM prefijos where tido_cod = 77 and pref_pre = new.mvcl_prefref into new.sucu_id;
        END
    else
        SELECT SUCU_ID FROM cuentas_banco C, prefijos_bancos P where P.tido_cod = 77 AND P.cuba_cod = C.cuba_cod AND P.prba_pref = new.mvcl_prefref into new.sucu_id;
    END

end
^

/* Trigger: MOVIMIENTO_PROVEEDOR_AU */
CREATE 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
^

/* Trigger: MOVIMIENTO_PROVEEDOR_BI */
CREATE TRIGGER MOVIMIENTO_PROVEEDOR_BI FOR MOVIMIENTO_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.mvpr_vence < new.mvpr_fecha) then
    exception vencimiento_incorrecto;
end
^

/* Trigger: MOVIMIENTO_SALARIO_EMPLEADO_AD */
CREATE TRIGGER MOVIMIENTO_SALARIO_EMPLEADO_AD FOR MOVIMIENTO_SALARIO_EMPLEADO
ACTIVE AFTER DELETE POSITION 0
as
declare variable SALARIO NUMERIC(18,2);
begin
SELECT FIRST 1 MVSE_SALARIO FROM movimiento_salario_empleado WHERE TERC_NIT = OLD.terc_nit
    ORDER BY MVSE_FECHA desc INTO :SALARIO;
update empleados set empl_salario = :salario where terc_nit = OLD.terc_nit;
end
^

/* Trigger: MOVIMIENTO_SALARIO_EMPLEADO_AI */
CREATE 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;
declare variable SALARIO NUMERIC(18,2);
begin
SELECT FIRST 1 MVSE_SALARIO FROM movimiento_salario_empleado WHERE TERC_NIT = NEW.terc_nit
    ORDER BY MVSE_FECHA desc INTO :SALARIO;
update empleados set empl_salario = :salario where terc_nit = new.terc_nit;
SELECT EMPL_PPAGO FROM EMPLEADOS WHERE TERC_NIT = NEW.terc_nit INTO :PPAGO;
EXECUTE PROCEDURE periodo_nom_fechaf(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
^

/* Trigger: MOVIMIENTO_SALARIO_EMPLEADO_AU */
CREATE TRIGGER MOVIMIENTO_SALARIO_EMPLEADO_AU FOR MOVIMIENTO_SALARIO_EMPLEADO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable SALARIO NUMERIC(18,2);
begin
SELECT FIRST 1 MVSE_SALARIO FROM movimiento_salario_empleado WHERE TERC_NIT = NEW.terc_nit
    ORDER BY MVSE_FECHA desc INTO :SALARIO;
update empleados set empl_salario = :salario where terc_nit = new.terc_nit;
end
^

/* Trigger: MOVIMIENTO_SALARIO_EMPLEADO_BI */
CREATE TRIGGER MOVIMIENTO_SALARIO_EMPLEADO_BI FOR MOVIMIENTO_SALARIO_EMPLEADO
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.mvse_facsal IS NULL) then
    SELECT E.empl_facsal FROM EMPLEADOS E WHERE E.terc_nit = NEW.terc_nit INTO NEW.mvse_facsal;
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
^

/* Trigger: MOVIMIENTO_VINCUL_EMPLEADO_AD */
CREATE TRIGGER MOVIMIENTO_VINCUL_EMPLEADO_AD FOR MOVIMIENTO_VINCUL_EMPLEADO
ACTIVE AFTER DELETE POSITION 0
as
declare variable tipovin integer;
begin
select first 1 tivu_cod from movimiento_vincul_empleado where terc_nit = old.terc_nit order by mvve_fecha desc into :tipovin;
if (tipovin is not null) then
    begin
    update empleados set empl_tipovinc = :tipovin where terc_nit = old.terc_nit;
    end
end
^

/* Trigger: MOVIMIENTO_VINCUL_EMPLEADO_AI */
CREATE TRIGGER MOVIMIENTO_VINCUL_EMPLEADO_AI FOR MOVIMIENTO_VINCUL_EMPLEADO
ACTIVE AFTER INSERT POSITION 0
as
begin
update empleados set empl_tipovinc = new.tivu_cod where terc_nit = new.terc_nit;
end
^

/* Trigger: MOVIMIENTO_VINCUL_EMPLEADO_BI */
CREATE TRIGGER MOVIMIENTO_VINCUL_EMPLEADO_BI FOR MOVIMIENTO_VINCUL_EMPLEADO
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (exists (select mvve_id from movimiento_vincul_empleado where terc_nit = new.terc_nit and mvve_fecha = new.mvve_fecha) ) then
    EXCEPTION cambio_vincul_existe;
else
    new.mvve_id = GEN_ID(id_movvinculemp,1);
end
^

/* Trigger: NOMINA_AD */
CREATE 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_detalle_niif 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;
  update nomina_novedades_detalle set nomi_id = 0 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
^

/* Trigger: NOMINA_AI */
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
^

/* Trigger: NOMINA_BD */
CREATE TRIGGER NOMINA_BD FOR NOMINA
ACTIVE BEFORE DELETE POSITION 0
as
begin
/* no permita borrar una nomina paga o con aportes */
if (old.nomi_aporok = 'S') then
    exception nomina_con_aportes 'La nomina ' || old.nomi_conc || ' ya tiene aportes registrados, anule antes los aportes.';
if (old.nomi_pagook = 'S') then
    exception nomina_con_pago 'La nomina ' || old.nomi_conc || ' ya tiene pagos registrados, anule antes los egresos.';
end
^

/* Trigger: NOMINA_BI */
CREATE TRIGGER NOMINA_BI FOR NOMINA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable VARIAS CHAR(2);
begin
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'PERMITIR GRABAR VARIAS NOMINAS PARA EL MISMO PERIODO') returning_values (:VARIAS);
if ((VARIAS = 'NO') and (new.nomi_tipo = 'N')) then
    BEGIN
    if (EXISTS (select nomi_id from nomina where NOMI_PERIODOCIDAD = new.NOMI_PERIODOCIDAD and nomi_ano = new.nomi_ano
        and nomi_periodo = new.nomi_periodo AND nomi_tipo = 'N')) then
        exception nomina_registrada;
    END
if (new.nomi_aporok is null) then
    new.nomi_aporok = 'N';
if (new.nomi_pagook is null) then
    new.nomi_pagook = 'N';
end
^

/* 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_AI */
CREATE TRIGGER NOMINA_CARTERA_DETALLE_AI FOR NOMINA_CARTERA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable NIT VARCHAR(20);
DECLARE VARIABLE FEC DATE;
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE COBR INTEGER;
DECLARE VARIABLE PREF VARCHAR(4);
DECLARE VARIABLE NUMERO VARCHAR(8);
BEGIN
IF (NEW.NCAR_ID <> 0) THEN
    BEGIN
    SELECT NCAR_fecha, terc_nit FROM nomina_cartera WHERE NCAR_id = NEW.NCAR_id INTO :FEC, :NIT;
    SELECT MVCL_PREFREF, MVCL_NUMREF, COBR_COD FROM movimiento_clientes WHERE MVCL_TIPOREF = NEW.ncde_tipodoc AND MVCL_IDREF = NEW.ncde_iddoc
        INTO :PREF, :NUMERO, :COBR;
    IF (NEW.ncde_anulado = 'N') THEN
      BEGIN
      IF (NEW.ncde_ok = 'S') THEN
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.ncde_tipodoc and sdca_idref = new.ncde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.ncde_abono - NEW.ncde_DTOF,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.ncde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.ncde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.ncde_RTICA
                WHERE SDCA_TIPOREF = NEW.ncde_TIPODOC AND SDCA_IDREF = NEW.ncde_IDDOC AND SDCA_FECHA = :FEC;
            end
        else
            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.ncde_tipodoc, NEW.ncde_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.ncde_abono+NEW.ncde_dtof), NEW.ncde_rtfte, NEW.ncde_rtiva, NEW.ncde_rtica, 'N', 0, 1);

        EXISTE = 'N';
        SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 92 AND MVCL_IDREF = NEW.ncar_id AND MVCL_SUCURSAL = NEW.ncde_sucursal INTO :EXISTE;
        if (EXISTE = 'S') then
           begin
           UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.ncde_abono + NEW.ncde_DTOF,
            MVCL_RTEFTE = MVCL_RTEFTE + NEW.ncde_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA + NEW.ncde_rtiva,
            MVCL_RTEICA = MVCL_RTEICA + NEW.ncde_rtica
            WHERE MVCL_TIPOREF = 92 AND MVCL_IDREF = NEW.NCAR_ID AND MVCL_SUCURSAL = NEW.ncde_sucursal;
           END
        ELSE
            BEGIN
            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, 92, NEW.ncar_id, :FEC, :FEC, 'ABONO POR DESCUENTO NOMINA', (NEW.ncde_abono+NEW.ncde_dtof), NEW.ncde_rtfte, NEW.ncde_rtiva, NEW.ncde_rtica, 'N', 'S', :PREF, :NUMERO, NEW.ncde_sucursal, :COBR, 1);
            END
        END
     END
    END
end
^

/* Trigger: NOMINA_CARTERA_DETALLE_AU */
CREATE TRIGGER NOMINA_CARTERA_DETALLE_AU FOR NOMINA_CARTERA_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable NIT VARCHAR(20);
DECLARE VARIABLE FEC DATE;
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE COBR INTEGER;
DECLARE VARIABLE PREF VARCHAR(4);
DECLARE VARIABLE NUMERO VARCHAR(8);
BEGIN
IF (OLD.NCAR_ID <> 0) THEN
    BEGIN
    SELECT NCAR_fecha FROM nomina_cartera WHERE NCAR_id = OLD.NCAR_id INTO :FEC;
    IF (OLD.ncde_anulado = 'N') THEN
      BEGIN
      IF (OLD.ncde_ok = 'S') 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;
        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 = 92 AND MVCL_IDREF = OLD.NCAR_ID AND MVCL_SUCURSAL = OLD.ncde_sucursal;
        END
      END
    END

IF (NEW.NCAR_ID <> 0) THEN
    BEGIN
    SELECT NCAR_fecha, terc_nit FROM nomina_cartera WHERE NCAR_id = NEW.NCAR_id INTO :FEC, :NIT;
    SELECT MVCL_PREFREF, MVCL_NUMREF, COBR_COD FROM movimiento_clientes WHERE MVCL_TIPOREF = NEW.ncde_tipodoc AND MVCL_IDREF = NEW.ncde_iddoc
        INTO :PREF, :NUMERO, :COBR;
    IF (NEW.ncde_anulado = 'N') THEN
      BEGIN
      IF (NEW.ncde_ok = 'S') THEN
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cartera where sdca_tiporef = new.ncde_tipodoc and sdca_idref = new.ncde_iddoc and sdca_fecha = :FEC into :EXISTE;
        if (Existe = 'S') then
            begin
            UPDATE saldos_doc_cartera
                SET SDCA_ABONO = SDCA_ABONO + NEW.ncde_abono - NEW.ncde_DTOF,
                SDCA_ABRTFTE = SDCA_ABRTFTE + NEW.ncde_RTFTE,
                SDCA_ABRTIVA = SDCA_ABRTIVA + NEW.ncde_RTIVA,
                SDCA_ABRTICA = SDCA_ABRTICA + NEW.ncde_RTICA
                WHERE SDCA_TIPOREF = NEW.ncde_TIPODOC AND SDCA_IDREF = NEW.ncde_IDDOC AND SDCA_FECHA = :FEC;
            end
        else
            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.ncde_tipodoc, NEW.ncde_iddoc, :FEC, :NIT, 0, 0, 0, (NEW.ncde_abono+NEW.ncde_dtof), NEW.ncde_rtfte, NEW.ncde_rtiva, NEW.ncde_rtica, 'N', 0, 1);

        EXISTE = 'N';
        SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 92 AND MVCL_IDREF = NEW.ncar_id AND MVCL_SUCURSAL = NEW.ncde_sucursal INTO :EXISTE;
        if (EXISTE = 'S') then
           begin
           UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + NEW.ncde_abono + NEW.ncde_DTOF,
            MVCL_RTEFTE = MVCL_RTEFTE + NEW.ncde_rtfte,
            MVCL_RTEIVA = MVCL_RTEIVA + NEW.ncde_rtiva,
            MVCL_RTEICA = MVCL_RTEICA + NEW.ncde_rtica
            WHERE MVCL_TIPOREF = 92 AND MVCL_IDREF = NEW.NCAR_ID AND MVCL_SUCURSAL = NEW.ncde_sucursal;
           END
        ELSE
            BEGIN
            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, 92, NEW.ncar_id, :FEC, :FEC, 'ABONO POR DESCUENTO NOMINA', (NEW.ncde_abono+NEW.ncde_dtof), NEW.ncde_rtfte, NEW.ncde_rtiva, NEW.ncde_rtica, 'N', 'S', :PREF, :NUMERO, NEW.ncde_sucursal, :COBR, 1);
            END
        END
     END
    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
^

/* Trigger: NOMINA_COMISIONES_BI */
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
^

/* Trigger: NOMINA_CONCEPTOS_AD */
CREATE TRIGGER NOMINA_CONCEPTOS_AD FOR NOMINA_CONCEPTOS
ACTIVE AFTER DELETE POSITION 0
as
declare variable PERIODIC INTEGER;
begin
/* actualice los empleados por nÃ³mina */
if (not exists (select nomi_id from nomina_conceptos where nomi_id = OLD.nomi_id and terc_nit = OLD.terc_nit)) then
    DELETE FROM nomina_detalle WHERE nomi_id = old.nomi_id and terc_nit = old.terc_nit;
/* marque OK la cartera abonada */
SELECT n.nomi_periodocidad FROM NOMINA N WHERE N.nomi_id = old.nomi_id INTO :periodic;
if (OLD.conc_cod = 954) then
  UPDATE NOMINA_CARTERA_DETALLE ND
      SET ND.ncde_ok = 'N'
      WHERE exists (SELECT ncar_id FROM NOMINA_CARTERA NC WHERE NC.ncar_periodo = OLD.noco_periodo AND NC.ncar_periodicidad = :periodic
        AND NC.ncar_ano = OLD.noco_ano AND NC.terc_nit = OLD.terc_nit and ncar_id = ND.ncar_id);
end
^

/* Trigger: NOMINA_CONCEPTOS_AI0 */
CREATE TRIGGER NOMINA_CONCEPTOS_AI0 FOR NOMINA_CONCEPTOS
ACTIVE AFTER INSERT POSITION 0
AS
declare variable PERIODIC INTEGER;
begin
/* actualice los empleados por nÃ³mina */
if (not exists (select nomi_id from nomina_detalle where nomi_id = new.nomi_id and terc_nit = new.terc_nit)) then
    insert into nomina_detalle (nomi_id, terc_nit) values(new.nomi_id, new.terc_nit);

/* marque OK la cartera abonada */
SELECT n.nomi_periodocidad FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id INTO :periodic;
if (NEW.conc_cod = 954) then
  UPDATE NOMINA_CARTERA_DETALLE ND
      SET ND.ncde_ok = 'S'
      WHERE exists (SELECT ncar_id FROM NOMINA_CARTERA NC WHERE NC.ncar_periodo = NEW.noco_periodo AND NC.ncar_periodicidad = :periodic
        AND NC.ncar_ano = NEW.noco_ano AND NC.terc_nit = NEW.terc_nit and ncar_id = ND.ncar_id);
end
^

/* Trigger: NOMINA_CONCEPTOS_AU */
CREATE TRIGGER NOMINA_CONCEPTOS_AU FOR NOMINA_CONCEPTOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
/* actualice los empleados por nÃ³mina */
if (not exists (select nomi_id from nomina_conceptos where nomi_id = OLD.nomi_id and terc_nit = OLD.terc_nit)) then
    DELETE FROM nomina_detalle WHERE nomi_id = old.nomi_id and terc_nit = old.terc_nit;

/* actualice los empleados por nÃ³mina */
if (not exists (select nomi_id from nomina_detalle where nomi_id = new.nomi_id and terc_nit = new.terc_nit)) then
    insert into nomina_detalle (nomi_id, terc_nit) values(new.nomi_id, new.terc_nit);
end
^

/* Trigger: NOMINA_CONCEPTOS_BD */
CREATE TRIGGER NOMINA_CONCEPTOS_BD FOR NOMINA_CONCEPTOS
ACTIVE BEFORE DELETE POSITION 0
as
declare variable prestamo char(1);
declare variable IDPR INTEGER;
declare variable ITEMPR INTEGER;
declare variable MONTO NUMERIC(18,2);
declare variable VALOR NUMERIC(18,2);
declare variable VALORAUX NUMERIC(18,2);
begin
select conc_prestamo from conceptos_nomina where conc_cod = old.conc_cod into :prestamo;
if ((old.conc_cod = 922) or (prestamo = 'S')) then
    begin
    VALOR = OLD.noco_valor*-1;
    FOR SELECT P.prno_id, P.prcu_item, P.prcu_monto from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
        where P.PRCU_ANO = old.noco_ano and P.PRCU_PERIODO = old.noco_periodo and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = OLD.terc_nit
        and PN.conc_cod = OLD.conc_cod AND P.prcu_nomiid = OLD.nomi_id into :IDPR, :ITEMPR, :MONTO
        DO
        BEGIN
        /* borre el pago de la cuota de ese periodo */
        if (VALOR >= MONTO) then
            BEGIN
            update PRESTAMO_CUOTAS  P set PRCU_OK = 'N', PRCU_ABONO = PRCU_ABONO - :MONTO, PRCU_NOMIID = 0
                where PRNO_ID = :IDPR and P.prcu_item = :ITEMPR;
            VALOR = VALOR - MONTO;
            END
        else
            if (VALOR > 0) then
                BEGIN
                update PRESTAMO_CUOTAS  P set PRCU_OK = 'N', PRCU_ABONO = PRCU_ABONO - :VALOR, PRCU_NOMIID = 0
                    where PRNO_ID = :idpr and P.prcu_item = :itempr;
                VALOR = 0;
                END
        END
    if (VALOR > 0) then
        BEGIN
        /* ACTUALICE LA ULTIMA CUOTA */
        for select max(p.prno_id), MAX(PRCU_ITEM) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
            where PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = OLD.terc_nit and PN.conc_cod = OLD.conc_cod AND P.prcu_nomiid = OLD.nomi_id
            group by p.prno_id  into :idpr, :ITEMPR
            DO
            BEGIN
            select prcu_abono from PRESTAMO_CUOTAS where PRNO_ID = :idpr and prcu_item = :itempr into :valoraux;
            if (valoraux >= valor) then
                BEGIN
                update PRESTAMO_CUOTAS  P set PRCU_OK = 'N', PRCU_ABONO = PRCU_ABONO - :valor, PRCU_NOMIID = 0
                    where P.prno_id = :idpr and P.prcu_item = :itempr;
                VALOR = 0;
                END
            else
                if (VALOR > 0 ) then
                    BEGIN
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'N', PRCU_ABONO = 0, PRCU_NOMIID = 0
                        where P.prno_id = :idpr and P.prcu_item = :itempr;
                    VALOR = VALOR - VALORAUX;
                    END
            END
        END
    end
end
^

/* Trigger: NOMINA_CONCEPTOS_BI */
CREATE TRIGGER NOMINA_CONCEPTOS_BI FOR NOMINA_CONCEPTOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE ITEM INTEGER;
declare variable ANOM CHAR(4);
declare variable PERM INTEGER;
declare variable BENEFI CHAR(1);
declare variable BENPAG CHAR(1);
BEGIN
  /* Trigger text */
IF (NEW.nomi_id <> 0) THEN
  BEGIN
  SELECT NOMI_ANO, NOMI_PERIODO FROM nomina WHERE NOMI_ID = NEW.nomi_id INTO :ANOM, PERM;
  if ((NEW.noco_ano <> :ANOM) or (NEW.noco_periodo <> :perm))  then
    exception nomina_otro_periodo;
  SELECT MAX (NOCO_ITEM) FROM nomina_conceptos WHERE NOMI_ID = new.nomi_id INTO :item;
  IF (item IS NULL) THEN
      BEGIN
      item = 1;
      NEW.noco_item = :ITEM;
      END
  ELSE
      BEGIN
      ITEM = ITEM + 1;
      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) and (new.noco_entidad <> ''))  then
    new.noco_nitcont = new.noco_entidad;
else
    new.noco_nitcont = new.terc_nit;
if (NEW.noco_benpag IS NULL) then
    BEGIN
    NEW.noco_benpag = 'S';
    SELECT CONC_BENPAG, CONC_BENEFIC FROM CONCEPTOS_NOMINA WHERE CONC_COD = NEW.conc_cod
        INTO :BENPAG, :BENEFI;
    if (BENEFI = 'S') then
        NEW.noco_benpag = :benpag;
    END
END
^

/* Trigger: NOMINA_CONCEPTOS_BU */
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
^

/* Trigger: NOMINA_CONCEPTOS_PROV_BI */
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_DEPARTAMENTO_BI */
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
^

/* Trigger: NOMINA_DETALLE_AD */
CREATE TRIGGER NOMINA_DETALLE_AD FOR NOMINA_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
declare variable OK INTEGER;
begin
/* desmarque las novedades */
update nomina_novedades_detalle nd set nd.nomi_id = 0 where nomi_id = old.nomi_id and
    exists (select nono_id from nomina_novedades n where nono_id = nd.nono_id and n.terc_nit = old.terc_nit);
/* desmarque las extras */
update nomina_horasext nh set nh.noex_nomid = 0 where noex_nomid = old.nomi_id and nh.terc_nit = OLD.TERC_NIT;
select count(terc_nit) from nomina_detalle where nomi_id = old.nomi_id into :OK;
if (OK > 0) then
    DELETE FROM NOMINA WHERE NOMI_ID = OLD.nomi_id;
end
^

/* 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;
declare variable TIPO CHAR(1);
begin
SELECT N.nomi_periodo,N.nomi_feccausa, n.nomi_tipo FROM NOMINA N WHERE N.nomi_id = NEW.nomi_id
    INTO :periodo,:fec, :tipo;
if (TIPO = 'N') then
    EXECUTE PROCEDURE DIAS_LABORADOS(NEW.terc_nit,:periodo,:fec,'N',0) returning_values(NEW.node_diaslab);
if (TIPO = 'L') then
    EXECUTE PROCEDURE dias_laborados_liq(NEW.terc_nit,:periodo,:fec,'N',0) returning_values(NEW.node_diaslab);
if (TIPO = 'V') then
    SELECT VD.vacd_dias FROM vacaciones_detalle VD WHERE VD.vacd_nomid = NEW.nomi_id INTO NEW.node_diaslab;

/* GUARDE LA FORMA DE PAGO DEL EMPLEADO */
SELECT EMPL_FORMPAGO FROM empleados WHERE TERC_NIT = NEW.terc_nit INTO NEW.node_formpago;
end
^

/* Trigger: NOMINA_HORASEXT_BD */
CREATE TRIGGER NOMINA_HORASEXT_BD FOR NOMINA_HORASEXT
ACTIVE BEFORE DELETE POSITION 0
as
begin
if (exists (select n.nomi_id from nomina_detalle d, nomina n where n.nomi_id = d.nomi_id and n.nomi_periodocidad = old.noex_periodicidad and n.nomi_ano = old.noex_ano and n.nomi_periodo = old.noex_periodio and d.terc_nit = old.terc_nit)) then
    exception hora_extra_ya_utilizada;
end
^

/* Trigger: NOMINA_HORASEXT_BI */
CREATE TRIGGER NOMINA_HORASEXT_BI FOR NOMINA_HORASEXT
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE tar_fesd NUMERIC(18,2);
DECLARE VARIABLE tar_fesn NUMERIC(18,2);
DECLARE VARIABLE tar_diur NUMERIC(18,2);
DECLARE VARIABLE tar_noct NUMERIC(18,2);
DECLARE VARIABLE tar_recnoct NUMERIC(18,2);
DECLARE VARIABLE tar_recfest NUMERIC(18,2);
DECLARE VARIABLE tar_recfnoc NUMERIC(18,2);
DECLARE VARIABLE aprox INTEGER;
declare variable horasempl INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')RETURNING_VALUES(:APROX);
IF (NOT EXISTS(SELECT TERC_NIT 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)) THEN
    BEGIN
    IF ((NEW.noex_salbase IS NULL) OR (NEW.noex_salbase = 0) ) THEN
        SELECT EMPL_SALARIO FROM empleados WHERE TERC_NIT = NEW.terc_nit INTO NEW.noex_salbase;
    SELECT EMPL_HORAS FROM empleados WHERE TERC_NIT = NEW.terc_nit INTO :horasempl;
    if (horasempl IS NULL) then
        horasempl = 240;
    SELECT PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD, P.PAAN_RECNOC, P.PAAN_RECFEST, p.paan_recfesnoc
        FROM PARAMETROS_ANO P WHERE paan_ano = NEW.noex_ano
      INTO :tar_diur, :tar_noct, :tar_fesn, :tar_fesd, :tar_recnoct, :tar_recfest, :tar_recfnoc;
    IF (NEW.noex_diur IS NULL) THEN
        NEW.noex_diur = 0;
    IF (NEW.noex_diur <> 0) THEN
        NEW.noex_mdiur = (NEW.noex_salbase / :horasempl) * :tar_diur * NEW.noex_diur;
    IF (NEW.noex_mdiur IS NULL) THEN
        NEW.noex_mdiur = 0;

    IF (NEW.noex_fdiur IS NULL) THEN
        NEW.noex_fdiur = 0;
    IF (NEW.noex_fdiur <> 0) THEN
        NEW.noex_mfdiur = (NEW.noex_salbase / :horasempl) * :tar_fesd * NEW.noex_fdiur;
    IF (NEW.noex_mfdiur IS NULL) THEN
        NEW.noex_mfdiur = 0;

    IF (NEW.noex_noct IS NULL) THEN
        NEW.noex_noct = 0;
    IF (NEW.noex_noct <> 0) THEN
        NEW.noex_mnoct = (NEW.noex_salbase / :horasempl) * :tar_noct * NEW.noex_noct;
    IF (NEW.noex_mnoct IS NULL) THEN
        NEW.noex_mnoct = 0;

    IF (NEW.noex_fnoct IS NULL) THEN
        NEW.noex_fnoct = 0;
    IF (NEW.noex_fnoct <> 0) THEN
        NEW.noex_mfnoct = (NEW.noex_salbase / :horasempl) * :tar_fesn * NEW.noex_fnoct;
    IF (NEW.noex_mfnoct IS NULL) THEN
        NEW.noex_mfnoct = 0;

    IF (NEW.noex_recnoct IS NULL) THEN
        NEW.noex_recnoct = 0;
    IF (NEW.noex_recnoct <> 0) THEN
        NEW.noex_mrecnoct = (NEW.noex_salbase / :horasempl) * :tar_recnoct * NEW.noex_recnoct;
    IF (NEW.noex_mrecnoct IS NULL) THEN
        NEW.noex_mrecnoct = 0;

    IF (NEW.noex_recfest IS NULL) THEN
        NEW.noex_recfest = 0;
    IF (NEW.noex_recfest <> 0) THEN
        NEW.noex_mrecfest = (NEW.noex_salbase / :horasempl) * :tar_recfest * NEW.noex_recfest;
    IF (NEW.noex_mrecfest IS NULL) THEN
        NEW.noex_mrecfest = 0;

    IF (NEW.noex_recfnoc IS NULL) THEN
        NEW.noex_recfnoc = 0;
    IF (NEW.noex_recfnoc <> 0) THEN
        NEW.noex_mrecfnoc = (NEW.noex_salbase / :horasempl) * :tar_recfnoc * NEW.noex_recfnoc;
    IF (NEW.noex_mrecfnoc IS NULL) THEN
        NEW.noex_mrecfnoc = 0;

    IF (NEW.noex_domin IS NULL) THEN
        NEW.noex_domin = 0;
    IF (NEW.noex_domin <> 0) THEN
        NEW.noex_mdomin = (NEW.noex_salbase / :horasempl) * :tar_recfest * NEW.noex_domin;
    IF (NEW.noex_mdomin IS NULL) THEN
        NEW.noex_mdomin = 0;

    EXECUTE PROCEDURE redondee(NEW.noex_mdiur, :aprox) RETURNING_VALUES (NEW.noex_mdiur);
    EXECUTE PROCEDURE redondee(NEW.noex_mfdiur, :aprox) RETURNING_VALUES (NEW.noex_mfdiur);
    EXECUTE PROCEDURE redondee(NEW.noex_mnoct, :aprox) RETURNING_VALUES (NEW.noex_mnoct);
    EXECUTE PROCEDURE redondee(NEW.noex_mrecnoct, :aprox) RETURNING_VALUES (NEW.noex_mrecnoct);
    EXECUTE PROCEDURE redondee(NEW.noex_mrecfest, :aprox) RETURNING_VALUES (NEW.noex_mrecfest);
    EXECUTE PROCEDURE redondee(NEW.noex_mfnoct, :aprox) RETURNING_VALUES (NEW.noex_mfnoct);
    EXECUTE PROCEDURE redondee(NEW.noex_mdomin, :aprox) RETURNING_VALUES (NEW.noex_mdomin);
    EXECUTE PROCEDURE redondee(NEW.noex_mrecfnoc, :aprox) RETURNING_VALUES (NEW.noex_mrecfnoc);
    NEW.noex_montorec = NEW.noex_mrecnoct + NEW.noex_mrecfest + NEW.noex_mrecfnoc + NEW.noex_mdomin;
    NEW.noex_monto = NEW.noex_mdiur + NEW.noex_mfdiur + NEW.noex_mnoct + NEW.noex_mfnoct;
    END
ELSE
    EXCEPTION YA_EXISTE_EL_REGISTRO;
END
^

/* Trigger: NOMINA_HORASEXT_BU */
CREATE TRIGGER NOMINA_HORASEXT_BU FOR NOMINA_HORASEXT
ACTIVE BEFORE UPDATE POSITION 0
AS
declare variable MONTO NUMERIC(18,2);
declare variable tar_fesd numeric(18,2);
declare variable tar_fesn numeric(18,2);
declare variable tar_diur numeric(18,2);
declare variable tar_noct numeric(18,2);
declare variable tar_recnoct numeric(18,2);
declare variable tar_recfest numeric(18,2);
declare variable tar_recfnoc numeric(18,2);
declare variable HORAS integer;
declare variable aprox integer;
declare variable SALARIO NUMERIC(18,2);
BEGIN
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
SELECT EMPL_SALARIO, empl_horas FROM empleados WHERE TERC_NIT = NEW.terc_nit INTO :SALARIO, :HORAS;
IF ((new.noex_salbase IS NULL) OR (new.noex_salbase = 0) ) THEN
    new.noex_salbase = SALARIO;
monto = NEW.noex_salbase / :horas;
SELECT PAAN_HORASDI, PAAN_HORASNO, PAAN_HORASFN, PAAN_HORASFD, P.PAAN_RECNOC, P.PAAN_RECFEST, p.paan_recfesnoc
    FROM PARAMETROS_ANO P WHERE paan_ano = NEW.noex_ano
  INTO :tar_diur, :tar_noct, :tar_fesn, :tar_fesd, :tar_recnoct, :tar_recfest, :tar_recfnoc;

if (NEW.noex_diur IS NULL) then
    NEW.noex_diur = 0;
IF (NEW.noex_diur <> 0) THEN
    NEW.noex_mdiur = MONTO * NEW.noex_diur * :tar_diur;
if (NEW.noex_mdiur IS NULL) then
    NEW.noex_mdiur = 0;

if (NEW.noex_fdiur IS NULL) then
    NEW.noex_fdiur = 0;
IF (NEW.noex_fdiur <> 0) THEN
    NEW.noex_mfdiur = MONTO * NEW.noex_fdiur * :tar_fesd;
if (NEW.noex_mfdiur IS NULL) then
    NEW.noex_mfdiur = 0;

if (NEW.noex_noct IS NULL) then
    NEW.noex_noct = 0;
IF (NEW.noex_noct <> 0) THEN
    NEW.noex_mnoct = MONTO * NEW.noex_noct * :tar_noct;
if (NEW.noex_mnoct IS NULL) then
    NEW.noex_mnoct = 0;

if (NEW.noex_fnoct IS NULL) then
    NEW.noex_fnoct = 0;
IF (NEW.noex_fnoct <> 0) THEN
    NEW.noex_mfnoct = MONTO * NEW.noex_fnoct * :tar_fesn;
if (NEW.noex_mfnoct IS NULL) then
    NEW.noex_mfnoct = 0;

if (NEW.noex_recnoct IS NULL) then
    NEW.noex_recnoct = 0;
IF (NEW.noex_recnoct <> 0) THEN
    NEW.noex_mrecnoct = MONTO * NEW.noex_recnoct * :tar_recnoct;
if (NEW.noex_mrecnoct IS NULL) then
    NEW.noex_mrecnoct = 0;

if (NEW.noex_recfest IS NULL) then
    NEW.noex_recfest = 0;
IF (NEW.noex_recfest <> 0) THEN
    NEW.noex_mrecfest = MONTO * NEW.noex_recfest * :tar_recfest;
if (NEW.noex_mrecfest IS NULL) then
    NEW.noex_mrecfest = 0;

if (NEW.noex_recfnoc IS NULL) then
    NEW.noex_recfnoc = 0;
IF (NEW.noex_recfnoc <> 0) THEN
    NEW.noex_mrecfnoc = MONTO * NEW.noex_recfnoc * :tar_recfnoc;
if (NEW.noex_mrecfnoc IS NULL) then
    NEW.noex_mrecfnoc = 0;

if (NEW.noex_domin IS NULL) then
    NEW.noex_domin = 0;
IF (NEW.noex_domin <> 0) THEN
    NEW.noex_mdomin = MONTO * 8 * NEW.noex_domin * :tar_recfest;
if (NEW.noex_mdomin IS NULL) then
    NEW.noex_mdomin = 0;

execute procedure redondee(new.noex_mdiur, :aprox) returning_values (new.noex_mdiur);
execute procedure redondee(new.noex_mfdiur, :aprox) returning_values (new.noex_mfdiur);
execute procedure redondee(new.noex_mnoct, :aprox) returning_values (new.noex_mnoct);
execute procedure redondee(new.noex_mrecnoct, :aprox) returning_values (new.noex_mrecnoct);
execute procedure redondee(new.noex_mrecfest, :aprox) returning_values (new.noex_mrecfest);
execute procedure redondee(new.noex_mfnoct, :aprox) returning_values (new.noex_mfnoct);
execute procedure redondee(new.noex_mdomin, :aprox) returning_values (new.noex_mdomin);
execute procedure redondee(new.noex_mrecfnoc, :aprox) returning_values (new.noex_mrecfnoc);

NEW.noex_montorec = NEW.noex_mrecnoct + NEW.noex_mrecfest + NEW.noex_mrecfnoc + NEW.noex_mdomin;
NEW.noex_monto = NEW.noex_mdiur + NEW.noex_mfdiur + NEW.noex_mnoct + NEW.noex_mfnoct;
END
^

/* Trigger: NOMINA_HORASEXT_BU1 */
CREATE TRIGGER NOMINA_HORASEXT_BU1 FOR NOMINA_HORASEXT
ACTIVE BEFORE UPDATE POSITION 1
as
begin
if ((new.noex_montorec <> old.noex_montorec) or (new.noex_monto <> old.noex_monto)) then
    if (old.noex_nomid <> 0) then
        exception hora_extra_ya_utilizada 'La hora extra o recargo del empleado ' || new.terc_nit || ' ya fue utilizada.';
end
^

/* Trigger: NOMINA_NOVEDADES_AI */
CREATE TRIGGER NOMINA_NOVEDADES_AI FOR NOMINA_NOVEDADES
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
^

/* Trigger: NOMINA_NOVEDADES_BI */
CREATE TRIGGER NOMINA_NOVEDADES_BI FOR NOMINA_NOVEDADES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable BASE VARCHAR(8);
declare variable FACSAL numeric(18,2);
declare variable MAXFS numeric(18,2);
declare variable DOMIN CHAR(2);
declare variable SALVAR CHAR(1);
declare variable CONC_COD INTEGER;
begin
if (new.nono_dura is null) then
    new.nono_dura = 0;
if (new.nono_diaini is null) then
    new.nono_diaini = 1;
if (new.nono_dominical is null) then
    begin
    EXECUTE PROCEDURE lee_configuracion('NOMINA', 'LIQUIDACION', 'DESCONTAR DOMINICAL EN SANCIONES POR DIAS NO LABORADOS') returning_values (DOMIN);
    if (DOMIN = 'SI') then
        NEW.nono_dominical = 'S';
    else
        NEW.nono_dominical = 'N';
    end
if (NEW.nono_ibc IS NULL) then
    BEGIN
    /* TRAIGA EL SALARIO DEL EMPLEADO */
    select E.empl_facsal, e.empl_salvar from EMPLEADOS E where terc_nit = NEW.terc_nit into :facsal, :salvar;
    select P.paan_maxfs from PARAMETROS_ANO P where P.PAAN_ANO = NEW.nono_ano into :maxfs;
    if ((FACSAL IS NULL) or (FACSAL = 0))  then
        FACSAL = 100;
    if (FACSAL < MAXFS) then
        FACSAL = MAXFS;
    if ((new.TNOV_COD = 6) or (new.TNOV_COD = 13))  then
        execute procedure salario_promedio_sin_aux (new.terc_nit, new.nono_fecha, 12, 'S') returning_values (NEW.nono_ibc);
    else
        begin
        execute procedure lee_configuracion('NOMINA', 'LIQUIDACION', 'LIQUIDAR INCAPACIDADES DE SUELDOS VARIABLES CON SALARIO BASICO O PROMEDIO DE ULTIMO AÑO') returning_values (:base);
        if ((BASE = 'PROMEDIO') AND (salvar = 'S')) then
            execute procedure salario_promedio_sin_aux (new.terc_nit, new.nono_fecha, 12, 'N') returning_values (NEW.nono_ibc);
        else
            begin
            SELECT FIRST 1 CONC_COD FROM empleado_conceptos WHERE ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903)
                 or (CONC_COD = 1011) or (CONC_COD = 971) or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 974)
                  or (CONC_COD = 980) or (CONC_COD = 981) or (CONC_COD = 1023)) INTO :CONC_COD;
            execute procedure ibc_empleado (new.terc_nit, new.nono_ano, new.nono_periodo, :CONC_COD) returning_values (NEW.nono_ibc);
            NEW.nono_ibc = NEW.nono_ibc * FACSAL / 100;
            end
        end
    END
end
^

/* Trigger: NOMINA_NOVEDADES_DETALLE_BI */
CREATE TRIGGER NOMINA_NOVEDADES_DETALLE_BI FOR NOMINA_NOVEDADES_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE BASE NUMERIC(18,2);
declare variable smlv NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable PRORROGA CHAR(1);
declare variable NITE VARCHAR(20);
declare variable FECHA DATE;
declare variable PERINI INTEGER;
declare variable aprox integer;
BEGIN
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
if (new.nnde_diaini is null) then
    new.nnde_diaini = 1;
if (new.nnde_duracion is null) then
    new.nnde_duracion = 0;
SELECT N.tnov_cod, N.nono_ibc, n.nono_prorroga, N.terc_nit, N.nono_fecha, n.nono_periodo
    FROM nomina_novedades N WHERE N.nono_id = NEW.nono_id INTO :TIPO, :BASE, :prorroga, :NITE, :FECHA, :perini;
if (prorroga = 'S') then
    NEW.nnde_prorroga = 'S';
/* CALCULE EL VALOR DE LAS INCAPACIDADES */
IF (:TIPO = 2) THEN
    BEGIN
    NEW.nnde_valor = (BASE / 30 * NEW.nnde_duracion) * NEW.nnde_porc / 100;
    /* ENFERMEDAD GENERAL */
    SELECT P.paan_salminimo
        FROM parametros_ano P WHERE P.paan_ano = NEW.nnde_ano INTO :SMLV;
    MINIMO = SMLV / 30 * NEW.nnde_duracion;
    if (NEW.nnde_valor < :MINIMO) then
        NEW.nnde_valor = MINIMO;
    END
IF (:TIPO = 3) THEN
    BEGIN
    NEW.nnde_valor = (BASE / 30 * NEW.nnde_duracion);
    END
IF (:TIPO = 4) THEN /* LICENCIA DE MATERNIDAD */
    BEGIN
    NEW.nnde_valor = (BASE / 30 * NEW.nnde_duracion);
    END
IF (:TIPO = 6) THEN /* VACACIONES */
    BEGIN
    NEW.nnde_valor = (BASE / 30 * NEW.nnde_duracion);
    END
IF (:TIPO = 12) THEN /* LICENCIA REMUNERADA */
    BEGIN
    NEW.nnde_valor = (BASE / 30 * NEW.nnde_duracion);
    END
IF ((:TIPO = 9) or (:TIPO = 13))  THEN /* LICENCIA NO REMUNERADA */
    BEGIN
    NEW.nnde_valor = (BASE / 30 * NEW.nnde_duracion);
    END
execute procedure redondee(new.nnde_valor, :aprox) returning_values (new.nnde_valor);
END
^

/* Trigger: NOMINA_PROV_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: NOTAS_CLIENTES_AI */
CREATE 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', 1, NEW.nocl_iddoc, NEW.nocl_tipodoc);
        END
    END
end
^

/* Trigger: NOTAS_CLIENTES_BI */
CREATE TRIGGER NOTAS_CLIENTES_BI FOR NOTAS_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.nocl_id = gen_id(id_notasclientes, 1);
end
^

/* Trigger: NOTAS_CREDITO_AD */
CREATE TRIGGER NOTAS_CREDITO_AD FOR NOTAS_CREDITO
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, 75, OLD.ncbc_id, 'D', OLD.prba_pref || OLD.ncbc_numero, OLD.cuba_cod);
select enco_consec from comprobante_encabezado where enco_tiporef = 75 and enco_idref = old.ncbc_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 75 and enco_idref = old.ncbc_id;
/* ANULE EL DOCUMENTO anterior */
if ((old.ncbc_id <> 0) and (old.NCBC_ANULADO = 'N')) then
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPODOC = 75 AND MOBA_IDREF = OLD.ncbc_id;
end
^

/* Trigger: NOTAS_CREDITO_AI */
CREATE TRIGGER NOTAS_CREDITO_AI FOR NOTAS_CREDITO
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
  /* Actualice el movimiento del banco */
if ((NEW.ncbc_id <> 0) and (NEW.NCBC_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, 75, NEW.PRBA_PREF, NEW.ncbc_numero, NEW.ncbc_fecha, NEW.ncbc_concepto, NEW.ncbc_monto, 'S', new.ncbc_id, 75);
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 75, NEW.ncbc_id, 'I', NEW.prba_pref || NEW.ncbc_numero, NEW.cuba_cod);
    END
END
^

/* Trigger: NOTAS_CREDITO_AU */
CREATE TRIGGER NOTAS_CREDITO_AU FOR NOTAS_CREDITO
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
IF (NEW.ncbc_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 75 and enco_idref = old.ncbc_id into :consec;
    if (NOT consec is null) then
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    delete from comprobante_encabezado where enco_tiporef = 75 and enco_idref = old.ncbc_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 75, new.ncbc_id, 'A', NEW.prba_pref || NEW.ncbc_numero, NEW.cuba_cod);
    end
/* ANULE EL DOCUMENTO anterior */
if ((old.ncbc_id <> 0) and (old.NCBC_ANULADO = 'N')) then
    BEGIN
    IF (NEW.ncbc_anulado = 'S') then
        UPDATE MOVIMIENTO_BANCO
            SET MOBA_CONCEPTO = 'ANULADO', MOBA_TOTAL = 0
            WHERE MOBA_TIPODOC = 75 AND MOBA_IDREF = OLD.ncbc_id;
    ELSE
        DELETE FROM MOVIMIENTO_BANCO
            WHERE MOBA_TIPODOC = 75 AND MOBA_IDREF = OLD.ncbc_id;
    END
/* Actualice el movimiento del banco */
if ((NEW.ncbc_id <> 0) and (NEW.NCBC_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, 75, NEW.PRBA_PREF, NEW.ncbc_numero, NEW.ncbc_fecha, NEW.ncbc_concepto, NEW.ncbc_monto, 'S', new.ncbc_id, 75);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 75, NEW.ncbc_id, 'U', NEW.prba_pref || NEW.ncbc_numero, NEW.cuba_cod);
    END
END
^

/* Trigger: NOTAS_CREDITO_BI */
CREATE TRIGGER NOTAS_CREDITO_BI FOR NOTAS_CREDITO
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 = 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
^

/* Trigger: NOTAS_CREDITO_CLIENTES_AD */
CREATE 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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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
^

/* Trigger: NOTAS_CREDITO_CLIENTES_AI */
CREATE 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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, 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), (NEW.nccl_rtcreem*-1), 0, 0, 0, 0, 0, 'N', ((NEW.nccl_monto+NEW.nccl_ivamonto+new.nccl_extra)*-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_RCREE, 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_extra, NEW.NCCL_RTFTEMONTO, NEW.NCCL_RTIVAMONTO, NEW.NCCL_RTICAMONTO, NEW.nccl_rtcreem, '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
^

/* Trigger: NOTAS_CREDITO_CLIENTES_AU */
CREATE 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
       begin
       delete from comprobante_detalle where enco_consec = :consec;
       delete from comprobante_detalle_niif where enco_consec = :consec;
       delete from comprobante_encabezado where enco_tiporef = 42 and enco_idref = old.nccl_id;
       end
    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

if ((new.nccl_enviado = old.nccl_enviado) or (new.nccl_enviado is null)) then
    BEGIN
    /* 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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, 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), (NEW.nccl_rtcreem*-1), 0, 0, 0, 0, 0, 'N', ((NEW.nccl_monto+NEW.nccl_ivamonto+new.nccl_extra)*-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_RCREE, 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_extra, NEW.NCCL_RTFTEMONTO, NEW.NCCL_RTIVAMONTO, NEW.NCCL_RTICAMONTO, NEW.nccl_rtcreem, '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
ELSE
    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
^

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

/* Trigger: NOTAS_CREDITO_CLIENTES_BU */
CREATE TRIGGER NOTAS_CREDITO_CLIENTES_BU FOR NOTAS_CREDITO_CLIENTES
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if ((new.nccl_enviado = 'S') and (old.nccl_enviado = 'N')) then
    new.nccl_usrenvio = user;
end
^

/* Trigger: NOTAS_CREDITO_PROVEEDOR_AD */
CREATE TRIGGER NOTAS_CREDITO_PROVEEDOR_AD FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
declare variable ABONOS integer;
declare variable cant numeric(18,4);
declare variable costo numeric(18,2);
declare variable costot numeric(18,2);
declare variable FECMOV DATE;
declare variable CODART VARCHAR(15);
declare variable IDMOV INTEGER;
declare variable PROPORC NUMERIC(18,2);
declare variable FACTOR double precision;
declare variable CONC varchar(60);
declare variable posconc smallint;
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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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);
        if ((old.ncpr_facid is not null) and (old.ncpr_facid <> 0)) then
            begin
            /* deshaga cambios en registro de la factura de compra */
            if ((old.arti_cod is not null) and (old.arti_cod <> '')) then
                begin
                select sum(mvar_cant), sum(mvar_cant * mvar_costo) from movimiento_articulo
                    where arti_cod = old.arti_cod and mvar_tipodoc = 21 and mvar_idref = old.ncpr_facid into :cant, :costo;
                if (CANT <> 0) then
                    BEGIN
                    COSTO = (CANT * COSTO + OLD.ncpr_monto) / :CANT;

                    for select mvar_cons, MVAR_FECHA, mvar_cant, mvar_costo, mvar_conc from movimiento_articulo
                        where arti_cod = old.arti_cod and mvar_tipodoc = 21 and mvar_idref = old.ncpr_facid AND MVAR_CANT <> 0
                        INTO :IDMOV, :FECMOV, :cant, :costo, :conc
                        DO
                        begin
                        POSCONC = POSITION('-DTO' IN :CONC);
                        if ((OLD.ncpr_tipocosto = 'C') or (OLD.ncpr_tipocosto = 'A'))  then
                            BEGIN
                            if (POSCONC > 0) then
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = LEFT(MVAR_CONC, :POSCONC)
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                            else
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                            EXECUTE PROCEDURE chequeo_costos(OLD.arti_cod, :FECMOV);
                            END
                        if ((OLD.ncpr_tipocosto = 'N') or (OLD.ncpr_tipocosto = 'A'))  then
                            BEGIN
                            if (POSCONC > 0) then
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = LEFT(MVAR_CONC, :POSCONC)
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                            else
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                            EXECUTE PROCEDURE chequeo_costos_niif(OLD.arti_cod, :FECMOV);
                            END
                        end
                    END
                end
            ELSE
                BEGIN
                select sum(mvar_cant * mvar_costo) from movimiento_articulo
                    where mvar_tipodoc = 21 and mvar_idref = old.ncpr_facid into :costot;

                for select mvar_cons, ARTI_COD, MVAR_FECHA, mvar_cant, mvar_costo, mvar_conc from movimiento_articulo
                    where mvar_tipodoc = 21 and mvar_idref = old.ncpr_facid AND MVAR_CANT <> 0
                    INTO :IDMOV, :CODART, :FECMOV, :cant, :costo, :conc
                    DO
                    BEGIN
                    FACTOR = CAST((CANT * COSTO) AS DOUBLE PRECISION) / CAST(costot AS DOUBLE PRECISION);
                    proporc = OLD.ncpr_monto * FACTOR;
                    COSTO = ((CANT * COSTO) + :proporc) / CANT;
                    
                    POSCONC = POSITION('-DTO' IN :CONC);
                    if ((OLD.ncpr_tipocosto = 'C') or (OLD.ncpr_tipocosto = 'A'))  then
                        BEGIN
                        if (POSCONC > 0) then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = LEFT(MVAR_CONC, :POSCONC)
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos(OLD.arti_cod, :FECMOV);
                        END
                    if ((OLD.ncpr_tipocosto = 'N') or (OLD.ncpr_tipocosto = 'A'))  then
                        BEGIN
                        if (POSCONC > 0) then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = LEFT(MVAR_CONC, :POSCONC)
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos_niif(OLD.arti_cod, :FECMOV);
                        END
                    END
                END
            end
        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
^

/* Trigger: NOTAS_CREDITO_PROVEEDOR_AI */
CREATE TRIGGER NOTAS_CREDITO_PROVEEDOR_AI FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable COSTON NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
declare variable TOTFAC NUMERIC(18,2);
declare variable ITEM INTEGER;
declare variable CODART VARCHAR(20);
declare variable TOTITE NUMERIC(18,2);
declare variable CANTOT NUMERIC(18,4);
declare variable PROPORC NUMERIC(18,2);
declare variable FACTOR double precision;
declare variable exis char(1);
declare variable LOTE varchar(15);
declare variable IDMOV INTEGER;
declare variable FECMOV DATE;
declare variable CONC VARCHAR(60);
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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, 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), (NEW.ncpr_rtcreem * -1), 0, 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_RCREE, 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, NEW.ncpr_rtcreem, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        if (new.ncpr_facid is not null) then
            begin
            /* edite el registro en el kardex de ese articulo para esa factura */
            totite = 0;
            select sum(mvar_cant), sum(mvar_cant * mvar_costo) from movimiento_articulo
                where arti_cod = new.arti_cod and mvar_tipodoc = 21 and mvar_idref = new.ncpr_facid
                into :cantot, :totite;
            if ((new.ncpr_monto <= totite) AND (CANTOT > 0)) then
                begin
                COSTO = (TOTITE - NEW.ncpr_monto) / CANTOT;
                for select mvar_cons, MVAR_FECHA, MVAR_CONC from movimiento_articulo
                    where arti_cod = new.arti_cod and mvar_tipodoc = 21 and mvar_idref = new.ncpr_facid
                    INTO :IDMOV, :FECMOV, :CONC
                    DO
                    BEGIN
                    if ((NEW.ncpr_tipocosto = 'C') or (NEW.ncpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '-DTO ' || NEW.pref_pre || NEW.ncpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, :FECMOV);
                        END
                    if ((NEW.ncpr_tipocosto = 'N') or (NEW.ncpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '-DTO ' || NEW.pref_pre || NEW.ncpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        EXECUTE PROCEDURE chequeo_costos_niif(NEW.arti_cod, :FECMOV);
                        END
                    END
                end
            exception DESCUENTO_MAYOR_AL_TOTAL 'El monto del descuento ' || new.ncpr_monto || ' es mayor que el total del articulo ' || :totite;
            end
        else
            begin
            /* se aplica al inventario completo */
            execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
            execute procedure costo_promedio_niif (new.arti_cod, new.ncpr_fecha) returning_values (:COSTON);
            execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if ((NEW.ncpr_tipocosto = 'C') or (NEW.ncpr_tipocosto = 'A'))  then
                COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
            if ((NEW.ncpr_tipocosto = 'N') or (NEW.ncpr_tipocosto = 'A'))  then
                COSTON = ((COSTON * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
            select arti_exist from articulo where arti_cod = new.arti_cod into :exis;
            if (exis = 'B') then
                begin
                /* CALCULE EL NUEVO COSTO */
                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_COSTONIIF, 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, 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 AND MVAR_ENTRADA = 'N'
                    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_COSTONIIF, 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, :COSTON, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                    END
                end
            else if (exis = 'L') then
                begin
                FOR SELECT L.lote_nro, l.bode_cod FROM LOTES L WHERE ARTI_COD = new.arti_cod
                    INTO :LOTE, :codbod
                    do
                    begin
                    execute procedure saldo_lote_fecha(new.arti_cod, :codbod,  :lote,  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_COSTONIIF, 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, 0, 'N', :lote, new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                        END
                    END
                FOR SELECT DISTINCT BODE_COD, MVAR_CANT, MVAR_LOTE FROM MOVIMIENTO_ARTICULO
                    WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id and MVAR_ENTRADA = 'N'
                    INTO :CODBOD, :existencia, :LOTE 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_COSTONIIF, 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, :COSTON, 'S', :LOTE, new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                    END
                end
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
            end
        end
    else
        begin
        /* afecte la factura */
        if (new.ncpr_facid is not null) then
            begin
            select sum(mvar_cant * mvar_costo) from movimiento_articulo
                where mvar_tipodoc = 21 and mvar_idref = new.ncpr_facid into :totfac;
            if (TOTFAC IS NULL) then
                TOTFAC = 0;
    
            if ((TOTFAC <> 0) and (new.ncpr_monto <= :totfac)) then
              begin
              for select mvar_item, arti_cod, mvar_cant * mvar_costo, mvar_cant
                from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = new.ncpr_facid
                INTO :item, :codart, :totite, :cantot
                DO
                BEGIN
                FACTOR = CAST(totite AS DOUBLE PRECISION) / CAST(totfac AS DOUBLE PRECISION);
                proporc = NEW.ncpr_monto * FACTOR;
                /* CALCULE EL NUEVO COSTO */
                COSTO = (TOTITE - :proporc) / CANTOT;
                for select mvar_cons, MVAR_FECHA, mvar_conc from movimiento_articulo
                    where arti_cod = :codart and mvar_tipodoc = 21 and mvar_idref = new.ncpr_facid and mvar_item = :item
                    INTO :IDMOV, :FECMOV, :conc
                    DO
                    BEGIN
                    if ((NEW.ncpr_tipocosto = 'C') or (NEW.ncpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '-DTO ' || NEW.pref_pre || NEW.ncpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos(:codart, :FECMOV);
                        END
                    if ((NEW.ncpr_tipocosto = 'N') or (NEW.ncpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '-DTO ' || NEW.pref_pre || NEW.ncpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos_niif(:codart, :FECMOV);
                        END
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(:codart, new.ncpr_fecha);
                END
              end
            else
                exception descuento_mayor_al_total 'El monto del descuento es superior al monto de la factura a la que se aplica.';
            end
        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
^

/* Trigger: NOTAS_CREDITO_PROVEEDOR_AU */
CREATE 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 COSTON NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
declare variable TOTFAC NUMERIC(18,2);
declare variable ITEM INTEGER;
declare variable CODART VARCHAR(20);
declare variable TOTITE NUMERIC(18,2);
declare variable PROPORC NUMERIC(18,2);
declare variable exis char(1);
declare variable LOTE varchar(15);
declare variable CANT NUMERIC(18,4);
declare variable CANTOT NUMERIC(18,4);
declare variable COSTOT NUMERIC(18,2);
declare variable FACTOR double precision;
declare variable IDMOV INTEGER;
declare variable FECMOV DATE;
declare variable CONC VARCHAR(60);
declare variable POSCONC SMALLINT;
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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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);
        if ((old.ncpr_facid is not null) and (old.ncpr_facid <> 0)) then
            begin
            /* deshaga cambios en registro de la factura de compra */
            if ((old.arti_cod is not null) and (old.arti_cod <> '')) then
                begin
                select sum(mvar_cant), sum(mvar_cant * mvar_costo) from movimiento_articulo
                    where arti_cod = old.arti_cod and mvar_tipodoc = 21 and mvar_idref = old.ncpr_facid into :cant, :costo;
                if (CANT <> 0) then
                    BEGIN
                    COSTO = (CANT * COSTO + OLD.ncpr_monto) / :CANT;

                    for select mvar_cons, MVAR_FECHA, MVAR_CONC from movimiento_articulo
                        where arti_cod = old.arti_cod and mvar_tipodoc = 21 and mvar_idref = old.ncpr_facid AND MVAR_CANT <> 0
                        INTO :IDMOV, :FECMOV, :CONC
                        DO
                        begin
                        POSCONC = POSITION('-DTO' IN :CONC);
                        if ((OLD.ncpr_tipocosto = 'C') or (OLD.ncpr_tipocosto = 'A'))  then
                            BEGIN
                            if (POSCONC > 0) then
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = LEFT(MVAR_CONC, :POSCONC)
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            else
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            EXECUTE PROCEDURE chequeo_costos(OLD.arti_cod, :FECMOV);
                            END
                        if ((OLD.ncpr_tipocosto = 'N') or (OLD.ncpr_tipocosto = 'A'))  then
                            BEGIN
                            if (POSCONC > 0) then
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = LEFT(MVAR_CONC, :posconc)
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                        else
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            EXECUTE PROCEDURE chequeo_costos_niif(OLD.arti_cod, :FECMOV);
                            END
                        end
                    END
                end
            ELSE
                BEGIN
                select sum(mvar_cant * mvar_costo) from movimiento_articulo
                    where mvar_tipodoc = 21 and mvar_idref = old.ncpr_facid into :costot;

                for select mvar_cons, ARTI_COD, MVAR_FECHA, mvar_cant, mvar_costo from movimiento_articulo
                    where mvar_tipodoc = 21 and mvar_idref = old.ncpr_facid AND MVAR_CANT <> 0
                    INTO :IDMOV, :CODART, :FECMOV, :cant, :costo
                    DO
                    BEGIN
                    FACTOR = CAST((CANT * COSTO) AS DOUBLE PRECISION) / CAST(costot AS DOUBLE PRECISION);
                    proporc = OLD.ncpr_monto * FACTOR;
                    COSTO = ((CANT * COSTO) + :proporc) / CANT;
                    
                    POSCONC = POSITION('-DTO' IN :CONC);
                    if ((OLD.ncpr_tipocosto = 'C') or (OLD.ncpr_tipocosto = 'A'))  then
                        BEGIN
                        if (POSCONC > 0) then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = LEFT(MVAR_CONC, :POSCONC)
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos(:codart, :FECMOV);
                        END
                    if ((OLD.ncpr_tipocosto = 'N') or (OLD.ncpr_tipocosto = 'A'))  then
                        BEGIN
                        if (POSCONC > 0) then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = LEFT(MVAR_CONC, :POSCONC)
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos_niif(:codart, :FECMOV);
                        END
                    END
                END
            end
        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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, 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), (NEW.ncpr_rtcreem * -1), 0, 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_RCREE,  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, NEW.ncpr_rtcreem, 'N', 'N', NEW.pref_pre, NEW.ncpr_numero, NEW.ncpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        if (new.ncpr_facid is not null) then
            begin
            /* edite el registro en el kardex de ese articulo para esa factura */
            totite = 0;
            select sum(mvar_cant), sum(mvar_cant * mvar_costo) from movimiento_articulo
                where arti_cod = new.arti_cod and mvar_tipodoc = 21 and mvar_idref = new.ncpr_facid
                into :cantot, :totite;
            if ((new.ncpr_monto <= totite) AND (CANTOT > 0)) then
                begin
                COSTO = (TOTITE - NEW.ncpr_monto) / CANTOT;
                for select mvar_cons, MVAR_FECHA from movimiento_articulo
                    where arti_cod = new.arti_cod and mvar_tipodoc = 21 and mvar_idref = new.ncpr_facid INTO :IDMOV, :FECMOV
                    DO
                    BEGIN
                    if ((NEW.ncpr_tipocosto = 'C') or (NEW.ncpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '-DTO ' || NEW.pref_pre || NEW.ncpr_numero
                            WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                            WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, :FECMOV);
                        END
                    if ((NEW.ncpr_tipocosto = 'N') or (NEW.ncpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '-DTO ' || NEW.pref_pre || NEW.ncpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        EXECUTE PROCEDURE chequeo_costos_niif(NEW.arti_cod, :FECMOV);
                        END
                    END
                end
            exception DESCUENTO_MAYOR_AL_TOTAL 'El monto del descuento ' || new.ncpr_monto || ' es mayor que el total del articulo ' || :totite;
            end
        else
            begin
            /* se aplica al inventario completo */
            execute procedure costo_promedio (new.arti_cod, new.ncpr_fecha) returning_values (:COSTO);
            execute procedure costo_promedio_niif (new.arti_cod, new.ncpr_fecha) returning_values (:COSTON);
            execute procedure saldo_total_inventario (new.arti_cod, new.ncpr_fecha) returning_values (:EXISTENCIA);
            if ((NEW.ncpr_tipocosto = 'C') or (NEW.ncpr_tipocosto = 'A'))  then
                COSTO = ((COSTO * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
            if ((NEW.ncpr_tipocosto = 'N') or (NEW.ncpr_tipocosto = 'A'))  then
                COSTON = ((COSTON * EXISTENCIA) - NEW.ncpr_monto) / EXISTENCIA;
            select arti_exist from articulo where arti_cod = new.arti_cod into :exis;
            if (exis = 'B') then
                begin
                /* CALCULE EL NUEVO COSTO */
                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_COSTONIIF, 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, 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 AND MVAR_ENTRADA = 'N'
                    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_COSTONIIF, 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, :COSTON, 'S', '', new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                    END
                end
            else if (exis = 'L') then
                begin
                FOR SELECT L.lote_nro, l.bode_cod FROM LOTES L WHERE ARTI_COD = new.arti_cod
                    INTO :LOTE, :codbod
                    do
                    begin
                    execute procedure saldo_lote_fecha(new.arti_cod, :codbod,  :lote,  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_COSTONIIF, 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, 0, 'N', :lote, new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                        END
                    END
                FOR SELECT DISTINCT BODE_COD, MVAR_CANT, MVAR_LOTE FROM MOVIMIENTO_ARTICULO
                    WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id AND MVAR_ENTRADA = 'N'
                    INTO :CODBOD, :existencia, :LOTE 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_COSTONIIF, 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, :COSTON, 'S', :LOTE, new.pref_pre, new.ncpr_numero, 1, new.terc_nit);
                    END
                end
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ncpr_fecha);
            end
        end
    /* afecte la factura */
    if (new.ncpr_facid is not null) then
        begin
        select sum(mvar_cant * mvar_costo) from movimiento_articulo
            where mvar_tipodoc = 21 and mvar_idref = new.ncpr_facid into :totfac;
        if (TOTFAC IS NULL) then
            TOTFAC = 0;

        if ((TOTFAC <> 0) and (new.ncpr_monto <= :totfac)) then
          begin
          for select mvar_item, arti_cod, mvar_cant * mvar_costo, mvar_cant
            from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = new.ncpr_facid
            INTO :item, :codart, :totite, :cantot
            DO
            BEGIN
            FACTOR = CAST(totite AS DOUBLE PRECISION) / CAST(totfac AS DOUBLE PRECISION);
            proporc = NEW.ncpr_monto * FACTOR;
            /* CALCULE EL NUEVO COSTO */
            COSTO = (TOTITE - :proporc) / CANTOT;
            for select mvar_cons, MVAR_FECHA, MVAR_CONC from movimiento_articulo
                where arti_cod = :codart and mvar_tipodoc = 21 and mvar_idref = new.ncpr_facid and mvar_item = :item
                INTO :IDMOV, :FECMOV, :CONC
                DO
                BEGIN
                if ((NEW.ncpr_tipocosto = 'C') or (NEW.ncpr_tipocosto = 'A'))  then
                    BEGIN
                    if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                        UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '-DTO ' || NEW.pref_pre || NEW.ncpr_numero
                            WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                    else
                        UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                            WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                    EXECUTE PROCEDURE chequeo_costos(:codart, :FECMOV);
                    END
                if ((NEW.ncpr_tipocosto = 'N') or (NEW.ncpr_tipocosto = 'A'))  then
                    BEGIN
                    if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                        UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '-DTO ' || NEW.pref_pre || NEW.ncpr_numero
                            WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                    else
                        UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                            WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                    EXECUTE PROCEDURE chequeo_costos_niif(:codart, :FECMOV);
                    END
                END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(:codart, new.ncpr_fecha);
            END
          end
        else
            exception descuento_mayor_al_total 'El monto del descuento es superior al monto de la factura a la que se aplica.';
        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
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.ncpr_anulado <> NEW.ncpr_anulado) then
    BEGIN
    UPDATE nota_credito_prov_det SET NCPD_ANULADO = NEW.ncpr_anulado WHERE NCPR_ID = NEW.ncpr_id;
    END
if ((OLD.ncpr_transmit <> NEW.ncpr_transmit)) then
    BEGIN
    UPDATE nota_credito_prov_det SET NCPD_TRANSMIT = NEW.ncpr_transmit WHERE NCPR_ID = NEW.ncpr_id;
    END
END
^

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

/* Trigger: NOTAS_DEBITO_AD */
CREATE TRIGGER NOTAS_DEBITO_AD FOR NOTAS_DEBITO
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 74 and enco_idref = old.ndbc_id;
if ((old.ndbc_id <> 0) and (old.ndbc_anulado = 'N')) then
    begin
    /* ANULE EL MOV */
    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;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 74, OLD.ndbc_id, 'D', OLD.prba_pref || OLD.ndbc_numero, OLD.cuba_cod);
    END
END
^

/* Trigger: NOTAS_DEBITO_AI */
CREATE TRIGGER NOTAS_DEBITO_AI FOR NOTAS_DEBITO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable conc varchar(60);
BEGIN
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, 'I', NEW.prba_pref || NEW.ndbc_numero, NEW.cuba_cod);
  END
END
^

/* Trigger: NOTAS_DEBITO_AU */
CREATE 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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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
^

/* Trigger: NOTAS_DEBITO_BI */
CREATE TRIGGER NOTAS_DEBITO_BI FOR NOTAS_DEBITO
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 = 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
^

/* Trigger: NOTAS_DEBITO_CLIENTES_AD */
CREATE 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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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
^

/* Trigger: NOTAS_DEBITO_CLIENTES_AI */
CREATE 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 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_RCREE, 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_extra, NEW.NDCL_RTFTEMONTO, NEW.NDCL_RTIVAMONTO, NEW.NDCL_RTICAMONTO, NEW.ndcl_rtcreem, 'S', 'N', NEW.pref_pre, NEW.ndcl_numero, NEW.ndcl_sucursal, NEW.cobr_cod, NEW.ndcl_trm);
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (41, NEW.NDCL_ID, NEW.ndcl_fecha, NEW.terc_nit, NEW.ndcl_rtftemonto, NEW.ndcl_rtivamonto, NEW.ndcl_rticamonto, NEW.ndcl_rtcreem, 0, 0, 0, 0, 0, 'S', NEW.ndcl_monto+NEW.ndcl_ivamonto+new.ndcl_extra, 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
^

/* Trigger: NOTAS_DEBITO_CLIENTES_AU */
CREATE 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
        begin
        delete from comprobante_detalle where enco_consec = :consec;
        delete from comprobante_detalle_niif where enco_consec = :consec;
        end
    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

if ((new.ndcl_enviado = old.ndcl_enviado) or (new.ndcl_enviado is null)) then
    BEGIN
    /* 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 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_RCREE, 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_extra, NEW.NDCL_RTFTEMONTO, NEW.NDCL_RTIVAMONTO, NEW.NDCL_RTICAMONTO, NEW.ndcl_rtcreem, 'S', 'N', NEW.pref_pre, NEW.ndcl_numero, NEW.ndcl_sucursal, NEW.cobr_cod, NEW.ndcl_trm);
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (41, NEW.NDCL_ID, NEW.ndcl_fecha, NEW.terc_nit, NEW.ndcl_rtftemonto, NEW.ndcl_rtivamonto, NEW.ndcl_rticamonto, NEW.ndcl_rtcreem, 0, 0, 0, 0, 0, 'S', NEW.ndcl_monto+NEW.ndcl_ivamonto+new.ndcl_extra, 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
ELSE
    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
^

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

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

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

/* Trigger: NOTAS_DEBITO_CLIENTES_BU */
CREATE TRIGGER NOTAS_DEBITO_CLIENTES_BU FOR NOTAS_DEBITO_CLIENTES
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if ((new.ndcl_enviado = 'S') and (old.ndcl_enviado = 'N')) then
    new.ndcl_usrenvio = user;
end
^

/* Trigger: NOTAS_DEBITO_PROVEEDOR_AD */
CREATE TRIGGER NOTAS_DEBITO_PROVEEDOR_AD FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ABONOS integer;
declare variable consec INTEGER;
declare variable CANTOT NUMERIC(18,4);
declare variable CODART VARCHAR(20);
declare variable PROPORC NUMERIC(18,2);
declare variable COSTOT NUMERIC(18,2);
declare variable FACTOR double precision;
declare variable IDMOV INTEGER;
declare variable FECMOV DATE;
declare variable COSTO NUMERIC(18,2);
declare variable CONC varchar(60);
declare variable posconc smallint;
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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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);
        if ((old.ndpr_facid is not null) and (old.ndpr_facid <> 0)) then
            begin
            /* deshaga cambios en registro de la factura de compra */
            if ((old.arti_cod is not null) and (old.arti_cod <> '')) then
                begin
                select sum(mvar_cant), sum(mvar_cant * mvar_costo) from movimiento_articulo
                    where arti_cod = old.arti_cod and mvar_tipodoc = 21 and mvar_idref = old.ndpr_facid into :cantot, :costo;
                if (cantot <> 0) then
                    BEGIN
                    COSTO = (cantot * COSTO - (OLD.ndpr_monto+OLD.ndpr_adicional)) / :cantot;

                    for select mvar_cons, MVAR_FECHA, MVAR_CONC from movimiento_articulo
                        where arti_cod = old.arti_cod and mvar_tipodoc = 21 and mvar_idref = old.ndpr_facid AND MVAR_CANT <> 0
                        INTO :IDMOV, :FECMOV, :CONC
                        DO
                        begin
                        POSCONC = POSITION('-DTO' IN :CONC);
                        if ((OLD.ndpr_tipocosto = 'C') or (OLD.ndpr_tipocosto = 'A'))  then
                            BEGIN
                            if (POSCONC > 0) then
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = LEFT(MVAR_CONC, STRLEN(MVAR_CONC)-15)
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            ELSE
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            EXECUTE PROCEDURE chequeo_costos(OLD.arti_cod, :FECMOV);
                            END
                        if ((OLD.ndpr_tipocosto = 'N') or (OLD.ndpr_tipocosto = 'A'))  then
                            BEGIN
                            if (POSCONC > 0) then
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = LEFT(MVAR_CONC, STRLEN(MVAR_CONC)-15)
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            ELSE
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            EXECUTE PROCEDURE chequeo_costos_niif(OLD.arti_cod, :FECMOV);
                            END
                        end
                    END
                end
            ELSE
                BEGIN
                select sum(mvar_cant * mvar_costo) from movimiento_articulo
                    where mvar_tipodoc = 21 and mvar_idref = old.ndpr_facid into :costot;

                for select mvar_cons, ARTI_COD, MVAR_FECHA, mvar_cant, mvar_costo, mvar_conc from movimiento_articulo
                    where mvar_tipodoc = 21 and mvar_idref = old.ndpr_facid AND MVAR_CANT <> 0
                    INTO :IDMOV, :CODART, :FECMOV, :cantot, :costo, :conc
                    DO
                    BEGIN
                    FACTOR = CAST((cantot * COSTO) AS DOUBLE PRECISION) / CAST(costot AS DOUBLE PRECISION);
                    proporc = (OLD.ndpr_monto+OLD.ndpr_adicional) * FACTOR;
                    COSTO = ((cantot * COSTO) - :proporc) / cantot;
                    
                    POSCONC = POSITION('-DTO' IN :CONC);
                    if ((OLD.ndpr_tipocosto = 'C') or (OLD.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (POSCONC > 0) then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = LEFT(MVAR_CONC, STRLEN(MVAR_CONC)-15)
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos(:codart, :FECMOV);
                        END
                    if ((OLD.ndpr_tipocosto = 'N') or (OLD.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (POSCONC > 0) then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = LEFT(MVAR_CONC, STRLEN(MVAR_CONC)-15)
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos_niif(:codart, :FECMOV);
                        END
                    END
                END
            end
        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
^

/* Trigger: NOTAS_DEBITO_PROVEEDOR_AI */
CREATE TRIGGER NOTAS_DEBITO_PROVEEDOR_AI FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
AS
declare variable COSTO NUMERIC(18,2);
declare variable COSTON NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
declare variable TOTFAC NUMERIC(18,2);
declare variable ITEM INTEGER;
declare variable CODART VARCHAR(20);
declare variable TOTITE NUMERIC(18,2);
declare variable PROPORC NUMERIC(18,2);
declare variable FACTOR double precision;
declare variable exis char(1);
declare variable LOTE varchar(15);
declare variable CANTOT NUMERIC(18,4);
declare variable IDMOV INTEGER;
declare variable FECMOV DATE;
declare variable CONC VARCHAR(60);
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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, 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, NEW.ndpr_rtcreem, 0, 0, 0, 0, 0, 'S', NEW.ndpr_monto+NEW.ndpr_adicional+NEW.ndpr_ivamonto+NEW.ndpr_extra, 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_RCREE, 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_adicional+NEW.ndpr_ivamonto+NEW.ndpr_extra, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, NEW.ndpr_rtcreem, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    /* afecte el articulo */
    if (new.arti_cod <> '') then
        begin
        if (new.ndpr_facid is not null) then
            begin
            /* edite el registro en el kardex de ese articulo para esa factura */
            totite = 0;
            select sum(mvar_cant), sum(mvar_cant * mvar_costo) from movimiento_articulo
                where arti_cod = new.arti_cod and mvar_tipodoc = 21 and mvar_idref = new.ndpr_facid
                into :cantot, :totite;
            if (CANTOT > 0) then
                begin
                COSTO = (TOTITE + NEW.ndpr_monto+NEW.ndpr_adicional) / CANTOT;
                for select mvar_cons, MVAR_FECHA, MVAR_CONC from movimiento_articulo
                    where arti_cod = new.arti_cod and mvar_tipodoc = 21 and mvar_idref = new.ndpr_facid INTO :IDMOV, :FECMOV, :CONC
                    DO
                    BEGIN
                    if ((NEW.ndpr_tipocosto = 'C') or (NEW.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '+CXP ' || NEW.pref_pre || NEW.ndpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, :FECMOV);
                        END
                    if ((NEW.ndpr_tipocosto = 'N') or (NEW.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '+CXP ' || NEW.pref_pre || NEW.ndpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        EXECUTE PROCEDURE chequeo_costos_niif(NEW.arti_cod, :FECMOV);
                        END
                    END
                end
            end
        else
            begin
            /* se aplica al inventario completo */
            execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
            execute procedure costo_promedio_niif (:codart, new.ndpr_fecha) returning_values (:COSTON);
            execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
            if ((NEW.ndpr_tipocosto = 'C') or (NEW.ndpr_tipocosto = 'A'))  then
                COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto+NEW.NDPR_ADICIONAL)) / EXISTENCIA;
            if ((NEW.ndpr_tipocosto = 'N') or (NEW.ndpr_tipocosto = 'A'))  then
                COSTON = (COSTON * EXISTENCIA + (NEW.ndpr_monto+NEW.NDPR_ADICIONAL)) / EXISTENCIA;
            select arti_exist from articulo where arti_cod = new.arti_cod into :exis;
            if (exis = 'B') then
                begin
                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_COSTONIIF, 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, 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 AND MVAR_ENTRADA = 'N'
                    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_COSTONIIF, 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, :COSTON, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                    END
                END
            else if (exis = 'L') then
                begin
                FOR SELECT L.lote_nro, l.bode_cod FROM LOTES L WHERE ARTI_COD = new.arti_cod
                    INTO :LOTE, :codbod
                    do
                    begin
                    execute procedure saldo_lote_fecha(new.arti_cod, :codbod,  :lote,  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_COSTONIIF, 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, 0, 'N', :lote, new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                        END
                    END
                FOR SELECT DISTINCT BODE_COD, MVAR_CANT, MVAR_LOTE FROM MOVIMIENTO_ARTICULO
                    WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id and MVAR_ENTRADA = 'N'
                    INTO :CODBOD, :existencia, :LOTE 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_COSTONIIF, 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, :COSTON, 'S', :LOTE, new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                    END
                end
            end
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    else
        begin
        /* afecte la factura */
        if (new.ndpr_facid is not null) then
            begin
            select sum(mvar_cant * mvar_costo) from movimiento_articulo
                where mvar_tipodoc = 21 and mvar_idref = new.ndpr_facid into :totfac;
            if (TOTFAC IS NULL) then
                TOTFAC = 0;
            if (TOTFAC <> 0) then
              for select mvar_item, arti_cod, mvar_cant * mvar_costo, mvar_cant
                from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = new.ndpr_facid
                INTO :item, :codart, :totite, :cantot
                DO
                BEGIN
                FACTOR = CAST(totite AS DOUBLE PRECISION) / CAST(totfac AS DOUBLE PRECISION);
                proporc = (NEW.ndpr_monto+NEW.NDPR_ADICIONAL) * FACTOR;
                /* CALCULE EL NUEVO COSTO */
                COSTO = (TOTITE + :proporc) / CANTOT;
                for select mvar_cons, MVAR_FECHA from movimiento_articulo
                    where arti_cod = :codart and mvar_tipodoc = 21 and mvar_idref = new.ndpr_facid and mvar_item = :item
                    INTO :IDMOV, :FECMOV
                    DO
                    BEGIN
                    if ((NEW.ndpr_tipocosto = 'C') or (NEW.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '+CXP ' || NEW.pref_pre || NEW.ndpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos(:codart, :FECMOV);
                        END
                    if ((NEW.ndpr_tipocosto = 'N') or (NEW.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '+CXP ' || NEW.pref_pre || NEW.ndpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos_niif(:codart, :FECMOV);
                        END
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(:codart, new.ndpr_fecha);
                END
            end
        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
^

/* Trigger: NOTAS_DEBITO_PROVEEDOR_AU */
CREATE 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 COSTON NUMERIC(18,2);
declare variable EXISTENCIA NUMERIC(18,4);
declare variable CODBOD VARCHAR(3);
declare variable TOTFAC NUMERIC(18,2);
declare variable ITEM INTEGER;
declare variable CODART VARCHAR(20);
declare variable TOTITE NUMERIC(18,2);
declare variable PROPORC NUMERIC(18,2);
declare variable exis char(1);
declare variable LOTE varchar(15);
declare variable CANTOT NUMERIC(18,4);
declare variable COSTOT NUMERIC(18,2);
declare variable FACTOR double precision;
declare variable IDMOV INTEGER;
declare variable FECMOV DATE;
declare variable CONC varchar(60);
declare variable POSCONC SMALLINT;
BEGIN
if (new.ndpr_anulado = 'S') then
    begin
    ABONOS = 'N';
    select 'S' FROM gastos_importacion WHERE gain_idgto = old.ndpr_id and gain_anulado = 'N' INTO :ABONOS;
    if (ABONOS = 'S') then
        exception nota_ya_existe 'Existe un gasto de importacion asociado a este cargo. Anule el gasto por el modulo de importaciones.';

    select enco_consec from comprobante_encabezado where enco_tiporef = 51 and enco_idref = old.ndpr_id into :consec;
    if (NOT consec is null) then
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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);
        if ((old.ndpr_facid is not null) and (old.ndpr_facid <> 0)) then
            begin
            /* deshaga cambios en registro de la factura de compra */
            if ((old.arti_cod is not null) and (old.arti_cod <> '')) then
                begin
                select sum(mvar_cant), sum(mvar_cant * mvar_costo) from movimiento_articulo
                    where arti_cod = old.arti_cod and mvar_tipodoc = 21 and mvar_idref = old.ndpr_facid into :cantot, :costo;
                if (cantot <> 0) then
                    BEGIN
                    COSTO = (cantot * COSTO - (OLD.ndpr_monto+OLD.ndpr_adicional)) / :cantot;

                    for select mvar_cons, MVAR_FECHA, mvar_conc from movimiento_articulo
                        where arti_cod = old.arti_cod and mvar_tipodoc = 21 and mvar_idref = old.ndpr_facid AND MVAR_CANT <> 0
                        INTO :IDMOV, :FECMOV, :conc
                        DO
                        begin
                        POSCONC = POSITION('+CXP' IN :CONC);
                        if ((OLD.ndpr_tipocosto = 'C') or (OLD.ndpr_tipocosto = 'A'))  then
                            BEGIN
                            POSCONC = POSITION('+CXP' IN :CONC);
                            if (POSCONC > 0) then
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = LEFT(MVAR_CONC, STRLEN(MVAR_CONC)-15)
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            else
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            EXECUTE PROCEDURE chequeo_costos(OLD.arti_cod, :FECMOV);
                            END
                        if ((OLD.ndpr_tipocosto = 'N') or (OLD.ndpr_tipocosto = 'A'))  then
                            BEGIN
                            if (POSCONC > 0) then
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = LEFT(MVAR_CONC, STRLEN(MVAR_CONC)-15)
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            else
                                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                    WHERE MVAR_CONS = :IDMOV AND ARTI_COD = OLD.arti_cod;
                            EXECUTE PROCEDURE chequeo_costos_niif(OLD.arti_cod, :FECMOV);
                            END
                        end
                    END
                end
            ELSE
                BEGIN
                select sum(mvar_cant * mvar_costo) from movimiento_articulo
                    where mvar_tipodoc = 21 and mvar_idref = old.ndpr_facid into :costot;

                for select mvar_cons, ARTI_COD, MVAR_FECHA, mvar_cant, mvar_costo, mvar_conc from movimiento_articulo
                    where mvar_tipodoc = 21 and mvar_idref = old.ndpr_facid AND MVAR_CANT <> 0
                    INTO :IDMOV, :CODART, :FECMOV, :cantot, :costo, :conc
                    DO
                    BEGIN
                    FACTOR = CAST((cantot * COSTO) AS DOUBLE PRECISION) / CAST(costot AS DOUBLE PRECISION);
                    proporc = (OLD.ndpr_monto+OLD.NDPR_ADICIONAL) * FACTOR;
                    COSTO = ((cantot * COSTO) - :proporc) / cantot;
                    
                    POSCONC = POSITION('+CXP' IN :CONC);
                    if ((OLD.ndpr_tipocosto = 'C') or (OLD.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (POSCONC > 0) then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = LEFT(MVAR_CONC, STRLEN(MVAR_CONC)-15)
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos(:codart, :FECMOV);
                        END
                    if ((OLD.ndpr_tipocosto = 'N') or (OLD.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (POSCONC > 0) then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = LEFT(MVAR_CONC, STRLEN(MVAR_CONC)-15)
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos_niif(:codart, :FECMOV);
                        END
                    END
                END
            end
        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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, 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, NEW.ndpr_rtcreem, 0, 0, 0, 0, 0, 'N', NEW.ndpr_monto+NEW.ndpr_ivamonto+NEW.ndpr_adicional+NEW.ndpr_extra, 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_RCREE, 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_adicional+NEW.ndpr_extra, NEW.NDPR_RTFTEMONTO, NEW.NDPR_RTIVAMONTO, NEW.NDPR_RTICAMONTO, NEW.ndpr_rtcreem, 'S', 'N', NEW.pref_pre, NEW.ndpr_numero, NEW.ndpr_trm);
    if (new.arti_cod <> '') then
        begin
        if (new.ndpr_facid is not null) then
            begin
            /* edite el registro en el kardex de ese articulo para esa factura */
            totite = 0;
            select sum(mvar_cant), sum(mvar_cant * mvar_costo) from movimiento_articulo
                where arti_cod = new.arti_cod and mvar_tipodoc = 21 and mvar_idref = new.ndpr_facid
                into :cantot, :totite;
            if (CANTOT > 0) then
                begin
                COSTO = (TOTITE + NEW.ndpr_monto+NEW.ndpr_adicional) / CANTOT;
                for select mvar_cons, MVAR_FECHA, MVAR_CONC from movimiento_articulo
                    where arti_cod = new.arti_cod and mvar_tipodoc = 21 and mvar_idref = new.ndpr_facid INTO :IDMOV, :FECMOV, :CONC
                    DO
                    BEGIN
                    if ((NEW.ndpr_tipocosto = 'C') or (NEW.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '+CXP ' || NEW.pref_pre || NEW.ndpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, :FECMOV);
                        END
                    if ((NEW.ndpr_tipocosto = 'N') or (NEW.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '+CXP ' || NEW.pref_pre || NEW.ndpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = NEW.arti_cod;
                        EXECUTE PROCEDURE chequeo_costos_niif(NEW.arti_cod, :FECMOV);
                        END
                    END
                end
            end
        else
            begin
            /* se aplica al inventario completo */
            execute procedure saldo_total_inventario (new.arti_cod, new.ndpr_fecha) returning_values (:EXISTENCIA);
            execute procedure costo_promedio (new.arti_cod, new.ndpr_fecha) returning_values (:COSTO);
            execute procedure costo_promedio_niif (new.arti_cod, new.ndpr_fecha) returning_values (:COSTON);
            if ((NEW.ndpr_tipocosto = 'C') or (NEW.ndpr_tipocosto = 'A'))  then
                COSTO = (COSTO * EXISTENCIA + (NEW.ndpr_monto+NEW.NDPR_ADICIONAL)) / EXISTENCIA;
            if ((NEW.ndpr_tipocosto = 'N') or (NEW.ndpr_tipocosto = 'A'))  then
                COSTON = (COSTON * EXISTENCIA + (NEW.ndpr_monto+NEW.NDPR_ADICIONAL)) / EXISTENCIA;
            select arti_exist from articulo where arti_cod = new.arti_cod into :exis;
            if (exis = 'B') then
                begin
                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_COSTONIIF, 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, 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 AND MVAR_ENTRADA = 'N'
                    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_COSTONIIF, 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, :COSTON, 'S', '', new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                    END
                END
            else if (exis = 'L') then
                begin
                FOR SELECT L.lote_nro, l.bode_cod FROM LOTES L WHERE ARTI_COD = new.arti_cod
                    INTO :LOTE, :codbod
                    do
                    begin
                    execute procedure saldo_lote_fecha(new.arti_cod, :codbod,  :lote,  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_COSTONIIF, 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, 0, 'N', :lote, new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                        END
                    END
                FOR SELECT DISTINCT BODE_COD, MVAR_CANT, MVAR_LOTE FROM MOVIMIENTO_ARTICULO
                    WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id and MVAR_ENTRADA = 'N'
                    INTO :CODBOD, :existencia, :LOTE 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_COSTONIIF, 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, :COSTON, 'S', :LOTE, new.pref_pre, new.ndpr_numero, 1, new.terc_nit);
                    END
                end
            end
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, new.ndpr_fecha);
        end
    else
        begin
        /* afecte la factura */
        if (new.ndpr_facid is not null) then
            begin
            select sum(mvar_cant * mvar_costo) from movimiento_articulo
                where mvar_tipodoc = 21 and mvar_idref = new.ndpr_facid into :totfac;
            if (TOTFAC IS NULL) then
                TOTFAC = 0;
            if (TOTFAC <> 0) then
              for select mvar_item, arti_cod, mvar_cant * mvar_costo, mvar_cant
                from movimiento_articulo where mvar_tipodoc = 21 and mvar_idref = new.ndpr_facid
                INTO :item, :codart, :totite, :cantot
                DO
                BEGIN
                FACTOR = CAST(totite AS DOUBLE PRECISION) / CAST(totfac AS DOUBLE PRECISION);
                proporc = (NEW.ndpr_monto+NEW.NDPR_ADICIONAL) * FACTOR;
                /* CALCULE EL NUEVO COSTO */
                COSTO = (TOTITE + :proporc) / CANTOT;
                for select mvar_cons, MVAR_FECHA, mvar_conc from movimiento_articulo
                    where arti_cod = :codart and mvar_tipodoc = 21 and mvar_idref = new.ndpr_facid and mvar_item = :item
                    INTO :IDMOV, :FECMOV, :CONC
                    DO
                    BEGIN
                    if ((NEW.ndpr_tipocosto = 'C') or (NEW.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '+CXP ' || NEW.pref_pre || NEW.ndpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos(:codart, :FECMOV);
                        END
                    if ((NEW.ndpr_tipocosto = 'N') or (NEW.ndpr_tipocosto = 'A'))  then
                        BEGIN
                        if (LEFT(CONC, 21) = 'FACTURA DE COMPRA No.') then
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo, MVAR_CONC = 'FC ' || RIGHT(MVAR_CONC, strlen(MVAR_CONC)-22) || '+CXP ' || NEW.pref_pre || NEW.ndpr_numero
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        else
                            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costo
                                WHERE MVAR_CONS = :IDMOV AND ARTI_COD = :codart;
                        EXECUTE PROCEDURE chequeo_costos_niif(:codart, :FECMOV);
                        END
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(:codart, new.ndpr_fecha);
                END
            end
        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
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.ndpr_anulado <> NEW.ndpr_anulado) then
    BEGIN
    UPDATE nota_debito_prov_det SET NDPD_ANULADO = NEW.ndpr_anulado WHERE NDPR_ID = NEW.ndpr_id;
    END
if ((OLD.ndpr_transmit <> NEW.ndpr_transmit)) then
    BEGIN
    UPDATE nota_debito_prov_det SET NDPD_TRANSMIT = NEW.ndpr_transmit WHERE NDPR_ID = NEW.ndpr_id;
    END
END
^

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

/* Trigger: NOTAS_DOCUMENTO_AI */
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
^

/* Trigger: NOTAS_ESTADOS_FINANCIEROS_BI */
CREATE TRIGGER NOTAS_ESTADOS_FINANCIEROS_BI FOR NOTAS_ESTADOS_FINANCIEROS
ACTIVE BEFORE INSERT POSITION 0
as
begin
new.noef_id = gen_id(id_notasestados, 1);

if (EXISTS (SELECT NOEF_ID FROM notas_estados_financieros WHERE NOEF_ANO = NEW.noef_ano AND NOEF_PERIODO = NEW.noef_periodo AND NOEF_NUMERO = NEW.noef_numero)) then
    exception nota_ya_existe;
end
^

/* Trigger: NOTA_CREDITO_PROV_DET_AD */
CREATE TRIGGER NOTA_CREDITO_PROV_DET_AD FOR NOTA_CREDITO_PROV_DET
ACTIVE AFTER DELETE POSITION 0
as
begin
delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id) AND MVAR_ITEM = OLD.ncpd_item;
end
^

/* Trigger: NOTA_CREDITO_PROV_DET_AI */
CREATE TRIGGER NOTA_CREDITO_PROV_DET_AI FOR NOTA_CREDITO_PROV_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable totalfac numeric(18,2);
declare variable fecha date;
declare variable costo numeric(18,2);
declare variable coston numeric(18,2);
declare variable existencia numeric(18,4);
declare variable PROPORC NUMERIC(18,2);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR double precision;
declare variable conc varchar(60);
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable NIT VARCHAR(20);
declare variable CODBOD VARCHAR(2);
declare variable TIPOCOSTO CHAR(1);
begin
if (new.ncpd_total <> 0) then
    begin
    select nd.pref_pre, nd.ncpr_numero, nd.terc_nit, nd.ncpr_totaldet, nd.ncpr_fecha, nd.ncpr_conc, nd.ncpr_tipocosto, nd.ncpr_monto
        from notas_credito_proveedor nd where nd.ncpr_id = new.ncpr_id
        into :pref, :numero, :nit, :totalfac, :fecha, :conc, :tipocosto, :monto;
    FACTOR = CAST(new.ncpd_total AS DOUBLE PRECISION) / CAST(totalfac AS DOUBLE PRECISION);
    proporc = :monto * FACTOR;
    /* CALCULE EL NUEVO COSTO */
    execute procedure costo_promedio (new.acti_cod, :fecha) returning_values (:COSTO);
    execute procedure costo_promedio_niif (new.acti_cod, :fecha) returning_values (:COSTON);
    execute procedure saldo_total_inventario (new.acti_cod, :fecha) returning_values (:EXISTENCIA);
    if (EXISTENCIA <> 0) then
        BEGIN
        if ((:tipocosto = 'C') or (:tipocosto = 'A'))  then
            COSTO = (COSTO * EXISTENCIA - (:proporc)) / EXISTENCIA;
        if ((:tipocosto = 'N') or (:tipocosto = 'A'))  then
            COSTON = (COSTON * EXISTENCIA - (:proporc)) / EXISTENCIA;
        END
    FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = new.acti_cod INTO :CODBOD do
        BEGIN
        execute procedure saldo_inventario (new.acti_cod, :CODBOD, :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_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(new.acti_cod, :CODBOD, :fecha, 52, NEW.ncpr_id,
              :conc, :EXISTENCIA, 0, 0, 'N', '', :pref, :numero, NEW.ncpd_item, :nit);
            END
        END
    FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO
        WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id and MVAR_ITEM = new.ncpd_item
        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_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(new.acti_cod, :CODBOD, :fecha, 52, NEW.ncpr_id,
          :conc, :EXISTENCIA, :COSTO, :COSTON, 'S', '', :pref, :numero, new.ncpd_item, :nit);
        END
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(new.acti_cod, :fecha);
    END
end
^

/* Trigger: NOTA_CREDITO_PROV_DET_AU */
CREATE TRIGGER NOTA_CREDITO_PROV_DET_AU FOR NOTA_CREDITO_PROV_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable totalfac numeric(18,2);
declare variable fecha date;
declare variable costo numeric(18,2);
declare variable coston numeric(18,2);
declare variable existencia numeric(18,4);
declare variable PROPORC NUMERIC(18,2);
declare variable FACTOR double precision;
declare variable MONTO NUMERIC(18,2);
declare variable conc varchar(60);
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable NIT VARCHAR(20);
declare variable CODBOD VARCHAR(2);
declare variable TIPOCOSTO CHAR(1);
begin
if (old.ncpd_anulado = 'N') then
    begin
    delete from movimiento_articulo where  (mvar_tipodoc = 52) and (mvar_idref = old.ncpr_id) AND MVAR_ITEM = OLD.ncpd_item;
    end
if ((new.ncpd_total <> 0) and (new.ncpd_anulado = 'N')) then
    begin
    select nd.pref_pre, nd.ncpr_numero, nd.terc_nit, nd.ncpr_totaldet, nd.ncpr_fecha, nd.ncpr_conc, nd.ncpr_tipocosto, nd.ncpr_monto
        from notas_credito_proveedor nd where nd.ncpr_id = new.ncpr_id
        into :pref, :numero, :nit, :totalfac, :fecha, :conc, :tipocosto, :monto;
    FACTOR = CAST(new.ncpd_total AS DOUBLE PRECISION) / CAST(totalfac AS DOUBLE PRECISION);
    proporc = :monto * FACTOR;
    /* CALCULE EL NUEVO COSTO */
    execute procedure costo_promedio (new.acti_cod, :fecha) returning_values (:COSTO);
    execute procedure costo_promedio_niif (new.acti_cod, :fecha) returning_values (:COSTON);
    execute procedure saldo_total_inventario (new.acti_cod, :fecha) returning_values (:EXISTENCIA);
    if (EXISTENCIA <> 0) then
        BEGIN
        if ((:tipocosto = 'C') or (:tipocosto = 'A'))  then
            COSTO = (COSTO * EXISTENCIA - (:proporc)) / EXISTENCIA;
        if ((:tipocosto = 'N') or (:tipocosto = 'A'))  then
            COSTON = (COSTON * EXISTENCIA - (:proporc)) / EXISTENCIA;
        END
    FOR SELECT DISTINCT BODE_COD FROM EXISTENCIA WHERE ARTI_COD = new.acti_cod INTO :CODBOD do
        BEGIN
        execute procedure saldo_inventario (new.acti_cod, :CODBOD, :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_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(new.acti_cod, :CODBOD, :fecha, 52, NEW.ncpr_id,
              :conc, :EXISTENCIA, 0, 0, 'N', '', :pref, :numero, NEW.ncpd_item, :nit);
            END
        END
    FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO
        WHERE MVAR_TIPODOC = 52 AND MVAR_IDREF = NEW.ncpr_id and MVAR_ITEM = new.ncpd_item
        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_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(new.acti_cod, :CODBOD, :fecha, 52, NEW.ncpr_id,
          :conc, :EXISTENCIA, :COSTO, :COSTON, 'S', '', :pref, :numero, new.ncpd_item, :nit);
        END
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(new.acti_cod, :fecha);
    END
end
^

/* Trigger: NOTA_DEBITO_PROV_DET_AD */
CREATE TRIGGER NOTA_DEBITO_PROV_DET_AD FOR NOTA_DEBITO_PROV_DET
ACTIVE AFTER DELETE POSITION 0
as
begin
if (old.ndpd_anulado = 'N') then
    begin
    delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id) AND MVAR_ITEM = OLD.ndpd_item;
    end
end
^

/* Trigger: NOTA_DEBITO_PROV_DET_AI */
CREATE TRIGGER NOTA_DEBITO_PROV_DET_AI FOR NOTA_DEBITO_PROV_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable totalfac numeric(18,2);
declare variable fecha date;
declare variable costo numeric(18,2);
declare variable coston numeric(18,2);
declare variable existencia numeric(18,4);
declare variable PROPORC NUMERIC(18,2);
declare variable FACTOR double precision;
declare variable conc varchar(60);
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable NIT VARCHAR(20);
declare variable CODBOD VARCHAR(2);
declare variable TIPOCOSTO CHAR(1);
begin
if (new.ndpd_total <> 0) then
    begin
    select nd.pref_pre, nd.ndpr_numero, nd.terc_nit, nd.ndpr_monto, nd.ndpr_fecha, nd.ndpr_conc, nd.ndpr_tipocosto
        from notas_debito_proveedor nd where nd.ndpr_id = new.ndpr_id
        into :pref, :numero, :nit, :totalfac, :fecha, :conc, :tipocosto;
    FACTOR = CAST(new.ndpd_total AS DOUBLE PRECISION) / CAST(totalfac AS DOUBLE PRECISION);
    proporc = NEW.ndpd_total * FACTOR;
    /* CALCULE EL NUEVO COSTO */
    execute procedure costo_promedio (new.arti_cod, :fecha) returning_values (:COSTO);
    execute procedure costo_promedio_niif (new.arti_cod, :fecha) returning_values (:COSTON);
    execute procedure saldo_total_inventario (new.arti_cod, :fecha) returning_values (:EXISTENCIA);
    if (EXISTENCIA <> 0) then
        begin
        if ((:tipocosto = 'C') or (:tipocosto = 'A'))  then
            COSTO = (COSTO * EXISTENCIA + (:proporc)) / EXISTENCIA;
        if ((:tipocosto = 'N') or (:tipocosto = 'A'))  then
            COSTON = (COSTON * EXISTENCIA + (:proporc)) / EXISTENCIA;
        end
    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, :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_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(new.arti_cod, :CODBOD, :fecha, 51, NEW.ndpr_id,
              :conc, :EXISTENCIA, 0, 0, 'N', '', :pref, :numero, NEW.ndpd_item, :nit);
            END
        END
    FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO
        WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id and MVAR_ITEM = new.ndpd_item
        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_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(new.arti_cod, :CODBOD, :fecha, 51, NEW.ndpr_id,
          :conc, :EXISTENCIA, :COSTO, :COSTON, 'S', '', :pref, :numero, new.ndpd_item, :nit);
        END
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(new.arti_cod, :fecha);
    END
end
^

/* Trigger: NOTA_DEBITO_PROV_DET_AU */
CREATE TRIGGER NOTA_DEBITO_PROV_DET_AU FOR NOTA_DEBITO_PROV_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable totalfac numeric(18,2);
declare variable fecha date;
declare variable costo numeric(18,2);
declare variable coston numeric(18,2);
declare variable existencia numeric(18,4);
declare variable PROPORC NUMERIC(18,2);
declare variable FACTOR double precision;
declare variable conc varchar(60);
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable NIT VARCHAR(20);
declare variable CODBOD VARCHAR(2);
declare variable TIPOCOSTO CHAR(1);
begin
if (old.ndpd_anulado = 'N') then
    begin
    delete from movimiento_articulo where  (mvar_tipodoc = 51) and (mvar_idref = old.ndpr_id) AND MVAR_ITEM = OLD.ndpd_item;
    end
if (new.ndpd_total <> 0) then
    begin
    select nd.pref_pre, nd.ndpr_numero, nd.terc_nit, nd.ndpr_monto, nd.ndpr_fecha, nd.ndpr_conc, nd.ndpr_tipocosto
        from notas_debito_proveedor nd where nd.ndpr_id = new.ndpr_id
        into :pref, :numero, :nit, :totalfac, :fecha, :conc, :tipocosto;
    FACTOR = CAST(new.ndpd_total AS DOUBLE PRECISION) / CAST(totalfac AS DOUBLE PRECISION);
    proporc = NEW.ndpd_total * FACTOR;
    /* CALCULE EL NUEVO COSTO */
    execute procedure costo_promedio (new.arti_cod, :fecha) returning_values (:COSTO);
    execute procedure costo_promedio_niif (new.arti_cod, :fecha) returning_values (:COSTON);
    execute procedure saldo_total_inventario (new.arti_cod, :fecha) returning_values (:EXISTENCIA);
    if (EXISTENCIA <> 0) then
        begin
        if ((:tipocosto = 'C') or (:tipocosto = 'A'))  then
            COSTO = (COSTO * EXISTENCIA + (:proporc)) / EXISTENCIA;
        if ((:tipocosto = 'N') or (:tipocosto = 'A'))  then
            COSTON = (COSTON * EXISTENCIA + (:proporc)) / EXISTENCIA;
        end
    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, :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_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
              VALUES(new.arti_cod, :CODBOD, :fecha, 51, NEW.ndpr_id,
              :conc, :EXISTENCIA, 0, 0, 'N', '', :pref, :numero, NEW.ndpd_item, :nit);
            END
        END
    FOR SELECT DISTINCT BODE_COD, MVAR_CANT FROM MOVIMIENTO_ARTICULO
        WHERE MVAR_TIPODOC = 51 AND MVAR_IDREF = NEW.ndpr_id and MVAR_ITEM = new.ndpd_item
        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_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(new.arti_cod, :CODBOD, :fecha, 51, NEW.ndpr_id,
          :conc, :EXISTENCIA, :COSTO, :COSTON, 'S', '', :pref, :numero, new.ndpd_item, :nit);
        END
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(new.arti_cod, :fecha);
    END
end
^

/* Trigger: ORDENES_COMPRA_AD */
CREATE TRIGGER ORDENES_COMPRA_AD FOR ORDENES_COMPRA
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 23, OLD.ordc_id, 'D', OLD.pref_pre || OLD.ordc_numero);
end
^

/* Trigger: ORDENES_COMPRA_AI */
CREATE TRIGGER ORDENES_COMPRA_AI FOR ORDENES_COMPRA
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.ORDC_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 23, NEW.ordc_id, 'I', NEW.pref_pre || NEW.ordc_numero);
end
^

/* Trigger: ORDENES_COMPRA_AU */
CREATE TRIGGER ORDENES_COMPRA_AU FOR ORDENES_COMPRA
ACTIVE AFTER UPDATE POSITION 0
as
begin
/* ACTUALICE LOS ANULADOS Y TRASMITIDOS */
if (NEW.ordc_anulado <> OLD.ordc_anulado) then
    UPDATE ordenes_compra_detalle SET OCDE_ANULADO = NEW.ordc_anulado WHERE ORDC_ID = NEW.ORDC_ID;
if (NEW.ordc_TRANSMIT <> OLD.ordc_transmit) then
    UPDATE ordenes_compra_detalle SET OCDE_TRANSMIT = NEW.ordc_transmit WHERE ORDC_ID = NEW.ORDC_ID;

/* ACTUALICE LA CONSOLIDACION */
if (new.ordc_anulado = 'S') then
    BEGIN
    INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (23, NEW.ordc_id, 'A', NEW.pref_pre || NEW.ordc_numero);
    END
ELSE
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (23, NEW.ordc_id, 'U', NEW.pref_pre || NEW.ordc_numero);
end
^

/* Trigger: ORDENES_COMPRA_BI */
CREATE TRIGGER ORDENES_COMPRA_BI FOR ORDENES_COMPRA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
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
^

/* Trigger: ORDENES_COMPRA_DETALLE_AD */
CREATE TRIGGER ORDENES_COMPRA_DETALLE_AD FOR ORDENES_COMPRA_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
declare variable CONSOLIDA INTEGER;
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
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
        /* DESHAGA LOS PENDIENTES */
        CANTAUX = old.ocde_cant * old.ocde_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        end
    END
end
^

/* Trigger: ORDENES_COMPRA_DETALLE_AI */
CREATE 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 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);
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
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_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.ocde_cant * new.ocde_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.ordc_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.ordc_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            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 = NEW.ocde_prunit * (1 - (NEW.ocde_dtoporc/100)), PVAR_COD = NEW.ocde_codprov, PVAR_UNIDAD = NEW.ocde_unidad, PVAR_FACTOR = NEW.ocde_factor
            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, PVAR_UNIDAD, PVAR_FACTOR)
            VALUES (:NIT, NEW.ARTI_COD, NEW.ocde_prunit * (1 - (NEW.ocde_dtoporc/100)), :FEC, NEW.ocde_codprov,NEW.ocde_desc, NEW.ocde_unidad, NEW.ocde_factor);
     END
    END
end
^

/* Trigger: ORDENES_COMPRA_DETALLE_AU */
CREATE 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 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);
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
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
        /* DESHAGA LOS PENDIENTES */
        CANTAUX = old.ocde_cant * old.ocde_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        end
    END
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_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.ocde_cant * new.ocde_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.ordc_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.ordc_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            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 = NEW.ocde_prunit * (1 - (NEW.ocde_dtoporc/100)), PVAR_COD = NEW.ocde_codprov, PVAR_UNIDAD = NEW.ocde_unidad, PVAR_FACTOR = NEW.ocde_factor
            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, PVAR_UNIDAD, PVAR_FACTOR)
            VALUES (:NIT, NEW.ARTI_COD, NEW.ocde_prunit * (1 - (NEW.ocde_dtoporc/100)), :FEC, NEW.ocde_codprov,NEW.ocde_desc, NEW.ocde_unidad, NEW.ocde_factor);
     END
    END
end
^

/* Trigger: ORDENES_COMPRA_DETALLE_BI */
CREATE TRIGGER ORDENES_COMPRA_DETALLE_BI FOR ORDENES_COMPRA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable FACTOR NUMERIC(18,4);
BEGIN
  /* CALCULE LO POR LIBERAR */
  EXECUTE PROCEDURE factor_unidad_cant_excep(NEW.ARTI_COD, NEW.ocde_unidad) returning_values (new.ocde_factor);
  NEW.ocde_ordenado = NEW.ocde_cant * new.ocde_factor;
  /* CALCULE EL MONTO DEL DESCUENTO */
  NEW.OCDE_DTOMONTO = NEW.ocde_prunit * NEW.ocde_dtoporc / 100;
END
^

/* Trigger: ORDENES_INVENTARIO_AD */
CREATE TRIGGER ORDENES_INVENTARIO_AD FOR ORDENES_INVENTARIO
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 18, OLD.orin_id, 'D', OLD.pref_pre || OLD.orin_numero);
end
^

/* Trigger: ORDENES_INVENTARIO_AI */
CREATE TRIGGER ORDENES_INVENTARIO_AI FOR ORDENES_INVENTARIO
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.ORIN_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 18, NEW.orin_id, 'I', NEW.pref_pre || NEW.orin_numero);
end
^

/* Trigger: ORDENES_INVENTARIO_AU */
CREATE TRIGGER ORDENES_INVENTARIO_AU FOR ORDENES_INVENTARIO
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (NEW.orin_anulado = 'S') then
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 18, NEW.orin_id, 'A', NEW.pref_pre || NEW.orin_numero);
ELSE
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 18, NEW.orin_id, 'U', NEW.pref_pre || NEW.orin_numero);
end
^

/* Trigger: ORDENES_INVENTARIO_BI */
CREATE TRIGGER ORDENES_INVENTARIO_BI FOR ORDENES_INVENTARIO
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;
  /* 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
^

/* Trigger: ORDENINVENTARIO_DETALLE_BI */
CREATE TRIGGER ORDENINVENTARIO_DETALLE_BI FOR ORDENINVENTARIO_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.orid_unidad) returning_values (FACTOR);
  NEW.orid_entregar = NEW.orid_cant * FACTOR;
END
^

/* Trigger: ORDEN_EMBARQUE_AI */
CREATE TRIGGER ORDEN_EMBARQUE_AI FOR ORDEN_EMBARQUE
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONC VARCHAR(60);
begin
if ((NEW.orem_id <> 0) and (new.orem_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 (132, NEW.orem_id, NEW.orem_fecha, NEW.tran_nit, 0, 0, 0, 0, 0, 0, 0, 'S', NEW.orem_valor);
    /* Registre el movimiento del cliente */
    CONC = 'ORDEN DE IMPORTACION No.' || NEW.slim_id || NEW.orem_id;
    INSERT INTO movimiento_proveedor(MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_MONTOMON, MVPR_TIPOMON , MVPR_IMPORT, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TRAN_NIT, 132, NEW.OREM_ID, NEW.OREM_FECHA, NEW.OREM_VENCE, :CONC, 0, NEW.orem_valormon, NEW.timo_cod, 'S' , 0, 0, 0, 'S', 'N', new.pref_pre, new.orem_numero);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 130, NEW.OREM_id, 'I', NEW.pref_pre || NEW.orem_numero);
    END
end
^

/* Trigger: ORDEN_EMBARQUE_BI */
CREATE TRIGGER ORDEN_EMBARQUE_BI FOR ORDEN_EMBARQUE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable EXISTE CHAR(1);
begin
SELECT 'S' FROM PROVEEDORES P , TERCEROS T WHERE P.TERC_NIT = NEW.tran_nit AND P.terc_nit = T.terc_nit AND T.terc_trans = 'S' AND T.terc_prov = 'S' INTO :EXISTE;
end
^

/* Trigger: PAGO_APORTES_BI */
CREATE TRIGGER PAGO_APORTES_BI FOR PAGO_APORTES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable dig integer;
begin
  /* redondee el valor */
  if (new.pgap_monto <> 0) then
    begin
    execute procedure lee_configuracion('NOMINA', 'PAGOS', 'REDONDEO PARA PAGO DE APORTES') returning_values (:dig);
    execute procedure redondee(new.pgap_monto, :dig) returning_values (new.pgap_monto);
    end
end
^

/* Trigger: PAGO_NOMINA_AD */
CREATE TRIGGER PAGO_NOMINA_AD FOR PAGO_NOMINA
ACTIVE AFTER DELETE POSITION 0
as
declare variable NOMID INTEGER;
begin
if (OLD.pgno_anulado = 'N') then
    BEGIN
    UPDATE pago_nomina_egresos SET PGNE_ANULADO = 'S' WHERE PGNO_ID = OLD.pgno_id;
    UPDATE pago_nomina_det SET PGND_ANULADO = 'S' WHERE PGNO_ID = OLD.pgno_id;
    if (OLD.pgno_idcons <> 0) then
        begin
        for select c.conn_nomid from consolide_nominas c where c.conn_id = OLD.pgno_idcons into :NOMID
            DO
            BEGIN
            UPDATE NOMINA SET NOMI_PAGOOK = 'N' WHERE NOMI_ID = :NOMID;
            END
        end
    END
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 62, OLD.pgno_id, 'D', OLD.pgno_pref || OLD.pgno_numero);
end
^

/* Trigger: PAGO_NOMINA_AI */
CREATE TRIGGER PAGO_NOMINA_AI FOR PAGO_NOMINA
ACTIVE AFTER INSERT POSITION 0
as
declare variable PREFE VARCHAR(4);
declare variable IDEGRE INTEGER;
declare variable NUMERO VARCHAR(8);
declare variable NUMEROBCO VARCHAR(8);
declare variable NOMID INTEGER;
begin
if ((NEW.pgno_id <> 0) AND (NEW.pgno_anulado = 'N')) then
    BEGIN
    /* marque las nominas como pagadas */
    if (new.pgno_idcons <> 0) then
        begin
        for select c.conn_nomid from consolide_nominas c where c.conn_id = new.pgno_idcons into :NOMID
            DO
            BEGIN
            UPDATE NOMINA SET NOMI_PAGOOK = 'S' WHERE NOMI_ID = :NOMID;
            END
        end
    if (new.pgno_global = 'S') Then
        begin
        /* grabe un solo egreso a nombre del tercero del encabezado */
        execute procedure lee_configuracion('NOMINA', 'PAGOS', 'PREFIJO DEL EGRESO PARA PAGOS DE NOMINA') returning_values (:PREFE);
        IDEGRE = GEN_ID(id_egresos, 1);
        SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 AND PREF_PRE = :prefe INTO :NUMERO;
        INSERT INTO EGRESOS (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO,
            EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF, EGRE_OBS, EGRE_TIPOMOVBCO, EGRE_NOMTERC, EGRE_ANULADO,
            EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_USUARIO, NUMOK, CLEG_ID, EGRE_TRM, EGRE_EXCEDENTE, EGRE_RTCREE,
            EGRE_IDINTER)
            VALUES (:idegre, 62, :PREFE, :NUMERO, NEW.pgno_fecha, NEW.pgno_concepto, NEW.pgno_monto, 0,
            0, 0, 0, NULL, NEW.pgno_tipobco, NEW.pgno_nomterc, 'N',
            'N', NEW.pgno_nit, '6', NEW.pgno_caja, USER, 'N', 0, 1, 0, 0, NULL);
        if ((NEW.pgno_banco <> 0) AND (NEW.pgno_prefbco <> '') AND (NEW.pgno_montob <> 0)) then
            BEGIN
            SELECT PB.prba_numero FROM prefijos_bancos PB WHERE PB.tido_cod = NEW.pgno_tipobco AND PB.cuba_cod = NEW.pgno_banco AND PB.prba_pref = NEW.pgno_prefbco
                INTO :NUMEROBCO;
            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 (:idegre, NEW.pgno_tipobco, NEW.pgno_banco, :numerobco, NEW.pgno_fecha, NEW.pgno_prefbco,
                NEW.pgno_nomterc, NEW.pgno_montob, NEW.pgno_concepto, 'N', 'N', 'N');
            end
        if ((NEW.pgno_caja <> 0) AND (NEW.pgno_montoc <> 0)) 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 (:idegre, 1, NEW.pgno_caja, 1, NULL, NULL, NULL, NEW.pgno_fecha, NEW.pgno_montoc, 'N', 'N');
        /* REGISTRE EL DETALLE DE EGRESOS */
        INSERT INTO pago_nomina_egresos (PGNO_ID, PGNE_ITEM, EGRE_ID) VALUES (NEW.pgno_id, 1, :IDEGRE);
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 62, NEW.pgno_id, 'I', NEW.pgno_pref || NEW.pgno_numero);
    end
end
^

/* Trigger: PAGO_NOMINA_AU */
CREATE TRIGGER PAGO_NOMINA_AU FOR PAGO_NOMINA
ACTIVE AFTER UPDATE POSITION 0
as
declare variable NOMID INTEGER;
begin
if (NEW.pgno_anulado <> OLD.pgno_anulado) then
  if (new.pgno_anulado = 'S') then
    BEGIN
    UPDATE pago_nomina_egresos SET PGNE_ANULADO = NEW.pgno_anulado where PGNO_ID = NEW.pgno_id;
    UPDATE pago_nomina_det SET PGND_ANULADO = NEW.pgno_anulado where PGNO_ID = NEW.pgno_id;
    if (NEW.pgno_idcons <> 0) then
        begin
        for select c.conn_nomid from consolide_nominas c where c.conn_id = NEW.pgno_idcons into :NOMID
            DO
            BEGIN
            UPDATE NOMINA SET NOMI_PAGOOK = 'N' WHERE NOMI_ID = :NOMID;
            END
        end

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 62, NEW.pgno_id, 'A', NEW.pgno_pref || NEW.pgno_numero);
    END
  ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 62, NEW.pgno_id, 'U', NEW.pgno_pref || NEW.pgno_numero);
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 62, NEW.pgno_id, 'U', NEW.pgno_pref || NEW.pgno_numero);
end
^

/* Trigger: PAGO_NOMINA_BI */
CREATE TRIGGER PAGO_NOMINA_BI FOR PAGO_NOMINA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
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 = 91 AND PREF_PRE = NEW.pgno_pref INTO :NUMERO, :AUTOM;
/* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
if (AUTOM = 'S') then
    BEGIN
    NEW.pgno_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 91 AND PREF_PRE = NEW.pgno_pref;
    END
ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.pgno_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 91 AND PREF_PRE = NEW.pgno_pref;
    END
EXECUTE PROCEDURE COMPLETA_CEROS (NEW.pgno_numero) returning_values (NEW.pgno_numero);

/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM pago_nomina WHERE PGNO_PREF = NEW.pgno_pref AND PGNO_NUMERO = NEW.pgno_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un pago de nomina con el numero ' || new.pgno_pref || new.pgno_numero;
if (NEW.pgno_montob IS NULL) then
    NEW.pgno_montob = 0;
if (NEW.pgno_montoc IS NULL) then
    NEW.pgno_montoc = 0;
end
^

/* Trigger: PAGO_NOMINA_DET_AD */
CREATE TRIGGER PAGO_NOMINA_DET_AD FOR PAGO_NOMINA_DET
ACTIVE AFTER DELETE POSITION 0
as
declare variable IDCONS INTEGER;
begin
if (OLD.pgnd_anulado = 'N') then
    BEGIN
    UPDATE pago_nomina_egresos SET PGNE_ANULADO = 'S' WHERE PGNO_ID = OLD.pgno_id;
    SELECT PGNO_IDCONS FROM PAGO_NOMINA WHERE PGNO_ID = OLD.pgno_id INTO :IDCONS;
    UPDATE nomina_conceptos nc  SET NC.noco_pagook = 'N'
        WHERE EXISTS (SELECT nomi_id FROM consolide_nominas WHERE CONN_ID = :IDCONS AND CONN_NOMID = NC.nomi_id)
        AND nc.noco_pagook = 'S' AND NC.noco_prov = 'N' AND ((NC.noco_aporte = 'N') or ((NC.noco_aporte = 'S') AND (NC.noco_gtoempr = 'N')))
        AND TERC_NIT = OLD.terc_nit;
    END
end
^

/* Trigger: PAGO_NOMINA_DET_AI */
CREATE TRIGGER PAGO_NOMINA_DET_AI FOR PAGO_NOMINA_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable PAGOGLOBAL CHAR(1);
declare variable PREFE VARCHAR(4);
declare variable IDEGRE INTEGER;
declare variable NUMERO VARCHAR(8);
declare variable BANCO INTEGER;
declare variable CAJA INTEGER;
declare variable FECHA DATE;
declare variable TIPOBCO INTEGER;
declare variable PREFBCO VARCHAR(4);
declare variable CONCEPTO VARCHAR(60);
declare variable NOMTERC VARCHAR(60);
declare variable ITEM INTEGER;
declare variable NUMEROBCO VARCHAR(8);
declare variable NOMINTER VARCHAR(60);
declare variable IDI INTEGER;
declare variable IDCONS INTEGER;
begin
if ((NEW.pgno_id <> 0) AND (NEW.pgnd_anulado = 'N')) then
    BEGIN
    /* GRABE EL EGRESO */
    SELECT P.pgno_global, P.pgno_fecha, P.pgno_caja, P.pgno_banco, P.pgno_tipobco, P.pgno_prefbco, P.pgno_concepto, P.pgno_idcons
        FROM PAGO_NOMINA P WHERE PGNO_ID = NEW.pgno_id
        INTO :PAGOGLOBAL, :FECHA, :CAJA, :BANCO, :TIPOBCO, :PREFBCO, :CONCEPTO, :IDCONS;
    
    if (PAGOGLOBAL = 'N') Then
        begin
        /* grabe un solo egreso a nombre del EMPLEADO */
        execute procedure lee_configuracion('NOMINA', 'PAGOS', 'PREFIJO DEL EGRESO PARA PAGOS DE NOMINA') returning_values (:PREFE);
        IDEGRE = GEN_ID(id_egresos, 1);
        SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 AND PREF_PRE = :prefe INTO :NUMERO;
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = NEW.terc_nit INTO :NOMTERC;
        execute procedure lee_configuracion('NOMINA', 'PAGOS', 'NOMBRE DE INTERFAZ CONTABLE PARA EGRESOS DE NOMINA')
            returning_values (:NOMINTER);
        SELECT FIRST 1 INCJ_ID FROM INTERFAZ_CAJA I WHERE PREF_PRE = :prefe AND TIDO_COD = 62 AND I.incj_nombre = :nominter
            INTO :IDI;
        INSERT INTO EGRESOS (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO,
            EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF, EGRE_OBS, EGRE_TIPOMOVBCO, EGRE_NOMTERC, EGRE_ANULADO,
            EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_USUARIO, NUMOK, CLEG_ID, EGRE_TRM, EGRE_EXCEDENTE, EGRE_RTCREE,
            EGRE_IDINTER)
            VALUES (:idegre, 62, :PREFE, :NUMERO, :fecha, :CONCEPTO, NEW.pgnd_monto, 0,
            0, 0, 0, NULL, :tipobco, :nomterc, 'N',
            'N', NEW.terc_nit, '6', :caja, USER, 'N', 0, 1, 0, 0, :IDI);
        if (NEW.pgno_tippago = 'B') then
            BEGIN
            SELECT PB.prba_numero FROM prefijos_bancos PB WHERE PB.tido_cod = :tipobco AND PB.cuba_cod = :banco AND PB.prba_pref = :prefbco
                INTO :NUMEROBCO;
            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 (:idegre, :tipobco, :banco, :numerobco, :fecha, :prefbco,
                :nomterc, NEW.pgnd_monto, :concepto, 'N', 'N', 'N');
            end
        ELSE
            if (:caja <> 0) 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 (:idegre, 1, :caja, 1, NULL, NULL, NULL, :fecha, NEW.pgnd_monto, 'N', 'N');
        /* REGISTRE EL DETALLE DE EGRESOS */
        ITEM = 0;
        SELECT MAX(PGNE_ITEM) FROM pago_nomina_egresos WHERE PGNO_ID = NEW.pgno_id INTO :ITEM;
        if (ITEM IS NULL) then
            ITEM = 0;
        ITEM = ITEM + 1;
        INSERT INTO pago_nomina_egresos (PGNO_ID, PGNE_ITEM, EGRE_ID) VALUES (NEW.pgno_id, :ITEM, :IDEGRE);

        UPDATE nomina_conceptos nc  SET NC.noco_pagook = 'S'
            WHERE EXISTS (SELECT nomi_id FROM consolide_nominas WHERE CONN_ID = :IDCONS AND CONN_NOMID = NC.nomi_id)
            AND nc.noco_deduc = 'S' AND nc.noco_pagook = 'N'
            AND NC.noco_prov = 'N' AND ((NC.noco_aporte = 'N') or ((NC.noco_aporte = 'S') AND (NC.noco_gtoempr = 'N')))
            AND TERC_NIT = NEW.terc_nit;
        END
    end
end
^

/* Trigger: PAGO_NOMINA_DET_AU */
CREATE TRIGGER PAGO_NOMINA_DET_AU FOR PAGO_NOMINA_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable IDCONS INTEGER;
begin
if (NEW.pgnd_anulado <> OLD.pgnd_anulado) then
  if (new.pgnd_anulado = 'S') then
    BEGIN
    UPDATE pago_nomina_egresos SET PGNE_ANULADO = NEW.pgnd_anulado WHERE PGNO_ID = NEW.pgno_id;
    SELECT PGNO_IDCONS FROM PAGO_NOMINA WHERE PGNO_ID = OLD.pgno_id INTO :IDCONS;
    UPDATE nomina_conceptos nc  SET NC.noco_pagook = 'N'
        WHERE EXISTS (SELECT nomi_id FROM consolide_nominas WHERE CONN_ID = :IDCONS AND CONN_NOMID = NC.nomi_id)
        AND nc.noco_pagook = 'S' AND NC.noco_prov = 'N' AND ((NC.noco_aporte = 'N') or ((NC.noco_aporte = 'S') AND (NC.noco_gtoempr = 'N')))
        AND TERC_NIT = NEW.terc_nit;
    END
end
^

/* Trigger: PAGO_NOMINA_EGRESOS_AD */
CREATE TRIGGER PAGO_NOMINA_EGRESOS_AD FOR PAGO_NOMINA_EGRESOS
ACTIVE AFTER DELETE POSITION 0
as
begin
/* BORRE EL EGRESO */
if (exists (select EGRE_ID FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND EGRE_ID = OLD.egre_id)) then
    UPDATE EGRESOS SET EGRE_ANULADO = 'S' WHERE EGRE_ID = OLD.egre_id;
DELETE FROM EGRESOS WHERE EGRE_ID = OLD.egre_id;
end
^

/* Trigger: PAGO_NOMINA_EGRESOS_AU */
CREATE TRIGGER PAGO_NOMINA_EGRESOS_AU FOR PAGO_NOMINA_EGRESOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (NEW.pgne_anulado = 'S') then
    if (exists (select EGRE_ID FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND EGRE_ID = OLD.egre_id)) then
        UPDATE EGRESOS SET EGRE_ANULADO = 'S' WHERE EGRE_ID = OLD.egre_id;

end
^

/* Trigger: PAGO_NOMINA_EGRESOS_BI */
CREATE TRIGGER PAGO_NOMINA_EGRESOS_BI FOR PAGO_NOMINA_EGRESOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.pgne_anulado IS NULL) then
    NEW.pgne_anulado = 'N';
end
^

/* Trigger: PARQUEADERO_AD */
CREATE TRIGGER PARQUEADERO_AD FOR PARQUEADERO
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 38, OLD.parq_id, 'D', OLD.parq_pref || OLD.parq_numero);
end
^

/* Trigger: PARQUEADERO_AI */
CREATE TRIGGER PARQUEADERO_AI FOR PARQUEADERO
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 38, NEW.parq_id, 'I', NEW.parq_pref || NEW.parq_numero);
end
^

/* Trigger: PARQUEADERO_AU */
CREATE TRIGGER PARQUEADERO_AU FOR PARQUEADERO
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 38, NEW.parq_id, 'U', NEW.parq_pref || NEW.parq_numero);
end
^

/* Trigger: PARQUEADERO_BI */
CREATE TRIGGER PARQUEADERO_BI FOR PARQUEADERO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
begin
new.parq_fecini = cast('now' as date);
new.parq_horaini = cast('now' as time);
new.parq_id = gen_id(id_parqueadero, 1);
new.parq_factura = 0;
new.parq_anulado = 'N';
if (new.parq_numok is null) then
    new.parq_numok = 'N';
if (NEW.parq_numok = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 38 AND PREF_PRE = NEW.parq_pref INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.parq_numero = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
            SET PREF_ACTUAL = :NUMERO
            WHERE TIDO_COD = 38 AND PREF_PRE = NEW.parq_pref;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.parq_numero AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 38 AND PREF_PRE = NEW.parq_pref;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.parq_numero) returning_values (NEW.parq_numero);
    NEW.parq_numok = 'S';
    END
end
^

/* Trigger: PEDIDOS_AD */
CREATE 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;
    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
^

/* Trigger: PEDIDOS_AI */
CREATE 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
^

/* Trigger: PEDIDOS_AU */
CREATE 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 (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
^

/* Trigger: PEDIDOS_BI */
CREATE 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);
declare variable ESTADO char(1);
declare variable MOTIVOAU CHAR(1);
declare variable USUARIO VARCHAR(8);
declare variable ULTPEDCLI smallint;
declare variable NUMPEDCLI CHAR(2);
BEGIN
if ((new.pedi_validez is null) or (new.pedi_validez = 0)) then
    begin
    execute procedure lee_configuracion('FACTURACION', 'PEDIDOS', 'DIAS DE VALIDEZ') returning_values (NEW.pedi_validez);
    end
NEW.pedi_vence = NEW.pedi_fecha + NEW.pedi_validez;

if ((new.pedi_nomterc is null) or (new.pedi_nomterc = ''))  then
    select terc_nom from terceros where terc_nit = new.terc_nit into new.pedi_nomterc;

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

/* VALIDE EL ESTADO DEL CLIENTE */
SELECT C.clie_estado FROM CLIENTES C WHERE TERC_NIT = NEW.terc_nit INTO :ESTADO;
if (ESTADO <> 'A') then
    exception CLIENTE_INACTIVO 'El cliente ' || new.terc_nit || ' esta inactivo o en No vender.';

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
  if (NEW.pedi_autocar <> 0) then
    BEGIN
    MOTIVOAU = '';
    USUARIO = '';
    SELECT AC.auca_motivo, AC.auca_usuario FROM autorizaciones_cartera AC WHERE AC.auca_id = NEW.pedi_autocar
        INTO :MOTIVOAU, :USUARIO;
    if ((MOTIVOAU = 'C') AND (:USUARIO <> '')) then
        OK = 'S';
    ELSE
        OK = 'N';
    END
  ELSE
      OK = 'N';
  /* VERIFIQUE EL CUPO DE CREDITO */
  if (OK = 'N') then
    BEGIN
    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
  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 numero ' || 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);

if ((NEW.pedi_rtftemonto IS NULL) or (NEW.pedi_rtftemonto = 0)) then
    NEW.pedi_rtftemonto = (NEW.pedi_total-NEW.pedi_ivamonto-NEW.pedi_extra)*NEW.pedi_rtfteporc/100;
if ((NEW.pedi_rtivamonto IS NULL) or (NEW.pedi_rtivamonto = 0)) then
    NEW.pedi_rtivamonto = NEW.pedi_ivamonto * NEW.pedi_rtivaporc / 100;
if ((NEW.pedi_rticamonto IS NULL) or (NEW.pedi_rticamonto = 0)) then
    NEW.pedi_rticamonto = (NEW.pedi_total-NEW.pedi_ivamonto-NEW.pedi_extra)*NEW.pedi_rticaporc/1000;

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;
if (NEW.pedi_diascr IS NULL) then
    BEGIN
    SELECT CLIE_DIAS FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO NEW.pedi_diascr;
    if (NEW.pedi_diascr IS NULL) then
        NEW.pedi_diascr = 0;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'PEDIDOS', 'NUMERAR PEDIDOS DEL CLIENTE POR CADA DIA') returning_values (NUMPEDCLI);
if (NUMPEDCLI = 'SI') then
    BEGIN
    SELECT MAX(PEDI_CONSDIA) FROM PEDIDOS WHERE PEDI_FECHA = NEW.pedi_fecha AND PEDI_ANULADO = 'N' AND TERC_NIT = NEW.terc_nit
        into :ultpedcli;
    if (ultpedcli is null) then
        ultpedcli = 0;
    new.pedi_consdia = ultpedcli + 1;
    END
ELSE
    new.pedi_consdia = 0;
END
^

/* Trigger: PEDIDOS_BU */
CREATE TRIGGER PEDIDOS_BU FOR PEDIDOS
ACTIVE BEFORE UPDATE POSITION 0
as
begin
NEW.pedi_vence = NEW.pedi_fecha + NEW.pedi_validez;
end
^

/* Trigger: PEDIDOS_DETALLE_AD */
CREATE TRIGGER PEDIDOS_DETALLE_AD FOR PEDIDOS_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM 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
        /* DESHAGA LOS PENDIENTES */
        CANTAUX = old.pede_cant * old.pede_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    if (IDENTR <> 0) then
        DELETE FROM ENTRADAS WHERE ENTR_ID = :IDENTR;
    end
end
^

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

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

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

/* Trigger: PEDIDOS_DETALLE_BI */
CREATE TRIGGER PEDIDOS_DETALLE_BI FOR PEDIDOS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable FECHA DATE;
declare variable EXRES VARCHAR(8);
declare variable EXISTEN numeric(18,4);
declare variable RESERVA numeric(18,4);
DECLARE VARIABLE EXIS CHAR(1);
DECLARE VARIABLE ENSAMBLE CHAR(1);
declare variable DEC1818 CHAR(1);
declare variable PREF VARCHAR(4);
declare variable IDPW INTEGER;
declare variable CANT numeric(18,4);
declare variable RESWEB char(2);
declare variable EVENTO INTEGER;
declare variable EXISEV char(1);
BEGIN
/* VALIDE LA RESERVA */
SELECT PEDI_FECHA, PREF_PRE, PEDI_PEDWEB, PEDI_EVENTO FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID
    INTO :FECHA, :PREF, :IDPW, :EVENTO;
if ((EVENTO <> 0) AND (EVENTO IS NOT NULL)) then
    SELECT EVVE_EXIS FROM EVENTOS_VENTAS WHERE EVVE_ID = :EVENTO INTO :EXISEV;
ELSE
    EXISEV = 'S';
/* VALIDE LA RESERVA */
EXECUTE procedure LEE_CONFIGURACION ('INVENTARIO','EXISTENCIAS','ACCION A TOMAR SI LA EXISTENCIA ESTA RESERVADA') returning_values (EXRES);
if ((EXRES = 'PROHIBIR') AND (EXISEV = 'S')) then
    BEGIN
    SELECT ARTI_EXIST, ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = NEW.ARTI_COD INTO :EXIS, :ENSAMBLE;
    IF ((EXIS <> 'N') AND (ENSAMBLE = 'N')) THEN
        BEGIN
        EXECUTE PROCEDURE existencia_bodega(NEW.arti_cod, :fecha,  NEW.bode_cod) returning_values (:existen, :reserva);
        if ((:IDPW <> 0) AND (IDPW IS NOT NULL)) then
            BEGIN
            execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'RESERVAR MERCANCIA CON PEDIDO WEB SIN CONFIRMAR') returning_values (:resweb);
            if (RESWEB = 'SI') then
                BEGIN
                CANT = 0;
                select sum(PD.pewd_cant * PD.pewd_factor) from pedido_web_detalle PD
                    where pewe_id = :idpw and PD.arti_cod = NEW.arti_cod into :CANT;
                if (CANT IS NULL) then
                    CANT = 0;
                RESERVA = RESERVA - CANT;
                END
            END
        if ((NEW.pede_cant * NEW.pede_factor) > (:existen - :reserva)) then
            begin
            exception existencia_insuficiente 'La existencia del articulo ' || new.arti_cod || ' esta reservada. Cantidad:' || (new.pede_cant * new.pede_factor) || ' disponible:' || (:existen-:reserva);
            end
        END
    END
  /* CALCULE LO POR LIBERAR */
  EXECUTE PROCEDURE factor_unidad_cant_excep(NEW.ARTI_COD, NEW.pede_unidad) returning_values (new.pede_factor);
  NEW.pede_reserva = NEW.pede_cant * new.pede_factor;
  if (NEW.pede_dtoporc IS NULL) then
    NEW.pede_dtoporc = 0;
  /* CALCULE EL MONTO DEL DESCUENTO */
  NEW.PEDE_DTOMONTO = NEW.pede_prunit * NEW.pede_dtoporc / 100;
if (new.bode_cod is null) then
    new.bode_cod = '1';
if (new.pede_devuelto is null) then
    new.pede_devuelto = 0;
if (NEW.lipr_cod IS NULL) then
    BEGIN
    SELECT LIPR_COD FROM clientes C, PEDIDOS P WHERE C.TERC_NIT = P.terc_nit AND P.pedi_id = NEW.pedi_id INTO NEW.lipr_cod;
    if (NEW.lipr_cod IS NULL) then
        SELECT FIRST 1 p.LIPR_COD FROM PRECIOS_ARTICULO p, lista_precios l, usuario u
            WHERE ARTI_COD = NEW.arti_cod and p.prar_fijo <> 0 and l.lipr_cod = p.lipr_cod and u.user_cod = USER and
            ((l.sucu_id = u.sucu_id) or (l.sucu_id = 0) or (u.sucu_id = 0)) order by p.lipr_cod into new.lipr_cod;
    END
SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = NEW.lipr_cod AND ARTI_COD = NEW.arti_cod INTO NEW.pede_prlista;
if (NEW.pede_desc IS NULL) then
    SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO NEW.pede_desc;
select grup_dec1818 from grupo g, articulo a where a.arti_cod = new.arti_cod and a.grup_cod = g.grup_cod into :DEC1818;
if (DEC1818 = 'S') then
    BEGIN
    SELECT PREF_DEC1818 FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = :pref INTO :DEC1818;
    if (DEC1818 = 'S') then
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'TARIFA DE IVA PARA PRODUCTOS EXENTOS DECRETO 1818 DE 2015') returning_values (new.pede_tiva);
    ELSE
        select taiv_cod from articulo where arti_cod = new.arti_cod into new.pede_tiva;
    END
ELSE
    select taiv_cod from articulo where arti_cod = new.arti_cod into new.pede_tiva;
END
^

/* Trigger: PEDIDO_WEB_AD */
CREATE TRIGGER PEDIDO_WEB_AD FOR PEDIDO_WEB
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 234, OLD.pewe_id, 'D', OLD.terc_nit);
end
^

/* Trigger: PEDIDO_WEB_AI */
CREATE TRIGGER PEDIDO_WEB_AI FOR PEDIDO_WEB
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 234, NEW.pewe_id, 'I', NEW.terc_nit);
end
^

/* Trigger: PEDIDO_WEB_AU */
CREATE TRIGGER PEDIDO_WEB_AU FOR PEDIDO_WEB
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 234, NEW.pewe_id, 'U', NEW.terc_nit);
end
^

/* Trigger: PEDIDO_WEB_BI */
CREATE TRIGGER PEDIDO_WEB_BI FOR PEDIDO_WEB
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECSERVER CHAR(2);
begin
if (NEW.pewe_fecha IS NULL) then
    NEW.pewe_fecha = CAST ('NOW' AS DATE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.pewe_fecha = CAST ('NOW' AS DATE);
if ((NEW.pewe_sucursal IS NULL) or (NEW.pewe_sucursal = '')) then
    NEW.pewe_sucursal = '01';
if (new.ptvt_id is null) then
    select V.ptvt_id FROM PUNTO_VENTA PT, VENDEDORES V WHERE V.vend_cod = new.vend_cod AND V.ptvt_id = PT.ptvt_id INTO new.ptvt_id;
if (NEW.pewe_pref IS NULL) then
    SELECT PTVT_PREFPED FROM PUNTO_VENTA WHERE ptvt_id = NEW.ptvt_id INTO new.pewe_pref;
if (NEW.pewe_ivamonto IS NULL) then
    NEW.pewe_ivamonto = 0;
if (NEW.pewe_total IS NULL) then
    NEW.pewe_total = 0;
if (NEW.pewe_dtoporc IS NULL) then
    NEW.pewe_dtoporc = 0;
ELSE
    if (NEW.pewe_dtomonto IS NULL) then
        NEW.pewe_dtomonto = (NEW.pewe_total - NEW.pewe_ivamonto) * NEW.pewe_dtoporc / 100;
if (NEW.pewe_adicional IS NULL) then
    NEW.pewe_adicional = 0;
if (NEW.pewe_extra IS NULL) then
    NEW.pewe_extra = 0;
if (NEW.pewe_rtfteporc IS NULL) then
    NEW.pewe_rtfteporc = 0;
if (NEW.pewe_rtivaporc IS NULL) then
    NEW.pewe_rtivaporc = 0;
if (NEW.pewe_rticaporc IS NULL) then
    NEW.pewe_rticaporc = 0;
if (NEW.pewe_entrega IS NULL) then
    NEW.pewe_entrega = NEW.pewe_fecha;
if (NEW.pewe_idped IS NULL) then
    NEW.pewe_idped = 0;
end
^

/* Trigger: PEDIDO_WEB_BU */
CREATE TRIGGER PEDIDO_WEB_BU FOR PEDIDO_WEB
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
begin
if (NEW.pewe_dtoporc IS NULL) then
    NEW.pewe_dtoporc = 0;
ELSE
    if ((NEW.pewe_dtomonto IS NULL) or (new.pewe_dtomonto = 0)) then
        NEW.pewe_dtomonto = (NEW.pewe_total - NEW.pewe_ivamonto) * NEW.pewe_dtoporc / 100;
if (NEW.pewe_adicional IS NULL) then
    NEW.pewe_adicional = 0;
if (NEW.pewe_extra IS NULL) then
    NEW.pewe_extra = 0;
if (NEW.pewe_rtfteporc IS NULL) then
    NEW.pewe_rtfteporc = 0;
if (NEW.pewe_rtivaporc IS NULL) then
    NEW.pewe_rtivaporc = 0;
if (NEW.pewe_rticaporc IS NULL) then
    NEW.pewe_rticaporc = 0;
/* actualice los totales del encabezado */
SELECT SUM(PEWD_TOTAL), SUM(PEWD_IVAMONTO) FROM pedido_web_detalle PD
    WHERE PEWE_ID = NEW.pewe_id INTO :TOTAL, :IVAMONTO;

NEW.PEWE_IVAMONTO = :IVAMONTO * (100 - new.PEWE_DTOPORC) / 100;
NEW.PEWE_TOTAL = :TOTAL - NEW.PEWE_DTOMONTO + NEW.PEWE_ADICIONAL + NEW.PEWE_EXTRA;
end
^

/* Trigger: PEDIDO_WEB_DETALLE_AD */
CREATE TRIGGER PEDIDO_WEB_DETALLE_AD FOR PEDIDO_WEB_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
begin
/* actualice los totales del encabezado */
SELECT SUM(PEWD_TOTAL), SUM(PEWD_IVAMONTO) FROM pedido_web_detalle PD
    WHERE PEWE_ID = OLD.pewe_id INTO :TOTAL, :IVAMONTO;
UPDATE PEDIDO_WEB
    SET PEWE_IVAMONTO = :IVAMONTO * (100 - PEWE_DTOPORC) / 100,
        PEWE_DTOMONTO = (:TOTAL - :IVAMONTO) * PEWE_DTOPORC / 100,
        PEWE_TOTAL = :TOTAL - PEWE_DTOMONTO + PEWE_ADICIONAL + PEWE_EXTRA
    WHERE PEWE_ID = OLD.pewe_id;
end
^

/* Trigger: PEDIDO_WEB_DETALLE_AI */
CREATE TRIGGER PEDIDO_WEB_DETALLE_AI FOR PEDIDO_WEB_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
begin
/* actualice los totales del encabezado */
SELECT SUM(PEWD_TOTAL), SUM(PEWD_IVAMONTO) FROM pedido_web_detalle PD
    WHERE PEWE_ID = NEW.pewe_id INTO :TOTAL, :IVAMONTO;
UPDATE PEDIDO_WEB
    SET PEWE_IVAMONTO = :IVAMONTO * (100 - PEWE_DTOPORC) / 100,
        PEWE_DTOMONTO = (:TOTAL - :IVAMONTO) * PEWE_DTOPORC / 100,
        PEWE_TOTAL = :TOTAL - PEWE_DTOMONTO + PEWE_ADICIONAL + PEWE_EXTRA
    WHERE PEWE_ID = NEW.pewe_id;
end
^

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

if ((NEW.pewd_prunit IS NULL) or (NEW.pewd_prunit = 0))  then
    SELECT PRAR_FIJO from precios_articulo WHERE ARTI_COD = NEW.arti_cod AND LIPR_COD = NEW.lipr_cod INTO NEW.pewd_prunit;

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

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

/* LA BODEGA Y LOS IMPUESTOS DEPENDEN DEL ENCABEZADO */
select ptvt_id from pedido_web where pewe_id = new.pewe_id into :ptovnt;
if (ptovnt is null) then
    SELECT first 1 PT.bode_cod, PEWE_PREF, v.sucu_id FROM pedido_web P, punto_venta PT, VENDEDORES V
    WHERE PEWE_ID = NEW.pewe_id AND P.VEND_COD = V.vend_cod AND V.sucu_id = PT.sucu_id and p.pewe_pref = pt.ptvt_prefped
    INTO :BOD, :PREF, :agencia;
else
    SELECT first 1 PT.bode_cod, PEWE_PREF, V.sucu_id FROM pedido_web P, punto_venta PT, VENDEDORES V
    WHERE PEWE_ID = NEW.pewe_id AND P.ptvt_id = PT.ptvt_id AND V.sucu_id = PT.sucu_id and p.pewe_pref = pt.ptvt_prefped
    into :bod, :pref, :agencia;
SELECT pewe_fecha from pedido_web c where pewe_id = new.pewe_id into :fecdoc;
execute procedure existencias_unidad_bod(new.arti_cod,:fecdoc,:UNIDAD,:bod)
returning_values (:bod,:existen,:reservado,:ordenado,:stand);
if ((:existen-:reservado > 0) and (existen >= new.pewd_cant)) then
    new.bode_cod = :bod;
else
    execute procedure bodega_facturacion_alterna(new.arti_cod,:fecdoc,0,:bod,new.pewd_cant) returning_values(:bod);
execute procedure existencias_unidad_bod(new.arti_cod,:fecdoc,new.pewd_unidad,:bod)
    returning_values (:bod,:existen,:reservado,:ordenado,:stand);
if ((existen-reservado > 0) and (existen >= new.pewd_cant)) then
    new.bode_cod = :BOD;
else
    SELECT first 1 BODE_COD FROM articulo_bodega WHERE ARTI_COD = NEW.arti_cod AND ((SUCU_ID = :agencia) or (SUCU_ID = 0))
        INTO NEW.bode_cod;

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

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

end
^

/* Trigger: PENDIENTE_VENTAS_AD */
CREATE TRIGGER PENDIENTE_VENTAS_AD FOR PENDIENTE_VENTAS
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 40, OLD.pend_id, 'D', OLD.pref_pre || OLD.pend_numero);
end
^

/* Trigger: PENDIENTE_VENTAS_AI */
CREATE TRIGGER PENDIENTE_VENTAS_AI FOR PENDIENTE_VENTAS
ACTIVE AFTER INSERT POSITION 0
as
begin
IF ((NEW.pend_id <> 0) AND (NEW.pend_anulado = 'N')) THEN
  BEGIN
  /* ANULE LA ORDEN SI LA HAY*/
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 40, NEW.pend_id, 'I', NEW.pref_pre || NEW.pend_numero);
  END
end
^

/* Trigger: PENDIENTE_VENTAS_AU */
CREATE TRIGGER PENDIENTE_VENTAS_AU FOR PENDIENTE_VENTAS
ACTIVE AFTER UPDATE POSITION 0
as
begin
/* BORRE LA CONTABILIZACION */
if (NEW.pend_anulado = 'S') then
    BEGIN
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 40, NEW.pend_id, 'A', NEW.pref_pre || NEW.pend_numero);
    END
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 40, NEW.pend_id, 'U', NEW.pref_pre || NEW.pend_numero);

if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.pend_numero <> NEW.pend_numero) or
    (OLD.pend_fecha <> NEW.pend_fecha)) then
    UPDATE pendiente_ventas_detalle SET PEVD_TRANSMIT = 'N' WHERE PEND_ID = NEW.pend_id;
if (OLD.pend_anulado <> NEW.pend_anulado) then
    UPDATE pendiente_ventas_detalle SET PEVD_ANULADO = NEW.pend_anulado WHERE PEND_ID = NEW.pend_id;
if (OLD.pend_transmit <> NEW.pend_transmit) then
    UPDATE pendiente_ventas_detalle SET PEVD_TRANSMIT = NEW.pend_transmit WHERE PEND_ID = NEW.pend_id;
end
^

/* Trigger: PENDIENTE_VENTAS_BI */
CREATE TRIGGER PENDIENTE_VENTAS_BI FOR PENDIENTE_VENTAS
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 = 40 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.pend_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 40 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.pend_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 40 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.pend_numero) returning_values (NEW.pend_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM pendiente_ventas WHERE PREF_PRE = NEW.PREF_PRE AND PEND_NUMERO = NEW.pend_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un pendiente con el nÃºmero ' || new.pref_pre || new.pend_numero;
end
^

/* Trigger: PENDIENTE_VENTAS_DETALLE_AD */
CREATE TRIGGER PENDIENTE_VENTAS_DETALLE_AD FOR PENDIENTE_VENTAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
declare variable CANTAUX NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable REMISIONADO NUMERIC(18,4);
declare variable EXIST CHAR(1);
begin
if ((old.pend_id <> 0) and (old.pevd_anulado = 'N')) then
    begin
    select ARTI_EXIST from ARTICULO where ARTI_COD = old.ARTI_COD into :EXIST;
    delete from MOVIMIENTO_ARTICULO where (mvar_tipodoc = 40) and (mvar_idref = old.pend_id) and (mvar_item = old.pevd_item);
    /* DESHAGA LO REMISIONADO EN LA FACTURA */
    if (OLD.pevd_idfact <> 0) then
        BEGIN
        CANTAUX = OLD.pevd_cant * OLD.pevd_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_REMISIONADO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0
                INTO :remisionado, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > REMISIONADO) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_REMISIONADO = 0
                            WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - REMISIONADO;
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_REMISIONADO = FADE_REMISIONADO - :CANTAUX
                            WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            end
        else
            begin
            FOR SELECT FADE_REMISIONADO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0 and BODE_COD = old.bode_cod AND FADE_LOTE = OLD.pevd_lote
                INTO :remisionado, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > REMISIONADO) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_REMISIONADO = 0
                            WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - REMISIONADO;
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_REMISIONADO = FADE_REMISIONADO - :CANTAUX
                            WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            end
        END
    END
end
^

/* Trigger: PENDIENTE_VENTAS_DETALLE_AI */
CREATE TRIGGER PENDIENTE_VENTAS_DETALLE_AI FOR PENDIENTE_VENTAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable fecfac date;
declare variable CONC varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable ULTIMO numeric(18,2);
declare variable FACT varchar(12);
declare variable CANT NUMERIC(18,4);
declare variable CANTAUX NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable REMISIONADO NUMERIC(18,4);
declare variable EXIST CHAR(1);
BEGIN
if ((NEW.pend_id <> 0) and (new.pevd_anulado = 'N')) then
    BEGIN
    select pend_fecha, pref_pre, pend_numero, terc_nit, pend_factura
        from pendiente_ventas where pend_id = new.pend_id
        into :fec, :Pref, :Num, :Nit, :fact;
    if (NEW.pevd_idfact <> 0) then
        BEGIN
        CONC = 'PENDIENTE VENTAS No.' || PREF || NUM || ' - FACTURA ' || FACT;
        execute procedure factor_unidad_cant(new.arti_cod, new.pevd_unidad) returning_values(factor);
        execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
        if (COSTO = 0) then
            begin
            select FACT_FECHA from FACTURAS where FACT_ID = NEW.pevd_idfact into :fecfac;
            execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
            if (COSTO = 0) then
                COSTO = ULTIMO;
            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, 40, new.pend_id, :CONC, :factor * new.pevd_cant, :COSTO, 'S',
            new.pevd_lote, :Pref, :Num, new.pevd_item, :Nit);

        /* actualice lo remisionado en la factura */
        select ARTI_EXIST from ARTICULO where ARTI_COD = new.ARTI_COD into :EXIST;
        CANTAUX = NEW.pevd_cant * NEW.pevd_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_REMISIONADO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = NEW.pevd_idfact AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :REMISIONADO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - REMISIONADO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_REMISIONADO = (:CANT * :FACTOR)
                        WHERE FACT_ID = NEW.pevd_idfact AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - REMISIONADO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_REMISIONADO = FADE_REMISIONADO + :CANTAUX
                        WHERE FACT_ID = NEW.pevd_idfact 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_REMISIONADO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = NEW.pevd_idfact AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND FADE_LOTE = NEW.pevd_lote
                INTO :ITEM, :CANT, :FACTOR, :REMISIONADO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - REMISIONADO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_REMISIONADO = (:CANT * :FACTOR)
                        WHERE FACT_ID = NEW.pevd_idfact AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - REMISIONADO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_REMISIONADO = FADE_REMISIONADO + :CANTAUX
                        WHERE FACT_ID = NEW.pevd_idfact AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta dejando pendiente una cantidad mayor a la facturada del articulo ' || new.arti_cod;
        END
    END
END
^

/* Trigger: PENDIENTE_VENTAS_DETALLE_AU */
CREATE TRIGGER PENDIENTE_VENTAS_DETALLE_AU FOR PENDIENTE_VENTAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecfac date;
declare variable CONC varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable ULTIMO numeric(18,2);
declare variable FACT varchar(12);
declare variable CANT NUMERIC(18,4);
declare variable CANTAUX NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable REMISIONADO NUMERIC(18,4);
declare variable EXIST CHAR(1);
begin
if ((old.pend_id <> 0) and (old.pevd_anulado = 'N')) then
    begin
    delete from MOVIMIENTO_ARTICULO where (mvar_tipodoc = 40) and (mvar_idref = new.pend_id) and (mvar_item = old.pevd_item);
    /* DESHAGA LO REMISIONADO EN LA FACTURA */
    if (OLD.pevd_idfact <> 0) then
        BEGIN
        CANTAUX = OLD.pevd_cant * OLD.pevd_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_REMISIONADO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0
                INTO :CANT, :FACTOR, :remisionado, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > REMISIONADO) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_REMISIONADO = 0
                            WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - REMISIONADO;
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_REMISIONADO = FADE_REMISIONADO - :CANTAUX
                            WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            end
        else
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_REMISIONADO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0 and BODE_COD = old.bode_cod AND FADE_LOTE = OLD.pevd_lote
                INTO :CANT, :FACTOR, :remisionado, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > REMISIONADO) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_REMISIONADO = 0
                            WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - REMISIONADO;
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_REMISIONADO = FADE_REMISIONADO - :CANTAUX
                            WHERE FACT_ID = OLD.pevd_idfact AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            end
        END
    end
if ((new.pend_id <> 0) and (new.pevd_anulado = 'N')) then
    begin
    select pend_fecha, pref_pre, pend_numero, terc_nit, pend_factura
        from pendiente_ventas where pend_id = new.pend_id
        into :fec, :Pref, :Num, :Nit, :fact;
    if ((NEW.pevd_idfact <> 0) AND (OLD.pevd_idfact <> 0)) then
        BEGIN
        /* SI ANTES ESTABA EN CERO NO HAGA ENTRADA AL INVENTARIO */
        CONC = 'PENDIENTE VENTAS No.' || PREF || NUM || ' - FACTURA ' || FACT;
        execute procedure factor_unidad_cant(new.arti_cod, new.pevd_unidad) returning_values(factor);
        execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
        if (COSTO = 0) then
            begin
            select FACT_FECHA from FACTURAS where FACT_ID = NEW.pevd_idfact into :fecfac;
            execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
            if (COSTO = 0) then
                COSTO = ULTIMO;
            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, 40, new.pend_id, :CONC, :factor * new.pevd_cant, :COSTO, 'S',
            new.pevd_lote, :Pref, :Num, new.pevd_item, :Nit);

        /* actualice lo remisionado en la factura */
        select ARTI_EXIST from ARTICULO where ARTI_COD = new.ARTI_COD into :EXIST;
        CANTAUX = NEW.pevd_cant * NEW.pevd_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_REMISIONADO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = NEW.pevd_idfact AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :REMISIONADO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - REMISIONADO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_REMISIONADO = (:CANT * :FACTOR)
                        WHERE FACT_ID = NEW.pevd_idfact AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - REMISIONADO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_REMISIONADO = FADE_REMISIONADO + :CANTAUX
                        WHERE FACT_ID = NEW.pevd_idfact 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_REMISIONADO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = NEW.pevd_idfact AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND FADE_LOTE = NEW.pevd_lote
                INTO :ITEM, :CANT, :FACTOR, :REMISIONADO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - REMISIONADO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_REMISIONADO = (:CANT * :FACTOR)
                        WHERE FACT_ID = NEW.pevd_idfact AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - REMISIONADO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_REMISIONADO = FADE_REMISIONADO + :CANTAUX
                        WHERE FACT_ID = NEW.pevd_idfact AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta dejando pendiente una cantidad mayor a la facturada del articulo ' || new.arti_cod;
        END
    end
end
^

/* Trigger: PERIODO_PAGO_NOMBRE_BI */
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
^

/* Trigger: PLANILLA_DIGITACION_BI */
CREATE TRIGGER PLANILLA_DIGITACION_BI FOR PLANILLA_DIGITACION
ACTIVE BEFORE INSERT POSITION 0
as
begin
IF ((NEW.pldi_nit IS NULL) or (new.pldi_nit = '')) THEN
  EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.pldi_nit);
IF ((NEW.pldi_proy IS NULL) or (new.pldi_proy = '')) THEN
  EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.pldi_proy);
IF ((NEW.pldi_centro IS NULL) or (new.pldi_centro = '')) THEN
  EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.pldi_centro);
end
^

/* Trigger: PLANILLA_PASAJEROS_AD */
CREATE TRIGGER PLANILLA_PASAJEROS_AD FOR PLANILLA_PASAJEROS
ACTIVE AFTER DELETE POSITION 0
as
declare variable CONSEC INTEGER;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 88 and enco_idref = old.plpa_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 88 and enco_idref = old.plpa_id;
if ((OLD.plpa_id <> 0) and (old.plpa_anulado = 'N')) then
    BEGIN
    DELETE FROM MOVIMIENTO_CAJA WHERE moca_tiporef = 88 and moca_idref = OLD.plpa_id;
    if (OLD.plpa_neto > 0) then
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (OLD.plpa_caja, OLD.plpa_fecha, OLD.plpa_neto, 'S');
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (OLD.plpa_caja, OLD.plpa_fecha, ABS(OLD.plpa_neto), 'S');

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 88, OLD.plpa_id, 'D', OLD.plpa_pref || OLD.plpa_numero);
    END
end
^

/* Trigger: PLANILLA_PASAJEROS_AI */
CREATE TRIGGER PLANILLA_PASAJEROS_AI FOR PLANILLA_PASAJEROS
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONC VARCHAR(60);
begin
IF ((NEW.plpa_id <> 0) AND (NEW.plpa_anulado = 'N')) THEN
  BEGIN
  /* AFECTE LA CAJA */
  if (NEW.plpa_neto > 0) then
    BEGIN
    CONC = 'PLANILLA DE PASAJEROS No. ' || NEW.plpa_pref || NEW.plpa_numero;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), NEW.plpa_caja, 88, NEW.plpa_pref, NEW.plpa_numero, NEW.plpa_fecha, :Conc, 0, NEW.plpa_neto, 'N', new.plpa_id);
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(NEW.plpa_caja, NEW.plpa_fecha, NEW.plpa_neto, 'N');
    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.plpa_caja, 88, NEW.plpa_pref, NEW.plpa_numero, NEW.plpa_fecha, :Conc, ABS(NEW.plpa_neto), 0, 'S', new.plpa_id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (NEW.plpa_caja, NEW.plpa_fecha, ABS(NEW.plpa_neto), 'N');
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 88, NEW.plpa_id, 'I', NEW.plpa_pref || NEW.plpa_numero);
  END
end
^

/* Trigger: PLANILLA_PASAJEROS_AU */
CREATE TRIGGER PLANILLA_PASAJEROS_AU FOR PLANILLA_PASAJEROS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CONSEC INTEGER;
declare variable CONC VARCHAR(60);
begin
if ((OLD.plpa_id <> 0) and (old.plpa_anulado = 'N')) then
    BEGIN
    DELETE FROM MOVIMIENTO_CAJA WHERE moca_tiporef = 88 and moca_idref = OLD.plpa_id;
    if (OLD.plpa_neto > 0) then
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (OLD.plpa_caja, OLD.plpa_fecha, OLD.plpa_neto, 'S');
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (OLD.plpa_caja, OLD.plpa_fecha, ABS(OLD.plpa_neto), 'S');
    END
if (NEW.plpa_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 88 and enco_idref = old.plpa_id into :consec;
    if (NOT consec is null) then
        begin
        delete from comprobante_detalle where enco_consec = :consec;
        delete from comprobante_detalle_niif where enco_consec = :consec;
        end
    delete from comprobante_encabezado where enco_tiporef = 88 and enco_idref = old.plpa_id;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 88, NEW.plpa_id, 'A', NEW.plpa_pref || NEW.plpa_numero);
    END
IF ((NEW.plpa_id <> 0) AND (NEW.plpa_anulado = 'N')) THEN
    BEGIN
    /* AFECTE LA CAJA */
    if (NEW.plpa_neto > 0) then
        BEGIN
        CONC = 'PLANILLA DE PASAJEROS No. ' || NEW.plpa_pref || NEW.plpa_numero;
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), NEW.plpa_caja, 88, NEW.plpa_pref, NEW.plpa_numero, NEW.plpa_fecha, :Conc, 0, NEW.plpa_neto, 'N', new.plpa_id);
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(NEW.plpa_caja, NEW.plpa_fecha, NEW.plpa_neto, 'N');
        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.plpa_caja, 88, NEW.plpa_pref, NEW.plpa_numero, NEW.plpa_fecha, :Conc, ABS(NEW.plpa_neto), 0, 'S', new.plpa_id);
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (NEW.plpa_caja, NEW.plpa_fecha, ABS(NEW.plpa_neto), 'N');
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 88, NEW.plpa_id, 'U', NEW.plpa_pref || NEW.plpa_numero);
    END
/* ACTUALICE LOS ANULADOS Y TRASMITIDOS */
if (NEW.plpa_anulado <> OLD.plpa_anulado) then
    BEGIN
    UPDATE planilla_pasajeros_con SET PLPC_ANULADO = NEW.plpa_anulado WHERE PLPA_ID = NEW.plpa_id;
    UPDATE planilla_pasajeros_det SET PLPA_ANULADO = NEW.plpa_anulado WHERE PLPA_ID = NEW.plpa_id;
    UPDATE planilla_pasajeros_rem SET PLPR_ANULADO = NEW.plpa_anulado WHERE PLPA_ID = NEW.plpa_id;
    END
ELSE
    if (NEW.plpa_transmit <> OLD.plpa_transmit) then
        BEGIN
        UPDATE planilla_pasajeros_con SET PLPC_TRANSMIT = NEW.plpa_transmit WHERE PLPA_ID = NEW.plpa_id;
        UPDATE planilla_pasajeros_det SET PLPA_TRANSMIT = NEW.plpa_transmit WHERE PLPA_ID = NEW.plpa_id;
        UPDATE planilla_pasajeros_rem SET PLPR_TRANSMIT = NEW.plpa_transmit WHERE PLPA_ID = NEW.plpa_id;
        END
end
^

/* Trigger: PLANILLA_PASAJEROS_BI */
CREATE TRIGGER PLANILLA_PASAJEROS_BI FOR PLANILLA_PASAJEROS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.plpa_numok = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 88 AND PREF_PRE = NEW.plpa_pref INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.plpa_numero = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 88 AND PREF_PRE = NEW.plpa_pref;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.plpa_numero AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 88 AND PREF_PRE = NEW.plpa_pref;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.plpa_numero) returning_values (NEW.plpa_numero);
    NEW.plpa_numok = 'S';
    END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM planilla_pasajeros WHERE PLPA_PREF = NEW.plpa_pref AND PLPA_NUMERO = NEW.plpa_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
END
^

/* Trigger: PLANILLA_PASAJEROS_DET_AD */
CREATE TRIGGER PLANILLA_PASAJEROS_DET_AD FOR PLANILLA_PASAJEROS_DET
ACTIVE AFTER DELETE POSITION 0
as
declare variable ABONOS INTEGER;
declare variable FEC DATE;
declare variable CANT INTEGER;
declare variable INGPAS INTEGER;
begin
/* Marque los tiquetes como planillados */
if ((old.plpa_id <> 0) and (old.plpa_anulado = 'N')) then
    begin
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = OLD.plpa_id AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        select PLPA_FECHA FROM planilla_pasajeros P where plpa_id = OLD.plpa_id into :FEC;
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR PASAJES A CREDITO') returning_values (:ingpas);
        CANT = 0;
        SELECT TIQP_CANT FROM tiquete_pasajero WHERE TIQP_ID = OLD.plpa_tiquete and TIQP_FORMAP = 'R' INTO :CANT;
        if (CANT IS NULL) then
            CANT = 0;
        INGPAS = ingpas * :cant;
        UPDATE saldos_doc_cxpagar
            SET SDCP_MONTO = SDCP_MONTO - (OLD.plpa_valor-:INGPAS)
            WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = OLD.plpa_id AND SDCP_FECHA = :FEC;
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.plpa_valor-:INGPAS)
            WHERE MVPR_TIPOREF = 88 AND MVPR_IDREF = OLD.plpa_id;
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    update tiquete_pasajero set tiqp_planilla = 0 where tiqp_id = old.plpa_tiquete;
    end
end
^

/* Trigger: PLANILLA_PASAJEROS_DET_AI */
CREATE TRIGGER PLANILLA_PASAJEROS_DET_AI FOR PLANILLA_PASAJEROS_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable vehiculo varchar(8);
declare variable INGPAS INTEGER;
declare variable NIT VARCHAR(20);
declare variable CONC VARCHAR(60);
declare variable FEC DATE;
declare variable CANT INTEGER;
declare variable PREF varchar(4);
declare variable NUMERO varchar(8);
declare variable EXISTE CHAR(1);
begin
/* Marque los tiquetes como planillados */
if ((new.plpa_id <> 0) and (new.plpa_anulado = 'N')) then
    begin
    select plpa_vehiculo, PLPA_FECHA, V.TERC_NIT, P.plpa_pref, P.plpa_numero FROM vehiculos V, planilla_pasajeros P
        where P.plpa_id = new.plpa_id AND V.vehi_cod = P.plpa_vehiculo into :vehiculo, :FEC, :NIT, :pref, :numero;
    update tiquete_pasajero set tiqp_planilla = new.plpa_id, tiqp_vehiculo = :vehiculo where tiqp_id = new.plpa_tiquete;
    /* GENERE LA CXPAGAR AL ASOCIADO */
    CONC = 'TIQUETE A CREDITO No. ' || NEW.plpd_pref || NEW.plpd_numero;
    execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR PASAJES A CREDITO') returning_values (:ingpas);
    CANT = 0;
    SELECT TIQP_CANT FROM tiquete_pasajero WHERE TIQP_ID = NEW.plpa_tiquete and TIQP_FORMAP = 'R' INTO :CANT;
    if (CANT IS NULL) then
        CANT = 0;
    INGPAS = ingpas * :cant;
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = 88 and
        sdcp_idref = new.plpa_id and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_MONTO = SDCP_MONTO + (NEW.plpa_valor-:INGPAS)
            WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = NEW.plpa_id 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 (88, NEW.plpa_id, :fec, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', (NEW.plpa_valor-:INGPAS));
    /* Registre el movimiento del proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 88 AND MVPR_IDREF = NEW.plpa_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.plpa_valor-:INGPAS)
            WHERE MVPR_TIPOREF = 88 AND MVPR_IDREF = NEW.plpa_id;
    ELSE
        BEGIN
        CONC = 'PLANILLA DE PASAJEROS 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, 88, NEW.plpa_id, :fec, :fec, :CONC, (NEW.plpa_valor-:INGPAS), 0, 0, 0, 'S', 'N', :pref, :numero);
        END
    end
end
^

/* Trigger: PLANILLA_PASAJEROS_DET_AU */
CREATE TRIGGER PLANILLA_PASAJEROS_DET_AU FOR PLANILLA_PASAJEROS_DET
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ABONOS INTEGER;
declare variable vehiculo varchar(8);
declare variable INGPAS INTEGER;
declare variable NIT VARCHAR(20);
declare variable CONC VARCHAR(60);
declare variable FEC DATE;
declare variable CANT INTEGER;
declare variable EXISTE CHAR(1);
declare variable PREF varchar(4);
declare variable NUMERO varchar(8);
begin
/* Marque los tiquetes como planillados */
if ((old.plpa_id <> 0) and (old.plpa_anulado = 'N')) then
    begin
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = OLD.plpa_id AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        select PLPA_FECHA FROM planilla_pasajeros P where plpa_id = OLD.plpa_id into :FEC;
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR PASAJES A CREDITO') returning_values (:ingpas);
        CANT = 0;
        SELECT TIQP_CANT FROM tiquete_pasajero WHERE TIQP_ID = OLD.plpa_tiquete and TIQP_FORMAP = 'R' INTO :CANT;
        if (CANT IS NULL) then
            CANT = 0;
        INGPAS = ingpas * :cant;
        UPDATE saldos_doc_cxpagar
            SET SDCP_MONTO = SDCP_MONTO - (OLD.plpa_valor-:INGPAS)
            WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = OLD.plpa_id AND SDCP_FECHA = :FEC;
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.plpa_valor-:INGPAS)
            WHERE MVPR_TIPOREF = 88 AND MVPR_IDREF = OLD.plpa_id;
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    update tiquete_pasajero set tiqp_planilla = 0 where tiqp_id = old.plpa_tiquete;
    end
if ((new.plpa_id <> 0) and (new.plpa_anulado = 'N')) then
    begin
    select plpa_vehiculo, PLPA_FECHA, V.TERC_NIT, P.plpa_pref, P.plpa_numero FROM vehiculos V, planilla_pasajeros P
        where P.plpa_id = new.plpa_id AND V.vehi_cod = P.plpa_vehiculo into :vehiculo, :FEC, :NIT, :pref, :numero;
    update tiquete_pasajero set tiqp_planilla = new.plpa_id, tiqp_vehiculo = :vehiculo where tiqp_id = new.plpa_tiquete;
    /* GENERE LA CXPAGAR AL ASOCIADO */
    CONC = 'TIQUETE A CREDITO No. ' || NEW.plpd_pref || NEW.plpd_numero;
    execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR PASAJES A CREDITO') returning_values (:ingpas);
    CANT = 0;
    SELECT TIQP_CANT FROM tiquete_pasajero WHERE TIQP_ID = NEW.plpa_tiquete and TIQP_FORMAP = 'R' INTO :CANT;
    if (CANT IS NULL) then
        CANT = 0;
    INGPAS = ingpas * :cant;
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = 88 and
        sdcp_idref = new.plpa_id and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_MONTO = SDCP_MONTO + (NEW.plpa_valor-:INGPAS)
            WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = NEW.plpa_id 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 (88, NEW.plpa_id, :fec, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', (NEW.plpa_valor-:INGPAS));
    /* Registre el movimiento del proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 88 AND MVPR_IDREF = NEW.plpa_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.plpa_valor-:INGPAS)
            WHERE MVPR_TIPOREF = 88 AND MVPR_IDREF = NEW.plpa_id;
    ELSE
        BEGIN
        CONC = 'PLANILLA DE PASAJEROS 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, 88, NEW.plpa_id, :fec, :fec, :CONC, (NEW.plpa_valor-:INGPAS), 0, 0, 0, 'S', 'N', :pref, :numero);
        END
    end
end
^

/* Trigger: PLANILLA_PASAJEROS_REM_AD */
CREATE TRIGGER PLANILLA_PASAJEROS_REM_AD FOR PLANILLA_PASAJEROS_REM
ACTIVE AFTER DELETE POSITION 0
as
declare variable ABONOS INTEGER;
begin
/* Marque los tiquetes como planillados */
if ((old.plpa_id <> 0) and (old.plpr_anulado = 'N')) then
    begin
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = OLD.plpa_id AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 88 and sdcp_idref = old.plpa_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 88) and (mvpr_idref = old.plpa_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    update carga_remesa set cgrm_planilla = 0 where cgrm_id = old.plpr_remesa;
    end
end
^

/* Trigger: PLANILLA_PASAJEROS_REM_AI */
CREATE TRIGGER PLANILLA_PASAJEROS_REM_AI FOR PLANILLA_PASAJEROS_REM
ACTIVE AFTER INSERT POSITION 0
as
declare variable INGREM INTEGER;
declare variable NIT VARCHAR(20);
declare variable CONC VARCHAR(60);
declare variable FEC DATE;
declare variable MONTO NUMERIC(18,2);
declare variable EXISTE CHAR(1);
declare variable PREF varchar(4);
declare variable NUMERO varchar(8);
begin
if ((new.plpa_id <> 0) and (new.plpr_anulado = 'N')) then
  begin
  select PLPA_FECHA, V.TERC_NIT, P.plpa_pref, P.plpa_numero FROM vehiculos V, planilla_pasajeros P
    where P.plpa_id = new.plpa_id AND V.vehi_cod = P.plpa_vehiculo into :FEC, :NIT, :pref, :numero;
  /* actualice el id de la planilla */
  update carga_remesa set cgrm_planilla = new.plpa_id where cgrm_id = new.plpr_remesa;
  /* genere la cuenta x pagar al asociado */
  execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR REMESAS DE PASAJEROS') returning_values (:ingrem);
  SELECT CGRM_TOTAL-CGRM_DOMICILIO-CGRM_SEGURO FROM carga_remesa WHERE CGRM_ID = NEW.plpr_remesa INTO :MONTO;
  execute procedure redondee(MONTO * (100-ingrem) / 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 = new.plpa_id and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_MONTO = SDCP_MONTO + :MONTO
            WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = NEW.plpa_id 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 (88, NEW.plpa_id, :fec, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', :MONTO);
    /* Registre el movimiento del proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 88 AND MVPR_IDREF = NEW.plpa_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO
            WHERE MVPR_TIPOREF = 88 AND MVPR_IDREF = NEW.plpa_id;
    ELSE
        BEGIN
        CONC = 'PLANILLA DE PASAJEROS 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, 88, NEW.plpa_id, :fec, :fec, :CONC, :MONTO, 0, 0, 0, 'S', 'N', :pref, :numero);
        END
    END
  end
end
^

/* Trigger: PLANILLA_PASAJEROS_REM_AU */
CREATE TRIGGER PLANILLA_PASAJEROS_REM_AU FOR PLANILLA_PASAJEROS_REM
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ABONOS INTEGER;
declare variable INGREM INTEGER;
declare variable NIT VARCHAR(20);
declare variable CONC VARCHAR(60);
declare variable FEC DATE;
declare variable MONTO NUMERIC(18,2);
declare variable EXISTE CHAR(1);
declare variable PREF varchar(4);
declare variable NUMERO varchar(8);
begin
/* Marque los tiquetes como planillados */
if ((old.plpa_id <> 0) and (old.plpr_anulado = 'N')) then
    begin
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = OLD.plpa_id AND SDCP_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cxpagar where sdcp_tiporef = 88 and sdcp_idref = old.plpa_id;
        delete from movimiento_PROVEEDOR where (mvpr_tiporef = 88) and (mvpr_idref = old.plpa_id);
        END
    else
        exception DOCUMENTO_CON_ABONOS;
    update carga_remesa set cgrm_planilla = 0 where cgrm_id = old.plpr_remesa;
    end
if ((new.plpa_id <> 0) and (new.plpr_anulado = 'N')) then
  begin
  select PLPA_FECHA, V.TERC_NIT, P.plpa_pref, P.plpa_numero FROM vehiculos V, planilla_pasajeros P
    where P.plpa_id = new.plpa_id AND V.vehi_cod = P.plpa_vehiculo into :FEC, :NIT, :pref, :numero;
  /* actualice el id de la planilla */
  update carga_remesa set cgrm_planilla = new.plpa_id where cgrm_id = new.plpr_remesa;
  /* genere la cuenta x pagar al asociado */
  execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR REMESAS DE PASAJEROS') returning_values (:ingrem);
  SELECT CGRM_TOTAL-CGRM_DOMICILIO-CGRM_SEGURO FROM carga_remesa WHERE CGRM_ID = NEW.plpr_remesa INTO :MONTO;
  execute procedure redondee(MONTO * (100-ingrem) / 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 = new.plpa_id and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_MONTO = SDCP_MONTO + :MONTO
            WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = NEW.plpa_id 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 (88, NEW.plpa_id, :fec, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', :MONTO);
    /* Registre el movimiento del proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 88 AND MVPR_IDREF = NEW.plpa_id INTO :EXISTE;
    if (EXISTE = 'S') then
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO
            WHERE MVPR_TIPOREF = 88 AND MVPR_IDREF = NEW.plpa_id;
    ELSE
        BEGIN
        CONC = 'PLANILLA DE PASAJEROS 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, 88, NEW.plpa_id, :fec, :fec, :CONC, :MONTO, 0, 0, 0, 'S', 'N', :pref, :numero);
        END
    END
  end
end
^

/* Trigger: PLANTILLA_DETALLE_BI */
CREATE TRIGGER PLANTILLA_DETALLE_BI FOR PLANTILLA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE TERCERO CHAR(1);
DECLARE VARIABLE RETENCION CHAR(1);
DECLARE VARIABLE CENTRO CHAR(1);
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
^

/* Trigger: PLANTILLA_DETALLE_N_BI */
CREATE TRIGGER PLANTILLA_DETALLE_N_BI FOR PLANTILLA_DETALLE_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE TERCERO CHAR(1);
DECLARE VARIABLE RETENCION CHAR(1);
DECLARE VARIABLE CENTRO CHAR(1);
declare variable TIPO CHAR(1);
BEGIN
/* VERIFIQUE QUE LA CUENTA EXISTA Y QUE SEA AFECTABLE */
EXECUTE PROCEDURE valide_cuenta_niif (NEW.CUEN_COD) RETURNING_VALUES (:OK);
IF (OK = '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_NIIF 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
^

/* Trigger: PLANTILLA_ENCABEZADO_AD */
CREATE TRIGGER PLANTILLA_ENCABEZADO_AD FOR PLANTILLA_ENCABEZADO
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 6, OLD.plan_id, 'D', OLD.prco_pref);
end
^

/* Trigger: PLANTILLA_ENCABEZADO_AI */
CREATE TRIGGER PLANTILLA_ENCABEZADO_AI FOR PLANTILLA_ENCABEZADO
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.PLAN_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 6, NEW.plan_id, 'I', NEW.prco_pref);
end
^

/* Trigger: PLANTILLA_ENCABEZADO_AU */
CREATE TRIGGER PLANTILLA_ENCABEZADO_AU FOR PLANTILLA_ENCABEZADO
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 6, NEW.plan_id, 'U', NEW.prco_pref);
end
^

/* Trigger: PLAN_PRODUCCION_AD */
CREATE TRIGGER PLAN_PRODUCCION_AD FOR PLAN_PRODUCCION
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec integer;
declare variable actual varchar(8);
declare variable autom char(1);
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
    begin
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_detalle_niif where enco_consec = :consec;
    end
delete from comprobante_encabezado where enco_tiporef = 27 and enco_idref = old.plpr_id;

/* reverse la numeraciÃ³n si esta automatica y es igual */
select pref_actual, pref_auto from prefijos where tido_cod = 27 and pref_pre = old.plpr_pref into :actual, :autom;
if ((autom = 'S') and ((cast(actual as integer) - cast(old.plpr_numero as integer)) = 1)) then
    update prefijos set pref_actual = old.plpr_numero where tido_cod = 27 and pref_pre = old.plpr_pref;

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
^

/* Trigger: PLAN_PRODUCCION_AI */
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
^

/* Trigger: PLAN_PRODUCCION_AU */
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
    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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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
^

/* Trigger: PLAN_PRODUCCION_BI */
CREATE TRIGGER PLAN_PRODUCCION_BI FOR PLAN_PRODUCCION
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
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;
if (new.plpr_entrada is null) then
    new.plpr_entrada = 'S';
end
^

/* Trigger: PLAN_PRODUCCION_CONS_AD */
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);
    DELETE FROM plan_produccion_cons_prod WHERE PLPD_ID = OLD.plpd_id AND PLPC_ITEM = OLD.plpc_item;
    end
end
^

/* Trigger: PLAN_PRODUCCION_CONS_BI */
CREATE 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);
declare variable FACTOR numeric(18,4);
begin
if (new.plpc_base is null) then
    new.plpc_base = 'N';
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);
/* CONVIERTA A GRAMOS O AL FACTOR DE LA UNIDAD */
EXECUTE procedure factor_unidad_cant(NEW.arti_cod, NEW.plpc_unidad) returning_values (:FACTOR);
if (FACTOR <> 0) then
    NEW.plpc_exist = NEW.plpc_exist / :FACTOR;
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
^

/* Trigger: PLAN_PRODUCCION_CONS_BU */
CREATE 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
^

/* Trigger: PLAN_PRODUCCION_DET_AD */
CREATE 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
^

/* Trigger: PLAN_PRODUCCION_DET_AI */
CREATE 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);
declare variable UNIPPAL VARCHAR(8);
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, a2.arti_unidad
            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, :UNIPPAL
            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, :unippal, :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, :unippal, 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
^

/* Trigger: PLAN_PRODUCCION_DET_AU */
CREATE 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(8);
declare variable BodDes varchar(2);
declare variable Fec Date;
declare variable SOBTOT CHAR(1);
declare variable base char(1);
declare variable UNIPPAL varchar(8);
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, A2.arti_unidad
            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, :UNIPPAL
            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, :unippal, :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, :unippal, 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
^

/* Trigger: PLAN_PRODUCCION_DET_BI */
CREATE 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
^

/* Trigger: PLAN_PRODUCCION_DET_BU */
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
^

/* Trigger: PRECIOS_ARTICULO_AD */
CREATE TRIGGER PRECIOS_ARTICULO_AD FOR PRECIOS_ARTICULO
ACTIVE AFTER DELETE POSITION 0
as
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, old.lipr_cod, 'D', OLD.arti_cod);
end
^

/* Trigger: PRECIOS_ARTICULO_AI */
CREATE TRIGGER PRECIOS_ARTICULO_AI FOR PRECIOS_ARTICULO
ACTIVE AFTER INSERT 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);
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, NEW.lipr_cod, 'I', NEW.arti_cod);
INSERT INTO cambia_precios (ARTI_COD, LIPR_COD, CAPR_PRECIO)
    VALUES (NEW.arti_cod, NEW.lipr_cod, NEW.prar_fijo);
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;
            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;
            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
end
^

/* Trigger: PRECIOS_ARTICULO_AU */
CREATE 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, NEW.lipr_cod, 'U', NEW.arti_cod);
if (new.prar_fijo <> old.prar_fijo) then
    INSERT INTO cambia_precios (ARTI_COD, LIPR_COD, CAPR_PRECIO) VALUES (NEW.arti_cod, NEW.lipr_cod, NEW.prar_fijo);

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
^

/* Trigger: PRECIOS_ARTICULO_BI */
CREATE 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 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);
declare variable CONSUMO NUMERIC(18, 2);
declare variable ICOINC CHAR(2);
declare variable REP CHAR(2);
declare variable REDON SMALLINT;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') RETURNING_VALUES (:REDON);
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_redon IS NULL) then
    NEW.prar_redon = :REDON;
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, ARTI_CONSUMO FROM ARTICULO A, TARIFA_IVA T
        WHERE ARTI_COD = NEW.ARTI_COD AND A.taiv_cod = T.taiv_cod INTO :UNIDAD, :TARIVA, :CONSUMO;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','CAMBIO DE PRECIOS AUTOMATICO AL CAMBIAR COSTO O PRECIO') returning_values (CAMBIO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'REPLICAR CAMBIOS EN ARTICULOS') RETURNING_VALUES (:REP);
    if (CAMBIO <> 'PRECIO') then
        BEGIN
        if ((REP <> 'SI') OR (NEW.prar_fijo = 0)) 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
                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
                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, NEW.prar_redon) returning_values (NEW.prar_fijo);
            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, NEW.prar_redon) returning_values (NEW.prar_fijo);
            END
        END
    END
END
^

/* Trigger: PRECIOS_ARTICULO_BU */
CREATE 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 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);
declare variable DEC1818 CHAR(1);
declare variable PRD1818 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('INVENTARIO', 'ARTICULOS', 'REPLICAR CAMBIOS EN ARTICULOS') RETURNING_VALUES (:REP);
    EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'CALCULAR PRECIOS CON IMPUESTOS INCLUIDOS APLICANDO EXENCIO DECRETO 1818') returning_values (PRD1818);
    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, GRUP_DEC1818 FROM GRUPO G, ARTICULO A WHERE G.GRUP_COD = A.grup_cod AND A.ARTI_COD = NEW.arti_cod
            INTO :BASE, :DEC1818;
        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);
        if ((dec1818 = 'S') AND (PRD1818 = 'SI')) then
            begin
            tariva = 0;
            end
        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
            COSTO = COSTO * (100 + NEW.prar_util)/100;
        ELSE
            COSTO = COSTO / ((100 - NEW.prar_margen)/100);
        if (new.prar_redon <> 5) then
            EXECUTE PROCEDURE REDONDEE (COSTO, NEW.prar_redon) returning_values (COSTO);
        else
            begin
            EXECUTE PROCEDURE REDONDEE (COSTO * 2, 2) returning_values (COSTO);
            COSTO = COSTO / 2;
            end
        NEW.PRAR_FIJO = :COSTO;
        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 * (100 + NEW.prar_util)/100;
            ELSE
                NEW.prar_fijo = NEW.prar_fijo / ((100 - NEW.prar_margen)/100);
            if (new.prar_redon <> 5) then
                EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo, NEW.prar_redon) returning_values (NEW.prar_fijo);
            else
                begin
                EXECUTE PROCEDURE REDONDEE (NEW.prar_fijo * 2, 2) returning_values (NEW.prar_fijo);
                NEW.prar_fijo = NEW.prar_fijo / 2;
                end
            END
        end
    END
else
    begin
    if (new.prar_redon <> 5) then
        EXECUTE PROCEDURE REDONDEE (new.prar_fijo, NEW.prar_redon) returning_values (new.prar_fijo);
    else
        begin
        EXECUTE PROCEDURE REDONDEE (new.prar_fijo * 2, 2) returning_values (COSTO);
        new.prar_fijo = COSTO / 2;
        end
    end
end
^

/* Trigger: PREFIJOS_AD */
CREATE TRIGGER PREFIJOS_AD FOR PREFIJOS
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_COD, AUDI_OPER)
    VALUES (USER, 120, OLD.tido_cod, OLD.pref_pre, 'U');
end
^

/* Trigger: PREFIJOS_AI */
CREATE TRIGGER PREFIJOS_AI FOR PREFIJOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable NUMROWS INTEGER;
begin
if (new.tico_cod is not null) then
    begin
    /* Inserte el prefijo contable */
    SELECT COUNT(PRCO_PREF) FROM PREFIJOS_CONTA WHERE TICO_COD = NEW.tico_cod AND PRCO_PREF = NEW.pref_pre INTO :NUMROWS;
    if (NUMROWS = 0) then
        begin
        if (new.tido_cod = 31) then
            INSERT INTO PREFIJOS_CONTA (TICO_COD, PRCO_PREF, PRCO_AUTO, PREF_NUMERO, PRCO_USUARIO, PRCO_ACTIVO)
                VALUES (new.tico_cod, new.pref_pre, 'N', substring(new.pref_actual from 3 for 6), USER, NEW.pref_activo);
        else
            INSERT INTO PREFIJOS_CONTA (TICO_COD, PRCO_PREF, PRCO_AUTO, PREF_NUMERO, PRCO_USUARIO, PRCO_ACTIVO)
                VALUES (new.tico_cod, new.pref_pre, 'N', new.pref_actual, USER, NEW.pref_activo);
        end
    end
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_COD, AUDI_OPER)
    VALUES (USER, 120, NEW.tido_cod, NEW.pref_pre, 'I');
end
^

/* Trigger: PREFIJOS_AU */
CREATE TRIGGER PREFIJOS_AU FOR PREFIJOS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable USR VARCHAR(10);
declare variable VENCE DATE;
declare variable FINAL VARCHAR(8);
declare variable NUMAVISA INTEGER;
begin
/* registre en auditoria si hay un salto diferente al incremento */
if ((cast(new.pref_actual as integer) - cast(old.pref_actual as integer)) <> 1) then
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_COD, AUDI_OPER)
        VALUES (USER, 142, NEW.tido_cod, NEW.pref_pre, 'U');
/* AVISAR SI ESTA POR VENCER */
if (NEW.tido_cod = 31) then
    BEGIN
    SELECT first 1 AUTO_FINAL, AUTO_VENCE, AUTO_AVISAR, AUTO_USRAVISO FROM AUTORIZACIONES
        WHERE PREF_PRE = NEW.pref_pre order by AUTO_VENCE DESC INTO :FINAL, :VENCE, :NUMAVISA, :USR;
    if (((:VENCE - CAST('NOW' AS DATE)) < 10) or ((CAST(:FINAL AS INTEGER) - CAST(NEW.pref_actual AS INTEGER)) < :NUMAVISA)) THEN
        BEGIN
        if ((USR IS NOT NULL) AND (USR <> '')) then
            BEGIN
            if (NOT EXISTS (SELECT * FROM MENSAJERIA WHERE MENS_FECHA = CAST('NOW' AS DATE) AND MENS_DESTINO = :USR AND MENS_MENSAJE = 'AUTORIZACION PREFIJO ' || NEW.pref_pre || ' PROXIMA A VENCER')) then
                INSERT INTO MENSAJERIA(MENS_ID, MENS_AUTOR, MENS_MENSAJE,
                    MENS_FECHA, MENS_HORA, MENS_NIVEL, MENS_DESTINO, MENS_LEIDO)
                    VALUES (gen_id(id_mensaje, 1), USER, 'AUTORIZACION PREFIJO ' || NEW.pref_pre || ' PROXIMA A VENCER',
                    CAST('NOW' AS DATE), CAST('NOW' AS TIME), 1, :USR, 'N');
            END
        END
    END
end
^

/* Trigger: PREFIJOS_BANCOS_AD */
CREATE TRIGGER PREFIJOS_BANCOS_AD FOR PREFIJOS_BANCOS
ACTIVE AFTER DELETE POSITION 0
as
declare variable DEVCTA CHAR(2);
begin
if (OLD.tido_cod = 77) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS', 'DEVOLUCIONES', 'CONSECUTIVOS POR CUENTA') returning_values (:DEVCTA);
    if (DEVCTA = 'NO') then
        DELETE FROM PREFIJOS WHERE TIDO_COD = 77 AND PREF_PRE = OLD.prba_pref;
    END
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_COD, AUDI_OPER)
    VALUES (USER, 121, OLD.tido_cod, OLD.prba_pref, 'D');
end
^

/* Trigger: PREFIJOS_BANCOS_AI */
CREATE TRIGGER PREFIJOS_BANCOS_AI FOR PREFIJOS_BANCOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable NUMROWS INTEGER;
declare variable DEVCTA CHAR(2);
begin
if (new.tico_cod is not null) then
    begin
    /* Inserte el prefijo contable */
    SELECT COUNT(PRCO_PREF) FROM PREFIJOS_CONTA WHERE TICO_COD = NEW.tico_cod AND PRCO_PREF = NEW.prba_pref INTO :NUMROWS;
    if (NUMROWS = 0) then
        INSERT INTO PREFIJOS_CONTA (TICO_COD, PRCO_PREF, PRCO_AUTO, PREF_NUMERO, PRCO_USUARIO,PRCO_ACTIVO)
            VALUES (new.tico_cod, new.prba_pref, 'N', new.prba_numero, USER, NEW.prba_activo);
    end
if (NEW.tido_cod = 77) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS', 'DEVOLUCIONES', 'CONSECUTIVOS POR CUENTA') returning_values (:DEVCTA);
    if (DEVCTA = 'NO') then
        BEGIN
        SELECT COUNT(*) FROM PREFIJOS_BANCOS WHERE TIDO_COD = 77 INTO :NUMROWS;
        IF (NUMROWS > 1) THEN
            EXCEPTION prefijo_devcheque;
        INSERT INTO PREFIJOS (TIDO_COD, PREF_PRE, PREF_AUTO, PREF_ACTUAL, PREF_USUARIO,PREF_ACTIVO,PREF_IVAINC,PREF_PROY, PREF_CENTRO,TICO_COD, SUCU_ID)
            VALUES (77, new.prba_pref, NEW.prba_auto, new.prba_numero, USER, NEW.prba_activo,'N',NEW.prba_proy, NEW.prba_centro, new.tico_cod, 0);
        END
    END
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_COD, AUDI_OPER)
    VALUES (USER, 121, NEW.tido_cod, NEW.prba_pref, 'I');
end
^

/* Trigger: PREFIJOS_BANCOS_AU */
CREATE TRIGGER PREFIJOS_BANCOS_AU FOR PREFIJOS_BANCOS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable DEVCTA CHAR(2);
declare variable NUMROWS INTEGER;
begin
if (NEW.tido_cod = 77) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS', 'DEVOLUCIONES', 'CONSECUTIVOS POR CUENTA') returning_values (:DEVCTA);
    if (DEVCTA = 'NO') then
        BEGIN
        SELECT COUNT(*) FROM PREFIJOS WHERE TIDO_COD = 77 AND PREF_PRE = NEW.PRBA_PREF INTO :NUMROWS;
        IF (NUMROWS = 0) THEN
            INSERT INTO PREFIJOS (TIDO_COD, PREF_PRE, PREF_AUTO, PREF_ACTUAL, PREF_USUARIO,PREF_ACTIVO,PREF_IVAINC,PREF_PROY, PREF_CENTRO,TICO_COD, SUCU_ID)
                VALUES (77, new.prba_pref, NEW.prba_auto, new.prba_numero, USER, NEW.prba_activo,'N',NEW.prba_proy, NEW.prba_centro, new.tico_cod, 0);
        ELSE
            UPDATE PREFIJOS SET PREF_ACTUAL = NEW.prba_numero, PREF_ACTIVO = NEW.prba_activo, PREF_AUTO = NEW.prba_auto, PREF_PROY = NEW.prba_proy, PREF_CENTRO = NEW.prba_centro
                WHERE TIDO_COD = 77 AND PREF_PRE = NEW.prba_pref;
        END
    END
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_COD, AUDI_OPER)
    VALUES (USER, 121, NEW.tido_cod, NEW.prba_pref, 'U');
end
^

/* Trigger: PREFIJOS_BANCOS_BI */
CREATE TRIGGER PREFIJOS_BANCOS_BI FOR PREFIJOS_BANCOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
EXECUTE PROCEDURE COMPLETA_CEROS (NEW.prba_numero) returning_values (NEW.prba_numero);
end
^

/* Trigger: PREFIJOS_BANCOS_BU */
CREATE TRIGGER PREFIJOS_BANCOS_BU FOR PREFIJOS_BANCOS
ACTIVE BEFORE UPDATE POSITION 0
as
begin
EXECUTE PROCEDURE COMPLETA_CEROS (NEW.prba_numero) returning_values (NEW.prba_numero);
end
^

/* Trigger: PREFIJOS_BD */
CREATE TRIGGER PREFIJOS_BD FOR PREFIJOS
ACTIVE BEFORE DELETE POSITION 0
as
declare variable NUMROWS integer;
begin
if (old.tido_cod = 31) then
    BEGIN
    select count(*) from autorizaciones where pref_pre = old.pref_pre into :numrows;
    if (numrows > 0) then
        exception autorizacion_ya_existe;
    END
end
^

/* Trigger: PREFIJOS_BI */
CREATE TRIGGER PREFIJOS_BI FOR PREFIJOS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (new.sucu_id is null) then
    new.sucu_id = 0;
if (new.pref_dec1818 is null) then
    new.pref_dec1818 = 'N';
if (NEW.tido_cod = 31) then
    EXECUTE PROCEDURE COMPLETA_CEROS8 (NEW.PREF_ACTUAL) returning_values (NEW.PREF_ACTUAL);
else
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PREF_ACTUAL) returning_values (NEW.PREF_ACTUAL);
END
^

/* Trigger: PREFIJOS_BU */
CREATE TRIGGER PREFIJOS_BU FOR PREFIJOS
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
if (new.sucu_id is null) then
    new.sucu_id = 0;
if (new.tido_cod = 31) then
    EXECUTE PROCEDURE completa_ceros8 (NEW.PREF_ACTUAL) returning_values (NEW.PREF_ACTUAL);
else
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PREF_ACTUAL) returning_values (NEW.PREF_ACTUAL);
END
^

/* Trigger: PREFIJOS_CONTA_AD */
CREATE TRIGGER PREFIJOS_CONTA_AD FOR PREFIJOS_CONTA
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_COD, AUDI_OPER)
    VALUES (USER, 122, OLD.tico_cod, 'D');
end
^

/* Trigger: PREFIJOS_CONTA_AI */
CREATE TRIGGER PREFIJOS_CONTA_AI FOR PREFIJOS_CONTA
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_COD, AUDI_OPER)
    VALUES (USER, 122, NEW.tico_cod, 'I');
end
^

/* Trigger: PREFIJOS_CONTA_AU */
CREATE TRIGGER PREFIJOS_CONTA_AU FOR PREFIJOS_CONTA
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_COD, AUDI_OPER)
    VALUES (USER, 122, NEW.tico_cod, 'U');
end
^

/* Trigger: PREFIJOS_CONTA_BI */
CREATE TRIGGER PREFIJOS_CONTA_BI FOR PREFIJOS_CONTA
ACTIVE BEFORE INSERT POSITION 1
AS
BEGIN
EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PREF_NUMERO) returning_values (NEW.PREF_NUMERO);
if (new.prco_usuario is null) then
    new.prco_usuario = USER;
if (new.prco_auto is null) then
    new.prco_AUTO = 'N';
if (new.prco_activo is null) then
    new.prco_activo = 'S';
END
^

/* Trigger: PREFIJOS_CONTA_BU */
CREATE TRIGGER PREFIJOS_CONTA_BU FOR PREFIJOS_CONTA
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
EXECUTE PROCEDURE COMPLETA_CEROS (NEW.PREF_NUMERO) returning_values (NEW.PREF_NUMERO);
END
^

/* Trigger: PRESTAMO_CUOTAS_BI */
CREATE TRIGGER PRESTAMO_CUOTAS_BI FOR PRESTAMO_CUOTAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable PPAGO INTEGER;
declare variable NIT VARCHAR(20);
declare variable aprox integer;
BEGIN
/* REDONDEE LA CUOTA CON LA MISMA APROXIMACION QUE USARA LA NOMINA AL ABONARLA */
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
execute procedure REDONDEE(NEW.prcu_monto, :APROX) returning_values (NEW.prcu_monto);

IF (NEW.prcu_ok IS NULL) THEN
    NEW.prcu_ok = 'N';
NEW.prcu_abono = 0;
/* VERIFIQUE QUE LA NOMINA DE ESE PERIODO NO SE HAYA CAUSADO */
SELECT E.TERC_NIT, EMPL_PPAGO FROM empleados E, prestamo_nomina P WHERE E.terc_nit = P.terc_nit AND P.prno_id = NEW.prno_id
    INTO :NIT, :PPAGO;
if (EXISTS (SELECT N.nomi_id FROM nomina N, nomina_detalle D WHERE N.nomi_id = D.nomi_id AND D.terc_nit = :NIT AND
    N.nomi_periodocidad = :PPAGO AND N.nomi_ano = NEW.prcu_ano AND N.nomi_periodo = NEW.prcu_periodo)) then
    exception periodo_pagado 'El periodo de nomina ' || new.prcu_ano || '-' || new.prcu_periodo || ' ya fue liquidado.';
END
^

/* Trigger: PRESTAMO_CUOTAS_BU */
CREATE TRIGGER PRESTAMO_CUOTAS_BU FOR PRESTAMO_CUOTAS
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable PPAGO INTEGER;
declare variable NIT VARCHAR(20);
begin
SELECT E.TERC_NIT, EMPL_PPAGO FROM empleados E, prestamo_nomina P WHERE E.terc_nit = P.terc_nit AND P.prno_id = NEW.prno_id
    INTO :NIT, :PPAGO;
if (NEW.prcu_abono > NEW.prcu_monto) then
    exception abono_prestamo_mayor 'El valor abonado total ' || new.prcu_abono || ' es mayor al monto de la cuota ' || new.prcu_monto || ' nit;' || :nit;
end
^

/* Trigger: PRESUPUESTO_AD */
CREATE TRIGGER PRESUPUESTO_AD FOR PRESUPUESTO
ACTIVE AFTER DELETE POSITION 0
AS
declare variable padre varchar(20);
declare variable existe char(1);
BEGIN
  execute procedure padre(old.cuen_cod) returning_values (:padre);
  if (padre <> '') then
    begin
    /* DESHAGA LO VIEJO */
    existe = 'N';
    select 'S' from presupuesto where cuen_cod = :padre and pres_ano = old.PRES_ANO AND PRES_PERIODO = old.PRES_PERIODO INTO :existe;
    if (existe = 'S') then
        update presupuesto
            set pres_debito = pres_debito - old.pres_debito,
                pres_credito = pres_credito - old.pres_credito
            where cuen_cod = :padre and pres_ano = old.pres_ano and pres_periodo = old.pres_periodo;
    end
END
^

/* Trigger: PRESUPUESTO_AI */
CREATE TRIGGER PRESUPUESTO_AI FOR PRESUPUESTO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable padre varchar(20);
declare variable existe char(1);
BEGIN
  /* SUME AL PADRE EL DB Y CR */
  execute procedure padre(new.cuen_cod) returning_values (:padre);
  if (Padre <> '') then
    begin
    /* busque el padre y ac`tualice o registre el saldo*/
    existe = 'N';
    select 'S' from presupuesto where cuen_cod = :padre and pres_ano = NEW.PRES_ANO AND PRES_PERIODO = NEW.PRES_PERIODO INTO :existe;
    if (existe = 'S') then
        update presupuesto
            set pres_debito = pres_debito + new.pres_debito,
                pres_credito = pres_credito + new.pres_credito
            where cuen_cod = :padre and pres_ano = new.pres_ano and pres_periodo = new.pres_periodo;
    else
        insert into presupuesto(cuen_cod, pres_ano, pres_periodo, pres_debito, pres_credito, pres_afecta)
            values (:padre, new.pres_ano, new.pres_periodo, new.pres_debito, new.pres_credito, 'N');
    end
END
^

/* Trigger: PRESUPUESTO_AU */
CREATE TRIGGER PRESUPUESTO_AU FOR PRESUPUESTO
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable padre varchar(20);
declare variable existe char(1);
BEGIN
  execute procedure padre(old.cuen_cod) returning_values (:padre);
  if (padre <> '') then
    begin
    /* DESHAGA LO VIEJO */
    existe = 'N';
    select 'S' from presupuesto where cuen_cod = :padre and pres_ano = old.PRES_ANO AND PRES_PERIODO = old.PRES_PERIODO INTO :existe;
    if (existe = 'S') then
        update presupuesto
            set pres_debito = pres_debito - old.pres_debito,
                pres_credito = pres_credito - old.pres_credito
            where cuen_cod = :padre and pres_ano = old.pres_ano and pres_periodo = old.pres_periodo;
        
    /* actualice los db y cr del padre */
    existe = 'N';
    select 'S' from presupuesto where cuen_cod = :padre and pres_ano = NEW.PRES_ANO AND PRES_PERIODO = NEW.PRES_PERIODO INTO :existe;
    if (existe = 'S') then
        update presupuesto
            set pres_debito = pres_debito + new.pres_debito,
                pres_credito = pres_credito + new.pres_credito
            where cuen_cod = :padre and pres_ano = new.pres_ano and pres_periodo = new.pres_periodo;
    else
        insert into presupuesto(cuen_cod, pres_ano, pres_periodo, pres_debito, pres_credito, pres_afecta)
            values (:padre, new.pres_ano, new.pres_periodo, new.pres_debito, new.pres_credito, 'N');
    end
END
^

/* Trigger: PRODUCCION_DEVOLUCION_AD */
CREATE 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
    begin
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_detalle_niif where enco_consec = :consec;
    end
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
^

/* Trigger: PRODUCCION_DEVOLUCION_AI */
CREATE 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
^

/* Trigger: PRODUCCION_DEVOLUCION_AU */
CREATE 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
      begin
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      end
    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
^

/* Trigger: PRODUCCION_DEVOLUCION_BI */
CREATE 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
^

/* Trigger: PRODUCCION_DEVOLUCION_DET_AD */
CREATE 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
^

/* Trigger: PRODUCCION_DEVOLUCION_DET_AI */
CREATE 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(8);
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
^

/* Trigger: PRODUCCION_DEVOLUCION_DET_AU */
CREATE 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(8);
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
^

/* Trigger: PRODUCCION_DEVOLUCION_DET_BI */
CREATE 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
^

/* Trigger: PRODUCCION_ENTRADA_DET_AD */
CREATE 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
^

/* Trigger: PRODUCCION_ENTRADA_DET_AI */
CREATE 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(8);
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
^

/* Trigger: PRODUCCION_ENTRADA_DET_AU */
CREATE 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(8);
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
^

/* Trigger: PRODUCCION_ENTRADA_DET_BI */
CREATE 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
^

/* Trigger: PRODUCCION_ENTRADA_ENC_AD */
CREATE 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
    begin
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_detalle_niif where enco_consec = :consec;
    end
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
^

/* Trigger: PRODUCCION_ENTRADA_ENC_AI */
CREATE 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
^

/* Trigger: PRODUCCION_ENTRADA_ENC_AU */
CREATE 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
      BEGIN
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      END
    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
^

/* Trigger: PRODUCCION_ENTRADA_ENC_BI */
CREATE 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;
/* INSERTE EL COSTO ACTUAL */
EXECUTE procedure costo_promedio(NEW.pror_producto, NEW.prde_fecha) returning_values(NEW.prde_costo);
END
^

/* Trigger: PRODUCCION_ORDEN_AD */
CREATE 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
    begin
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_detalle_niif where enco_consec = :consec;
    end
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
^

/* Trigger: PRODUCCION_ORDEN_AI */
CREATE 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
^

/* Trigger: PRODUCCION_ORDEN_AU */
CREATE 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
      BEGIN
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      END
    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_niif(:artic, :fec, :total, :cant, 'S', 'S', :IDMOV, 20);
                EXECUTE PROCEDURE actualice_costo(:artic, :fec, :total, :cant, 'S', 'N', :IDMOV, 20);
                EXECUTE PROCEDURE chequeo_costos(:artic, :fec-1);
                EXECUTE PROCEDURE actualice_costo_niif(:artic, :fec, :total, :cant, 'S', 'N', :IDMOV, 20);
                EXECUTE PROCEDURE chequeo_costos_niif(:artic, :fec-1);
                END
            END
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 19, NEW.pror_id, 'U', NEW.pref_pre || NEW.pror_numero);
    end
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.pror_numero <> NEW.pror_numero) or
    (OLD.pror_fecha <> NEW.pror_fecha) ) then
    UPDATE produccion_orden_detalle SET PODE_TRANSMIT = 'N' WHERE PROR_ID = OLD.pror_id;

if (OLD.pror_anulado <> NEW.pror_anulado) then
    UPDATE produccion_orden_detalle SET PODE_ANULADO = NEW.pror_anulado WHERE PROR_ID = OLD.pror_id;

if (OLD.pror_transmit <> NEW.pror_transmit) then
    UPDATE produccion_orden_detalle SET PODE_TRANSMIT = NEW.pror_transmit WHERE PROR_ID = OLD.pror_id;
end
^

/* Trigger: PRODUCCION_ORDEN_BI */
CREATE 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
^

/* Trigger: PRODUCCION_ORDEN_DETALLE_AD */
CREATE 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
^

/* Trigger: PRODUCCION_ORDEN_DETALLE_AI */
CREATE 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(8);
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
^

/* Trigger: PRODUCCION_ORDEN_DETALLE_AU */
CREATE 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(8);
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
^

/* Trigger: PRODUCCION_ORDEN_DETALLE_BI */
CREATE 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
^

/* Trigger: PRODUCCION_SALIDA_DET_AD */
CREATE 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
^

/* Trigger: PRODUCCION_SALIDA_DET_AI */
CREATE 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(8);
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
^

/* Trigger: PRODUCCION_SALIDA_DET_AU */
CREATE 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(8);
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
^

/* Trigger: PRODUCCION_SALIDA_DET_BI */
CREATE 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
^

/* Trigger: PRODUCCION_SALIDA_ENC_AD */
CREATE 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
    begin
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_detalle_niif where enco_consec = :consec;
    end
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
^

/* Trigger: PRODUCCION_SALIDA_ENC_AI */
CREATE 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
^

/* Trigger: PRODUCCION_SALIDA_ENC_AU */
CREATE 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
      BEGIN
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      END
    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
^

/* Trigger: PRODUCCION_SALIDA_ENC_BI */
CREATE 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
^

/* Trigger: PROGRAMACION_PAGOS_AD */
CREATE TRIGGER PROGRAMACION_PAGOS_AD FOR PROGRAMACION_PAGOS
ACTIVE AFTER DELETE POSITION 0
as
begin
if ((OLD.prpg_idegre IS NOT NULL) AND (OLD.prpg_idegre <> 0)) then
    BEGIN
    /* BORRE EL EGRESO */
    DELETE FROM egresos_detalle WHERE EGRE_ID = OLD.prpg_idegre;
    DELETE FROM egresos_caja WHERE EGRE_ID = OLD.prpg_idegre;
    DELETE FROM egresos_banco WHERE EGRE_ID = OLD.prpg_idegre;
    DELETE FROM egresos WHERE EGRE_ID = OLD.prpg_idegre;
    END
end
^

/* Trigger: PROGRAMACION_PAGOS_AI */
CREATE TRIGGER PROGRAMACION_PAGOS_AI FOR PROGRAMACION_PAGOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable numero varchar(8);
declare variable NIT varchar(20);
declare variable NOMTERC varchar(60);
declare variable NOMTIPO varchar(8);
declare variable CONC VARCHAR(60);
declare variable PREFDOC varchar(4);
declare variable NUMDOC varchar(8);
declare variable ERROR CHAR(1);
declare variable NUMPROV varchar(15);
declare variable MONTO NUMERIC(18,2);
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable RTFTEF NUMERIC(18,2);
declare variable RTIVAF NUMERIC(18,2);
declare variable RTICAF NUMERIC(18,2);
declare variable RTCREE NUMERIC(18,2);
declare variable DTOF NUMERIC(18,2);
declare variable IDEGRE INTEGER;
declare variable ITEM INTEGER;
begin
if (NEW.prpg_egreso = 'S') then
    BEGIN
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 and pref_activo = 'S' AND PREF_PRE = new.prpg_pref INTO :numero;
    SELECT M.TERC_NIT, TERC_NOM, M.mvpr_monto, TD.tido_nomcorto, M.mvpr_prefijo, M.mvpr_numero FROM TERCEROS T, movimiento_proveedor M, TIPO_DOCUMENTO TD
        WHERE M.terc_nit = T.terc_nit AND M.mvpr_tiporef = NEW.prpg_tipodoc AND M.mvpr_idref = NEW.prpg_iddoc AND TD.tido_cod = M.mvpr_tiporef
        INTO :NIT, :NOMTERC, :MONTO, :nomtipo, :PREFDOC, :NUMDOC;
    if (MONTO <> NEW.prpg_abono) then
        CONC = 'ABONO A ' || :NOMTIPO || ' ' || :PREFDOC || :NUMDOC;
    else
        CONC = 'CANCELA A ' || :NOMTIPO || ' ' || :PREFDOC || :NUMDOC;
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 and pref_activo = 'S' AND PREF_PRE = new.prpg_pref INTO :numero;
    EXECUTE PROCEDURE busca_id_doc_cxpagar(21, :prefdoc, :numdoc, :nit, NEW.prpg_fecha)
        returning_values (:IDDOC, :SALDO, :rtftef, :rtivaf, :rticaf, :rtcree, :DTOF, :ERROR, :NUMPROV);

    /* BUSQUE UN EGRESO DEL TERCERO DE LA MISMA FECHA Y PREFIJO PARA EL TERCERO  */
    IDEGRE = 0;
    SELECT FIRST 1 E.EGRE_ID FROM EGRESOS E, EGRESOS_DETALLE ED WHERE E.egre_id = ED.egre_id AND E.pref_pre = NEW.prpg_pref AND
        E.terc_nit = :nit AND E.egre_fecha = NEW.prpg_fecha INTO :IDEGRE;
    if ((IDEGRE IS NULL) OR (IDEGRE = 0)) then
        BEGIN
        INSERT INTO EGRESOS (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO,
            EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_RTCREE, EGRE_DTOF, EGRE_OBS, EGRE_TIPOMOVBCO, EGRE_IDMOVBCO,
            EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_USUARIO, NUMOK, CLEG_ID, EGRE_TRM)
            VALUES (NEW.prpg_idegre, 62, NEW.prpg_pref, :NUMERO, NEW.prpg_fecha, :CONC, NEW.prpg_abono,
            :rtftef, :rtivaf, :rticaf, :rtcree, :dtof, NULL, NULL, NULL,
            :nomterc, 'N', 'N', :nit, '1', new.prpg_idcaja, USER, 'N', 0, 1);
        ITEM = 1;
        END
    ELSE
        BEGIN
        UPDATE EGRESOS SET EGRE_MONTO = EGRE_MONTO + NEW.prpg_abono,
            EGRE_RTFTEMONTO = EGRE_RTFTEMONTO + :rtftef,
            EGRE_RTIVAMONTO = EGRE_RTIVAMONTO + :rtivaf,
            EGRE_RTICAMONTO = EGRE_RTICAMONTO + :rticaf,
            EGRE_RTCREE = EGRE_RTCREE + :rtcree,
            EGRE_DTOF = EGRE_DTOF + :rtcree WHERE EGRE_ID = :IDEGRE;
        SELECT MAX(EGDE_ITEM+1) FROM egresos_detalle WHERE egre_id = :idegre INTO :ITEM;
        if ((ITEM IS NULL) OR (ITEM = 0)) then
            ITEM = 1;
        END
    INSERT INTO EGRESOS_DETALLE (EGRE_ID, EGDE_ITEM, EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO,
        EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF, EGDE_ANULADO, EGDE_TRANSMIT, EGDE_DIFCAMBIO, EGDE_NUMPROV, EGDE_RCREE)
        VALUES (NEW.prpg_idegre, :item, new.prpg_tipodoc, new.prpg_iddoc, :prefdoc, :numdoc, NEW.prpg_abono,
        :RTFTEF, :RTIVAF, :RTICAF, :DTOF, 'N', 'N', NULL, :numprov, :RTCREE);
    
    if (new.prpg_cob = 'C') then
        begin
        if ((IDEGRE IS NULL) OR (IDEGRE = 0)) then
            BEGIN
            INSERT INTO EGRESOS_CAJA (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO,
                EGCA_FECHA, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                VALUES (NEW.prpg_idegre, 1, NEW.prpg_idcaja, 1, NULL, NULL, NULL, NEW.prpg_fecha, NEW.prpg_abono, 'N', 'N');
            END
        ELSE
            BEGIN
            SELECT MAX(EGCA_ITEM) FROM EGRESOS_CAJA WHERE egre_id = :idegre AND CAJA_ID = NEW.prpg_idcaja
                INTO :ITEM;
            if ((ITEM IS NULL) OR (ITEM = 0)) then
                BEGIN
                SELECT MAX(EGCA_ITEM) FROM EGRESOS_CAJA WHERE egre_id = :idegre INTO :ITEM;
                INSERT INTO EGRESOS_CAJA (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO,
                    EGCA_FECHA, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                    VALUES (NEW.prpg_idegre, :ITEM+1, NEW.prpg_idcaja, 1, NULL, NULL, NULL, NEW.prpg_fecha, NEW.prpg_abono, 'N', 'N');
                END
            ELSE
                UPDATE egresos_caja SET EGCA_MONTO = EGCA_MONTO + NEW.prpg_abono
                    WHERE EGRE_ID = :idegre;
            END
        end
    else
        begin
        SELECT b.prba_numero FROM prefijos_bancos b WHERE b.tido_cod = new.prpg_tipobco and b.prba_activo = 'S' AND b.prba_pref = new.prpg_prefbco INTO :numero;
        if ((IDEGRE IS NULL) OR (IDEGRE = 0)) then
            BEGIN
            INSERT INTO EGRESOS_BANCO (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_NUMERO, EGBC_FECHA, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                VALUES (NEW.prpg_idegre, new.prpg_tipobco, new.prpg_idcaja, :numero, new.prpg_fecha, new.prpg_prefbco, :NOMTERC, NEW.prpg_abono, :conc, 'N', 'N', 'N');
            END
        ELSE
            BEGIN
            if (NOT EXISTS (SELECT EGRE_ID FROM EGRESOS_BANCO WHERE egre_id = :idegre)) 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 (:idegre, new.prpg_tipobco, new.prpg_idcaja, :numero, new.prpg_fecha, new.prpg_prefbco, :NOMTERC, NEW.prpg_abono, :conc, 'N', 'N', 'N');
            ELSE
                UPDATE EGRESOS_BANCO SET EGBC_MONTO = EGBC_MONTO + NEW.prpg_abono WHERE EGRE_ID = :IDEGRE;
            END
        end
    END
end
^

/* Trigger: PROGRAMACION_PAGOS_AU */
CREATE TRIGGER PROGRAMACION_PAGOS_AU FOR PROGRAMACION_PAGOS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable numero varchar(8);
declare variable NIT varchar(20);
declare variable NOMTERC varchar(60);
declare variable NOMTIPO varchar(8);
declare variable CONC VARCHAR(60);
declare variable PREFDOC varchar(4);
declare variable NUMDOC varchar(8);
declare variable ERROR CHAR(1);
declare variable NUMPROV varchar(15);
declare variable MONTO NUMERIC(18,2);
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable RTFTEF NUMERIC(18,2);
declare variable RTIVAF NUMERIC(18,2);
declare variable RTICAF NUMERIC(18,2);
declare variable RTCREE NUMERIC(18,2);
declare variable DTOF NUMERIC(18,2);
declare variable IDEGRE INTEGER;
declare variable ITEM INTEGER;
begin
if ((OLD.prpg_egreso = 'N') AND (NEW.prpg_egreso = 'S')) then
    BEGIN
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 and pref_activo = 'S' AND PREF_PRE = new.prpg_pref INTO :numero;
    SELECT M.TERC_NIT, TERC_NOM, M.mvpr_monto, TD.tido_nomcorto, M.mvpr_prefijo, M.mvpr_numero FROM TERCEROS T, movimiento_proveedor M, TIPO_DOCUMENTO TD
        WHERE M.terc_nit = T.terc_nit AND M.mvpr_tiporef = NEW.prpg_tipodoc AND M.mvpr_idref = NEW.prpg_iddoc AND TD.tido_cod = M.mvpr_tiporef
        INTO :NIT, :NOMTERC, :MONTO, :nomtipo, :PREFDOC, :NUMDOC;
    if (MONTO <> NEW.prpg_abono) then
        CONC = 'ABONO A ' || :NOMTIPO || ' ' || :PREFDOC || :NUMDOC;
    else
        CONC = 'CANCELA A ' || :NOMTIPO || ' ' || :PREFDOC || :NUMDOC;
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 and pref_activo = 'S' AND PREF_PRE = new.prpg_pref INTO :numero;
    EXECUTE PROCEDURE busca_id_doc_cxpagar(21, :prefdoc, :numdoc, :nit, NEW.prpg_fecha)
        returning_values (:IDDOC, :SALDO, :rtftef, :rtivaf, :rticaf, :rtcree, :DTOF, :ERROR, :NUMPROV);
    
    /* BUSQUE UN EGRESO DEL TERCERO DE LA MISMA FECHA Y PREFIJO PARA EL TERCERO  */
    IDEGRE = 0;
    SELECT FIRST 1 E.EGRE_ID FROM EGRESOS E, EGRESOS_DETALLE ED WHERE E.egre_id = ED.egre_id AND E.pref_pre = NEW.prpg_pref AND
        E.terc_nit = :nit AND E.egre_fecha = NEW.prpg_fecha INTO :IDEGRE;
    if ((IDEGRE IS NULL) OR (IDEGRE = 0)) then
        BEGIN
        INSERT INTO EGRESOS (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO,
            EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_RTCREE, EGRE_DTOF, EGRE_OBS, EGRE_TIPOMOVBCO, EGRE_IDMOVBCO,
            EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_USUARIO, NUMOK, CLEG_ID, EGRE_TRM)
            VALUES (NEW.prpg_idegre, 62, NEW.prpg_pref, :NUMERO, NEW.prpg_fecha, :CONC, NEW.prpg_abono,
            :rtftef, :rtivaf, :rticaf, :rtcree, :dtof, NULL, NULL, NULL,
            :nomterc, 'N', 'N', :nit, '1', new.prpg_idcaja, USER, 'N', 0, 1);
        ITEM = 1;
        END
    ELSE
        BEGIN
        UPDATE EGRESOS SET EGRE_MONTO = EGRE_MONTO + NEW.prpg_abono,
            EGRE_RTFTEMONTO = EGRE_RTFTEMONTO + :rtftef,
            EGRE_RTIVAMONTO = EGRE_RTIVAMONTO + :rtivaf,
            EGRE_RTICAMONTO = EGRE_RTICAMONTO + :rticaf,
            EGRE_RTCREE = EGRE_RTCREE + :rtcree,
            EGRE_DTOF = EGRE_DTOF + :rtcree WHERE EGRE_ID = :IDEGRE;
        SELECT MAX(EGDE_ITEM+1) FROM egresos_detalle WHERE egre_id = :idegre INTO :ITEM;
        if ((ITEM IS NULL) OR (ITEM = 0)) then
            ITEM = 1;
        END
    INSERT INTO EGRESOS_DETALLE (EGRE_ID, EGDE_ITEM, EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO,
        EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF, EGDE_ANULADO, EGDE_TRANSMIT, EGDE_DIFCAMBIO, EGDE_NUMPROV, EGDE_RCREE)
        VALUES (NEW.prpg_idegre, :ITEM, new.prpg_tipodoc, new.prpg_iddoc, :prefdoc, :numdoc, NEW.prpg_abono,
        :RTFTEF, :RTIVAF, :RTICAF, :DTOF, 'N', 'N', NULL, :numprov, :RTCREE);
    
    if (new.prpg_cob = 'C') then
        begin
        if ((IDEGRE IS NULL) OR (IDEGRE = 0)) then
            BEGIN
            INSERT INTO EGRESOS_CAJA (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO,
                EGCA_FECHA, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                VALUES (NEW.prpg_idegre, 1, NEW.prpg_idcaja, 1, NULL, NULL, NULL, NEW.prpg_fecha, NEW.prpg_abono, 'N', 'N');
            END
        ELSE
            BEGIN
            SELECT MAX(EGCA_ITEM) FROM EGRESOS_CAJA WHERE egre_id = :idegre AND CAJA_ID = NEW.prpg_idcaja
                INTO :ITEM;
            if ((ITEM IS NULL) OR (ITEM = 0)) then
                BEGIN
                SELECT MAX(EGCA_ITEM) FROM EGRESOS_CAJA WHERE egre_id = :idegre INTO :ITEM;
                INSERT INTO EGRESOS_CAJA (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO,
                    EGCA_FECHA, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                    VALUES (NEW.prpg_idegre, :ITEM+1, NEW.prpg_idcaja, 1, NULL, NULL, NULL, NEW.prpg_fecha, NEW.prpg_abono, 'N', 'N');
                END
            ELSE
                UPDATE egresos_caja SET EGCA_MONTO = EGCA_MONTO + NEW.prpg_abono
                    WHERE EGRE_ID = :idegre;
            END
        end
    else
        begin
        SELECT b.prba_numero FROM prefijos_bancos b WHERE b.tido_cod = new.prpg_tipobco and b.prba_activo = 'S' AND b.prba_pref = new.prpg_prefbco INTO :numero;
        if ((IDEGRE IS NULL) OR (IDEGRE = 0)) then
            BEGIN
            INSERT INTO EGRESOS_BANCO (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_NUMERO, EGBC_FECHA, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                VALUES (NEW.prpg_idegre, new.prpg_tipobco, new.prpg_idcaja, :numero, new.prpg_fecha, new.prpg_prefbco, :NOMTERC, NEW.prpg_abono, :conc, 'N', 'N', 'N');
            END
        ELSE
            BEGIN
            if (NOT EXISTS (SELECT EGRE_ID FROM EGRESOS_BANCO WHERE egre_id = :idegre)) 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 (:idegre, new.prpg_tipobco, new.prpg_idcaja, :numero, new.prpg_fecha, new.prpg_prefbco, :NOMTERC, NEW.prpg_abono, :conc, 'N', 'N', 'N');
            ELSE
                UPDATE EGRESOS_BANCO SET EGBC_MONTO = EGBC_MONTO + NEW.prpg_abono WHERE EGRE_ID = :IDEGRE;
            END
        end
    END
end
^

/* Trigger: PROGRAMACION_PAGOS_BI */
CREATE TRIGGER PROGRAMACION_PAGOS_BI FOR PROGRAMACION_PAGOS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable IDEGRE INTEGER;
declare variable NIT VARCHAR(20);
begin
if (NEW.prpg_egreso = 'S') then
    BEGIN
    SELECT TERC_NIT FROM movimiento_proveedor WHERE mvpr_tiporef = NEW.prpg_tipodoc AND mvpr_idref = NEW.prpg_iddoc INTO :NIT;
    IDEGRE = 0;
    SELECT FIRST 1 E.EGRE_ID FROM EGRESOS E, EGRESOS_DETALLE ED WHERE E.egre_id = ED.egre_id AND E.pref_pre = NEW.prpg_pref AND
        E.terc_nit = :nit AND E.egre_fecha = NEW.prpg_fecha INTO :IDEGRE;
    if ((IDEGRE IS NULL) OR (IDEGRE = 0)) then
        NEW.prpg_idegre = GEN_ID(id_egresos, 1);
    ELSE
        NEW.prpg_idegre = :IDEGRE;
    END
ELSE
    NEW.prpg_idegre = 0;
end
^

/* Trigger: PROGRAMACION_PAGOS_BU */
CREATE TRIGGER PROGRAMACION_PAGOS_BU FOR PROGRAMACION_PAGOS
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable IDEGRE INTEGER;
declare variable NIT VARCHAR(20);
begin
if ((OLD.prpg_egreso = 'N') AND (NEW.prpg_egreso = 'S')) then
    BEGIN
    SELECT TERC_NIT FROM movimiento_proveedor WHERE mvpr_tiporef = NEW.prpg_tipodoc AND mvpr_idref = NEW.prpg_iddoc INTO :NIT;
    IDEGRE = 0;
    SELECT FIRST 1 E.EGRE_ID FROM EGRESOS E, EGRESOS_DETALLE ED WHERE E.egre_id = ED.egre_id AND E.pref_pre = NEW.prpg_pref AND
        E.terc_nit = :nit AND E.egre_fecha = NEW.prpg_fecha INTO :IDEGRE;
    if ((IDEGRE IS NULL) OR (IDEGRE = 0)) then
        NEW.prpg_idegre = GEN_ID(id_egresos, 1);
    ELSE
        NEW.prpg_idegre = :IDEGRE;
    END
end
^

/* Trigger: PROGRAM_VACACIONES_BI */
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
^

/* Trigger: PROVEEDORES_AD */
CREATE TRIGGER PROVEEDORES_AD FOR PROVEEDORES
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 104, 1, 'D', OLD.terc_nit);
end
^

/* Trigger: PROVEEDORES_AI */
CREATE TRIGGER PROVEEDORES_AI FOR PROVEEDORES
ACTIVE AFTER INSERT POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 104, 1, 'I', NEW.terc_nit);
end
^

/* Trigger: PROVEEDORES_AU */
CREATE TRIGGER PROVEEDORES_AU FOR PROVEEDORES
ACTIVE AFTER UPDATE POSITION 0
as
declare variable DATOS VARCHAR(4096);
begin
DATOS = 'TERC_NIT=' || OLD.TERC_NIT || '|GRPR_COD=' || OLD.GRPR_COD || '|PROV_COD=' || OLD.PROV_COD || '|PROV_CODIGOINT=' || OLD.PROV_CODIGOINT || '|PROV_VENDEDOR=' || OLD.PROV_VENDEDOR || 
'|PROV_CARTERA=' || OLD.PROV_CARTERA || '|PROV_RETEFTE=' || OLD.PROV_RETEFTE || '|PROV_RTEIVA=' || OLD.PROV_RTEIVA || '|PROV_RTEICA=' || OLD.PROV_RTEICA || '|PROV_RTFTEBASE=' || OLD.PROV_RTFTEBASE || 
'|PROV_CTAPAGAR=' || OLD.PROV_CTAPAGAR || '|PROV_CTARTFTE=' || OLD.PROV_CTARTFTE || '|PROV_CTARTIVA=' || OLD.PROV_CTARTIVA || '|PROV_CTARTICA=' || OLD.PROV_CTARTICA || 
'|PROV_DIASPAGO=' || OLD.PROV_DIASPAGO || '|PROV_SIMPLIFICADO=' || OLD.PROV_SIMPLIFICADO || '|PROV_CTACAUSA=' || OLD.PROV_CTACAUSA || '|PROV_USUARIO=' || OLD.PROV_USUARIO || 
'|PROV_RTICABASE=' || OLD.PROV_RTICABASE || '|PROV_RTCREE=' || OLD.PROV_RTCREE || '|PROV_CTARTCREE=' || OLD.PROV_CTARTCREE || '|PROV_CTAPAGNIIF=' || OLD.PROV_CTAPAGNIIF || 
'|PROV_CTARFTENIIF=' || OLD.PROV_CTARFTENIIF || '|PROV_CTARIVANIIF=' || OLD.PROV_CTARIVANIIF || '|PROV_CTARICANIIF=' || OLD.PROV_CTARICANIIF || '|PROV_CTARCREENIIF=' || OLD.PROV_CTARCREENIIF || 
'|PROV_CTACAUSANIIF=' || OLD.PROV_CTACAUSANIIF;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_DATOS)
    VALUES (USER, 104, 1, 'U', NEW.terc_nit, :DATOS);
end
^

/* Trigger: PROVEEDORES_BD */
CREATE 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
^

/* Trigger: PROVEEDORES_BI */
CREATE TRIGGER PROVEEDORES_BI FOR PROVEEDORES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable ctaPAG VARCHAR(20);
declare variable ctaRTF VARCHAR(20);
declare variable ctaRIV VARCHAR(20);
declare variable ctaRIC VARCHAR(20);
begin
if (NEW.grpr_cod <> '') then
    BEGIN
    SELECT GRPR_CTAPROV, GRPR_CTARTFTE, GRPR_CTARTIVA, GRPR_CTARTICA FROM grupos_proveedores WHERE GRPR_COD = NEW.grpr_cod
        INTO :CTAPAG, :CTARTF, :ctariv,  :CTARIC;
    
    if (NEW.prov_ctapagar IS NULL) then
        NEW.prov_ctapagar = CTAPAG;
    if (NEW.prov_ctartfte IS NULL) then
        NEW.prov_ctartfte = CTARTF;
    if (NEW.prov_ctartiva IS NULL) then
        NEW.prov_ctartiva = CTARIV;
    if (NEW.prov_ctartica IS NULL) then
        NEW.prov_ctartica = CTARIC;
    END
end
^

/* Trigger: PROVEEDOR_ARTICULO_BI */
CREATE TRIGGER PROVEEDOR_ARTICULO_BI FOR PROVEEDOR_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.pvar_trm IS NULL) then
    NEW.pvar_trm = 1;
if (NEW.pvar_factor IS NULL) then
    NEW.pvar_factor = 1;
end
^

/* Trigger: PRUEBAS_BI */
CREATE TRIGGER PRUEBAS_BI FOR PRUEBAS
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.prue_id = GEN_ID(id_prueba, 1);
end
^

/* Trigger: PUNTOS_CLIENTE_AD */
CREATE TRIGGER PUNTOS_CLIENTE_AD FOR PUNTOS_CLIENTE
ACTIVE AFTER DELETE POSITION 0
as
declare variable ID INTEGER;
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 235, OLD.ptcl_id, 'D', OLD.ptcl_nit);
/* ACTUALICE LOS SALDOS POSTERIORES */
FOR SELECT PTCL_ID FROM PUNTOS_CLIENTE WHERE PTCL_NIT = OLD.ptcl_nit AND PTCL_FECHA > OLD.ptcl_fecha INTO :ID
    DO
    BEGIN
    UPDATE PUNTOS_CLIENTE SET PTCL_SALDO = PTCL_SALDO - OLD.ptcl_db + OLD.ptcl_cr WHERE PTCL_ID = :ID;
    END
end
^

/* Trigger: PUNTOS_CLIENTE_AI */
CREATE TRIGGER PUNTOS_CLIENTE_AI FOR PUNTOS_CLIENTE
ACTIVE AFTER INSERT POSITION 0
as
declare variable ID INTEGER;
begin
/* ACTUALICE LOS SALDOS POSTERIORES */
FOR SELECT PTCL_ID FROM PUNTOS_CLIENTE WHERE PTCL_NIT = NEW.ptcl_nit AND PTCL_FECHA > NEW.ptcl_fecha INTO :ID
    DO
    BEGIN
    UPDATE PUNTOS_CLIENTE SET PTCL_SALDO = PTCL_SALDO + NEW.ptcl_db - NEW.ptcl_cr WHERE PTCL_ID = :ID;
    END
end
^

/* Trigger: PUNTOS_CLIENTE_BI */
CREATE 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 first 1 PTCL_ID FROM PUNTOS_CLIENTE WHERE PTCL_NIT = NEW.ptcl_nit AND PTCL_FECHA < NEW.ptcl_fecha
    ORDER BY PTCL_FECHA DESC, PTCL_ID DESC
    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
^

/* Trigger: PUNTOS_REDENCION_AD */
CREATE TRIGGER PUNTOS_REDENCION_AD FOR PUNTOS_REDENCION
ACTIVE AFTER DELETE POSITION 0
as
begin
if ((old.ptre_id <> 0) and (old.ptre_anulado = 'N')) then
    BEGIN
    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 81 AND PTCL_IDDOC = OLD.ptre_id;
    END
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 81, old.ptre_id, 'D', old.ptre_numero);
end
^

/* Trigger: PUNTOS_REDENCION_AI */
CREATE TRIGGER PUNTOS_REDENCION_AI FOR PUNTOS_REDENCION
ACTIVE AFTER INSERT POSITION 0
as
begin
IF ((NEW.ptre_id <> 0) AND (NEW.ptre_anulado = 'N')) THEN
  begin
  /* Descuente los puntos */
  insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
    values (new.ptre_nit, new.ptre_fecha,  81, new.ptre_id, 0, new.ptre_puntos);
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 81, NEW.ptre_id, 'I', NEW.ptre_numero);
  end
end
^

/* Trigger: PUNTOS_REDENCION_AU */
CREATE TRIGGER PUNTOS_REDENCION_AU FOR PUNTOS_REDENCION
ACTIVE AFTER UPDATE POSITION 0
as
BEGIN
/* borre la contabilizacion */
IF (NEW.ptre_anulado = 'S') then
    begin
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 81, new.ptre_id, 'A', NEW.ptre_numero);
    end
/* ANULE EL DOCUMENTO anterior */
if ((old.ptre_id <> 0) and (old.ptre_anulado = 'N')) then
    BEGIN
    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 81 AND PTCL_IDDOC = OLD.ptre_id;
    END
/* Actualice el movimiento del banco */
if ((NEW.ptre_id <> 0) and (NEW.ptre_anulado = 'N')) then
    begin
    insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
        values (new.ptre_nit, new.ptre_fecha,  81, new.ptre_id, 0, new.ptre_puntos);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 81, NEW.ptre_id, 'U', NEW.ptre_numero);
    END
end
^

/* Trigger: PUNTOS_REDENCION_BI */
CREATE TRIGGER PUNTOS_REDENCION_BI FOR PUNTOS_REDENCION
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
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
^

/* Trigger: PUNTOS_VENDEDOR_AD */
CREATE TRIGGER PUNTOS_VENDEDOR_AD FOR PUNTOS_VENDEDOR
ACTIVE AFTER DELETE POSITION 0
as
declare variable ID INTEGER;
begin
/* ACTUALICE LOS SALDOS POSTERIORES */
FOR SELECT PTVT_ID FROM puntos_vendedor WHERE VEND_COD = OLD.vend_cod AND PTVT_FECHA > OLD.ptvt_fecha INTO :ID
    DO
    BEGIN
    UPDATE puntos_vendedor SET PTVT_SALDO = PTVT_SALDO - OLD.ptvt_db + OLD.ptvt_cr WHERE PTVT_ID = :ID;
    END
end
^

/* Trigger: PUNTOS_VENDEDOR_AI */
CREATE TRIGGER PUNTOS_VENDEDOR_AI FOR PUNTOS_VENDEDOR
ACTIVE AFTER INSERT POSITION 0
AS
declare variable ID INTEGER;
begin
/* ACTUALICE LOS SALDOS POSTERIORES */
FOR SELECT PTVT_ID FROM puntos_vendedor WHERE VEND_COD = NEW.vend_cod AND PTVT_FECHA > NEW.ptvt_fecha INTO :ID
    DO
    BEGIN
    UPDATE puntos_vendedor SET PTVT_SALDO = PTVT_SALDO + NEW.ptvt_db - NEW.ptvt_cr WHERE PTVT_ID = :ID;
    END
end
^

/* Trigger: PUNTOS_VENDEDOR_BI */
CREATE 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
^

/* Trigger: PUNTOS_VEND_REDENCION_AD */
CREATE TRIGGER PUNTOS_VEND_REDENCION_AD FOR PUNTOS_VEND_REDENCION
ACTIVE AFTER DELETE POSITION 0
as
begin
delete from puntos_vendedor where vend_cod = old.ptvr_vend and ptvt_tipodoc = 81 and ptvt_iddoc = old.ptvr_id;
end
^

/* Trigger: PUNTOS_VEND_REDENCION_AI */
CREATE TRIGGER PUNTOS_VEND_REDENCION_AI FOR PUNTOS_VEND_REDENCION
ACTIVE AFTER INSERT POSITION 0
as
begin
if (new.ptvr_anulado = 'N') then
    insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
        values (new.ptvr_vend, new.ptvr_fecha, 81, new.ptvr_id, 0, new.ptvr_puntos);
end
^

/* Trigger: PUNTOS_VEND_REDENCION_AU */
CREATE TRIGGER PUNTOS_VEND_REDENCION_AU FOR PUNTOS_VEND_REDENCION
ACTIVE AFTER UPDATE POSITION 0
as
begin
delete from puntos_vendedor where vend_cod = old.ptvr_vend and ptvt_tipodoc = 81 and ptvt_iddoc = old.ptvr_id;

if (new.ptvr_anulado = 'N') then
    insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
        values (new.ptvr_vend, new.ptvr_fecha, 81, new.ptvr_id, 0, new.ptvr_puntos);
end
^

/* Trigger: PUNTOS_VEND_REDENCION_BI */
CREATE TRIGGER PUNTOS_VEND_REDENCION_BI FOR PUNTOS_VEND_REDENCION
ACTIVE BEFORE INSERT POSITION 0
as
begin
new.ptvr_id = gen_id(id_redptosv, 1);
end
^

/* Trigger: PUNTO_VENTA_BI */
CREATE 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';
if ((new.ptvt_cajacierre is not null) and (new.ptvt_cajacierre <> 0)) then
    begin
    if (not exists (select caja_id from cajas where caja_id = new.ptvt_cajacierre)) then
        exception caja_no_existe 'No se encontro la caja de cierre ' || new.ptvt_cajacierre;
    end
if ((new.ptvt_cajadif is not null) and (new.ptvt_cajadif <> 0)) then
    begin
    if (not exists (select caja_id from cajas where caja_id = new.ptvt_cajadif)) then
        exception caja_no_existe 'No se encontro la caja de diferencias ' || new.ptvt_cajadif;
    end
end
^

/* Trigger: PUNTO_VENTA_BU */
CREATE TRIGGER PUNTO_VENTA_BU FOR PUNTO_VENTA
ACTIVE BEFORE UPDATE POSITION 0
as
begin
--if (NEW.ptvt_feccie < OLD.ptvt_feccie) then
--    exception fecha_no_valida 'La fecha indicada en el cierre ' || new.ptvt_feccie || ' es anterior al ÃƒÂºltimo cierre registrado' || old.ptvt_feccie;
if ((new.ptvt_cajacierre is not null) and (new.ptvt_cajacierre <> 0)) then
    begin
    if (not exists (select caja_id from cajas where caja_id = new.ptvt_cajacierre)) then
        exception caja_no_existe 'No se encontro la caja de cierre ' || new.ptvt_cajacierre;
    end
if ((new.ptvt_cajadif is not null) and (new.ptvt_cajadif <> 0)) then
    begin
    if (not exists (select caja_id from cajas where caja_id = new.ptvt_cajadif)) then
        exception caja_no_existe 'No se encontro la caja de diferencias ' || new.ptvt_cajadif;
    end
end
^

/* Trigger: RECAUDO_BI */
CREATE TRIGGER RECAUDO_BI FOR RECAUDO
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.recr_id = GEN_ID(ID_RECAUDO, 1);
end
^

/* Trigger: RECIBOS_CAJA_AD */
CREATE TRIGGER RECIBOS_CAJA_AD FOR RECIBOS_CAJA
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
declare variable ID INTEGER;
declare variable CUOTA INTEGER;
declare variable ABONO NUMERIC(18,2);
declare variable ANULADO CHAR(1);
BEGIN
/* borre la contabilizaciÃ³n */
select enco_consec from comprobante_encabezado where enco_tiporef = 61 and enco_idref = old.reca_id into :consec;
if (NOT consec is null) then
    begin
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_detalle_niif where enco_consec = :consec;
    end
delete from comprobante_encabezado where enco_tiporef = 61 and enco_idref = old.reca_id;
FOR SELECT PRNO_ID, PRCU_ITEM, RCPR_ABONO, RCPR_ANULADO FROM recibos_prestamos
    WHERE RECA_ID = OLD.reca_id
    INTO :ID, :CUOTA, :ABONO, :ANULADO
    DO
    BEGIN
    if (:ANULADO = 'N') then
        UPDATE prestamo_cuotas C SET prcu_abono = prcu_abono - :ABONO
            WHERE prno_id = :ID AND prcu_item = :CUOTA;
    DELETE FROM recibos_prestamos WHERE RECA_ID = OLD.reca_id AND PRNO_ID = :ID AND PRCU_ITEM = :CUOTA;
    END

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_feccruce = null, rcpr_idcruce = 0 where rcpr_id = old.reca_provid;

INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 61, OLD.reca_id, 'D', OLD.pref_pre || OLD.reca_numero);
END
^

/* Trigger: RECIBOS_CAJA_AI */
CREATE TRIGGER RECIBOS_CAJA_AI FOR RECIBOS_CAJA
ACTIVE AFTER INSERT POSITION 0
AS
declare variable ID INTEGER;
declare variable CUOTA INTEGER;
declare variable TOTAL NUMERIC(18,2);
declare variable ABONO NUMERIC(18,2);
declare variable MONTO NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
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;

    if (new.reca_paganom = 'S') then
        begin
        TOTAL = NEW.reca_monto;
        if ((new.reca_prestamo is not null) and (new.reca_prestamo <> 0)) then
            begin
            execute procedure saldo_prestamo(NEW.reca_prestamo) returning_values (:SALDO);
            if (SALDO < TOTAL) then
                exception abono_prestamo_mayor 'El valor abonado ' || TOTAL || ' es mayor al saldo del prestamo ' || SALDO;
            end
        FOR SELECT N.prno_id, C.prcu_item, C.prcu_monto-C.prcu_abono FROM prestamo_cuotas C, prestamo_nomina N
            WHERE N.prno_id = C.prno_id AND N.terc_nit = NEW.terc_nit AND C.prcu_ok = 'N' AND (C.prcu_monto-C.prcu_abono) > 0
            AND ((C.prno_id = NEW.reca_prestamo) or (NEW.reca_prestamo IS NULL) or (NEW.reca_prestamo = 0))
            order by c.prcu_ano, c.prcu_periodo
            INTO :ID, :CUOTA, :MONTO
            DO
            begin
            if (TOTAL > 0) then
                BEGIN
                if (TOTAL > :MONTO) then
                    BEGIN
                    ABONO = MONTO;
                    UPDATE PRESTAMO_CUOTAS C SET PRCU_ABONO = :ABONO, PRCU_OK = 'S' WHERE C.prno_id = :ID AND C.prcu_item = :CUOTA;
                    END
                ELSE
                    BEGIN
                    ABONO = TOTAL;
                    UPDATE PRESTAMO_CUOTAS C SET PRCU_ABONO = :ABONO WHERE C.prno_id = :ID AND C.prcu_item = :CUOTA;
                    END
                TOTAL = TOTAL - ABONO;
                INSERT INTO recibos_prestamos (RECA_ID, PRNO_ID, PRCU_ITEM, RCPR_ABONO, RCPR_ANULADO)
                    VALUES (NEW.reca_id, :ID, :CUOTA, :ABONO, 'N');
                END
            end
        end
    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
^

/* Trigger: RECIBOS_CAJA_AU */
CREATE TRIGGER RECIBOS_CAJA_AU FOR RECIBOS_CAJA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
declare variable ID INTEGER;
declare variable CUOTA INTEGER;
declare variable ABONO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable MONTO NUMERIC(18,2);
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
      BEGIN
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      END
    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);
    FOR SELECT PRNO_ID, PRCU_ITEM, RCPR_ABONO FROM recibos_prestamos
        WHERE RECA_ID = OLD.reca_id AND RCPR_ANULADO = 'N'
        INTO :ID, :CUOTA, :ABONO
        DO
        BEGIN
        UPDATE prestamo_cuotas C SET prcu_abono = prcu_abono - :ABONO
            WHERE prno_id = :ID AND prcu_item = :CUOTA;
        UPDATE recibos_prestamos SET RCPR_ANULADO = 'S' WHERE RECA_ID = OLD.reca_id AND PRNO_ID = :ID AND PRCU_ITEM = :CUOTA;
        END
    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;
    if (new.reca_paganom = 'S') then
        begin
        TOTAL = NEW.reca_monto;
        FOR SELECT N.prno_id, C.prcu_item, C.prcu_monto-C.prcu_abono FROM prestamo_cuotas C, prestamo_nomina N
            WHERE N.prno_id = C.prno_id AND N.terc_nit = NEW.terc_nit AND C.prcu_ok = 'N' AND (C.prcu_monto-C.prcu_abono) > 0
            order by c.prcu_ano, c.prcu_periodo
            INTO :ID, :CUOTA, :MONTO
            DO
            begin
            if (TOTAL > 0) then
                BEGIN
                if (TOTAL > :MONTO) then
                    ABONO = MONTO;
                ELSE
                    ABONO = TOTAL;
                UPDATE PRESTAMO_CUOTAS C SET PRCU_ABONO = :ABONO, PRCU_OK = 'S' WHERE C.prno_id = :ID AND C.prcu_item = :CUOTA;
                TOTAL = TOTAL - ABONO;
                INSERT INTO recibos_prestamos (RECA_ID, PRNO_ID, PRCU_ITEM, RCPR_ABONO, RCPR_ANULADO)
                    VALUES (NEW.reca_id, :ID, :CUOTA, :ABONO, 'N');
                END
            end
        end
    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
^

/* Trigger: RECIBOS_CAJA_BI */
CREATE TRIGGER RECIBOS_CAJA_BI FOR RECIBOS_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if ((NEW.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
^

/* Trigger: RECIBOS_CAJA_CRUCEC_AD */
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+OLD.rccr_difcambio),
        SDCP_ABRTFTE = SDCP_ABRTFTE - old.rccr_rtfte,
        SDCP_ABRTIVA = SDCP_ABRTIVA - old.rccr_rtiva,
        SDCP_ABRTICA = SDCP_ABRTICA - old.rccr_rtica,
        SDCP_ABRCREE = SDCP_ABRCREE - old.rccr_rcree
        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,
        MVPR_RCREE = MVPR_RCREE - OLD.rccr_rcree
        WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = OLD.reca_id;
      end
    END
END
^

/* Trigger: RECIBOS_CAJA_CRUCEC_AI */
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(8);
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_rcree + 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_rcree + 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_ABRCREE = SDCP_ABRCREE + NEW.rccr_rcree,
                    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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, 0, (NEW.rccr_abono+NEW.rccr_dtof+NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, NEW.rccr_rcree, '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_RCREE = MVPR_RCREE + NEW.rccr_rcree,
                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_RCREE, 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, NEW.rccr_rcree, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END
^

/* Trigger: RECIBOS_CAJA_CRUCEC_AU */
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(8);
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,
            SDCP_ABRCREE = SDCP_ABRCREE - old.rccr_rcree
            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,
            MVPR_RCREE = MVPR_RCREE - OLD.rccr_rcree
            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_rcree + 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_rcree + 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_ABRCREE = SDCP_ABRCREE + NEW.rccr_rcree,
            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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (NEW.rccr_tipodoc, NEW.rccr_iddoc, :FEC, :NIT, 0, 0, 0, 0, (NEW.rccr_abono + NEW.rccr_dtof + NEW.rccr_difcambio), NEW.rccr_rtfte, NEW.rccr_rtiva, NEW.rccr_rtica, NEW.rccr_rcree, '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_RCREE = MVPR_RCREE + NEW.rccr_rcree,
                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_RCREE, 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, NEW.rccr_rcree, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

/* Trigger: RECIBOS_CAJA_CRUCEC_BI */
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 TRMDOC NUMERIC(18,2);
declare variable FECREC DATE;
declare variable FECDOC DATE;
declare variable NITR VARCHAR(20);
declare variable NITD 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);
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_rcree = NEW.rccr_rcree * :trmdoc;
    NEW.rccr_dtof = NEW.rccr_dtof * :trmdoc;
    end
if ((new.rccr_abono+new.rccr_rtfte+new.rccr_rtiva+new.rccr_rtica+new.rccr_rcree+new.rccr_dtof) = 0) then
    exception ABONO_CERO 'El monto del abono al documento ' || new.rccr_prefijo || new.rccr_numero || ' no puede ser cero.';
/* 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 MVPR_FECHA, TERC_NIT FROM movimiento_proveedor M
    WHERE M.mvpr_tiporef = NEW.rccr_tipodoc AND M.mvpr_idref = NEW.rccr_iddoc INTO :FECDOC, :NITD;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'EL RECIBO DE FECHA ' || :FECREC || ' INTENTA CRUZAR UN DOCUMENTO DE FECHA ' || FECDOC;
if (NITR <> NITD) then
    exception documento_de_otro_tercero 'EL RECIBO CON NIT ' || :nitr || ' INTENTA CRUZAR EL DOCUMENTO ' || NEW.rccr_prefijo || NEW.rccr_numero || ' DEL PROVEEDOR ' || :nitd;
end
^

/* Trigger: RECIBOS_CAJA_DETALLE_AD */
CREATE 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 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, TERC_NIT from recibos_caja where reca_id = OLD.reca_id into :FEC, :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,
            SDCA_ABRCREE = SDCA_ABRCREE - old.rcde_RCREE
            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,
        MVCL_RCREE = MVCL_RCREE - OLD.rcde_rcree
        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 = OLD.rcde_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
^

/* Trigger: RECIBOS_CAJA_DETALLE_AI */
CREATE 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 desc_rtes varchar(10);
declare variable fdesc_rtes date;
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);
declare variable TRANSMIT CHAR(1);
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';
    /* NO DEJE ABONAR UNA FACTURA DEL POS SIN TERMINAR */
    if (new.RCDE_TIPODOC = 31) then
        BEGIN
        SELECT FACT_TRANSMIT FROM FACTURAS WHERE FACT_ID = NEW.rcde_iddoc INTO :TRANSMIT;
        if (TRANSMIT = 'S') then
            exception documento_cruzado 'La factura ' || new.rcde_prefijo || new.rcde_numero || ' no ha sido totalizada.';
        end
    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 (desc_rtes);
        if (strlen(desc_rtes) = 10) then
            fdesc_rtes = desc_rtes;
        else
            if (desc_rtes = 'SI') then
                fdesc_rtes = '1990/01/01';
            if (desc_rtes = 'NO') then
                fdesc_rtes = '9999/12/31';
        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 (fdesc_rtes <= :fec) 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 || ' ' || :SALDO || ' ES INSUFICIENTE PARA EL ABONO ' || (NEW.rcde_abono + NEW.rcde_dtof);
                end
            ELSE
                begin
                if (saldo > (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_rcree + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ' || :SALDO || ' ES INSUFICIENTE PARA EL ABONO ' || (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_rcree + NEW.rcde_dtof);
                end
            END
          else
            BEGIN
            if (fdesc_rtes <= :fec) 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 || ' ' || :SALDO || ' ES INSUFICIENTE PARA EL ABONO ' || (NEW.rcde_abono + NEW.rcde_dtof);
                end
            ELSE
                begin
                if (saldo < (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_rcree + NEW.rcde_dtof)) then
                    EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.rcde_prefijo || NEW.rcde_numero || ' ' || :SALDO || ' ES INSUFICIENTE PARA EL ABONO ' || (NEW.rcde_abono + NEW.rcde_rtfte + NEW.rcde_rtiva + NEW.rcde_rtica + NEW.rcde_rcree + NEW.rcde_dtof);
                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_ABRCREE = SDCA_ABRCREE + NEW.rcde_rcree,
                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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (NEW.RCDE_TIPODOC, NEW.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, 0, (NEW.rcde_abono+NEW.rcde_dtof), NEW.rcde_rtfte, NEW.rcde_rtiva, NEW.rcde_rtica, NEW.rcde_rcree, '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_RCREE = MVCL_RCREE + NEW.rcde_rcree,
                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_RCREE, 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, NEW.rcde_rcree, '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 and fact_total <> 0
                    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 and ndcl_monto <> 0
                    into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (new.rcde_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 and devt_total <> 0
                    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 and nccl_monto <> 0
                    into :factord;
            /* inserte el registro de puntos */
            insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
                values (new.rcde_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 and fact_total <> 0
                        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 and ndcl_monto <> 0
                        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 and devt_total <> 0
                        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 and nccl_monto <> 0
                        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
^

/* Trigger: RECIBOS_CAJA_DETALLE_AU */
CREATE 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(8);
declare variable SALDO numeric(18,2);
declare variable RETES char(2);
declare variable OK char(1);
declare variable RCANTI 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 AUTORCREE varchar(10);
declare variable FAUTORCREE 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, RECA_TRM
    from recibos_caja where reca_id = new.reca_id
    into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :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,
            SDCA_ABRCREE = SDCA_ABRCREE - old.rcde_rcree
            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,
        MVCL_RCREE = MVCL_RCREE - old.rcde_rcree
        where MVCL_TIPOREF = 61 and MVCL_IDREF = old.RECA_ID and MVCL_SUCURSAL = old.rcde_sucursal;

    /* DESHAGA LOS PUNTOS DEL VENDEDOR */
    if (acumula = 'SI') then
        delete from puntos_vendedor where vend_cod = OLD.rcde_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
          begin
          execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
          if (AUTORCREE <> '') then
                FAUTORCREE = cast(AUTORCREE as date);
          else
                FAUTORCREE = '9999/12/31';
          select min(SDCA_FECHA) from SALDOS_DOC_CARTERA where (SDCA_TIPOREF = new.rcde_tipodoc) and (SDCA_IDREF = new.rcde_iddoc) and (SDCA_MONTO <> 0) into :FECDOC;
          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 (FAUTORCREE <= FECDOC) then
                    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
                else
                    begin
                    if (saldo > (new.rcde_abono + new.rcde_rtfte + new.rcde_rtiva + new.rcde_rtica + new.rcde_rcree + new.rcde_dtof)) then
                        exception DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || new.rcde_prefijo || new.rcde_numero || ' ES INSUFICIENTE.';
                    end
                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 (FAUTORCREE <= FECDOC) then
                    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
                else
                    begin
                    if (saldo < (new.rcde_abono + new.rcde_rtfte + new.rcde_rtiva + new.rcde_rtica + new.rcde_rcree + new.rcde_dtof)) then
                        exception DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || new.rcde_prefijo || new.rcde_numero || ' ES INSUFICIENTE.';
                    end
                end
            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_ABRCREE = SDCA_ABRCREE + new.rcde_rcree,
                    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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                values (new.RCDE_TIPODOC, new.RCDE_IDDOC, :FEC, :NIT, 0, 0, 0, 0, (new.rcde_abono+new.RCDE_DTOF), new.rcde_rtfte, new.rcde_rtiva, new.rcde_rtica, new.rcde_rcree, '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_RCREE = MVCL_RCREE + new.rcde_rcree,
                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_RCREE, 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, new.rcde_rcree, 'N', 'S', :PREFIJO, :NUMERO, new.rcde_sucursal, NEW.rcde_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 (NEW.rcde_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 (NEW.rcde_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
^

/* Trigger: RECIBOS_CAJA_DETALLE_BI */
CREATE 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);
declare variable COMIP VARCHAR(2);
declare variable DIAS INTEGER;
declare variable COBRDOC 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';
EXECUTE PROCEDURE LEE_CONFIGURACION('CAJA', 'RECIBOS', 'PREGUNTAR COBRADOR INDEPENDIENTE PARA CADA DOCUMENTO') returning_values (:cobrdoc);
if (COBRDOC = 'NO') then
    SELECT COBR_COD FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO NEW.rcde_cobr;

/* 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_rcree = NEW.rcde_rcree * :trmdoc;
    NEW.rcde_dtof = NEW.rcde_dtof * :trmdoc;
    end
if ((new.rcde_abono+new.rcde_rtfte+new.rcde_rtiva+new.rcde_rcree+new.rcde_rtica+new.rcde_dtof) = 0) then
    exception ABONO_CERO 'El monto del abono al documento ' || new.rcde_prefijo || new.rcde_numero || ' no puede ser cero.';
/* 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;
SELECT COPU_DIAS FROM comisiones_puntos WHERE COPU_COD = NEW.rcde_comip INTO :DIAS;
if ((FECREC - FECDOC) > DIAS) then
    BEGIN
    SELECT FIRST 1 COPU_COD FROM comisiones_puntos WHERE COPU_FACTOR = 0 INTO :COMIP;
    NEW.rcde_comip = COMIP;
    END
END
^

/* Trigger: RECIBOS_CAJA_DETALLE_BU */
CREATE 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
^

/* Trigger: RECIBOS_CAJA_PAGO_AD */
CREATE 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
^

/* Trigger: RECIBOS_CAJA_PAGO_AI */
CREATE 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(8);
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, NEW.rcpa_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_cantcr, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 71, :idcons, new.reca_id, new.rcpa_item, 1, :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, NEW.rcpa_conc, 'S', :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_cantcr, cofa_lista, cofa_unidad)
                    values (gen_id(id_cons, 1), 1, 61, 64, :idcons, new.reca_id, new.rcpa_item, 1, :ctabco, :prefbco);
                END
            END
        end
    END
  end
END
^

/* Trigger: RECIBOS_CAJA_PAGO_AU */
CREATE 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(8);
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 = 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 */
        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, new.rcpa_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_cantcr, cofa_lista, cofa_unidad)
                        values (gen_id(id_cons, 1), 1, 61, 71, :idcons, new.reca_id, new.rcpa_item, 1, :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, new.rcpa_conc, 'S', :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_cantcr, cofa_lista, cofa_unidad)
                        values (gen_id(id_cons, 1), 1, 61, 64, :idcons, new.reca_id, new.rcpa_item, 1, :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
^

/* Trigger: RECIBOS_CAJA_PAGO_BI */
CREATE 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 FPBONO INTEGER;
declare variable DIASBONO INTEGER;
declare variable IDBONO INTEGER;
declare variable FEC DATE;
declare variable BANCO VARCHAR(2);
declare variable TRM double precision;
begin
SELECT RECA_FECHA, CAJA_ID, RECA_TRM FROM recibos_caja WHERE RECA_ID = NEW.reca_id INTO :FEC, :CAJA, :TRM;
if (NEW.rcpa_trm IS NULL) then
    NEW.rcpa_trm = :TRM;
/* 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
  /* SI LAS FORMAS DE PAGO SON AUTOMATICAS TRAIGA EL QUE LE CORRESPONDA */
  if (NEW.rcpa_numero IS NULL) then
    BEGIN
    SELECT CAJA_FPBCO FROM CAJAS WHERE CAJA_ID = :CAJA INTO :BANCO;
    NEW.RCPA_BANCO = :BANCO;
    NEW.RCPA_CUENTA = '9999';
    select max(rcpa_numero) from recibos_caja_pago where rcpa_banco = NEW.RCPA_BANCO and rcpa_cuenta = '9999' INTO NEW.rcpa_numero;
    if (NEW.rcpa_numero IS NULL) Then
        NEW.RCPA_NUMERO = '000001';
    ELSE
        BEGIN
        NEW.RCPA_NUMERO = CAST((CAST(NEW.rcpa_numero AS INTEGER) + 1) AS CHAR(6));
        EXECUTE PROCEDURE COMPLETA_CEROS (NEW.rcpa_numero) returning_values (NEW.rcpa_numero);
        END
    END
  execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'FORMA DE PAGO PARA BONOS FACTURADOS') returning_values (:FPBONO);
  if (NEW.fopa_id <> :fpbono) then
    BEGIN
    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 encontro un bono disponible por valor de ' || new.rcpa_monto;
    END
  END
end
^

/* Trigger: RECIBO_PROVISIONAL_AD */
CREATE 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
    begin
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_detalle_niif where enco_consec = :consec;
    end
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
^

/* Trigger: RECIBO_PROVISIONAL_AI */
CREATE TRIGGER RECIBO_PROVISIONAL_AI FOR RECIBO_PROVISIONAL
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.RCPR_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 65, NEW.rcpr_id, 'I', NEW.pref_pre || NEW.rcpr_numero);
end
^

/* Trigger: RECIBO_PROVISIONAL_AU */
CREATE 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
    BEGIN
    delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_detalle_niif where enco_consec = :consec;
    END
  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
^

/* Trigger: RECIBO_PROVISIONAL_BI */
CREATE TRIGGER RECIBO_PROVISIONAL_BI FOR RECIBO_PROVISIONAL
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
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
^

/* Trigger: RELEVOS_COLEGIOS_BI */
CREATE TRIGGER RELEVOS_COLEGIOS_BI FOR RELEVOS_COLEGIOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
new.relc_id = gen_id(id_relevo, 1);
end
^

/* Trigger: REMISIONES_VENTA_AD */
CREATE TRIGGER REMISIONES_VENTA_AD FOR REMISIONES_VENTA
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
declare variable abonos integer;
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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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);
/* VERIFIQUE QUE NO HAY DEVOLUCIONES */
if ((old.revt_id <> 0) and (old.revt_anulado = 'N')) then
    begin
    SELECT COUNT(*) FROM DEVOLUCIONES_VENTAS WHERE DEVT_REMID = OLD.revt_id AND DEVT_ANULADO = 'N' INTO :abonos;
    if (abonos > 0) then
        exception documento_devuelto 'La Remision ' || old.pref_pre || old.revt_numero || ' tiene devoluciones registradas.';
    end
end
^

/* Trigger: REMISIONES_VENTA_AI */
CREATE 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
^

/* Trigger: REMISIONES_VENTA_AU */
CREATE TRIGGER REMISIONES_VENTA_AU FOR REMISIONES_VENTA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
declare variable abonos integer;
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
      BEGIN
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      END
    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);
    /* VERIFIQUE QUE NO HAY DEVOLUCIONES */
    if ((old.revt_id <> 0) and (old.revt_anulado = 'N')) then
        begin
        SELECT COUNT(*) FROM DEVOLUCIONES_VENTAS WHERE DEVT_REMID = OLD.revt_id AND DEVT_ANULADO = 'N' INTO :abonos;
        if (abonos > 0) then
            exception documento_devuelto 'La Remision ' || old.pref_pre || old.revt_numero || ' tiene devoluciones registradas.';
        end
    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
^

/* Trigger: REMISIONES_VENTA_BI */
CREATE TRIGGER REMISIONES_VENTA_BI FOR REMISIONES_VENTA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable ITEM INTEGER;
declare variable IDF INTEGER;
declare variable IDP INTEGER;
declare variable IDC INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PEDIDOREP char(2);
declare variable TIPO VARCHAR(8);
declare variable NUMROWS INTEGER;
declare variable IDPEDIDO INTEGER;
declare variable NUMPEDIDO VARCHAR(10);
declare variable ESTADO CHAR(1);
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;

/* VALIDE EL ESTADO DEL CLIENTE */
SELECT C.clie_estado FROM CLIENTES C WHERE TERC_NIT = NEW.terc_nit INTO :ESTADO;
if (ESTADO <> 'A') then
    exception CLIENTE_INACTIVO 'El cliente ' || new.terc_nit || ' esta inactivo o en No vender.';

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

/* Trigger: REMISIONES_VENTA_DETALLE_AD */
CREATE 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);
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
        /* DESHAGA LOS PENDIENTES */
        CANTAUX = old.rvde_cant * old.rvde_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    if (idped <> 0) then
        BEGIN
        /* DESHAGA LOS PENDIENTES DEL PEDIDO */
        CANTAUX = old.rvde_cant * old.rvde_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :idped and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :idped and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :idped and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    end
END
^

/* Trigger: REMISIONES_VENTA_DETALLE_AI */
CREATE 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(8);
declare variable Nit varchar(20);
declare variable Tipo integer;
declare variable idfact integer;
declare variable numrows integer;
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable sucucli varchar(10);
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, REVT_SUCURSAL
        from remisiones_venta where revt_id = new.revt_id
        into :fec, :Pref, :Num, :Nit, :Nomcli, :consolida, :idped, :sucucli;
    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, CLSU_COD)
            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, :sucucli);
        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);
        if (CONSO = 'NO') then
            update consolidado_faltantes set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.rvde_cant * new.rvde_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            if (CANTAUX > 0) then
                BEGIN
                /* SOBRO CANTIDAD, SI ES UN PENDIENTE ERROR */
                if (TIPO = 40) then
                    exception CANTIDAD_CRUCE_MAYOR 'La cantidad remisionada del artículo ' || new.arti_cod || ' es mayor que el pendiente por entregar';
                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_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                    where COFA_ID = :idped AND ARTI_COD = NEW.ARTI_COD;
            else
                begin
                CANTAUX = new.rvde_cant * new.rvde_factor;
                for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                    where COFA_ID = :idped and ARTI_COD = new.ARTI_COD
                    into :ITEM, :CANT
                    do
                    begin
                    if ((CANTAUX > 0) and (CANT > 0))then
                        if (CANT < CANTAUX) then
                            begin
                            update consolidado_faltantes
                                set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                                where COFA_ID = :idped and COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - CANT;
                            end
                        else
                            begin
                            update consolidado_faltantes
                                set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                                where COFA_ID = :idped and COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            end
                    end
                end
            END
        end
    END
END
^

/* Trigger: REMISIONES_VENTA_DETALLE_AU */
CREATE 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(8);
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);
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
        /* DESHAGA LOS PENDIENTES */
        CANTAUX = old.rvde_cant * old.rvde_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    if (idped <> 0) then
        BEGIN
        /* DESHAGA LOS PENDIENTES DEL PEDIDO */
        CANTAUX = old.rvde_cant * old.rvde_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :idped and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :idped and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :idped and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                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);
        if (CONSO = 'NO') then
            update consolidado_faltantes set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.rvde_cant * new.rvde_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            if (CANTAUX > 0) then
                BEGIN
                /* SOBRO CANTIDAD, SI ES UN PENDIENTE ERROR */
                if (TIPO = 40) then
                    exception CANTIDAD_CRUCE_MAYOR 'La cantidad remisionada del artÃ­culo ' || new.arti_cod || ' es mayor que el pendiente por entregar';
                END
            end

        /* SI HAY PEDIDO AUTOMATICO ACTUALICE EL FALTANTE DEL PEDIDO */
        if (IDPED <> 0) then
            BEGIN
            if (CONSO = 'NO') then
                update consolidado_faltantes set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :FEC
                    where COFA_ID = :idped AND ARTI_COD = NEW.ARTI_COD;
            else
                begin
                CANTAUX = new.rvde_cant * new.rvde_factor;
                for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                    where COFA_ID = :idped and ARTI_COD = new.ARTI_COD
                    into :ITEM, :CANT
                    do
                    begin
                    if ((CANTAUX > 0) and (CANT > 0))then
                        if (CANT < CANTAUX) then
                            begin
                            update consolidado_faltantes
                                set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :FEC
                                where COFA_ID = :idped and COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - CANT;
                            end
                        else
                            begin
                            update consolidado_faltantes
                                set COFA_IDDES = new.revt_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :FEC
                                where COFA_ID = :idped and COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            end
                    end
                end
            END
        END
    end
END
^

/* Trigger: REMISIONES_VENTA_DETALLE_BI */
CREATE TRIGGER REMISIONES_VENTA_DETALLE_BI FOR REMISIONES_VENTA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable DEC1818 CHAR(1);
declare variable PREF VARCHAR(4);
BEGIN
if ((NEW.rvde_codbar IS NULL) or (NEW.rvde_codbar = ''))  then
    NEW.rvde_codbar = NEW.arti_cod;
if (new.rvde_cant is null) then
    new.rvde_cant = 0;
if (new.rvde_prunit is null) then
    new.rvde_prunit = 0;
if (new.rvde_dtoporc is null) then
    new.rvde_dtoporc = 0;
if (new.rvde_ivaporc is null) then
    new.rvde_ivaporc = 0;
/* CALCULE EL MONTO DEL DESCUENTO */
NEW.rvde_dtomonto = NEW.rvde_prunit * NEW.rvde_dtoporc / 100;

select PREF_PRE from remisiones_venta where revt_id = new.revt_id into :PREF;
select grup_dec1818 from GRUPO G, articulo a where a.arti_cod = new.arti_cod and a.grup_cod = g.grup_cod into :DEC1818;
if (DEC1818 = 'S') then
    BEGIN
    SELECT PREF_DEC1818 FROM PREFIJOS WHERE TIDO_COD = 32 AND PREF_PRE = :pref INTO :DEC1818;
    if (DEC1818 = 'S') then
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'TARIFA DE IVA PARA PRODUCTOS EXENTOS DECRETO 1818 DE 2015') returning_values (new.rvde_tiva);
    ELSE
        select taiv_cod from articulo where arti_cod = new.arti_cod into new.rvde_tiva;
    END
ELSE
    select taiv_cod from articulo where arti_cod = new.arti_cod into new.rvde_tiva;

EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.rvde_unidad) returning_values (new.rvde_factor);
if (new.rvde_devuelto is null) then
    new.rvde_devuelto = 0;
END
^

/* Trigger: REMISION_PROVEEDOR_AD */
CREATE TRIGGER REMISION_PROVEEDOR_AD FOR REMISION_PROVEEDOR
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
select enco_consec from comprobante_encabezado where enco_tiporef = 22 and enco_idref = old.repr_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 22 and enco_idref = old.repr_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 22, OLD.repr_id, 'D', OLD.pref_pre || OLD.repr_numero);
end
^

/* Trigger: REMISION_PROVEEDOR_AI */
CREATE TRIGGER REMISION_PROVEEDOR_AI FOR REMISION_PROVEEDOR
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.REPR_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 22, NEW.repr_id, 'I', NEW.pref_pre || NEW.repr_numero);
end
^

/* Trigger: REMISION_PROVEEDOR_AU */
CREATE TRIGGER REMISION_PROVEEDOR_AU FOR REMISION_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.repr_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 22 and enco_idref = old.repr_id into :consec;
    if (NOT consec is null) then
        BEGIN
        delete from comprobante_detalle where enco_consec = :consec;
        delete from comprobante_detalle_niif where enco_consec = :consec;
        END
    delete from comprobante_encabezado where enco_tiporef = 22 and enco_idref = old.repr_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 22, new.repr_id, 'A', NEW.pref_pre || NEW.repr_numero);
    end
ELSE
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 22, NEW.repr_id, 'U', NEW.pref_pre || NEW.repr_numero);

/* SI CAMBIA FECHA O NUMERO ACTUALICE LOS DETALLES */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.repr_numero <> NEW.repr_numero) or
    (OLD.repr_fecha <> NEW.repr_fecha))  then
    UPDATE remision_proveedor_det SET RPVD_TRANSMIT = 'N' WHERE REPR_ID = NEW.REPR_ID;

/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.repr_anulado <> NEW.repr_anulado) then
    UPDATE remision_proveedor_det SET RPVD_ANULADO = NEW.REPR_anulado
        WHERE REPR_ID = NEW.REPR_ID;
if (OLD.repr_transmit <> NEW.repr_transmit) then
    UPDATE remision_proveedor_det SET RPVD_TRANSMIT = NEW.repr_transmit
        WHERE REPR_ID = NEW.REPR_ID;
END
^

/* Trigger: REMISION_PROVEEDOR_AUA */
CREATE TRIGGER REMISION_PROVEEDOR_AUA FOR REMISION_PROVEEDOR
ACTIVE AFTER UPDATE POSITION 1
as
begin
if (NEW.repr_anulado = 'S') then
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (22, NEW.repr_id, 'A', NEW.pref_pre || NEW.repr_numero);
ELSE
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (22, NEW.repr_id, 'U', NEW.pref_pre || NEW.repr_numero);
end
^

/* Trigger: REMISION_PROVEEDOR_BI */
CREATE TRIGGER REMISION_PROVEEDOR_BI FOR REMISION_PROVEEDOR
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 = 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
^

/* Trigger: REMISION_PROVEEDOR_DET_AD */
CREATE TRIGGER REMISION_PROVEEDOR_DET_AD FOR REMISION_PROVEEDOR_DET
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
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
        CANTAUX = old.rpvd_cant * old.rpvd_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    end
END
^

/* Trigger: REMISION_PROVEEDOR_DET_AI */
CREATE 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(8);
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 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);
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
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 = NEW.rpvd_prunit * (1 - (NEW.rpvd_dtoporc/100)), PVAR_COD = NEW.rpvd_codprov, PVAR_UNIDAD = NEW.rpvd_unidad, PVAR_FACTOR = NEW.rpvd_factor
                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, PVAR_UNIDAD, PVAR_FACTOR)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc, NEW.rpvd_unidad, NEW.rpvd_factor);
         END
        end

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
    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.repr_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.rpvd_cant * new.rpvd_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.repr_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.repr_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            end
        END
    /* ACTUALICE EL STAND */
    if (new.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
^

/* Trigger: REMISION_PROVEEDOR_DET_AU */
CREATE 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(8);
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 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);
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
BEGIN
if (old.rpvd_devuelto = new.rpvd_devuelto) then
  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
        CANTAUX = old.rpvd_cant * old.rpvd_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    end
  /* Registre el nuevo */
  if ((new.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 = NEW.rpvd_prunit * (1 - (NEW.rpvd_dtoporc/100)), PVAR_COD = NEW.rpvd_codprov, PVAR_UNIDAD = NEW.rpvd_unidad, PVAR_FACTOR = NEW.rpvd_factor
                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, PVAR_UNIDAD, PVAR_FACTOR)
                VALUES (:NIT, NEW.ARTI_COD, :COSTO, :FEC, NEW.rpvd_codprov,NEW.rpvd_desc, NEW.rpvd_unidad, NEW.rpvd_factor);
         END
        end
    if (CONSOLIDA <> 0) then
        BEGIN
        execute procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            update consolidado_faltantes set COFA_IDDES = new.repr_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.rpvd_cant * new.rpvd_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.repr_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.repr_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            end
        END
    /* ACTUALICE EL STAND */
    if (new.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
END
^

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

/* Trigger: REPLICA_ARTICULO_ESTADO_BI */
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);
NEW.rpae_ok = 'N';
end
^

/* Trigger: REPLICA_EVENTOS_BI */
CREATE TRIGGER REPLICA_EVENTOS_BI FOR REPLICA_EVENTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.rpev_id = gen_id(id_replevento, 1);
NEW.rpev_prefdest = NEW.rpev_pref;
end
^

/* Trigger: REP_UTILIDAD_BI */
CREATE TRIGGER REP_UTILIDAD_BI FOR REP_UTILIDAD
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.utilidad = NEW.base - NEW.costo;
end
^

/* Trigger: RESERVAS_AD */
CREATE TRIGGER RESERVAS_AD FOR RESERVAS
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (17, OLD.rese_id, 'D', OLD.pref_pre || OLD.rese_numero);
end
^

/* Trigger: RESERVAS_AI */
CREATE TRIGGER RESERVAS_AI FOR RESERVAS
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.RESE_ID <> 0) THEN
  INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (17, NEW.rese_id, 'I', NEW.pref_pre || NEW.rese_numero);
end
^

/* Trigger: RESERVAS_AU */
CREATE TRIGGER RESERVAS_AU FOR RESERVAS
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
if (NEW.rese_anulado = 'S') then
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 17, NEW.rese_id, 'A', NEW.pref_pre || NEW.rese_numero);
ELSE
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 17, NEW.rese_id, 'U', NEW.pref_pre || NEW.rese_numero);
/* SI CAMBIO LA FECHA O NUMERO CAMBIE LOS DETALLES */
if ((NEW.pref_pre <> OLD.pref_pre) or
    (NEW.rese_numero <> OLD.rese_numero) or
    (NEW.rese_fecha <> OLD.rese_fecha)) then
    UPDATE RESERVAS_DETALLE SET RSDE_TRANSMIT = 'N' WHERE RESE_ID = NEW.RESE_ID;
/* TRASMITA EL ANULADO Y TRASMITIDO A LOS DETALLES */
if (NEW.RESE_ANULADO <> OLD.RESE_ANULADO) then
    UPDATE RESERVAS_DETALLE SET RSDE_ANULADO = NEW.RESE_ANULADO WHERE RESE_ID = NEW.RESE_ID;
if (NEW.rese_transmit <> OLD.rese_transmit) then
    UPDATE RESERVAS_DETALLE SET RSDE_TRANSMIT = NEW.rese_transmit WHERE RESE_ID = NEW.RESE_ID;
END
^

/* Trigger: RESERVAS_BI */
CREATE TRIGGER RESERVAS_BI FOR RESERVAS
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.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
^

/* Trigger: RESERVAS_DETALLE_BI */
CREATE TRIGGER RESERVAS_DETALLE_BI FOR RESERVAS_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.rsde_unidad) returning_values (FACTOR);
  NEW.rsde_liberar = NEW.rdse_cant * FACTOR;
END
^

/* Trigger: RESUMEN_VENTAS_BI */
CREATE TRIGGER RESUMEN_VENTAS_BI FOR RESUMEN_VENTAS
ACTIVE BEFORE INSERT POSITION 0
as
begin
SELECT MAX(RESU_ITEM) FROM RESUMEN_VENTAS WHERE RESU_FECHA = NEW.resu_fecha AND PTVT_ID = NEW.ptvt_id INTO new.resu_item;
if (new.resu_item IS NULL) then
    new.resu_item = 0;
ELSE
    new.resu_item = new.resu_item + 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: RETIROS_AD */
CREATE TRIGGER RETIROS_AD FOR RETIROS
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
if ((OLD.reti_id <> 0) AND (OLD.reti_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPODOC = 73 AND MOBA_IDREF = OLD.reti_id;
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPOREF = 73 AND MOBA_IDREF = OLD.reti_id;
    delete from notas_debito
        where prba_pref = old.reti_notapref and ndbc_numero = old.reti_nota and cuba_cod = old.cuba_cod;
    end
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 73, OLD.reti_id, 'D', OLD.prba_pref || OLD.reti_numero, OLD.cuba_cod);
select enco_consec from comprobante_encabezado where enco_tiporef = 73 and enco_idref = old.reti_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 73 and enco_idref = old.reti_id;
end
^

/* Trigger: RETIROS_AI */
CREATE TRIGGER RETIROS_AI FOR RETIROS
ACTIVE AFTER INSERT POSITION 0
as
declare variable conc varchar(60);
declare variable id integer;
begin
if ((NEW.reti_id <> 0) AND (NEW.RETI_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, 73, NEW.PRBA_PREF, NEW.reti_numero, NEW.reti_fecha, NEW.reti_concepto, NEW.reti_monto, 'N', new.reti_id, 73);
  if (new.reti_gmfmonto <> 0) then
      begin
      conc = 'GMF EN RETIRO No. ' || NEW.PRBA_PREF || NEW.RETI_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.reti_numero, NEW.reti_fecha, :conc, NEW.reti_gmfmonto, 'N', new.reti_id, 73);
      end
  if (new.reti_notamonto <> 0) then
      begin
      conc = 'COMISION EN TRASLADO No. ' || NEW.PRBA_PREF || NEW.RETI_NUMERO;
      EXECUTE PROCEDURE CAMBIE_ID_NOTA_DB_BANCO returning_values (ID);
      INSERT INTO NOTAS_DEBITO
        (NDBC_ID, CUBA_COD, PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, NDBC_CONCEPTO, NDBC_MONTO, NDBC_IVAPORC, NDBC_IVAMONTO, NDBC_GMFPORC, NDBC_GMFMONTO, NDBC_ANULADO, NDBC_TRANSMIT)
        VALUES(:ID, NEW.cuba_cod, NEW.PRBA_PREF, NEW.reti_nota, NEW.reti_fecha, :conc, NEW.reti_notamonto, NEW.reti_ivaporc, new.reti_ivamonto, 0, 0, 'N', 'N');
      end
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 73, NEW.reti_id, 'I', NEW.prba_pref || NEW.reti_numero, NEW.cuba_cod);
  END
end
^

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

if ((OLD.reti_id <> 0) AND (OLD.reti_anulado = 'N')) then
    begin
    /* ANULE LOS MOVIMIENTOS */
    UPDATE MOVIMIENTO_BANCO
        SET MOBA_CONCEPTO = 'ANULADO', MOBA_TOTAL = 0
        WHERE MOBA_TIPODOC = 73 AND MOBA_IDREF = OLD.reti_id;
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPODOC <> 73 AND MOBA_TIPOREF = 73 AND MOBA_IDREF = OLD.reti_id;
    delete from notas_debito
        where prba_pref = old.reti_notapref and ndbc_numero = old.reti_nota and cuba_cod = old.cuba_cod;
    END
/* Registre el nuevo */
if ((new.reti_id <> 0) AND (new.reti_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, 73, NEW.PRBA_PREF, NEW.reti_numero, NEW.reti_fecha, NEW.reti_concepto, NEW.reti_monto, 'N', new.reti_id, 73);
    if (new.reti_gmfmonto <> 0) then
        begin
        conc = 'GMF EN RETIRO No. ' || NEW.PRBA_PREF || NEW.RETI_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.reti_numero, NEW.reti_fecha, :conc, NEW.reti_gmfmonto, 'N', new.reti_id, 73);
        end
    if (new.reti_notamonto <> 0) then
        begin
        conc = 'COMISION EN TRASLADO No. ' || NEW.PRBA_PREF || NEW.RETI_NUMERO;
        EXECUTE PROCEDURE CAMBIE_ID_NOTA_DB_BANCO returning_values (ID);
        INSERT INTO NOTAS_DEBITO
            (NDBC_ID, CUBA_COD, PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, NDBC_CONCEPTO, NDBC_MONTO, NDBC_IVAPORC, NDBC_IVAMONTO, NDBC_GMFPORC, NDBC_GMFMONTO, NDBC_ANULADO, NDBC_TRANSMIT)
            VALUES(:ID, NEW.cuba_cod, NEW.PRBA_PREF, NEW.reti_nota, NEW.reti_fecha, :conc, NEW.reti_notamonto, NEW.reti_ivaporc, new.reti_ivamonto, 0, 0, 'N', 'N');
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 73, NEW.reti_id, 'U', NEW.prba_pref || NEW.reti_numero, NEW.cuba_cod);
    END
END
^

/* Trigger: RETIROS_BI */
CREATE TRIGGER RETIROS_BI FOR RETIROS
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 = 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
^

/* Trigger: REVISION_PRECIOS_AD */
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
^

/* Trigger: REVISION_PRECIOS_AI */
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
^

/* Trigger: REVISION_PRECIOS_AU */
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 (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
^

/* Trigger: REVISION_PRECIOS_BI */
CREATE TRIGGER REVISION_PRECIOS_BI FOR REVISION_PRECIOS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
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
^

/* Trigger: REVPRECIOS_DETALLE_AI */
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
^

/* Trigger: REVPRECIOS_DETALLE_AU */
CREATE 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
^

/* Trigger: RUTA_PASAJEROS_BD */
CREATE TRIGGER RUTA_PASAJEROS_BD FOR RUTA_PASAJEROS
ACTIVE BEFORE DELETE POSITION 0
as
begin
if (EXISTS (SELECT PLPA_ID FROM PLANILLA_PASAJEROS WHERE PLPA_RUTA = OLD.ruta_id)) then
    exception ruta_usada;
if (EXISTS (SELECT TIQP_ID FROM TIQUETE_PASAJERO WHERE TIQP_RUTA = OLD.ruta_id)) then
    exception ruta_usada;
end
^

/* Trigger: RUTA_PASAJEROS_BU */
CREATE TRIGGER RUTA_PASAJEROS_BU FOR RUTA_PASAJEROS
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (NEW.ruta_id <> OLD.ruta_id) then
    BEGIN
    if (EXISTS (SELECT PLPA_ID FROM PLANILLA_PASAJEROS WHERE PLPA_RUTA = OLD.ruta_id)) then
        exception ruta_usada;
    if (EXISTS (SELECT TIQP_ID FROM TIQUETE_PASAJERO WHERE TIQP_RUTA = OLD.ruta_id)) then
        exception ruta_usada;
    END
end
^

/* Trigger: RUTERO_AD */
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
^

/* Trigger: RUTERO_AI */
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
^

/* Trigger: RUTERO_AU */
CREATE TRIGGER RUTERO_AU FOR RUTERO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec integer;
begin
if (NEW.rute_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 37 and enco_idref = old.rute_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 37 and enco_idref = old.rute_id;
    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
^

/* Trigger: RUTERO_BI */
CREATE TRIGGER RUTERO_BI FOR RUTERO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
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
^

/* Trigger: RUTERO_DETALLE_AD */
CREATE TRIGGER RUTERO_DETALLE_AD FOR RUTERO_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
declare variable ENTREGA VARCHAR(12);
begin
execute procedure lee_configuracion('FACTURACION', 'RUTERO', 'REGISTRAR FECHA Y HORA DE ENTREGA DE LA FACTURA AL GRABAR RUTERO')
    returning_values (:entrega);
if (ENTREGA <> 'NO') then
    begin
    UPDATE entrega_documentos E
        SET E.endo_fechae = null, E.endo_horae = null
        WHERE E.tido_cod = 31 AND E.endo_iddoc = old.rutd_factid;
    end
end
^

/* Trigger: RUTERO_DETALLE_AI */
CREATE TRIGGER RUTERO_DETALLE_AI FOR RUTERO_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable ENTREGA VARCHAR(12);
declare variable CONFIRMA CHAR(1);
declare variable FECHA DATE;
declare variable HORA TIME;
begin
execute procedure lee_configuracion('FACTURACION', 'RUTERO', 'REGISTRAR FECHA Y HORA DE ENTREGA DE LA FACTURA AL GRABAR RUTERO')
    returning_values (:entrega);
if (ENTREGA <> 'NO') then
    BEGIN
    SELECT FIRST 1 R.rute_confimado, A.audi_fecha, A.audi_hora FROM RUTERO R, AUDITORIA A
        WHERE A.tido_cod = 37 AND A.audi_iddoc = R.rute_id ORDER BY A.audi_fecha DESC, A.audi_hora DESC
        INTO :CONFIRMA, :FECHA, :HORA;
    if ((ENTREGA = 'REGISTRO') or (CONFIRMA = 'S')) then
        BEGIN
        if (NEW.rutd_entregado = 'S') then
            if (EXISTS (SELECT ENDO_IDDOC FROM entrega_documentos WHERE tido_cod = 31 AND endo_iddoc = NEW.rutd_factid)) then
                UPDATE entrega_documentos E
                    SET E.endo_fechae = :FECHA, E.endo_horae = :HORA
                    WHERE E.tido_cod = 31 AND E.endo_iddoc = NEW.rutd_factid;
            ELSE
                insert into ENTREGA_DOCUMENTOS (TIDO_COD, ENDO_IDDOC, ENDO_FECHAE, ENDO_HORAE)
                    values (31, new.rutd_factid, :FECHA, :HORA);
        END
    END
end
^

/* Trigger: RUTERO_DETALLE_AU */
CREATE TRIGGER RUTERO_DETALLE_AU FOR RUTERO_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ENTREGA VARCHAR(12);
declare variable CONFIRMA CHAR(1);
declare variable FECHA DATE;
declare variable HORA TIME;
begin
execute procedure lee_configuracion('FACTURACION', 'RUTERO', 'REGISTRAR FECHA Y HORA DE ENTREGA DE LA FACTURA AL GRABAR RUTERO')
    returning_values (:entrega);
if (ENTREGA <> 'NO') then
    BEGIN
    SELECT FIRST 1 R.rute_confimado, A.audi_fecha, A.audi_hora FROM RUTERO R, AUDITORIA A
        WHERE A.tido_cod = 37 AND A.audi_iddoc = R.rute_id ORDER BY A.audi_fecha DESC, A.audi_hora DESC
        INTO :CONFIRMA, :FECHA, :HORA;
    if ((ENTREGA = 'REGISTRO') or (CONFIRMA = 'S')) then
        BEGIN
        if ((new.rutd_anulado = 'S') or (NEW.rutd_entregado = 'N'))  then
            begin
            UPDATE entrega_documentos E
                SET E.endo_fechae = null, E.endo_horae = null
                WHERE E.tido_cod = 31 AND E.endo_iddoc = old.rutd_factid;
            end
        if ((new.rutd_anulado = 'N') AND (NEW.rutd_entregado = 'S')) then
            begin
            if (EXISTS (SELECT ENDO_IDDOC FROM entrega_documentos WHERE tido_cod = 31 AND endo_iddoc = NEW.rutd_factid)) then
                UPDATE entrega_documentos E
                    SET E.endo_fechae = :FECHA, E.endo_horae = :HORA
                    WHERE E.tido_cod = 31 AND E.endo_iddoc = NEW.rutd_factid;
            ELSE
                insert into ENTREGA_DOCUMENTOS (TIDO_COD, ENDO_IDDOC, ENDO_FECHAE, ENDO_HORAE)
                values (31, new.rutd_factid, :FECHA, :HORA);
            end
        END
    END
end
^

/* Trigger: SALDOS_CUENTAS_BD */
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
^

/* Trigger: SALDOS_CUENTAS_BI */
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
^

/* Trigger: SALDOS_CUENTAS_BU */
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
^

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

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

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

/* Trigger: SALDOS_DOC_CARTERA_AD */
CREATE 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
^

/* Trigger: SALDOS_DOC_CARTERA_AI */
CREATE 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
^

/* Trigger: SALDOS_DOC_CARTERA_AU */
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) 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 = 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
^

/* Trigger: SALDOS_INICIALES_AD */
CREATE TRIGGER SALDOS_INICIALES_AD FOR SALDOS_INICIALES
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CUENTA VARCHAR(20);
DECLARE VARIABLE ANO VARCHAR(4);
DECLARE VARIABLE MES VARCHAR(2);
DECLARE VARIABLE INICIAL VARCHAR(10);
declare variable CUENNIT VARCHAR(40);
BEGIN
/* COMPONGA LA FECHA DE INICIO DE LA COMPAÑIA */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
if (strlen(ANO) <> 4) then
    exception ANO_INICIO_INCORRECTO;
ELSE
    if (strlen(MES) = 1) then
        INICIAL = ANO || '0' || MES || '01';
    else
        INICIAL = ANO || MES || '01';

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

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

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

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

/* Trigger: SALDOS_INICIALES_AU */
CREATE TRIGGER SALDOS_INICIALES_AU FOR SALDOS_INICIALES
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ANO varchar(4);
declare variable MES varchar(2);
declare variable INICIAL varchar(10);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENNIT VARCHAR(40);
begin
/* COMPONGA LA FECHA DE INICIO DE LA COMPAÑIA */
execute procedure LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') returning_values (ANO);
execute procedure LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') returning_values (MES);
if (strlen(ANO) <> 4) then
    exception ANO_INICIO_INCORRECTO;
else
    if (strlen(MES) = 1) then
        INICIAL = ANO || '0' || MES || '01';
    else
        INICIAL = ANO || MES || '01';
/* Actualice los saldos de fechas igual o posteriores */
update SALDOS_CUENTAS
  set SACU_SALDO = SACU_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
where (CUEN_COD = old.CUEN_COD) and (SACU_FECHA >= :INICIAL);
update SALDOS_TERCEROS
  set SATE_SALDO = SATE_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (TERC_NIT = old.TERC_NIT) and (SACU_FECHA >= :INICIAL);
update SALDOS_CENTROS
  set SACE_SALDO = SACE_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (PROY_COD = old.PROY_COD) and (CENT_COD = old.CENT_COD) and (SACU_FECHA >= :INICIAL);
update SALDOS_CENTROS_TERCERO
  set SACT_SALDO = SACT_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (PROY_COD = old.PROY_COD) and (CENT_COD = old.CENT_COD)
  and (TERC_NIT = old.TERC_NIT) and (SACU_FECHA >= :INICIAL);
/* REGISTRE LO NUEVO */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_CUENTAS
  WHERE (CUEN_COD = new.cuen_cod) 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 (new.cuen_cod, :INICIAL, new.SAIN_DEBITO-new.SAIN_CREDITO, 0, 0);
    end
else
    begin
    update SALDOS_CUENTAS
      set SACU_SALDO = SACU_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
      where (CUEN_COD = new.cuen_cod) and (SACU_FECHA = :INICIAL);
    end
/* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_TERCEROS
    WHERE (CUEN_COD = NEW.CUEN_COD) AND (TERC_NIT = NEW.TERC_NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
    BEGIN
    insert into SALDOS_TERCEROS(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
      values (new.CUEN_COD, new.TERC_NIT, :INICIAL, new.SAIN_DEBITO-new.SAIN_CREDITO, 0, 0);
    end
else
    begin
    update SALDOS_TERCEROS
      set SATE_SALDO = SATE_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
    where (CUEN_COD = new.CUEN_COD) and (TERC_NIT = new.TERC_NIT) and (SACU_FECHA = :INICIAL);
    end
/* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_CENTROS WHERE (CUEN_COD = NEW.CUEN_COD) AND (PROY_COD = NEW.PROY_COD) AND
    (CENT_COD = NEW.CENT_COD) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
  BEGIN
  insert into SALDOS_CENTROS(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
      values (new.CUEN_COD, new.PROY_COD, new.CENT_COD, :INICIAL, new.SAIN_DEBITO-new.SAIN_CREDITO, 0, 0);
  end
else
  begin
  update SALDOS_CENTROS
    set SACE_SALDO = SACE_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
  where (CUEN_COD = new.CUEN_COD) and (PROY_COD = new.PROY_COD) and (CENT_COD = new.CENT_COD) and (SACU_FECHA = :INICIAL);
  end
/* Busque en saldos_CENTROS_TERCERO si la encuentra actualice INICIAL, si no inserte un registro */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_CENTROS_TERCERO WHERE (CUEN_COD = NEW.CUEN_COD) AND (PROY_COD = NEW.PROY_COD) AND
    (CENT_COD = NEW.CENT_COD) AND (TERC_NIT = NEW.TERC_NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
  begin
  insert into SALDOS_CENTROS_TERCERO(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
      values (new.CUEN_COD, new.PROY_COD, new.CENT_COD, NEW.terc_nit, :INICIAL, new.SAIN_DEBITO-new.SAIN_CREDITO, 0, 0);
  end
else
  begin
  update SALDOS_CENTROS_TERCERO
    set SACT_SALDO = SACT_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
  where (CUEN_COD = new.CUEN_COD) and (PROY_COD = new.PROY_COD) and (CENT_COD = new.CENT_COD)
    and (TERC_NIT = new.TERC_NIT) and (SACU_FECHA = :INICIAL);
  end
/* Actualice los saldos de fechas posteriores */
update SALDOS_CUENTAS
  set SACU_SALDO = SACU_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
where (CUEN_COD = new.CUEN_COD) and (SACU_FECHA > :INICIAL);
update SALDOS_TERCEROS
  set SATE_SALDO = SATE_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
  where (CUEN_COD = new.CUEN_COD) and (TERC_NIT = new.TERC_NIT) and (SACU_FECHA > :INICIAL);
update SALDOS_CENTROS
  set SACE_SALDO = SACE_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
  where (CUEN_COD = new.CUEN_COD) and (PROY_COD = new.PROY_COD) and (CENT_COD = new.CENT_COD) and (SACU_FECHA > :INICIAL);
update SALDOS_CENTROS_TERCERO
  set SACT_SALDO = SACT_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
  where (CUEN_COD = new.CUEN_COD) and (PROY_COD = new.PROY_COD) and (CENT_COD = new.CENT_COD)
    and (TERC_NIT = new.TERC_NIT) and (SACU_FECHA > :INICIAL);
CUENNIT = NEW.cuen_cod || '-' || NEW.terc_nit;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 7, NEW.sain_item, 'U', SUBSTRING(:CUENNIT FROM 1 FOR 20), NULL);
end
^

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

/* Trigger: SALDOS_INICIALES_NIIF_AD */
CREATE TRIGGER SALDOS_INICIALES_NIIF_AD FOR SALDOS_INICIALES_NIIF
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CUENTA VARCHAR(20);
DECLARE VARIABLE ANO VARCHAR(4);
DECLARE VARIABLE MES VARCHAR(2);
DECLARE VARIABLE INICIAL VARCHAR(10);
declare variable CUENNIT VARCHAR(40);
BEGIN
/* COMPONGA LA FECHA DE INICIO DE LA COMPAÑIA */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE APERTURA NIIF') RETURNING_VALUES (ANO);
MES = 1;
if (strlen(ANO) <> 4) then
    exception ANO_INICIO_INCORRECTO;
ELSE
    if (strlen(MES) = 1) then
        INICIAL = ANO || '0' || MES || '01';
    else
        INICIAL = ANO || MES || '01';

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

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

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

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

/* Trigger: SALDOS_INICIALES_NIIF_AU */
CREATE TRIGGER SALDOS_INICIALES_NIIF_AU FOR SALDOS_INICIALES_NIIF
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ANO varchar(4);
declare variable MES varchar(2);
declare variable INICIAL varchar(10);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENNIT VARCHAR(40);
begin
/* COMPONGA LA FECHA DE INICIO DE LA COMPAÑIA */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE APERTURA NIIF') RETURNING_VALUES (ANO);
MES = 1;
if (strlen(ANO) <> 4) then
    exception ANO_INICIO_INCORRECTO;
else
    if (strlen(MES) = 1) then
        INICIAL = ANO || '0' || MES || '01';
    else
        INICIAL = ANO || MES || '01';
/* Actualice los saldos de fechas igual o posteriores */
update SALDOS_CUENTAS_NIIF
  set SACU_SALDO = SACU_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
where (CUEN_COD = old.CUEN_COD) and (SACU_FECHA >= :INICIAL);
update SALDOS_TERCEROS_NIIF
  set SATE_SALDO = SATE_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (TERC_NIT = old.TERC_NIT) and (SACU_FECHA >= :INICIAL);
update SALDOS_CENTROS_NIIF
  set SACE_SALDO = SACE_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (PROY_COD = old.PROY_COD) and (CENT_COD = old.CENT_COD) and (SACU_FECHA >= :INICIAL);
update SALDOS_CENTROS_TERCERO_NIIF
  set SACT_SALDO = SACT_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (PROY_COD = old.PROY_COD) and (CENT_COD = old.CENT_COD)
  and (TERC_NIT = old.TERC_NIT) and (SACU_FECHA >= :INICIAL);
/* REGISTRE LO NUEVO */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_CUENTAS_NIIF
  WHERE (CUEN_COD = new.cuen_cod) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
    BEGIN
    insert into SALDOS_CUENTAS_NIIF(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
      values (new.cuen_cod, :INICIAL, new.SAIN_DEBITO-new.SAIN_CREDITO, 0, 0);
    end
else
    begin
    update SALDOS_CUENTAS_NIIF
      set SACU_SALDO = SACU_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
      where (CUEN_COD = new.cuen_cod) and (SACU_FECHA = :INICIAL);
    end
/* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_TERCEROS_NIIF
    WHERE (CUEN_COD = NEW.CUEN_COD) AND (TERC_NIT = NEW.TERC_NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
    BEGIN
    insert into SALDOS_TERCEROS_NIIF(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
      values (new.CUEN_COD, new.TERC_NIT, :INICIAL, new.SAIN_DEBITO-new.SAIN_CREDITO, 0, 0);
    end
else
    begin
    update SALDOS_TERCEROS_NIIF
      set SATE_SALDO = SATE_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
    where (CUEN_COD = new.CUEN_COD) and (TERC_NIT = new.TERC_NIT) and (SACU_FECHA = :INICIAL);
    end
/* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_CENTROS_NIIF WHERE (CUEN_COD = NEW.CUEN_COD) AND (PROY_COD = NEW.PROY_COD) AND
    (CENT_COD = NEW.CENT_COD) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
  BEGIN
  insert into SALDOS_CENTROS_NIIF(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
      values (new.CUEN_COD, new.PROY_COD, new.CENT_COD, :INICIAL, new.SAIN_DEBITO-new.SAIN_CREDITO, 0, 0);
  end
else
  begin
  update SALDOS_CENTROS_NIIF
    set SACE_SALDO = SACE_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
  where (CUEN_COD = new.CUEN_COD) and (PROY_COD = new.PROY_COD) and (CENT_COD = new.CENT_COD) and (SACU_FECHA = :INICIAL);
  end
/* Busque en saldos_CENTROS_TERCERO si la encuentra actualice INICIAL, si no inserte un registro */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_CENTROS_TERCERO_NIIF WHERE (CUEN_COD = NEW.CUEN_COD) AND (PROY_COD = NEW.PROY_COD) AND
    (CENT_COD = NEW.CENT_COD) AND (TERC_NIT = NEW.TERC_NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
  begin
  insert into SALDOS_CENTROS_TERCERO_NIIF(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
      values (new.CUEN_COD, new.PROY_COD, new.CENT_COD, NEW.terc_nit, :INICIAL, new.SAIN_DEBITO-new.SAIN_CREDITO, 0, 0);
  end
else
  begin
  update SALDOS_CENTROS_TERCERO_NIIF
    set SACT_SALDO = SACT_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
  where (CUEN_COD = new.CUEN_COD) and (PROY_COD = new.PROY_COD) and (CENT_COD = new.CENT_COD)
    and (TERC_NIT = new.TERC_NIT) and (SACU_FECHA = :INICIAL);
  end
/* Actualice los saldos de fechas posteriores */
update SALDOS_CUENTAS_NIIF
  set SACU_SALDO = SACU_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
where (CUEN_COD = new.CUEN_COD) and (SACU_FECHA > :INICIAL);
update SALDOS_TERCEROS_NIIF
  set SATE_SALDO = SATE_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
  where (CUEN_COD = new.CUEN_COD) and (TERC_NIT = new.TERC_NIT) and (SACU_FECHA > :INICIAL);
update SALDOS_CENTROS_NIIF
  set SACE_SALDO = SACE_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
  where (CUEN_COD = new.CUEN_COD) and (PROY_COD = new.PROY_COD) and (CENT_COD = new.CENT_COD) and (SACU_FECHA > :INICIAL);
update SALDOS_CENTROS_TERCERO_NIIF
  set SACT_SALDO = SACT_SALDO + new.SAIN_DEBITO - new.SAIN_CREDITO
  where (CUEN_COD = new.CUEN_COD) and (PROY_COD = new.PROY_COD) and (CENT_COD = new.CENT_COD)
    and (TERC_NIT = new.TERC_NIT) and (SACU_FECHA > :INICIAL);
CUENNIT = NEW.cuen_cod || '-' || NEW.terc_nit;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1007, NEW.sain_item, 'U', SUBSTRING(:CUENNIT FROM 1 FOR 20), NULL);
end
^

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

/* Trigger: SALDO_BANCOS_AU */
CREATE TRIGGER SALDO_BANCOS_AU FOR SALDO_BANCOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
  /* SI QUEDO EN CEROS EL MONTO Y LAS RETES, ELIMINE EL REGISTRO */
  if ((NEW.saba_debitos = 0) AND (NEW.saba_creditos = 0) AND (NEW.saba_saldo = 0)) then
        DELETE FROM SALDO_BANCOS WHERE cuba_cod = NEW.cuba_cod;
end
^

/* Trigger: SALDO_BANCOS_CONF_AU */
CREATE TRIGGER SALDO_BANCOS_CONF_AU FOR SALDO_BANCOS_CONF
ACTIVE AFTER UPDATE POSITION 0
as
begin
  /* SI QUEDO EN CEROS EL MONTO Y LAS RETES, ELIMINE EL REGISTRO */
  if ((NEW.saba_debitos = 0) AND (NEW.saba_creditos = 0) AND (NEW.saba_saldo = 0)) then
        DELETE FROM SALDO_BANCOS_CONF WHERE cuba_cod = NEW.cuba_cod;
end
^

/* Trigger: SALDO_CAJA_AU */
CREATE 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
^

/* Trigger: SALDO_CAJA_BI */
CREATE TRIGGER SALDO_CAJA_BI FOR SALDO_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'SALDO_BANCOS'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
END
^

/* Trigger: SALDO_EFECTIVO_BI */
CREATE 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
^

/* Trigger: SALDO_EFECTIVO_BU */
CREATE 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
^

/* Trigger: SALIDAS_AD */
CREATE TRIGGER SALIDAS_AD FOR SALIDAS
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
if ((old.sali_reseid <> 0) and (old.sali_reseid is not null)) then
    update reservas set rese_anulado = 'N' where rese_id = old.sali_reseid;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 12, OLD.sali_id, 'D', OLD.pref_pre || OLD.sali_numero);
select enco_consec from comprobante_encabezado where enco_tiporef = 12 and enco_idref = old.sali_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 12 and enco_idref = old.sali_id;
end
^

/* Trigger: SALIDAS_AI */
CREATE TRIGGER SALIDAS_AI FOR SALIDAS
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
if ((new.sali_id <> 0) and (new.sali_anulado = 'N')) then
    BEGIN
    /* borre la reserva si la hay */
    if ((new.sali_reseid <> 0) and (new.sali_reseid is not null)) then
        update reservas set rese_anulado = 'S' where rese_id = new.sali_reseid;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 12, NEW.sali_id, 'I', NEW.pref_pre || NEW.sali_numero);
    END
END
^

/* Trigger: SALIDAS_AU */
CREATE TRIGGER SALIDAS_AU FOR SALIDAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.sali_anulado = 'S') then
    begin
    if ((old.sali_reseid <> 0) and (old.sali_reseid is not null)) then
        update reservas set rese_anulado = 'N' where rese_id = old.sali_reseid;
    select enco_consec from comprobante_encabezado where enco_tiporef = 12 and enco_idref = old.sali_id into :consec;
    if (NOT consec is null) then
      BEGIN
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      END
    delete from comprobante_encabezado where enco_tiporef = 12 and enco_idref = old.sali_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 12, new.sali_id, 'A', NEW.pref_pre || NEW.sali_numero);
    end

if ((new.sali_id <> 0) and (new.sali_anulado = 'N')) then
    BEGIN
    if ((new.sali_reseid <> 0) and (new.sali_reseid is not null)) then
        update reservas set rese_anulado = 'S' where rese_id = new.sali_reseid;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 12, new.sali_id, 'U', NEW.pref_pre || NEW.sali_numero);
    END
/* si cambia fecha o numero actualice los detalles */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.sali_numero <> NEW.sali_numero) or
    (OLD.sali_fecha <> NEW.sali_fecha)) then
    UPDATE SALIDAS_DETALLE SET SADE_TRANSMIT = 'N' WHERE SALI_ID = NEW.SALI_ID;
/* actualice los anulados y trasmitidos */
if (OLD.sali_anulado <> NEW.sali_anulado) then
    UPDATE SALIDAS_DETALLE SET SADE_ANULADO = NEW.sali_anulado WHERE SALI_ID = NEW.SALI_ID;
if (OLD.sali_transmit <> NEW.sali_transmit) then
    UPDATE SALIDAS_DETALLE SET SADE_TRANSMIT = NEW.sali_transmit WHERE SALI_ID = NEW.SALI_ID;
END
^

/* Trigger: SALIDAS_BI */
CREATE 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
^

/* Trigger: SALIDAS_DETALLE_AD */
CREATE TRIGGER SALIDAS_DETALLE_AD FOR SALIDAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
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
END
^

/* Trigger: SALIDAS_DETALLE_AI */
CREATE 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(8);
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
^

/* Trigger: SALIDAS_DETALLE_AU */
CREATE 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(8);
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
^

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

/* Trigger: SALIDAS_DETALLE_BU */
CREATE 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
^

/* Trigger: SERIALES_ARTICULO_BD */
CREATE TRIGGER SERIALES_ARTICULO_BD FOR SERIALES_ARTICULO
ACTIVE BEFORE DELETE POSITION 0
as
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
declare variable TIPONOM VARCHAR(8);
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
begin
if (OLD.sear_existe = 'N') then
    begin
    select tido_cod, sedo_iddoc from seriales_documento where sedo_articulo = old.arti_cod and sedo_bod = old.bode_cod and sedo_serial = old.sear_cod
        into :TIPO, :IDDOC;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :TIPO INTO :TIPONOM;
    EXECUTE PROCEDURE numero_documento(TIPO, IDDOC) returning_values (PREF, NUM);
    exception serial_ya_usado 'El Serial ' || old.sear_cod || ' del articulo ' || old.arti_cod || ' en la bodega ' || old.bode_cod || ' ya fue usado en el documento ' || :tiponom || ' ' || :pref || :num;
    end
end
^

/* Trigger: SERIALES_DOCUMENTO_AD */
CREATE TRIGGER SERIALES_DOCUMENTO_AD FOR SERIALES_DOCUMENTO
ACTIVE AFTER DELETE POSITION 0
as
begin
if (OLD.sedo_confirma = 'S') then
    if (OLD.sedo_entrada = 'S') then
        BEGIN
        DELETE FROM seriales_articulo
            WHERE ARTI_COD = OLD.sedo_articulo AND BODE_COD = OLD.sedo_bod AND SEAR_COD = OLD.SEDO_SERIAL;
        END
    ELSE
        BEGIN
        if (EXISTS (SELECT ARTI_COD FROM seriales_articulo
            WHERE ARTI_COD = OLD.sedo_articulo AND BODE_COD = OLD.sedo_bod AND SEAR_COD = OLD.SEDO_SERIAL AND SEAR_EXISTE = 'N')) then
            UPDATE seriales_articulo SET SEAR_EXISTE = 'S'
                WHERE ARTI_COD = OLD.sedo_articulo AND BODE_COD = OLD.sedo_bod AND SEAR_COD = OLD.SEDO_SERIAL;
        else
            exception serial_ya_usado 'No se encontro el serial ' || old.sedo_serial || ' para el articulo ' || old.sedo_articulo;
        END
end
^

/* Trigger: SERIALES_DOCUMENTO_AI */
CREATE TRIGGER SERIALES_DOCUMENTO_AI FOR SERIALES_DOCUMENTO
ACTIVE AFTER INSERT POSITION 0
as
begin
if (NEW.SEDO_CONFIRMA = 'S') then
    /* SI ES UN DOCUMENTO DE ENTRADA, GRABE LOS SERIALES DEL ARTICULO */
    if (NEW.sedo_entrada = 'S')  then
        BEGIN
        if (exists (SELECT SEAR_COD FROM SERIALES_ARTICULO WHERE ARTI_COD = NEW.sedo_articulo AND BODE_COD = NEW.sedo_bod AND SEAR_COD = NEW.SEDO_SERIAL )) then
            exception serial_ya_usado 'El serial ' || NEW.SEDO_SERIAL || ' del articulo ' || NEW.sedo_articulo || ' ya fue utilizado en otra entrada.';
        else
            INSERT INTO seriales_articulo (ARTI_COD, BODE_COD, SEAR_COD, SEAR_EXISTE)
                VALUES (NEW.sedo_articulo, NEW.sedo_bod, NEW.sedo_serial, 'S');
        END
    ELSE
        BEGIN
        if (EXISTS (SELECT ARTI_COD FROM seriales_articulo
            WHERE ARTI_COD = NEW.sedo_articulo AND BODE_COD = NEW.sedo_bod AND SEAR_COD = NEW.SEDO_SERIAL AND SEAR_EXISTE = 'S')) then
            UPDATE seriales_articulo SET SEAR_EXISTE = 'N'
                WHERE ARTI_COD = NEW.sedo_articulo AND BODE_COD = NEW.sedo_bod AND SEAR_COD = NEW.SEDO_SERIAL;
        else
            exception serial_ya_usado 'No se encontro el serial ' || new.sedo_serial || ' para el articulo ' || new.sedo_articulo;
        END
end
^

/* Trigger: SERIALES_DOCUMENTO_AU */
CREATE TRIGGER SERIALES_DOCUMENTO_AU FOR SERIALES_DOCUMENTO
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (NEW.SEDO_CONFIRMA = 'S') then
    BEGIN
    /* SI ES UN DOCUMENTO DE ENTRADA, GRABE LOS SERIALES DEL ARTICULO */
    if (NEW.sedo_entrada = 'S')  then
        BEGIN
        if (exists (SELECT SEAR_COD FROM SERIALES_ARTICULO WHERE ARTI_COD = NEW.sedo_articulo AND BODE_COD = NEW.sedo_bod AND SEAR_COD = NEW.SEDO_SERIAL AND SEAR_EXISTE = 'S')) then
            exception serial_ya_usado 'El serial ' || NEW.SEDO_SERIAL || ' del articulo ' || NEW.sedo_articulo || ' ya fue utilizado en otra entrada.';
        else
            UPDATE or INSERT INTO seriales_articulo (ARTI_COD, BODE_COD, SEAR_COD, SEAR_EXISTE)
                VALUES (NEW.sedo_articulo, NEW.sedo_bod, NEW.sedo_serial, 'S');
        END
    ELSE
        BEGIN
        if (EXISTS (SELECT ARTI_COD FROM seriales_articulo
            WHERE ARTI_COD = NEW.sedo_articulo AND BODE_COD = NEW.sedo_bod AND SEAR_COD = NEW.SEDO_SERIAL AND SEAR_EXISTE = 'S')) then
            UPDATE seriales_articulo SET SEAR_EXISTE = 'N'
                WHERE ARTI_COD = NEW.sedo_articulo AND BODE_COD = NEW.sedo_bod AND SEAR_COD = NEW.SEDO_SERIAL;
        else
            exception serial_ya_usado 'No se encontro el serial ' || new.sedo_serial || ' para el articulo ' || new.sedo_articulo;
        END
    END
ELSE
    BEGIN
    if (OLD.sedo_confirma = 'S') then
        if (OLD.sedo_entrada = 'S') then
            BEGIN
            /* SI ES ENTRADA O COMPRA BORRE EL SERIAL, SI ES DEVOLUCION DEJELO EN N (FACTURADO) */
            if (OLD.tido_cod = 33) then
                UPDATE SERIALES_ARTICULO SET SEAR_EXISTE = 'N'
                    WHERE ARTI_COD = OLD.sedo_articulo AND BODE_COD = OLD.sedo_bod AND SEAR_COD = OLD.SEDO_SERIAL;
            ELSE
                DELETE FROM seriales_articulo
                    WHERE ARTI_COD = OLD.sedo_articulo AND BODE_COD = OLD.sedo_bod AND SEAR_COD = OLD.SEDO_SERIAL;
            END
        ELSE
            BEGIN
            if (EXISTS (SELECT ARTI_COD FROM seriales_articulo
                WHERE ARTI_COD = OLD.sedo_articulo AND BODE_COD = OLD.sedo_bod AND SEAR_COD = OLD.SEDO_SERIAL AND SEAR_EXISTE = 'N')) then
                UPDATE seriales_articulo SET SEAR_EXISTE = 'S'
                    WHERE ARTI_COD = OLD.sedo_articulo AND BODE_COD = OLD.sedo_bod AND SEAR_COD = OLD.SEDO_SERIAL;
            else
                exception serial_ya_usado 'No se encontro el serial ' || old.sedo_serial || ' para el articulo ' || old.sedo_articulo;
            END
    END
end
^

/* Trigger: SERIALES_DOCUMENTO_BI */
CREATE TRIGGER SERIALES_DOCUMENTO_BI FOR SERIALES_DOCUMENTO
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.sedo_confirma IS NULL) then
    NEW.sedo_confirma = 'N';
end
^

/* Trigger: SOLICITUD_IMPORTACION_AD */
CREATE TRIGGER SOLICITUD_IMPORTACION_AD FOR SOLICITUD_IMPORTACION
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 139, OLD.SLIM_id, 'D', OLD.pref_pre || OLD.SLIM_numero);
end
^

/* Trigger: SOLICITUD_IMPORTACION_AI */
CREATE TRIGGER SOLICITUD_IMPORTACION_AI FOR SOLICITUD_IMPORTACION
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONC VARCHAR(60);
begin
if ((NEW.slim_id <> 0) and (new.slim_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 (139, NEW.slim_id, NEW.slim_fecha, NEW.terc_nit, 0, 0, 0, 0, 0, 0, 0, 'S', NEW.slim_total);
    /* Registre el movimiento del cliente
    CONC = 'ORDEN DE IMPORTACION No.' || NEW.PREF_PRE || NEW.SLIM_NUMERO;
    INSERT INTO movimiento_proveedor(MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_MONTOMON, MVPR_TIPOMON , MVPR_IMPORT, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO)
      VALUES (GEN_ID(ID_MOVPROV, 1), NEW.TERC_NIT, 139, NEW.SLIM_ID, NEW.SLIM_FECHA, NEW.SLIM_VENCE, :CONC, 0, NEW.slim_totmon, NEW.timo_cod, 'S' , 0, 0, 0, 'S', 'N', NEW.pref_pre, NEW.SLIM_numero);*/
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 139, NEW.SLIM_id, 'I', NEW.pref_pre || NEW.SLIM_numero);
    END
end
^

/* Trigger: SOLICITUD_IMPORTACION_AU */
CREATE TRIGGER SOLICITUD_IMPORTACION_AU FOR SOLICITUD_IMPORTACION
ACTIVE AFTER UPDATE POSITION 0
as
begin
/* ACTUALICE LOS ANULADOS Y TRASMITIDOS */
if (NEW.SLIM_anulado <> OLD.SLIM_anulado) then
    begin
    UPDATE solicitud_importacion_det SET SLDE_ANULADO = NEW.SLIM_anulado WHERE SLIM_ID = NEW.SLIM_ID;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 139, NEW.SLIM_id, 'A', NEW.pref_pre || NEW.SLIM_numero);
    end
ELSE
    BEGIN
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 139, NEW.SLIM_id, 'U', NEW.pref_pre || NEW.SLIM_numero);
    END
if (NEW.SLIM_TRASMIT <> OLD.SLIM_trasmit) then
    UPDATE solicitud_importacion_det SET SLDE_TRASMIT = NEW.SLIM_trasmit WHERE SLIM_ID = NEW.SLIM_ID;
end
^

/* Trigger: SOLICITUD_IMPORTACION_BI */
CREATE TRIGGER SOLICITUD_IMPORTACION_BI FOR SOLICITUD_IMPORTACION
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 = 139 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.SLIM_numero = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
        WHERE TIDO_COD = 139 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.SLIM_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
              SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
            WHERE TIDO_COD = 139 AND PREF_PRE = NEW.PREF_PRE;
        END
      EXECUTE PROCEDURE COMPLETA_CEROS (NEW.SLIM_numero) returning_values (NEW.SLIM_numero);
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM SOLICITUD_IMPORTACION WHERE PREF_PRE = NEW.PREF_PRE AND SLIM_NUMERO = NEW.SLIM_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
END
^

/* Trigger: SOLICITUD_IMPORTACION_DET_AI */
CREATE TRIGGER SOLICITUD_IMPORTACION_DET_AI FOR SOLICITUD_IMPORTACION_DET
ACTIVE AFTER INSERT POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable Nit varchar(20);
declare variable factor numeric(18,6);
declare variable COSTO NUMERIC(18,2);
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable TRM numeric(18,2);
begin
select S.slim_fecha, S.terc_nit, S.slim_dtomonto, S.slim_adicional, S.slim_total, S.slim_extra, S.taca_monto
    from solicitud_importacion S where S.slim_id = new.slim_id
    into :fec, :Nit, :dtopie, :adicional, :total, :extra, :TRM;
execute procedure factor_unidad_cant(new.arti_cod, new.slde_unidad) returning_values(factor);
COSTO = ((new.slde_prunit - NEW.slde_dtomonto) / :factor);
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);
    if ((FACT - ADICIONAL + DTOPIE) <> 0) then
        FACT = FACT / (FACT - ADICIONAL + DTOPIE);
    ELSE
        FACT = 1;
    COSTO = COSTO * FACT;
    END
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, PVAR_TRM, PVAR_UNIDAD, PVAR_FACTOR)
        VALUES (:Nit, NEW.ARTI_COD, NEW.slde_prunit * (1 - (NEW.slde_dtoporc/100)), :fec, NEW.slde_codprov,NEW.slde_desc, :TRM, NEW.slde_unidad, NEW.slde_factor);
  else
    UPDATE PROVEEDOR_ARTICULO
        SET PVAR_COSTO = NEW.slde_prunit * (1 - (NEW.slde_dtoporc/100)), PVAR_FECHA = :fec, PVAR_COD = NEW.slde_codprov, PVAR_TRM = :TRM, PVAR_UNIDAD = NEW.slde_unidad, PVAR_FACTOR = NEW.slde_factor
        WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
 END
end
^

/* Trigger: SORTEOS_CONFIGURACION_AI */
CREATE TRIGGER SORTEOS_CONFIGURACION_AI FOR SORTEOS_CONFIGURACION
ACTIVE AFTER INSERT POSITION 0
as
begin
/* cree el nuevo prefijo */
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 (84, NEW.sorc_pref, '000001', 'S', 'N', NULL, NULL, 'S', USER, NULL, NULL);
end
^

/* Trigger: SORTEOS_CONFIGURACION_BI */
CREATE TRIGGER SORTEOS_CONFIGURACION_BI FOR SORTEOS_CONFIGURACION
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (EXISTS (SELECT SORC_ID FROM SORTEOS_CONFIGURACION WHERE SORC_PREF = NEW.sorc_pref)) then
    BEGIN
    exception sorteo_ya_existe 'Ya existe un sorteo con el prefijo ' || new.sorc_pref || ' use otro prefijo.';
    END
if (new.sorc_unasola is null) then
    new.sorc_unasola = 'S';
if (new.sorc_grin is null) then
    new.sorc_grin = '';
if (new.sorc_sgin is null) then
    new.sorc_sgin = '';
if (new.sorc_marc is null) then
    new.sorc_marc = '';
if (new.sorc_arti is null) then
    new.sorc_arti = '';
end
^

/* Trigger: SORTEO_FACTURA_BI */
CREATE TRIGGER SORTEO_FACTURA_BI FOR SORTEO_FACTURA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(6);
begin
NEW.sort_id = GEN_ID(id_sorteo, 1);
SELECT PREF_ACTUAL FROM PREFIJOS WHERE PREF_PRE = NEW.sort_pref AND TIDO_COD = 84 INTO :NUMERO;
NEW.sort_numero = NUMERO;
NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
UPDATE PREFIJOS
    SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 84 AND PREF_PRE = NEW.sort_pref;
end
^

/* Trigger: STANDS_BI */
CREATE TRIGGER STANDS_BI FOR STANDS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.stand_cod is null) then
    new.stand_cod = '0000';
end
^

/* Trigger: SUBGRUPO_AD */
CREATE TRIGGER SUBGRUPO_AD FOR SUBGRUPO
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 202, 1, 'D', OLD.grup_cod || '|' || OLD.subg_cod);
end
^

/* Trigger: SUBGRUPO_AI */
CREATE TRIGGER SUBGRUPO_AI FOR SUBGRUPO
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 202, 1, 'I', NEW.grup_cod || '|' || NEW.subg_cod);
end
^

/* Trigger: SUBGRUPO_AU */
CREATE TRIGGER SUBGRUPO_AU FOR SUBGRUPO
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 202, 1, 'U', NEW.grup_cod || '|' || NEW.subg_cod);
end
^

/* Trigger: TARJETAS_BI */
CREATE TRIGGER TARJETAS_BI FOR TARJETAS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.tarj_comiiva IS NULL) then
    NEW.tarj_comiiva = 'N';
end
^

/* Trigger: TASA_CAMBIO_MONEDA_BI */
CREATE TRIGGER TASA_CAMBIO_MONEDA_BI FOR TASA_CAMBIO_MONEDA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable existe char(1);
begin
NEW.taca_id = gen_id(id_tasacambio, 1);
if (NEW.taca_valor IS NULL) then
    NEW.taca_valor = 1;
select 'S' from tasa_cambio_moneda t where t.taca_fecha = new.taca_fecha and t.timo_cod = new.timo_cod into :existe;
if (existe is not null) then
exception tasa_cambio_registrada;
end
^

/* Trigger: TAXONOMIA_DETALLE_BI */
CREATE TRIGGER TAXONOMIA_DETALLE_BI FOR TAXONOMIA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable MAXIM INTEGER;
begin
SELECT MAX(TD.taxd_item) FROM TAXONOMIA_DETALLE TD WHERE TD.taxo_id = NEW.taxo_id AND TD.taxe_id = NEW.taxe_id INTO :MAXIM;
if (MAXIM IS NULL) then
    NEW.taxd_item = 1;
ELSE
    NEW.taxd_item = MAXIM + 1;
end
^

/* Trigger: TERCEROS_AD */
CREATE TRIGGER TERCEROS_AD FOR TERCEROS
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(audi_usuario, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 102, 1, 'D', OLD.terc_nit);
end
^

/* Trigger: TERCEROS_AI */
CREATE 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
^

/* Trigger: TERCEROS_AU */
CREATE TRIGGER TERCEROS_AU FOR TERCEROS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable NUMROWS INTEGER;
declare variable ACTSUC CHAR(2);
declare variable DATOS VARCHAR(4096);
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');

DATOS = 'TERC_NIT=' || OLD.TERC_NIT || '|TERC_NOM=' || OLD.TERC_NOM || '|TERC_DIR=' || OLD.TERC_DIR || '|TERC_CIU=' || OLD.TERC_CIU || '|TERC_TEL=' || OLD.TERC_TEL || 
'|TERC_CONTACTO=' || OLD.TERC_CONTACTO || '|TERC_EMAIL=' || OLD.TERC_EMAIL || '|TERC_FAX=' || OLD.TERC_FAX || '|TERC_CEL=' || OLD.TERC_CEL || '|TERC_CLIE=' || OLD.TERC_CLIE || 
'|TERC_PROV=' || OLD.TERC_PROV || '|TERC_EMPL=' || OLD.TERC_EMPL || '|TERC_CTARTFTE=' || OLD.TERC_CTARTFTE || '|TERC_CTARTIVA=' || OLD.TERC_CTARTIVA || '|TERC_CTARTICA=' || OLD.TERC_CTARTICA || 
'|TERC_CTAVENTA=' || OLD.TERC_CTAVENTA || '|TERC_CTACLIENTE=' || OLD.TERC_CTACLIENTE || '|TERC_CTAPROV=' || OLD.TERC_CTAPROV || '|TERC_CTAEMPL=' || OLD.TERC_CTAEMPL || 
'|TERC_DV=' || OLD.TERC_DV || '|CIUD_COD=' || OLD.CIUD_COD || '|TERC_TIPOID=' || OLD.TERC_TIPOID || '|TERC_USUARIO=' || OLD.TERC_USUARIO || '|TERC_APELLIDO1=' || OLD.TERC_APELLIDO1 || 
'|TERC_APELLIDO2=' || OLD.TERC_APELLIDO2 || '|TERC_NOMBRE1=' || OLD.TERC_NOMBRE1 || '|TERC_NOMBRE2=' || OLD.TERC_NOMBRE2 || '|TERC_EXENTO=' || OLD.TERC_EXENTO || 
'|    TERC_ANIV=' || OLD.TERC_ANIV || '|TERC_ESTADO=' || OLD.TERC_ESTADO || '|TERC_ADMINI=' || OLD.TERC_ADMINI || '|TERC_CONDUCTOR=' || OLD.TERC_CONDUCTOR || '|TERC_LICVEN=' || OLD.TERC_LICVEN || 
'|TERC_CATEGORIA=' || OLD.TERC_CATEGORIA || '|PAIS_ID=' || OLD.PAIS_ID || '|TERC_ASOCIADO=' || OLD.TERC_ASOCIADO || '|TERC_ASOCINAC=' || OLD.TERC_ASOCINAC || '|TERC_TRANS=' || OLD.TERC_TRANS || 
'|TERC_NITCONTA=' || OLD.TERC_NITCONTA || '|TERC_DVDIAN=' || OLD.TERC_DVDIAN || '|TERC_SIMPLIFICA=' || OLD.TERC_SIMPLIFICA || '|TERC_DEPOS=' || OLD.TERC_DEPOS || 
'|TERC_CTARCREE=' || OLD.TERC_CTARCREE || '|TERC_ACTIVIDAD=' || OLD.TERC_ACTIVIDAD || '|TERC_CONCSH=' || OLD.TERC_CONCSH || '|TERC_CTACLIENIIF=' || OLD.TERC_CTACLIENIIF || 
'|TERC_CTAPROVNIIF=' || OLD.TERC_CTAPROVNIIF || '|TERC_CTARFTENIIF=' || OLD.TERC_CTARFTENIIF || '|TERC_CTARIVANIIF=' || OLD.TERC_CTARIVANIIF || '|TERC_CTARICANIIF=' || OLD.TERC_CTARICANIIF || 
'|TERC_CTARCREENIIF=' || OLD.TERC_CTARCREENIIF || '|TERC_CTAVTANIIF=' || OLD.TERC_CTAVTANIIF || '|TERC_LICENCIA=' || OLD.TERC_LICENCIA;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_DATOS)
    VALUES (USER, 102, 1, 'U', NEW.terc_nit, :DATOS);
/* 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;

if ((new.terc_licencia is not null) and (new.terc_licencia <> old.terc_licencia)) then
    begin
    if (exists (select c.terc_nit from conductor c where c.terc_nit = new.terc_nit and c.cond_fecha = cast('NOW' as date))) then
        update conductor set cond_licencia = new.terc_licencia, cond_vence = new.terc_licven, cond_categoria = new.terc_categoria
            where terc_nit = new.terc_nit and cond_fecha = cast('NOW' as date);
    else
        insert into conductor (terc_nit, cond_fecha, cond_licencia, cond_vence, cond_categoria)
            values (new.terc_nit, cast('NOW' as date), new.terc_licencia, new.terc_licven, new.terc_categoria);
    end
/* SI TIENE UNA SOLA SUCURSAL ACTUALICELA AL CAMBIAR EL PRINCIPAL */
execute procedure lee_configuracion('CARTERA', 'GENERAL', 'ACTUALIZAR AUTOMATICAMENTE NOMBRE Y UBICACION DE LA SUCURSAL EN CLIENTES CON UNA SOLA SUCURSAL') returning_values (:ACTSUC);
if (ACTSUC = 'SI') then
    BEGIN
    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
end
^

/* Trigger: TERCEROS_BD */
CREATE 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
^

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

/* Trigger: TERCEROS_BU */
CREATE 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
^

/* Trigger: TERCEROS_CONTACTOS_AD */
CREATE TRIGGER TERCEROS_CONTACTOS_AD FOR TERCEROS_CONTACTOS
ACTIVE AFTER DELETE POSITION 0
as
begin
DELETE FROM crm_contactos WHERE CRCL_NIT = OLD.terc_nit AND CRCO_ID = OLD.tecc_item;
end
^

/* Trigger: TERCEROS_CONTACTOS_AI */
CREATE TRIGGER TERCEROS_CONTACTOS_AI FOR TERCEROS_CONTACTOS
ACTIVE AFTER INSERT POSITION 0
as
begin
if (EXISTS (SELECT CRCL_NIT FROM crm_contactos WHERE CRCL_NIT = NEW.terc_nit AND CRCO_ID = NEW.tecc_item)) then
    UPDATE crm_contactos SET CRCO_NOMBRE = NEW.tecc_nombre,
        CRCO_CARGO = NEW.tecc_cargo, CRCO_TELEFONOS = NEW.tecc_telefonos, CRCO_EMAIL = NEW.tecc_email,
        CRCO_FAX = NEW.tecc_fax, CRCO_CEL = NEW.tecc_cel, CRCO_REPLICA = 'N'
        WHERE CRCL_NIT = NEW.terc_nit AND CRCO_ID = NEW.tecc_item;
ELSE
    insert into crm_contactos (CRCL_NIT, CRCO_ID, CRCO_NOMBRE, CRCO_CARGO, CRCO_TELEFONOS, CRCO_EMAIL, CRCO_FAX, CRCO_CEL, CRCO_REPLICA)
        VALUES(NEW.TERC_NIT, NEW.TECC_ITEM, NEW.TECC_NOMBRE, NEW.TECC_CARGO, NEW.TECC_TELEFONOS, NEW.TECC_EMAIL, NEW.TECC_FAX, NEW.TECC_CEL, 'N');
end
^

/* Trigger: TERCEROS_CONTACTOS_AU */
CREATE TRIGGER TERCEROS_CONTACTOS_AU FOR TERCEROS_CONTACTOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (EXISTS (SELECT CRCL_NIT FROM crm_contactos WHERE CRCL_NIT = NEW.terc_nit AND CRCO_ID = NEW.tecc_item)) then
    UPDATE crm_contactos SET CRCO_NOMBRE = NEW.tecc_nombre,
        CRCO_CARGO = NEW.tecc_cargo, CRCO_TELEFONOS = NEW.tecc_telefonos, CRCO_EMAIL = NEW.tecc_email,
        CRCO_FAX = NEW.tecc_fax, CRCO_CEL = NEW.tecc_cel, CRCO_REPLICA = 'N'
        WHERE CRCL_NIT = NEW.terc_nit AND CRCO_ID = NEW.tecc_item;
ELSE
    insert into crm_contactos (CRCL_NIT, CRCO_ID, CRCO_NOMBRE, CRCO_CARGO, CRCO_TELEFONOS, CRCO_EMAIL, CRCO_FAX, CRCO_CEL, CRCO_REPLICA)
        VALUES(NEW.TERC_NIT, NEW.TECC_ITEM, NEW.TECC_NOMBRE, NEW.TECC_CARGO, NEW.TECC_TELEFONOS, NEW.TECC_EMAIL, NEW.TECC_FAX, NEW.TECC_CEL, 'N');
end
^

/* Trigger: TERCERO_DOCUMENTOS_BI */
CREATE TRIGGER TERCERO_DOCUMENTOS_BI FOR TERCERO_DOCUMENTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
select max(tedo_item)+1 from tercero_documentos where terc_nit = new.terc_nit into new.tedo_item;
if (new.tedo_item is null) then
    new.tedo_item = 1;
end
^

/* Trigger: TIPO_COMPROBANTE_AD */
CREATE TRIGGER TIPO_COMPROBANTE_AD FOR TIPO_COMPROBANTE
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_COD, AUDI_OPER)
    VALUES (USER, 121, old.tico_cod, 'D');
end
^

/* Trigger: TIPO_COMPROBANTE_AI */
CREATE TRIGGER TIPO_COMPROBANTE_AI FOR TIPO_COMPROBANTE
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_COD, AUDI_OPER)
    VALUES (USER, 121, NEW.tico_cod, 'I');
end
^

/* Trigger: TIPO_COMPROBANTE_AU */
CREATE TRIGGER TIPO_COMPROBANTE_AU FOR TIPO_COMPROBANTE
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_COD, AUDI_OPER)
    VALUES (USER, 121, NEW.tico_cod, 'U');
end
^

/* Trigger: TIPO_COMPROBANTE_BI */
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
^

/* Trigger: TIQUETE_PASAJERO_AD */
CREATE TRIGGER TIQUETE_PASAJERO_AD FOR TIQUETE_PASAJERO
ACTIVE AFTER DELETE POSITION 0
as
declare variable ABONOS INTEGER;
begin
IF ((OLD.tiqp_id <> 0) and (OLD.tiqp_anulado = 'N')) THEN
    BEGIN
    if (OLD.tiqp_formap = 'R') then
        BEGIN
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 86 AND SDCA_IDREF = OLD.tiqp_id AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) then
            BEGIN
            /* BORRE EL REGISTRO PREVIO */
            delete from saldos_doc_cartera where sdca_tiporef = 86 and sdca_idref = old.tiqp_id;
            delete from movimiento_clientes where (mvcl_tiporef = 86) and (mvcl_idref = old.tiqp_id);
            END
        else
            exception DOCUMENTO_CON_ABONOS;
        END
    if ((OLD.tiqp_formap = 'C') AND (OLD.tiqp_caja <> 0) AND (OLD.tiqp_caja IS NOT NULL)) then
        BEGIN
        DELETE FROM MOVIMIENTO_CAJA WHERE moca_tiporef = 86 and moca_idref = OLD.tiqp_id;
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (OLD.tiqp_caja, OLD.tiqp_fecha, OLD.tiqp_total, 'S');
        END

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 86, OLD.tiqp_id, 'D', OLD.tiqp_pref || OLD.tiqp_numero);
    END
end
^

/* Trigger: TIQUETE_PASAJERO_AI */
CREATE TRIGGER TIQUETE_PASAJERO_AI FOR TIQUETE_PASAJERO
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONC VARCHAR(60);
begin
IF ((NEW.tiqp_id <> 0) AND (NEW.tiqp_anulado = 'N')) THEN
  BEGIN
  /* AFECTE LA CAJA O LA CARTERA */
  if ((NEW.tiqp_formap = 'C') AND (NEW.tiqp_caja <> 0) AND (NEW.tiqp_caja IS NOT NULL)) then
    BEGIN
    CONC = 'TIQUETE DE PASAJEROS No. ' || NEW.tiqp_pref || NEW.tiqp_numero;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), NEW.tiqp_caja, 86, NEW.tiqp_pref, NEW.tiqp_numero, NEW.tiqp_fecha, :Conc, NEW.tiqp_total, 0, 'S', new.tiqp_id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (NEW.tiqp_caja, NEW.tiqp_fecha, NEW.tiqp_total, 'N');
    END
  if (NEW.tiqp_formap = 'R') then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (86, NEW.tiqp_id, NEW.tiqp_fecha, NEW.tiqp_nit, 0, 0, 0, 0, 0, 0, 0, 'S', NEW.tiqp_total);
    /* Registre el movimiento del cliente */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.tiqp_nit, 86, NEW.tiqp_id, NEW.tiqp_fecha, NEW.tiqp_fecha, :CONC, NEW.tiqp_total, 0, 0, 0, 'S', 'N', NEW.tiqp_pref, NEW.tiqp_numero, '01', NEW.tiqp_vend);
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 86, NEW.tiqp_id, 'I', NEW.tiqp_pref || NEW.tiqp_numero);
  END
end
^

/* Trigger: TIQUETE_PASAJERO_AU */
CREATE TRIGGER TIQUETE_PASAJERO_AU FOR TIQUETE_PASAJERO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CONC VARCHAR(60);
declare variable ABONOS INTEGER;
begin
/* ACTUALICE LOS ANULADOS Y TRASMITIDOS */
if (NEW.tiqp_anulado <> OLD.tiqp_anulado) then
    BEGIN
    if (NEW.tiqp_anulado = 'S') then
        INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
            VALUES (USER, 86, NEW.tiqp_id, 'A', NEW.tiqp_pref || NEW.tiqp_numero);
    end
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 86, NEW.tiqp_id, 'U', NEW.tiqp_pref || NEW.tiqp_numero);
IF ((OLD.tiqp_id <> 0) and (OLD.tiqp_anulado = 'N')) THEN
    BEGIN
    if (OLD.tiqp_formap = 'R') then
        BEGIN
        select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 86 AND SDCA_IDREF = OLD.tiqp_id AND SDCA_ABONO <> 0 INTO :ABONOS;
        if (ABONOS = 0) then
            BEGIN
            /* BORRE EL REGISTRO PREVIO */
            delete from saldos_doc_cartera where sdca_tiporef = 86 and sdca_idref = old.tiqp_id;
            delete from movimiento_clientes where (mvcl_tiporef = 86) and (mvcl_idref = old.tiqp_id);
            END
        else
            exception DOCUMENTO_CON_ABONOS;
        END
    if ((OLD.tiqp_formap = 'C') AND (OLD.tiqp_caja <> 0) AND (OLD.tiqp_caja IS NOT NULL)) then
        BEGIN
        DELETE FROM MOVIMIENTO_CAJA WHERE moca_tiporef = 86 and moca_idref = OLD.tiqp_id;
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (OLD.tiqp_caja, OLD.tiqp_fecha, OLD.tiqp_total, 'S');
        END
    END
IF ((NEW.tiqp_id <> 0) and (NEW.tiqp_anulado = 'N')) THEN
  BEGIN
  /* AFECTE LA CAJA O LA CARTERA */
  if ((NEW.tiqp_formap = 'C') AND (NEW.tiqp_caja <> 0) AND (NEW.tiqp_caja IS NOT NULL)) then
    BEGIN
    CONC = 'TIQUETE DE PASAJEROS No. ' || NEW.tiqp_pref || NEW.tiqp_numero;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), NEW.tiqp_caja, 86, NEW.tiqp_pref, NEW.tiqp_numero, NEW.tiqp_fecha, :Conc, NEW.tiqp_total, 0, 'S', new.tiqp_id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (NEW.tiqp_caja, NEW.tiqp_fecha, NEW.tiqp_total, 'N');
    END
  if (NEW.tiqp_formap = 'R') then
    BEGIN
    /* Registre el nuevo saldo del documento */
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
        VALUES (86, NEW.tiqp_id, NEW.tiqp_fecha, NEW.tiqp_nit, 0, 0, 0, 0, 0, 0, 0, 'S', NEW.tiqp_total);
    /* Registre el movimiento del cliente */
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD)
      VALUES (GEN_ID(ID_MOVCLI, 1), NEW.tiqp_nit, 86, NEW.tiqp_id, NEW.tiqp_fecha, NEW.tiqp_fecha, :CONC, NEW.tiqp_total, 0, 0, 0, 'S', 'N', NEW.tiqp_pref, NEW.tiqp_numero, '01', NEW.tiqp_vend);
    END
  END
end
^

/* Trigger: TIQUETE_PASAJERO_BD */
CREATE TRIGGER TIQUETE_PASAJERO_BD FOR TIQUETE_PASAJERO
ACTIVE BEFORE DELETE POSITION 0
as
begin
  /* si esta en una planilla no lo puede anular */
  if (old.tiqp_planilla <> 0) then
    exception tiquete_usado;
end
^

/* Trigger: TIQUETE_PASAJERO_BI */
CREATE TRIGGER TIQUETE_PASAJERO_BI FOR TIQUETE_PASAJERO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.tiqp_numok = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 86 AND PREF_PRE = NEW.tiqp_pref INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.tiqp_numero = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
        UPDATE PREFIJOS
          SET PREF_ACTUAL = :NUMERO
          WHERE TIDO_COD = 86 AND PREF_PRE = NEW.tiqp_pref;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.tiqp_numero AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
                WHERE TIDO_COD = 86 AND PREF_PRE = NEW.tiqp_pref;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS (NEW.tiqp_numero) returning_values (NEW.tiqp_numero);
    NEW.tiqp_numok = 'S';
    END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM tiquete_pasajero WHERE TIQP_PREF = NEW.tiqp_pref AND TIQP_NUMERO = NEW.tiqp_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO;
end
^

/* Trigger: TIQUETE_PASAJERO_BU */
CREATE TRIGGER TIQUETE_PASAJERO_BU FOR TIQUETE_PASAJERO
ACTIVE BEFORE UPDATE POSITION 0
as
begin
  /* si esta en una planilla no lo puede anular */
  if ((old.tiqp_planilla <> 0) AND (NEW.tiqp_planilla <> 0)) then
    exception tiquete_usado;
end
^

/* Trigger: TI_AJUSTES */
CREATE TRIGGER TI_AJUSTES FOR AJUSTES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'AJUSTES'  */
    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;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'AJUSTES'  */
    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
END
^

/* Trigger: TI_AJUSTES_DETALLE */
CREATE TRIGGER TI_AJUSTES_DETALLE FOR AJUSTES_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'AJUSTES_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 'AJUSTES_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 'AJUSTES' MUST EXIST WHEN INSERTING A CHILD IN 'AJUSTES_DETALLE'  */
    IF (NEW.AJUS_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   AJUSTES
       WHERE  AJUSTES.AJUS_ID = NEW.AJUS_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION AJUSTE_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_ANTICIPOS_CLIENTE */
CREATE TRIGGER TI_ANTICIPOS_CLIENTE FOR ANTICIPOS_CLIENTE
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;
       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_NO_EXISTE;
       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;
       END
    END
END
^

/* Trigger: TI_ANTICIPOS_PROVEEDOR */
CREATE TRIGGER TI_ANTICIPOS_PROVEEDOR FOR ANTICIPOS_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'ANTICIPOS_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;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'ANTICIPOS_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;
       END
    END
END
^

/* Trigger: TI_APLICACION_CLIENTE */
CREATE TRIGGER TI_APLICACION_CLIENTE FOR APLICACION_CLIENTE
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;
       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_NO_EXISTE;
       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;
       END
    END
END
^

/* Trigger: TI_APLICACION_CLIENTE_DETALLE */
CREATE TRIGGER TI_APLICACION_CLIENTE_DETALLE FOR APLICACION_CLIENTE_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMROWS INTEGER;
BEGIN
    IF (NEW.APCL_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   APLICACION_CLIENTE
       WHERE  APCL_ID = NEW.APCL_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION APLICACIONCL_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_APLICACION_PROVEDOR */
CREATE TRIGGER TI_APLICACION_PROVEDOR FOR APLICACION_PROVEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'ANTICIPOS_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;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'ANTICIPOS_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;
       END
    END
END
^

/* Trigger: TI_APLICACION_PROVEEDOR_DETALLE */
CREATE TRIGGER TI_APLICACION_PROVEEDOR_DETALLE FOR APLICACION_PROVEEDOR_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'APLICACION_PROVEDOR' MUST EXIST WHEN INSERTING A CHILD IN 'APLICACION_PROVEEDOR_DETALLE'  */
    IF (NEW.APPR_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   APLICACION_PROVEDOR
       WHERE  APPR_ID = NEW.APPR_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION APLICACIONPR_NO_EXISTE;
       END
    END
END
^

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

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

/* Trigger: TI_ARTICULO */
CREATE TRIGGER TI_ARTICULO FOR ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'SUBGRUPO' MUST EXIST WHEN INSERTING A CHILD IN 'ARTICULO'  */
    IF (NEW.GRUP_COD IS NOT NULL AND
        NEW.SUBG_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   SUBGRUPO
       WHERE  SUBGRUPO.GRUP_COD = NEW.GRUP_COD
        AND   SUBGRUPO.SUBG_COD = NEW.SUBG_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION SUBGRUPO_NO_EXISTE 'No existe el subgrupo ' || new.grup_cod || '-' || new.subg_cod;
       END
    END
    /*  PARENT 'MARCAS' MUST EXIST WHEN INSERTING A CHILD IN 'ARTICULO'  */
    IF (NEW.MARC_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   MARCAS
       WHERE  MARCAS.MARC_COD = NEW.MARC_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION MARCA_NO_EXISTE 'No existe la marca ' || new.marc_cod;
       END
    END
END
^

/* Trigger: TI_ARTICULOS_PRODUCTO */
CREATE TRIGGER TI_ARTICULOS_PRODUCTO FOR ARTICULOS_PRODUCTO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'ARTICULOS_PRODUCTO'  */
    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
^

/* Trigger: TI_AUTORIZACIONES */
CREATE TRIGGER TI_AUTORIZACIONES FOR AUTORIZACIONES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'AUTORIZACIONES'  */
    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;
       END
    END
END
^

/* Trigger: TI_BARRAS_ARTICULO */
CREATE 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
^

/* Trigger: TI_CAMBIODOC_ENTRADAS */
CREATE TRIGGER TI_CAMBIODOC_ENTRADAS FOR CAMBIODOC_ENTRADAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAMBIO_DOCUMENTOS' MUST EXIST WHEN INSERTING A CHILD IN 'CAMBIODOC_ENTRADAS'  */
    IF (NEW.CADO_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAMBIO_DOCUMENTOS
       WHERE  CAMBIO_DOCUMENTOS.CADO_ID = NEW.CADO_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAMBIODOC_NO_EXISTE;
       END
    END
    /*  PARENT 'FORMAS_PAGO' MUST EXIST WHEN INSERTING A CHILD IN 'CAMBIODOC_ENTRADAS'  */
    IF (NEW.FOPA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   FORMAS_PAGO
       WHERE  FORMAS_PAGO.FOPA_ID = NEW.FOPA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION FORMAPAGO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_CAMBIODOC_SALIDAS */
CREATE TRIGGER TI_CAMBIODOC_SALIDAS FOR CAMBIODOC_SALIDAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAMBIO_DOCUMENTOS' MUST EXIST WHEN INSERTING A CHILD IN 'CAMBIODOC_SALIDAS'  */
    IF (NEW.CADO_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAMBIO_DOCUMENTOS
       WHERE  CAMBIO_DOCUMENTOS.CADO_ID = NEW.CADO_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAMBIODOC_NO_EXISTE;
       END
    END
    /*  PARENT 'FORMAS_PAGO' MUST EXIST WHEN INSERTING A CHILD IN 'CAMBIODOC_SALIDAS'  */
    IF (NEW.FOPA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   FORMAS_PAGO
       WHERE  FORMAS_PAGO.FOPA_ID = NEW.FOPA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION FORMAPAGO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_CAMBIO_DOCUMENTOS */
CREATE TRIGGER TI_CAMBIO_DOCUMENTOS FOR CAMBIO_DOCUMENTOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'CAMBIO_DOCUMENTOS'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'CAMBIO_DOCUMENTOS'  */
    IF (NEW.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;
       END
    END
END
^

/* Trigger: TI_CENTROS */
CREATE TRIGGER TI_CENTROS FOR CENTROS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PROYECTOS' MUST EXIST WHEN INSERTING A CHILD IN 'CENTROS'  */
    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;
       END
    END
END
^

/* Trigger: TI_CHEQUERA */
CREATE TRIGGER TI_CHEQUERA FOR CHEQUERA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS_BANCO' MUST EXIST WHEN INSERTING A CHILD IN 'CHEQUERA'  */
    IF (NEW.CUBA_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS_BANCO
       WHERE  CUENTAS_BANCO.CUBA_COD = NEW.CUBA_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CUENTABANCO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_CHEQUES */
CREATE TRIGGER TI_CHEQUES FOR CHEQUES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS_BANCOS' MUST EXIST WHEN INSERTING A CHILD IN 'CHEQUES'  */
    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 = 72
        AND   PREFIJOS_BANCOS.PRBA_PREF = NEW.PRBA_PREF
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJOBANCO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_CLIENTES */
CREATE TRIGGER TI_CLIENTES FOR CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'TERCEROS' MUST EXIST WHEN INSERTING A CHILD IN 'CLIENTES'  */
    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
    IF (NEW.COBR_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   COBRADORES
       WHERE  COBR_COD = NEW.COBR_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION COBRADOR_NOREG;
       END
    END
    IF (NEW.VEND_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   VENDEDORES
       WHERE  VEND_COD = NEW.vEND_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION VENDEDOR_NOREG;
       END
    END
END
^

/* Trigger: TI_COMISIONES */
CREATE TRIGGER TI_COMISIONES FOR COMISIONES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'COMISIONES'  */
    IF (NEW.VEND_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   VENDEDORES
       WHERE  VENDEDORES.VEND_COD = NEW.VEND_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION VENDEDOR_NOREG;
       END
    END
END
^

/* Trigger: TI_COMPROBANTE_DETALLE */
CREATE TRIGGER TI_COMPROBANTE_DETALLE FOR COMPROBANTE_DETALLE
ACTIVE BEFORE INSERT POSITION 2
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
^

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

/* Trigger: TI_COMPROBANTE_ENCABEZADO */
CREATE TRIGGER TI_COMPROBANTE_ENCABEZADO FOR COMPROBANTE_ENCABEZADO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS_CONTA' MUST EXIST WHEN INSERTING A CHILD IN 'COMPROBANTE_ENCABEZADO'  */
    IF (NEW.TICO_COD IS NOT NULL AND
        NEW.PRCO_PREF IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS_CONTA
       WHERE  PREFIJOS_CONTA.TICO_COD = NEW.TICO_COD
        AND   PREFIJOS_CONTA.PRCO_PREF = NEW.PRCO_PREF
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION prefijo_conta_noexiste;
       END
    END
END
^

/* Trigger: TI_CONCEPTOS_CUENTAS */
CREATE TRIGGER TI_CONCEPTOS_CUENTAS FOR CONCEPTOS_CUENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CONCEPTOS' MUST EXIST WHEN INSERTING A CHILD IN 'CONCEPTOS_CUENTAS'  */
    IF (NEW.CONC_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CONCEPTOS
       WHERE  CONCEPTOS.CONC_COD = NEW.CONC_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION SDP_ICPE;
       END
    END
    /*  PARENT 'CUENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'CONCEPTOS_CUENTAS'  */
    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
END
^

/* Trigger: TI_CONSIGNA */
CREATE TRIGGER TI_CONSIGNA FOR 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
^

/* Trigger: TI_CONSIGNA_DETALLE */
CREATE TRIGGER TI_CONSIGNA_DETALLE FOR CONSIGNA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CONSIGNA' MUST EXIST WHEN INSERTING A CHILD IN 'CONSIGNA_DETALLE'  */
    IF (NEW.CONS_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CONSIGNA
       WHERE  CONSIGNA.CONS_ID = NEW.CONS_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CONSIGNA_NO_EXISTA;
       END
    END
    /*  PARENT 'FORMAS_PAGO' MUST EXIST WHEN INSERTING A CHILD IN 'CONSIGNA_DETALLE'  */
    IF (NEW.FOPA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   FORMAS_PAGO
       WHERE  FORMAS_PAGO.FOPA_ID = NEW.FOPA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION FORMAPAGO_NO_EXISTE;
       END
    END
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'CONSIGNA_DETALLE'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_CONSIGNA_TARJETAS */
CREATE TRIGGER TI_CONSIGNA_TARJETAS FOR CONSIGNA_TARJETAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBOS_CAJA'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBOS_CAJA'  */
    IF (NEW.PREF_PRE IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS
       WHERE  PREFIJOS.TIDO_COD = 64
        AND   PREFIJOS.PREF_PRE = NEW.PREF_PRE
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_CONSIGNA_TARJETAS_DET */
CREATE TRIGGER TI_CONSIGNA_TARJETAS_DET FOR CONSIGNA_TARJETAS_DET
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CONSIGNA_TARJETAS' MUST EXIST WHEN INSERTING A CHILD IN 'CONSIGNA_TARJETAS_DET'  */
    IF (NEW.COTJ_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CONSIGNA_TARJETAS
       WHERE  CONSIGNA_TARJETAS.COTJ_ID = NEW.COTJ_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CONSIGNATAR_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_CONSUMOS */
CREATE TRIGGER TI_CONSUMOS FOR CONSUMOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA'  */
    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;
       END
    END
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA'  */
    IF (NEW.VEND_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   VENDEDORES
       WHERE  VENDEDORES.VEND_COD = NEW.VEND_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION VENDEDOR_NOREG;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA'  */
    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 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA'  */
    IF (NEW.PREF_PRE IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS
       WHERE  PREFIJOS.TIDO_COD = 32
        AND   PREFIJOS.PREF_PRE = NEW.PREF_PRE
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_CONSUMO_DETALLE */
CREATE TRIGGER TI_CONSUMO_DETALLE FOR CONSUMO_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA_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 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA_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 'CONSUMOS' MUST EXIST WHEN INSERTING A CHILD IN 'CONSUMO_DETALLE'  */
    IF (NEW.CONS_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CONSUMOS
       WHERE  CONSUMOS.CONS_ID = NEW.CONS_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CONSUMO_NO_EXISTE;
       END
    END
END
^

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

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

/* Trigger: TI_COSTOS */
CREATE TRIGGER TI_COSTOS FOR COSTOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'COSTOS'  */
    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
^

/* Trigger: TI_COSTOS_NIIF */
CREATE TRIGGER TI_COSTOS_NIIF FOR COSTOS_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
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
      EXCEPTION ARTICULO_NO_EXISTE;
    END
END
^

/* Trigger: TI_COTIZACIONES */
CREATE TRIGGER TI_COTIZACIONES FOR COTIZACIONES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'COTIZACIONES'  */
    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;
       END
    END
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'COTIZACIONES'  */
    IF (NEW.VEND_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   VENDEDORES
       WHERE  VENDEDORES.VEND_COD = NEW.VEND_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION VENDEDOR_NOREG;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'COTIZACIONES'  */
    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;
       END
    END
END
^

/* Trigger: TI_COTIZACIONES_DETALLE */
CREATE TRIGGER TI_COTIZACIONES_DETALLE FOR COTIZACIONES_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'COTIZACIONES' MUST EXIST WHEN INSERTING A CHILD IN 'COTIZACIONES_DETALLE'  */
    IF (NEW.COTI_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   COTIZACIONES
       WHERE  COTIZACIONES.COTI_ID = NEW.COTI_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION COTIZACION_NO_EXISTE;
       END
    END
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'COTIZACIONES_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
END
^

/* Trigger: TI_COTIZACIONES_PROVEEDOR_DET */
CREATE TRIGGER TI_COTIZACIONES_PROVEEDOR_DET FOR COTIZACIONES_PROVEEDOR_DET
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'COTIZACION_PROVEEDOR' MUST EXIST WHEN INSERTING A CHILD IN 'COTIZACIONES_PROVEEDOR_DET'  */
    IF (NEW.COPR_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   COTIZACION_PROVEEDOR
       WHERE  COTIZACION_PROVEEDOR.COPR_ID = NEW.COPR_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION COTIZACION_NO_EXISTE;
       END
    END
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'COTIZACIONES_PROVEEDOR_DET'  */
    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 'COTIZACIONES_PROVEEDOR_DET'  */
    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
END
^

/* Trigger: TI_COTIZACION_PROVEEDOR */
CREATE TRIGGER TI_COTIZACION_PROVEEDOR FOR COTIZACION_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'COTIZACION_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;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'COTIZACION_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;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'COTIZACION_PROVEEDOR'  */
    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
END
^

/* Trigger: TI_CUENTAS_BANCO */
CREATE TRIGGER TI_CUENTAS_BANCO FOR CUENTAS_BANCO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'BANCOS' MUST EXIST WHEN INSERTING A CHILD IN 'CUENTAS_BANCO'  */
    IF (NEW.BANC_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   BANCOS
       WHERE  BANCOS.BANC_COD = NEW.BANC_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION BANCO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_DESENSAMBLES */
CREATE TRIGGER TI_DESENSAMBLES FOR DESENSAMBLES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'DESENSAMBLES'  */
    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;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'DESENSAMBLES'  */
    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
END
^

/* Trigger: TI_DESENSAMBLES_DETALLE */
CREATE TRIGGER TI_DESENSAMBLES_DETALLE FOR DESENSAMBLES_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'DESENSAMBLES_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 'DESENSAMBLES_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 'DESENSAMBLES' MUST EXIST WHEN INSERTING A CHILD IN 'DESENSAMBLES_DETALLE'  */
    IF (NEW.DESE_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   DESENSAMBLES
       WHERE  DESENSAMBLES.DESE_ID = NEW.DESE_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION DESENSAMBLE_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_DEVOLUCIONES_COMPRAS */
CREATE TRIGGER TI_DEVOLUCIONES_COMPRAS FOR DEVOLUCIONES_COMPRAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_COMPRAS'  */
    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;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_COMPRAS'  */
    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;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_COMPRAS'  */
    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
END
^

/* Trigger: TI_DEVOLUCIONES_COMPRAS_DET */
CREATE TRIGGER TI_DEVOLUCIONES_COMPRAS_DET FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'DEVOLUCIONES_COMPRAS' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_COMPRAS_DET'  */
    IF (NEW.DVCO_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   DEVOLUCIONES_COMPRAS
       WHERE  DEVOLUCIONES_COMPRAS.DVCO_ID = NEW.DVCO_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION DEVOLUCION_NO_EXISTE;
       END
    END
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_COMPRAS_DET'  */
    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 'DEVOLUCIONES_COMPRAS_DET'  */
    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
END
^

/* Trigger: TI_DEVOLUCIONES_VENTAS */
CREATE TRIGGER TI_DEVOLUCIONES_VENTAS FOR DEVOLUCIONES_VENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_VENTAS'  */
    IF (NEW.VEND_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   VENDEDORES
       WHERE  VENDEDORES.VEND_COD = NEW.VEND_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION VENDEDOR_NOREG;
       END
    END
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_VENTAS'  */
    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;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_VENTAS'  */
    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;
       END
    END
    /*  PARENT 'PUNTO_VENTA' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_VENTAS'  */
    IF (NEW.PTVT_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PUNTO_VENTA
       WHERE  PUNTO_VENTA.PTVT_ID = NEW.PTVT_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PUNTOVTA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_DEVOLUCIONES_VENTAS_DETALLE */
CREATE TRIGGER TI_DEVOLUCIONES_VENTAS_DETALLE FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_VENTAS_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 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_VENTAS_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 'DEVOLUCIONES_VENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'DEVOLUCIONES_VENTAS_DETALLE'  */
    IF (NEW.DEVT_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   DEVOLUCIONES_VENTAS
       WHERE  DEVOLUCIONES_VENTAS.DEVT_ID = NEW.DEVT_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION DEVOLUCION_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_DEVOLUCION_CHEQUES */
CREATE 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
^

/* Trigger: TI_DOCUMENTOS_PAGO_CAJA */
CREATE TRIGGER TI_DOCUMENTOS_PAGO_CAJA FOR DOCUMENTOS_PAGO_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'FORMAS_PAGO' MUST EXIST WHEN INSERTING A CHILD IN 'DOCUMENTOS_PAGO_CAJA'  */
    IF (NEW.FOPA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   FORMAS_PAGO
       WHERE  FORMAS_PAGO.FOPA_ID = NEW.FOPA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION FORMAPAGO_NO_EXISTE;
       END
    END
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'DOCUMENTOS_PAGO_CAJA'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_EGRESOS */
CREATE TRIGGER TI_EGRESOS FOR EGRESOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'EGRESOS'  */
    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;
       END
    END
END
^

/* Trigger: TI_EGRESOS_BANCO */
CREATE TRIGGER TI_EGRESOS_BANCO FOR EGRESOS_BANCO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'EGRESOS' MUST EXIST WHEN INSERTING A CHILD IN 'EGRESOS_CAJA'  */
    IF (NEW.EGRE_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   EGRESOS
       WHERE  EGRESOS.EGRE_ID = NEW.EGRE_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION EGRESO_NO_EXISTE;
       END
    END
    /*  PARENT 'CUENTAS_BANCO' MUST EXIST WHEN INSERTING A CHILD IN 'EGRESOS_BANCO'  */
    IF (NEW.CUBA_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS_BANCO
       WHERE  CUENTAS_BANCO.CUBA_COD = NEW.CUBA_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CUENTABANCO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_EGRESOS_CAJA */
CREATE TRIGGER TI_EGRESOS_CAJA FOR EGRESOS_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'EGRESOS' MUST EXIST WHEN INSERTING A CHILD IN 'EGRESOS_CAJA'  */
    IF (NEW.EGRE_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   EGRESOS
       WHERE  EGRESOS.EGRE_ID = NEW.EGRE_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION EGRESO_NO_EXISTE;
       END
    END
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'EGRESOS_CAJA'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
    /*  PARENT 'FORMAS_PAGO' MUST EXIST WHEN INSERTING A CHILD IN 'EGRESOS_CAJA'  */
    IF (NEW.FOPA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   FORMAS_PAGO
       WHERE  FORMAS_PAGO.FOPA_ID = NEW.FOPA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION FORMAPAGO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_EGRESOS_CONTABILIDAD */
CREATE TRIGGER TI_EGRESOS_CONTABILIDAD FOR EGRESOS_CONTABILIDAD
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'EGRESOS' MUST EXIST WHEN INSERTING A CHILD IN 'EGRESOS_CONTABILIDAD'  */
    IF (NEW.EGRE_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   EGRESOS
       WHERE  EGRESOS.EGRE_ID = NEW.EGRE_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION EGRESO_NO_EXISTE;
       END
    END
    /*  PARENT 'CUENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'EGRESOS_CONTABILIDAD'  */
    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
END
^

/* Trigger: TI_EGRESOS_DETALLE */
CREATE TRIGGER TI_EGRESOS_DETALLE FOR EGRESOS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'egresos' MUST EXIST WHEN INSERTING A CHILD  */
    IF (NEW.EGRE_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   EGRESOS
       WHERE  EGRESOS.EGRE_ID = NEW.EGRE_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION EGRESO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_ENSAMBLES */
CREATE TRIGGER TI_ENSAMBLES FOR ENSAMBLES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES'  */
    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;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'ENSAMBLES'  */
    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
END
^

/* Trigger: TI_ENSAMBLES_DETALLE */
CREATE TRIGGER TI_ENSAMBLES_DETALLE FOR ENSAMBLES_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.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.ENSA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   ENSAMBLES
       WHERE  ENSAMBLES.ENSA_ID = NEW.ENSA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ENSAMBLE_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_ENTRADAS */
CREATE TRIGGER TI_ENTRADAS FOR ENTRADAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'ENTRADAS'  */
    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;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'ENTRADAS'  */
    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
END
^

/* Trigger: TI_ENTRADAS_DETALLE */
CREATE TRIGGER TI_ENTRADAS_DETALLE FOR ENTRADAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE EXISTE CHAR(1);
declare variable LOTE CHAR(1);
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'ENTRADAS_DETALLE'  */
    IF (NEW.ARTI_COD IS NOT NULL) THEN
    BEGIN
       EXISTE = 'N';
       SELECT 'S', ARTI_EXIST
       FROM   ARTICULO
       WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
       INTO   :EXISTE, :LOTE;
       IF (EXISTE = 'N') THEN
          BEGIN
          EXCEPTION ARTICULO_NO_EXISTE 'No existe el artÃ­culo ' || new.arti_cod;
          END
       ELSE
          BEGIN
          if (LOTE = 'L') then
            BEGIN
            if (NEW.ENDE_LOTE IS NULL) then
              EXCEPTION LOTE_OBLIGATORIO 'Debe indicar un nÃºmero de lote para el artÃ­culo ' || new.arti_cod;
            END
          END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'ENTRADAS_DETALLE'  */
    IF (NEW.BODE_COD IS NOT NULL) THEN
    BEGIN
       EXISTE = 'N';
       SELECT 'S'
       FROM   BODEGA
       WHERE  BODEGA.BODE_COD = NEW.BODE_COD
       INTO   :EXISTE;
       IF (EXISTE = 'N') THEN
       BEGIN
          EXCEPTION BODEGA_NO_EXISTE 'La bodega ' || new.bode_cod || ' no existe.';
       END
    END
    /*  PARENT 'ENTRADAS' MUST EXIST WHEN INSERTING A CHILD IN 'ENTRADAS_DETALLE'  */
    IF (NEW.ENTR_ID IS NOT NULL) THEN
    BEGIN
       EXISTE = 'N';
       SELECT 'S'
       FROM   ENTRADAS
       WHERE  ENTRADAS.ENTR_ID = NEW.ENTR_ID
       INTO   :EXISTE;
       IF (EXISTE = 'N') THEN
       BEGIN
          EXCEPTION ENTRADA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_EXISTENCIA */
CREATE TRIGGER TI_EXISTENCIA FOR EXISTENCIA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'EXISTENCIA'  */
    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 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'EXISTENCIA'  */
    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
^

/* Trigger: TI_EXISTENCIA_LOTE */
CREATE 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
^

/* Trigger: TI_EXISTENCIA_TERCERO */
CREATE TRIGGER TI_EXISTENCIA_TERCERO FOR EXISTENCIA_TERCERO
ACTIVE BEFORE INSERT POSITION 0
as
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
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
IF (NEW.terc_nit IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   terceros
       WHERE  TERC_NIT = NEW.terc_nit
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
          EXCEPTION tercero_no_existe;
    IF (NEW.clsu_cod IS NOT NULL) THEN
        BEGIN
           SELECT COUNT(*)
           FROM   cliente_sucursales
           WHERE  TERC_NIT = NEW.terc_nit and CLCU_COD = NEW.CLSU_COD
           INTO   :NUMROWS;
           IF (NUMROWS = 0) THEN
           BEGIN
              EXCEPTION cliente_no_existe;
           END
        END
    END
END
^

/* Trigger: TI_FACTURAS */
CREATE TRIGGER TI_FACTURAS FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PUNTO_VENTA' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS'  */
    IF (NEW.PTVT_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PUNTO_VENTA
       WHERE  PUNTO_VENTA.PTVT_ID = NEW.PTVT_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PUNTOVTA_NO_EXISTE;
       END
    END
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS'  */
    IF (NEW.VEND_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   VENDEDORES
       WHERE  VENDEDORES.VEND_COD = NEW.VEND_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION VENDEDOR_NOREG;
       END
    END
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS'  */
    IF (NEW.TERC_NIT IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   cliente_sucursales
       WHERE  cliente_sucursales.TERC_NIT = NEW.TERC_NIT and cliente_sucursales.clcu_cod = new.fact_sucursal
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CLIENTE_NO_EXISTE 'No existe el cliente o la sucursal del cliente.';
       END
    END
    /*  PARENT 'AUTORIZACIONES' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS'  */
    IF (NEW.AUTO_NUMERO IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   AUTORIZACIONES
       WHERE  AUTORIZACIONES.AUTO_NUMERO = NEW.AUTO_NUMERO
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION AUTORIZACION_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_FACTURAS_COMPRA */
CREATE TRIGGER TI_FACTURAS_COMPRA FOR FACTURAS_COMPRA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS_COMPRA'  */
    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 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS_COMPRA'  */
    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;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS_COMPRA'  */
    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;
       END
    END
END
^

/* Trigger: TI_FACTURAS_COMPRAS_DETALLE */
CREATE TRIGGER TI_FACTURAS_COMPRAS_DETALLE FOR FACTURAS_COMPRAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'FACTURAS_COMPRA' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS_COMPRAS_DETALLE'  */
    IF (NEW.FACO_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   FACTURAS_COMPRA
       WHERE  FACTURAS_COMPRA.FACO_ID = NEW.FACO_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION FACTURA_NO_EXISTE;
       END
    END
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS_COMPRAS_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 'FACTURAS_COMPRAS_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
END
^

/* Trigger: TI_FACTURAS_DETALLE */
CREATE TRIGGER TI_FACTURAS_DETALLE FOR FACTURAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'FACTURAS' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS_DETALLE'  */
    IF (NEW.FACT_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   FACTURAS
       WHERE  FACTURAS.FACT_ID = NEW.FACT_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION FACTURA_NO_EXISTE;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS_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 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'FACTURAS_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 'El artÃ­culo ' || new.arti_cod || ' no existe.';
       END
    END
END
^

/* Trigger: TI_LISTAPREC_VENDEDOR */
CREATE TRIGGER TI_LISTAPREC_VENDEDOR FOR LISTAPREC_VENDEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'LISTAPREC_VENDEDOR'  */
    IF (NEW.VEND_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   VENDEDORES
       WHERE  VENDEDORES.VEND_COD = NEW.VEND_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION VENDEDOR_NOREG;
       END
    END
    /*  PARENT 'LISTA_PRECIOS' MUST EXIST WHEN INSERTING A CHILD IN 'LISTAPREC_VENDEDOR'  */
    IF (NEW.LIPR_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   LISTA_PRECIOS
       WHERE  LISTA_PRECIOS.LIPR_COD = NEW.LIPR_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION LISTA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_LOTES */
CREATE TRIGGER TI_LOTES FOR LOTES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'LOTES'  */
    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
^

/* Trigger: TI_MOVIMIENTO_ARTICULO */
CREATE TRIGGER TI_MOVIMIENTO_ARTICULO FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'MOVIMIENTO_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
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'MOVIMIENTO_ARTICULO'  */
    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
END
^

/* Trigger: TI_MOVIMIENTO_BANCO */
CREATE TRIGGER TI_MOVIMIENTO_BANCO FOR MOVIMIENTO_BANCO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS_BANCO' MUST EXIST WHEN INSERTING A CHILD IN 'MOVIMIENTO_BANCO'  */
    IF (NEW.CUBA_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS_BANCO
       WHERE  CUENTAS_BANCO.CUBA_COD = NEW.CUBA_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CUENTABANCO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_MOVIMIENTO_CAJA */
CREATE TRIGGER TI_MOVIMIENTO_CAJA FOR MOVIMIENTO_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'MOVIMIENTO_CAJA'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_MOVIMIENTO_CLIENTES */
CREATE TRIGGER TI_MOVIMIENTO_CLIENTES FOR MOVIMIENTO_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'MOVIMIENTO_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;
       END
    END
END
^

/* Trigger: TI_MOVIMIENTO_PROVEEDOR */
CREATE TRIGGER TI_MOVIMIENTO_PROVEEDOR FOR MOVIMIENTO_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'MOVIMIENTO_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;
       END
    END
END
^

/* Trigger: TI_NOTAS_CREDITO */
CREATE TRIGGER TI_NOTAS_CREDITO FOR 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
^

/* Trigger: TI_NOTAS_CREDITO_CLIENTES */
CREATE 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
^

/* Trigger: TI_NOTAS_CREDITO_PROVEEDOR */
CREATE 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
^

/* Trigger: TI_NOTAS_DEBITO */
CREATE TRIGGER TI_NOTAS_DEBITO FOR 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
^

/* Trigger: TI_NOTAS_DEBITO_CLIENTES */
CREATE 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
^

/* Trigger: TI_NOTAS_DEBITO_PROVEEDOR */
CREATE 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
^

/* Trigger: TI_ORDENES_COMPRA */
CREATE TRIGGER TI_ORDENES_COMPRA FOR ORDENES_COMPRA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'ORDENES_COMPRA'  */
    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;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'ORDENES_COMPRA'  */
    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;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'ORDENES_COMPRA'  */
    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
END
^

/* Trigger: TI_ORDENES_COMPRA_DETALLE */
CREATE TRIGGER TI_ORDENES_COMPRA_DETALLE FOR ORDENES_COMPRA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ORDENES_COMPRA' MUST EXIST WHEN INSERTING A CHILD IN 'ORDENES_COMPRA_DETALLE'  */
    IF (NEW.ORDC_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   ORDENES_COMPRA
       WHERE  ORDENES_COMPRA.ORDC_ID = NEW.ORDC_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ORDEN_NO_EXISTE;
       END
    END
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'ORDENES_COMPRA_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 'ORDENES_COMPRA_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
END
^

/* Trigger: TI_PEDIDOS */
CREATE TRIGGER TI_PEDIDOS FOR PEDIDOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'PEDIDOS'  */
    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;
       END
    END
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'PEDIDOS'  */
    IF (NEW.VEND_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   VENDEDORES
       WHERE  VENDEDORES.VEND_COD = NEW.VEND_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION VENDEDOR_NOREG;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'PEDIDOS'  */
    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;
       END
    END
END
^

/* Trigger: TI_PEDIDOS_DETALLE */
CREATE TRIGGER TI_PEDIDOS_DETALLE FOR PEDIDOS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'PEDIDOS_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 'PEDIDOS' MUST EXIST WHEN INSERTING A CHILD IN 'PEDIDOS_DETALLE'  */
    IF (NEW.PEDI_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PEDIDOS
       WHERE  PEDIDOS.PEDI_ID = NEW.PEDI_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PEDIDO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_PLANTILLA_DETALLE */
CREATE TRIGGER TI_PLANTILLA_DETALLE FOR PLANTILLA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'PLANTILLA_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 'PLANTILLA_ENCABEZADO' MUST EXIST WHEN INSERTING A CHILD IN 'PLANTILLA_DETALLE'  */
    IF (NEW.PLAN_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PLANTILLA_ENCABEZADO
       WHERE  PLANTILLA_ENCABEZADO.PLAN_ID = NEW.PLAN_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PLANTILLA_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
    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 'El articulo ' || new.arti_cod || ' no existe.';
       END
    END
END
^

/* Trigger: TI_PLANTILLA_DETALLE_N */
CREATE TRIGGER TI_PLANTILLA_DETALLE_N FOR PLANTILLA_DETALLE_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'PLANTILLA_DETALLE'  */
    IF (NEW.CUEN_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS_NIIF
       WHERE  CUEN_COD = NEW.CUEN_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CUENTA_NO_EXISTE 'La cuenta niif ' || new.cuen_cod || ' no existe.';
       END
    END
    /*  PARENT 'PLANTILLA_ENCABEZADO' MUST EXIST WHEN INSERTING A CHILD IN 'PLANTILLA_DETALLE'  */
    IF (NEW.PLAN_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PLANTILLA_ENCABEZADO
       WHERE  PLANTILLA_ENCABEZADO.PLAN_ID = NEW.PLAN_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PLANTILLA_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
    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 'El articulo ' || new.arti_cod || ' no existe.';
       END
    END
END
^

/* Trigger: TI_PLANTILLA_ENCABEZADO */
CREATE TRIGGER TI_PLANTILLA_ENCABEZADO FOR PLANTILLA_ENCABEZADO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS_CONTA' MUST EXIST WHEN INSERTING A CHILD IN 'PLANTILLA_ENCABEZADO'  */
    IF (NEW.TICO_COD IS NOT NULL AND
        NEW.PRCO_PREF IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS_CONTA
       WHERE  PREFIJOS_CONTA.TICO_COD = NEW.TICO_COD
        AND   PREFIJOS_CONTA.PRCO_PREF = NEW.PRCO_PREF
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJO_CONTA_NOEXISTE;
       END
    END
END
^

/* Trigger: TI_PRECIOS_ARTICULO */
CREATE TRIGGER TI_PRECIOS_ARTICULO FOR PRECIOS_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'PRECIOS_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
    /*  PARENT 'LISTA_PRECIOS' MUST EXIST WHEN INSERTING A CHILD IN 'PRECIOS_ARTICULO'  */
    IF (NEW.LIPR_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   LISTA_PRECIOS
       WHERE  LISTA_PRECIOS.LIPR_COD = NEW.LIPR_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION LISTA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_PREFIJOS */
CREATE TRIGGER TI_PREFIJOS FOR PREFIJOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'TIPO_DOCUMENTO' MUST EXIST WHEN INSERTING A CHILD IN 'PREFIJOS'  */
    IF (NEW.TIDO_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   TIPO_DOCUMENTO
       WHERE  TIPO_DOCUMENTO.TIDO_COD = NEW.TIDO_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION TIPODOC_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_PREFIJOS_BANCOS */
CREATE TRIGGER TI_PREFIJOS_BANCOS FOR PREFIJOS_BANCOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS_BANCO' MUST EXIST WHEN INSERTING A CHILD IN 'PREFIJOS_BANCOS'  */
    IF (NEW.CUBA_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS_BANCO
       WHERE  CUENTAS_BANCO.CUBA_COD = NEW.CUBA_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CUENTABANCO_NO_EXISTE;
       END
    END
    /*  PARENT 'TIPO_DOCUMENTO' MUST EXIST WHEN INSERTING A CHILD IN 'PREFIJOS_BANCOS'  */
    IF (NEW.TIDO_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   TIPO_DOCUMENTO
       WHERE  TIPO_DOCUMENTO.TIDO_COD = NEW.TIDO_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION TIPODOC_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_PREFIJOS_CONTA */
CREATE TRIGGER TI_PREFIJOS_CONTA FOR PREFIJOS_CONTA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'TIPO_COMPROBANTE' MUST EXIST WHEN INSERTING A CHILD IN 'PREFIJOS_CONTA'  */
    IF (NEW.TICO_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   TIPO_COMPROBANTE
       WHERE  TIPO_COMPROBANTE.TICO_COD = NEW.TICO_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION TIPOCOMP_NO_EXISTE 'El tipo de comprobante contable ' || new.tico_cod || ' no existe.';
       END
    END
END
^

/* Trigger: TI_PROVEEDORES */
CREATE TRIGGER TI_PROVEEDORES FOR PROVEEDORES
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'GRUPOS_PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'PROVEEDORES'  */
    IF (NEW.GRPR_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   GRUPOS_PROVEEDORES
       WHERE  GRUPOS_PROVEEDORES.GRPR_COD = NEW.GRPR_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION GRUPO_NO_EXISTE;
       END
    END
    /*  PARENT 'TERCEROS' MUST EXIST WHEN INSERTING A CHILD IN 'PROVEEDORES'  */
    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
^

/* Trigger: TI_PROVEEDOR_ARTICULO */
CREATE TRIGGER TI_PROVEEDOR_ARTICULO FOR PROVEEDOR_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'PROVEEDOR_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
    /*  PARENT 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'PROVEEDOR_ARTICULO'  */
    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
^

/* Trigger: TI_PUC */
CREATE TRIGGER TI_PUC FOR PUC
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'TIPO_PUC' MUST EXIST WHEN INSERTING A CHILD IN 'PUC'  */
    IF (NEW.TIPU_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   TIPO_PUC
       WHERE  TIPO_PUC.TIPU_COD = NEW.TIPU_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION SDP_ICPE;
       END
    END
END
^

/* Trigger: TI_PUNTO_VENTA */
CREATE TRIGGER TI_PUNTO_VENTA FOR PUNTO_VENTA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'PUNTO_VENTA'  */
    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
END
^

/* Trigger: TI_RECIBOS_CAJA */
CREATE TRIGGER TI_RECIBOS_CAJA FOR RECIBOS_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBOS_CAJA'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE 'NO EXISTE LA CAJA ' || NEW.CAJA_ID;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBOS_CAJA'  */
    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 || ' PARA EL RECIBO DE CAJA';
       END
    END
    /*  PARENT 'COBRADOR' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBOS_CAJA'  */
    IF (NEW.cobr_cod IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   cobradores
       WHERE  COBR_COD = NEW.cobr_cod AND COBR_ESTADO = 'S'
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION cobrador_no_existe 'NO EXISTE EL COBRADOR '  || NEW.cobr_cod || ' O ESTA INACTIVO.';
       END
    END
END
^

/* Trigger: TI_RECIBOS_CAJA_PAGO */
CREATE TRIGGER TI_RECIBOS_CAJA_PAGO FOR RECIBOS_CAJA_PAGO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'FORMAS_PAGO' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBOS_CAJA_PAGO'  */
    IF (NEW.FOPA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   FORMAS_PAGO
       WHERE  FORMAS_PAGO.FOPA_ID = NEW.FOPA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION FORMAPAGO_NO_EXISTE;
       END
    END
    /*  PARENT 'RECIBOS_CAJA' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBOS_CAJA_PAGO'  */
    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
END
^

/* Trigger: TI_RECIBO_PROVISIONAL */
CREATE TRIGGER TI_RECIBO_PROVISIONAL FOR RECIBO_PROVISIONAL
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBO_PROVISIONAL'  */
    IF (NEW.TERC_NIT IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM  TERCEROS
       WHERE TERC_NIT = NEW.TERC_NIT
       INTO  :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION TERCERO_NO_EXISTE;
       END
    END
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBO_PROVISIONAL'  */
    IF (NEW.VEND_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   VENDEDORES
       WHERE  VENDEDORES.VEND_COD = NEW.VEND_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION VENDEDOR_NOREG;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBO_PROVISIONAL'  */
    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;
       END
    END
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBO_PROVISIONAL'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_RECIBO_PROVISIONAL_DETALLE */
CREATE TRIGGER TI_RECIBO_PROVISIONAL_DETALLE FOR RECIBO_PROVISIONAL_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'RECIBO_PROVISIONAL' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBO_PROVISIONAL_DETALLE'  */
    IF (NEW.RCPR_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   RECIBO_PROVISIONAL
       WHERE  RECIBO_PROVISIONAL.RCPR_ID = NEW.RCPR_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION RECIBO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_RECIBO_PROVISIONAL_PAGO */
CREATE TRIGGER TI_RECIBO_PROVISIONAL_PAGO FOR RECIBO_PROVISIONAL_PAGO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'RECIBO_PROVISIONAL' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBO_PROVISIONAL_PAGO'  */
    IF (NEW.RCPR_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   RECIBO_PROVISIONAL
       WHERE  RECIBO_PROVISIONAL.RCPR_ID = NEW.RCPR_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION RECIBO_NO_EXISTE;
       END
    END
    /*  PARENT 'FORMAS_PAGO' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBO_PROVISIONAL_PAGO'  */
    IF (NEW.FOPA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   FORMAS_PAGO
       WHERE  FORMAS_PAGO.FOPA_ID = NEW.FOPA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION FORMAPAGO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_REGISTRO_CONCEPTOS */
CREATE TRIGGER TI_REGISTRO_CONCEPTOS FOR REGISTRO_CONCEPTOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CONCEPTOS' MUST EXIST WHEN INSERTING A CHILD IN 'REGISTRO_CONCEPTOS'  */
    IF (NEW.CONC_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CONCEPTOS
       WHERE  CONCEPTOS.CONC_COD = NEW.CONC_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION SDP_ICPE;
       END
    END
    /*  PARENT 'REGISTRO_AUTOMATICO' MUST EXIST WHEN INSERTING A CHILD IN 'REGISTRO_CONCEPTOS'  */
    IF (NEW.REAU_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   REGISTRO_AUTOMATICO
       WHERE  REGISTRO_AUTOMATICO.REAU_COD = NEW.REAU_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION SDP_ICPE;
       END
    END
END
^

/* Trigger: TI_REMISIONES_VENTA */
CREATE TRIGGER TI_REMISIONES_VENTA FOR REMISIONES_VENTA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CLIENTES' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA'  */
    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;
       END
    END
    /*  PARENT 'VENDEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA'  */
    IF (NEW.VEND_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   VENDEDORES
       WHERE  VENDEDORES.VEND_COD = NEW.VEND_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION VENDEDOR_NOREG;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA'  */
    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 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA'  */
    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;
       END
    END
END
^

/* Trigger: TI_REMISIONES_VENTA_DETALLE */
CREATE TRIGGER TI_REMISIONES_VENTA_DETALLE FOR REMISIONES_VENTA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA_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 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA_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 'REMISIONES_VENTA' MUST EXIST WHEN INSERTING A CHILD IN 'REMISIONES_VENTA_DETALLE'  */
    IF (NEW.REVT_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   REMISIONES_VENTA
       WHERE  REMISIONES_VENTA.REVT_ID = NEW.REVT_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION REMISION_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_REMISION_PROVEEDOR */
CREATE TRIGGER TI_REMISION_PROVEEDOR FOR REMISION_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PROVEEDORES' MUST EXIST WHEN INSERTING A CHILD IN 'REMISION_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;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'REMISION_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;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'REMISION_PROVEEDOR'  */
    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
END
^

/* Trigger: TI_REMISION_PROVEEDOR_DET */
CREATE TRIGGER TI_REMISION_PROVEEDOR_DET FOR REMISION_PROVEEDOR_DET
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'REMISION_PROVEEDOR' MUST EXIST WHEN INSERTING A CHILD IN 'REMISION_PROVEEDOR_DET'  */
    IF (NEW.REPR_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   REMISION_PROVEEDOR
       WHERE  REMISION_PROVEEDOR.REPR_ID = NEW.REPR_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION REMISION_NO_EXISTE;
       END
    END
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'REMISION_PROVEEDOR_DET'  */
    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 'REMISION_PROVEEDOR_DET'  */
    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
END
^

/* Trigger: TI_RESPUESTA_TIPOCUENTA */
CREATE TRIGGER TI_RESPUESTA_TIPOCUENTA FOR RESPUESTA_TIPOCUENTA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'TIPO_CUENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'RESPUESTA_TIPOCUENTA'  */
    IF (NEW.TICU_ITEM IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   TIPO_CUENTAS
       WHERE  TIPO_CUENTAS.TICU_ITEM = NEW.TICU_ITEM
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION SDP_ICPE;
       END
    END
END
^

/* Trigger: TI_RETIROS */
CREATE TRIGGER TI_RETIROS FOR RETIROS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS_BANCOS' MUST EXIST WHEN INSERTING A CHILD IN 'RETIROS'  */
    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 = 73
        AND   PREFIJOS_BANCOS.PRBA_PREF = NEW.PRBA_PREF
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJOBANCO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_RUTERO */
CREATE 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
^

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

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

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

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

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

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

/* Trigger: TI_SALDOS_CUENTAS */
CREATE TRIGGER TI_SALDOS_CUENTAS FOR SALDOS_CUENTAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'SALDOS_CUENTAS'  */
    IF (NEW.CUEN_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS
       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
END
^

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

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

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

/* Trigger: TI_SALDO_BANCOS */
CREATE TRIGGER TI_SALDO_BANCOS FOR SALDO_BANCOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS_BANCO' MUST EXIST WHEN INSERTING A CHILD IN 'SALDO_BANCOS'  */
    IF (NEW.CUBA_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS_BANCO
       WHERE  CUENTAS_BANCO.CUBA_COD = NEW.CUBA_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CUENTABANCO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_SALDO_BANCOS_CONF */
CREATE TRIGGER TI_SALDO_BANCOS_CONF FOR SALDO_BANCOS_CONF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS_BANCO' MUST EXIST WHEN INSERTING A CHILD IN 'SALDO_BANCOS'  */
IF (NEW.CUBA_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS_BANCO
       WHERE  CUENTAS_BANCO.CUBA_COD = NEW.CUBA_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CUENTABANCO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_SALDO_EFECTIVO */
CREATE TRIGGER TI_SALDO_EFECTIVO FOR SALDO_EFECTIVO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'SALDO_EFECTIVO'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_SALIDAS */
CREATE TRIGGER TI_SALIDAS FOR SALIDAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'SALIDAS'  */
    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;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'SALIDAS'  */
    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
END
^

/* Trigger: TI_SALIDAS_DETALLE */
CREATE TRIGGER TI_SALIDAS_DETALLE FOR SALIDAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'SALIDAS_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 'SALIDAS_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 'SALIDAS' MUST EXIST WHEN INSERTING A CHILD IN 'SALIDAS_DETALLE'  */
    IF (NEW.SALI_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   SALIDAS
       WHERE  SALIDAS.SALI_ID = NEW.SALI_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION SALIDA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_SUBGRUPO */
CREATE TRIGGER TI_SUBGRUPO FOR SUBGRUPO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'GRUPO' MUST EXIST WHEN INSERTING A CHILD IN 'SUBGRUPO'  */
    IF (NEW.GRUP_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   GRUPO
       WHERE  GRUPO.GRUP_COD = NEW.GRUP_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION GRUPO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_TERCEROS */
CREATE TRIGGER TI_TERCEROS FOR TERCEROS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
/*  PARENT 'CIUDAD' MUST EXIST WHEN INSERTING A CHILD IN 'TERCEROS'  */
IF (NEW.CIUD_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CIUDADES
       WHERE  CIUDADES.CIUD_COD = NEW.CIUD_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ciudad_no_existe;
       END
    END
if (new.terc_exento is null) then
   new.terc_exento = 'N';
END
^

/* Trigger: TI_TRASFERENCIAS */
CREATE TRIGGER TI_TRASFERENCIAS FOR TRASFERENCIAS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'TRASFERENCIAS'  */
    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;
       END
    END
    /*  PARENT 'BODEGA' MUST EXIST WHEN INSERTING A CHILD IN 'TRASFERENCIAS'  */
    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
END
^

/* Trigger: TI_TRASFERENCIAS_DETALLE */
CREATE TRIGGER TI_TRASFERENCIAS_DETALLE FOR TRASFERENCIAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'TRASFERENCIAS_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 'TRASFERENCIAS' MUST EXIST WHEN INSERTING A CHILD IN 'TRASFERENCIAS_DETALLE'  */
    IF (NEW.TRAN_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   TRASFERENCIAS
       WHERE  TRASFERENCIAS.TRAN_ID = NEW.TRAN_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION TRASFERENCIA_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_TRASLADOS */
CREATE TRIGGER TI_TRASLADOS FOR TRASLADOS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'PREFIJOS_BANCOS' MUST EXIST WHEN INSERTING A CHILD IN 'TRASLADOS'  */
    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 = 76
        AND   PREFIJOS_BANCOS.PRBA_PREF = NEW.PRBA_PREF
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJOBANCO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_TRASLADO_CAJA */
CREATE TRIGGER TI_TRASLADO_CAJA FOR TRASLADOS_CAJA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBOS_CAJA'  */
    IF (NEW.CAJA_ID IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.CAJA_ID
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'RECIBOS_CAJA'  */
    IF (NEW.PREF_PRE IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS
       WHERE  PREFIJOS.TIDO_COD = 66
        AND   PREFIJOS.PREF_PRE = NEW.PREF_PRE
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJO_NO_EXISTE;
       END
    END
END
^

/* Trigger: TI_UNIDAD_ARTICULO */
CREATE TRIGGER TI_UNIDAD_ARTICULO FOR UNIDAD_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'UNIDAD_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
    if (new.unar_activa is null) then
       new.unar_activa = 'S';
END
^

/* Trigger: TRASFERENCIAS_AD */
CREATE 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
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
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
^

/* Trigger: TRASFERENCIAS_AI */
CREATE 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
^

/* Trigger: TRASFERENCIAS_AU */
CREATE 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
        BEGIN
        delete from comprobante_detalle where enco_consec = :consec;
        delete from comprobante_detalle_niif where enco_consec = :consec;
        END
    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
^

/* Trigger: TRASFERENCIAS_BI */
CREATE 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
^

/* Trigger: TRASFERENCIAS_DETALLE_AD */
CREATE TRIGGER TRASFERENCIAS_DETALLE_AD FOR TRASFERENCIAS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
if ((old.tran_id <> 0) and (old.tras_anulado = 'N')) then
    delete from movimiento_articulo where (mvar_tipodoc = 13) and (mvar_idref = old.tran_id) and (mvar_item = old.tras_item);
END
^

/* Trigger: TRASFERENCIAS_DETALLE_AI */
CREATE 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(8);
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
      BEGIN
      /* INSERTE EL SERIAL DE DESTINO */
      INSERT INTO SERIALES_DOCUMENTO(TIDO_COD, SEDO_IDDOC, SEDO_ITEM, SEDO_SERIAL, SEDO_ARTICULO, SEDO_BOD, SEDO_CONS, SEDO_ENTRADA)
        SELECT TIDO_COD, SEDO_IDDOC, SEDO_ITEM, SEDO_SERIAL, SEDO_ARTICULO, :boddes, SEDO_CONS, 'S'
            FROM seriales_documento WHERE TIDO_COD = 13 AND SEDO_IDDOC = NEW.tran_id AND SEDO_ITEM = NEW.tras_item;

      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);
      END
    /* ACTUALICE EL COSTO POR PROVEEDOR */
    if (:NIT <> '') then
        BEGIN
        if (EXISTS (SELECT TERC_NIT FROM PROVEEDORES WHERE TERC_NIT = :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, PVAR_UNIDAD, PVAR_FACTOR)
                    VALUES (:Nit, NEW.ARTI_COD, new.tras_costo, :fec, :NIT,NEW.tras_desc, NEW.tras_unidad, NEW.tras_factor);
            else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = NEW.tras_costo, PVAR_FECHA = :fec, PVAR_UNIDAD = NEW.tras_unidad, PVAR_FACTOR = NEW.tras_factor
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
            END
        END
    END
END
^

/* Trigger: TRASFERENCIAS_DETALLE_AU */
CREATE 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(8);
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
        BEGIN
        /* INSERTE EL SERIAL DE DESTINO */
        INSERT INTO SERIALES_DOCUMENTO(TIDO_COD, SEDO_IDDOC, SEDO_ITEM, SEDO_SERIAL, SEDO_ARTICULO, SEDO_BOD, SEDO_CONS, SEDO_ENTRADA, SEDO_CONFIRMA)
            SELECT TIDO_COD, SEDO_IDDOC, SEDO_ITEM, SEDO_SERIAL, SEDO_ARTICULO, :boddes, SEDO_CONS, 'S', 'N'
            FROM seriales_documento WHERE TIDO_COD = 13 AND SEDO_IDDOC = NEW.tran_id AND SEDO_ITEM = NEW.tras_item;
        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);
        END
    /* 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, PVAR_UNIDAD, PVAR_FACTOR)
                VALUES (:Nit, NEW.ARTI_COD, new.tras_costo, :fec, :NIT,NEW.tras_desc, NEW.tras_unidad, NEW.tras_factor);
        else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = NEW.tras_costo, PVAR_FECHA = :fec, PVAR_UNIDAD = NEW.tras_unidad, PVAR_FACTOR = NEW.tras_factor
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
        END
    END
  end
END
^

/* Trigger: TRASLADOS_AD */
CREATE TRIGGER TRASLADOS_AD FOR TRASLADOS
ACTIVE AFTER DELETE POSITION 0
AS
declare variable consec INTEGER;
BEGIN
if ((old.tras_id <> 0) and (old.tras_anulado = 'N')) then
    begin
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPODOC = 76 AND MOBA_IDREF = OLD.tras_id;
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPOREF = 76 AND MOBA_IDREF = OLD.tras_id;
    DELETE FROM notas_debito
        WHERE PRBA_PREF = OLD.tras_notapref AND NDBC_NUMERO = OLD.tras_nota AND CUBA_COD = OLD.cuba_cod;
    end
select enco_consec from comprobante_encabezado where enco_tiporef = 76 and enco_idref = old.tras_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 76 and enco_idref = old.tras_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 76, OLD.tras_id, 'D', OLD.prba_pref || OLD.tras_numero, OLD.cuba_cod);
END
^

/* Trigger: TRASLADOS_AI */
CREATE 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
^

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

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

/* Trigger: TRASLADOS_BI */
CREATE TRIGGER TRASLADOS_BI FOR TRASLADOS
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 = 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
^

/* Trigger: TRASLADOS_CAJA_AD */
CREATE TRIGGER TRASLADOS_CAJA_AD FOR TRASLADOS_CAJA
ACTIVE AFTER DELETE POSITION 0
as
declare variable consec INTEGER;
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 66, OLD.trcj_id, 'D', OLD.pref_pre || OLD.trcj_numero);
select enco_consec from comprobante_encabezado where enco_tiporef = 66 and enco_idref = old.trcj_id into :consec;
if (NOT consec is null) then
  begin
  delete from comprobante_detalle where enco_consec = :consec;
  delete from comprobante_detalle_niif where enco_consec = :consec;
  end
delete from comprobante_encabezado where enco_tiporef = 66 and enco_idref = old.trcj_id;
end
^

/* Trigger: TRASLADOS_CAJA_AI */
CREATE TRIGGER TRASLADOS_CAJA_AI FOR TRASLADOS_CAJA
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.TRCJ_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 66, NEW.trcj_id, 'I', NEW.pref_pre || NEW.trcj_numero);
end
^

/* Trigger: TRASLADOS_CAJA_AU */
CREATE TRIGGER TRASLADOS_CAJA_AU FOR TRASLADOS_CAJA
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec INTEGER;
begin
/* borre la contabilizacion */
if (new.trcj_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 66 and enco_idref = old.trcj_id into :consec;
    if (NOT consec is null) then
      BEGIN
      delete from comprobante_detalle where enco_consec = :consec;
      delete from comprobante_detalle_niif where enco_consec = :consec;
      END
    delete from comprobante_encabezado where enco_tiporef = 66 and enco_idref = old.trcj_id;
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 66, new.trcj_id, 'A', NEW.pref_pre || NEW.trcj_numero);
    end
ELSE
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 66, NEW.trcj_id, 'U', NEW.pref_pre || NEW.trcj_numero);
/* SI CAMBIA NUMERO O FECHA ACTUALICE EL DETALLE */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.trcj_numero <> NEW.trcj_numero) or
    (OLD.trcj_fecha <> NEW.trcj_fecha)) then
    UPDATE traslados_caja_det SET TRCD_TRANSMIT = 'N'
        WHERE TRCJ_ID = NEW.trcj_id;
if (OLD.trcj_anulado <> NEW.trcj_anulado) then
    UPDATE traslados_caja_det SET TRCD_ANULADO = NEW.trcj_anulado
        WHERE TRCJ_ID = NEW.TRCJ_ID;
if (OLD.trcj_transmit <> NEW.trcj_transmit) then
    UPDATE traslados_caja_det SET TRCD_TRANSMIT = NEW.trcj_transmit
        WHERE TRCJ_ID = NEW.TRCJ_ID;
end
^

/* Trigger: TRASLADOS_CAJA_BI */
CREATE TRIGGER TRASLADOS_CAJA_BI FOR TRASLADOS_CAJA
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 = 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
^

/* Trigger: TRASLADOS_CAJA_DET_AD */
CREATE 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
^

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

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

/* Trigger: TRASLADOS_CAJA_DET_BI */
CREATE 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
^

/* Trigger: UNIDAD_ARTICULO_AD */
CREATE TRIGGER UNIDAD_ARTICULO_AD FOR UNIDAD_ARTICULO
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 124, 1, 'D', OLD.arti_cod);
end
^

/* Trigger: UNIDAD_ARTICULO_AI */
CREATE TRIGGER UNIDAD_ARTICULO_AI FOR UNIDAD_ARTICULO
ACTIVE AFTER INSERT POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 124, 1, 'I', NEW.arti_cod);
end
^

/* Trigger: UNIDAD_ARTICULO_AU */
CREATE TRIGGER UNIDAD_ARTICULO_AU FOR UNIDAD_ARTICULO
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 124, 1, 'U', OLD.arti_cod);
end
^

/* Trigger: UNIDAD_ARTICULO_BD */
CREATE TRIGGER UNIDAD_ARTICULO_BD FOR UNIDAD_ARTICULO
ACTIVE BEFORE DELETE POSITION 0
as
declare variable numrows integer;
begin
/* si tiene mov. no permita cambiarla */
    select count(ende_item) from entradas_detalle where arti_cod = OLD.arti_cod and ende_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una entrada.' ;
    select count(sade_item) from salidas_detalle where arti_cod = OLD.arti_cod and sade_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una salida.' ;
    select count(tras_item) from trasferencias_detalle where arti_cod = OLD.arti_cod and tras_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una trasferencia.' ;
    select count(ajus_item) from ajustes_detalle where arti_cod = OLD.arti_cod and ajus_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en un ajuste.' ;
    select count(esde_item) from ensambles_detalle where arti_cod = OLD.arti_cod and esde_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en un ensamble.' ;
    select count(dese_item) from desensambles_detalle where arti_cod = OLD.arti_cod and dede_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en un desensamble.' ;
    select count(rsde_item) from reservas_detalle where arti_cod = OLD.arti_cod and rsde_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una reserva.' ;
    select count(orid_item) from ordeninventario_detalle where arti_cod = OLD.arti_cod and orid_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una orden.' ;
    select count(fcde_item) from facturas_compras_detalle where arti_cod = OLD.arti_cod and fcde_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una factura de compra.' ;
    select count(rpvd_item) from remision_proveedor_det where arti_cod = OLD.arti_cod and rpvd_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una remisiÃ³n de proveedor.' ;
    select count(dvcd_item) from devoluciones_compras_det where arti_cod = OLD.arti_cod and dvcd_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una devoluciÃ³n de compra.' ;
    select count(fade_item) from facturas_detalle where arti_cod = OLD.arti_cod and fade_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una factura.' ;
    select count(rvde_item) from remisiones_venta_detalle where arti_cod = OLD.arti_cod and rvde_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una remisiÃ³n.' ;
    select count(dvde_item) from devoluciones_ventas_detalle where arti_cod = OLD.arti_cod and dvde_unidad = old.unar_unidad into :numrows;
    if (numrows > 0) then
        exception unidad_con_mov 'La unidad ' || OLD.unar_unidad || ' del artÃ­culo ' || OLD.arti_cod || ' fue usada en una devoluciÃ³n.' ;
end
^

/* Trigger: UNIDAD_ARTICULO_BU */
CREATE 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
^

/* Trigger: USUARIO_BI */
CREATE TRIGGER USUARIO_BI FOR USUARIO
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.sucu_id is null) then
    new.sucu_id = 0;
end
^

/* Trigger: VACACIONES_AD */
CREATE TRIGGER VACACIONES_AD FOR VACACIONES
ACTIVE AFTER DELETE POSITION 0
as
declare variable id integer;
declare variable TIPONOV INTEGER;
begin
/* Borre la novedad */
if (OLD.vaca_disfr = 'S') then
    BEGIN
    select MAX(nono_id) from nomina_novedades where tnov_cod = 6 and terc_nit = old.terc_nit and nono_fecha = old.vaca_fecha into :id;
    delete from nomina_novedades_detalle where nono_id = :id;
    delete from nomina_novedades where nono_id = :id;
    END
end
^

/* Trigger: VACACIONES_AI */
CREATE TRIGGER VACACIONES_AI FOR VACACIONES
ACTIVE AFTER INSERT POSITION 0
as
declare variable IDN INTEGER;
declare variable PPAGO INTEGER;
declare variable ANO INTEGER;
declare variable PERIODO INTEGER;
declare variable DIAINI INTEGER;
declare variable DURAPER INTEGER;
declare variable DURAPRI INTEGER;
declare variable RESTDURA INTEGER;
declare variable ITEM INTEGER;
declare variable fecfin date;
begin
if (NEW.vaca_disfr = 'S') then
    BEGIN
    /* GRABE LA NOVEDAD */
    SELECT E.empl_ppago FROM EMPLEADOS E WHERE E.terc_nit = NEW.terc_nit INTO :ppago;
    /* el detalle de los periodos */
    ANO = EXTRACT (YEAR FROM NEW.vaca_fecha);
    PERIODO = NEW.vaca_periodo;
    DIAINI = EXTRACT (DAY FROM NEW.vaca_fecha);
    if (PPAGO = 1) then
        DURAPER = 30;
    if (PPAGO = 2) then
        BEGIN
        DURAPER = 15;
        if (DIAINI > 15) then
            DIAINI = DIAINI - 15;
        END
    if (PPAGO = 3) then
        BEGIN
        DURAPER = 7;
        if (DIAINI > 21) then
            DIAINI = DIAINI - 21;
        if (DIAINI > 14) then
            DIAINI = DIAINI - 14;
        if (DIAINI > 7) then
            DIAINI = DIAINI - 7;
        END
    if (NEW.vaca_dias > (DURAPER-DIAINI)) then
        durapri = (duraper - DIAINI)+1;
    else
        durapri = NEW.vaca_dias;

    IDN = GEN_ID(id_nomi_novedades, 1);
    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 (:IDN, new.terc_nit,6, NEW.vaca_dias, NEW.vaca_monto, :ppago,NEW.vaca_periodo, NEW.vaca_fecha, 'S', substr(new.vaca_fecha,1,4));

    restdura = NEW.vaca_dias - durapri;
    ITEM = 1;
    /* valide si viene de otras vacaciones */
    select first 1 vaca_fecha + vaca_dias from vacaciones where terc_nit = new.terc_nit and vaca_fecha < new.vaca_fecha
        order by vaca_fecha desc into :fecfin;
    if (new.vaca_fecha <> :fecfin) then
        INSERT INTO NOMINA_NOVEDADES_DETALLE (NONO_ID, NNDE_ITEM, NNDE_PERIODO, NNDE_DIAINI, NNDE_VALOR, NNDE_DURACION, NNDE_ANO, NNDE_PRORROGA)
            VALUES (:IDN, :ITEM, :periodo, :DIAINI, NULL, :DURAPRI, :ANO, 'N');
    else
        INSERT INTO NOMINA_NOVEDADES_DETALLE (NONO_ID, NNDE_ITEM, NNDE_PERIODO, NNDE_DIAINI, NNDE_VALOR, NNDE_DURACION, NNDE_ANO, NNDE_PRORROGA)
            VALUES (:IDN, :ITEM, :periodo, :DIAINI, NULL, :DURAPRI, :ANO, 'S');
    while (RESTDURA > 0) do
        BEGIN
        ITEM = ITEM + 1;
        /* INCREMENTE EL PERIODO */
        if (((PPAGO = 1) AND (NEW.vaca_periodo = 12)) or ((PPAGO = 2) AND (NEW.vaca_periodo = 24)) or ((PPAGO = 7) AND (NEW.vaca_periodo = 54))) then
            BEGIN
            ANO = ANO + 1;
            PERIODO = 1;
            END
        ELSE
            PERIODO = PERIODO + 1;
        if (restdura > duraper) then
            begin
            INSERT INTO NOMINA_NOVEDADES_DETALLE (NONO_ID, NNDE_ITEM, NNDE_PERIODO, NNDE_DIAINI, NNDE_VALOR, NNDE_DURACION, NNDE_ANO, NNDE_PRORROGA)
                VALUES (:IDN, :ITEM, :periodo, 1, NULL, :duraper, :ANO, 'S');
            restdura = restdura - duraper;
            end
        else
            begin
            INSERT INTO NOMINA_NOVEDADES_DETALLE (NONO_ID, NNDE_ITEM, NNDE_PERIODO, NNDE_DIAINI, NNDE_VALOR, NNDE_DURACION, NNDE_ANO, NNDE_PRORROGA)
                VALUES (:IDN, :ITEM, :periodo, 1, NULL, :restdura, :ANO, 'S');
            restdura = 0;
            end
        END
--        EXECUTE PROCEDURE causa_retencion_laboral (new.terc_nit, new.vaca_id);
    END
end
^

/* Trigger: VACACIONES_DETALLE_AD */
CREATE TRIGGER VACACIONES_DETALLE_AD FOR VACACIONES_DETALLE
ACTIVE AFTER DELETE POSITION 0
as
begin
if ((OLD.vacd_nomid IS NOT NULL) AND (OLD.vacd_nomid <> 0)) then
    BEGIN
    /* borre la nomina */
    DELETE FROM nomina_conceptos WHERE NOMI_ID = OLD.vacd_nomid;
    DELETE FROM NOMINA WHERE NOMI_ID = OLD.vacd_nomid;
    END
end
^

/* Trigger: VACACIONES_DETALLE_AI */
CREATE TRIGGER VACACIONES_DETALLE_AI FOR VACACIONES_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable NIT VARCHAR(20);
BEGIN
/* marque las novedades usadas en esta nomina */
if (NEW.vacd_nomid <> 0) then
    BEGIN
    SELECT TERC_NIT FROM VACACIONES WHERE VACA_ID = NEW.vaca_id INTO :NIT;
    update nomina_novedades_detalle ND
        SET NOMI_ID = NEW.vacd_nomid
        WHERE ND.NNDE_PERIODO = NEW.vacd_periodo AND ND.NNDE_ANO = NEW.vacd_ano AND
        EXISTS (SELECT NONO_ID FROM nomina_novedades WHERE NONO_ID = ND.nono_id AND TERC_NIT = :nit AND NONO_PPAGO = new.vacd_periodicidad);

    /* marque horas usadas */
    update nomina_horasext ND
        set nd.noex_nomid = new.vacd_nomid
        where ND.noex_periodio = new.vacd_periodo and ND.noex_ano = NEW.vacd_ano and nd.terc_nit = :nit and nd.noex_periodicidad = new.vacd_periodicidad;
    END
end
^

/* Trigger: VACACIONES_DETALLE_BI */
CREATE TRIGGER VACACIONES_DETALLE_BI FOR VACACIONES_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECVAC DATE;
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable conc_deduc char(1);
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable conc_modifi char(1);
declare variable salario char(1);
declare variable gtoempr char(1);
declare variable conc_aplicaprom char(1);
declare variable ITEM INTEGER;
declare variable CONC INTEGER;
declare variable MONTO NUMERIC(18, 2);
declare variable ENTIDAD VARCHAR(20);
declare variable DIAS INTEGER;
declare variable NOMCONC VARCHAR(60);
declare variable DISFR CHAR(1);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable PPAGO INTEGER;
declare variable PRESTAMO CHAR(1);
declare variable IDPR INTEGER;
declare variable ITEMPR INTEGER;
begin
if (NEW.vacd_paganom = 'N') then
    BEGIN
    SELECT VACA_FECHA, V.TERC_NIT, vaca_disfr, e.empl_ppago FROM VACACIONES v, empleados e
        WHERE VACA_ID = NEW.vaca_id and v.terc_nit = e.terc_nit INTO :FECVAC, :NIT, :disfr, :ppago;
    /* valide que no este liquidado ese periodo */
    if (exists (select nd.nomi_id from nomina_detalle nd, nomina n, empleados e
        where nd.nomi_id = n.nomi_id and n.nomi_periodocidad = e.empl_ppago and nd.terc_nit = e.terc_nit and e.terc_nit = :nit
        and n.nomi_ano = new.vacd_ano and n.nomi_periodo = new.vacd_periodo)) then
        exception nomina_registrada 'Ya esta registrada la nomina del periodo ' || new.vacd_periodo || ' de ' || new.vacd_ano || ' para el empleado ' || :nit;

    /* INSERTE UNA NOMINA POR PAGAR */
    execute procedure CAMBIE_ID_NOMINA returning_values(NEW.vacd_nomid);
    EXECUTE PROCEDURE fecha_inicial_periodo_pago(:PPAGO, NEW.vacd_ano, NEW.vacd_periodo) returning_values (:FECINI);
    if (fecvac < fecini) then
        fecvac = fecini;
    insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK, NOMI_CONC, NOMI_TIPO)
        values (NEW.vacd_nomid, :fecvac, 'N', 5, NEW.vacd_periodo, NEW.vacd_ano, 'S', 'VACACIONES EMPLEADO ' || :NIT, 'V');
    if (disfr = 'S') then
        begin
        execute procedure fecha_inicial_periodo_pago (new.vacd_periodicidad, new.vacd_ano, new.vacd_periodo) returning_values (:fecha);
        if (fecvac > fecha) then
            BEGIN
            DIAS = FECVAC - FECHA;
            /* LIQUIDE LOS CONCEPTOS DE LOS DIAS PREVIOS A LAS VACACIONES */
            FOR SELECT CONC_COD, VALOR, ENTIDAD FROM causa_nomina_empleado(:fecvac, :nit, :dias, 'P', 'S') where CONC_COD <> 950
                INTO :CONC, :MONTO, :ENTIDAD
                DO
                BEGIN
                if (MONTO < 0) then
                    MONTO = MONTO * -1;
                SELECT CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR, CONC_PRESTAMO
                    FROM conceptos_nomina WHERE CONC_COD = :conc
                    INTO :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :PRESTAMO;
                insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR, NOCO_CANT)
                    values (NEW.vacd_nomid, :ITEM, :conc, :nit, :monto, :entidad, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.vacd_periodo, NEW.vacd_ano, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIAS);
                if (PRESTAMO = 'S') then
                    BEGIN
                    /* MARQUE CUOTA PAGADA */
                    FOR SELECT P.prno_id, P.prcu_item from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = NEW.vacd_ano and P.PRCU_PERIODO = NEW.vacd_periodo and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :nit
                        and PN.conc_cod = :conc into :IDPR, ITEMPR
                        DO
                        update PRESTAMO_CUOTAS P set PRCU_OK = 'S', PRCU_ABONO = PRCU_MONTO, PRCU_NOMIID = NEW.vacd_nomid
                            where P.prno_id = :IDPR and P.prcu_item = :ITEMPR;
                    END
                ITEM = ITEM + 1;
                END
            END
        /* INSERTE LAS VACACIONES Y SUS CONCEPTOS
        execute procedure fecha_final_periodo_pago (new.vacd_periodicidad, new.vacd_ano, new.vacd_periodo) returning_values (:fecha);
        DIAS = FECHA - FECVAC; */
        FOR SELECT CONC_COD, VALOR, ENTIDAD FROM causa_nomina_vacaciones(:fecvac, :nit, NEW.vacd_dias, NEW.VACD_MONTO)
            INTO :CONC, :MONTO, :ENTIDAD
            DO
            BEGIN
            if (MONTO < 0) then
                MONTO = MONTO * -1;
            SELECT CONC_NOMBRE, CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR, conc_prestamo
                FROM conceptos_nomina WHERE CONC_COD = :conc
                INTO :NOMCONC, :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :PRESTAMO;
            /* SI ES SUELDO EQUIVALE A VACACIONES   */
            if ((CONC <> 901) and (CONC <> 902) and (CONC <> 903) and not (NOMCONC LIKE '%SUELDO%') and not (NOMCONC LIKE '%SALARIO%')) 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_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR, NOCO_CANT)
                    values (NEW.vacd_nomid, :ITEM, :conc, :nit, :monto, :entidad, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.vacd_periodo, NEW.vacd_ano, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, NEW.vacd_dias);
                ITEM = ITEM + 1;
                if (PRESTAMO = 'S') then
                    BEGIN
                    /* MARQUE CUOTA PAGADA */
                    FOR SELECT P.prno_id, P.prcu_item from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                        where P.PRCU_ANO = NEW.vacd_ano and P.PRCU_PERIODO = NEW.vacd_periodo and PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :nit
                        and PN.conc_cod = :conc into :IDPR, ITEMPR
                        DO
                        update PRESTAMO_CUOTAS P set PRCU_OK = 'S', PRCU_ABONO = PRCU_MONTO, PRCU_NOMIID = NEW.vacd_nomid
                            where P.prno_id = :IDPR and P.prcu_item = :ITEMPR;
                    END
                end
            END
        if (not exists (select nomi_id from nomina_conceptos where (nomi_id = new.vacd_nomid) and (CONC_COD = 949))) then
            begin
            SELECT CONC_NOMBRE, CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR
                FROM conceptos_nomina WHERE CONC_COD = 949
                INTO :NOMCONC, :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR;
            insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR, NOCO_CANT)
                values (NEW.vacd_nomid, :ITEM, 949, :nit, new.vacd_monto, null, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.vacd_periodo, NEW.vacd_ano, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, NEW.vacd_dias);
            end
        /* SI EL PERIODO DE ACABO CALCULE LA RETENCION */
        /*execute procedure fecha_final_periodo_pago (new.vacd_periodicidad, new.vacd_ano, new.vacd_periodo) returning_values (:fecfin);
        if (fecvac > fecini) then
            FECHA = FECVAC;
        ELSE
            FECHA = FECINI;
        if ((fecha + NEW.vacd_dias) >= fecfin) then
            BEGIN
            /* SI LLEGO AL FINAL DEL PERIODO CALCULE LA RETENCION
            EXECUTE PROCEDURE causa_retencion_laboral (:nit, NEW.vacd_nomid);
            END */
        END
    ELSE
        BEGIN
        SELECT CONC_NOMBRE, CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR
            FROM conceptos_nomina WHERE CONC_COD = 950
            INTO :NOMCONC, :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR;
        insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR, NOCO_CANT)
            values (NEW.vacd_nomid, :ITEM, 950, :nit, NEW.vacd_monto, NULL, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.vacd_periodo, NEW.vacd_ano, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, 0);
        ITEM = ITEM + 1;
        END
    END
else
    NEW.vacd_nomid = 0;
end
^

/* Trigger: VEHICULOS_AU */
CREATE TRIGGER VEHICULOS_AU FOR VEHICULOS
ACTIVE AFTER UPDATE POSITION 0
as
begin
if (new.vehi_tenedor <> old.vehi_tenedor) then
    begin
    if (exists (select vehi_cod from vehiculos_historia where vehi_cod = new.vehi_cod and vehh_fecha = cast('NOW' AS DATE))) then
        UPDATE VEHICULOS_HISTORIA SET VEHH_PROPIETARIO = NEW.vehi_tenedor
            WHERE vehi_cod = new.vehi_cod and vehh_fecha = cast('NOW' AS DATE);
    else
        insert into vehiculos_historia (vehi_cod, vehh_fecha, vehh_propietario)
            values (new.vehi_cod, cast('NOW' AS DATE), new.vehi_tenedor);
    end
if (new.vehi_conductor <> old.vehi_conductor) then
    begin
    if (exists (select vehi_cod from vehiculos_historia where vehi_cod = new.vehi_cod and vehh_fecha = cast('NOW' AS DATE))) then
        UPDATE VEHICULOS_HISTORIA SET VEHH_CONDUCTOR = NEW.vehi_conductor
            WHERE vehi_cod = new.vehi_cod and vehh_fecha = cast('NOW' AS DATE);
    else
        insert into vehiculos_historia (vehi_cod, vehh_fecha, vehh_conductor)
            values (new.vehi_cod, cast('NOW' AS DATE), new.vehi_conductor);
    end
end
^

/* Trigger: VENDEDORES_AD */
CREATE TRIGGER VENDEDORES_AD FOR VENDEDORES
ACTIVE AFTER DELETE POSITION 0
as
declare variable cobr CHAR(2);
begin
EXECUTE PROCEDURE lee_configuracion ('CARTERA','COMISIONES','UNIFICAR CODIGOS DE VENDEDORES Y COBRADORES') returning_values (:COBR);
if (COBR = 'SI') then
    DELETE FROM COBRADORES WHERE COBR_COD = OLD.vend_cod;

INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (106, 1, 'D', OLD.vend_cod);
end
^

/* Trigger: VENDEDORES_AI */
CREATE 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)
            VALUES (NEW.vend_cod, NEW.vend_nombre, 'S', NEW.vend_direccion, NEW.vend_telefonos);
      else
          INSERT INTO COBRADORES(COBR_COD, COBR_NOM, COBR_ESTADO, COBR_DIRECCION, COBR_TELEFONOS)
            VALUES (NEW.vend_cod, NEW.vend_nombre, 'N', NEW.vend_direccion, NEW.vend_telefonos);
    END
EXECUTE PROCEDURE lee_configuracion ('CARTERA','COMISIONES','UNIFICAR CODIGOS DE VENDEDORES Y CAJEROS') returning_values (:COBR);
if (COBR = 'SI') then
    BEGIN
    SELECT COUNT(*) FROM CAJEROS WHERE CAJE_ID = NEW.vend_cod INTO :NUMROWS;
    if (NUMROWS = 0) then
        INSERT INTO CAJEROS(CAJE_ID, CAJE_NOMBRE) VALUES (NEW.vend_cod, NEW.vend_nombre);
    END
INSERT INTO AUDITORIA(TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (106, 1, 'I', NEW.vend_cod);
end
^

/* Trigger: VENDEDORES_AU */
CREATE 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
^

/* Trigger: VENDEDORES_BD */
CREATE 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
^

/* Trigger: VENDEDOR_DOCUMENTOS_BI */
CREATE TRIGGER VENDEDOR_DOCUMENTOS_BI FOR VENDEDOR_DOCUMENTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
select max(vedo_item)+1 from vendedor_documentos where vend_cod = new.vend_cod into new.vedo_item;
if (new.vedo_item is null) then
    new.vedo_item = 1;
end
^

/* Trigger: ZONAS_AD */
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
^

/* Trigger: ZONAS_AI */
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
^

/* Trigger: ZONAS_AU */
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 ; ^



/******************************************************************************/
/***                           Stored Procedures                            ***/
/******************************************************************************/


SET TERM ^ ;

ALTER PROCEDURE ABONOS_DOCUMENTO_CARTERA (
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    TIPOAB INTEGER,
    IDAB INTEGER,
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE ABONOS_DOCUMENTO_CXPAGAR (
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    TIPOAB INTEGER,
    IDAB INTEGER,
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE ACTIVAR_ACTUALIZACION_BALANCE (
    FECINI DATE,
    FECFIN DATE,
    NULO CHAR(1))
RETURNS (
    OK CHAR(1))
AS
begin
EXECUTE STATEMENT 'ALTER TRIGGER COMPROBANTE_DETALLE_AI ACTIVE';
EXECUTE STATEMENT 'ALTER TRIGGER COMPROBANTE_DETALLE_AU ACTIVE';
EXECUTE STATEMENT 'ALTER TRIGGER COMPROBANTE_DETALLE_AD ACTIVE';
OK = 'S';
suspend;
end^


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


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


ALTER PROCEDURE ACTUALICE_COSTO (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,4),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable SALDOC NUMERIC(15,4);
declare variable BASE VARCHAR(10);
declare variable PRMIN NUMERIC(18, 2);
BEGIN
/* Verfique si el artÃ­culo tiene control de existencias */
SELECT arti_exist FROM articulo WHERE arti_COD = :articulo INTO :exart;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
        END
    ELSE
        BEGIN
        SELECT FIRST 1 (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND
            (cost_fecha <= :fecha) ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        if (TIPO = 10) then
          BEGIN
          INSERT INTO COSTOS (arti_cod, cost_fecha, cost_entc, cost_entp, cost_salc, cost_salp,
              cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
              VALUES (:articulo, :fecha, 0, 0, 0, 0, :saldoc, :saldoc*:costo, :costo, :IDMOV, :TIPO);
          /* actualice el costo prmedio despues de insertar el registro */
          EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
          EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
          if (base = 'ULTIMO') then
            PRMIN = ucosto;
          ELSE
            BEGIN
            PRMIN = COSTOP;
            if (base = 'MAYOR') then
                if (COSTOP < UCOSTO) then
                    PRMIN = UCOSTO;
            END
          UPDATE ARTICULO SET ARTI_PRECIO = :PRMIN WHERE ARTI_COD = :ARTICULO;
          END
        ELSE
          BEGIN
          EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
          if (ENTRADA = 'S') then
            if ((TIPO = 33) or (TIPO = 14))  then
                BEGIN
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                /* actualice el costo prmedio despues de insertar el registro */
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
                EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
                if (base = 'ULTIMO') then
                    PRMIN = ucosto;
                ELSE
                    BEGIN
                    PRMIN = COSTOP;
                    if (base = 'MAYOR') then
                        if (COSTOP < UCOSTO) then
                            PRMIN = UCOSTO;
                    END
                UPDATE ARTICULO SET ARTI_PRECIO = :PRMIN WHERE ARTI_COD = :ARTICULO;
                END
          ELSE
            BEGIN
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            END
          END
        END
    END
END^


ALTER PROCEDURE ACTUALICE_COSTO_NIIF (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    COSTO NUMERIC(18,2),
    CANTIDAD NUMERIC(18,4),
    ENTRADA CHAR(1),
    ANULAR CHAR(1),
    IDMOV INTEGER,
    TIPO INTEGER)
AS
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable SALDOC NUMERIC(15,4);
declare variable BASE VARCHAR(10);
declare variable PRMIN NUMERIC(18, 2);
declare variable ANONIIF CHAR(4);
declare variable NIIF CHAR(1);
BEGIN
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD', 'GENERAL', 'AÃ‘O DE INICIO NIIF') returning_values (:ANONIIF);
if ((SUBSTRING(FECHA FROM 1 FOR 4) >= :ANONIIF)) then
    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_NIIF 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_NIIF WHERE (arti_cod = :articulo) AND
                (cost_fecha <= :fecha) ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC into :saldoc;
            if (saldoc is null) THEN
                SALDOC = 0;
            if (TIPO = 10) then
              BEGIN
              INSERT INTO COSTOS_NIIF (arti_cod, cost_fecha, cost_entc, cost_entp, cost_salc, cost_salp,
                  cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                  VALUES (:articulo, :fecha, 0, 0, 0, 0, :saldoc, :saldoc*:costo, :costo, :IDMOV, :TIPO);
              /* actualice el costo prmedio despues de insertar el registro
              EXECUTE PROCEDURE costo_promedio_y_ultimo_niif(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
              if (base = 'ULTIMO') then
                PRMIN = ucosto;
              ELSE
                BEGIN
                PRMIN = COSTOP;
                if (base = 'MAYOR') then
                    if (COSTOP < UCOSTO) then
                        PRMIN = UCOSTO;
                END
              UPDATE ARTICULO SET ARTI_PRECIO = :PRMIN WHERE ARTI_COD = :ARTICULO; NO POR AHORA */
              END
            ELSE
              BEGIN
              EXECUTE PROCEDURE costo_promedio_y_ultimo_niif(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
              if (ENTRADA = 'S') then
                if ((TIPO = 33) or (TIPO = 14))  then
                    BEGIN
                    INSERT INTO COSTOS_NIIF (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_NIIF (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);
                    /* actualice el costo prmedio despues de insertar el registro
                    EXECUTE PROCEDURE costo_promedio_y_ultimo_niif(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
                    if (base = 'ULTIMO') then
                        PRMIN = ucosto;
                    ELSE
                        BEGIN
                        PRMIN = COSTOP;
                        if (base = 'MAYOR') then
                            if (COSTOP < UCOSTO) then
                                PRMIN = UCOSTO;
                        END
                    UPDATE ARTICULO SET ARTI_PRECIO = :PRMIN WHERE ARTI_COD = :ARTICULO; */
                    END
              ELSE
                BEGIN
                INSERT INTO COSTOS_NIIF (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
                END
              END
            END
        END
    END
END^


ALTER PROCEDURE ACTUALICE_PRMINIMO (
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    PRMIN NUMERIC(18,2))
AS
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable BASE VARCHAR(8);
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
FOR SELECT ARTI_COD FROM ARTICULO INTO ARTICULO
    DO
    BEGIN
    EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
    if (base = 'ULTIMO') then
        PRMIN = ucosto;
    ELSE
        BEGIN
        PRMIN = COSTOP;
        if (base = 'MAYOR') then
            if (COSTOP < UCOSTO) then
                PRMIN = UCOSTO;
        END
    UPDATE ARTICULO SET ARTI_PRECIO = :PRMIN WHERE ARTI_COD = :ARTICULO;
    suspend;
    END
end^


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^


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


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


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


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


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 EXISTE CHAR(1);
DECLARE VARIABLE SALDOA NUMERIC(18,2);
BEGIN
  EXISTE = 'N';
  IF (:CENTRO <> '') THEN
    BEGIN
    /* Busque en saldos_centros la cuenta-centro y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    SELECT 'S' FROM SALDOS_CENTROS
        WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :FECHA) INTO :EXISTE;
    IF (EXISTE = 'N') THEN
      BEGIN
        /*  traiga el saldo anterior y registre uno nuevo */
        EXECUTE PROCEDURE SALDO_CENTRO(: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
    ELSE
      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
    /* 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^


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


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 EXISTE CHAR(1);
DECLARE VARIABLE SALDOA NUMERIC(18,2);
BEGIN
  EXISTE = 'N';
  IF (:CENTRO <> '') THEN
    BEGIN
    /* Busque en saldos_centros la cuenta-centro-TERCERO y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    SELECT 'S' FROM SALDOS_CENTROS_TERCERO
        WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FECHA) INTO :EXISTE;
    IF (EXISTE = 'N') THEN
      BEGIN
        /*  traiga el saldo anterior y registre uno nuevo */
        EXECUTE PROCEDURE SALDO_CENTRO_TERCERO(: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
    ELSE
      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
    /* 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^


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

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


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

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


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 EXISTE CHAR(1);
DECLARE VARIABLE SALDOA NUMERIC(18,2);
BEGIN
  EXISTE = 'N';
  IF (:NIT <> '') THEN
    BEGIN
    /* Busque en saldos_terceros la cuenta-NIT y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    SELECT 'S' FROM SALDOS_TERCEROS
        WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FECHA) INTO :EXISTE;
    IF (EXISTE = 'N') THEN
      BEGIN
      /*  traiga el saldo anterior y registre uno nuevo */
      EXECUTE PROCEDURE SALDO_TERCERO(: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
    ELSE
        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
    /* 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^


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


ALTER PROCEDURE ACTUALICE_TOTAL_DOCVENTA (
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable TOTAL numeric(18,2);
declare variable DTOPORC NUMERIC(18,2);
declare variable DTOMONTO NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable IVAMONTO numeric(18,2);
declare variable IVANETO double precision;
declare variable EXTRA NUMERIC(18,2);
declare variable SUBTOTAL numeric(18,2);
declare variable CONSUMO numeric(18,2);
declare variable DTOSUMA VARCHAR(2);
declare variable DIGITOS INTEGER;
declare variable DTOPESOS CHAR(2);
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:digitos);
DIGITOS = DIGITOS * -1;
if (tipo = 31) then
    BEGIN
    SELECT FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_EXTRA FROM FACTURAS WHERE FACT_ID = :ID
        INTO :dtoporc, :dtomonto, adicional, :extra;
    SELECT SUM(fade_total), SUM(fade_IVAMONTO), SUM(fade_consumo) FROM facturas_detalle FD
        WHERE FACT_ID = :id INTO :TOTAL, :IVAMONTO, :consumo;
    SUBTOTAL = TOTAL - IVAMONTO;
    EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (DTOSUMA);
    if (DTOSUMA = 'SI') then
        BEGIN
        IVANETO = (:subtotal - :consumo + :ADICIONAL) / (:subtotal-:Consumo);
        IVANETO = Round(:ivamonto * IVANETO, :Digitos);
        UPDATE FACTURAS
            SET FACT_IVAMONTO = :IVANETO,
                FACT_TOTAL = :SUBTOTAL - FACT_DTOMONTO + :IVANETO + FACT_ADICIONAL + FACT_EXTRA,
                fact_rtftemonto = CASE
                            WHEN FACT_RTFTEMONTO <> 0 THEN Round(((:SUBTOTAL - FACT_DTOMONTO + FACT_ADICIONAL + FACT_EXTRA)-:CONSUMO) * FACT_RTFTEPOR / 100, :DIGITOS)
                            ELSE 0 END,
                fact_rtivamonto = CASE
                            WHEN FACT_RTIVAMONTO <> 0 THEN Round(:IVANETO * fact_rtivapor / 100, :DIGITOS)
                            ELSE 0 end, 
                fact_rticamonto = CASE
                            WHEN FACT_RTICAMONTO <> 0 THEN Round(((:SUBTOTAL - FACT_DTOMONTO + FACT_ADICIONAL + FACT_EXTRA)-:CONSUMO) * FACT_RTICAPOR / 1000, :DIGITOS)
                            ELSE 0 END,
                fact_rtcreem = CASE
                            WHEN FACT_RTCREEM <> 0 THEN Round(((:SUBTOTAL - FACT_DTOMONTO + FACT_ADICIONAL + FACT_EXTRA)-:CONSUMO) * FACT_RTCREE / 100, :DIGITOS)
                            ELSE 0 END,
                FACT_TRANSMIT = 'N'
            WHERE FACT_ID = :id;
        END
    ELSE
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS', 'PERMITIR DESCUENTO DE PIE DE DOCUMENTO EN PESOS') returning_values (DTOPESOS);
        if (DTOPESOS <> 'SI') then
            DTOMONTO = (:TOTAL - :IVAMONTO) * :DTOPORC / 100;
        IVANETO = (:subtotal - :consumo - :DTOMONTO + :ADICIONAL) / (:subtotal-:Consumo);
        IVANETO = Round(:ivamonto * IVANETO, :Digitos);
        UPDATE FACTURAS
            SET FACT_DTOMONTO = :DTOMONTO,
                FACT_IVAMONTO = :IVANETO,
                FACT_TOTAL = :SUBTOTAL - :DTOMONTO + :IVANETO + FACT_ADICIONAL + FACT_EXTRA,
                fact_rtftemonto = CASE
                            WHEN FACT_RTFTEMONTO <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + FACT_ADICIONAL + FACT_EXTRA)-:CONSUMO) * FACT_RTFTEPOR / 100, :DIGITOS)
                            ELSE 0 end, 
                fact_rtivamonto = CASE
                            WHEN FACT_RTIVAMONTO <> 0 THEN Round(:IVANETO * fact_rtivapor / 100, :DIGITOS)
                            ELSE 0 END,
                fact_rticamonto = CASE
                            WHEN FACT_RTICAMONTO <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + FACT_ADICIONAL + FACT_EXTRA)-:CONSUMO) * FACT_RTICAPOR / 1000, :DIGITOS)
                            ELSE 0 END,
                fact_rtcreem = CASE
                            WHEN FACT_RTCREEM <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + FACT_ADICIONAL + FACT_EXTRA)-:CONSUMO) * FACT_RTCREE / 100, :DIGITOS)
                            ELSE 0 END,
                FACT_TRANSMIT = 'N'
            WHERE FACT_ID = :id;
        END
    END
if (tipo = 32) then
    BEGIN
    SELECT SUM(RD.rvde_total), SUM(RD.rvde_ivamonto) FROM remisiones_venta_detalle RD
        WHERE REVT_ID = :id INTO :TOTAL, :IVAMONTO;

    UPDATE remisiones_venta
        SET REVT_IVAMONTO = :IVAMONTO,
            REVT_TOTAL = :TOTAL
        WHERE REVT_ID = :id;
    END
if (tipo = 33) then
    BEGIN
    SELECT DEVT_DTOPOR, DEVT_ADICIONAL, DEVT_EXTRA FROM devoluciones_ventas WHERE DEVT_ID = :ID
        INTO :dtoporc, :adicional, :extra;
    SELECT SUM(DD.dvde_total), SUM(DD.dvde_ivamonto), SUM(DD.dvde_consumo) FROM devoluciones_ventas_detalle DD
        WHERE DEVT_ID = :id INTO :TOTAL, :IVAMONTO, :CONSUMO;
    SUBTOTAL = TOTAL - IVAMONTO;
    EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (DTOSUMA);
    if (DTOSUMA = 'SI') then
        BEGIN
        IVANETO = (:subtotal - :consumo + :ADICIONAL) / (:subtotal-:Consumo);
        IVANETO = Round(:ivamonto * IVANETO, :Digitos);

        UPDATE devoluciones_ventas
            SET DEVT_IVAMONTO = :IVANETO,
                DEVT_TOTAL = :SUBTOTAL - DEVT_DTOMONTO + DEVT_ADICIONAL + :IVANETO + DEVT_EXTRA,
                devt_rtftemonto = CASE
                            WHEN DEVT_RTFTEMONTO <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + DEVT_ADICIONAL + DEVT_EXTRA)-:IVAMONTO-:CONSUMO) * devt_rtfteporc / 100, :DIGITOS)
                            ELSE 0 END,
                devt_rtivamonto = CASE
                            WHEN DEVT_RTIVAMONTO <> 0 THEN ROUND(:IVANETO * devt_rtivaporc / 100, :DIGITOS)
                            ELSE 0 END,
                devt_rticamonto = CASE
                            WHEN DEVT_RTICAMONTO <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + DEVT_ADICIONAL + DEVT_EXTRA)-:IVAMONTO-:CONSUMO) * devt_rticaporc / 1000, :DIGITOS)
                            ELSE 0 END,
                devt_rtcreem = CASE
                            WHEN DEVT_RTCREEM <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + DEVT_ADICIONAL + DEVT_EXTRA)-:IVAMONTO-:CONSUMO) * devt_rtcree / 100, :DIGITOS)
                            ELSE 0 END
            WHERE DEVT_ID = :id;
        END
    ELSE
        BEGIN
        DTOMONTO = (:TOTAL - :IVAMONTO) * :DTOPORC / 100;
        IVANETO = (:subtotal - :consumo - :DTOMONTO + :ADICIONAL) / (:subtotal-:Consumo);
        IVANETO = Round(:ivamonto * IVANETO, :Digitos);

        UPDATE devoluciones_ventas
            SET DEVT_DTOMONTO = :DTOMONTO,
                DEVT_IVAMONTO = :IVANETO,
                DEVT_TOTAL = :TOTAL - DEVT_DTOMONTO + DEVT_ADICIONAL + DEVT_EXTRA,
                devt_rtftemonto = CASE
                            WHEN DEVT_RTFTEMONTO <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + DEVT_ADICIONAL + DEVT_EXTRA)-:CONSUMO) * devt_rtfteporc / 100, :DIGITOS)
                            ELSE 0 END,
                devt_rtivamonto = CASE
                            WHEN DEVT_RTIVAMONTO <> 0 THEN ROUND(:IVANETO * devt_rtivaporc / 100, :DIGITOS)
                            ELSE 0 END,
                devt_rticamonto = CASE
                            WHEN DEVT_RTICAMONTO <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + DEVT_ADICIONAL + DEVT_EXTRA)-:IVAMONTO-:CONSUMO) * devt_rticaporc / 1000, :DIGITOS)
                            ELSE 0 END,
                devt_rtcreem = CASE
                            WHEN DEVT_RTCREEM <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + DEVT_ADICIONAL + DEVT_EXTRA)-:IVAMONTO-:CONSUMO) * devt_rtcree / 100, :DIGITOS)
                            ELSE 0 END
            WHERE DEVT_ID = :id;
        END
    END
if (tipo = 34) then
    BEGIN
    EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'PEDIDOS', 'DESCUENTO PIE PEDIDO IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (DTOSUMA);
    SELECT PEDI_DTOPOR, PEDI_ADICIONAL, PEDI_EXTRA FROM PEDIDOS WHERE PEDI_ID = :ID
        INTO :dtoporc, :adicional, :extra;
    SELECT SUM(PD.pede_total), SUM(PD.pede_ivamonto), SUM(PD.pede_consumo) FROM pedidos_detalle PD
        WHERE PEDI_ID = :id INTO :TOTAL, :IVAMONTO, :CONSUMO;
    SUBTOTAL = TOTAL - IVAMONTO;
    if (DTOSUMA = 'SI') then
        BEGIN
        IVANETO = (:subtotal - :consumo + :ADICIONAL) / (:subtotal-:Consumo);
        IVANETO = Round(:ivamonto * IVANETO, :Digitos);

        UPDATE pedidos
            SET PEDI_IVAMONTO = :IVANETO,
                PEDI_TOTAL = :SUBTOTAL - PEDI_DTOMONTO + PEDI_ADICIONAL + :IVANETO + PEDI_EXTRA,
                pedi_rtftemonto = CASE
                                WHEN PEDI_RTFTEMONTO <> 0 THEN ROUND(((:SUBTOTAL - PEDI_DTOMONTO + PEDI_ADICIONAL + PEDI_EXTRA)-:CONSUMO) * PEDI_RTFTEPORC / 100, :DIGITOS)
                                ELSE 0 END,
                pedi_rtivamonto = CASE
                                WHEN PEDI_RTIVAMONTO <> 0 THEN ROUND(:IVANETO * pedi_rtivaporc / 100, :DIGITOS)
                                ELSE 0 END,
                pedi_rticamonto = CASE
                                WHEN PEDI_RTICAMONTO <> 0 THEN ROUND(((:SUBTOTAL - PEDI_DTOMONTO + PEDI_ADICIONAL + PEDI_EXTRA)-:CONSUMO) * PEDI_RTICAPORC / 1000, :DIGITOS)
                                ELSE 0 END,
                pedi_rtcreem = CASE
                                WHEN PEDI_RTCREEM <> 0 THEN ROUND(((:SUBTOTAL - PEDI_DTOMONTO + PEDI_ADICIONAL + PEDI_EXTRA)-:CONSUMO) * PEDI_RTCREE / 100, :DIGITOS)
                                ELSE 0 END
            WHERE PEDI_ID = :id;
        END
    ELSE
        BEGIN
        DTOMONTO = (:TOTAL - :IVAMONTO) * :dtoporc / 100;
        IVANETO = (:subtotal - :consumo - :DTOMONTO + :ADICIONAL) / (:subtotal-:Consumo);
        IVANETO = Round(:ivamonto * IVANETO, :Digitos);

        UPDATE pedidos
            SET PEDI_DTOMONTO = :DTOMONTO,
                PEDI_IVAMONTO = :IVANETO,
                PEDI_TOTAL = :SUBTOTAL - PEDI_DTOMONTO + PEDI_ADICIONAL + :IVANETO + PEDI_EXTRA,
                pedi_rtftemonto = CASE
                                WHEN PEDI_RTFTEMONTO <> 0 THEN ROUND(((:SUBTOTAL - PEDI_DTOMONTO + PEDI_ADICIONAL + PEDI_EXTRA)-:CONSUMO) * PEDI_RTFTEPORC / 100, :DIGITOS)
                                ELSE 0 END,
                pedi_rtivamonto = CASE
                                WHEN PEDI_RTIVAMONTO <> 0 THEN ROUND(:IVANETO * pedi_rtivaporc / 100, :DIGITOS)
                                ELSE 0 END,
                pedi_rticamonto = CASE
                                WHEN PEDI_RTICAMONTO <> 0 THEN ROUND(((:SUBTOTAL - PEDI_DTOMONTO + PEDI_ADICIONAL + PEDI_EXTRA)-:CONSUMO) * PEDI_RTICAPORC / 1000, :DIGITOS)
                                ELSE 0 END,
                pedi_rtcreem = CASE
                                WHEN PEDI_RTCREEM <> 0 THEN ROUND(((:SUBTOTAL - PEDI_DTOMONTO + PEDI_ADICIONAL + PEDI_EXTRA)-:CONSUMO) * PEDI_RTCREE / 100, :DIGITOS)
                                ELSE 0 END
            WHERE PEDI_ID = :id;
        END
    END
if (tipo = 35) then
    BEGIN
    EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'PEDIDOS', 'DESCUENTO PIE PEDIDO IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (DTOSUMA);
    SELECT COTI_DTOPORC, COTI_ADICIONAL, COTI_EXTRA FROM COTIZACIONES WHERE COTI_ID = :ID
        INTO :dtoporc, :adicional, :extra;
    SELECT SUM(CD.ctde_total), SUM(CD.ctde_ivamonto), SUM(CD.ctde_consumo) FROM cotizaciones_detalle CD
        WHERE COTI_ID = :id INTO :TOTAL, :IVAMONTO, :CONSUMO;
    SUBTOTAL = TOTAL - IVAMONTO;
    if (DTOSUMA = 'SI') then
        BEGIN
        IVANETO = (:subtotal - :consumo + :ADICIONAL) / (:subtotal-:Consumo);
        IVANETO = Round(:ivamonto * IVANETO, :Digitos);

        UPDATE cotizaciones
            SET COTI_IVAMONTO = :IVANETO,
                COTI_TOTAL = :SUBTOTAL - COTI_DTOMONTO + COTI_ADICIONAL + :IVANETO + COTI_EXTRA
            WHERE COTI_ID = :id;
        END
    ELSE
        BEGIN
        dtomonto = (:TOTAL - :IVAMONTO) * :DTOPORC / 100;
        IVANETO = (:subtotal - :consumo - :DTOMONTO + :ADICIONAL) / (:subtotal-:Consumo);
        IVANETO = Round(:ivamonto * IVANETO, :Digitos);

        UPDATE cotizaciones
            SET COTI_DTOMONTO = :DTOMONTO,
                COTI_IVAMONTO = :IVANETO,
                COTI_TOTAL = :SUBTOTAL - COTI_DTOMONTO + COTI_ADICIONAL + :IVANETO + COTI_EXTRA
            WHERE COTI_ID = :id;
        END
    END
end^


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^


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 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;
declare variable FACTORFAC INTEGER;
declare variable IDF INTEGER;
begin
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'ACUMULAR PUNTOS POR VENTAS A CLIENTE REGULARES') returning_values (ACUMULA);
if (acumula = 'VENTA') then
    begin
    if (TIPO = 31) then
        SELECT TERC_NIT, FACT_FECHA FROM FACTURAS WHERE FACT_ID = :iddoc INTO :cliente, :fecha;
    if (TIPO = 33) then
        SELECT TERC_NIT, DEVT_FECHA FROM devoluciones_ventas WHERE DEVT_ID = :iddoc INTO :cliente, :fecha;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'FACTOR DE CONVERSION DE PUNTOS') returning_values (FACTOR);
    if (IDDOC <> 0) then
        begin
        if (NOT EXISTS (SELECT PTVT_ID FROM punto_venta WHERE TERC_NIT = :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
                /* APLIQUE EL FACTOR DE LA FACTURA */
                if (factorfac IS NULL) then
                    FACTORFAC = 1;
                PTOSACUM = PTOSACUM * FACTORFAC;
                /* 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
                SELECT DEVT_FECHA, DEVT_FACTID FROM devoluciones_ventas WHERE DEVT_ID = :iddoc INTO :fecaux, :IDF;
                /* BUSQUE LA FACTURA POR SI TENIA UN FACTOR DE PUNTOS ESPECIAL */
                FACTORFAC = 1;
                if (IDF <> 0) then
                    BEGIN
                    SELECT FACT_PTOSCLIFAC FROM FACTURAS WHERE FACT_ID = :IDF INTO :factorfac;
                    if (factorfac IS NULL) then
                        FACTORFAC = 1;
                    PTOSACUM = PTOSACUM * FACTORFAC;
                    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^


ALTER PROCEDURE AFECTA_INVENTARIO_FACTURAS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    CLIENTE VARCHAR(60),
    ITEM INTEGER,
    ARTIC VARCHAR(20),
    BOD VARCHAR(2),
    CANT NUMERIC(18,2),
    LOTE VARCHAR(20))
AS
declare variable CONC VARCHAR(100);
begin
FOR SELECT FACT_ID, FACT_FECHA, PREF_PRE, FACT_NUMERO, TERC_NIT, FACT_NOMCLIENTE FROM FACTURAS F WHERE
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND
    NOT EXISTS (SELECT MVAR_CONS FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 31 AND MVAR_IDREF = F.fact_id)
    INTO :ID, :FECHA, :PREF, :NUMERO, :NIT, :cliente
    DO
    BEGIN
    if (STRLEN(CLIENTE) > 42) then
        CONC = 'FV No.' || :pref || :numero || '-' || SUBSTR(CLIENTE, 1, 42);
    ELSE
        CONC = 'FV No.' || :pref || :numero || '-' || :CLIENTE;
    FOR SELECT FADE_ITEM, ARTI_COD, BODE_COD, FADE_CANT * FADE_FACTOR, FADE_LOTE FROM FACTURAS_DETALLE WHERE FACT_ID = :ID
        INTO :ITEM, :ARTIC, :BOD, :CANT, :LOTE
        DO
        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(:artic, :bod, :fecha, 31, :id, :CONC, :cant, 0, 'N', :lote, :Pref, :numero, :item, :Nit);
        suspend;
        END
    END
end^


ALTER PROCEDURE AJUSTA_CANT_PEDIDO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    NUMERO VARCHAR(12),
    ITEM INTEGER,
    FECHA DATE,
    ARTI VARCHAR(20),
    BODORI VARCHAR(2),
    BODE VARCHAR(2),
    CANTORI NUMERIC(18,4),
    CANT NUMERIC(18,4),
    UNIDADORI VARCHAR(8),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    STAND VARCHAR(20),
    ESTADO VARCHAR(10))
AS
declare variable EXISTEN NUMERIC(18,4);
declare variable RESERVADO NUMERIC(18,4);
declare variable ORDENADO NUMERIC(18,4);
begin
FOR SELECT PEDI_ID, PEDI_FECHA, PREF_PRE || PEDI_NUMERO FROM PEDIDOS P WHERE PEDI_FECHA >= :fecini AND PEDI_FECHA <= :FECFIN and
    NOT EXISTS (SELECT COFA_ID FROM consolidado_faltantes C WHERE C.cofa_tipoori = 34 AND C.cofa_idori = P.pedi_id AND C.cofa_cantcr <> 0)
    INTO :ID, :FECHA, :NUMERO
    DO
    BEGIN
    FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_FACTOR, BODE_COD FROM PEDIDOS_DETALLE PD WHERE PEDI_ID = :ID
        INTO :ITEM, :ARTI, :CANTORI, :UNIDADORI, :FACTOR, :BODORI
        DO
        BEGIN
        BODE = BODORI;
        UNIDAD = UNIDADORI;
        CANT = CANTORI;
        execute procedure existencias_unidad_bod(:arti,:fecha,:UNIDAD,:bode)
            returning_values (:bode,:existen,:reservado,:ordenado,:stand);
        if ((:existen-:reservado < 0) OR (existen < :cant)) then
            BEGIN
            execute procedure bodega_facturacion_alterna(:arti,:fecha,0,:bode,:cant) returning_values(:bode);
            if (exists (select bode_cod from bodega where bode_cod = :bode)) then
                begin
                execute procedure existencias_unidad_bod(:arti,:fecha,:unidad,:bode)
                    returning_values (:bode,:existen,:reservado,:ordenado,:stand);
                if (existen-reservado < 0) then
                    BEGIN
                    DELETE FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM;
                    ESTADO = 'BORRADO';
                    SUSPEND;
                    END
                else
                  if (existen < :cant*:factor) then
                    begin
                    CANT = (existen-reservado)*FACTOR;
                    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTI INTO :UNIDAD;
                    UPDATE PEDIDOS_DETALLE SET PEDE_CANT = :CANT, PEDE_UNIDAD = :UNIDAD, PEDE_FACTOR = 1, BODE_COD = :BODE
                        WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM;
                    ESTADO = 'MODIFICADO';
                    SUSPEND;
                    end
                  else
                    begin
                    UPDATE PEDIDOS_DETALLE SET BODE_COD = :BODE
                        WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM;
                    ESTADO = 'CAMBIOBOD';
                    SUSPEND;
                    end
                end
            else
                begin
                execute procedure existencias_unidad_bod(:arti,:fecha,:unidad,:bodori)
                    returning_values (:bode,:existen,:reservado,:ordenado,:stand);
                if (existen-reservado < 0) then
                    BEGIN
                    DELETE FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM;
                    ESTADO = 'BORRADO';
                    SUSPEND;
                    END
                else
                  if (existen < :cant*:factor) then
                    begin
                    CANT = (existen-reservado)*FACTOR;
                    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTI INTO :UNIDAD;
                    UPDATE PEDIDOS_DETALLE SET PEDE_CANT = :CANT, PEDE_UNIDAD = :UNIDAD, PEDE_FACTOR = 1, BODE_COD = :BODE
                        WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM;
                    ESTADO = 'MODIFICADO';
                    SUSPEND;
                    end
                  else
                    begin
                    ESTADO = 'SIN CAMBIO';
                    SUSPEND;
                    end
                end
            END
        END
    END
end^


ALTER PROCEDURE AJUSTES_APERTURA_NIIF
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    SALDO NUMERIC(18,2),
    RECLASDB NUMERIC(18,2),
    RECLASCR NUMERIC(18,2),
    AJUSTEDB NUMERIC(18,2),
    AJUSTECR NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    CUENTANIIF VARCHAR(20),
    NOMBRENIIF VARCHAR(140),
    RECLASDBN NUMERIC(18,2),
    RECLASCRN NUMERIC(18,2),
    AJUSTEDBN NUMERIC(18,2),
    AJUSTECRN NUMERIC(18,2),
    NUEVO NUMERIC(18,2))
AS
declare variable ANO CHAR(4);
BEGIN
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO NIIF') returning_values (ANO);
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_EQNIIF FROM CUENTAS WHERE CUEN_AFECTABLE = 'S' AND CUEN_ACTIVA = 'S'
    order by CUEN_COD INTO CODIGO, NOMBRE, CUENTANIIF
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, 1, 'S') RETURNING_VALUES (SALDO);
  if (cuentaniif <> '') then
      SELECT CUEN_NOM FROM CUENTAS_NIIF WHERE CUEN_COD = :cuentaniif INTO :nombreniif;
  ELSE
      NOMBRENIIF = '';
  /* SUME LOS RECLASIFICACIONES Y AJUSTES NIIF */
  SELECT SUM(APND_RECLDB), SUM(APND_RECLCR), SUM(APND_DEBITO), SUM(APND_CREDITO)
    FROM apertura_niif_det WHERE APND_CUENTA = :codigo INTO :reclasdb, :reclascr, :ajustedb, :ajustecr;
  if (reclasdb IS NULL) then
    reclasdb = 0;
  if (reclascr IS NULL) then
    reclascr = 0;
  if (ajustedb IS NULL) then
    ajustedb = 0;
  if (ajustecr IS NULL) then
    ajustecr = 0;
  FINAL = SALDO + (ajustedb+reclasdb) - (ajustecr+reclascr);
  /* LOS AJUSTES DE LA CUENTA NIIF */
  SELECT SUM(APND_RECLDB), SUM(APND_RECLCR), SUM(APND_DEBITO), SUM(APND_CREDITO)
    FROM apertura_niif_det WHERE APND_CTANIIF = :cuentaniif INTO :reclasdbn, :reclascrn, :ajustedbn, :ajustecrn;
  if (reclasdbn IS NULL) then
    reclasdbn = 0;
  if (reclascrn IS NULL) then
    reclascrn = 0;
  if (ajustedbn IS NULL) then
    ajustedbn = 0;
  if (ajustecrn IS NULL) then
    ajustecrn = 0;
  NUEVO = ajustedbn + reclasdbn - (ajustecrn+reclascrn);
  SUSPEND;
  END
/* agregue las cuentas NIIF que no estan en las equivalencias */
FOR SELECT CUEN_COD, CUEN_NOM, '', '' FROM CUENTAS_niif CN WHERE CUEN_AFECTABLE = 'S' AND CUEN_ACTIVA = 'S'
    AND NOT EXISTS (SELECT CUEN_COD FROM CUENTAS WHERE CUEN_EQNIIF = CN.cuen_cod)
    order by CUEN_COD INTO CUENTANIIF, nombreniif, CODIGO, :NOMBRE
DO
  BEGIN
  SALDO = 0;
  /* SUME LOS RECLASIFICACIONES Y AJUSTES NIIF */
  reclasdb = 0;
  reclascr = 0;
  ajustedb = 0;
  ajustecr = 0;
  FINAL = 0;
  /* LOS AJUSTES DE LA CUENTA NIIF */
  SELECT SUM(APND_RECLDB), SUM(APND_RECLCR), SUM(APND_DEBITO), SUM(APND_CREDITO)
    FROM apertura_niif_det WHERE APND_CTANIIF = :cuentaniif INTO :reclasdbn, :reclascrn, :ajustedbn, :ajustecrn;
  if (reclasdbn IS NULL) then
    reclasdbn = 0;
  if (reclascrn IS NULL) then
    reclascrn = 0;
  if (ajustedbn IS NULL) then
    ajustedbn = 0;
  if (ajustecrn IS NULL) then
    ajustecrn = 0;
  NUEVO = ajustedbn + reclasdbn - (ajustecrn+reclascrn);
  SUSPEND;
  END

END^


ALTER PROCEDURE AJUSTES_SIN_CONTABILDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
declare variable IDREF INTEGER;
BEGIN
FOR SELECT AJUS_ID, PREF_PRE, AJUS_NUMERO FROM AJUSTES WHERE AJUS_ANULADO = 'N' AND
    AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN AND ((:PREFIJO = '') or (PREF_PRE = :PREFIJO))
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idc = null;
  if (not exists (SELECT E.ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE ENCO_TIPOREF = 14 AND ENCO_IDREF = :ID AND E.enco_consec = D.enco_consec)) then
    BEGIN
    SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 14 AND CNTB_IDREF = :ID into :idc;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= 100000;
    if (idc IS NOT NULL) then
        begin
        ESTADO = 'PROCESANDO';
        ERROR = NULL;
        SUSPEND;
        SELECT MAX(ININ_ID) FROM interfaz_inventario WHERE PREF_PRE = :PREF AND TIDO_COD = 14 INTO :IDI;
        EXECUTE PROCEDURE contabil_ajuste_niif (:ID, :IDI, :idc) RETURNING_VALUES (:ERROR, VER);
        if ((ERROR = 0) or (error IS NULL)) then
            BEGIN
            SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E WHERE ENCO_TIPOREF = 14 AND ENCO_IDREF = :ID INTO :IDREF;
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
                SELECT :IDREF, 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 = :idc AND CNDE_ITEM >= 100000;
            UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDREF;
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        end
    END
  END
END^


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^


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^


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^


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^


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^


ALTER PROCEDURE ALERTAS_CONTRATO_EMPL (
    FEC DATE)
RETURNS (
    DIAS INTEGER,
    MENSAJE VARCHAR(60),
    EMPLNOM VARCHAR(60))
AS
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) AND (DIAS > -30)) 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^


ALTER PROCEDURE ANALISIS_BANCOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CUENTA INTEGER,
    NOMCUENTA VARCHAR(60),
    TIPODOC INTEGER,
    NOMTIPODOC VARCHAR(8),
    FECHA DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    DB CHAR(1),
    MONTO NUMERIC(18,2))
AS
begin
FOR SELECT M.cuba_cod, C.cuba_titular, M.moba_fecha, M.moba_tipodoc, M.moba_pref, M.moba_numero, M.moba_concepto, M.moba_db, M.moba_total
    FROM MOVIMIENTO_BANCO M, cuentas_banco C
    WHERE M.cuba_cod = C.cuba_cod AND CUBA_ESTADO = 'N' AND
    MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN
    INTO :cuenta, :nomcuenta, :FECHA, :TIPODOC, :PREFIJO, :NUMERO, :CONCEPTO, :DB, :MONTO
    do
    begin
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPODOC;
    SUSPEND;
    end
end^


ALTER PROCEDURE ANALISIS_CAJA (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    CAJA INTEGER,
    NOMCAJACTA VARCHAR(60),
    TIPODOC INTEGER,
    NOMTIPODOC VARCHAR(8),
    FECHA DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    DB CHAR(1),
    MONTO NUMERIC(18,2))
AS
begin
FOR SELECT M.CAJA_ID, CAJA_NOMBRE, M.moca_fecha, M.moca_tiporef, M.moca_prefref, M.moca_numref, M.moca_conc, M.moca_db, M.moca_debitos - M.moca_creditos
    FROM MOVIMIENTO_CAJA M, CAJAS C
    WHERE M.caja_id = C.caja_id AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) AND CAJA_ACTIVA = 'S' AND
    MOCA_FECHA >= :FECINI AND MOCA_FECHA <= :FECFIN
    INTO :CAJA, :NOMCAJACTA, :FECHA, :TIPODOC, :PREFIJO, :NUMERO, :CONCEPTO, :DB, :MONTO
    do
    begin
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPODOC;
    SUSPEND;
    end
end^


ALTER PROCEDURE ANALISIS_CARTERA (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    AGENCIA INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    TERCERO VARCHAR(20),
    NOMBRETERC VARCHAR(60),
    MUNICIPIO VARCHAR(5),
    NOMMUNICIPIO VARCHAR(60),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    TIPODOC INTEGER,
    NOMTIPODOC VARCHAR(8),
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2))
AS
declare variable ID INTEGER;
begin
FOR SELECT M.mvcl_fecha, M.mvcl_prefref, M.mvcl_numref, M.terc_nit, C.grca_cod, C.zona_cod, M.mvcl_tiporef, M.mvcl_idref, M.mvcl_monto,
    T.terc_nom, T.ciud_cod, M.sucu_id
    FROM movimiento_clientes M, clientes C, TERCEROS T
    WHERE M.terc_nit = C.terc_nit AND C.terc_nit = T.terc_nit AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
    AND NOT EXISTS (SELECT PTVT_ID FROM PUNTO_VENTA WHERE TERC_NIT = T.terc_nit)
    INTO :FECHA, :PREFIJO, :NUMERO, :TERCERO, :GRUPO, :ZONA, :TIPODOC, :ID, :MONTO, :NOMBRETERC, :MUNICIPIO, :agencia
    DO
    BEGIN
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :MUNICIPIO INTO :NOMMUNICIPIO;
    SELECT GRCA_NOMBRE FROM grupo_cartera WHERE GRCA_COD = :GRUPO INTO :NOMGRUPO;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :ZONA INTO :nomzona;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPODOC;
    EXECUTE PROCEDURE saldo_doc_cartera (TIPODOC, ID, FECFIN, 0) returning_values (SALDO);
    suspend;
    END
end^


ALTER PROCEDURE ANALISIS_COMPRAS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    AGENCIA VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    PROVEEDOR VARCHAR(20),
    NOMPROVEEDOR VARCHAR(60),
    MUNICIPIO VARCHAR(5),
    NOMMUNI VARCHAR(60),
    GRUPO VARCHAR(30),
    ARTICULO VARCHAR(20),
    ARTDESCR VARCHAR(60),
    GRUPOINV VARCHAR(30),
    SUBGRUPOINV VARCHAR(30),
    MARCA VARCHAR(30),
    CANTIDAD NUMERIC(18,1),
    MONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
begin
FOR SELECT FACO_FECHA, P.SUCU_ID, F.PREF_PRE, FACO_NUMERO, F.TERC_NIT, T.terc_nom, CIUD_COD, GRPR_COD,
    FD.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, FD.fcde_cant * FD.fcde_factor, FD.fcde_total - FD.fcde_ivamonto, FD.fcde_total
    FROM FACTURAS_COMPRA F, facturas_compras_detalle FD, PREFIJOS P, PROVEEDORES C, TERCEROS T, ARTICULO A
    WHERE F.faco_id = FD.faco_id AND P.TIDO_COD = 21 AND F.pref_pre = P.pref_pre AND F.terc_nit = T.terc_nit AND T.terc_nit = C.terc_nit
    AND FD.arti_cod = A.arti_cod AND FACO_ANULADO = 'N' AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN
    INTO :FECHA, :AGENCIA, :PREFIJO, :NUMERO, :PROVEEDOR, :NOMPROVEEDOR, :MUNICIPIO, :GRUPO,
    :ARTICULO, :artdescr, :GRUPOINV, :SUBGRUPOINV, :MARCA, :CANTIDAD, :MONTO, :TOTAL
    DO
    BEGIN
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :municipio INTO :NOMMUNI;
    SELECT GRPR_NOM FROM grupos_proveedores WHERE GRPR_COD = :grupo INTO :grupo;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE GRUP_COD = :grupoinv AND SUBG_COD = :subgrupoinv INTO :subgrupoinv;
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupoinv INTO :grupoinv;
    SELECT MARC_NOM FROM marcas WHERE MARC_COD = :marca INTO :marca;
    SUSPEND;
    END
end^


ALTER PROCEDURE ANALISIS_CXPAGAR (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    TERCERO VARCHAR(20),
    NOMBRETERC VARCHAR(60),
    MUNICIPIO VARCHAR(5),
    NOMMUNICIPIO VARCHAR(60),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    TIPODOC INTEGER,
    NOMTIPODOC VARCHAR(8),
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2))
AS
declare variable ID INTEGER;
begin
FOR SELECT M.mvpr_fecha, M.mvpr_prefijo, M.mvpr_numero, M.terc_nit, P.grpr_cod, M.mvpr_tiporef, M.mvpr_idref, M.mvpr_monto,
    T.terc_nom, T.ciud_cod
    FROM movimiento_proveedor M, PROVEEDORES P, TERCEROS T
    WHERE M.terc_nit = P.terc_nit AND P.terc_nit = T.terc_nit AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN
    INTO :FECHA, :PREFIJO, :NUMERO, :TERCERO, :GRUPO, :TIPODOC, :ID, :MONTO, :NOMBRETERC, :MUNICIPIO
    DO
    BEGIN
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :MUNICIPIO INTO :NOMMUNICIPIO;
    SELECT GRPR_NOM FROM grupos_proveedores WHERE GRPR_COD = :GRUPO INTO :NOMGRUPO;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :NOMTIPODOC;
    EXECUTE PROCEDURE saldo_doc_cxpagar (TIPODOC, ID, FECFIN, 0) returning_values (SALDO);
    suspend;
    END
end^


ALTER PROCEDURE ANALISIS_INVENTARIO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    CODGRUPO VARCHAR(30),
    CODSUBG VARCHAR(30),
    CODMARC VARCHAR(30),
    CODBOD VARCHAR(30),
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    TIPO INTEGER,
    FECHA DATE,
    NOMTIPO VARCHAR(8))
AS
declare variable GRUPO varchar(2);
declare variable SUBG varchar(3);
declare variable MARC varchar(3);
declare variable BOD varchar(2);
declare variable ENT CHAR(1);

begin
  FOR SELECT M.ARTI_COD, ARTI_DES, BODE_COD, MVAR_CANT, MVAR_COSTO, MVAR_PREF, MVAR_NUMERO, MVAR_TIPODOC, GRUP_COD, SUBG_COD,
    MARC_COD, MVAR_FECHA, TIDO_NOMCORTO, MVAR_ENTRADA FROM MOVIMIENTO_ARTICULO M, ARTICULO A, TIPO_DOCUMENTO T
    WHERE MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECFIN AND M.arti_cod = A.arti_cod AND T.tido_cod = M.mvar_tipodoc
    INTO :CODIGO, :NOMBRE, :BOD, :CANT, :COSTO, :PREF, :NUMERO, :TIPO, :GRUPO, :SUBG, :MARC, :FECHA, :NOMTIPO, ENT
    DO
    BEGIN
      if (ENT = 'N') then
        CANT = CANT * -1;
      execute procedure nombres_grupos_inventario(:grupo, :subg, :marc) returning_values(:codgrupo, :codsubg, :codmarc);
      SELECT BODE_NOM FROM BODEGA WHERE BODE_COD = :BOD INTO :CODBOD;
    suspend;
    end
end^


ALTER PROCEDURE ANALISIS_VENTAS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    AGENCIA INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    PUNTOVTA INTEGER,
    CLIENTE VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR VARCHAR(60),
    ZONA VARCHAR(60),
    MUNICIPIO VARCHAR(5),
    NOMMUNI VARCHAR(60),
    GRUPOCART VARCHAR(30),
    ARTICULO VARCHAR(20),
    ARTDESCR VARCHAR(60),
    GRUPOINV VARCHAR(30),
    SUBGRUPOINV VARCHAR(30),
    MARCA VARCHAR(30),
    CANTIDAD DOUBLE PRECISION,
    MONTO DOUBLE PRECISION,
    TOTAL DOUBLE PRECISION)
AS
declare variable ZONACOD VARCHAR(2);
declare variable GRPCART INTEGER;
declare variable VENDCOD INTEGER;
declare variable GRUPCOD VARCHAR(2);
declare variable SUBGCOD VARCHAR(3);
declare variable CODMARC VARCHAR(3);

begin
FOR SELECT FACT_FECHA, P.SUCU_ID, F.PREF_PRE, FACT_NUMERO, F.PTVT_ID, F.TERC_NIT, T.terc_nom, F.VEND_COD, ZONA_COD, CIUD_COD, GRCA_COD,
    FD.arti_cod, A.arti_des, A.grup_cod, A.subg_cod, A.marc_cod, FD.fade_cant * FD.fade_factor, FD.fade_total - FD.fade_ivamonto, FD.fade_total
    FROM FACTURAS F, FACTURAS_DETALLE FD, PREFIJOS P, CLIENTES C, TERCEROS T, ARTICULO A
    WHERE F.FACT_ID = FD.FACT_ID AND P.TIDO_COD = 31 AND F.pref_pre = P.pref_pre AND F.terc_nit = T.terc_nit AND T.terc_nit = C.terc_nit
    AND FD.arti_cod = A.arti_cod AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
    INTO :FECHA, :AGENCIA, :PREFIJO, :NUMERO, :PUNTOVTA, CLIENTE, :NOMCLIENTE, :vendcod, :zonacod, :MUNICIPIO, :GRPCART,
    :ARTICULO, :artdescr, :grupcod, :subgcod, :codmarc, :CANTIDAD, :MONTO, :TOTAL
    DO
    BEGIN
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :municipio INTO :NOMMUNI;
    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :vendcod INTO :vendedor;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :zonacod INTO :zona;
    SELECT GRCA_NOMBRE FROM grupo_cartera WHERE GRCA_COD = :GRPCART INTO :grupocart;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE GRUP_COD = :grupcod AND SUBG_COD = :subgcod INTO :subgrupoinv;
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupcod INTO :grupoinv;
    SELECT marc_nom FROM marcas WHERE MARC_COD = :codmarc INTO :marca;
    SUSPEND;
    END
end^


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 VENTADIAM NUMERIC(18,2);
DECLARE VARIABLE SUBTOTAL NUMERIC(18,2);
DECLARE VARIABLE SUBTOTALM 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 MASIVA CHAR(2);
begin
EXECUTE procedure lee_CONFIGURACION ('FACTURACION', 'VENDEDORES', 'PRESUPUESTO DE VENTAS INCLUYENDO IVA') returning_values (MASIVA);
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), SUM(FADE_TOTAL*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, :VENTADIAM;
    if (MASIVA = 'SI') then
        VENTADIA = VENTADIAM;
    if (VENTADIA is null) then
        VENTADIA = 0;
    SELECT SUM((FADE_TOTAL-FADE_IVAMONTO+FACT_DEC2799-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_TOTAL*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, :SUBTOTALM;
    if (MASIVA = 'SI') then
        SUBTOTAL = SUBTOTALM;
    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), SUM(DVDE_TOTAL*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, :SUBTOTALM;
    if (MASIVA = 'SI') then
        SUBTOTAL = SUBTOTALM;
    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), SUM(DVDE_TOTAL*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, :SUBTOTALM;
    if (MASIVA = 'SI') then
        SUBTOTAL = SUBTOTALM;
    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
TOTAL = null;
SELECT HIVE_VENTA FROM historico_ventas WHERE HIVE_ANO = :ANO AND HIVE_MES = :MES AND SUCU_ID = :codagencia 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 = :codagencia;
    END
ELSE
    INSERT INTO historico_ventas (HIVE_ANO, HIVE_MES, SUCU_ID, HIVE_VENTA) VALUES (:ANO, :MES, :codagencia, :TOTAL_SUC);
end^


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^


ALTER PROCEDURE APLICACIONPR_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    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_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(INCP_ID) FROM interfaz_cxpagar WHERE PREF_PRE = :PREF AND TIDO_COD = 53 INTO :IDI;
    if (CN <> 'N') then
        EXECUTE PROCEDURE contabil_aplicapr (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
    if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_aplicapr_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
    if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
    ELSE
        ESTADO = 'ERROR';
   suspend;
  end
  END
END^


ALTER PROCEDURE ARCHIVO_BANCO (
    IDDOC INTEGER,
    FECHA DATE,
    FECHAPAGO DATE,
    SECUENCIA CHAR(1),
    FORMATO VARCHAR(60))
RETURNS (
    DATOS VARCHAR(591))
AS
declare variable dat varchar(60);
declare variable nombreempl varchar(60);
declare variable numdocid varchar(20);
declare variable cuentaempr varchar(25);
declare variable cuentaempl varchar(25);
declare variable banco integer;
declare variable tipocta char(1);
declare variable tipoid char(1);
declare variable dv char(1);
declare variable verifica numeric(18,2);
declare variable MAIL VARCHAR(100);
declare variable smonto varchar(60);
BEGIN
if (FORMATO = 'MANUAL') then
    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;
    /* NUMERO DE REGISTROS */
    SELECT COUNT(NOMI_ID) FROM NOMINA_DETALLE WHERE NOMI_ID = :iddoc AND node_formpago = 'B' 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 d.node_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';
            ELSE 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
if (FORMATO = 'PAB') then
    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,15,'N')returning_values(:dat);
    datos = :datos || :dat;
    datos = :datos || 'I               '; /* APLICACION INMEDIATA + FILLER*/
    /* TIPO DE PAGO = NOMINA */
    dat = '225';
    datos = :datos || :dat;
    /* PROPOSITO DEL PAGO : LIBRE */
    dat = 'NOMINA';
    EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'A')returning_values(:dat);
    datos = :datos || :dat;
    /* FECHA DE TRANSMISION AAAAMMDD */
    dat = substr(:fecha,1,4)|| substr(:fecha,6,7) || substr(:fecha,9,10);
    datos = :datos || :dat;
    /* SECUENCIA A, B, C, ... */
    if (SECUENCIA IS NULl) then
        datos = :datos || 'A ';
    else
        begin
        dat = :secuencia;
        EXECUTE PROCEDURE ceros_ancho_fijo(:dat,2,'A')returning_values(:dat);
        datos = :datos || dat;
        end
    /* FECHA DEL PAGO */
    dat = substr(:fechapago,1,4)|| substr(:fechapago,6,7) || substr(:fechapago,9,10);
    datos = :datos || :dat;
    /* NUMERO DE REGISTROS */
    SELECT COUNT(NOMI_ID) FROM NOMINA_DETALLE WHERE NOMI_ID = :iddoc AND node_formpago = 'B' INTO :dat;
    EXECUTE PROCEDURE ceros_ancho_fijo(:dat,6,'N')returning_values(:dat);
    datos = :datos || :dat;
    /* DEBITOS: NO APLICA DEBE SER CERO */
    dat = '00000000000000000';
    datos = :datos || :dat;
    /* CREDITOS 15 ENTEROS 2 DECIMALES SIN PUNTO*/
    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 :smonto;
    dat = substr(:smonto,1,strlen(:smonto)-3);
    EXECUTE PROCEDURE ceros_ancho_fijo(:dat,15,'N')returning_values(:dat);
    datos = :datos || :dat;

    dat = substr(:smonto,strlen(:smonto)-1,strlen(:smonto));
    datos = :datos || :dat;
    /* CUENTA DEL EMPLEADOR */
    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;
    /* TIPO CUENTA DEL EMPLEADOR */
    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;
    dat = ' ';
    EXECUTE PROCEDURE ceros_ancho_fijo(:dat,149,'A')returning_values(:dat);
    datos = :datos || :dat;
    SUSPEND;

    /* REGISTRO DE DETALLE TIPO 6 */
    datos = '';
    FOR SELECT D.terc_nit, SUBSTRING(T.terc_nom FROM 1 FOR 30), E.empl_cuenta, E.empl_banco, e.empl_tipocta, T.terc_tipoid, SUBSTRING(T.terc_email FROM 1 FOR 80)
        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 D.node_formpago = 'B'
        INTO :numdocid, :nombreempl, :cuentaempl, :banco, :tipocta, :TIPOID, :mail
        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
            /* TIPO REGISTRO = 6 */
            dat = '6';
            datos = :datos || :dat;
            /* CC DEL BENEFICIARIO DEL PAGO */
            dat = :numdocid;
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,15,'N')returning_values(:dat);
            datos = :datos || :dat;
            /* NOMBRE BENEFICIARIO */
            dat = :nombreempl;
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,30,'A')returning_values(:dat);
            datos = :datos || :dat;
            /* BANCO DESTINO */
            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;
            /* NRO CUENTA DE DESTINO */
            dat = :cuentaempl;
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,17,'A')returning_values(:dat);
            datos = :datos || :dat;
            /* LUGAR DE PAGO NO APLICA */
            dat = 'S';
            datos = :datos || :dat;
            /* TIPO DE OPERACION ABONO CTA CTE = 27, ABONO CTA AHORROS = 37 */
            if (:tipocta = 'C') then
                dat=  '27';
            ELSE
                if (:tipocta = 'A') then
                dat=  '37';
            datos = :datos || :dat;
            /* MONTO DEL ABONO 15 ENTEROS 2 DECIMALES SIN PUNTO*/
            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 :smonto;
            dat = substr(:smonto,1,strlen(:smonto)-3);
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,15,'N')returning_values(:dat);
            datos = :datos || :dat;

            dat = substr(:smonto,strlen(:smonto)-1,strlen(:smonto));
            datos = :datos || :dat;
            /* FECHA APLICACION DEL PAGO AAAAMMDD */
            dat = substr(:fechapago,1,4)|| substr(:fechapago,6,7) || substr(:fechapago,9,10);
            datos = :datos || :dat;
            /* REFERENCIA PAGO */
            dat = 'NOM ' || numdocid;
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,21,'A')returning_values(:dat);
            datos = :datos || :dat;
            /* TIPO DE DOCUMENTO DE ID */
            if (TIPOID = 'C') then
                datos = :datos || '1';
            if (TIPOID = 'E') then
                datos = :datos || '2';
            if (TIPOID = 'N') then
                datos = :datos || '3';
            if (TIPOID = 'T') then
                datos = :datos || '4';
            if (TIPOID = 'P') then
                datos = :datos || '5';
            /* CODIGO OFICINA QUE ENTREGA: NO SE USA */
            datos = :datos || '00000';
            /* NUMERO DE FAX BENEFICIARIO */
            datos = :datos || '               ';
            /* EMAIL BENEFICIARIO */
            dat = :MAIL;
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,80,'A')returning_values(:dat);
            datos = :datos || :dat;
            /* ID AUTORIZADO */
            datos = :datos || '               ';
            /* USO FUTURO */
            dat= ' ';
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,27,'A')returning_values(:dat);
            datos = :datos || :dat;
            SUSPEND;
            END
        datos = '';
        END
    END
if (FORMATO = 'BCOBTA') then
    BEGIN
    datos = '';
    dat = '1';
    datos = :datos || :dat;
    dat = substr(:fechapago,1,4)|| substr(:fechapago,6,7) || substr(:fechapago,9,10);
    datos = :datos || :dat;
    DAT = '0';
    EXECUTE PROCEDURE ceros_ancho_fijo(:dat,24,'N')returning_values(:dat);
    datos = :datos || :dat;
    EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'TIPO CUENTA')returning_values (:dat);
    datos = :datos || :dat;
    DAT = '0';
    EXECUTE PROCEDURE ceros_ancho_fijo(:dat,6,'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('GENERAL','GENERAL','NOMBRE COMPAÃ‘IA')returning_values (:dat);
    EXECUTE PROCEDURE ceros_ancho_fijo(:dat,40,'A')returning_values(:dat);
    datos = :datos || :dat;
    EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD','GENERAL','NIT COMPAÃ‘IA')returning_values (:dat);
    SELECT TERC_DV FROM TERCEROS WHERE TERC_NIT = :DAT INTO :DV;
    EXECUTE PROCEDURE ceros_ancho_fijo(:dat,10,'N')returning_values(:dat);
    datos = :datos || :dat;
    if (DV <> '') then
        datos = :datos || :DV;
    else
        datos = :datos || '0';
    dat = '001'; /* NOMINA */
    datos = :datos || :dat;
    dat = '0001'; /* BOGOTA */
    datos = :datos || :dat;
    dat = substr(:fecha,1,4)|| substr(:fecha,6,7) || substr(:fecha,9,10);
    datos = :datos || :dat;
    EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'CODIGO DE LA SUCURSAL DEL BANCO')returning_values (:dat);
    EXECUTE PROCEDURE ceros_ancho_fijo(:dat,3,'N')returning_values(:dat);
    datos = :datos || :dat;
    dat = 'N'; /* TIPO ID EMPRESA N=NIT*/
    datos = :datos || :dat;
    dat= ' ';
    EXECUTE PROCEDURE ceros_ancho_fijo(:dat,128,'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, T.terc_tipoid
        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 d.node_formpago = 'B'
        INTO :numdocid, :nombreempl, :cuentaempl, :banco, :tipocta, :TIPOID
        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 = '2';
            datos = :datos || :dat;
            dat = :tipoid;
            datos = :datos || :dat;
            dat = :numdocid;
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,11,'N')returning_values(:dat);
            datos = :datos || :dat;
            dat = :nombreempl;
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,40,'A')returning_values(:dat);
            datos = :datos || :dat;
            if (:tipocta = 'C') then
                dat=  '01';
            ELSE
                if (:tipocta = 'A') then
                dat=  '02';
            datos = :datos || :dat;
            dat = :cuentaempl;
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,17,'A')returning_values(:dat);
            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 :smonto;
            dat = substr(:smonto,1,strlen(:smonto)-3);
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,16,'N')returning_values(:dat);
            datos = :datos || :dat;
            dat = substr(:smonto,strlen(:smonto)-1,strlen(:smonto));
            datos = :datos || :dat;
            datos = :datos || 'A'; /* ABONO */
            datos = :datos || '000';
            SELECT B.banc_codach FROM BANCOS B WHERE B.banc_cod = :banco INTO :dat;
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,3,'N')returning_values(:dat);
            datos = :datos || :dat; /* CODIGO ACH */
            dat=  '0001'; /* BOGOTA */
            datos = :datos || :dat;
            dat=  '000000000 ';
            datos = :datos || :dat;
            SELECT NOMI_CONC FROM NOMINA WHERE NOMI_ID = :iddoc INTO :dat;
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,70,'A')returning_values(:dat);
            datos = :datos || :dat;
            dat= '0';
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,11,'A')returning_values(:dat);
            datos = :datos || :dat;
            dat= 'N';
            datos = :datos || :dat;
            dat= ' ';
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,8,'A')returning_values(:dat);
            datos = :datos || :dat;
            dat= ' ';
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,16,'A')returning_values(:dat);
            datos = :datos || :dat;
            dat= ' ';
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,11,'A')returning_values(:dat);
            datos = :datos || :dat;
            dat= ' ';
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,11,'A')returning_values(:dat);
            datos = :datos || :dat;
            dat= 'N';
            datos = :datos || :dat;
            dat= ' ';
            EXECUTE PROCEDURE ceros_ancho_fijo(:dat,8,'A')returning_values(:dat);
            datos = :datos || :dat;
            SUSPEND;
            datos = '';
            END
        END
    END
END^


ALTER PROCEDURE ARREGLA_BARRAS_ARTICULO
RETURNS (
    ARTICULO VARCHAR(20),
    BARRAS VARCHAR(20),
    UNIDAD VARCHAR(8),
    OK CHAR(1))
AS
declare variable UNIPPAL VARCHAR(8);
declare variable UNIALT VARCHAR(8);
begin
FOR SELECT B.arti_cod, B.coba_cod, B.coba_unidad FROM BARRAS_ARTICULO B
    INTO :ARTICULO, :BARRAS, :UNIDAD
    DO
    BEGIN
    OK = 'N';
    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :UNIPPAL;
    if (UNIDAD <> UNIPPAL) then
        BEGIN
        if (SUBSTRING(UNIPPAL FROM 2 for 7) = UNIDAD) then
            BEGIN
            UPDATE BARRAS_ARTICULO SET COBA_UNIDAD = :UNIPPAL WHERE ARTI_COD = :ARTICULO AND COBA_COD = :BARRAS;
            OK = 'p';
            END
        ELSE
            BEGIN
            FOR SELECT U.unar_unidad FROM UNIDAD_ARTICULO U WHERE ARTI_COD = :ARTICULO
                INTO :UNIALT
                DO
                BEGIN
                if (OK = 'N') then
                  begin
                  if (UNIDAD <> UNIALT) then
                    BEGIN
                    if (SUBSTRING(UNIALT FROM 2 for 7) = UNIDAD) then
                        BEGIN
                        UPDATE BARRAS_ARTICULO SET COBA_UNIDAD = :UNIALT WHERE ARTI_COD = :ARTICULO AND COBA_COD = :BARRAS;
                        OK = 'a';
                        END
                    END
                  ELSE
                    OK = 'A';
                  end
                END
            END
        END
    ELSE
        OK = 'P';
    if (OK = 'N') then
        BEGIN
        UPDATE BARRAS_ARTICULO SET COBA_UNIDAD = :UNIPPAL WHERE ARTI_COD = :ARTICULO AND COBA_COD = :BARRAS;
        END
    if ((OK <> 'P') AND (OK <> 'A'))  then
        suspend;
    END
end^


ALTER PROCEDURE ARREGLA_COSTO_PLANPROD (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FEC DATE,
    PLANID INTEGER,
    CONC VARCHAR(60),
    PREF VARCHAR(4),
    NUM VARCHAR(8),
    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^


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^


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
    INTO :ID, :CTA
    DO
    begin
    UPDATE COMPROBANTE_DETALLE SET CUEN_COD = :CTA WHERE CUEN_COD = :CTAANT AND ENCO_CONSEC = :ID;
    suspend;
    END
end^


ALTER PROCEDURE ARREGLA_CUENTAS_NO_TERCERO
RETURNS (
    ID INTEGER,
    ITEM INTEGER)
AS
declare variable NIT VARCHAR(20);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') returning_values (NIT);
FOR SELECT ENCO_CONSEC, CODE_ITEM FROM COMPROBANTE_DETALLE WHERE TERC_NIT <> :NIT AND cuen_cod IN (SELECT cuen_cod FROM CUENTAS C WHERE cuen_tercero = 'N')
    INTO :ID, :ITEM
    DO
    BEGIN
    UPDATE COMPROBANTE_DETALLE SET TERC_NIT = :NIT WHERE ENCO_CONSEC = :ID AND CODE_ITEM = :ITEM;
    suspend;
    END
end^


ALTER PROCEDURE ARREGLA_ENTRADAS_COSTO_CERO
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8))
AS
begin
FOR select E.entr_id, D.ende_item, E.pref_pre, E.entr_numero, E.entr_fecha, D.arti_cod, D.ende_unidad
    from entradas_detalle D, ENTRADAS E where e.entr_id = D.entr_id AND D.ende_costo = 0
    INTO :ID, :ITEM, :pref, :numero, :fecha, :articulo, :unidad
    DO
    BEGIN
    EXECUTE PROCEDURE ultimo_costo(:ARTICULO, CAST('NOW' AS DATE), :UNIDAD) returning_values (:COSTO);
    UPDATE ENTRADAS_DETALLE SET ENDE_COSTO = :COSTO WHERE ENTR_ID = :ID AND ENDE_ITEM = :ITEM;
    suspend;
    END
end^


ALTER PROCEDURE ARREGLA_EXIST_PROD_CONS
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    ARTI VARCHAR(20),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8))
AS
declare variable factor numeric(18,2);
begin
FOR SELECT PC.plpd_id, PC.plpc_item, PC.arti_cod, PC.plpc_cant, PC.plpc_unidad FROM plan_produccion_cons PC
    INTO :ID, :ITEM, :ARTI, :CANT, :UNIDAD
    DO
    BEGIN
    EXECUTE PROCEDURE factor_unidad_cant (:arti, :unidad) returning_values (:factor);
    if ((factor <> 0) and (factor <> 1)) then
        update plan_produccion_cons set plpc_exist = plpc_exist / :factor,
            plpc_ordenar = plpc_cant - plpc_exist
            where plpd_id = :id and plpc_item = :item;
    suspend;
    END
end^


ALTER PROCEDURE ARREGLA_MOV_CAJA_RC
AS
declare variable Fec date;
declare variable Caja INTEGER;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Existe char(1);
declare variable ID INTEGER;
declare variable MONTO NUMERIC(18,2);
BEGIN
DELETE FROM MOVIMIENTO_CAJA WHERE MOCA_TIPOREF = 61;

FOR SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, R.RECA_ID, CAJA_ID, RCPA_MONTO
FROM RECIBOS_CAJA R, RECIBOS_CAJA_PAGO RP
WHERE R.RECA_ID = RP.RECA_ID 
INTO :PREF, :NUM, :FEC, :CONC, :ID, :CAJA, :MONTO
DO
    BEGIN
    Existe = 'N';
    select 'S' from movimiento_caja where moca_tiporef = 61 and moca_idref = :id into :Existe;
    if (Existe = 'S') 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);
    END
END^


ALTER PROCEDURE ARREGLA_MOV_CLIENTE_APL
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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 RCREE NUMERIC(18,2);
declare variable RTECREE 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.apcl_id), SUM(ACDE_APLICADO+ACDE_DIFCAMBIO), MAX(MVCL_MONTO), SUM(ACDE_RTFTE), MAX(MVCL_RTEFTE),
    SUM(ACDE_RTIVA), MAX(MVCL_RTEIVA), SUM(ACDE_RTICA), MAX(MVCL_RTEICA), SUM(ACDE_RCREE), MAX(MVCL_RCREE)
  FROM aplicacion_cliente_detalle D, MOVIMIENTO_CLIENTES M
  WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = APCL_ID GROUP BY D.apcl_id
  INTO :ID, ABONO, MONTO, RTFTE, RTEFTE, RTIVA, RTEIVA, RTICA, RTEICA, RCREE, RTECREE
  DO
  BEGIN
  IF ((ABONO <> MONTO) or (RTFTE <> RTEFTE) or (RTIVA <> RTEIVA) or (RTICA <> RTEICA) or (RCREE <> RTECREE)) THEN
    BEGIN
    DELETE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = :ID;
    FOR SELECT ACDE_APLICADO, ACDE_DIFCAMBIO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA, ACDE_RCREE, TERC_NIT, APCL_FECHA, APCL_CONCEPTO, PREF_PRE, APCL_NUMERO, ACDE_SUCURSAL, COBR_COD
        FROM aplicacion_cliente_detalle D, aplicacion_cliente R WHERE R.apcl_id = D.apcl_id AND R.apcl_id = :ID
        INTO :ABONO, :monto, rtfte, :rteiva, :rtica, :rcree, :nit,  :fecha, :concepto, :prefijo, :numero, :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 + :abono + :monto,
                    MVCL_RTEFTE = MVCL_RTEFTE + :rtfte,
                    MVCL_RTEIVA = MVCL_RTEIVA + :rtiva,
                    MVCL_RTEICA = MVCL_RTEICA + :rtica,
                    MVCL_RCREE = MVCL_RCREE + :rcree
                WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = :ID AND MVCL_SUCURSAL = :SUCURSAL;
            end
        ELSE
            INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD)
                VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, :ID, :FECHA, :FECHA, :CONCEPTO, (:ABONO+:monto), :RTFTE, :RTIVA, :RTICA, :RCREE, 'N', 'S', :PREFIJO, :NUMERO, :SUCURSAL, :COBR);
        END
    SUSPEND;
    END
  END
END^


ALTER PROCEDURE ARREGLA_MOV_CLIENTE_RC
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


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^


ALTER PROCEDURE ARTICULOS_SIN_CONTAR (
    ID INTEGER)
RETURNS (
    ARTICULO VARCHAR(20),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    LOTE VARCHAR(20))
AS
declare variable BODE VARCHAR(2);
declare variable STAND VARCHAR(20);
declare variable FECHA DATE;
declare variable EXIST CHAR(1);
begin
SELECT AJUS_STAND, BODE_COD, AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = :ID AND AJUS_ANULADO = 'N' INTO :STAND, :BODE, :FECHA;
if (STAND <> '') then
    BEGIN
    FOR SELECT ARTI_COD FROM STANDS WHERE STAND_COD = :STAND AND STAND_BODEGA = :BODE INTO :ARTICULO
        DO
        BEGIN
        SELECT ARTI_UNIDAD, ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :UNIDAD, :EXIST;
        if (EXIST = 'L') then
            BEGIN
            FOR SELECT L.lote_nro FROM LOTES L WHERE ARTI_COD = :articulo AND BODE_COD = :bode INTO :LOTE
                DO
                BEGIN
                if (NOT EXISTS (SELECT AJUS_ITEM FROM AJUSTES_DETALLE WHERE AJUS_ID = :ID AND ARTI_COD = :ARTICULO AND AJUS_LOTE = :LOTE)) then
                    BEGIN
                    execute procedure saldo_lote_fecha(:articulo, :bode,  :lote,  :fecha-1) returning_values (:cant);
                    if (cant <> 0) then
                        suspend;
                    END
                END
            END
        else
            BEGIN
            if (NOT EXISTS (SELECT AJUS_ITEM FROM AJUSTES_DETALLE WHERE AJUS_ID = :ID AND ARTI_COD = :ARTICULO)) then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(:ARTICULO, :FECHA, :BODE) returning_values (CANT);
                if (CANT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
ELSE
    BEGIN
    FOR SELECT ARTI_COD, ARTI_UNIDAD, ARTI_EXIST FROM ARTICULO WHERE ESAR_COD <> 'I' INTO :ARTICULO, :UNIDAD, :EXIST
        DO
        BEGIN
        if (EXIST = 'L') then
            BEGIN
            FOR SELECT L.lote_nro FROM LOTES L WHERE ARTI_COD = :articulo AND BODE_COD = :bode INTO :LOTE
                DO
                BEGIN
                if (NOT EXISTS (SELECT AJUS_ITEM FROM AJUSTES_DETALLE WHERE AJUS_ID = :ID AND ARTI_COD = :ARTICULO AND AJUS_LOTE = :LOTE)) then
                    BEGIN
                    execute procedure saldo_lote_fecha(:articulo, :bode,  :lote,  :fecha-1) returning_values (:cant);
                    if (cant <> 0) then
                        suspend;
                    END
                END
            END
        else
            BEGIN
            if (NOT EXISTS (SELECT AJUS_ITEM FROM AJUSTES_DETALLE WHERE AJUS_ID = :ID AND ARTI_COD = :ARTICULO)) then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(:ARTICULO, :FECHA, :BODE) returning_values (CANT);
                if (CANT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
end^


ALTER PROCEDURE ASIGNA_COBRADOR
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    COBRA INTEGER)
AS
/*declare variable cobra integer;*/
declare variable movid integer;
BEGIN
TIPO = 61;
FOR SELECT r.RECA_ID, r.COBR_COD from RECIBOS_CAJA r
    INTO : ID, :cobra
    DO
    BEGIN
    SUSPEND;
    select mvcl_id from movimiento_clientes where mvcl_tiporef = 61 and mvcl_idref = :id into :movid;
      UPDATE MOVIMIENTO_CLIENTES SET COBR_COD = :cobra where mvcl_id = :movid;
    SUSPEND;
    END
TIPO = 31;
FOR SELECT f.fact_id, f.vend_cod from facturas f
    INTO : ID, :cobra
    DO
    BEGIN
    SUSPEND;
    select mvcl_id from movimiento_clientes where mvcl_tiporef = 31 and mvcl_idref = :id into :movid;
      UPDATE MOVIMIENTO_CLIENTES SET COBR_COD = :cobra where mvcl_id = :movid;
    SUSPEND;
    END
TIPO = 33;
FOR SELECT d.devt_id, d.vend_cod from devoluciones_ventas d
    INTO : ID, :cobra
    DO
    BEGIN
    SUSPEND;
    select mvcl_id from movimiento_clientes where mvcl_tiporef = 33 and mvcl_idref = :id into :movid;
      UPDATE MOVIMIENTO_CLIENTES SET COBR_COD = :cobra where mvcl_id = :movid;
    SUSPEND;
    END
TIPO = 41;
FOR SELECT n.ndcl_id , n.COBR_COD from notas_debito_clientes n
    INTO : ID, :cobra
    DO
    BEGIN
    SUSPEND;
    select mvcl_id from movimiento_clientes where mvcl_tiporef = 41 and mvcl_idref = :id into :movid;
      UPDATE MOVIMIENTO_CLIENTES SET COBR_COD = :cobra where mvcl_id = :movid;
    SUSPEND;
    END
TIPO = 42;
FOR SELECT c.nccl_id, c.COBR_COD from notas_credito_clientes c
    INTO : ID, :cobra
    DO
    BEGIN
    SUSPEND;
    select mvcl_id from movimiento_clientes where mvcl_tiporef = 42 and mvcl_idref = :id into :movid;
      UPDATE MOVIMIENTO_CLIENTES SET COBR_COD = :cobra where mvcl_id = :movid;
    SUSPEND;
    END
TIPO = 43;
FOR SELECT p.apcl_id , p.COBR_COD from aplicacion_cliente p
    INTO : ID, :cobra
    DO
    BEGIN
    SUSPEND;
    select mvcl_id from movimiento_clientes where mvcl_tiporef = 43 and mvcl_idref = :id into :movid;
      UPDATE MOVIMIENTO_CLIENTES SET COBR_COD = :cobra where mvcl_id = :movid;
    SUSPEND;
    END
TIPO = 45;
FOR SELECT a.ancl_id , a.COBR_COD from anticipos_cliente a
    INTO : ID, :cobra
    DO
    BEGIN
    SUSPEND;
    select mvcl_id from movimiento_clientes where mvcl_tiporef = 45 and mvcl_idref = :id into :movid;
      UPDATE MOVIMIENTO_CLIENTES SET COBR_COD = :cobra where mvcl_id = :movid;
    SUSPEND;
    END
TIPO = 77;
FOR SELECT h.dvch_id , h.COBR_COD from devolucion_cheques h
    INTO : ID, :cobra
    DO
    BEGIN
    SUSPEND;
    select mvcl_id from movimiento_clientes where mvcl_tiporef = 77 and mvcl_idref = :id into :movid;
      UPDATE MOVIMIENTO_CLIENTES SET COBR_COD = :cobra where mvcl_id = :movid;
    SUSPEND;
    END
END^


ALTER PROCEDURE ASIGNA_PRECIOS (
    AUT CHAR(1),
    UTIL NUMERIC(9,2),
    MARGEN NUMERIC(9,2))
AS
declare variable LISTA INTEGER;
declare variable ART VARCHAR(20);
declare variable NUMROWS INTEGER;
begin
FOR SELECT LIPR_COD FROM LISTA_PRECIOS ORDER BY LIPR_COD INTO :LISTA
    DO
    FOR SELECT ARTI_COD FROM ARTICULO order BY ARTI_COD INTO :ART
    DO
        BEGIN
        SELECT COUNT(*) FROM PRECIOS_ARTICULO WHERE ARTI_COD = :ART AND LIPR_COD = :LISTA INTO :NUMROWS;
        if (NUMROWS = 0) then
            BEGIN
            INSERT INTO PRECIOS_ARTICULO (LIPR_COD, ARTI_COD, PRAR_FIJO, PRAR_UTIL, PRAR_MARGEN, PRAR_AUTO, PRAR_CONSUMO, PRAR_COMI, PRAR_COMIMONTO, PRAR_CANTMIN)
                VALUES (:LISTA, :ART, 0, :UTIL, :MARGEN, :AUT, 0, 0, 0, 0);
            END
        END
end^


ALTER PROCEDURE ASIGNA_RUTERO_FAC (
    TIPO INTEGER,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE ASIGNE_BOLETAS (
    IDF INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable UNASOLA CHAR(1);
declare variable GRUP VARCHAR(3);
declare variable SUBG VARCHAR(3);
declare variable MARC VARCHAR(3);
declare variable ARTI VARCHAR(20);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable MINIMO NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable ASIGNA CHAR(2);
begin
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GENERAR BOLETAS DE SORTEO POR COMPRAS') returning_values (:ASIGNA);
if (ASIGNA = 'SI') then
    BEGIN
    FOR SELECT SORC_PREF, SORC_TOTMIN, SORC_GRIN, SORC_SGIN, SORC_MARC, SORC_ARTI, SORC_UNASOLA,
        TERC_NIT, FACT_NOMCLIENTE
        FROM sorteos_configuracion S, FACTURAS F
        WHERE S.sorc_fecini <= F.fact_fecha AND S.sorc_fecfin >= F.fact_fecha AND
        F.fact_id = :IDF
        INTO :PREF, :MINIMO, :GRUP, :SUBG, :MARC, :ARTI, :UNASOLA,
        :NIT, :NOMBRE
        DO
        BEGIN
        select sum(fade_total) FROM FACTURAS_DETALLE D, ARTICULO A WHERE FACT_ID = :IDF AND A.arti_cod = D.arti_cod
            AND ((:ARTI = '') or (D.ARTI_COD = :ARTI)) AND ((:MARC = '') or (A.marc_cod = :marc)) AND
            ((:GRUP = '') or (A.grup_cod = :grup)) AND ((:SUBG = '') or (A.subg_cod = :subg))
            into :TOTAL;
        if (TOTAL >= MINIMO) then
            if (UNASOLA = 'S') then
                BEGIN
                INSERT INTO sorteo_factura (SORT_PREF, TERC_NIT, SORT_MONTO, SORT_NOMBRE, SORT_IDFACT)
                    VALUES (:PREF, :NIT, :TOTAL, :NOMBRE, :IDF);
                END
            else
                BEGIN
                WHILE (:TOTAL > :MINIMO) DO
                    BEGIN
                    INSERT INTO sorteo_factura (SORT_PREF, TERC_NIT, SORT_MONTO, SORT_NOMBRE, SORT_IDFACT)
                        VALUES (:PREF, :NIT, :MINIMO, :NOMBRE, :IDF);
                    TOTAL = TOTAL - MINIMO;
                    END
                END
        END
    END
end^


ALTER PROCEDURE ASIGNE_FACTURA_ENTREGA (
    ENTREGADOR INTEGER)
RETURNS (
    IDDOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    NOMCLI VARCHAR(60),
    HORAREG TIME,
    ITEMS INTEGER,
    ITEM INTEGER,
    STAND VARCHAR(20),
    DESARTI VARCHAR(60),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    ITEM2 INTEGER,
    STAND2 VARCHAR(20),
    DESARTI2 VARCHAR(60))
AS
declare variable CODART VARCHAR(20);
declare variable CODART2 VARCHAR(20);
declare variable BOD VARCHAR(2);
begin
IDDOC = 0;
SELECT FIRST 1 FACT_ID, PREF_PRE, FACT_NUMERO, FACT_NOMCLIENTE, A.audi_hora FROM FACTURAS F, AUDITORIA A
    WHERE A.tido_cod = 31 AND A.audi_iddoc = F.fact_id AND A.audi_oper = 'I' AND F.fact_anulado = 'N' AND F.fact_fecha = CAST('NOW' AS DATE)
    AND (NOT EXISTS (SELECT ENDO_IDDOC FROM entrega_documentos WHERE TIDO_COD = 31 AND ENDO_IDDOC = F.fact_id and ENDO_HORAE IS NOT NULL))
    ORDER BY FACT_ID
    INTO :IDDOC, :PREF, :NUMERO, :NOMCLI, :HORAREG;
if ((IDDOC <> 0) and (IDDOC IS not NULL))  then
    BEGIN
    SELECT COUNT(FACT_ID) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC INTO :ITEMS;
    /* EL PRIMER ITEM */
    SELECT FIRST 1 FADE_ITEM, D.ARTI_COD, BODE_COD, ARTI_DES, FADE_CANT, FADE_UNIDAD FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE FACT_ID = :IDDOC AND D.arti_cod = A.arti_cod
        ORDER BY FADE_ITEM
        INTO :ITEM, :CODART, :BOD, :DESARTI, :CANT, :UNIDAD;
    if (ITEM IS NULL) then
        BEGIN
        ITEM = 0;
        DESARTI = '';
        CANT = 0;
        UNIDAD = '';
        STAND = '';
        END
    ELSE
        BEGIN
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODART AND STAND_BODEGA = :BOD INTO :STAND;
        CODART2 = '';
        ITEM2 = 0;
        SELECT FIRST 1 FADE_ITEM, D.ARTI_COD, ARTI_DES FROM FACTURAS_DETALLE D, ARTICULO A
            WHERE FACT_ID = :IDDOC AND D.arti_cod = A.arti_cod AND FADE_ITEM > :ITEM
            ORDER BY FADE_ITEM
            INTO :ITEM2, :CODART2, :DESARTI2;
        if ((CODART2 <> '') AND (CODART2 IS NOT NULL)) then
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODART2 AND STAND_BODEGA = :BOD INTO :STAND2;
        ELSE
            STAND2 = '';
        END
    /* ASIGNE LA FACTURA AL ENTREGADOR */
    INSERT INTO ENTREGA_DOCUMENTOS(TIDO_COD, ENDO_IDDOC, ENDO_FECHAA, ENDO_HORAA, ENDO_ENCARGADO)
        VALUES (31, :IDDOC, CAST('NOW' AS DATE), CAST('NOW' AS TIME), :ENTREGADOR);
    END
suspend;
end^


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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA 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^


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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    TERCERO VARCHAR(60),
    CIUDAD VARCHAR(5),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOF 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);
declare variable CTACCANT VARCHAR(30);
begin
execute procedure fecha_desde_conta (:DESDE) returning_values (:DESDE);
CTACCANT = '';
/* 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, T.ciud_cod
    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, :ciudad
    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;
        if (CTAPROYCENT <> CTACCANT) then
            BEGIN
            SALDOF = SALDO;
            CTACCANT = CTAPROYCENT;
            END
        SALDOF = SALDOF + DEBITO - CREDITO;
        suspend;
        end
end^


ALTER PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA_N (
    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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    TERCERO VARCHAR(60),
    CIUDAD VARCHAR(5),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    SALDOF NUMERIC(18,2),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMCUENTA VARCHAR(140),
    NOMPROY VARCHAR(60),
    NOMCENT VARCHAR(60),
    CTAPROY VARCHAR(24),
    CTAPROYCENT VARCHAR(28))
AS
declare variable FEC char(8);
declare variable CTACCANT VARCHAR(30);
begin
execute procedure fecha_desde_conta (:DESDE) returning_values (:DESDE);
CTACCANT = '';
/* 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, T.ciud_cod
    from COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D, cuentas_niif 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, :CIUDAD
    do
        begin
        /* Busca la fecha del ÃƒÂºltimo movimiento de la cuenta-CENTRO antes de la fecha */
        select  max(SACU_FECHA) from saldos_centros_niif
            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_niif
                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_niif
                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;
        if (CTAPROYCENT <> CTACCANT) then
            BEGIN
            SALDOF = SALDO;
            CTACCANT = CTAPROYCENT;
            END
        SALDOF = SALDOF + DEBITO - CREDITO;
        suspend;
        end
end^


ALTER PROCEDURE AUXILIAR_CENTRO_INI_FIN (
    CUENTA VARCHAR(20),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    ANOINI CHAR(4),
    ANOFIN CHAR(4),
    PERINI INTEGER,
    PERFIN INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    CIUDAD VARCHAR(5),
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
BEGIN
EXECUTE procedure compone_fecha_conta(anoini,  PERINI, 1) returning_values (FECINI);
EXECUTE procedure fin_de_mes(anofin,  perfin) returning_values (:FECFIN);
/* 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 ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :NIT, :TIPOREF, :IDREF
    DO
        BEGIN
        SELECT CIUD_COD FROM TERCEROS WHERE TERC_NIT = :nit INTO :ciudad;
        SUSPEND;
        END
END^


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(8),
    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),
    CIUDAD VARCHAR(5),
    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
    BEGIN
    SELECT CIUD_COD FROM TERCEROS WHERE TERC_NIT = :nit INTO :ciudad;
    SUSPEND;
    END
END^


ALTER PROCEDURE AUXILIAR_CENTRO_MES_N (
    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(8),
    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),
    CIUDAD VARCHAR(5),
    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_niif 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
    BEGIN
    SELECT CIUD_COD FROM TERCEROS WHERE TERC_NIT = :nit INTO :ciudad;
    SUSPEND;
    END
END^


ALTER PROCEDURE AUXILIAR_CUENTA_INI_FIN (
    CUENTA VARCHAR(20),
    ANOINI CHAR(4),
    ANOFIN CHAR(4),
    PERINI INTEGER,
    PERFIN INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CIUDAD VARCHAR(5),
    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
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
BEGIN
EXECUTE procedure compone_fecha_conta(anoini,  PERINI, 1) returning_values (FECINI);
EXECUTE procedure fin_de_mes(anofin,  perfin) returning_values (:FECFIN);
  /* 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 ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
    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
        SELECT CIUD_COD FROM TERCEROS WHERE TERC_NIT = :nit INTO :ciudad;
        SUSPEND;
        END
END^


ALTER PROCEDURE AUXILIAR_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CIUDAD VARCHAR(5),
    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
    BEGIN
    SELECT CIUD_COD FROM TERCEROS WHERE TERC_NIT = :nit INTO :ciudad;
    SUSPEND;
    END
END^


ALTER PROCEDURE AUXILIAR_CUENTA_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CIUDAD VARCHAR(5),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    TIPOREF INTEGER,
    IDREF INTEGER)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA DADA */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD, ENCO_TIPOREF, ENCO_IDREF
    FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CUENTA AND SUBSTRING(ENCO_FECHA FROM 1 FOR 4) = :ANO AND SUBSTRING(ENCO_FECHA FROM 5 FOR 2) = :PERIODO
    ORDER BY ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
    DO
    BEGIN
    SELECT CIUD_COD FROM TERCEROS WHERE TERC_NIT = :nit INTO :ciudad;
    SUSPEND;
    END
END^


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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CIUDAD VARCHAR(5),
    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
                    SELECT CIUD_COD FROM TERCEROS WHERE TERC_NIT = :nit INTO :ciudad;
                    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^


ALTER PROCEDURE AUXILIAR_DESDE_HASTA_NIIF (
    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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CIUDAD VARCHAR(5),
    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(140),
    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_niif
    WHERE CUEN_COD >= :CUENTAINI AND CUEN_COD <= :CUENTAFIN
     ORDER BY CUEN_COD
    INTO :CUENTA, :NOMCUENTA
    DO
        BEGIN
        EXECUTE PROCEDURE saldo_cuenta_niif(:CUENTA, :DESDE) RETURNING_VALUES (:INICIAL);
        SALDO = INICIAL;
        SELECT COUNT(CUEN_COD) FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif 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_niif 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
                    SELECT CIUD_COD FROM TERCEROS WHERE TERC_NIT = :nit INTO :ciudad;
                    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^


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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    DV CHAR(1),
    CIUDAD VARCHAR(5),
    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, CIUD_COD FROM TERCEROS WHERE TERC_NIT = :nit INTO :NOMTERCERO, :DV, :CIUDAD;
            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^


ALTER PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA_N (
    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(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    DV CHAR(1),
    CIUDAD VARCHAR(5),
    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(140),
    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_niif
    WHERE CUEN_COD >= :CUENTAINI AND CUEN_COD <= :CUENTAFIN
     ORDER BY CUEN_COD
    INTO :CUENTA, :NOMCUENTA
    DO
        BEGIN
        EXECUTE PROCEDURE saldo_cuenta_niif(:CUENTA, :DESDE) RETURNING_VALUES (:SALDOCTA);
        SALDOCTAF = SALDOCTA;
        FOR SELECT distinct TERC_NIT FROM saldos_terceros_niif 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_niif
                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_niif
                        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_niif
                        WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FEC) INTO :SALDO;
            CUENTANIT = CUENTA || NIT;
            SALDOFIN = SALDO;
            SELECT TERC_NOM, TERC_DV, CIUD_COD FROM TERCEROS WHERE TERC_NIT = :nit INTO :NOMTERCERO, :DV, :CIUDAD;
            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_niif 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^


ALTER PROCEDURE AUXILIAR_TERCERO_INI_FIN (
    CUENTA VARCHAR(20),
    TERCERO VARCHAR(20),
    ANOINI CHAR(4),
    ANOFIN CHAR(4),
    PERINI INTEGER,
    PERFIN INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
BEGIN
EXECUTE procedure compone_fecha_conta(anoini,  PERINI, 1) returning_values (FECINI);
EXECUTE procedure fin_de_mes(anofin,  perfin) returning_values (:FECFIN);

  /* 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 ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
    DO
        BEGIN
        SUSPEND;
        END
END^


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(8),
    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^


ALTER PROCEDURE AUXILIAR_TERCERO_MES_N (
    CUENTA VARCHAR(20),
    TERCERO VARCHAR(20),
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    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_niif 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^


ALTER PROCEDURE BALANCE_ANUAL (
    ANO CHAR(4),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TERC CHAR(1),
    SALDOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    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 MES INTEGER;
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);
    MES = 1;
    WHILE (MES < 14) DO
        BEGIN
        EXECUTE PROCEDURE movimientos_cuenta_mes (codigo,  ano,  MES) returning_values (:DEBITOS, :CREDITOS);
        if (MES = 1) then
            begin
            MVENE = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVENE = MVENE + INICIAL;
            end
        if (MES = 2) then
            BEGIN
            MVFEB = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVFEB = MVFEB + MVENE;
            END
        if (MES = 3) then
            BEGIN
            MVMAR = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVMAR = MVMAR + MVFEB;
            END
        if (MES = 4) then
            BEGIN
            MVABR = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVABR = MVABR + MVMAR;
            END
        if (MES = 5) then
            BEGIN
            MVMAY = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVMAY = MVMAY + MVABR;
            END
        if (MES = 6) then
            BEGIN
            MVJUN = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVJUN = MVJUN + MVMAY;
            END
        if (MES = 7) then
            BEGIN
            MVJUL = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVJUL = MVJUL + MVJUN;
            END
        if (MES = 8) then
            BEGIN
            MVAGO = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVAGO = MVAGO + MVJUL;
            END
        if (MES = 9) then
            BEGIN
            MVSEP = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVSEP = MVSEP + MVAGO;
            END
        if (MES = 10) then
            BEGIN
            MVOCT = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVOCT = MVOCT + MVSEP;
            END
        if (MES = 11) then
            BEGIN
            MVNOV = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVNOV = MVNOV + MVOCT;
            END
        if (MES = 12) then
            BEGIN
            MVDIC = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVDIC = MVDIC + MVNOV;
            END
        if (MES = 13) then
            BEGIN
            MVCIE = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVCIE = MVCIE + MVDIC;
            END
        MES = MES + 1;
        END
    if (SALDOS = 'S') then
        FINAL = MVCIE;
    ELSE
        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 >= :codigo and d.cuen_cod <= :codigo)
        ORDER BY TERC_NIT
        INTO :nit, :nomterc
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_tercero_mes(CODIGO, NIT, ANO, 1, 'S') RETURNING_VALUES (INICIAL);
        INICIAL = INICIAL/1000;
        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
            BEGIN
            MVENE = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVENE = MVENE + INICIAL;
            MVENE = MVENE / 1000;
            END
          if (MESAUX = '02') then
            BEGIN
            MVFEB = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVFEB = MVFEB + MVENE;
            MVFEB  = MVFEB /1000;
            END
          if (MESAUX = '03') then
            BEGIN
            MVMAR = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVMAR = MVMAR + MVFEB;
            MVMAR = MVMAR / 1000;
            END
          if (MESAUX = '04') then
            BEGIN
            MVABR = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVABR = MVABR + MVMAR;
            MVABR = MVABR / 1000;
            END
          if (MESAUX = '05') then
            BEGIN
            MVMAY = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVMAY = MVMAY + MVABR;
            MVMAY = MVMAY / 1000;
            END
          if (MESAUX = '06') then
            BEGIN
            MVJUN = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVJUN = MVJUN + MVMAY;
            MVJUN = MVJUN / 1000;
            END
          if (MESAUX = '07') then
            BEGIN
            MVJUL = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVJUL = MVJUL + MVJUN;
            MVJUL = MVJUL / 1000;
            END
          if (MESAUX = '08') then
            BEGIN
            MVAGO = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVAGO = MVAGO + MVJUL;
            MVAGO = MVAGO / 1000;
            END
          if (MESAUX = '09') then
            BEGIN
            MVSEP = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVSEP = MVSEP + MVAGO;
            MVSEP = MVSEP / 1000;
            END
          if (MESAUX = '10') then
            BEGIN
            MVOCT = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVOCT = MVOCT + MVSEP;
            MVOCT = MVOCT / 1000;
            END
          if (MESAUX = '11') then
            BEGIN
            MVNOV = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVNOV = MVNOV + MVOCT;
            MVNOV = MVNOV / 1000;
            END
          if (MESAUX = '12') then
            BEGIN
            MVDIC = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVDIC = MVDIC + MVNOV;
            MVDIC = MVDIC / 1000;
            END
          if (MESAUX = '13') then
            BEGIN
            MVCIE = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVCIE = MVCIE + MVDIC;
            MVCIE = MVCIE / 1000;
            END
          END
        if (SALDOS = 'S') then
            FINAL = MVCIE;
        ELSE
            FINAL = INICIAL + MVENE + MVFEB + MVMAR + MVABR + MVMAY + MVJUN + MVJUL + MVAGO + MVSEP + MVOCT + MVNOV + MVDIC + MVCIE;
        if ((INICIAL <> 0) OR (MVENE <> 0) OR (MVFEB <> 0) OR (MVMAR <> 0) OR (MVABR <> 0) OR (MVMAY <> 0) OR (MVJUN <> 0)
             OR (MVJUL <> 0) OR (MVAGO <> 0) OR (MVSEP <> 0) OR (MVOCT <> 0) OR (MVNOV <> 0) OR (MVDIC <> 0) OR (MVCIE <> 0)) then
            SUSPEND;
        END
    END
   END
END^


ALTER PROCEDURE BALANCE_ANUAL_CENTROS (
    ANO CHAR(4),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    SALDOS CHAR(1),
    NIIF CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    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 MES INTEGER;
declare variable MESAUX CHAR(2);
declare variable AFECTA CHAR(1);
BEGIN
if (NIIF = 'S') then
    BEGIN
    FOR SELECT CUEN_COD, CUEN_NOM FROM cuentas_niif 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 (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_niif(CODIGO, ANO, 1, 'S') RETURNING_VALUES (INICIAL);
        MES = 1;
        WHILE (MES < 14) DO
            BEGIN
            EXECUTE PROCEDURE movimientos_cuenta_mes_niif (codigo,  ano,  MES) returning_values (:DEBITOS, :CREDITOS);
            if (MES = 1) then
                begin
                MVENE = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVENE = MVENE + INICIAL;
                end
            if (MES = 2) then
                BEGIN
                MVFEB = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVFEB = MVFEB + MVENE;
                END
            if (MES = 3) then
                BEGIN
                MVMAR = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVMAR = MVMAR + MVFEB;
                END
            if (MES = 4) then
                BEGIN
                MVABR = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVABR = MVABR + MVMAR;
                END
            if (MES = 5) then
                BEGIN
                MVMAY = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVMAY = MVMAY + MVABR;
                END
            if (MES = 6) then
                BEGIN
                MVJUN = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVJUN = MVJUN + MVMAY;
                END
            if (MES = 7) then
                BEGIN
                MVJUL = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVJUL = MVJUL + MVJUN;
                END
            if (MES = 8) then
                BEGIN
                MVAGO = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVAGO = MVAGO + MVJUL;
                END
            if (MES = 9) then
                BEGIN
                MVSEP = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVSEP = MVSEP + MVAGO;
                END
            if (MES = 10) then
                BEGIN
                MVOCT = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVOCT = MVOCT + MVSEP;
                END
            if (MES = 11) then
                BEGIN
                MVNOV = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVNOV = MVNOV + MVOCT;
                END
            if (MES = 12) then
                BEGIN
                MVDIC = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVDIC = MVDIC + MVNOV;
                END
            if (MES = 13) then
                BEGIN
                MVCIE = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVCIE = MVCIE + MVDIC;
                END
            MES = MES + 1;
            END
        if (SALDOS = 'S') then
            FINAL = MVCIE;
        ELSE
            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 PROY_COD, CENT_COD FROM CENTROS C
            WHERE EXISTS (SELECT E.ENCO_CONSEC FROM comprobante_encabezado E, comprobante_detalle_niif D
            WHERE E.enco_consec = D.enco_consec AND D.proy_cod = C.proy_cod AND D.cent_cod = C.cent_cod and substring(e.enco_fecha from 1 for 4) = :ano
            and d.cuen_cod >= :codigo and d.cuen_cod <= :codigo)
            ORDER BY PROY_COD, CENT_COD
            INTO :proy, :centro
            DO
            BEGIN
            NOMBRE = SUBSTRING(NOMBRE FROM 1 FOR 40) || ' ' || PROY || '-' || CENTRO;
            EXECUTE PROCEDURE saldo_centro_mes_niif(CODIGO, proy, centro, ANO, 1, 'S') RETURNING_VALUES (INICIAL);
            INICIAL = 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(SACE_DEBITO), SUM(SACE_CREDITO) FROM saldos_centros_niif
              WHERE CUEN_COD = :CODIGO AND PROY_COD = :proy AND CENT_COD = :centro AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
              GROUP by substr(SACU_FECHA, 5, 6)
              INTO :MESAUX, :DEBITOS, :CREDITOS
              DO
              BEGIN
              if (MESAUX = '01') then
                BEGIN
                MVENE = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVENE = MVENE + INICIAL;
                END
              if (MESAUX = '02') then
                BEGIN
                MVFEB = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVFEB = MVFEB + MVENE;
                END
              if (MESAUX = '03') then
                BEGIN
                MVMAR = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVMAR = MVMAR + MVFEB;
                END
              if (MESAUX = '04') then
                BEGIN
                MVABR = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVABR = MVABR + MVMAR;
                END
              if (MESAUX = '05') then
                BEGIN
                MVMAY = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVMAY = MVMAY + MVABR;
                END
              if (MESAUX = '06') then
                BEGIN
                MVJUN = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVJUN = MVJUN + MVMAY;
                END
              if (MESAUX = '07') then
                BEGIN
                MVJUL = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVJUL = MVJUL + MVJUN;
                END
              if (MESAUX = '08') then
                BEGIN
                MVAGO = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVAGO = MVAGO + MVJUL;
                END
              if (MESAUX = '09') then
                BEGIN
                MVSEP = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVSEP = MVSEP + MVAGO;
                END
              if (MESAUX = '10') then
                BEGIN
                MVOCT = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVOCT = MVOCT + MVSEP;
                END
              if (MESAUX = '11') then
                BEGIN
                MVNOV = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVNOV = MVNOV + MVOCT;
                END
              if (MESAUX = '12') then
                BEGIN
                MVDIC = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVDIC = MVDIC + MVNOV;
                END
              if (MESAUX = '13') then
                BEGIN
                MVCIE = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVCIE = MVCIE + MVDIC;
                END
              END
            if (SALDOS = 'S') then
                FINAL = MVCIE;
            ELSE
                FINAL = INICIAL + MVENE + MVFEB + MVMAR + MVABR + MVMAY + MVJUN + MVJUL + MVAGO + MVSEP + MVOCT + MVNOV + MVDIC + MVCIE;
            if ((INICIAL <> 0) OR (MVENE <> 0) OR (MVFEB <> 0) OR (MVMAR <> 0) OR (MVABR <> 0) OR (MVMAY <> 0) OR (MVJUN <> 0)
                 OR (MVJUL <> 0) OR (MVAGO <> 0) OR (MVSEP <> 0) OR (MVOCT <> 0) OR (MVNOV <> 0) OR (MVDIC <> 0) OR (MVCIE <> 0)) then
                SUSPEND;
            END
        END
       END
    END
ELSE
    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 (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);
        MES = 1;
        WHILE (MES < 14) DO
            BEGIN
            EXECUTE PROCEDURE movimientos_cuenta_mes (codigo,  ano,  MES) returning_values (:DEBITOS, :CREDITOS);
            if (MES = 1) then
                begin
                MVENE = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVENE = MVENE + INICIAL;
                end
            if (MES = 2) then
                BEGIN
                MVFEB = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVFEB = MVFEB + MVENE;
                END
            if (MES = 3) then
                BEGIN
                MVMAR = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVMAR = MVMAR + MVFEB;
                END
            if (MES = 4) then
                BEGIN
                MVABR = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVABR = MVABR + MVMAR;
                END
            if (MES = 5) then
                BEGIN
                MVMAY = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVMAY = MVMAY + MVABR;
                END
            if (MES = 6) then
                BEGIN
                MVJUN = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVJUN = MVJUN + MVMAY;
                END
            if (MES = 7) then
                BEGIN
                MVJUL = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVJUL = MVJUL + MVJUN;
                END
            if (MES = 8) then
                BEGIN
                MVAGO = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVAGO = MVAGO + MVJUL;
                END
            if (MES = 9) then
                BEGIN
                MVSEP = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVSEP = MVSEP + MVAGO;
                END
            if (MES = 10) then
                BEGIN
                MVOCT = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVOCT = MVOCT + MVSEP;
                END
            if (MES = 11) then
                BEGIN
                MVNOV = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVNOV = MVNOV + MVOCT;
                END
            if (MES = 12) then
                BEGIN
                MVDIC = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVDIC = MVDIC + MVNOV;
                END
            if (MES = 13) then
                BEGIN
                MVCIE = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVCIE = MVCIE + MVDIC;
                END
            MES = MES + 1;
            END
        if (SALDOS = 'S') then
            FINAL = MVCIE;
        ELSE
            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 PROY_COD, CENT_COD FROM CENTROS C
            WHERE EXISTS (SELECT E.ENCO_CONSEC FROM comprobante_encabezado E, COMPROBANTE_DETALLE D
            WHERE E.enco_consec = D.enco_consec AND D.proy_cod = C.proy_cod AND D.cent_cod = C.cent_cod and substring(e.enco_fecha from 1 for 4) = :ano
            and d.cuen_cod >= :codigo and d.cuen_cod <= :codigo)
            ORDER BY PROY_COD, CENT_COD
            INTO :proy, :centro
            DO
            BEGIN
            NOMBRE = SUBSTRING(NOMBRE FROM 1 FOR 40) || ' ' || PROY || '-' || CENTRO;
            EXECUTE PROCEDURE saldo_centro_mes(CODIGO, proy, centro, ANO, 1, 'S') RETURNING_VALUES (INICIAL);
            INICIAL = 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(SACE_DEBITO), SUM(SACE_CREDITO) FROM saldos_centros
              WHERE CUEN_COD = :CODIGO AND PROY_COD = :proy AND CENT_COD = :centro AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
              GROUP by substr(SACU_FECHA, 5, 6)
              INTO :MESAUX, :DEBITOS, :CREDITOS
              DO
              BEGIN
              if (MESAUX = '01') then
                BEGIN
                MVENE = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVENE = MVENE + INICIAL;
                END
              if (MESAUX = '02') then
                BEGIN
                MVFEB = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVFEB = MVFEB + MVENE;
                END
              if (MESAUX = '03') then
                BEGIN
                MVMAR = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVMAR = MVMAR + MVFEB;
                END
              if (MESAUX = '04') then
                BEGIN
                MVABR = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVABR = MVABR + MVMAR;
                END
              if (MESAUX = '05') then
                BEGIN
                MVMAY = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVMAY = MVMAY + MVABR;
                END
              if (MESAUX = '06') then
                BEGIN
                MVJUN = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVJUN = MVJUN + MVMAY;
                END
              if (MESAUX = '07') then
                BEGIN
                MVJUL = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVJUL = MVJUL + MVJUN;
                END
              if (MESAUX = '08') then
                BEGIN
                MVAGO = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVAGO = MVAGO + MVJUL;
                END
              if (MESAUX = '09') then
                BEGIN
                MVSEP = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVSEP = MVSEP + MVAGO;
                END
              if (MESAUX = '10') then
                BEGIN
                MVOCT = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVOCT = MVOCT + MVSEP;
                END
              if (MESAUX = '11') then
                BEGIN
                MVNOV = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVNOV = MVNOV + MVOCT;
                END
              if (MESAUX = '12') then
                BEGIN
                MVDIC = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVDIC = MVDIC + MVNOV;
                END
              if (MESAUX = '13') then
                BEGIN
                MVCIE = (DEBITOS - CREDITOS);
                if (SALDOS = 'S') then
                    MVCIE = MVCIE + MVDIC;
                END
              END
            if (SALDOS = 'S') then
                FINAL = MVCIE;
            ELSE
                FINAL = INICIAL + MVENE + MVFEB + MVMAR + MVABR + MVMAY + MVJUN + MVJUL + MVAGO + MVSEP + MVOCT + MVNOV + MVDIC + MVCIE;
            if ((INICIAL <> 0) OR (MVENE <> 0) OR (MVFEB <> 0) OR (MVMAR <> 0) OR (MVABR <> 0) OR (MVMAY <> 0) OR (MVJUN <> 0)
                 OR (MVJUL <> 0) OR (MVAGO <> 0) OR (MVSEP <> 0) OR (MVOCT <> 0) OR (MVNOV <> 0) OR (MVDIC <> 0) OR (MVCIE <> 0)) then
                SUSPEND;
            END
        END
       END
    END
END^


ALTER PROCEDURE BALANCE_ANUAL_NIIF (
    ANO CHAR(4),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TERC CHAR(1),
    SALDOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(140),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    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 MES INTEGER;
declare variable MESAUX CHAR(2);
declare variable AFECTA CHAR(1);
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM cuentas_niif WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN order by CUEN_COD INTO CODIGO, NOMBRE
  DO
  BEGIN
  execute procedure es_afectable_niif(: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_niif(CODIGO, ANO, 1, 'S') RETURNING_VALUES (INICIAL);
    MES = 1;
    WHILE (MES < 14) DO
        BEGIN
        EXECUTE PROCEDURE movimientos_cuenta_mes_niif (codigo,  ano,  MES) returning_values (:DEBITOS, :CREDITOS);
        if (MES = 1) then
            begin
            MVENE = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVENE = MVENE + INICIAL;
            end
        if (MES = 2) then
            BEGIN
            MVFEB = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVFEB = MVFEB + MVENE;
            END
        if (MES = 3) then
            BEGIN
            MVMAR = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVMAR = MVMAR + MVFEB;
            END
        if (MES = 4) then
            BEGIN
            MVABR = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVABR = MVABR + MVMAR;
            END
        if (MES = 5) then
            BEGIN
            MVMAY = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVMAY = MVMAY + MVABR;
            END
        if (MES = 6) then
            BEGIN
            MVJUN = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVJUN = MVJUN + MVMAY;
            END
        if (MES = 7) then
            BEGIN
            MVJUL = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVJUL = MVJUL + MVJUN;
            END
        if (MES = 8) then
            BEGIN
            MVAGO = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVAGO = MVAGO + MVJUL;
            END
        if (MES = 9) then
            BEGIN
            MVSEP = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVSEP = MVSEP + MVAGO;
            END
        if (MES = 10) then
            BEGIN
            MVOCT = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVOCT = MVOCT + MVSEP;
            END
        if (MES = 11) then
            BEGIN
            MVNOV = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVNOV = MVNOV + MVOCT;
            END
        if (MES = 12) then
            BEGIN
            MVDIC = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVDIC = MVDIC + MVNOV;
            END
        if (MES = 13) then
            BEGIN
            MVCIE = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVCIE = MVCIE + MVDIC;
            END
        MES = MES + 1;
        END
    if (SALDOS = 'S') then
        FINAL = MVCIE;
    ELSE
        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_niif 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 >= :codigo and d.cuen_cod <= :codigo)
        ORDER BY TERC_NIT
        INTO :nit, :nomterc
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_tercero_mes_niif(CODIGO, NIT, ANO, 1, 'S') RETURNING_VALUES (INICIAL);
        INICIAL = INICIAL/1000;
        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_niif
          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
            BEGIN
            MVENE = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVENE = MVENE + INICIAL;
            END
          if (MESAUX = '02') then
            BEGIN
            MVFEB = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVFEB = MVFEB + MVENE;
            END
          if (MESAUX = '03') then
            BEGIN
            MVMAR = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVMAR = MVMAR + MVFEB;
            END
          if (MESAUX = '04') then
            BEGIN
            MVABR = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVABR = MVABR + MVMAR;
            END
          if (MESAUX = '05') then
            BEGIN
            MVMAY = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVMAY = MVMAY + MVABR;
            END
          if (MESAUX = '06') then
            BEGIN
            MVJUN = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVJUN = MVJUN + MVMAY;
            END
          if (MESAUX = '07') then
            BEGIN
            MVJUL = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVJUL = MVJUL + MVJUN;
            END
          if (MESAUX = '08') then
            BEGIN
            MVAGO = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVAGO = MVAGO + MVJUL;
            END
          if (MESAUX = '09') then
            BEGIN
            MVSEP = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVSEP = MVSEP + MVAGO;
            END
          if (MESAUX = '10') then
            BEGIN
            MVOCT = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVOCT = MVOCT + MVSEP;
            END
          if (MESAUX = '11') then
            BEGIN
            MVNOV = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVNOV = MVNOV + MVOCT;
            END
          if (MESAUX = '12') then
            BEGIN
            MVDIC = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVDIC = MVDIC + MVNOV;
            END
          if (MESAUX = '13') then
            BEGIN
            MVCIE = (DEBITOS - CREDITOS);
            if (SALDOS = 'S') then
                MVCIE = MVCIE + MVDIC;
            END
          END
        if (SALDOS = 'S') then
            FINAL = MVCIE;
        ELSE
            FINAL = INICIAL + MVENE + MVFEB + MVMAR + MVABR + MVMAY + MVJUN + MVJUL + MVAGO + MVSEP + MVOCT + MVNOV + MVDIC + MVCIE;
        if ((INICIAL <> 0) OR (MVENE <> 0) OR (MVFEB <> 0) OR (MVMAR <> 0) OR (MVABR <> 0) OR (MVMAY <> 0) OR (MVJUN <> 0)
             OR (MVJUL <> 0) OR (MVAGO <> 0) OR (MVSEP <> 0) OR (MVOCT <> 0) OR (MVNOV <> 0) OR (MVDIC <> 0) OR (MVCIE <> 0)) then
            SUSPEND;
        END
    END
   END
END^


ALTER PROCEDURE BALANCE_ARTICULO_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
FOR SELECT ARTI_COD, ARTI_DES FROM ARTICULO INTO CODIGO, NOMBRE
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_ARTICULO_MES(CUENTA, CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE MOVIMIENTOS_ARTICULOC_MES(CUENTA, CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SUSPEND;
  END
END^


ALTER PROCEDURE BALANCE_CENTRO_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
FOR SELECT PROY_COD, CENT_COD FROM CENTROS INTO PROYECTO, CENTRO
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CENTRO_MES(CUENTA, PROYECTO, CENTRO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE MOVIMIENTOS_CENTRO_MES(CUENTA, PROYECTO, CENTRO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SUSPEND;
  END
END^


ALTER PROCEDURE BALANCE_CENTRO_MES_N (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
FOR SELECT PROY_COD, CENT_COD FROM CENTROS INTO PROYECTO, CENTRO
DO
  BEGIN
  EXECUTE PROCEDURE saldo_centro_mes_niif(CUENTA, PROYECTO, CENTRO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE movimientos_centro_mes_n(CUENTA, PROYECTO, CENTRO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SUSPEND;
  END
END^


ALTER PROCEDURE BALANCE_CENTRO_TERCERO_MES (
    CUENTA VARCHAR(20),
    PROY CHAR(4),
    CENT CHAR(4),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable FECAUX char(8);
BEGIN
EXECUTE PROCEDURE compone_fecha_conta(ano,  MES, 1) returning_values (FECAUX);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECAUX, -1) RETURNING_VALUES (FECAUX);

FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS where exists (select sacu_fecha from saldos_centros_tercero
        where cuen_cod = :cuenta and proy_cod = :proy and cent_cod = :cent)
    INTO CODIGO, NOMBRE
DO
  BEGIN
  EXECUTE PROCEDURE saldo_centro_tercero(CUENTA, PROY, CENT, CODIGO, fecaux) RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE movimientos_centro_tercero_mes(CUENTA, PROY, CENT, CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SUSPEND;
  END
END^


ALTER PROCEDURE BALANCE_CENTRO_TERCERO_MES_N (
    CUENTA VARCHAR(20),
    PROY CHAR(4),
    CENT CHAR(4),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
declare variable FECAUX CHAR(8);
BEGIN
FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS INTO CODIGO, NOMBRE
DO
  BEGIN
  EXECUTE PROCEDURE compone_fecha_conta(ano,  MES, 1) returning_values (FECAUX);
  EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECAUX, -1) RETURNING_VALUES (FECAUX);

  EXECUTE PROCEDURE saldo_centro_tercero_niif(CUENTA, PROY, CENT, CODIGO, fecaux) RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE movtos_centro_tercero_mes_n(CUENTA, PROY, CENT, CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SUSPEND;
  END
END^


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


ALTER PROCEDURE BALANCE_COMPARATIVO_NIIF (
    ANO1 CHAR(4),
    MES1 INTEGER,
    ANO2 CHAR(4),
    MES2 INTEGER,
    TERCEROS CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(140),
    NIT VARCHAR(20),
    NOM_TERCERO VARCHAR(60),
    INICIAL1 NUMERIC(18,2),
    DEBITOS1 NUMERIC(18,2),
    CREDITOS1 NUMERIC(18,2),
    FINAL1 NUMERIC(18,2),
    INICIAL2 NUMERIC(18,2),
    DEBITOS2 NUMERIC(18,2),
    CREDITOS2 NUMERIC(18,2),
    FINAL2 NUMERIC(18,2),
    TERCERO CHAR(1),
    NIVEL INTEGER,
    NOMCTATER VARCHAR(140))
AS
DECLARE VARIABLE OK CHAR(1);
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM cuentas_niif order by CUEN_COD INTO CUENTA, NOM_CUENTA
DO
  BEGIN
  EXECUTE PROCEDURE saldo_cuenta_mes_niif(CUENTA, ANO1, MES1, 'S') RETURNING_VALUES (INICIAL1);
  EXECUTE PROCEDURE movimiento_cuenta_mes_niif(CUENTA, ANO1, MES1, 'S') RETURNING_VALUES(DEBITOS1);
  EXECUTE PROCEDURE movimiento_cuenta_mes_niif(CUENTA, ANO1, MES1, 'N') RETURNING_VALUES(CREDITOS1);
  FINAL1 = INICIAL1 + DEBITOS1 - CREDITOS1;
  EXECUTE PROCEDURE saldo_cuenta_mes_niif(CUENTA, ANO2, MES2, 'S') RETURNING_VALUES (INICIAL2);
  EXECUTE PROCEDURE movimiento_cuenta_mes_niif(CUENTA, ANO2, MES2, 'S') RETURNING_VALUES(DEBITOS2);
  EXECUTE PROCEDURE movimiento_cuenta_mes_niif(CUENTA, ANO2, MES2, 'N') RETURNING_VALUES(CREDITOS2);
  FINAL2 = INICIAL2 + DEBITOS2 - CREDITOS2;
  NIT = '';
  NOM_TERCERO = '';
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
  NOMCTATER = NOM_CUENTA;
  if (TERCEROS = 'S') then
    BEGIN
    EXECUTE PROCEDURE es_afectable_niif(CUENTA) RETURNING_VALUES (OK);
    IF (OK = 'S') THEN
        BEGIN
        FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS ORDER BY TERC_NIT INTO NIT, NOM_TERCERO
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_tercero_mes_niif(CUENTA, NIT, ANO1, MES1, 'S') RETURNING_VALUES (INICIAL1);
            EXECUTE PROCEDURE movimiento_tercero_mes_niif(CUENTA, NIT, ANO1, MES1, 'S') RETURNING_VALUES(DEBITOS1);
            EXECUTE PROCEDURE movimiento_tercero_mes_niif(CUENTA, NIT, ANO1, MES1, 'N') RETURNING_VALUES(CREDITOS1);
            FINAL1 = INICIAL1 + DEBITOS1 - CREDITOS1;
            EXECUTE PROCEDURE saldo_tercero_mes_niif(CUENTA, NIT, ANO2, MES2, 'S') RETURNING_VALUES (INICIAL2);
            EXECUTE PROCEDURE movimiento_tercero_mes_niif(CUENTA, NIT, ANO2, MES2, 'S') RETURNING_VALUES(DEBITOS2);
            EXECUTE PROCEDURE movimiento_tercero_mes_niif(CUENTA, NIT, ANO2, MES2, 'N') RETURNING_VALUES(CREDITOS2);
            FINAL2 = INICIAL2 + DEBITOS2 - CREDITOS2;
            NOM_CUENTA = '';
            NOMCTATER = NOM_TERCERO;
            if ((final1 <> 0) or (inicial1 <> 0) or (debitos1 <> 0) or (creditos1 <> 0) or (final2 <> 0) or (inicial2 <> 0) or (debitos2 <> 0) or (creditos2 <> 0)) then
                SUSPEND;
            END
        END
    END
  ELSE
    if ((final1 <> 0) or (inicial1 <> 0) or (debitos1 <> 0) or (creditos1 <> 0) or (final2 <> 0) or (inicial2 <> 0) or (debitos2 <> 0) or (creditos2 <> 0)) then
        SUSPEND;
  END
END^


ALTER PROCEDURE BALANCE_CON_CENTROS_MES (
    ANO CHAR(4),
    MES INTEGER,
    PORCENTRO CHAR(1),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    PROYINI VARCHAR(4),
    PROYFIN VARCHAR(4),
    CENTINI VARCHAR(4),
    CENTFIN VARCHAR(4))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(60),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    NOM_CENTRO VARCHAR(60),
    NOM_SUBCENTRO 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),
    SCENTRO NUMERIC(18,2),
    MCLASE NUMERIC(18,2),
    MGRUPO NUMERIC(18,2),
    MSUBGRUPO NUMERIC(18,2),
    MCUENTA NUMERIC(18,2),
    MOVIMIEN NUMERIC(18,2),
    NOMCTACEN VARCHAR(120),
    SALDO DOUBLE PRECISION,
    NIVEL INTEGER)
AS
DECLARE VARIABLE OK CHAR(1);
declare variable CTACIERREU VARCHAR(20);
declare variable CTACIERREP VARCHAR(20);
declare variable ES_CENTRO CHAR(1);
declare variable SIMULA CHAR(2);
declare variable AUX NUMERIC(18,2);
declare variable CIERRE NUMERIC(18,2);
DECLARE VARIABLE DIG INTEGER;
BEGIN
if (PORCENTRO = 'S') then
    BEGIN
    FOR SELECT P.PROY_COD, P.PROY_NOM, CENT_COD, CENT_NOM FROM CENTROS C, PROYECTOS P
        WHERE P.PROY_COD = C.PROY_COD AND C.PROY_COD >= :PROYINI AND C.PROY_COD <= :PROYFIN AND C.CENT_COD >= :CENTINI AND C.CENT_COD <= :CENTFIN
        ORDER BY C.PROY_COD, C.CENT_COD INTO PROY, nom_centro,  CENTRO, NOM_SUBCENTRO
        DO
        BEGIN
        execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'SIMULAR CIERRE EN BALANCES POR CENTRO DE COSTO') returning_values (:SIMULA);
        if (simula = 'SI') 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);
            /* CALCULE LA UTILIDAD DEL EJERCICIO */
            EXECUTE PROCEDURE SALDO_CENTRO_MES('4', PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES (AUX);
            CIERRE = AUX;
            EXECUTE PROCEDURE SALDO_CENTRO_MES('5', PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES (AUX);
            CIERRE = CIERRE + AUX;
            EXECUTE PROCEDURE SALDO_CENTRO_MES('6', PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES (AUX);
            CIERRE = CIERRE + AUX;
            EXECUTE PROCEDURE SALDO_CENTRO_MES('7', PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES (AUX);
            CIERRE = CIERRE + AUX;
            END
        FOR SELECT CUEN_COD, CUEN_NOM, CUEN_CENTRO FROM CUENTAS
            WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN ORDER BY CUEN_COD
            INTO CUENTA, NOM_CUENTA, ES_CENTRO
            DO
            BEGIN
            SCLASE = 0;
            SGRUPO = 0;
            SSUBGRUPO = 0;
            SCUENTA = 0;
            SCENTRO = 0;
            MCLASE = 0;
            MGRUPO = 0;
            MSUBGRUPO = 0;
            MCUENTA = 0;
            EXECUTE PROCEDURE SALDO_CENTRO_MES(CUENTA, PROY, CENTRO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
            EXECUTE PROCEDURE MOVIMIENTO_CENTRO_MES(CUENTA, PROY, CENTRO, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
            EXECUTE PROCEDURE MOVIMIENTO_CENTRO_MES(CUENTA, PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
            EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
            EXECUTE PROCEDURE DIGITOS_NIVEL (:NIVEL) RETURNING_VALUES (:DIG);
            MOVIMIEN = DEBITOS - CREDITOS;
            IF (SIMULA = 'SI') THEN
                if (CIERRE > 0) then
                BEGIN
                IF (CUENTA = SUBSTR(CTACIERREP, 1, DIG)) then
                    DEBITOS = DEBITOS + CIERRE;
                END
            else
                BEGIN
                IF (CUENTA = SUBSTR(CTACIERREU, 1, DIG)) then
                    CREDITOS = CREDITOS + (CIERRE * -1);
                END
            FINAL = INICIAL + DEBITOS - CREDITOS;
            SCENTRO = FINAL;
            SALDO = FINAL;
            EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
            if (NIVEL = 1) then
                BEGIN
                SCLASE = FINAL;
                MCLASE = MOVIMIEN;
                END
            if (NIVEL = 2) then
                BEGIN
                SGRUPO = FINAL;
                MGRUPO = MOVIMIEN;
                END
            if (NIVEL = 3) then
                BEGIN
                SSUBGRUPO = FINAL;
                MSUBGRUPO = MOVIMIEN;
                END
            if (NIVEL = 4) then
                BEGIN
                SCUENTA = FINAL;
                MCUENTA = MOVIMIEN;
                END
            NOMCTACEN = NOM_CUENTA;
            if (NIVEL < 5) then
                MOVIMIEN = 0;
            SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    FOR SELECT CUEN_COD, CUEN_NOM, CUEN_CENTRO FROM CUENTAS
        WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN ORDER BY CUEN_COD
        INTO CUENTA, NOM_CUENTA, ES_CENTRO
        DO
        BEGIN
        SCLASE = 0;
        SGRUPO = 0;
        SSUBGRUPO = 0;
        SCUENTA = 0;
        SCENTRO = 0;
        MCLASE = 0;
        MGRUPO = 0;
        MSUBGRUPO = 0;
        MCUENTA = 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);
        MOVIMIEN = DEBITOS - CREDITOS;
        FINAL = INICIAL + DEBITOS - CREDITOS;
        PROY = '';
        CENTRO = '';
        NOM_CENTRO = '';
        EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
        if (NIVEL = 1) then
            BEGIN
            SCLASE = FINAL;
            MCLASE = MOVIMIEN;
            END
        if (NIVEL = 2) then
            BEGIN
            SGRUPO = FINAL;
            MGRUPO = MOVIMIEN;
            END
        if (NIVEL = 3) then
            BEGIN
            SSUBGRUPO = FINAL;
            MSUBGRUPO = MOVIMIEN;
            END
        if (NIVEL = 4) then
            BEGIN
            SCUENTA = FINAL;
            MCUENTA = MOVIMIEN;
            END
        NOMCTACEN = NOM_CUENTA;
        if (NIVEL < 5) then
            MOVIMIEN = 0;
        SALDO = FINAL;
        SUSPEND;
        EXECUTE PROCEDURE ES_AFECTABLE(CUENTA) RETURNING_VALUES (OK);
        IF ((OK = 'S') AND (ES_CENTRO = 'S')) THEN
            BEGIN
            FOR SELECT P.PROY_COD, P.PROY_NOM, CENT_COD, CENT_NOM FROM CENTROS C, PROYECTOS P
                WHERE P.PROY_COD = C.PROY_COD AND C.PROY_COD >= :PROYINI AND C.PROY_COD <= :PROYFIN AND CENT_COD >= :CENTINI AND CENT_COD <= :CENTFIN
            ORDER BY C.PROY_COD, C.CENT_COD INTO PROY, nom_centro,  CENTRO, NOM_SUBCENTRO
                DO
                BEGIN
                EXECUTE PROCEDURE SALDO_CENTRO_MES(CUENTA, PROY, CENTRO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
                EXECUTE PROCEDURE MOVIMIENTO_CENTRO_MES(CUENTA, PROY, CENTRO, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
                EXECUTE PROCEDURE MOVIMIENTO_CENTRO_MES(CUENTA, PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
                MOVIMIEN = DEBITOS - CREDITOS;
                FINAL = INICIAL + DEBITOS - CREDITOS;
                SCUENTA = 0;
                SCENTRO = FINAL;
                SALDO = FINAL;
                NOMCTACEN = NOM_CENTRO;
                SUSPEND;
                END
            END
        END
    END
END^


ALTER PROCEDURE BALANCE_CON_CENTROS_MES_N (
    ANO CHAR(4),
    MES INTEGER,
    PORCENTRO CHAR(1),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    PROYINI VARCHAR(4),
    PROYFIN VARCHAR(4),
    CENTINI VARCHAR(4),
    CENTFIN VARCHAR(4))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(140),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    NOM_CENTRO VARCHAR(60),
    NOM_SUBCENTRO 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),
    SCENTRO NUMERIC(18,2),
    MCLASE NUMERIC(18,2),
    MGRUPO NUMERIC(18,2),
    MSUBGRUPO NUMERIC(18,2),
    MCUENTA NUMERIC(18,2),
    MOVIMIEN NUMERIC(18,2),
    NOMCTACEN VARCHAR(120),
    NIVEL INTEGER)
AS
DECLARE VARIABLE OK CHAR(1);
declare variable CTACIERREU VARCHAR(20);
declare variable CTACIERREP VARCHAR(20);
declare variable ES_CENTRO CHAR(1);
declare variable SIMULA CHAR(2);
declare variable AUX NUMERIC(18,2);
declare variable CIERRE NUMERIC(18,2);
DECLARE VARIABLE DIG INTEGER;
BEGIN
if (PORCENTRO = 'S') then
    BEGIN
    execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'SIMULAR CIERRE EN BALANCES POR CENTRO DE COSTO') returning_values (:SIMULA);
    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);
    FOR SELECT P.PROY_COD, P.PROY_NOM, CENT_COD, CENT_NOM FROM CENTROS C, PROYECTOS P
        WHERE P.PROY_COD = C.PROY_COD AND C.PROY_COD >= :PROYINI AND C.PROY_COD <= :PROYFIN AND C.CENT_COD >= :CENTINI AND C.CENT_COD <= :CENTFIN
        ORDER BY C.PROY_COD, C.CENT_COD INTO PROY, nom_centro,  CENTRO, NOM_SUBCENTRO
        DO
        BEGIN
        if (simula = 'SI') then
            BEGIN
            /* CALCULE LA UTILIDAD DEL EJERCICIO */
            EXECUTE PROCEDURE saldo_centro_mes_niif('4', PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES (AUX);
            CIERRE = AUX;
            EXECUTE PROCEDURE saldo_centro_mes_niif('5', PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES (AUX);
            CIERRE = CIERRE + AUX;
            EXECUTE PROCEDURE saldo_centro_mes_niif('6', PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES (AUX);
            CIERRE = CIERRE + AUX;
            EXECUTE PROCEDURE saldo_centro_mes_niif('7', PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES (AUX);
            CIERRE = CIERRE + AUX;
            END
        FOR SELECT CUEN_COD, CUEN_NOM, CUEN_CENTRO FROM cuentas_niif
            WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN ORDER BY CUEN_COD
            INTO CUENTA, NOM_CUENTA, ES_CENTRO
            DO
            BEGIN
            SCLASE = 0;
            SGRUPO = 0;
            SSUBGRUPO = 0;
            SCUENTA = 0;
            SCENTRO = 0;
            MCLASE = 0;
            MGRUPO = 0;
            MSUBGRUPO = 0;
            MCUENTA = 0;
            EXECUTE PROCEDURE saldo_centro_mes_niif(CUENTA, PROY, CENTRO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
            EXECUTE PROCEDURE movimiento_centro_mes_niif(CUENTA, PROY, CENTRO, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
            EXECUTE PROCEDURE movimiento_centro_mes_niif(CUENTA, PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
            EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
            EXECUTE PROCEDURE DIGITOS_NIVEL (:NIVEL) RETURNING_VALUES (:DIG);
            MOVIMIEN = DEBITOS - CREDITOS;
            IF (SIMULA = 'SI') THEN
                if (CIERRE > 0) then
                BEGIN
                IF (CUENTA = SUBSTR(CTACIERREP, 1, DIG)) then
                    DEBITOS = DEBITOS + CIERRE;
                END
            else
                BEGIN
                IF (CUENTA = SUBSTR(CTACIERREU, 1, DIG)) then
                    CREDITOS = CREDITOS + (CIERRE * -1);
                END
            FINAL = INICIAL + DEBITOS - CREDITOS;
            SCENTRO = FINAL;
            EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
            if (NIVEL = 1) then
                BEGIN
                SCLASE = FINAL;
                MCLASE = MOVIMIEN;
                END
            if (NIVEL = 2) then
                BEGIN
                SGRUPO = FINAL;
                MGRUPO = MOVIMIEN;
                END
            if (NIVEL = 3) then
                BEGIN
                SSUBGRUPO = FINAL;
                MSUBGRUPO = MOVIMIEN;
                END
            if (NIVEL = 4) then
                BEGIN
                SCUENTA = FINAL;
                MCUENTA = MOVIMIEN;
                END
            NOMCTACEN = NOM_CUENTA;
            if (NIVEL < 5) then
                MOVIMIEN = 0;
            SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    FOR SELECT CUEN_COD, CUEN_NOM, CUEN_CENTRO FROM cuentas_niif
        WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN ORDER BY CUEN_COD
        INTO CUENTA, NOM_CUENTA, ES_CENTRO
        DO
        BEGIN
        SCLASE = 0;
        SGRUPO = 0;
        SSUBGRUPO = 0;
        SCUENTA = 0;
        SCENTRO = 0;
        MCLASE = 0;
        MGRUPO = 0;
        MSUBGRUPO = 0;
        MCUENTA = 0;
        EXECUTE PROCEDURE saldo_cuenta_mes_niif(CUENTA, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
        EXECUTE PROCEDURE movimiento_cuenta_mes_niif(CUENTA, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
        EXECUTE PROCEDURE movimiento_cuenta_mes_niif(CUENTA, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
        MOVIMIEN = DEBITOS - CREDITOS;
        FINAL = INICIAL + DEBITOS - CREDITOS;
        PROY = '';
        CENTRO = '';
        NOM_CENTRO = '';
        EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
        if (NIVEL = 1) then
            BEGIN
            SCLASE = FINAL;
            MCLASE = MOVIMIEN;
            END
        if (NIVEL = 2) then
            BEGIN
            SGRUPO = FINAL;
            MGRUPO = MOVIMIEN;
            END
        if (NIVEL = 3) then
            BEGIN
            SSUBGRUPO = FINAL;
            MSUBGRUPO = MOVIMIEN;
            END
        if (NIVEL = 4) then
            BEGIN
            SCUENTA = FINAL;
            MCUENTA = MOVIMIEN;
            END
        NOMCTACEN = NOM_CUENTA;
        if (NIVEL < 5) then
            MOVIMIEN = 0;
        SUSPEND;
        EXECUTE PROCEDURE es_afectable_niif(CUENTA) RETURNING_VALUES (OK);
        IF ((OK = 'S') AND (ES_CENTRO = 'S')) THEN
            BEGIN
            FOR SELECT P.PROY_COD, P.PROY_NOM, CENT_COD, CENT_NOM FROM CENTROS C, PROYECTOS P
                WHERE P.PROY_COD = C.PROY_COD AND C.PROY_COD >= :PROYINI AND C.PROY_COD <= :PROYFIN AND CENT_COD >= :CENTINI AND CENT_COD <= :CENTFIN
            ORDER BY C.PROY_COD, C.CENT_COD INTO PROY, nom_centro,  CENTRO, NOM_SUBCENTRO
                DO
                BEGIN
                EXECUTE PROCEDURE saldo_centro_mes_niif(CUENTA, PROY, CENTRO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
                EXECUTE PROCEDURE movimiento_centro_mes_niif(CUENTA, PROY, CENTRO, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
                EXECUTE PROCEDURE movimiento_centro_mes_niif(CUENTA, PROY, CENTRO, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
                MOVIMIEN = DEBITOS - CREDITOS;
                FINAL = INICIAL + DEBITOS - CREDITOS;
                SCUENTA = 0;
                SCENTRO = FINAL;
                NOMCTACEN = NOM_CENTRO;
                SUSPEND;
                END
            END
        END
    END
END^


ALTER PROCEDURE BALANCE_CON_TERCEROS_ACUM (
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN 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),
    DEBULT NUMERIC(18,2),
    CREULT NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    FINULT NUMERIC(18,2),
    NOMCTATER VARCHAR(120),
    NIVEL INTEGER)
AS
DECLARE VARIABLE OK CHAR(1);
declare variable CUENAUX VARCHAR(20);
declare variable SALDOTERI NUMERIC(18,2);
declare variable SALDOTERF NUMERIC(18,2);
declare variable TOTALTERI NUMERIC(18,2);
declare variable TOTALTERF 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
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CUENTA, ANO, MESINI, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE movimientos_cuenta_desde_hasta(CUENTA, ANO, MESINI, MESFIN) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  EXECUTE PROCEDURE movimientos_cuenta_mes(CUENTA, ANO, MESFIN+1) RETURNING_VALUES(DEBULT, CREULT);
  FINULT = FINAL + DEBULT - CREULT;
  NIT = '';
  NOM_TERCERO = '';
  NOMCTATER = nom_cuenta;
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
  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);
        totalteri = 0;
        totalterf = 0;
        FOR SELECT DISTINCT TERC_NIT, CUEN_COD FROM saldos_terceros
            WHERE SUBSTRING(CUEN_COD FROM 1 FOR :LARGO) = :CUENTA
                AND TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN
            INTO :NIT, :CUENAUX
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENAUX, NIT, ANO, MESINI, 'S') RETURNING_VALUES (saldoteri);
            if (SALDOTERI <> 0) then
                TOTALTERI = SALDOTERI;
            EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENAUX, NIT, ANO, MESFIN, 'N') RETURNING_VALUES (saldoterf);
            if (SALDOTERF <> 0) then
                TOTALTERF = SALDOTERF;
            END
        if ((TOTALTERI <> 0) or (TOTALTERF <> 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, MESINI, 'S') RETURNING_VALUES (INICIAL);
        EXECUTE PROCEDURE movimientos_tercero_desde_hasta(CUENTA, NIT, ANO, MESINI, MESFIN) RETURNING_VALUES(DEBITOS, CREDITOS);
        FINAL = INICIAL + DEBITOS - CREDITOS;
        EXECUTE PROCEDURE movimientos_tercero_mes(CUENTA, NIT, ANO, MESFIN+1) RETURNING_VALUES(DEBULT, CREULT);
        FINULT = FINAL + DEBULT - CREULT;
        NOM_CUENTA = '';
        NOMCTATER = NOM_TERCERO;
        if ((final <> 0) or (inicial <> 0) or (debitos <> 0) or (creditos <> 0) or (debult <> 0) or (creult <> 0)) then
          SUSPEND;
        END
      END
  END
END^


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 MOVIMIENTOS_CUENTA_MES(CUENTA, ANO, MES) RETURNING_VALUES(DEBITOS, 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
                AND TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN
            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 MOVIMIENTOS_TERCERO_MES(CUENTA, NIT, ANO, MES) RETURNING_VALUES(DEBITOS, 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^


ALTER PROCEDURE BALANCE_CON_TERCEROS_MES_N (
    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(140),
    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_niif
    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_niif(CUENTA, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE movimientos_cuenta_mes_niif(CUENTA, ANO, MES) RETURNING_VALUES(DEBITOS, 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_niif
            WHERE SUBSTRING(CUEN_COD FROM 1 FOR :LARGO) = :CUENTA
                AND TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN
            INTO :NIT, :CUENAUX
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_tercero_mes_niif(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_niif(CUENTA) RETURNING_VALUES (OK);
  IF ((OK = 'S') AND (ES_TERC = 'S')) THEN
      BEGIN
      FOR SELECT distinct TERC_NIT FROM saldos_terceros_niif
        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_niif(CUENTA, NIT, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
        EXECUTE PROCEDURE movimientos_tercero_mes_niif(CUENTA, NIT, ANO, MES) RETURNING_VALUES(DEBITOS, 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^


ALTER PROCEDURE BALANCE_FINAL (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    SALDO NUMERIC(18,2),
    SCLASE NUMERIC(18,2),
    SGRUPO NUMERIC(18,2),
    SSUBGRUPO NUMERIC(18,2),
    SCUENTA NUMERIC(18,2),
    NIVEL INTEGER,
    AFECTA CHAR(1),
    CUENTANIIF VARCHAR(20))
AS
DECLARE VARIABLE ACTIVA CHAR(1);
declare variable DIG INTEGER;
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_ACTIVA, CUEN_EQNIIF, CUEN_AFECTABLE FROM CUENTAS order by CUEN_COD INTO CODIGO, NOMBRE, ACTIVA, CUENTANIIF, AFECTA
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, MES, 'S') RETURNING_VALUES (SALDO);
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  EXECUTE PROCEDURE DIGITOS_NIVEL (:NIVEL) RETURNING_VALUES (:DIG);
  SCLASE = 0;
  SGRUPO = 0;
  SSUBGRUPO = 0;
  SCUENTA = 0;
  if (NIVEL = 1) then
    BEGIN
    SCLASE = SALDO;
    END
  if (NIVEL = 2) then
    BEGIN
    SGRUPO = SALDO;
    END
  if (NIVEL = 3) then
    BEGIN
    SSUBGRUPO = SALDO;
    END
  if (NIVEL > 3) then
    BEGIN
    SCUENTA = SALDO;
    END
  if (((SIN_MOV = 'S') AND (ACTIVA = 'S')) or (SALDO <> 0))then
      begin
      SUSPEND;
      end
  END
END^


ALTER PROCEDURE BALANCE_FINAL_DET (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    SALDO NUMERIC(18,2),
    CUENTANIIF VARCHAR(20))
AS
BEGIN
FOR SELECT CUEN_COD, CUEN_EQNIIF FROM CUENTAS WHERE CUEN_ACTIVA = 'S' AND CUEN_AFECTABLE = 'S' order by CUEN_COD
    INTO CODIGO, CUENTANIIF
DO
  BEGIN
  FOR SELECT PROY_COD, CENT_COD FROM centros c where exists (select sacu_fecha from saldos_centros
        where cuen_cod = :codigo and proy_cod = c.proy_cod and cent_cod = c.cent_cod)
    INTO :proy, :centro
    DO
    BEGIN
    FOR SELECT CODIGO, FINAL FROM balance_centro_tercero_mes(:CODIGO, :proy,  :centro, :ano, :mes)
        INTO :NIT, :SALDO
        DO
        BEGIN
        if ((SIN_MOV = 'S') or (SALDO <> 0))  then
            SUSPEND;
        END
    END
  END
END^


ALTER PROCEDURE BALANCE_INICIAL
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(60),
    NIT VARCHAR(20),
    DV CHAR(1),
    PROY VARCHAR(4),
    NOM_TERCERO VARCHAR(60),
    CENTRO VARCHAR(4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
DECLARE VARIABLE OK CHAR(1);
declare variable ANO CHAR(4);
declare variable MES INTEGER;
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS
    order by CUEN_COD INTO CUENTA, NOM_CUENTA
DO
  BEGIN
  CREDITO = 0;
  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 SALDO_CUENTA_MES(CUENTA, ANO, MES, 'S') RETURNING_VALUES (DEBITO);
  if (DEBITO < 0) then
    BEGIN
    CREDITO = ABS(DEBITO);
    DEBITO = 0;
    END
  NIT = '';
  NOM_TERCERO = '';
  SUSPEND;
  EXECUTE PROCEDURE ES_AFECTABLE(CUENTA) RETURNING_VALUES (OK);
  IF (OK = 'S') THEN
    BEGIN
    FOR SELECT TERC_NIT, PROY_COD, CENT_COD, SAIN_DEBITO, SAIN_CREDITO
        FROM SALDOS_INICIALES WHERE CUEN_COD = :CUENTA
        ORDER BY TERC_NIT 
        INTO :NIT, :PROY, :CENTRO, :DEBITO, :CREDITO
        do
        BEGIN
        SELECT TERC_NOM, TERC_DV FROM TERCEROS
            WHERE TERC_NIT = :NIT INTO NOM_TERCERO, :DV;
        SUSPEND;
        END
    END
  END
END^


ALTER PROCEDURE BALANCE_INICIAL_DET (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    SALDO NUMERIC(18,2),
    CUENTANIIF VARCHAR(20))
AS
BEGIN
FOR SELECT CUEN_COD, CUEN_EQNIIF FROM CUENTAS WHERE CUEN_ACTIVA = 'S' AND CUEN_AFECTABLE = 'S' order by CUEN_COD
    INTO CODIGO, CUENTANIIF
DO
  BEGIN
  FOR SELECT PROY_COD, CENT_COD FROM centros INTO :proy, :centro
    DO
    BEGIN
    FOR SELECT CODIGO, INICIAL FROM balance_centro_tercero_mes(:CODIGO, :proy,  :centro, :ano, :mes)
        INTO :NIT, :SALDO
        DO
        BEGIN
        if ((SIN_MOV = 'S') or (SALDO <> 0))  then
            SUSPEND;
        END
    END
  END
END^


ALTER PROCEDURE BALANCE_INICIAL_NIIF
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(140),
    NIT VARCHAR(20),
    DV CHAR(1),
    PROY VARCHAR(4),
    NOM_TERCERO VARCHAR(60),
    CENTRO VARCHAR(4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
DECLARE VARIABLE OK CHAR(1);
declare variable ANO CHAR(4);
declare variable MES INTEGER;
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM cuentas_niif
    order by CUEN_COD INTO CUENTA, NOM_CUENTA
DO
  BEGIN
  CREDITO = 0;
  EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'AÃ‘O BALANCE DE APERTURA NIIF') returning_values (ANO);
  MES = 1;
  EXECUTE PROCEDURE saldo_cuenta_mes_niif(CUENTA, ANO, MES, 'S') RETURNING_VALUES (DEBITO);
  if (DEBITO < 0) then
    BEGIN
    CREDITO = ABS(DEBITO);
    DEBITO = 0;
    END
  NIT = '';
  NOM_TERCERO = '';
  SUSPEND;
  EXECUTE PROCEDURE es_afectable_niif(CUENTA) RETURNING_VALUES (OK);
  IF (OK = 'S') THEN
    BEGIN
    FOR SELECT MAX(TERC_NIT), MAX(PROY_COD), MAX(CENT_COD), SUM(APND_DEBITO+APND_RECLDB), SUM(APND_CREDITO+APND_RECLCR)
        FROM APERTURA_NIIF_DET WHERE APND_CTANIIF = :CUENTA
        GROUP BY TERC_NIT, PROY_COD, CENT_COD
        INTO :NIT, :PROY, :CENTRO, :DEBITO, :CREDITO
        do
        BEGIN
        SELECT TERC_NOM, TERC_DV FROM TERCEROS
            WHERE TERC_NIT = :NIT INTO NOM_TERCERO, :DV;
        SUSPEND;
        END
    END
  END
END^


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

  IF (SIMULACIERRE = 'S') THEN
    if (CIERRE > 0) then
      BEGIN
      IF (CODIGO = SUBSTR(CTACIERREP, 1, DIG)) then
        DEBITOS = DEBITOS + CIERRE;
      END
    else
      BEGIN
      IF (CODIGO = SUBSTR(CTACIERREU, 1, DIG)) then
        CREDITOS = CREDITOS + (CIERRE * -1);
      END
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SCLASE = 0;
  SGRUPO = 0;
  SSUBGRUPO = 0;
  SCUENTA = 0;
  MCLASE = 0;
  MGRUPO = 0;
  MSUBGRUPO = 0;
  MCUENTA = 0;
--  MOVIMIEN = 0;
  MOVIMIEN = DEBITOS - CREDITOS;
  if (NIVEL = 1) then
    BEGIN
    SCLASE = FINAL;
    MCLASE = MOVIMIEN;
    END
  if (NIVEL = 2) then
    BEGIN
    SGRUPO = FINAL;
    MGRUPO = MOVIMIEN;
    END
  if (NIVEL = 3) then
    BEGIN
    SSUBGRUPO = FINAL;
    MSUBGRUPO = MOVIMIEN;
    END
  if (NIVEL > 3) then
    BEGIN
    SCUENTA = FINAL;
    MCUENTA = MOVIMIEN;
    END

  if ((SIN_MOV = 'N') AND (FINAL = 0) AND (DEBITOS = 0) AND (CREDITOS = 0)) then
    BEGIN
    IMPRIMA = 'N';
    /* VALIDE SI HAY SALDOS DE CUENTAS HIJAS */
    if (AFECTA = 'N') then
        BEGIN
        FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD > :CODIGO AND CUEN_COD <= :CODIGO || '999999' AND CUEN_AFECTABLE = 'S'
            INTO :CTAAUX
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_CUENTA_MES(CTAAUX, ANO, MES, 'S') RETURNING_VALUES (AUX);
            if (AUX <> 0) then
                IMPRIMA = 'S';
            END
        END
    END
  else
    IMPRIMA = 'S';
  if (IMPRIMA = 'S') then
      begin
      NETO = DEBITOS - CREDITOS;
      if (NOTAS = 'S') then
          BEGIN
          /* busque notas a los estados si las hay */
          NRONOTA = 0;
          SELECT NOEF_NUMERO FROM notas_estados_financieros WHERE NOEF_ANO = :ANO AND NOEF_PERIODO = :MES AND NOEF_CUENTA = :codigo INTO :NRONOTA;
          if (NRONOTA <> 0) then
            NOMBRE = NOMBRE || ' (Nota ' || :nronota || ')';
          SUSPEND;
          end
      ELSE
          SUSPEND;
      end
  END
END^


ALTER PROCEDURE BALANCE_MES_DINAMIC (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV 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,
    CATEGORIA VARCHAR(10),
    FLUJO VARCHAR(20),
    MOVIMIEN NUMERIC(18,2))
AS
DECLARE VARIABLE DIG INTEGER;
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD < '4' order by CUEN_COD INTO CODIGO, NOMBRE
DO
  BEGIN
  if (CODIGO >= '1' AND CODIGO < '15') then
       FLUJO = 'ACTIVO CORRIENTE';
  ELSE
    if (CODIGO >= '15' AND CODIGO < '2') then
        FLUJO = 'ACTIVO NO CORRIENTE';
    ELSE
        if (CODIGO >= '2' AND CODIGO < '26') then
            FLUJO = 'PASIVO CORRIENTE';
         ELSE
            if (CODIGO >= '26' AND CODIGO < '3') then
               FLUJO = 'PASIVO NO CORRIENTE';
  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);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SCLASE = 0;
  SGRUPO = 0;
  SSUBGRUPO = 0;
  SCUENTA = 0;
  MOVIMIEN = 0;
  if (NIVEL = 1) then
    BEGIN
    SCLASE = FINAL;
    MOVIMIEN = DEBITOS - CREDITOS;
    CATEGORIA = 'CLASE';
    END
  if (NIVEL = 2) then
    BEGIN
    SGRUPO = FINAL;
    CATEGORIA = 'GRUPO';
    END
  if (NIVEL = 3) then
    BEGIN
    SSUBGRUPO = FINAL;
    categoria = 'SUBGRUPO';
    END
  if (NIVEL > 3) then
    SCUENTA = FINAL;
  if (NIVEL = 4) then
    categoria = 'CUENTA';
  if (NIVEL >= 5) then
    categoria = 'AUXILIAR';

  if ((SIN_MOV = 'S') or (FINAL <> 0) or (DEBITOS <> 0) or (CREDITOS <> 0))then
      SUSPEND;
  END
END^


ALTER PROCEDURE BALANCE_MES_NIIF (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1),
    SIMULACIERRE CHAR(1),
    NOTAS CHAR(1),
    SOLOMES CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(140),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    SCLASE NUMERIC(18,2),
    SGRUPO NUMERIC(18,2),
    SSUBGRUPO NUMERIC(18,2),
    SCUENTA NUMERIC(18,2),
    MCLASE NUMERIC(18,2),
    MGRUPO NUMERIC(18,2),
    MSUBGRUPO NUMERIC(18,2),
    MCUENTA NUMERIC(18,2),
    NIVEL INTEGER,
    MOVIMIEN NUMERIC(18,2),
    NETO NUMERIC(18,2),
    UOP CHAR(1))
AS
declare variable CTACIERREU VARCHAR(20);
declare variable CTACIERREP VARCHAR(20);
declare variable CIERRE NUMERIC(18,2);
declare variable AUX NUMERIC(18,2);
declare variable NRONOTA INTEGER;
DECLARE VARIABLE DIG INTEGER;
declare variable AFECTA CHAR(1);
declare variable IMPRIMA CHAR(1);
declare variable CTAAUX VARCHAR(20);
BEGIN
/* CALCULE LA UTILIDAD DEL EJERCICIO */
if (SOLOMES = 'S') then
    BEGIN
    /* CALCULE LA UTILIDAD DEL EJERCICIO */
    EXECUTE PROCEDURE movimientos_cuenta_mes_niif('4', ANO, MES) RETURNING_VALUES (DEBITOS, CREDITOS);
    CIERRE = DEBITOS-CREDITOS;
    EXECUTE PROCEDURE movimientos_cuenta_mes_niif('5', ANO, MES) RETURNING_VALUES (DEBITOS, CREDITOS);
    CIERRE = CIERRE + (DEBITOS-CREDITOS);
    EXECUTE PROCEDURE movimientos_cuenta_mes_niif('6', ANO, MES) RETURNING_VALUES (DEBITOS, CREDITOS);
    CIERRE = CIERRE + (DEBITOS-CREDITOS);
    EXECUTE PROCEDURE movimientos_cuenta_mes_niif('7', ANO, MES) RETURNING_VALUES (DEBITOS, CREDITOS);
    CIERRE = CIERRE + (DEBITOS-CREDITOS);
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta_mes_niif('4', ANO, MES, 'N') RETURNING_VALUES (AUX);
    CIERRE = AUX;
    EXECUTE PROCEDURE saldo_cuenta_mes_niif('5', ANO, MES, 'N') RETURNING_VALUES (AUX);
    CIERRE = CIERRE + AUX;
    EXECUTE PROCEDURE saldo_cuenta_mes_niif('6', ANO, MES, 'N') RETURNING_VALUES (AUX);
    CIERRE = CIERRE + AUX;
    EXECUTE PROCEDURE saldo_cuenta_mes_niif('7', ANO, MES, 'N') RETURNING_VALUES (AUX);
    CIERRE = CIERRE + AUX;
    END
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 NIIF') returning_values (:CTACIERREU);
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'CUENTA DE PERDIDA DEL EJERCICIO NIIF') returning_values (:CTACIERREP);
    END
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_AFECTABLE FROM cuentas_niif order by CUEN_COD INTO CODIGO, NOMBRE, AFECTA
DO
  BEGIN
  EXECUTE PROCEDURE saldo_cuenta_mes_niif(CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE movimiento_cuenta_mes_niif(CODIGO, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
  EXECUTE PROCEDURE movimiento_cuenta_mes_niif(CODIGO, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  EXECUTE PROCEDURE DIGITOS_NIVEL (:NIVEL) RETURNING_VALUES (:DIG);

  IF (SIMULACIERRE = 'S') THEN
    if (CIERRE > 0) then
      BEGIN
      IF (CODIGO = SUBSTR(CTACIERREP, 1, DIG)) then
        DEBITOS = DEBITOS + CIERRE;
      END
    else
      BEGIN
      IF (CODIGO = SUBSTR(CTACIERREU, 1, DIG)) then
        CREDITOS = CREDITOS + (CIERRE * -1);
      END
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SCLASE = 0;
  SGRUPO = 0;
  SSUBGRUPO = 0;
  SCUENTA = 0;
  MCLASE = 0;
  MGRUPO = 0;
  MSUBGRUPO = 0;
  MCUENTA = 0;
--  MOVIMIEN = 0;
  MOVIMIEN = DEBITOS - CREDITOS;
  if (NIVEL = 1) then
    BEGIN
    SCLASE = FINAL;
    MCLASE = MOVIMIEN;
    END
  if (NIVEL = 2) then
    BEGIN
    SGRUPO = FINAL;
    MGRUPO = MOVIMIEN;
    END
  if (NIVEL = 3) then
    BEGIN
    SSUBGRUPO = FINAL;
    MSUBGRUPO = MOVIMIEN;
    END
  if (NIVEL > 3) then
    BEGIN
    SCUENTA = FINAL;
    MCUENTA = MOVIMIEN;
    END

  if ((SIN_MOV = 'N') AND (FINAL = 0) AND (DEBITOS = 0) AND (CREDITOS = 0)) then
    BEGIN
    IMPRIMA = 'N';
    /* VALIDE SI HAY SALDOS DE CUENTAS HIJAS */
    if (AFECTA = 'N') then
        BEGIN
        FOR SELECT CUEN_COD FROM cuentas_niif WHERE CUEN_COD > :CODIGO AND CUEN_COD <= :CODIGO || '999999' AND CUEN_AFECTABLE = 'S'
            INTO :CTAAUX
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_cuenta_mes_niif(CTAAUX, ANO, MES, 'S') RETURNING_VALUES (AUX);
            if (AUX <> 0) then
                IMPRIMA = 'S';
            END
        END
    END
  else
    IMPRIMA = 'S';
  if (IMPRIMA = 'S') then
      begin
      NETO = DEBITOS - CREDITOS;
      if (NOTAS = 'S') then
          BEGIN
          /* busque notas a los estados si las hay */
          NRONOTA = 0;
          SELECT NOEF_NUMERO FROM notas_estados_financieros WHERE NOEF_ANO = :ANO AND NOEF_PERIODO = :MES AND NOEF_CUENTA = :codigo INTO :NRONOTA;
          if (NRONOTA <> 0) then
            NOMBRE = NOMBRE || ' (Nota ' || :nronota || ')';
          SUSPEND;
          end
      ELSE
          SUSPEND;
      end
  END
END^


ALTER PROCEDURE BALANCE_PRUEBA_ACUMULADO (
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER,
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    SIN_MOV CHAR(1),
    TERCEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    AFECTABLE CHAR(1),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    NOMCTATER VARCHAR(120),
    NIVEL INTEGER)
AS
declare variable ANOCIA CHAR(4);
declare variable MESCIA INTEGER;
declare variable FECINI CHAR(8);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÃ‘O DE INICIO') RETURNING_VALUES (ANOCIA);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MESCIA);
if (ANOCIA = ANO) then
    if (MESCIA > MESINI) then
        MESINI = MESCIA;
EXECUTE PROCEDURE compone_fecha_conta (:ANO, :MESINI, 1) returning_values (FECINI);
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_AFECTABLE FROM CUENTAS WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN order by CUEN_COD
    INTO CODIGO, NOMBRE, AFECTABLE
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, MESINI, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE MOVIMIENTOS_CUENTA_DESDE_HASTA(CODIGO, ANO, MESINI, MESFIN) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  if ((TERCEROS = 'N') or (AFECTABLE = 'N')) then
    BEGIN
    NOMCTATER = :NOMBRE;
    if ((SIN_MOV = 'S') OR (FINAL <> 0) OR (DEBITOS <> 0) OR (CREDITOS <> 0)) then
      SUSPEND;
    END
  ELSE
    BEGIN
    FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS T WHERE TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN
        AND EXISTS (SELECT SACU_FECHA FROM saldos_terceros
        WHERE CUEN_COD = :CODIGO AND TERC_NIT = T.terc_nit AND substring(sacu_fecha from 1 for 4) = :ano and
        substring(sacu_fecha from 5 for 2) >= :mesini and substring(sacu_fecha from 5 for 2) <= :mesfin)
        into NIT, :NOMTERC
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_tercero(:CODIGO, :nit, :FECINI) returning_values (INICIAL);
        SELECT SUM(CODE_DEBITO), SUM(CODE_CREDITO) FROM comprobante_encabezado E, COMPROBANTE_DETALLE D
            WHERE E.enco_consec = D.enco_consec AND D.TERC_NIT = :nit and substring(e.enco_fecha from 1 for 4) = :ano
            and substring(e.enco_fecha from 5 for 2) >= :mesini and substring(e.enco_fecha from 5 for 2) <= :mesfin
            INTO :debitos, :creditos;
        NOMCTATER = :NOMTERC;
        FINAL = INICIAL + DEBITOS - CREDITOS;
        if ((SIN_MOV = 'S') OR (FINAL <> 0) OR (DEBITOS <> 0) OR (CREDITOS <> 0)) then
            SUSPEND;
        END
    END
  END
END^


ALTER PROCEDURE BALANCE_PRUEBA_ACUMULADO_NIIF (
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER,
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    SIN_MOV CHAR(1),
    TERCEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(140),
    AFECTABLE CHAR(1),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    NOMCTATER VARCHAR(120),
    NIVEL INTEGER)
AS
declare variable ANOCIA char(4);
declare variable MESCIA integer;
declare variable FECINI char(8);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÃ‘O DE INICIO') RETURNING_VALUES (ANOCIA);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MESCIA);
if (ANOCIA = ANO) then
    if (MESCIA > MESINI) then
        MESINI = MESCIA;
EXECUTE PROCEDURE compone_fecha_conta (:ANO, :MESINI, 1) returning_values (FECINI);
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_AFECTABLE FROM CUENTAS_NIIF WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN order by CUEN_COD
    INTO CODIGO, NOMBRE, AFECTABLE
DO
  BEGIN
  EXECUTE PROCEDURE saldo_cuenta_mes_niif(CODIGO, ANO, MESINI, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE movimientos_cuenta_de_hasta_n(CODIGO, ANO, MESINI, MESFIN) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  if ((TERCEROS = 'N') or (AFECTABLE = 'N')) then
    BEGIN
    NOMCTATER = :NOMBRE;
    if ((SIN_MOV = 'S') OR (FINAL <> 0) OR (DEBITOS <> 0) OR (CREDITOS <> 0)) then
      SUSPEND;
    END
  ELSE
    BEGIN
    FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS T WHERE TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN
        AND EXISTS (SELECT SACU_FECHA FROM saldos_terceros_niif
        WHERE CUEN_COD = :CODIGO AND TERC_NIT = T.terc_nit AND substring(sacu_fecha from 1 for 4) = :ano and
        substring(sacu_fecha from 5 for 2) >= :mesini and substring(sacu_fecha from 5 for 2) <= :mesfin)
        into NIT, :NOMTERC
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_tercero_niif(:CODIGO, :nit, :FECINI) returning_values (INICIAL);
        SELECT SUM(CODE_DEBITO), SUM(CODE_CREDITO) FROM comprobante_encabezado E, COMPROBANTE_DETALLE_NIIF D
            WHERE E.enco_consec = D.enco_consec AND D.TERC_NIT = :nit and substring(e.enco_fecha from 1 for 4) = :ano
            and substring(e.enco_fecha from 5 for 2) >= :mesini and substring(e.enco_fecha from 5 for 2) <= :mesfin
            INTO :debitos, :creditos;
        NOMCTATER = :NOMTERC;
        FINAL = INICIAL + DEBITOS - CREDITOS;
        if ((SIN_MOV = 'S') OR (FINAL <> 0) OR (DEBITOS <> 0) OR (CREDITOS <> 0)) then
            SUSPEND;
        END
    END
  END
END^


ALTER PROCEDURE BALANCE_TERCERO_ANO (
    CUENTA VARCHAR(20),
    ANO CHAR(4))
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE 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))
AS
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MES INTEGER;
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
BEGIN
EXECUTE procedure compone_fecha_conta(ano, 1, 1) returning_values (FECINI);
EXECUTE procedure fin_de_mes(ano, 13) returning_values (:FECFIN);
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS
    WHERE CUEN_COD = :CUENTA AND sacu_fecha >= :fecini and sacu_fecha <= :fecfin AND SATE_DEBITO <> SATE_CREDITO
    INTO CODIGO
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;
  MES = 1;
  EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  WHILE (MES < 14) DO
      BEGIN
      EXECUTE PROCEDURE MOVIMIENTOS_TERCERO_MES(CUENTA, CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);
      if (MES = 1) then
        MVENE = (DEBITOS - CREDITOS);
      if (MES = 2) then
        MVFEB = (DEBITOS - CREDITOS);
      if (MES = 3) then
        MVMAR = (DEBITOS - CREDITOS);
      if (MES = 4) then
        MVABR = (DEBITOS - CREDITOS);
      if (MES = 5) then
        MVMAY = (DEBITOS - CREDITOS);
      if (MES = 6) then
        MVJUN = (DEBITOS - CREDITOS);
      if (MES = 7) then
        MVJUL = (DEBITOS - CREDITOS);
      if (MES = 8) then
        MVAGO = (DEBITOS - CREDITOS);
      if (MES = 9) then
        MVSEP = (DEBITOS - CREDITOS);
      if (MES = 10) then
        MVOCT = (DEBITOS - CREDITOS);
      if (MES = 11) then
        MVNOV = (DEBITOS - CREDITOS);
      if (MES = 12) then
        MVDIC = (DEBITOS - CREDITOS);
      if (MES = 13) then
        MVCIE = (DEBITOS - CREDITOS);
      MES = MES + 1;
      END
  FINAL = INICIAL + MVENE + MVFEB + MVMAR + MVABR + MVMAY + MVJUN + MVJUL + MVAGO + MVSEP + MVOCT + MVNOV + MVDIC + MVCIE;
  if ((INICIAL <> 0) or (MVENE <> 0) or (MVFEB <> 0) or (MVMAR <> 0) or (MVABR <> 0) or (MVMAY <> 0) or (MVJUN <> 0)
    or (MVJUL <> 0) or (MVAGO <> 0) or (MVSEP <> 0) or (MVOCT <> 0) or (MVNOV <> 0) or (MVDIC <> 0) or (MVCIE <> 0)) then
    BEGIN
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :CODIGO INTO :nombre;
    SUSPEND;
    END
  END
END^


ALTER PROCEDURE BALANCE_TERCERO_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS INTO CODIGO, NOMBRE
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE MOVIMIENTOS_TERCERO_MES(CUENTA, CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SUSPEND;
  END
END^


ALTER PROCEDURE BALANCE_TERCERO_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2))
AS
BEGIN
FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS INTO CODIGO, NOMBRE
DO
  BEGIN
  EXECUTE PROCEDURE saldo_tercero_mes_niif(CUENTA, CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE movimientos_tercero_mes_niif(CUENTA, CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SUSPEND;
  END
END^


ALTER PROCEDURE BASE_APORTES (
    IDNOMINA INTEGER)
AS
declare variable FEC date;
declare variable PERIODO integer;
declare variable PERIODICIDAD integer;
declare variable ANO char(4);
declare variable FECHA date;
declare variable NITE varchar(20);
declare variable PORCEN numeric(9,4);
declare variable CONC_COD integer;
declare variable VALOR numeric(18,2);
declare variable DIASLAB integer;
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable CONC_DIAS char(1);
declare variable LIQUIDAPER integer;
declare variable SUMAVRPROM numeric(18,2);
declare variable CAMBSALTRANS numeric(18,2);
declare variable DURANOV integer;
declare variable APROX integer;
declare variable MENSUAL char(1);
declare variable HORASEX numeric(18,2);
declare variable AUXTRANO numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
declare variable PARAMBENEF char(2);
declare variable BASICOEMP numeric(18,2);
declare variable SALINTEG char(1);
declare variable TAR_SALINTEG numeric(9,4);
declare variable DIFAPORTMIN varchar(20);
declare variable PORCENTR numeric(9,4);
declare variable FECING date;
declare variable BASEFSP integer;
declare variable FACSAL numeric(18,2);
declare variable MAXFS numeric(18,2);
declare variable BASERT numeric(18,2);
declare variable MINAPEPS integer;
declare variable BASEAPINC varchar(12);
declare variable ALTORIESGO char(1);
declare variable TOTPAGOS numeric(18,2);
declare variable TOTBENEF numeric(18,2);
declare variable SUBTIPOC INTEGER;
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'RESPONSABLE DE LA DIFERENCIA SOBRE EL APORTE MINIMO A SEGURIDAD SOCIAL') returning_values(:difaportmin);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'INGRESO BASE EXENTO DE PAGO DE APORTES POR SALUD EXPRESADO EN SMMLV') returning_values(:minapeps);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'PAGAR APORTES EN INCAPACIDAD SOBRE EL VALOR DE LA INCAPACIDAD O EL SUELDO HABITUAL') returning_values(:baseapinc);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.nomi_feccausa, N.nomi_periodocidad, N.nomi_periodo, N.nomi_ano from NOMINA N
    where N.nomi_id = :IDNOMINA into :fec, :periodicidad, :periodo, :ano;
execute procedure fecha_final_periodo_pago (:periodicidad, :ano, :periodo) returning_values (:FECHA);
select P.paan_salinteg, P.PAAN_SALMINIMO, P.PAAN_AUXTR, p.paan_maxfs from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
    into :TAR_SALINTEG, SMLV, :auxtrano, :MAXFS;
for select E.TERC_NIT, E.empl_salinteg, E.empl_fecing,
    E.empl_facsal, E.empl_altoriesgo, e.stco_cod
    from EMPLEADOS E
    where exists (select ND.NOMI_ID from nomina_detalle ND where ND.nomi_id = :idnomina and ND.terc_nit = E.terc_nit)
    into :NITE, :SALINTEG, :fecing, :facsal, :altoriesgo, :subtipoc
    do
    begin
    if ((FACSAL IS NULL) or (FACSAL = 0))  then
        FACSAL = 100;
    if (FACSAL < MAXFS) then
        FACSAL = MAXFS;
    for select nc.conc_cod, CE.EMCO_MENSUAL, CN.CONC_DIAS, CE.EMCO_LUQUIDAPER
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN, EMPLEADO_CONCEPTOS CE
        WHERE NC.nomi_id = :idnomina AND NC.conc_cod = CN.conc_cod AND CN.conc_aporte = 'S' and ce.conc_cod = cn.conc_cod
        and ce.terc_nit = :nite and nc.terc_nit = :nite
        into :conc_cod, :mensual, :conc_dias, :liquidaper
        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, :FECHA, :MENSUAL,:CONC_COD) returning_values (:DIASLAB);
        else
            begin
            select PPAG_DIAS from PERIODO_PAGO where PPAG_COD = :periodicidad into :diaslab;
            if (mensual = 'S') then
                diaslab = 30;
            end

        execute procedure ibc_empleado (:NITE, :ANO, :periodo, :conc_cod) returning_values (:BASICOEMP);
        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;
        HORASEX = null;
        BENEFICIOS = 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
        BASERT = 0;
            begin
            /* si no se ha pagado, calculelo */
                BEGIN
                if (BASEAPINC = 'SUELDO') then
                    BEGIN
                    VALOR = ((:basicoemp/30)*:DIASLAB) + :CAMBSALTRANS;
                    /* FACTOR SALARIAL, EXCEPTO VACACIONES */
                    if ((CONC_COD <> 929) AND (CONC_COD <> 930) AND (CONC_COD <> 944)) then
                        VALOR = VALOR * :facsal / 100;
                    /* DEMAS CONCEPTOS PAGADOS EXCEPTO SALARIO E INCAPACIDADES QUE LOS CUBRE EL BASICO */
                    select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                        where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
                        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_baseap = 'S'
                        AND (C.CONC_COD <> 901) AND (C.CONC_COD <> 902) AND (C.CONC_COD <> 903) AND (C.CONC_COD <> 949)
                        AND (C.CONC_COD <> 1011) AND (C.CONC_COD <> 1025) AND (C.CONC_COD <> 1026) AND (C.CONC_COD <> 1033)
                        AND (C.CONC_COD <> 1034) AND (C.CONC_COD <> 1035) AND (C.CONC_COD <> 1036) AND (C.CONC_COD <> 1037)
                        AND (C.CONC_COD <> 971) AND (C.CONC_COD <> 972) AND (C.CONC_COD <> 973)
                        AND (C.CONC_COD <> 974) AND (C.CONC_COD <> 980) AND (C.CONC_COD <> 981)
                        AND (C.CONC_COD <> 932) AND (C.CONC_COD <> 975) AND (C.CONC_COD <> 978)
                        AND (C.CONC_COD <> 997) AND (C.CONC_COD <> 998) AND (C.CONC_COD <> 999)
                        AND (C.CONC_COD <> 1000) AND (C.CONC_COD <> 1001) AND (C.CONC_COD <> 1002)
                        AND (C.CONC_COD <> 1003) AND (C.CONC_COD <> 1004) AND (C.CONC_COD <> 1005)
                        AND (C.CONC_COD <> 1006) AND (C.CONC_COD <> 1007) AND (C.CONC_COD <> 1008)
                        and (C.CONC_COD <> 970) and (C.CONC_COD <> 1009) and (C.CONC_COD <> 1010)
                        AND NC.TERC_NIT = :NITE into :sumavrprom;
                    if (sumavrprom is null) then
                        sumavrprom = 0;
                    VALOR = VALOR + sumavrprom;
                    END
                ELSE
                    BEGIN
                    select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                        where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
                        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_baseap = 'S'
                        AND NC.TERC_NIT = :NITE into :sumavrprom;
                    if (sumavrprom is null) then
                        VALOR = 0;
                    else
                        VALOR = sumavrprom;
/*                      no hay factor ya que se supone que solo se marcan los conceptos que aplican para aportes
                    if ((CONC_COD <> 929) AND (CONC_COD <> 930) AND (CONC_COD <> 944) AND (CONC_COD <> 1021)) then
                        VALOR = VALOR * :facsal / 100;*/
                    END
                /* TOTAL PAGOS Y TOTAL BENEFICIOS PARA CALCULAR 40% SI SE PASAN */
                select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                    where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
                    N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_aporte = 'N' and C.conc_prov = 'N' and C.conc_deduc = 'N'
                    AND NC.terc_nit = :nite
                    INTO :TOTPAGOS;
                select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                    where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
                    N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_benefic = 'S'
                    AND NC.terc_nit = :nite
                    INTO :totbenef;
                /* reste las incapacidades si son parafiscales o ARL */
                sumavrprom = 0;
                select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                    where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and
                    N.nomi_periodo >= :perinicial and N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and
                    C.conc_baseap = 'S' AND ((NC.CONC_COD = 932) or (NC.conc_cod = 975) or (NC.conc_cod = 978) or (NC.conc_cod = 997) or (NC.conc_cod = 998)
                     or (NC.conc_cod = 999) or (NC.conc_cod = 1000) or (NC.conc_cod = 1001) or (NC.conc_cod = 1002) or (NC.conc_cod = 1003)
                      or (NC.conc_cod = 1004) or (NC.conc_cod = 1005) or (NC.conc_cod = 1026) or (NC.conc_cod = 1033) or (NC.conc_cod = 1034) or (NC.conc_cod = 1035))
                    AND NC.TERC_NIT = :NITE into :sumavrprom; -- SUMA DE INCAPACIDADES
                if (sumavrprom is null) then
                    sumavrprom = 0;
                if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936) or (CONC_COD = 1014) or
                    (CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) or (CONC_COD = 1017) or
                    (CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) or (CONC_COD = 1018) or
                    (CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013) ) then
                    VALOR = VALOR - sumavrprom;
                /* si es ARL reste las vacaciones */
                if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) then
                    begin
                    sumavrprom = 0;
                    select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                        where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and
                        N.nomi_periodo >= :perinicial and N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and
                        C.conc_baseap = 'S' AND ((NC.CONC_COD = 949) or (NC.conc_cod = 950))
                        AND NC.TERC_NIT = :NITE into :sumavrprom; -- SUMA DE INCAPACIDADES
                    if (sumavrprom is null) then
                        sumavrprom = 0;
                    VALOR = VALOR - sumavrprom;
                    end
                if (SALINTEG = 'S') then
                    valor = valor * (tar_salinteg / 100);

                if ((VALOR / SMLV) > 25) then
                    valor = SMLV * 25;

                /* SI APORTE A SEGURIDAD SOCIAL MENOR QUE EL MINIMO O MAYOR A 25 SMMLV */
                if ((:conc_cod = '904') OR (:conc_cod = '905') OR (:conc_cod = '906') OR (:conc_cod = '934') OR (:conc_cod = '1012') or
                    (:conc_cod = '908') OR (:conc_cod = '909') OR (:conc_cod = '935') or (CONC_COD = 1013) OR
                    (:conc_cod = '907') OR (:conc_cod = '914') OR (:conc_cod = '915') OR (:conc_cod = '938') OR (:conc_cod = '976') OR (:conc_cod = '1016')) then
                    BEGIN
                    if (totpagos <> 0) then
                        begin
                        /* DECRETO 1393 UGPP */
                        /* SI BENEFICIOS > 40% DE TOTAL DEVENGOS SUME LA DIFERENCIA COMO BASE PARA SALUD, PENSIONES Y ARL */
                        if ((totbenef / totpagos) > 0.4) then
                            BEGIN
                            VALOR = VALOR + (TOTBENEF - (totpagos * 0.4));
                            END
                        end
                    if (difaportmin <> 'EMPLEADOR') then
                        if (:VALOR < ((:SMLV/30)*:DIASLAB)) then
                            VALOR = (:SMLV/30)*:DIASLAB;
                    if ((VALOR / SMLV) > 25) then
                        valor = SMLV * 25;
                    END

                if (CONC_COD = 904) then /* AFP TRABAJADOR */
                    begin
                    if ((SUBTIPOC IS NULL) or (SUBTIPOC = 0)) then
                        BEGIN
                        BASERT = VALOR;
                        END
                    ELSE
                        BEGIN
                        BASERT = 0;
                        END
                    end
                else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) or (CONC_COD = 1012)) then /* AFP EMPLEADOR */
                    begin
                    if ((SUBTIPOC IS NULL) or (SUBTIPOC = 0)) then
                        BEGIN
                        if ((difaportmin = 'EMPLEADOR') and (VALOR < (:SMLV/30)*:DIASLAB)) then
                            BEGIN
                            BASERT = (:SMLV/30)*:DIASLAB;
                            END
                        else
                            BEGIN
                            BASERT = VALOR;
                            END
                        END
                    ELSE
                        basert = 0;
                    end
                else if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) then /* ARP */
                    begin
                    if (VALOR < (:SMLV/30)*:DIASLAB) then
                        VALOR = (:SMLV/30)*:DIASLAB;
                    BASERT = VALOR;
                    end
                else if (CONC_COD = 921) then /* FSP */
                    begin
                    if ((:PERIODICIDAD = 1) or (MENSUAL = 'S')) Then
                        BASEFSP = FLOOR(VALOR / smlv);
                    else
                        if (:PERIODICIDAD = 2) then
                            BASEFSP = FLOOR(VALOR*2 / smlv);
                        else
                            BASEFSP = FLOOR(VALOR*4 / smlv);
                     if (BASEFSP >= 4) then
                         BEGIN
                         SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= :BASEFSP AND
                             FSPE_SMLVFIN >= :BASEFSP INTO :porcen;
                         BASERT = VALOR;
                         END
                     else
                         BEGIN
                         BASERT = 0;
                         END
                    end
                else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)or (CONC_COD = 1016)) then
                    begin
                    if (CONC_COD = 907) then /* EPS TRABAJADOR */
                        begin
                        BASERT = VALOR;
                        end
                    else
                        begin   /* EPS EMPLEADOR */
                        /* verifique si es menor a los 10 SMMLV */
                        if (((VALOR / SMLV) > MINAPEPS) or (salinteg = 'S')) then
                            BEGIN
                            select A.PAAN_EPSEM, a.paan_epstr from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN, :porcentr;
                            if ((difaportmin = 'EMPLEADOR') and (VALOR < (:SMLV/30)*:DIASLAB)) then
                                BEGIN
                                BASERT = (:SMLV/30)*:DIASLAB;
                                END
                            else
                                BEGIN
                                BASERT = VALOR;
                                END
                            END
                        end
                    end
                else if (conc_cod = 976) then /* EPS APRENDIZ SENA */
                    begin
                    BASERT = VALOR;
                    end
                else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936) or (CONC_COD = 1014)) then
                    begin /*ccf */
                    if (VALOR < (:SMLV/30)*:DIASLAB) then
                        VALOR = (:SMLV/30)*:DIASLAB;
                    BASERT = VALOR;
                    end
                else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) or (CONC_COD = 1017) ) then
                    begin
                    /*icbf */
                    if (((VALOR / SMLV) > MINAPEPS) or (salinteg = 'S')) then
                        begin
                        if (VALOR < (:SMLV/30)*:DIASLAB) then
                            VALOR = (:SMLV/30)*:DIASLAB;
                        end
                    else
                        VALOR = 0;
                    BASERT = VALOR;
                    end
                else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) or (CONC_COD = 1018) ) then
                    begin
                    /*sena */
                    if (((VALOR / SMLV) > MINAPEPS) or (salinteg = 'S')) then
                        begin
                        if (VALOR < (:SMLV/30)*:DIASLAB) then
                            VALOR = (:SMLV/30)*:DIASLAB;
                        end
                    else
                        VALOR = 0;
                    BASERT = VALOR;
                    end
                update nomina_conceptos set noco_base = :basert where nomi_id = :idnomina and conc_cod = :conc_cod and terc_nit = :nite;
                end /* aportes */
            end /* for */
        end
    end
end^


ALTER PROCEDURE BASE_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    PROY VARCHAR(4),
    CENTRO VARCHAR(4))
RETURNS (
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
declare variable MOVIMIENTO NUMERIC(18,2);
BEGIN
CTAFIN = CUENTA || '999999';
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECINI);
MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECFIN);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECFIN, -1) RETURNING_VALUES (FECFIN);

SELECT SUM(D.code_base), SUM(D.code_debito-D.code_credito) FROM comprobante_detalle D, COMPROBANTE_ENCABEZADO E WHERE E.enco_consec = D.enco_consec AND
    CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
    AND ((:PROY = '') or (PROY_COD = :PROY)) AND ((:CENTRO = '') or (CENT_COD = :CENTRO))
    INTO :BASE, :MOVIMIENTO;

IF (BASE IS NULL) THEN
  BASE = 0;
IF ((MOVIMIENTO IS NULL) or (MOVIMIENTO = 0)) THEN
  PORC = 0;
ELSE
    IF (BASE <> 0) THEN
        PORC = MOVIMIENTO * 100 / BASE;
    ELSE
        PORC = 0;
SUSPEND;
END^


ALTER PROCEDURE BASE_CUENTA_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    PROY VARCHAR(4),
    CENTRO VARCHAR(4))
RETURNS (
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
declare variable MOVIMIENTO NUMERIC(18,2);
BEGIN
CTAFIN = CUENTA || '999999';
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECINI);
MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECFIN);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECFIN, -1) RETURNING_VALUES (FECFIN);

SELECT SUM(D.code_base), SUM(D.code_debito-D.code_credito) FROM comprobante_detalle_niif D, COMPROBANTE_ENCABEZADO E
    WHERE E.enco_consec = D.enco_consec AND
    CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
    AND ((:PROY = '') or (PROY_COD = :PROY)) AND ((:CENTRO = '') or (CENT_COD = :CENTRO))
    INTO :BASE, :MOVIMIENTO;

IF (BASE IS NULL) THEN
  BASE = 0;
IF ((MOVIMIENTO IS NULL) or (MOVIMIENTO = 0)) THEN
  PORC = 0;
ELSE
    IF (BASE <> 0) THEN
        PORC = MOVIMIENTO * 100 / BASE;
    ELSE
        PORC = 0;
SUSPEND;
END^


ALTER PROCEDURE BODEGA_FACTURACION (
    ARTIC VARCHAR(20),
    FECHA DATE,
    AGENCIA INTEGER,
    CODBOD VARCHAR(2),
    CANT NUMERIC(18,2))
RETURNS (
    BOD VARCHAR(2))
AS
declare variable SALDO NUMERIC(18,2);
declare variable AUTBOD CHAR(1);
declare variable BODPRE VARCHAR(2);
declare variable OK CHAR(1);
declare variable SINAGEN CHAR(2);
begin
SELECT BODE_AUTO FROM BODEGA WHERE BODE_COD = :CODBOD INTO :AUTBOD;
if (AUTBOD = 'S') then
  BEGIN
  OK = 'N';
  execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'SELECCIONAR BODEGAS AUTOMATICAS DE CUALQUIER AGENCIA') returning_values (:SINAGEN);
  if (SINAGEN = 'SI') then
    AGENCIA = 0;
  /* INTENTE PRIMERO LA PREDETERMINADA */
  SELECT BODE_COD FROM articulo_bodega WHERE ARTI_COD = :ARTIC AND SUCU_ID = :agencia INTO :bodpre;
  if ((BODPRE IS NOT NULL) AND (BODPRE <> '')) then
    BEGIN
    EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTIC, :BODPRE, :FECHA) returning_values (:SALDO);
    if (SALDO > 0) then
        BEGIN
        BOD = BODPRE;
        suspend;
        OK = 'S';
        END
    END
  if (OK = 'N') then
    BEGIN
    EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTIC, :CODBOD, :FECHA) returning_values (:SALDO);
    if (SALDO > 0) then
        BEGIN
        BOD = CODBOD;
        suspend;
        OK = 'S';
        END
    else
      begin
      FOR SELECT BODE_COD FROM BODEGA WHERE BODE_FACTURA = 'S' AND ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA)) AND BODE_AUTO = 'S'
        ORDER BY BODE_COD INTO :BOD
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTIC, :BOD, :FECHA) returning_values (:SALDO);
        if (SALDO >= CANT) then
            begin
            OK = 'S';
            suspend;
            end
        END
      if (OK = 'N') then
        BEGIN
        execute procedure lee_configuracion('INVENTARIO', 'EXISTENCIAS', 'BODEGA AUTOMATICA PREDETERMINADA PARA EXISTENCIAS NEGATIVAS') returning_values (:BOD);
        if (bod = '') then
            bod = codbod;
        SUSPEND;
        END
      END
    END
  END
ELSE
  BEGIN
  BOD = CODBOD;
  SUSPEND;
  END
end^


ALTER PROCEDURE BODEGA_FACTURACION_ALTERNA (
    ARTIC VARCHAR(20),
    FECHA DATE,
    AGENCIA INTEGER,
    CODBOD VARCHAR(2),
    CANT NUMERIC(18,2))
RETURNS (
    BOD VARCHAR(2))
AS
declare variable SALDO NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable exins VARCHAR(20);
declare variable SINAGEN CHAR(2);
begin
OK = 'N';
execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'SELECCIONAR BODEGAS AUTOMATICAS DE CUALQUIER AGENCIA') returning_values (:SINAGEN);
if (SINAGEN = 'SI') then
    AGENCIA = 0;
/* TRAE LA BODEGA DONDE PUEDE ENCONTRAR EL SALDO RESTANTE CUANDO LA CANTIDAD ES INSUFICIENTE */
FOR SELECT BODE_COD FROM BODEGA WHERE BODE_FACTURA = 'S' AND ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA)) AND BODE_AUTO = 'S' AND BODE_COD <> :codbod
    ORDER BY BODE_COD INTO :BOD
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTIC, :BOD, :FECHA) returning_values (:SALDO);
    if (SALDO >= CANT) then
        BEGIN
        OK = 'S';
        suspend;
        END
    END
if (OK = 'N') then
    BEGIN
    FOR SELECT BODE_COD FROM BODEGA WHERE BODE_FACTURA = 'S' AND ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA)) AND BODE_AUTO = 'S' AND BODE_COD <> :codbod
        ORDER BY BODE_COD INTO :BOD
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTIC, :BOD, :FECHA) returning_values (:SALDO);
        if (SALDO > 0) then
            BEGIN
            OK = 'S';
            suspend;
            END
        END
    if (OK = 'N') then
        BEGIN
        execute procedure lee_configuracion('INVENTARIO', 'EXISTENCIAS', 'BODEGA AUTOMATICA PREDETERMINADA PARA EXISTENCIAS NEGATIVAS') returning_values (:BOD);
        if (bod = '') then
            bod = codbod;
        SUSPEND;
        END
    END
end^


ALTER PROCEDURE BONOS_DISPONIBLES (
    HOY DATE)
RETURNS (
    FORMA INTEGER,
    NUMERO VARCHAR(12),
    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^


ALTER PROCEDURE BORRA_DESCUADRADOS (
    TIPO CHAR(3),
    FECINI CHAR(8),
    FECFIN CHAR(8))
RETURNS (
    ID INTEGER,
    PREF CHAR(4),
    NUMERO CHAR(8),
    FECHA CHAR(8),
    DB NUMERIC(18,2),
    CR NUMERIC(18,2))
AS
begin
FOR SELECT ENCO_CONSEC, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA FROM comprobante_encabezado
    WHERE TICO_COD = :TIPO AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
    INTO :ID, :pref,  :NUMERO, :FECHA
    DO
    BEGIN
    SELECT SUM(CODE_DEBITO), SUM(CODE_CREDITO) FROM comprobante_detalle WHERE ENCO_CONSEC = :ID INTO :DB, :CR;
    if (DB <> CR) then
        BEGIN
        DELETE FROM comprobante_detalle WHERE ENCO_CONSEC = :ID;
        DELETE FROM comprobante_encabezado WHERE ENCO_CONSEC = :ID;
        suspend;
        END
    END
end^


ALTER PROCEDURE BORRAR_FACTURAS (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    NUMERO VARCHAR(8),
    FECHA DATE)
AS
begin
FOR SELECT FACT_ID, FACT_NUMERO, FACT_FECHA FROM facturas WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREFIJO
    INTO :ID, :NUMERO, :FECHA
    DO
    BEGIN
    UPDATE FACTURAS SET FACT_ANULADO = 'S' WHERE FACT_ID = :ID;
    DELETE FROM FACTURAS WHERE FACT_ID = :ID;
    suspend;
    END
end^


ALTER PROCEDURE BORRAR_PEDIDO_WEB (
    ID INTEGER)
AS
begin
  delete from pedido_web_detalle where pewe_id = :id;
  delete from pedido_web where pewe_id = :id;
end^


ALTER PROCEDURE BORRE_APERTURA_NIIF (
    FECINI DATE,
    FECFIN DATE,
    NULO CHAR(1))
RETURNS (
    OK CHAR(1))
AS
begin
DELETE FROM apertura_niif_det;
DELETE FROM apertura_niif;
execute procedure recalcula_apertura_niif;
OK = 'S';
suspend;
end^


ALTER PROCEDURE BORRE_CONTABIL_FACTURA (
    ID INTEGER)
AS
declare variable IDC INTEGER;
BEGIN
  SELECT ENCO_CONSEC FROM comprobante_encabezado
    WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDC;
  DELETE FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :IDC;
  DELETE FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = :IDC;
END^


ALTER PROCEDURE BUSCA_ID_DOC (
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8))
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^


ALTER PROCEDURE BUSCA_ID_DOC_CARTERA (
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    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 AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable TRM numeric(18,2);
declare variable MONEDA INTEGER;
declare variable DTOF0 numeric(18,2);
declare variable DTOF1 numeric(18,2);
declare variable DTOF2 numeric(18,2);
declare variable DTOF3 numeric(18,2);
declare variable FECD0 DATE;
declare variable FECD1 DATE;
declare variable FECD2 DATE;
declare variable FECD3 DATE;
declare variable DTOSADIC VARCHAR(2);
declare variable DEVDTOF CHAR(2);
declare variable IDDEV INTEGER;
BEGIN
ID = 0;
ERROR = 0;
if (tipo = 31) then
    EXECUTE PROCEDURE completa_ceros8(NUMERO) returning_values (NUMERO);
ELSE
    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
    BEGIN
    SELECT FACT_ID, TERC_NIT, FACT_FECHA, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM,
        FACT_DTOF1M, FACT_DTOF2M, FACT_DTOF3M, FACT_DTOF1FEC, FACT_DTOF2FEC, FACT_DTOF3FEC
        FROM FACTURAS WHERE PREF_PRE = :PREFIJO AND FACT_NUMERO = :NUMERO
        INTO :ID, :VERNIT, :FEC, :DTOF0, :FECD0, :TRM,
        :DTOF1, :DTOF2, :DTOF3, :FECD1, :FECD2, :FECD3;
    EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'DESCUENTOS POR PRONTO PAGO ADICIONALES') returning_values (:DTOSADIC);
    if (DTOSADIC = 'SI') then
        BEGIN
        if (FECHA <= FECD0) then
            BEGIN
            DTOF = DTOF0;
            FECDTO = FECD0;
            END
        else if (FECHA <= FECD1) then
            BEGIN
            DTOF = DTOF1;
            FECDTO = FECD1;
            END
        else if (FECHA <= FECD2) then
            BEGIN
            DTOF = DTOF2;
            FECDTO = FECD2;
            END
        else if (FECHA <= FECD3) then
            BEGIN
            DTOF = DTOF3;
            FECDTO = FECD3;
            END
        END
    ELSE
        BEGIN
        DTOF = DTOF0;
        FECDTO = FECD0;
        END
    END
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 (TIPO = 86) then
    SELECT TIQP_ID, TIQP_FECHA, 0, TIQP_FECHA, TIQP_NIT, 0
        FROM tiquete_pasajero WHERE TIQP_PREF = :PREFIJO AND TIQP_NUMERO = :NUMERO
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :trm;
if (TIPO = 89) then
    SELECT MANC_ID, MANC_FECHA, 0, MANC_FECHA, TERC_NIT, 0
        FROM manifiesto_carga M, VEHICULOS V WHERE MANC_PREF = :PREFIJO AND MANC_NUMERO = :NUMERO AND M.manc_vehiculo = V.vehi_cod
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :trm;
if ((TIPO = 85) or (TIPO = 87)) then
    SELECT CGRM_ID, CGRM_FECHA, 0, CGRM_FECHA, CGRM_NIT, 0
        FROM carga_remesa R WHERE CGRM_PREF = :PREFIJO AND CGRM_NUMERO = :NUMERO
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :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 AND RCDE_ANULADO = 'N' INTO :DTOAPL;
    if (DTOAPL IS NULL) then
        DTOAPL = 0;
    DTOF = DTOF - DTOAPL;
    if (TIPO = 31) then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DEVOLUCIONES', 'ANULAR EL DESCUENTO POR PRONTO PAGO DE LA FACTURA AL HACER DEVOLUCION')
            returning_values (:DEVDTOF);
        if (DEVDTOF = 'SI') then
            BEGIN
            IDDEV = 0;
            SELECT first 1 DEVT_ID FROM devoluciones_ventas D, FACTURAS F WHERE DEVT_FACTID = FACT_ID AND F.PREF_PRE = :PREFIJO AND FACT_NUMERO = :NUMERO
                AND DEVT_ANULADO = 'N' INTO IDDEV;
            if ((IDDEV <> 0) AND (IDDEV IS NOT NULL)) then
                DTOF = 0;
            END
        END
    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), SUM(SDCA_RCREE - SDCA_ABRCREE)
            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
            INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
        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;
            if ((RCREE IS NULL) or (RCREE < 0))  then
                RCREE = 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;
            if ((RCREE IS NULL) or (RCREE > 0))  then
                RCREE = 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;
            RCREE = RCREE / 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';
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
            if (AUTORCREE <> '') then
                FAUTORCREE = CAST(AUTORCREE AS DATE);
            else
                FAUTORCREE = '9999/12/31';
            /* BUSQUE LA 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
            if (FAUTORCREE <= FECDOC) then
                RCREE = 0;
            /* 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 - RCREE;
            SALDO = SALDO - DTOF;
            END
        end
    END
  end
SUSPEND;
END^


ALTER PROCEDURE BUSCA_ID_DOC_CXPAGAR (
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER,
    NUMPROV VARCHAR(15))
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 (TIPO = 89) then
    SELECT MANC_ID, MANC_FECHA, 0, MANC_FECHA, TERC_NIT, 0, ''
        FROM manifiesto_carga M, VEHICULOS V WHERE MANC_PREF = :PREFIJO AND MANC_NUMERO = :NUMERO AND M.manc_vehiculo = V.vehi_cod
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :TRM, :numprov;
if (TIPO = 88) then
    SELECT PLPA_ID, PLPA_FECHA, 0, PLPA_FECHA, TERC_NIT, 0, ''
        FROM planilla_pasajeros P, VEHICULOS V WHERE PLPA_PREF = :PREFIJO AND PLPA_NUMERO = :NUMERO AND P.plpa_vehiculo = V.vehi_cod
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :TRM, :numprov;
if (TIPO = 87) then
    SELECT CGRM_ID, CGRM_FECHA, 0, CGRM_FECHA, V.TERC_NIT, 0, ''
        FROM carga_remesa C, planilla_pasajeros P, VEHICULOS V WHERE CGRM_PREF = :PREFIJO AND CGRM_NUMERO = :NUMERO AND
        C.cgrm_planilla = P.plpa_id AND P.plpa_vehiculo = V.vehi_cod
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :TRM, :numprov;
if (TIPO = 86) then
    SELECT TIQP_ID, TIQP_FECHA, 0, TIQP_FECHA, V.TERC_NIT, 0, ''
        FROM tiquete_pasajero T, planilla_pasajeros P, VEHICULOS V WHERE TIQP_PREF = :PREFIJO AND TIQP_NUMERO = :NUMERO AND
        T.tiqp_planilla = P.plpa_id AND P.plpa_vehiculo = V.vehi_cod
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :TRM, :numprov;
if (TIPO = 137) then
    SELECT FAPO_ID, TERC_NIT, FAPO_FECHA, FAPO_DTOMONTO, FAPO_DTOFECHA, 0, ''
        FROM factura_proforma WHERE PREF_PRE = :PREFIJO AND FAPO_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 AND EGDE_ANULADO = 'N' 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), SUM(SDCP_RCREE - SDCP_ABRCREE)
            FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
            INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        if (RCREE IS NULL) then
            RCREE = 0;
        /* TRAIGA EL SALDO NETO */
        if (TRM <> 1) then
            MONEDA = 1;
        else    
            MONEDA = 0;
        if (TRM <> 0) then
            BEGIN
            RTFTE = RTFTE / TRM;
            RTIVA = RTIVA / TRM;
            RTICA = RTICA / TRM;
            RCREE = RCREE / 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 - RCREE;
            SALDO = SALDO - DTOF;
            END
        END
    END
  END
SUSPEND;
END^


ALTER PROCEDURE BUSCA_ID_DOC_CXPAGAR_P (
    TIPO INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    ERROR INTEGER,
    NUMPROV VARCHAR(15))
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);
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 (TIPO = 89) then
    SELECT MANC_ID, MANC_FECHA, 0, MANC_FECHA, TERC_NIT, 0, ''
        FROM manifiesto_carga M, VEHICULOS V WHERE MANC_PREF = :PREFIJO AND MANC_NUMERO = :NUMERO AND M.manc_vehiculo = V.vehi_cod
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :TRM, :numprov;
if (TIPO = 88) then
    SELECT PLPA_ID, PLPA_FECHA, 0, PLPA_FECHA, TERC_NIT, 0, ''
        FROM planilla_pasajeros P, VEHICULOS V WHERE PLPA_PREF = :PREFIJO AND PLPA_NUMERO = :NUMERO AND P.plpa_vehiculo = V.vehi_cod
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :TRM, :numprov;
if (TIPO = 87) then
    SELECT CGRM_ID, CGRM_FECHA, 0, CGRM_FECHA, V.TERC_NIT, 0, ''
        FROM carga_remesa C, planilla_pasajeros P, VEHICULOS V WHERE CGRM_PREF = :PREFIJO AND CGRM_NUMERO = :NUMERO AND
        C.cgrm_planilla = P.plpa_id AND P.plpa_vehiculo = V.vehi_cod
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :TRM, :numprov;
if (TIPO = 86) then
    SELECT TIQP_ID, TIQP_FECHA, 0, TIQP_FECHA, V.TERC_NIT, 0, ''
        FROM tiquete_pasajero T, planilla_pasajeros P, VEHICULOS V WHERE TIQP_PREF = :PREFIJO AND TIQP_NUMERO = :NUMERO AND
        T.tiqp_planilla = P.plpa_id AND P.plpa_vehiculo = V.vehi_cod
        INTO :ID, :FEC, :DTOF, :FECDTO, :vernit, :TRM, :numprov;
if (TIPO = 137) then
    SELECT FAPO_ID, TERC_NIT, FAPO_FECHA, 0, FAPO_FECHA, TACA_MONTO, FAPO_NUMPROV
        FROM factura_proforma WHERE PREF_PRE = :PREFIJO AND FAPO_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 AND EGDE_ANULADO = 'N' 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), SUM(SDCP_RCREE - SDCP_ABRCREE)
            FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID
            INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (RTIVA IS NULL) then
            RTIVA = 0;
        if (RTICA IS NULL) then
            RTICA = 0;
        if (RCREE IS NULL) then
            RCREE = 0;
        /* TRAIGA EL SALDO NETO */
        if (TRM <> 0) then
            BEGIN
            RTFTE = RTFTE / TRM;
            RTIVA = RTIVA / TRM;
            RTICA = RTICA / TRM;
            RCREE = RCREE / TRM;
            END
        EXECUTE PROCEDURE SALDO_DOC_CXPAGAR(TIPO, ID, FECHA,0) 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 - RCREE;
            SALDO = SALDO - DTOF;
            END
        END
    END
  END
SUSPEND;
END^


ALTER PROCEDURE BUSCAR_CHEQUES (
    CUENTA INTEGER)
RETURNS (
    ID INTEGER,
    CODCTA VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NOMTERC VARCHAR(60),
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1),
    CONFIRMA CHAR(1))
AS
begin
for select CH.cheq_id, CH.prba_pref, CH.cheq_numero, CH.cheq_fecha, CH.cheq_benef, CH.cheq_concepto, CH.cheq_monto, C.cuba_codcta,
    CH.cheq_anulado, CH.cheq_confirma
    from cheques ch, cuentas_banco c where ch.cuba_cod = c.cuba_cod and ch.cuba_cod = :CUENTA
    order by cheq_fecha desc, cheq_id desc
    INTO :ID, :prefijo, :numero, :fecha, :nomterc, :concepto, :monto, :codcta, :anular, :confirma
    do
    begin
    suspend;
    end
end^


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^


ALTER PROCEDURE BUSCAR_DEVOLCHEQ (
    CUENTA INTEGER)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE BUSQUEDA_ANTICIPOS_CLI (
    SUBEMPRESA INTEGER)
RETURNS (
    ANCL_ID INTEGER,
    PREF_PRE VARCHAR(4),
    ANCL_FECHA DATE,
    ANCL_NUMERO VARCHAR(8),
    ANCL_CONC VARCHAR(60),
    ANCL_BASE NUMERIC(18,2),
    ANCL_ANULADO CHAR(1),
    TERC_NIT VARCHAR(20),
    TERC_NOM VARCHAR(60),
    PREFRDC VARCHAR(4),
    RECA_NUMERO VARCHAR(8))
AS
declare variable reca_id integer;
begin
FOR select  a.ancl_id,p.pref_pre,a.ancl_fecha,a.ancl_numero,a.ancl_conc,a.ancl_base,a.ancl_anulado,t.terc_nit,t.terc_nom, reca_id
    from anticipos_cliente a, terceros t, prefijos p
    where t.terc_nit = a.terc_nit and a.pref_pre= p.pref_pre and p.tido_cod = 45 and ((p.sucu_id=:subempresa) or (:subempresa = 0))
    INTO :ancl_id,:pref_pre,:ancl_fecha,:ancl_numero,:ancl_conc,:ancl_base,:ancl_anulado,:terc_nit,:terc_nom, reca_id
    DO
    BEGIN
    prefrdc = '';
    reca_numero = '';
    SELECT r.pref_pre refrec, r.reca_numero FROM recibos_caja r WHERE reca_id = :reca_id INTO :prefrdc, :reca_numero;
    suspend;
    END
end^


ALTER PROCEDURE BUSQUEDA_ANTICIPOS_PRV (
    SUBEMPRESA INTEGER)
RETURNS (
    ANPR_ID INTEGER,
    TERC_NIT VARCHAR(20),
    PREF_PRE VARCHAR(4),
    ANPR_NUMERO VARCHAR(8),
    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(8))
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^


ALTER PROCEDURE BUSQUEDA_CAMPANAS (
    CUMPLIDOS CHAR(1),
    ANULADOS CHAR(1))
RETURNS (
    ID INTEGER,
    ABIERTA CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    NOMBRE VARCHAR(60),
    ITOK INTEGER,
    ITTOT INTEGER,
    PORCENTA NUMERIC(9,2),
    ANULADO CHAR(1))
AS
begin
FOR SELECT CRCM_ID, CRCM_NOMBRE, CRCM_FECINI, CRCM_FECFIN, CRCM_ABIERTA, CRCM_ANULADO FROM crm_campana
    INTO :ID, :nombre, :fecini, :fecfin, :ABIERTA, :ANULADO
    DO
    BEGIN
    if ((ANULADOS = 'S') or (ANULADO = 'N'))  then
        BEGIN
        if (ABIERTA = 'N') then
            BEGIN
            SELECT COUNT(*) FROM crm_campana_detalle WHERE CRCM_ID = :ID INTO :ittot;
            SELECT COUNT(*) FROM crm_campana_detalle D, crm_compromisos C
                WHERE C.CRCM_ID = :ID AND C.crco_id = D.crcd_evento AND C.crco_cumplido = 'S' AND C.crco_fecha >= :FECINI
                INTO :itok;
            if (ittot <> 0) then
                PORCENTA = ITOK * 100 / ITTOT;
            else
                PORCENTA = 0;
            if ((CUMPLIDOS = 'S') or (ITTOT = 0) or (ITTOT > ITOK)) then
                suspend;
            END
        ELSE
            BEGIN
            SELECT COUNT(*) FROM crm_eventos E WHERE E.crcm_id = :ID INTO :ITTOT;
            ITOK = ITTOT;
            PORCENTA = 0;
            suspend;
            END
        END
    END
end^


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^


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^


ALTER PROCEDURE BUSQUEDA_DOCS_PRODUCCION (
    IDORD INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE BUSQUEDA_EGRESOS (
    SUBEMPRESA INTEGER)
RETURNS (
    EGRE_ID INTEGER,
    PREF_PRE VARCHAR(4),
    EGRE_NUMERO VARCHAR(8),
    EGRE_FECHA DATE,
    EGRE_NOMTERC VARCHAR(60),
    EGRE_CONC VARCHAR(60),
    EGRE_MONTO NUMERIC(18,2),
    EGRE_RETEN NUMERIC(18,2),
    CLEG_NOMBRE VARCHAR(60),
    EGRE_ANULADO CHAR(1),
    EGRE_TIPO CHAR(1),
    EGRE_CAJA NUMERIC(18,2),
    EGRE_BANCO NUMERIC(18,2))
AS
begin
  for select EGRE_ID, E.PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_NOMTERC, EGRE_ANULADO, EGRE_CONC, EGRE_TIPO,
             (EGRE_RTFTEMONTO + EGRE_RTIVAMONTO + EGRE_RTICAMONTO + EGRE_RTCREE) EGRE_RETEN, EGRE_MONTO, CLEG_NOMBRE
      from EGRESOS E, CLASE_EGRESO C, PREFIJOS P
      where C.CLEG_ID = E.CLEG_ID and
            E.PREF_PRE = P.PREF_PRE and
            P.TIDO_COD = 62 and
            ((P.SUCU_ID = :SUBEMPRESA) or (P.SUCU_ID = 0) or (P.SUCU_ID is null) or (:SUBEMPRESA = 0))
      order by EGRE_ID DESC
      into :EGRE_ID, :PREF_PRE, :EGRE_NUMERO, :EGRE_FECHA, :EGRE_NOMTERC, :EGRE_ANULADO, :EGRE_CONC, :EGRE_TIPO,
            :EGRE_RETEN, :EGRE_MONTO, :CLEG_NOMBRE
  do
  begin
  EGRE_CAJA = 0;
  select sum(EGCA_MONTO) from EGRESOS_CAJA where EGRE_ID = :EGRE_ID into :EGRE_CAJA;
  EGRE_BANCO = 0;
  select sum(EGBC_MONTO) from EGRESOS_BANCO where EGRE_ID = :EGRE_ID into :EGRE_BANCO;
  suspend;
  end
end^


ALTER PROCEDURE BUSQUEDA_EVENTOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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, EVEN_PREF, EVEN_NUMERO, 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
    WHERE E.crev_tipo = T.crte_id AND CREV_ANULADO = 'N' AND E.crev_fecha >= :fecini AND E.crev_fecha <= :fecfin
    ORDER BY CREV_FECHA DESC, CREV_HORA DESC
    INTO :id, :PREFIJO, :NUMERO, :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^


ALTER PROCEDURE BUSQUEDA_EVENTOS_CLI (
    NIT VARCHAR(20))
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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, EVEN_PREF, EVEN_NUMERO, 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, :PREFIJO, :NUMERO, :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^


ALTER PROCEDURE BUSQUEDA_IMPORTACIONES
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    REFERENCIA VARCHAR(60),
    CONCEPTO VARCHAR(60),
    ORDENES INTEGER,
    ORDENADO NUMERIC(18,2),
    FACTURAS INTEGER,
    FACTURADO NUMERIC(18,2),
    CERRADA CHAR(1),
    FECCIE DATE,
    ANULADO CHAR(1))
AS
begin
FOR SELECT IMPO_ID, IMPO_PREF, IMPO_NUMERO, IMPO_FECHA, IMPO_CONC, IMPO_ANULADO, IMPO_REFERENCIA, IMPO_CERRADA, IMPO_FECCIE
    FROM IMPORTACION ORDER BY IMPO_ID DESC
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :ANULADO, :REFERENCIA, :CERRADA, :FECCIE
    DO
    BEGIN
    SELECT COUNT(SLIM_ID), SUM(SLIM_TOTAL) FROM solicitud_importacion WHERE SLIM_IDIMPOR = :ID AND SLIM_ANULADO = 'N'
        INTO :ORDENES, :ORDENADO;
    SELECT COUNT(FAPO_ID), SUM(FAPO_TOTAL) FROM factura_proforma WHERE FAPO_IDIMPOR = :ID AND FAPO_ANULADO = 'N'
        INTO :FACTURAS, :FACTURADO;
    suspend;
    END
end^


ALTER PROCEDURE BUSQUEDA_NOTAS_EVENTO (
    EVENTO INTEGER)
RETURNS (
    ID INTEGER,
    FECHA DATE,
    HORA TIME,
    ASESOR VARCHAR(60),
    TEXTO VARCHAR(60),
    ARCHIVO VARCHAR(1024),
    RESPUESTA VARCHAR(60),
    MINTOT SMALLINT,
    MINFAC SMALLINT,
    ANULADO CHAR(1))
AS
declare variable RESPTA INTEGER;
declare variable IDASES INTEGER;
begin
FOR SELECT CEVN_NOTA, CEVN_FECHA, CEVN_HORA, cevn_asesor, CEVN_RESPUESTA, CEVN_TEXTO, CEVN_NOMARCH, CEVN_ANULADO, E.cevn_respuesta, E.cevn_mintot, E.cevn_minfac
    FROM CRM_EVENTOS_NOTAS E, crm_asesor A
    WHERE CREV_ID = :EVENTO AND E.cevn_asesor = A.cras_id
    ORDER BY CEVN_FECHA DESC, CEVN_HORA DESC
    INTO :ID, :fecha, :hora, :idases, :respta, :texto, :ARCHIVO, :anulado, :respta, :MINTOT, :MINFAC
    DO
    BEGIN
    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^


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^


ALTER PROCEDURE BUSQUEDA_ORDENES_COMPRA (
    SUBEMPRESA INTEGER)
RETURNS (
    ORDC_ID INTEGER,
    PREF_PRE VARCHAR(4),
    ORDC_NUMERO VARCHAR(6),
    ORDC_FECHA DATE,
    ORDC_VENCE DATE,
    TERC_NOM VARCHAR(60),
    ORDC_TOTAL NUMERIC(18,2),
    ORDC_IVAMONTO NUMERIC(18,2),
    TERC_NIT VARCHAR(20),
    ORDC_ANULADO CHAR(1),
    CANT NUMERIC(18,2),
    IDEST INTEGER,
    ESTADO VARCHAR(60))
AS
--declare variable CANT NUMERIC(18,2);
declare variable validez integer;
begin
for select ordc_id, p.pref_pre, ordc_numero, ordc_fecha, terc_nom, ordc_total, ordc_ivamonto,
    ordc_anulado, o.terc_nit, o.ordc_vence, o.ordc_validez, ordc_estado
    from ordenes_compra o, terceros t,prefijos p
    where t.terc_nit = o.terc_nit and o.pref_pre= p.pref_pre and p.tido_cod = 23 and ((p.sucu_id = :subempresa) or (:subempresa = 0))
    INTO :ordc_id, :pref_pre, :ordc_numero, :ordc_fecha, :terc_nom, :ordc_total, :ordc_ivamonto,
    :ordc_anulado, :terc_nit, :ordc_vence, :validez, :idest
    DO
    BEGIN
    select does_nombre from documentos_estado where does_id = :idest into :estado;
/*    if (EXISTS (select cofa_id from consolidado_faltantes where cofa_tipoori = 23 and cofa_idori = :ordc_id AND cofa_cantcr <> 0)) then
        begin
        select SUM(OD.ocde_cant*OD.ocde_factor- C.cofa_cantcr) from consolidado_faltantes C, ordenes_compra_detalle OD
            where cofa_tipoori = 23 and cofa_idori = :ordc_id AND cofa_cantcr IS NOT null AND OD.ordc_id = :ordc_id AND
            OD.ocde_item = C.cofa_itemori INTO :CANT;
        if (CANT <> 0) then
            ESTADO = 'Pendientes';
        else
            ESTADO = 'Cumplida';
        end
    if (ESTADO <> 'Cumplida') then
        begin
        if ((ORDC_VENCE < CAST('NOW' AS DATE)) and (ORDC_FECLLEGA < CAST('NOW' AS DATE))) then
            ESTADO = 'Vencida';
        if (:validez < 0) then
            ESTADO = 'Descargada';
        end                        */
    suspend;
    END
end^


ALTER PROCEDURE BUSQUEDA_PENDIENTES (
    SUBEMPRESA INTEGER)
RETURNS (
    PEND_ID INTEGER,
    PREF_PRE VARCHAR(4),
    PEND_NUMERO VARCHAR(8),
    PEND_FECHA DATE,
    PEND_NOMCLI VARCHAR(60),
    PEND_TOTAL NUMERIC(18,2),
    PEND_IVAMONTO NUMERIC(18,2),
    VEND_COD INTEGER,
    PEND_ANULADO CHAR(1),
    PEND_FACTURA VARCHAR(12))
AS
declare variable idfac integer;
begin
for select pend_id, r.pref_pre, pend_numero, pend_fecha, pend_nomcli, pend_total, pend_ivamonto, vend_cod, pend_anulado
    from pendiente_ventas r,prefijos p where r.pref_pre= p.pref_pre and p.tido_cod = 40 and ((p.sucu_id= :SUBEMPRESA) or (:subempresa = 0))
    INTO pend_id, pref_pre, pend_numero, pend_fecha, pend_nomcli, pend_total, pend_ivamonto, vend_cod, pend_anulado
    DO
    BEGIN
    idfac = 0;
    pend_factura = '';
    select max(pevd_idfact) from pendiente_ventas_detalle where pend_id = :pend_id into :idfac;
    if (idfac <> 0) then
        select pref_pre || fact_numero from facturas where fact_id = :idfac and fact_anulado = 'N' into :pend_factura;
    suspend;
    END
end^


ALTER PROCEDURE BUSQUEDA_PRODUCCION (
    SUBEMPRESA INTEGER)
RETURNS (
    PROR_ID INTEGER,
    PREF_PRE VARCHAR(4),
    PROR_NUMERO VARCHAR(8),
    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^


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),
    ACTIVO CHAR(1),
    ZONA VARCHAR(2))
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, ZONA_COD
        FROM CRM_CLIENTES WHERE
            ((: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, :ZONA
         DO
         BEGIN
         CLASE = '';
         AGRUPA = '';
         RELACION = '';
         ESTADO = '';
         VEND = '';
         ACTIVO = '';
         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 CLIE_ESTADO, VEND_NOMBRE FROM CLIENTES C, VENDEDORES V WHERE TERC_NIT = :NIT AND C.vend_cod = V.vend_cod INTO :activo, :vend;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         select first 1 CREV_FECHA, CREV_ASESOR, CREV_RESPUESTA
            from CRM_EVENTOS where CRCL_NIT = :NIT AND CREV_FECHA <= CAST ('now' AS DATE) AND CREV_ANULADO = 'N'
            order by CRCL_NIT DESC, CREV_FECHA desc
            into :ULTFEC, :ASESOR, :CONTACTO;
         if (CONTACTO is not null) then
            BEGIN
            select CRER_NOMBRE from CRM_EVENTO_RESPUESTA WHERE CRER_ID = :CONTACTO into :CONTACTO;
            END
         if (CUALQUIERA = 'S') then
            BEGIN
            if ((ACTIVO <> 'I') or (INACTIVOS = 'S')) then
                SUSPEND;
            END
         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
                    if ((ACTIVO <> 'I') or (INACTIVOS = 'S')) then
                        SUSPEND;
                END
            ELSE
                if ((ACTIVO <> 'I') or (INACTIVOS = 'S')) then
                    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, ZONA_COD
        FROM CRM_CLIENTES
         INTO :NIT, :NOMBRE, :DIR, :CIUD, :TEL, :ENCARGADO, :ANIV, :TIPOREL, :CODESTADO, :CODCLASE, :CODAGRUPA, :ZONA
         DO
         BEGIN
         CLASE = '';
         AGRUPA = '';
         RELACION = '';
         ESTADO = '';
         VEND = '';
         ACTIVO = '';
         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 CLIE_ESTADO, VEND_NOMBRE FROM CLIENTES C, VENDEDORES V WHERE TERC_NIT = :NIT AND C.vend_cod = V.vend_cod
            INTO :activo, :vend;
         ULTFEC = NULL;
         ASESOR = NULL;
         CONTACTO = NULL;
         select first 1 CREV_FECHA, CREV_ASESOR, CREV_RESPUESTA
            from CRM_EVENTOS where CRCL_NIT = :NIT AND CREV_FECHA <= CAST ('now' AS DATE) AND CREV_ANULADO = 'N'
            order by CRCL_NIT DESC, 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 ((ACTIVO <> 'I') or (INACTIVOS = 'S')) then
            SUSPEND;
         END
    END
end^


ALTER PROCEDURE BUSQUEDA_REMESAS (
    SUBEMPRESA INTEGER,
    TIPO INTEGER)
RETURNS (
    CGRM_ID INTEGER,
    CGRM_PRE VARCHAR(4),
    CGRM_NUMERO VARCHAR(8),
    CGRM_FECHA DATE,
    DESTINO VARCHAR(60),
    ORIGEN VARCHAR(60),
    CGRM_TOTAL NUMERIC(18,2),
    CGRM_ANULADO CHAR(1),
    TIDO_COD INTEGER,
    PLANILLA VARCHAR(10),
    MANIFIESTO VARCHAR(10))
AS
declare variable manif integer;
declare variable plani integer;
begin
FOR select cgrm_id, cgrm_pref, cgrm_numero, cgrm_fecha, d.ciud_nom destino, o.ciud_nom origen, cgrm_total, cgrm_anulado, R.tido_cod, cgrm_manif, cgrm_planilla
    from carga_remesa r, ciudades o, ciudades d, prefijos P
    where r.cgrm_origen = o.ciud_cod and r.cgrm_destino = d.ciud_cod AND P.tido_cod = R.tido_cod AND P.pref_pre = R.cgrm_pref AND ((P.sucu_id = :subempresa) or (:subempresa = 0)) AND R.tido_cod = :TIPO
    INTO :cgrm_id, :cgrm_pre, :cgrm_numero, :cgrm_fecha, :destino, :origen, :cgrm_total, :cgrm_anulado, :tido_cod, :manif, :plani
    DO
    BEGIN
    MANIFIESTO = '';
    PLANILLA = '';
    if (tido_cod = 87) then
        SELECT PLPA_PREF || PLPA_NUMERO FROM planilla_pasajeros WHERE PLPA_ID = :plani into :planilla;
    if (tido_cod = 85) then
        SELECT MANC_PREF || MANC_NUMERO FROM manifiesto_carga WHERE MANC_ID = :manif into :manifiesto;
    suspend;
    END
end^


ALTER PROCEDURE BUSQUEDA_REMISIONES (
    SUBEMPRESA INTEGER)
RETURNS (
    REVT_ID INTEGER,
    PREF_PRE VARCHAR(4),
    REVT_NUMERO VARCHAR(8),
    REVT_FECHA DATE,
    REVT_NOMTERC VARCHAR(60),
    REVT_TOTAL NUMERIC(18,2),
    REVT_IVAMONTO NUMERIC(18,2),
    VEND_COD INTEGER,
    PTVT_NOM VARCHAR(60),
    REVT_ANULADO CHAR(1),
    USADO CHAR(1),
    CIUD_COD VARCHAR(5))
AS
declare variable numrows integer;
declare variable punto integer;
begin
for select revt_id, p.pref_pre, revt_numero, revt_fecha, revt_nomterc, revt_total, revt_ivamonto, vend_cod, revt_anulado, ciud_cod, ptvt_id
    from remisiones_venta r, prefijos p, terceros t where t.terc_nit = r.terc_nit and 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, ciud_cod, punto
    DO
    BEGIN
    select ptvt_nom from punto_venta where ptvt_id = :punto into :ptvt_nom;
/*    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^


ALTER PROCEDURE BUSQUEDA_TIQUETES (
    SUBEMPRESA INTEGER)
RETURNS (
    TIQP_ID INTEGER,
    TIQP_PREF VARCHAR(4),
    TIQP_NUMERO VARCHAR(8),
    TIQP_FECHA DATE,
    TIQP_NOMBRE VARCHAR(60),
    TIQP_PUESTO VARCHAR(60),
    RUTA_NOMBRE VARCHAR(60),
    TIQP_TOTAL NUMERIC(18,2),
    TIQP_ANULADO CHAR(1),
    PLANILLA VARCHAR(10))
AS
declare variable plani integer;
begin
FOR select tiqp_id, tiqp_pref, tiqp_numero, tiqp_fecha, tiqp_nombre, tiqp_puesto, ruta_nombre, tiqp_total, tiqp_anulado, tiqp_planilla
    from tiquete_pasajero t, ruta_pasajeros r, prefijos P
    where t.tiqp_ruta = r.ruta_id AND P.tido_cod = 86 AND P.pref_pre = t.tiqp_pref AND ((P.sucu_id = :subempresa) or (:subempresa = 0))
    INTO :tiqp_id, :tiqp_pref, :tiqp_numero, :tiqp_fecha, :tiqp_nombre, :tiqp_puesto, :ruta_nombre, :tiqp_total, :tiqp_anulado, :plani
    DO
    BEGIN
    PLANILLA = '';
    SELECT PLPA_PREF || PLPA_NUMERO FROM planilla_pasajeros WHERE PLPA_ID = :plani into :planilla;
    suspend;
    END
end^


ALTER PROCEDURE CADENA_MES (
    MES INTEGER)
RETURNS (
    MESC CHAR(2))
AS
BEGIN
IF (MES < 10) THEN
  MESC = '0' || CAST(MES AS CHAR(1));
ELSE
  MESC = CAST(MES AS CHAR(2));
SUSPEND;
END^


ALTER PROCEDURE CAF (
    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;
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^


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^


ALTER PROCEDURE CALCULA_CESANTIA (
    NITEMP VARCHAR(20),
    SALARIO NUMERIC(18,2),
    FECLIQ DATE,
    FECCES DATE)
RETURNS (
    CESANTIA NUMERIC(18,2),
    INTCESANT NUMERIC(18,2))
AS
declare variable DIASAUX INTEGER;
declare variable LICNR INTEGER;
declare variable APROX INTEGER;
begin
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
EXECUTE PROCEDURE dias_entre_nomina(FECCES, FECLIQ) returning_values (DIASAUX);
LICNR = 0;
SELECT SUM (ND.nnde_duracion) FROM nomina_novedades N, nomina_novedades_detalle ND
    WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitemp AND ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
    AND N.nono_fecha >= :fecces AND N.nono_fecha <= :fecliq INTO :LICNR;
if (LICNR IS NULL) then
    LICNR = 0;
DIASAUX = DIASAUX - LICNR;

cesantia = :salario * diasaux / 360;
EXECUTE PROCEDURE REDONDEE(:cesantia, :APROX) RETURNING_VALUES (:cesantia);
/* INTERESES SOBRE LA CESANTIA */
intcesant = CESANTIA * diasaux * 0.12 / 360;
EXECUTE PROCEDURE REDONDEE(:intcesant, :APROX) RETURNING_VALUES (:intcesant);
suspend;
end^


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^


ALTER PROCEDURE CALCULA_CONSOLIDADO_FECHA
AS
declare variable id integer;
declare variable fecha date;
begin
FOR SELECT fact_consolida, fact_fecha FROM FACTURAS f
    where f.fact_anulado = 'N' and f.fact_consolida <> 0
    into :id, :fecha
    do
    update consolidado_faltantes set cofa_fecdes = :fecha where cofa_id = :id;
FOR SELECT revt_consolida, revt_fecha FROM remisiones_venta f
    where f.revt_anulado = 'N' and f.revt_consolida <> 0
    into :id, :fecha
    do
    update consolidado_faltantes  set cofa_fecdes = :fecha where cofa_id = :id;
FOR SELECT pedi_consolida, pedi_fecha FROM pedidos f
    where pedi_anulado = 'N' and f.pedi_consolida <> 0
    into :id, :fecha
    do
    update consolidado_faltantes  set cofa_fecdes = :fecha where cofa_id = :id;
FOR SELECT faco_consolida, faco_fecha FROM facturas_compra f
    where faco_anulado = 'N' and f.faco_consolida <> 0
    into :id, :fecha
    do
    update consolidado_faltantes set cofa_fecdes = :fecha where cofa_id = :id;
FOR SELECT repr_consolida, repr_fecha FROM remision_proveedor f
    where repr_anulado = 'N' and f.repr_consolida <> 0
    into :id, :fecha
    do
    update consolidado_faltantes set cofa_fecdes = :fecha where cofa_id = :id;
FOR SELECT ordc_consolida, f.ordc_fecha FROM ordenes_compra f
    where ordc_anulado = 'N' and f.ordc_consolida <> 0
    into :id, :fecha
    do
    update consolidado_faltantes set cofa_fecdes = :fecha where cofa_id = :id;
end^


ALTER PROCEDURE CALCULA_CRUCE_PROVISIONAL
RETURNS (
    ID_PROV INTEGER,
    PREF_PROV VARCHAR(4),
    NUM_PROV VARCHAR(8),
    ID_RC INTEGER,
    FECHA_RC DATE,
    PREF_RC VARCHAR(4),
    NUM_RC VARCHAR(8))
AS
begin
FOR SELECT RECA_ID, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_PROVID FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND RECA_PROVID <> 0 AND RECA_PROVID IS NOT NULL
    INTO :ID_RC, :PREF_RC, :NUM_RC, :FECHA_RC, :ID_PROV
    DO
    BEGIN
    SELECT PREF_PRE, RCPR_NUMERO FROM RECIBO_PROVISIONAL WHERE RCPR_ANULADO = 'S' AND RCPR_ID = :id_prov
        INTO :pref_prov,  :NUM_PROV;
    UPDATE RECIBO_PROVISIONAL SET RCPR_IDCRUCE = :ID_RC, RCPR_FECCRUCE = :FECHA_RC, RCPR_ANULADO = 'N'
        WHERE RCPR_ANULADO = 'S' AND RCPR_ID = :id_prov;
    SUSPEND;
    END
end^


ALTER PROCEDURE CALCULA_INDEMNIZACION (
    EMPL VARCHAR(20),
    FECHA DATE)
RETURNS (
    DIASL INTEGER,
    INDEMNIZA NUMERIC(18,2))
AS
declare variable FECING DATE;
declare variable SALARIO NUMERIC(18,2);
declare variable smlv numeric(18,2);
declare variable ANO CHAR(4);
declare variable aprox integer;
BEGIN
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
SELECT EMPL_FECING FROM EMPLEADOS WHERE TERC_NIT = :EMPL INTO :FECING;
execute procedure dias_entre_nomina(FECING, FECHA) returning_values (DIASL);
EXECUTE PROCEDURE salario_promedio_sin_aux(:EMPL, :fecha, 12, 'N') returning_values (:SALARIO);
ANO = EXTRACT(YEAR FROM FECHA);
select PAAN_SALMINIMO from PARAMETROS_ANO where PAAN_ANO = :ANO into :SMLV;
if (SALARIO < (10 * SMLV)) then
    BEGIN
    INDEMNIZA = SALARIO;
    if (DIASL > 365) then
        BEGIN
        INDEMNIZA = INDEMNIZA + (SALARIO*2/3)*((cast(DIASL as numeric(18,2))-360)/360);
        END
    END
ELSE
    BEGIN
    INDEMNIZA = SALARIO*2/3;
    if (DIASL > 365) then
        BEGIN
        INDEMNIZA = INDEMNIZA + (SALARIO/2)*((DIASL-360)/360);
        END
    END
execute procedure redondee(indemniza, :aprox) returning_values (indemniza);
suspend;
end^


ALTER PROCEDURE CALCULA_PORCPRECIO (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    LISTA INTEGER,
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(20),
    PRECIO NUMERIC(18,2),
    COSTOU NUMERIC(18,2),
    COSTOP NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable COSTO NUMERIC(18,2);
declare variable IVAINC CHAR(1);
declare variable BASE VARCHAR(20);
declare variable UOR VARCHAR(20);
declare variable TARIVA NUMERIC(9,2);
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
SELECT LIPR_MODIF FROM lista_precios WHERE LIPR_COD = :LISTA INTO :IVAINC;
FOR SELECT ARTI_COD, PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA
    AND ARTI_COD >= :artini AND ARTI_COD <= :artfin AND PRAR_AUTO = 'N'
    INTO :CODIGO, :PRECIO
    DO
    BEGIN
    EXECUTE PROCEDURE costo_promedio_y_ultimo (:CODIGO, :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
        BEGIN
        SELECT TAIV_PORC FROM TARIFA_IVA T, ARTICULO A WHERE A.ARTI_COD = :CODIGO AND A.taiv_cod = T.taiv_cod INTO :TARIVA;
        COSTO = COSTO * (1 + TARIVA/100);
        END
    if (UOR = 'UTILIDAD') then
        BEGIN
        if (COSTO <> 0) then
            PORC = (PRECIO / COSTO - 1) * 100;
        UPDATE PRECIOS_ARTICULO
            SET PRAR_UTIL = :PORC
            WHERE ARTI_COD = :CODIGO AND LIPR_COD = :LISTA;
        END
    ELSE
        BEGIN
        PORC = (1 - COSTO / PRECIO) * 100;
        UPDATE PRECIOS_ARTICULO
            SET PRAR_MARGEN = :PORC
            WHERE ARTI_COD = :CODIGO AND LIPR_COD = :LISTA;
        END
    suspend;
    END
end^


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);
declare variable DEC1818 CHAR(1);
declare variable TARIFA INTEGER;
declare variable PRD1818 CHAR(2);
declare variable CONSUMO NUMERIC(18, 2);
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, PRAR_REDON
    FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.LIPR_COD = L.LIPR_COD AND ARTI_COD = :articulo
    INTO :LISTA, :MARGEN, :UTIL, :IVAINC, :AUTOM, :DIG
    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;
        SELECT GRUP_BASEPRECIO, GRUP_DEC1818 FROM GRUPO G, ARTICULO A WHERE G.GRUP_COD = A.grup_cod AND A.ARTI_COD = :articulo
            INTO :BASE, :DEC1818;
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'CALCULAR PRECIOS CON IMPUESTOS INCLUIDOS APLICANDO EXENCIO DECRETO 1818') returning_values (PRD1818);
        if ((dec1818 = 'S') AND (PRD1818 = 'SI')) then
            begin
            tariva = 0;
            end
        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) + CONSUMO;
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') RETURNING_VALUES (:UOR);
        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^


ALTER PROCEDURE CALCULA_PRIMA (
    NITEMP VARCHAR(20),
    SALARIO NUMERIC(18,2),
    FECLIQ DATE,
    FECPRI DATE)
RETURNS (
    PRIMA NUMERIC(18,2))
AS
declare variable DIASAUX INTEGER;
declare variable aprox integer;
declare variable LICNR INTEGER;
BEGIN
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
EXECUTE PROCEDURE dias_entre_nomina(FECPRI, FECLIQ) returning_values (DIASAUX);
SELECT SUM (ND.nnde_duracion) FROM nomina_novedades N, nomina_novedades_detalle ND
    WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitemp AND ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
    AND N.nono_fecha >= :fecpri AND N.nono_fecha <= :fecliq INTO :LICNR;
if (LICNR IS NULL) then
    LICNR = 0;
DIASAUX = DIASAUX - LICNR;

prima = :salario * diasaux / 360;
execute procedure REDONDEE(:prima, :APROX) returning_values (prima);
suspend;
end^


ALTER PROCEDURE CALCULA_VACACIONES (
    NITEMPL VARCHAR(20),
    FECLIQ DATE)
RETURNS (
    FECVAC DATE,
    DIASDIS NUMERIC(9,4),
    SALARIO NUMERIC(18,2),
    VACACION NUMERIC(18,2))
AS
declare variable DIASLAB INTEGER;
declare variable aprox integer;
declare variable FECING DATE;
declare variable FECPRO DATE;
declare variable ANOI INTEGER;
declare variable MESI INTEGER;
declare variable DIAI INTEGER;
declare variable ANOH INTEGER;
declare variable MESH INTEGER;
declare variable DIAH INTEGER;
declare variable DIASD INTEGER;
declare variable LICNR INTEGER;
BEGIN
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select nosi_fecvac from nomina_saldini e where terc_nit = :nitempl into :fecing;
if (fecing IS NULL) then
    SELECT E.empl_fecing FROM EMPLEADOS E WHERE E.terc_nit = :nitempl INTO :fecing;
/* DIAS LABORADOS */
DIAI = extract (DAY FROM FECING);
DIAH = extract (DAY FROM FECLIQ);
MESI = extract (MONTH FROM FECING);
MESH = extract (MONTH FROM FECLIQ);
ANOI = extract (YEAR FROM FECING);
ANOH = extract (YEAR FROM FECLIQ);
diaslab = (anoh-anoi)*360;
DIASLAB = DIASLAB + (MESH - MESI) * 30;
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 ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
    AND N.nono_fecha >= :fecing AND N.nono_fecha <= :fecliq INTO :LICNR;
if (LICNR IS NULL) then
    LICNR = 0;
DIASLAB = DIASLAB - LICNR;

if ((DIAH - DIAI) > 29) then
    DIASLAB = DIASLAB + 30;
ELSE
    begin
    DIASLAB = DIASLAB + (DIAH - DIAI) + 1;
    if (DIAH <= 30) then
        DIASLAB = DIASLAB + 1;
    end
/* DIAS DISFRUTADOS */
SELECT SUM(vd.vadi_dias) FROM vacaciones_disfrut v, vacaciones_disfrut_det vd
    WHERE v.vadi_id = vd.vadi_id and v.TERC_NIT = :nitempl
    INTO :diasd;
if (DIASD IS NULL) then
    DIASD = 0;
SELECT SUM(VACA_DIASSOL), MAX(VACA_FECHA) FROM VACACIONES WHERE TERC_NIT = :nitempl AND VACA_FECHA >= :fecing
    INTO :diasdis, :fecvac;
if (FECVAC IS NULL) then
    FECVAC = FECING;
if (diasdis is null) then
    diasdis = 0;
DIASDIS = DIASDIS + DIASD;
diasdis = CAST(diaslab AS NUMERIC(9,4)) * 15 / 360 - CAST(diasdis AS NUMERIC(9,4));
/*if (DIASDIS <= 15) then
    BEGIN
    FECPRO = ANOH || '/' || MESI || '/' || DIAI;
    if (FECPRO >= FECING) then
        fecpro = (ANOH-1) || '/' || MESI || '/' || DIAI;
    EXECUTE PROCEDURE salario_promedio_vacaciones (:nitempl, :FECPRO, :fecliq, 'S') returning_values (:salario);
    END
ELSE*/
    BEGIN
    if ((mesh = 2) and (diah = 29)) then
        FECPRO = (ANOH-1) || '/' || MESH || '/' || 28;
    else
        FECPRO = (ANOH-1) || '/' || MESH || '/' || DIAH;
    EXECUTE PROCEDURE salario_promedio_vacaciones (:nitempl, :FECPRO, :fecliq, 'S') returning_values (:salario);
    END
vacacion = :salario * diasdis / 30;
--EXECUTE PROCEDURE dias_entre_nomina (:FECVAC, :fecliq) returning_values (diasdis);
--VACACION = SALARIO * diasdis / 720;
EXECUTE PROCEDURE REDONDEE(:vacacion, :aprox) RETURNING_VALUES (:vacacion);
suspend;
end^


ALTER PROCEDURE CALCULE_CESANTIA_LIQ (
    NITEMPL VARCHAR(20),
    FECLIQ DATE)
RETURNS (
    FECCES DATE,
    SALARIOC NUMERIC(18,2),
    CESANTIA NUMERIC(18,2),
    INTCESANT NUMERIC(18,2))
AS
declare variable anoini CHAR(4);
declare variable anofin CHAR(4);
declare variable CESAUX numeric(18,2);
declare variable INTCAUX numeric(18,2);
declare variable SALINTEG CHAR(1);
declare variable FECING DATE;
declare variable TIPOCOT INTEGER;
declare variable fecint DATE;
declare variable SALARIOI numeric(18,2);
declare variable aprox integer;
BEGIN
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
ANOFIN = EXTRACT(YEAR FROM FECLIQ);
SELECT e.empl_salinteg, e.empl_fecing, e.tcot_cod FROM EMPLEADOS E WHERE TERC_NIT = :nitempl
    into :salinteg, :FECING, :TIPOCOT;
/* si es aprendiz no haga prima, cesantia, vacaciones */
if ((TIPOCOT <> 12) AND (TIPOCOT <> 19) AND (SALINTEG <> 'S')) then
    begin
    /* CALCULE FECHA DEL ULTIMO PAGO DE CESANTIA */
    SELECT MAX(N.nomi_feccausa+1) FROM NOMINA N, NOMINA_CONCEPTOS NC
        WHERE N.nomi_id = NC.nomi_id AND NC.terc_nit = :nitempl AND nc.conc_cod = 951
        AND NC.noco_deduc = 'N' AND NC.noco_aporte = 'N' AND NC.noco_prov = 'N'
        INTO :fecces;
    if (fecces IS NULL) then
        begin
        select nosi_fecces+1 from nomina_saldini e where terc_nit = :nitempl into :fecces;
        if (fecces IS NULL) then
            FECCES = FECING;
        end
    if (FECCES < FECING) then
        FECCES = FECING;
    ANOINI = EXTRACT(YEAR FROM FECCES);
    if (ANOINI < ANOFIN) then
        begin
        /* liquide las del ano pasado y luego las de este ano */
        EXECUTE PROCEDURE SALARIO_PROMEDIO (:nitempl, CAST(:anoini || '/12/31' AS DATE), 'C') returning_values (:salarioc);
        EXECUTE PROCEDURE calcula_cesantia(:nitempl, :salarioc, CAST(:anoini || '/12/31' AS DATE), :fecces) returning_values (:cesantia, :intcesant);
        EXECUTE PROCEDURE SALARIO_PROMEDIO (:nitempl, :fecliq, 'C') returning_values (:salarioc);
        EXECUTE PROCEDURE calcula_cesantia(:nitempl, :salarioc,  :fecliq, cast(:anofin || '/01/01' as date)) returning_values (:cesaux, :intcaux);
        cesantia = cesantia + cesaux;
        intcesant = intcesant + intcaux;
        end
    else
        if (ANOINI = ANOFIN) then
            begin
            EXECUTE PROCEDURE SALARIO_PROMEDIO (:nitempl, :fecliq, 'C') returning_values (:salarioc);
            EXECUTE PROCEDURE calcula_cesantia(:nitempl, :salarioc,  :fecliq, :fecces) returning_values (:cesantia, :intcesant);
            end
         else
            begin
            cesantia = 0;
            intcesant = 0;
            end
    /* INTERESES */
    /* CALCULE FECHA DEL ULTIMO PAGO DE CESANTIA */
    SELECT MAX(N.nomi_feccausa+1) FROM NOMINA N, NOMINA_CONCEPTOS NC
        WHERE N.nomi_id = NC.nomi_id AND NC.terc_nit = :nitempl AND nc.conc_cod = 968
        AND NC.noco_deduc = 'N' AND NC.noco_aporte = 'N' AND NC.noco_prov = 'N'
        INTO :fecint;
    if (fecint IS NULL) then
        begin
        select nosi_fecces+1 from nomina_saldini e where terc_nit = :nitempl into :fecint;
        if (fecing IS NULL) then
            fecint = FECING;
        end
    if (fecint < FECING) then
        fecint = FECING;
    ANOINI = EXTRACT(YEAR FROM FECINT);
    if (FECINT <> FECCES) then
        BEGIN
        if (ANOINI < ANOFIN) then
            begin
            /* liquide las del ano pasado y luego las de este ano */
            EXECUTE PROCEDURE SALARIO_PROMEDIO (:nitempl, CAST(:anoini || '/12/31' AS DATE), 'C') returning_values (:salarioi);
            EXECUTE PROCEDURE calcula_cesantia(:nitempl, :salarioi, CAST(:anoini || '/12/31' AS DATE), :fecint) returning_values (:cesaux, :intcesant);
            EXECUTE PROCEDURE SALARIO_PROMEDIO (:nitempl, :fecliq, 'C') returning_values (:salarioi);
            EXECUTE PROCEDURE calcula_cesantia(:nitempl, :salarioi,  :fecliq, cast(:anofin || '/01/01' as date)) returning_values (:cesaux, :intcaux);
            intcesant = intcesant + intcaux;
            end
        else
            if (ANOINI = ANOFIN) then
                begin
                EXECUTE PROCEDURE SALARIO_PROMEDIO (:nitempl, :fecliq, 'C') returning_values (:salarioi);
                EXECUTE PROCEDURE calcula_cesantia(:nitempl, :salarioi,  :fecliq, :fecces) returning_values (:cesaux, :intcesant);
                end
        END
    END
else
    begin
    SALARIOC = 0;
    cesantia = 0;
    INTCESANT = 0;
    end
execute procedure REDONDEE(:salarioc, :APROX) returning_values (salarioc);
execute procedure REDONDEE(:cesantia, :APROX) returning_values (cesantia);
execute procedure REDONDEE(:intcesant, :APROX) returning_values (intcesant);
suspend;
end^


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^


ALTER PROCEDURE CAMBIA_CLIENTE (
    ANTES VARCHAR(20),
    NUEVO VARCHAR(20))
RETURNS (
    TIPODOC INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
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^


ALTER PROCEDURE CAMBIA_CTAS_ARTI (
    ARTI_INI VARCHAR(15),
    ARTI_FIN VARCHAR(15))
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 ARTI CHAR(15);
declare variable GRUPO CHAR(2);
declare variable TARIFA INTEGER;
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
FOR SELECT ARTI_COD,GRUP_COD,TAIV_COD FROM articulo WHERE ARTI_COD >= :ARTI_INI AND ARTI_COD <= :ARTI_FIN
    INTO :ARTI, :GRUPO, :TARIFA
    DO
    BEGIN
     if (GRUP_TIVA = 'GRUPOS') then
      BEGIN
       SELECT GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS
        FROM GRUPO G
         WHERE GRUP_COD = :GRUPO
         into :INV, :IVAC, :IVAV, :VTA, :COSTO;
         update CONTABIL_ARTICULO
         SET COAR_CTAINV = :INV,
             COAR_CTAIVAC = :IVAC,
             COAR_CTAIVAV = :IVAV,
             COAR_CTAVNT = :VTA,
             COAR_CTACOS = :COSTO
          WHERE ARTI_COD = :ARTI;
      END
     if (GRUP_TIVA = 'TARIFA IVA') then
      BEGIN
       SELECT TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO
        FROM TARIFA_IVA T
         WHERE TAIV_COD = :TARIFA
         into :INV, :IVAC, :IVAV, :VTA, :COSTO;
         update CONTABIL_ARTICULO
         SET COAR_CTAINV = :INV,
             COAR_CTAIVAC = :IVAC,
             COAR_CTAIVAV = :IVAV,
             COAR_CTAVNT = :VTA,
             COAR_CTACOS = :COSTO
          WHERE ARTI_COD = :ARTI;
      END
     suspend;
    END
end^


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^


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


ALTER PROCEDURE CAMBIA_CUENTA_BANCO_CONTA (
    CUENTABCO INTEGER,
    CTACONTABLE VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    TIPO INTEGER,
    CONSEC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8))
AS
declare variable CTABANCO VARCHAR(20);
begin
SELECT  CUBA_CTACONTA FROM CUENTAS_BANCO where CUBA_COD = :cuentabco INTO :CTABANCO;

FOR SELECT MOBA_IDREF, MOBA_TIPOREF FROM MOVIMIENTO_BANCO
    where CUBA_COD = :cuentabco AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN
    INTO :ID, :TIPO
    DO
    BEGIN
    CONSEC = 0;
    SELECT ENCO_CONSEC, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA FROM comprobante_encabezado
        WHERE ENCO_TIPOREF = :TIPO AND ENCO_IDREF = :ID INTO :CONSEC, :pref, :numero, :fecha;
    IF (CONSEC <> 0) THEN
        BEGIN
        update COMPROBANTE_DETALLE SET CUEN_COD = :ctabanco WHERE ENCO_CONSEC = :CONSEC AND CUEN_COD = :ctacontable;
        suspend;
        END
    END
end^


ALTER PROCEDURE CAMBIA_IVA (
    ARTICULO VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    IVAMONTO NUMERIC(18,2))
AS
begin
FOR SELECT F.FACT_ID, D.fade_item, D.fade_ivamonto FROM FACTURAS F, FACTURAS_DETALLE D
    WHERE F.fact_id = D.fact_id AND F.fact_fecha >= :fecini AND F.fact_fecha <= :FECFIN AND D.arti_cod = :ARTICULO
    INTO :ID, :ITEM, :IVAMONTO
    DO
    BEGIN
    UPDATE facturas SET FACT_IVAMONTO = FACT_IVAMONTO - :IVAMONTO WHERE FACT_ID = :ID;
    UPDATE FACTURAS_DETALLE SET FADE_IVAMONTO = 0 WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM;
    suspend;
    END
end^


ALTER PROCEDURE CAMBIA_TIVA (
    TANT INTEGER,
    TNUE INTEGER,
    PRECIOS CHAR(1),
    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 SUBGR VARCHAR(3);
declare variable MARCA VARCHAR(3);
begin
/* BORRE E INSERTE LA LISTA POR SI NO EXISTE */
FOR SELECT ARTI_COD, MARC_COD, SUBG_COD FROM ARTICULO A
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND GRUP_COD >= :GRPINI AND GRUP_COD <= :GRPFIN AND
        TAIV_COD = :TANT
    ORDER BY ARTI_COD INTO :COD, :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
        UPDATE ARTICULO SET TAIV_COD = :tnue,  ARTI_CAMBPRECIVA = :PRECIOS
            WHERE ARTI_COD = :COD;
        END
    END
end^


ALTER PROCEDURE CAMBIE_ID_AJUSTEINV
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_ajusteinv, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM ajustes WHERE AJUS_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_AJUSTESINF
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_ajusteinf, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM ajustes_inflacion WHERE AJUS_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_ANTICLIE
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_anticlie, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_ANTIPROV
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_ANTICIPO_PROVEEDOR, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM anticipos_proveedor WHERE ANPR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_APLICLIE
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_aplicaclie, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM aplicacion_cliente WHERE APCL_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_APLIPROV
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_aplicaprov, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM aplicacion_provedor WHERE APPR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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


ALTER PROCEDURE CAMBIE_ID_AUTOCART
RETURNS (
    ID INTEGER)
AS
begin
ID = GEN_ID(id_autocart, 1);
SUSPEND;
end^


ALTER PROCEDURE CAMBIE_ID_CAMBART
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_cambart, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM cambio_articulos WHERE CAAR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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^


ALTER PROCEDURE CAMBIE_ID_CAMBDOCU
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_CAMBIODOC, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM cambio_documentos WHERE CADO_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_CAMPANA
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_campana, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM crm_campana WHERE CRCM_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_CHEQUE
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_CHEQUES, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM cheques WHERE CHEQ_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_CIERANUAL
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_cieranual, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM cierre_anual WHERE CIAN_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_CIERTERC
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_cierterc, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM cierre_terceros WHERE CITE_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_COMPRAS
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_FACTCOMP, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM facturas_compra WHERE FACO_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_COMPROBA
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_COMPROBA, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM comprobante_encabezado WHERE ENCO_CONSEC = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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^


ALTER PROCEDURE CAMBIE_ID_CONFIRMDEPOS
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_confirmdepos, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM CONFIRMACION_DEPOSITO WHERE CODE_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_CONS
RETURNS (
    ID INTEGER)
AS
begin
ID = GEN_ID(ID_CONS, 1);
suspend;
end^


ALTER PROCEDURE CAMBIE_ID_CONSIGNA
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_consigna, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM CONSIGNA WHERE CONS_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_CONSIGNATAR
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_consignatar, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM consigna_tarjetas WHERE COTJ_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_CONSNOMINA
RETURNS (
    ID INTEGER)
AS
begin
ID = GEN_ID(id_consnomina, 1);
suspend;
end^


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


ALTER PROCEDURE CAMBIE_ID_CONSUMO
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_CONSUMOS, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM consumos WHERE CONS_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_COTICOMP
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_COTIPROV, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM cotizacion_proveedor WHERE COPR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_COTIWEB
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_cotiweb, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM cotizacion_web WHERE COWE_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_COTIZACI
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_COTIZACI, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM cotizaciones WHERE COTI_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_CUENTA_BANCO
RETURNS (
    ID INTEGER)
AS
BEGIN
ID = GEN_ID(ID_CUENTA_BANCO, 1);
SUSPEND;
END^


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


ALTER PROCEDURE CAMBIE_ID_DESENSAMBLE
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_desensamble, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM desensambles WHERE DESE_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_DETCART
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_detcart, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM deterioro_cartera_enc WHERE DECA_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_DEV_CHEQUES
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_devolucion_cheques, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM devolucion_cheques WHERE DVCH_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_DEVOLCLIE
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_DEVOLCLI, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_DEVOLPROV
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_DEVOLPROV, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM devoluciones_compras WHERE DVCO_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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^


ALTER PROCEDURE CAMBIE_ID_EGRESO
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_egresos, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM EGRESOS WHERE EGRE_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_ENSAMBLE
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_ensamble, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM ensambles WHERE ENSA_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_ENTRADA
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_ENTRADA, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM entradas WHERE ENTR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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


ALTER PROCEDURE CAMBIE_ID_ENVIO
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_envio, 1);
    /* VERIFIQUE SI YA EXISTE */
    select count(*) from envio_auto where ENVA_ID = :ID into :NUMROWS;
    end
suspend;
end^


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^


ALTER PROCEDURE CAMBIE_ID_FACTCONT
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_FACTCONT, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM facturas_contado WHERE FCNT_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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^


ALTER PROCEDURE CAMBIE_ID_FACTURA
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_FACTURA, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM facturas WHERE FACT_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_FACWEB
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_facweb, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM factura_web WHERE FACW_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_GASTOIMP
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_gastoimp, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM gastos_importacion WHERE GAIN_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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^


ALTER PROCEDURE CAMBIE_ID_IMPORTA
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_importa, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM importacion WHERE IMPO_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_INTERBANCO
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = GEN_ID(id_interbanco, 1);
  SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_INTERCAJA
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = GEN_ID(id_intercaja, 1);
  SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_INTERCARTERA
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = GEN_ID(id_intercartera, 1);
  SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_INTERCMP
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = GEN_ID(id_intercmp, 1);
  SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_INTERCOMPRA
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = GEN_ID(id_intercompra, 1);
  SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_INTERCXPAGAR
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = GEN_ID(id_intercxpagar, 1);
  SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_INTERTRA
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = GEN_ID(id_intertra, 1);
  SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_INTERVTA
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = GEN_ID(id_intervta, 1);
  SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_INTINVENTARIO
RETURNS (
    ID INTEGER)
AS
BEGIN
  ID = GEN_ID(id_interfaz_inventario, 1);
  SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_LIQRUTA
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_liqruta, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM liquidacion_ruta_colegio WHERE LIQR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_LIQUIDACION
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_liquidacion, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM LIQUIDACION WHERE LIQD_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_MANIFIESTO
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_manifiesto, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM manifiesto_carga WHERE MANC_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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


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 PROCEDURE CAMBIE_ID_NOTA_CR_BANCO
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_NOTAS_CREDITO_BANCO, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM notas_credito WHERE NCBC_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_NOTA_DB_BANCO
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_NOTAS_DEBITO_BANCO, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM notas_debito WHERE NDBC_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_NOTACRCLIE
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_notacrcli, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM notas_credito_clientes WHERE NCCL_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_NOTACRPROV
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_notacrprov, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM notas_credito_proveedor WHERE NCPR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_NOTADBCLIE
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_notadbcli, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM notas_debito_clientes WHERE NDCL_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_NOTADBPROV
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_notadbprov, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM notas_debito_proveedor WHERE NDPR_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_ORDEMBARQUE
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_ordembar, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM ORDEN_EMBARQUE WHERE OREM_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_ORDENCOMP
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_ordencomp, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM ordenes_compra WHERE ORDC_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_ORDENMCIA
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_ORDENMCIA, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM ordenes_inventario WHERE ORIN_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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^


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_PEDIDO
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_PEDIDO, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM PEDIDOS WHERE PEDI_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_PEDWEB
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_pedweb, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM pedido_web WHERE PEWE_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_PENDIENTE
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_pendiente, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM pendiente_ventas WHERE PEND_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_PLANILLAP
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_planillap, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM planilla_pasajeros WHERE PLPA_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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^


ALTER PROCEDURE CAMBIE_ID_PLANTILLA
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_plantilla, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM plantilla_encabezado WHERE PLAN_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 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^


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^


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^


ALTER PROCEDURE CAMBIE_ID_RECICAJA
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_RECICAJA, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM recibos_caja WHERE RECA_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_RECIPROV
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_RECIPROV, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM recibo_provisional WHERE RCPR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_REDIPTOS
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_puntos, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM puntos_redencion WHERE PTRE_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_REDPTOSV
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_redptosv, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM puntos_vend_redencion WHERE PTVR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_REMESAC
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_remesac, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM carga_remesa WHERE CGRM_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_REMICLIE
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_REMICLIE, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM remisiones_venta WHERE REVT_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_REMIPROV
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_REMIPROV, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM remision_proveedor WHERE REPR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_RESERVA
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_RESERVA, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM RESERVAS WHERE RESE_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_RETIRO
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_RETIROS, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM retiros WHERE RETI_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


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^


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^


ALTER PROCEDURE CAMBIE_ID_SALIDA
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_SALIDA, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM SALIDAS WHERE SALI_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_SOLIMP
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_solimp, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM SOLICITUD_IMPORTACION WHERE SLIM_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_TIQUETE
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_tiquetep, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM tiquete_pasajero WHERE TIQP_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_TRANSFER
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_TRANSFER, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM trasferencias WHERE TRAN_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_TRASLACAJA
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_traslacaja, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM traslados_caja WHERE TRCJ_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_TRASLADO
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_traslados, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM traslados WHERE TRAS_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^


ALTER PROCEDURE CAMBIE_ID_VACACION
RETURNS (
    IDN INTEGER)
AS
begin
  IDN = GEN_ID(id_vacaciones, 1);
  suspend;
end^


ALTER PROCEDURE CAMBIE_IDNOTADOC
RETURNS (
    ID INTEGER)
AS
begin
ID = GEN_ID(id_notadoc, 1);
SUSPEND;
end^


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
    fecha = anon || fecha;
/*    update comprobante_encabezado set enco_fecha = :anoa || :fecha where enco_consec = :id; */
    suspend;
    end
end^


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^


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^


ALTER PROCEDURE CAMBIO_PRECIOS_IVA (
    FECINI DATE,
    FECFIN DATE,
    LISTA INTEGER,
    IVAANT NUMERIC(18,2),
    IVANUE NUMERIC(18,2))
RETURNS (
    ARTICULO VARCHAR(20),
    PRECIOANT NUMERIC(18,2),
    PRECIONUE NUMERIC(18,2))
AS
declare variable ivainc char(1);
declare variable redon integer;
begin
select lipr_modif from lista_precios where lipr_cod = :lista into :ivainc;
if (ivainc = 'S') then
    for select p.arti_cod, prar_fijo, prar_redon from precios_articulo p, articulo a, tarifa_iva t
        where lipr_cod = :lista and p.arti_cod = a.arti_cod and a.taiv_cod = t.taiv_cod and t.taiv_porc = :ivanue
        into :articulo, :precioant, :redon
        do
        begin
        precionue = precioant / (1 + :ivaant/100);
        precionue = precionue * (1 + :ivanue/100);
        execute procedure redondee(precionue, redon) returning_values (precionue);
        update precios_articulo set prar_fijo = :precionue
            where arti_cod = :articulo and lipr_cod = :lista;
        suspend;
        end
end^


ALTER PROCEDURE CAMBIO_TARIFA_IVA (
    FECINI DATE,
    FECFIN DATE,
    TARIFANT INTEGER,
    TARIFNUE INTEGER)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    TARIFA NUMERIC(18,2))
AS
declare variable EXISTE char(1);
begin
SELECT 'S'FROM TARIFA_IVA WHERE TAIV_COD = :tarifnue INTO :EXISTE;
if (EXISTE = 'S') then
    for select arti_cod, ARTI_DES from articulo a
        where a.taiv_cod = :tarifant
        into :articulo, :descripcion
        do
        begin
        update ARTICULO set TAIV_COD = :tarifnue
            where arti_cod = :articulo;
        SELECT TAIV_PORC FROM TARIFA_IVA T, ARTICULO A WHERE A.taiv_cod = T.taiv_cod AND A.arti_cod = :articulo INTO :TARIFA;
        suspend;
        end
end^


ALTER PROCEDURE CAMBIOS_PATRIMONIO (
    ANO CHAR(4))
RETURNS (
    CONCEPTO VARCHAR(60),
    CTA31 NUMERIC(18,2),
    CTA32 NUMERIC(18,2),
    CTA33 NUMERIC(18,2),
    CTA34 NUMERIC(18,2),
    CTA35 NUMERIC(18,2),
    CTA36 NUMERIC(18,2),
    CTA38 NUMERIC(18,2),
    TOTALMOV NUMERIC(18,2),
    SAL31 NUMERIC(18,2),
    SAL32 NUMERIC(18,2),
    SAL33 NUMERIC(18,2),
    SAL34 NUMERIC(18,2),
    SAL35 NUMERIC(18,2),
    SAL36 NUMERIC(18,2),
    SAL38 NUMERIC(18,2),
    TOTALSAL NUMERIC(18,2),
    OK CHAR(1))
AS
declare variable debitos numeric(18,2);
declare variable creditos numeric(18,2);
declare variable idcomp Integer;
declare variable idprov integer;
declare variable primera char(1);
declare variable cuenta varchar(20);
BEGIN
  /* resumen de movimientos netos del aÃ±o por cuenta */
  primera = 'S';
  OK = 'S';
  /* traiga los saldos iniciales */
  execute procedure saldo_cuenta_mes('31', ano, 1, 'S') returning_values sal31;
  execute procedure saldo_cuenta_mes('32', ano, 1, 'S') returning_values sal32;
  execute procedure saldo_cuenta_mes('33', ano, 1, 'S') returning_values sal33;
  execute procedure saldo_cuenta_mes('34', ano, 1, 'S') returning_values sal34;
  execute procedure saldo_cuenta_mes('35', ano, 1, 'S') returning_values sal35;
  execute procedure saldo_cuenta_mes('36', ano, 1, 'S') returning_values sal36;
  execute procedure saldo_cuenta_mes('38', ano, 1, 'S') returning_values sal38;
  
  TOTALSAL = SAL31 + SAL32 + SAL33 + SAL34 + SAL35 + SAL36 + SAL38;
  
  for select e.enco_consec, cuen_cod, code_concepto, code_debito, code_credito
    from comprobante_detalle d, comprobante_encabezado e
    where e.enco_consec = d.enco_consec and cuen_cod > '3' and cuen_cod < '4' and substr(enco_fecha, 1, 4) = :ano
    order by e.enco_consec
    into :idcomp, :cuenta, :concepto, :debitos, :creditos
    Do
      begin
      if ((primera = 'N') and (idprov <> idcomp)) then
        begin
        suspend;
        cta31 = 0;
        cta32 = 0;
        cta33 = 0;
        cta34 = 0;
        cta35 = 0;
        cta36 = 0;
        cta38 = 0;
        end
      if (substr(cuenta, 1, 2) = '31') then
        begin
        cta31 = cta31 + debitos - creditos;
        sal31 = sal31 + debitos - creditos;
        end
      if (substr(cuenta, 1, 2) = '32') then
        begin
        cta32 = cta32 + debitos - creditos;
        sal32 = sal32 + debitos - creditos;
        end
      if (substr(cuenta, 1, 2) = '33') then
        begin
        cta33 = cta33 + debitos - creditos;
        sal33 = sal33 + debitos - creditos;
        end
      if (substr(cuenta, 1, 2) = '34') then
        begin
        cta34 = cta34 + debitos - creditos;
        sal34 = sal34 + debitos - creditos;
        end
      if (substr(cuenta, 1, 2) = '35') then
        begin
        cta35 = cta35 + debitos - creditos;
        sal35 = sal35 + debitos - creditos;
        end
      if (substr(cuenta, 1, 2) = '36') then
        begin
        cta36 = cta36 + debitos - creditos;
        sal36 = sal36 + debitos - creditos;
        end
      if (substr(cuenta, 1, 2) = '38') then
        begin
        cta38 = cta38 + debitos - creditos;
        sal38 = sal38 + debitos - creditos;
        end
      TOTALMOV = CTA31 + CTA32 + CTA33 + CTA34 + CTA35 + CTA36 + CTA38;
      TOTALSAL = SAL31 + SAL32 + SAL33 + SAL34 + SAL35 + SAL36 + SAL38;
      primera = 'N';
      idprov = idcomp;
      end
  SUSPEND;
END^


ALTER PROCEDURE CAMBIOS_SITUACION (
    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),
    TOTAL5 NUMERIC(18,2),
    NOMSECCION VARCHAR(120))
AS
declare variable CODCUEN VARCHAR(20);
declare variable DB CHAR(1);
declare variable LON INTEGER;
BEGIN
  /* SECCION 1: CAPITAL OPERATIVO */
  SUMA = 0;
  NOMSECCION = 'Capital de trabajo obtenido de opraciones';
  SECCION = 1;
  FOR SELECT CASI_CUENTA, CASI_DB, CUEN_NOM
    FROM CAMBIO_SITUACION S, CUENTAS C
    WHERE S.CASI_CUENTA = C.CUEN_COD AND CASI_SECCION = 1
    ORDER BY CASI_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;
      SUMA = SUMA + FINAL;
      SUSPEND;
      END
  /* SECCION 2: PARTIDAS NO MONETARIAS */
  NOMSECCION = 'MÃ¡s (menos) partidas que no afectan el capital de trabajo';
  SECCION = 2;
  FOR SELECT CASI_CUENTA, CASI_DB, CUEN_NOM
    FROM CAMBIO_SITUACION S, CUENTAS C
    WHERE S.CASI_CUENTA = C.CUEN_COD AND CASI_SECCION = 2
    ORDER BY CASI_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;
      SUMA = SUMA + FINAL;
      SUSPEND;
      END
  TOTAL2 = SUMA;
  SUMA = 0;
  /* SECCION 3: OTROS INGRESOS DE CAPITAL */
  NOMSECCION = 'Capital de trabajo obtenido de otras fuentes';
  SECCION = 3;
  FOR SELECT CASI_CUENTA, CASI_DB, CUEN_NOM
    FROM CAMBIO_SITUACION S, CUENTAS C
    WHERE S.CASI_CUENTA = C.CUEN_COD AND CASI_SECCION = 3
    ORDER BY CASI_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 (final < 0) then
        BEGIN
        final = ABS(FINAL);
        SUMA = SUMA + FINAL;
        SUSPEND;
        END
      END
  TOTAL3 = SUMA;
  SUMA = 0;
  /* SECCION 4: CAPITAL UTILIZADO */
  NOMSECCION = 'Capital de trabajo utilizado';
  SECCION = 4;
  FOR SELECT CASI_CUENTA, CASI_DB, CUEN_NOM
    FROM CAMBIO_SITUACION S, CUENTAS C
    WHERE S.CASI_CUENTA = C.CUEN_COD AND CASI_SECCION = 3
    ORDER BY CASI_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 (final > 0) then
        BEGIN
        final = FINAL * -1;
        SUMA = SUMA + FINAL;
        SUSPEND;
        END
      END
  TOTAL4 = SUMA;
  SUMA = 0;
  
  /* SECCION 5: CAMBIOS EN LOS COMPONENTES */
  NOMSECCION = 'Cambios en los componentes de capital de trabajo';
  SECCION = 5;
  FOR SELECT CASI_CUENTA, CASI_DB, CUEN_NOM
    FROM CAMBIO_SITUACION S, CUENTAS C
    WHERE S.CASI_CUENTA = C.CUEN_COD AND CASI_SECCION = 3
    ORDER BY CASI_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;
      TOTAL5 = TOTAL5 + FINAL;
      SUSPEND;
      END
END^


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

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

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

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


ALTER PROCEDURE CANTIDAD_POR_FACTOR (
    CODIGO VARCHAR(15),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8))
RETURNS (
    CANTFAC NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
BEGIN
  SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :CODIGO INTO :UND;
  if (UND = UNIDAD) then
    CANTFAC = CANTIDAD;
  ELSE
    begin
    FACTOR = 0;
    SELECT UNAR_FACCAN FROM UNIDAD_ARTICULO WHERE ARTI_COD = :CODIGO AND UNAR_UNIDAD = :UNIDAD INTO :FACTOR;
    if (:FACTOR <> 0) then
        CANTFAC = CANTIDAD * FACTOR;
    ELSE
        EXCEPTION UNIDAD_NO_REGISTRADA 'LA UNIDAD ' || :UNIDAD || ' NO ESTA REGISTRADA CON EL ARTICULO ' || :CODIGO;
    END
  SUSPEND;
END^


ALTER PROCEDURE CARTERA_CLIENTE (
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10),
    MONEDA INTEGER,
    SOLOPESOS CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    CODSUC VARCHAR(10),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    COBR INTEGER,
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    VENCE DATE,
    FECDOC DATE,
    DIAS INTEGER,
    RECPROV_ID INTEGER,
    RECIPROV CHAR(1),
    NOTA VARCHAR(256),
    TRMDOC NUMERIC(18,2))
AS
declare variable fec date;
declare variable desc_rtes char(2);
declare variable dtoapl numeric(18,2);
declare variable trmrec numeric(18,2);
declare variable idnota integer;
declare variable autoret varchar(10);
declare variable fautoret date;
declare variable autorcree varchar(10);
declare variable fautorcree date;
declare variable diascont integer;
declare variable cartxage char(2);
declare variable vencimiento varchar(12);
declare variable adminis char(1);
declare variable acceso char(1);
begin
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA') returning_values (VENCIMIENTO);
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = cast(AUTORET as date);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'NUMERO DE DIAS PARA CONSULTA DE CARTERA DE CLIENTES DE CONTADO') returning_values (:diascont);

execute procedure LEE_CONFIGURACION('CARTERA', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA') returning_values (:cartxage);
if (CARTXAGE = 'NO') then
    AGENCIA = 0;
if ((DIASCONT <> 0) and (not exists (select ptvt_id from punto_venta where terc_nit = :nit))) then
    DIASCONT = 0;
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
/* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
for select MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM, COBR_COD, MVCL_SUCURSAL
  from MOVIMIENTO_CLIENTES
  where TERC_NIT = :NIT and ((mvcl_sucursal = :sucursal) or (:SUCURSAL = '0'))  and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and
    ((:MONEDA = 0) or (MVCL_TRM <> 1)) and ((MVCL_FECHA >= (:FECHA - :DIASCONT)) or (:DIASCONT = 0)) and
    ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA) or (SUCU_ID = 0))
  order by MVCL_FECHA, MVCL_ID
  into :TIPO, :ID, :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC, :COBR, :CODSUC
  do
    BEGIN
    if (VENCIMIENTO = 'FECHA') then
        DIAS = FECHA - FECDOC;
    ELSE
        BEGIN
        DIAS = FECHA - VENCE;
        if ((TIPO = 31) AND (VENCIMIENTO = 'ENTREGA')) THEN
            BEGIN
            SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
            DIAS = FECHA - VENCE;
            END
        END
    execute procedure saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        begin
        select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
        if (TIPO = 41) then
            select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
        if (TIPO = 42) then
            select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
        if (TIPO = 45) then
            select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
        if (TIPO = 31) then
            select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
        if (TIPO = 33) then
            select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;
        if ((MONEDA <> 0) and (TRMDOC <> 0)) then
            DTOF = DTOF / TRMDOC;

        /* POR WILLIAM IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
        recprov_id = 0;
        select max(d.RCPR_ID) from recibo_provisional_detalle d, recibo_provisional r
            where r.rcpr_id = d.rcpr_id and RPDE_IDDOC = :id  and RPDE_TIPODOC = :TIPO and RPDE_TIPODOC = :TIPO and
            RPDE_ANULADO = 'N' and r.rcpr_idcruce = 0 into :recprov_id;
        if (recprov_id is null) then
           begin
           reciprov = 'N';
           end 
        else
          begin 
           reciprov = 'S';
          end
        /*FIN WILLIAM*/
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF is null) then
            DTOF = 0;
        if (DTOF <> 0) then
            begin
            select sum(RCDE_DTOF), max(RECA_TRM) from RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO and RECA_ANULADO = 'N'
                into :DTOAPL, :TRMREC;
            if (DTOAPL is null) then
                DTOAPL = 0;
            if ((MONEDA <> 0) and (TRMREC <> 0)) then
                DTOAPL = DTOAPL / TRMREC;
            DTOF = DTOF - DTOAPL;
            end
        if (MONEDA = 0) then
            select sum(SDCA_RTFTE - SDCA_ABRTFTE), sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA), sum(SDCA_RCREE - SDCA_ABRCREE)
                from SALDOS_DOC_CARTERA where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :ID
                into :RTFTE, :RTIVA, :RTICA, :RCREE;
        else
            select sum((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), sum((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM), sum((SDCA_RCREE - SDCA_ABRCREE)/SDCA_TRM)
                from SALDOS_DOC_CARTERA where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :ID
                into :RTFTE, :RTIVA, :RTICA, :RCREE;
        if (RTFTE is null) then
            RTFTE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RTFTE > 0) then
                RTFTE = 0;
            end
        else
            begin
            if (RTFTE < 0) then
                RTFTE = 0;
            end

        if (RTIVA is null) then
            RTIVA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RTIVA > 0) then
                RTIVA = 0;
            end
        else
            begin
            if (RTIVA < 0) then
                RTIVA = 0;
            end

        if (RTICA is null) then
            RTICA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RTICA > 0) then
                RTICA = 0;
            end
        else
            begin
            if (RTICA < 0) then
                RTICA = 0;
            end

        if (RCREE is null) then
            RCREE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RCREE > 0) then
                RCREE = 0;
            end
        else
            begin
            if (RCREE < 0) then
                RCREE = 0;
            end

        if (FAUTORET <= FECDOC) then
            begin
            RTFTE = 0;
            RTIVA = 0;
            RTICA = 0;
            end
        if (FAUTORCREE <= FECDOC) then
            RCREE = 0;
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA - RCREE;
        /* SI TIENE NOTA AGREGUELA */
        select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and ((CLSU_COD = :SUCURSAL) or (:SUCURSAL = '0')) and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
        if (IDNOTA is not null) then
            select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
        else
            NOTA = '';
        if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
            suspend;
        end
    END
end^


ALTER PROCEDURE CARTERA_CLIENTES_OFFLINE (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    COBINI INTEGER,
    COBFIN INTEGER,
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    HOY CHAR(1),
    MONEDA INTEGER,
    VEND 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(3),
    NOMZONA VARCHAR(60),
    NOMSUBZ VARCHAR(60),
    NOMCANA VARCHAR(60),
    NOMSUBC VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    DIASBL INTEGER,
    RESALTAR CHAR(1),
    INSTCART VARCHAR(255),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    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 AUTORET varchar(10);
declare variable FAUTORET date;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable INCLANTI char(2);
declare variable TRM numeric(18,2);
declare variable DB char(1);
begin
if (ORDEN = 'C') then
    begin
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    end
else
    begin
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    end
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA') returning_values (FOV);
if (AUTORET <> '') then
    FAUTORET = cast(AUTORET as date);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
  /* Ubique el NIT */
for select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIASBLOQ,
    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))
        and c.vend_cod = :vend
    into :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIASBL,
    :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :resaltar, INSTCART, :mailcart
    do
    begin
    EXECUTE PROCEDURE NOMBRE_ASCII(NOMBRE) returning_values (NOMBRE);
    DISPONIBLE = CUPO;
    OK = 'N';
    if ((AGRUPA = 'Z') or (AGRUPA = 'N'))  then
        begin
        if (GRPINI = '') then
            begin
            if (grpfin = 'zz') then
                OK = 'S';
            else
                if ((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 (OK = 'S') then
        begin
        if (CODCOBR is not null) then
            select COBR_NOM from COBRADORES  where COBR_COD = :CODCOBR into :NOMCOBR;
        NOMZONA = '';
        NOMSUBZ = '';
        if (CODZONA is not null) then
            begin
            select ZONA_NOM from ZONAS where ZONA_COD = :CODZONA into :NOMZONA;
            end
        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;
        nomcana = '';
        nomsubc = '';
        /* 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, 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 ((:MONEDA = 0) or (MVCL_TRM <> 1))
            into :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB, :codcobr
            do
            begin
            if ((HOY = 'S') or (FECDOC < FECHA))  then
              BEGIN
              EXECUTE PROCEDURE NOMBRE_ASCII(:CONCEPTO) returning_values (:CONCEPTO);
              OK = 'S';
              if ((COBINI <> 0) or (COBFIN <> 999999999)) then
                if ((codcobr < :COBINI) or (codcobr > :COBFIN)) then
                    OK = 'N';
              if (OK = 'S') then
                begin
                if (DB = 'N') then
                    MONTO = MONTO * -1;
                if ((inclanti = 'SI') or (TIPO <> 45)) then
                    begin
                    execute procedure saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                    if (SALDO <> 0) then
                        begin
                        PROVISIONAL = 0;
                        if (FOV = 'FECHA') then
                           DIAS = FECHA - FECDOC;
                        else
                            BEGIN
                            DIAS = FECHA - VENCE;
                            if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
                                BEGIN
                                SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                                DIAS = FECHA - VENCE;
                                END
                            END
                        DISPONIBLE = DISPONIBLE - SALDO;
                        select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
                        if (TIPO = 41) then
                            select NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM from NOTAS_DEBITO_CLIENTES
                                where NDCL_ID = :ID into :DTOF, :FECDTO, :TRM;
                        if (TIPO = 42) then
                            select 0, :FECDOC, 1 from NOTAS_CREDITO_CLIENTES
                                where NCCL_ID = :ID into :DTOF, :FECDTO, :TRM;
                        if (TIPO = 45) then
                            select ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM from ANTICIPOS_CLIENTE
                                where ANCL_ID = :ID into :DTOF, :FECDTO, :TRM;
                        if (TIPO = 31) then
                            select FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM from FACTURAS
                                where FACT_ID = :ID into :DTOF, :FECDTO, :TRM;
                        if (TIPO = 33) then
                            select 0, :FECDOC, 1 from devoluciones_ventas
                                where DEVT_ID = :ID into :DTOF, :FECDTO, :TRM;
                        if ((MONEDA <> 0) and (TRM <> 0)) then
                            DTOF = DTOF / TRM;
                        if (DTOF is null) then
                            DTOF = 0;
                        if (DTOF <> 0) then
                            begin
                            select sum(RCDE_DTOF), max(RECA_TRM) from RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                                where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO
                                into :DTOAPL, :TRM;
                            if (DTOAPL is null) then
                                DTOAPL = 0;
                            if ((MONEDA <> 0) and (TRM <> 1)) then
                                DTOAPL = DTOAPL / TRM;
                            DTOF = DTOF - DTOAPL;
                            /* SI YA SE VENCIO DEJELO EN CERO */
                            if (FECDTO < FECHA) then
                                DTOF = 0;
                            end
                        if (MONEDA = 0) then
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA), SUM(SDCA_RCREE - SDCA_ABRCREE)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                        ELSE
                            SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM), SUM((SDCA_RCREE - SDCA_ABRCREE)/SDCA_TRM)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                        if (RTFTE is null) then
                            RTFTE = 0;
                        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                            begin
                            if (RTFTE > 0) then
                                RTFTE = 0;
                            end
                        else
                            begin
                            if (RTFTE < 0) then
                                RTFTE = 0;
                            end
                        if (FAUTORET <= FECDOC) then
                            RTFTE = 0;
                        if (RTIVA is null) then
                            RTIVA = 0;
                        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                            begin
                            if (RTIVA > 0) then
                                RTIVA = 0;
                            end
                        else
                            begin
                            if (RTIVA < 0) then
                                RTIVA = 0;
                            end
                        if (RTICA is null) then
                            RTICA = 0;
                        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                            begin
                            if (RTICA > 0) then
                                RTICA = 0;
                            end
                        else
                            begin
                            if (RTICA < 0) then
                                RTICA = 0;
                            end
                        if (RCREE IS NULL) then
                            RCREE = 0;
                        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                            BEGIN
                            if (RCREE > 0) then
                                RCREE = 0;
                            END
                        ELSE
                            BEGIN
                            if (RCREE < 0) then
                                RCREE = 0;
                            END
                        if (fautorcree <= FECDOC) then
                            RCREE = 0;
                        /* SI TIENE NOTA AGREGUELA */
                        select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
                        if (IDNOTA is not null) then
                            begin
                            select cast(NOCL_FECHA as char(10)), NOCL_TEXTO from NOTAS_CLIENTES
                                where NOCL_ID = :IDNOTA into :FECNOTA, :AUXNOTA;
                            if (STRLEN(AUXNOTA) < 244) then
                                NOTA = FECNOTA || ':' || AUXNOTA;
                            else
                                NOTA = AUXNOTA;
                            end
                        else
                            NOTA = '';
                        suspend;
                        end  /* SALDO <> 0 */
                    end  /* NO ANTICIPO */
                end
              END /* HOY */
            end  /* FOR */
        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 ((CODCOBR >= :COBINI) AND (CODCOBR <= :COBFIN)) then
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                NOMZONA = '';
                NOMSUBZ = '';
                if (CODZONA is not null) then
                    begin
                    select ZONA_NOM from ZONAS where ZONA_COD = :CODZONA into :NOMZONA;
                    end
                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;
                select COBR_NOM from COBRADORES  where COBR_COD = :CODCOBR into :NOMCOBR;
                nomcana = '';
                nomsubc = '';
        
                /* 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 m where TERC_NIT = :NIT and MVCL_SUCURSAL = :SUCURSAL and MVCL_FECHA <= :FECHA and
                    MVCL_ABONO = 'N' and ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and
                    COBR_COD = :codcobr and ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    order by cobr_cod, mvcl_fecha, mvcl_id
                    into :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
                    do
                    begin
                    if ((HOY = 'S') or (FECDOC < FECHA))  then
                      BEGIN
                      EXECUTE PROCEDURE NOMBRE_ASCII(:CONCEPTO) returning_values (:CONCEPTO);
                      if (DB = 'N') then
                        MONTO = MONTO * -1;
                      if ((inclanti = 'SI') or (TIPO <> 45)) then
                        begin
                        execute procedure saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            begin
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            else
                                BEGIN
                                DIAS = FECHA - VENCE;
                                if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
                                    BEGIN
                                    SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                                    DIAS = FECHA - VENCE;
                                    END
                                END
                            DISPONIBLE = DISPONIBLE - SALDO;
                            select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
                            if (TIPO = 41) then
                                select NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM from NOTAS_DEBITO_CLIENTES
                                    where NDCL_ID = :ID into :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                select 0, :FECDOC, 1 from NOTAS_CREDITO_CLIENTES
                                    where NCCL_ID = :ID into :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                select ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM from ANTICIPOS_CLIENTE
                                    where ANCL_ID = :ID into :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                select FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM from FACTURAS
                                    where FACT_ID = :ID into :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                select 0, :FECDOC, 1 from devoluciones_ventas
                                    where DEVT_ID = :ID into :DTOF, :FECDTO, :TRM;
                            if (DTOF is null) then
                                DTOF = 0;
                            if ((MONEDA <> 0) and (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                begin
                                select sum(RCDE_DTOF) from RECIBOS_CAJA_DETALLE where RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO into :DTOAPL;
                                if (DTOAPL is null) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                end
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA), SUM(SDCA_RCREE - SDCA_ABRCREE)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                            if (RTFTE is null) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                                begin
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                end
                            else
                                begin
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                end
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA is null) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                                begin
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                end
                            else
                                begin
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                end
                            if (RTICA is null) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
                                begin
                                if (RTICA > 0) then
                                    RTICA = 0;
                                end
                            else
                                begin
                                if (RTICA < 0) then
                                    RTICA = 0;
                                end
                            if (RCREE IS NULL) then
                                RCREE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RCREE > 0) then
                                    RCREE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RCREE < 0) then
                                    RCREE = 0;
                                END
                            if (fautorcree <= FECDOC) then
                                RCREE = 0;
                            /* SI TIENE NOTA AGREGUELA */
                            select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
                            if (IDNOTA is not null) then
                                begin
                                select cast(NOCL_FECHA as char(10)), NOCL_TEXTO from NOTAS_CLIENTES
                                    where NOCL_ID = :IDNOTA into :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                else
                                    NOTA = AUXNOTA;
                                end
                            else
                                NOTA = '';
                            suspend;
                            end  /* SALDO <> 0 */
                        end  /* NO ANTICIPO */
                      END /* HOY */
                    end  /* FOR */
                END    /* ok */
            end /* FOR COBR */
        end  /* AGRUPA = C */
    end  /* FOR NIT */
end^


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


ALTER PROCEDURE CARTERA_TOTAL (
    FECHA DATE)
RETURNS (
    CARTERA NUMERIC(18,2))
AS
declare variable NIT VARCHAR(20);
declare variable SALDO NUMERIC(18,2);
begin
CARTERA = 0;
FOR SELECT TERC_NIT FROM TERCEROS T WHERE EXISTS (SELECT MVCL_ID FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = T.terc_nit)
    INTO :NIT
    DO
    BEGIN
    SELECT SUM(SALDO) FROM cartera_cliente(:NIT, :FECHA, 0, 0, 'N', 0) INTO :SALDO;
    if (saldo is null) then
        saldo = 0;
    CARTERA = CARTERA + SALDO;
    END
suspend;
end^


ALTER PROCEDURE CAUSA_DIFERENCIA_CAMBIO (
    FECHA DATE,
    TIPOCOMP VARCHAR(3),
    PREFCONT VARCHAR(4),
    NUMCONT VARCHAR(8),
    TRM NUMERIC(18,2),
    CTACARTERA VARCHAR(20))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE CAUSA_NOM1EMPLEADO (
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    NITE VARCHAR(20))
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
declare variable FEC DATE;
declare variable fecha date;
declare variable item integer;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montoemp 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_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 salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable basicoAUX numeric(18,2);
declare variable gtoempr char(1);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable aprox integer;
declare variable mensual char(1);
declare variable tomasal integer;
declare variable auxtrano numeric(18,2);
declare variable smlv numeric(18,2);
declare variable valorpredet numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable fecing date;
declare variable fecinge date;
declare variable fecret date;
declare variable CANT numeric(18,2);
declare variable FACSAL numeric(18,2);
declare variable MAXFS numeric(18,2);
declare variable benef char(1);
declare variable benpag char(1);
declare variable DIASPRIMA INTEGER;
declare variable BASE numeric(18,2);
declare variable PRESTAMO CHAR(1);
begin
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select first 1 N.NOMI_ID, N.nomi_feccausa
    from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO and NOMI_TIPO = 'N' into :IDNOMINA, :FEC;
select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA into :ITEM;
if (idnomina <> 0) then
    begin
    if (NOT EXISTS (SELECT NOCO_ITEM FROM nomina_conceptos WHERE NOMI_ID = :idnomina AND TERC_NIT = :nite)) then
        BEGIN
        DELETE FROM VALORES_NOMINA;
        execute procedure fecha_final_periodo_pago (:periodicidad, :ano, :periodo) returning_values (:FECHA);
        select P.PAAN_SALMINIMO, P.PAAN_AUXTR, P.paan_maxfs from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
            into :SMLV, :auxtrano, :maxfs;
        ITEMINI = ITEM;
        select E.empl_fecing, E.empl_facsal
            from EMPLEADOS E
            where E.terc_nit = :nite
            and not exists (select ND.NOMI_ID from nomina_detalle ND, NOMINA N where N.nomi_id = ND.nomi_id and ND.terc_nit = E.terc_nit
            and N.nomi_ano = :ano and N.nomi_periodo = :periodo and N.nomi_periodocidad = :periodicidad)
            into :fecinge, :facsal;
        if ((FACSAL IS NULL) or (FACSAL = 0))  then
            FACSAL = 100;
        if (FACSAL < MAXFS) then
            FACSAL = MAXFS;
        EXECUTE PROCEDURE empleado_activo(:NITE, :FECHA) returning_values (:FECING, :FECRET);
        if (fecing is null) then
            fecing = fecinge;
        if (((:FECRET is null) or (:FECRET > :FECHA)) and :FECING <= :FECHA) then
          BEGIN
          /* solo pagos y deducciones */
          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_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, CE.EMCO_TOMSAL, CN.conc_benefic, CN.CONC_BENPAG, CN.conc_prestamo
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and (CN.conc_activo = 'S') AND (CE.emco_activo = 'S') AND
            ( ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA) AND (((:periodicidad = 1) and (:PERIODO < 13)) or ((:periodicidad = 2) and (:PERIODO < 25)))) 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)))) )
            and conc_aporte = 'N' and conc_prov = 'N'
            order by TERC_NIT, CN.conc_cod
            into :NIT_TERCERO, :CONCEPT,  :MONTOEMP, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :TOMASAL, :benef, :BENPAG, :PRESTAMO
            do
            begin
            CANT = 0;
            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
            /* NO INCLUYA CONCEPTOS QUE NO SE CALCULAN POR DIAS, PREVIAMENTE PAGADOS EN EL PERIODO */
            if ((CONC_DIAS = 'S') or (NOT EXISTS (SELECT N.NOMI_ID FROM NOMINA N, NOMINA_CONCEPTOS NC WHERE
              N.nomi_id = NC.nomi_id AND N.nomi_ano = :ano AND N.nomi_periodo >= :perinicial AND N.nomi_periodo <= :perfinal
                AND NC.terc_nit = :NITE AND NC.conc_cod = :CONC_COD AND NC.noco_valor <> 0))) then
              BEGIN
              if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FECHA, :MENSUAL,:CONC_COD) returning_values (:DIASLAB);
              else
                select PPAG_DIAS from PERIODO_PAGO where PPAG_COD = :periodicidad into :diaslab;
    
              execute procedure ibc_empleado (:NITE, :ANO, :periodo, :conc_cod) returning_values (:BASICOEMP);
              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;
              BASICO = ((:BASICOEMP/30)*:DIASLAB) + :CAMBSALTRANS;
              if (:benef = 'S') then
                  BEGIN
                  BASICO = BASICO * (100 - :facsal) / 100;
                  if (benpag = 'V') then
                    begin
                    /* descuente auxilio transporte si lo hubo */
                    execute procedure salario_base_empleado (:NITE, :periodicidad, :ano, :periodo, :fec, 'S', :conc_cod) returning_values (:basicoaux);
                    basicoaux = basicoaux * FACSAL / 100;
                    if (((:basicoaux/30) < ((:SMLV/30)*2)) and (exists (select conc_cod from empleado_conceptos where terc_nit = :nite and (conc_cod = 955) or (conc_cod = 956) or (conc_cod = 957)))) Then
                        BASICO = BASICO - ((:AUXTRANO / 30) * :DIASLAB);
                    end
                  END
              else
                  BASICO = BASICO * :facsal / 100;
    
              if ((MENSUAL = 'S') and (: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 /* tomasal */
    
              if ((CONC_COD = 900) or (:CONC_COD = 931) or (:CONC_COD = 945) or (:CONC_COD = 1022) or -- EXTRAS DIURNAS
                 (CONC_COD = 1040) or (:CONC_COD = 1041) or (:CONC_COD = 1042) or (:CONC_COD = 1043) or -- NOCTURNAS
                 (CONC_COD = 1044) or (:CONC_COD = 1045) or (:CONC_COD = 1046) or (:CONC_COD = 1047) or -- FESTIVAS
                 (CONC_COD = 1048) or (:CONC_COD = 1049) or (:CONC_COD = 1050) or (:CONC_COD = 1051)) then /* horas extra */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(C.NOEX_MONTO), sum(c.noex_diur+c.noex_fdiur+c.noex_noct+c.noex_fnoct) 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
                         AND ((C.noex_nomid = 0) or (C.noex_nomid IS NULL))
                        into :VALOR, :cant;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 953) or (CONC_COD = 982) or (CONC_COD = 983))  then /* RECNOCT */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(C.noex_mrecnoct), sum(c.noex_recnoct) 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
                         AND ((C.noex_nomid = 0) or (C.noex_nomid IS NULL))
                        into :VALOR, :cant;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 988) or (CONC_COD = 989) or (CONC_COD = 990))  then /* RECFEST */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(C.noex_mrecfest), sum(c.noex_recfest) 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
                         AND ((C.noex_nomid = 0) or (C.noex_nomid IS NULL))
                        into :VALOR, :cant;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 991) or (CONC_COD = 992) or (CONC_COD = 993))  then /* DOMIN */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(C.noex_mdomin), sum(c.noex_domin) 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
                         AND ((C.noex_nomid = 0) or (C.noex_nomid IS NULL))
                        into :VALOR, :cant;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 994) or (CONC_COD = 995) or (CONC_COD = 996))  then /* RECFESTNOC */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(C.noex_mrecfnoc), sum(c.noex_recfnoc) 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
                         AND ((C.noex_nomid = 0) or (C.noex_nomid IS NULL))
                        into :VALOR, :cant;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                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;
                end
              else if ((CONC_COD = 955) or (CONC_COD = 956) or (CONC_COD = 957)) then /* auxtransporte */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    execute procedure salario_base_empleado (:NITE, :periodicidad, :ano, :periodo, :fec, 'S', :conc_cod) returning_values (:BASICO);
                    BASICO = BASICO * FACSAL / 100;
                    if ((:BASICO/30) < ((:SMLV/30)*2)) then
                        VALOR = (:AUXTRANO / 30) * :DIASLAB;
                    else
                        VALOR = 0;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                CANT = diaslab;
                end
              else if ((CONC_COD = 932)or (CONC_COD = 975) or (CONC_COD = 978) )  then
                begin
                /* incapacidad EMPRESA */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 ND.nnde_tipoinc = 1
                        and N.TNOV_COD = 2 into :valor, :CANT;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 997)or (CONC_COD = 998) or (CONC_COD = 999) )  then
                begin
                /* incap EPS */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 ND.nnde_tipoinc = 2
                        and N.TNOV_COD = 2 into :valor, :CANT;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 1000)or (CONC_COD = 1001) or (CONC_COD = 1002) )  then
                begin
                /* incap 50% */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 ND.nnde_tipoinc = 3
                        and N.TNOV_COD = 2 into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 1003)or (CONC_COD = 1004) or (CONC_COD = 1005) )  then
                begin
                /* incap ARP */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 = 3 into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 1006)or (CONC_COD = 1007) or (CONC_COD = 1008) )  then
                begin
                /* LIC MATERNIDAD */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 = 4 into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 958) or (CONC_COD = 959) or (CONC_COD = 960))  then
                begin
                /* LIC REMUNERADA */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 = 12 into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if (CONC_COD = 950) then
                begin
                /* pago vac */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(VD.vacd_monto), SUM(VD.vacd_dias) from vacaciones V, vacaciones_detalle VD
                        where v.vaca_id = vD.vaca_id and v.terc_nit = :NITE and v.vaca_disfr = 'N'
                        and VD.vacd_periodo >= :perinicial and vD.vacd_periodo <= :perfinal and VD.vacd_ano = :ANO AND VD.vacd_paganom = 'S'
                        into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if (CONC_COD = 949) then
                begin
                /* pago vac */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(VD.vacd_monto), SUM(VD.vacd_dias) from vacaciones V, vacaciones_detalle VD
                        where v.vaca_id = vD.vaca_id and v.terc_nit = :NITE and v.vaca_disfr = 'S'
                        and VD.vacd_periodo >= :perinicial and vD.vacd_periodo <= :perfinal and VD.vacd_ano = :ANO AND VD.vacd_paganom = 'S'
                        into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 922) or (:PRESTAMO = 'S')) then  /* PRESTAMO */
                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
                    and PN.conc_cod = :conc_cod into :VALOR;
                if (VALOR is null) then
                    VALOR = 0;
                else
                    BEGIN
                    /* MARQUE CUOTA PAGADA */
                    update PRESTAMO_CUOTAS  P set PRCU_OK = 'S', P.prcu_nomiid = :idnomina
                        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 AND CONC_COD = :conc_cod);
                    END
                end
              else if (CONC_OTROCONC = 'S') then
                begin
                /* SE LIQUIDA SOBRE OTRO */
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANO and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANO and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                if (VALOR is null) then
                    VALOR = 0;
                if (SALDOSINI is null) then
                    SALDOSINI = 0;
                else
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANO 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 = :ANO and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                CANT = DIASLAB;
                end
              else
                begin
                /* VALOR PREDETERMINADO */
                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
                    BEGIN
                    VALOR = VALORPREDET;
                    CANT = DIASLAB;
                    END
                else if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO */
                    execute procedure periodo_nom_fechaf (:fecha, :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 NC, nomina N
                            where NC.NOCO_APLICAPROM = 'S' and N.nomi_id = NC.nomi_id AND N.nomi_feccausa >= :fecing AND
                            ((NC.NOCO_PERIODO >= :PERINICIAL and NC.NOCO_ANO = :anoini) or
                            (NC.NOCO_PERIODO <= :perfinal and NC.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS NC, nomina N
                            where NC.NOCO_APLICAPROM = 'S' and N.nomi_id = NC.nomi_id AND N.nomi_feccausa >= :fecing AND
                            NC.NOCO_PERIODO >= :PERINICIAL and NC.NOCO_ANO = :anoini
                            and NC.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    INSERT INTO valores_nomina VALUES(:nite, 'ANOINI', :anoini, 0, 0);
                    INSERT INTO valores_nomina VALUES(:nite, 'PERINI', :perinicial, 0, 0);
                    INSERT INTO valores_nomina VALUES(:nite, 'ANOFIN', :anofin, 0, 0);
                    INSERT INTO valores_nomina VALUES(:nite, 'PERFIN', :perfinal, 0, 0);
                    INSERT INTO valores_nomina VALUES(:nite, 'VALOR PROMEDIO', :VALOR, 0, 0);
                    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;
                    INSERT INTO valores_nomina VALUES(:nite, 'VALOR PROMEDIO+SALDINI', :VALOR, 0, 0);
                    VALOR = VALOR / NUMEROPROM;
                    INSERT INTO valores_nomina VALUES(:nite, 'VALOR/NROPROM', :VALOR, 0, 0);
                    if ((conc_cod = 966) or (conc_cod = 967))  then
                        begin
                        /* pago de prima */
                        EXECUTE procedure salario_promedio(:nite,  :FECHA, 'P') returning_values (:VALOR);
                        INSERT INTO valores_nomina VALUES(:nite, 'SAL PROM', :VALOR, 0, 0);
                        if (CONC_COD = 966) then
                            execute procedure dias_entre_nomina(:fecing, :anofin || '/06/30') returning_values (diasprima);
                        else
                            execute procedure dias_entre_nomina(:fecing, :anofin || '/12/31') returning_values (diasprima);
                        if (DIASPRIMA > 180) then
                            DIASPRIMA = 180;
                        VALOR = VALOR * DIASPRIMA / 360;
                        CANT = DIASPRIMA;
                        end
                    ELSE if ((conc_cod = 951) or (conc_cod = 968))  then
                        begin
                        /* pago cesantias e intereses */
                        EXECUTE procedure salario_promedio(:nite,  :FECHA, 'C') returning_values (:VALOR);
                        INSERT INTO valores_nomina VALUES(:nite, 'SAL PROM', :VALOR, 0, 0);
                        execute procedure dias_entre_nomina(:fecing, :anofin || '/12/31') returning_values (diasprima);
                        if (DIASPRIMA > 360) then
                            DIASPRIMA = 360;
                        VALOR = VALOR * CAST(DIASPRIMA as NUMERIC(9,4)) / 360;
                        CANT = DIASPRIMA;
                        INSERT INTO valores_nomina VALUES(:nite, 'CESANTIA', :VALOR, 0, 0);
                        if (conc_cod = 968) then
                            BEGIN
                            porcen = (CAST(DIASPRIMA AS NUMERIC(9,4)) / 360)*12;
                            INSERT INTO valores_nomina VALUES(:nite, 'PORC INT', :PORCEN, 0, 0);
                            VALOR = VALOR * PORCEN / 100;
                            END
                        end
                    else
                        BEGIN
                        VALOR = VALOR * PORCEN / 100;
                        CANT = DIASLAB;
                        END
                    end
                else if (CONC_COD = 920) then /* comision */
                    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;
                    CANT = DIASLAB;
                    end
                else if ((:MONTOEMP <> 0) and (:MONTOEMP is not null)) then
                    begin
                    CANT = DIASLAB;
                    /* MONTO EMPLEADO_CONCEPTOS */
                    if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
                        begin
                        VALOR = :MONTOEMP;
                        if (:CONC_DIAS = 'S') then
                            VALOR = (:VALOR / 30) * :DIASLAB;
                        end     
                    else
                        BEGIN
                        if ((:PORCEN <> 0) and (PORCEN is not null)) then
                            VALOR = (:MONTOEMP * :PORCEN) /100;
                        else
                            VALOR = (:MONTOEMP * :CONC_PORC) /100;
                        BASE = MONTOEMP;
                        END
                    end
                else if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                    begin
                    /* MONTO FIJO */
                    CANT = DIASLAB;
                    if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
                        begin
                        VALOR = :CONC_MONTO;
                        if (:CONC_DIAS = 'S') then
                            VALOR = (:VALOR / 30) * :DIASLAB;
                        end
                    else
                        if ((:PORCEN <> 0) and (PORCEN is not null)) then
                            VALOR = (:CONC_MONTO * :PORCEN) /100;
                        else
                            VALOR = (:CONC_MONTO * :CONC_PORC) /100;
                    end
                else
                    begin
                    /* PORCENTAJE DEL SUELDO */
                    CANT = DIASLAB;
                    if ((:PORCEN <> 0) and (PORCEN is not null)) then
                        VALOR = (:BASICO * :PORCEN) /100;
                    else
                        if ((:CONC_PORC <> 0) and (CONC_PORC is not null)) then
                            VALOR = (:BASICO * :CONC_PORC) /100;
                        else
                            if ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903) or (CONC_COD = 1011) or
                                (CONC_COD = 971) or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 1023) or
                                (CONC_COD = 974) or (CONC_COD = 980) or (CONC_COD = 981))  then
                               VALOR = :BASICO;
                            else
                                VALOR = 0;
                    end
                end
                
              if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                if (CONC_COD = 962) then
                    INSERT INTO valores_nomina VALUES(:nite, 'VALOR FINAL', :VALOR, 0, 0);
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                ITEM = :ITEM + 1;
                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, NOCO_CANT, NOCO_BASE)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
                END
            end /* for */
          /* marque novedades usadas */
          update nomina_novedades_detalle ND
            set NOMI_ID = :idnomina
            where ND.NNDE_PERIODO = :periodo and ND.NNDE_ANO = :ANO and
            exists (select NONO_ID from nomina_novedades where NONO_ID = ND.nono_id and TERC_NIT = :nit_tercero and NONO_PPAGO = :periodicidad);
          /* marque horas usadas */
          update nomina_horasext ND
            set nd.noex_nomid = :idnomina
            where ND.noex_periodio = :periodo and ND.noex_ano = :ANO and nd.terc_nit = :nit_tercero and nd.noex_periodicidad = :periodicidad;
          end /* empleado activo */
        end
    END
suspend;
end^


ALTER PROCEDURE CAUSA_NOM2EMPLEADO (
    IDNOMINA INTEGER,
    NITE VARCHAR(20))
RETURNS (
    ITEMINI INTEGER)
AS
declare variable PERIODO integer;
declare variable PERIODICIDAD integer;
declare variable ANO char(4);
declare variable fecha date;
declare variable item integer;
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montoemp 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 varchar(20);
declare variable conc_monto numeric(18,2);
declare variable conc_modifi 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 conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable conc_dias char(1);
declare variable salario char(1);
declare variable liquidaper integer;
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitarp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable sumavrprom numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable duranov integer;
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable auxtrano numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable parambenef char(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 difaportmin varchar(20);
declare variable porcentr numeric(9,4);
declare variable fecing date;
declare variable fecinge date;
declare variable fecret date;
declare variable anoing integer;
declare variable diasano integer;
declare variable basefsp integer;
declare variable porcdd numeric(9,4);
declare variable deddp char(1);
declare variable dedd numeric(18,2);
declare variable dedv numeric(18,2);
declare variable dedmp numeric(18,2);
declare variable maxdd numeric(18,2);
declare variable maxdv numeric(18,2);
declare variable maxdmp numeric(18,2);
declare variable PENS numeric(18,2);
declare variable SALU numeric(18,2);
declare variable UVT numeric(18,2);
declare variable EX25 numeric(18,2);
declare variable MASUVT numeric(18,2);
declare variable MENOSUVT numeric(18,2);
declare variable DEDSALUD numeric(18,2);
declare variable DEDPEN numeric(18,2);
declare variable FSP numeric(18,2);
declare variable APPENS numeric(18,2);
declare variable APSALU numeric(18,2);
declare variable BASEPEN numeric(18,2);
declare variable FACSAL numeric(18,2);
declare variable MAXFS numeric(18,2);
declare variable TOTDEV numeric(18,2);
declare variable RETFTE numeric(18,2);
declare variable BASERT numeric(18,2);
declare variable BASERM numeric(18,2);
declare variable RETMIN numeric(18,2);
declare variable MINAPEPS integer;
declare variable BASEAPINC VARCHAR(12);
declare variable altoriesgo CHAR(1);
declare variable TALTOR NUMERIC(9,4);
declare variable VALORUVT numeric(18,2);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'RESPONSABLE DE LA DIFERENCIA SOBRE EL APORTE MINIMO A SEGURIDAD SOCIAL') returning_values(:difaportmin);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'INGRESO BASE EXENTO DE PAGO DE APORTES POR SALUD EXPRESADO EN SMMLV') returning_values(:minapeps);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'PAGAR APORTES EN INCAPACIDAD SOBRE EL VALOR DE LA INCAPACIDAD O EL SUELDO HABITUAL') returning_values(:baseapinc);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select N.nomi_periodocidad, N.nomi_periodo, N.nomi_ano from NOMINA N
    where N.nomi_id = :IDNOMINA into :periodicidad, :periodo, :ano;
select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA into :ITEM;
execute procedure fecha_final_periodo_pago (:periodicidad, :ano, :periodo) returning_values (:FECHA);
select P.paan_salinteg, P.PAAN_SALMINIMO, P.PAAN_AUXTR, p.paan_maxfs from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
    into :TAR_SALINTEG, SMLV, :auxtrano, :MAXFS;
ITEMINI = ITEM;
select E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_ARP, E.EMPL_CCF, E.empl_salinteg, E.empl_fecing, E.empl_facsal, E.empl_altoriesgo
    from EMPLEADOS E
    where E.terc_nit = :nite
    and not exists (select ND.NOMI_ID from nomina_detalle ND, NOMINA N where N.nomi_id = ND.nomi_id and ND.terc_nit = E.terc_nit
    and N.nomi_ano = :ano and N.nomi_periodo = :periodo and N.nomi_periodocidad = :periodicidad AND N.nomi_id <> :idnomina)
    into :NITEPS, :NITAFC, :NITAFP, :NITARP, :NITCCF, :SALINTEG, :fecinge, :facsal, :altoriesgo;
if ((FACSAL IS NULL) or (FACSAL = 0))  then
    FACSAL = 100;
if (FACSAL < MAXFS) then
    FACSAL = MAXFS;

EXECUTE PROCEDURE empleado_activo(:NITE, :FECHA) returning_values (:FECING, :FECRET);
if (fecing is null) then
    fecing = fecinge;
if (((:FECRET is null) or (:FECRET > :FECHA)) and :FECING <= :FECHA) then
  BEGIN
  for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, 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_SALARIO, CN.CONC_PROV, CN.CONC_APORTE,
    CN.CONC_APLICAPROM, CN.CONC_GTOEMPR
    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and (CN.conc_activo = 'S') AND (CE.emco_activo = 'S') AND
    ( ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA) AND (((:periodicidad = 1) and (:PERIODO < 13)) or ((:periodicidad = 2) and (:PERIODO < 25)))) 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)))) )
    AND ((CN.conc_aporte = 'S') or (CN.conc_prov = 'S'))
    order by TERC_NIT, CN.conc_cod
    into :NIT_TERCERO, :CONCEPT,  :MONTOEMP, :PORCEN, :ENTIDAD, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
    :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:SALARIO,:CONC_PROV, :CONC_APORTE ,
    :CONC_APLICAPROM, :GTOEMPR
    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, :FECHA, :MENSUAL,:CONC_COD) returning_values (:DIASLAB);
    else
        begin
        select PPAG_DIAS from PERIODO_PAGO where PPAG_COD = :periodicidad into :diaslab;
        if (mensual = 'S') then
            diaslab = 30;
        end

    if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) then
        BEGIN
        if ((CONC_PORC = 0) or (CONC_PORC is null)) then
            BEGIN
            if ((:PORCEN = 0) or (:PORCEN is null)) then
                BEGIN
                select DPTO_TARARP from DEPARTAMENTO D, EMPLEADOS E where E.terc_nit = :nite and E.empl_dpto = D.dpto_cod
                    into :porcen;
                END
            END
        ELSE
            if ((:PORCEN = 0) or (:PORCEN is null)) then
                PORCEN = CONC_PORC;
        END
    execute procedure ibc_empleado (:NITE, :ANO, :periodo, :conc_cod) returning_values (:BASICOEMP);
    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;
    HORASEX = null;
    BENEFICIOS = 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
    BASERT = 0;
    if (CONC_COD = 962) Then  --RETEFTE
        begin
        select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
            where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
            N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_basert = 'S' AND c.conc_benefic = 'N' and
            NC.TERC_NIT = :NITE into :valor;
        if (valor is null) then
            valor = 0;
        TOTDEV = VALOR;
        ENTIDAD = :nite;
        INSERT INTO valores_nomina VALUES(:nite, 'VALOR', :VALOR);
        /* exenciones */
        SELECT PAAN_DEDDEP, PAAN_MAXDEDDEP*PAAN_UVT, PAAN_MAXDEDMP, PAAN_MAXDEDAFC, PAAN_AFPTR, PAAN_EPSTR, PAAN_UVT FROM parametros_ano WHERE PAAN_ANO = :ANO
            INTO :PORCDD, :MAXDD, :MAXDMP, :MAXDV, :PENS, :SALU, :UVT;
        SELECT EMPL_DEDDEP, EMPL_DEDINTV, EMPL_DEDAFC+EMPL_AFPVOLNORET,EMPL_DEDMEDP,EMPL_DEDSALUD FROM empleados WHERE TERC_NIT = :NITE
            INTO :DEDDP, :DEDV, :DEDPEN, :DEDMP, :DEDSALUD;
        if (DEDV IS NULL) THEN
            DEDV = 0;
        if (DEDMP IS NULL) THEN
            DEDMP = 0;
        if (DEDSALUD IS NULL) THEN
            DEDSALUD = 0;
        if (DEDPEN IS NULL) THEN
            DEDPEN = 0;
        /* APORTES A PENSIONES */
        FSP = 0;

        if ((VALOR / SMLV) < 25) then
            BEGIN
            if (salinteg = 'S') then
                BASEPEN = VALOR * tar_salinteg/100;
            else
                BASEPEN = VALOR;
            END
        else
            BASEPEN = SMLV * 25;

        INSERT INTO valores_nomina VALUES(:nite, 'BASEPEN', :BASEPEN);
        if ((:PERIODICIDAD = 1) or (MENSUAL = 'S')) Then
            BASEFSP = FLOOR(BASEPEN / smlv);
        else
            if (:PERIODICIDAD = 2) then
                BASEFSP = FLOOR(BASEPEN*2 / smlv);
            else
                BASEFSP = FLOOR(BASEPEN*4 / smlv);
        if (BASEFSP >= 4) then
             BEGIN
             SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= :BASEFSP AND
                 FSPE_SMLVFIN >= :BASEFSP INTO :porcen;
             FSP = basepen * PORCEN/100;
            INSERT INTO valores_nomina VALUES(:nite, 'FSP', :FSP);
             END
        APPENS = BASEPEN * PENS/100;
        APSALU = BASEPEN * SALU/100;
        INSERT INTO valores_nomina VALUES(:nite, 'APPENS', :APPENS);
        if (DEDV > (MAXDV * UVT)) then
            DEDV = MAXDV*UVT;
        if (DEDMP > (MAXDMP*UVT)) then
            DEDMP = MAXDMP*UVT;
        if (MENSUAL = 'N') then
            BEGIN
            if (periodicidad = 2) then
                valor = valor * 2;
            if (periodicidad = 3) then
                valor = valor * 4;
            END
        select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
            where N.nomi_id = NC.nomi_id AND N.nomi_periodocidad = :PERIODICIDAD and N.nomi_periodo >= :perinicial and
            N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_basert = 'S' AND c.conc_benefic = 'S' and
            NC.TERC_NIT = :NITE into :beneficios;
        if (beneficios is null) then
            beneficios = 0;
        VALOR = VALOR + BENEFICIOS;
        TOTDEV = TOTDEV + BENEFICIOS;
        INSERT INTO valores_nomina VALUES(:nite, 'BENEFICIOS', :beneficios);
        DEDPEN = DEDPEN + FSP + appens;
        if (DEDPEN > VALOR * 0.3) then
            DEDPEN = VALOR * 0.3;
        if (DEDDP = 'S') then
            BEGIN
            DEDD = VALOR * PORCDD / 100;
            if (DEDD > MAXDD) then
                DEDD = MAXDD;
            INSERT INTO valores_nomina VALUES(:nite, 'DEDDP', :DEDD);
            END
        ELSE
            DEDD = 0;
        INSERT INTO valores_nomina VALUES(:nite, 'DEDPEN', :dedpen);
        VALOR = VALOR - DEDPEN;
        INSERT INTO valores_nomina VALUES(:nite, 'VALOR - DEDPEN', :VALOR);
        VALOR = VALOR - DEDV - DEDMP;
        INSERT INTO valores_nomina VALUES(:nite, 'VALOR - DEDV-DEDMP', :VALOR);
        VALOR = VALOR - DEDD;
        INSERT INTO valores_nomina VALUES(:nite, 'VALOR - DEDD', :VALOR);
        VALOR = VALOR - DEDSALUD;
        INSERT INTO valores_nomina VALUES(:nite, 'VALOR - DEDSALUD', :VALOR);
        EX25 = VALOR * 0.25;
        if (EX25 > 240*UVT) then
            EX25 = 240*UVT;
        VALOR = VALOR - EX25;
        INSERT INTO valores_nomina VALUES(:nite, 'VALOR - EX25', :VALOR);

        PORCEN = NULL;
        VALORUVT = VALOR / UVT;
        SELECT FIRST 1 RETE_PORC, RETE_MASUVT, RETE_MENOSUVT FROM RETENCIONES WHERE RETE_DESDEUVT <= :VALORUVT AND RETE_HASTAUVT >= :VALORUVT AND RETE_ANO = :ANO
            INTO :PORCEN, :MASUVT, :MENOSUVT;
        if (PORCEN IS NULL) then
            PORCEN = 0;
        if (PORCEN <> 0) then
            BEGIN
            BASERT = VALOR;
            INSERT INTO valores_nomina VALUES(:nite, 'PORCEN', :PORCEN);
            INSERT INTO valores_nomina VALUES(:nite, 'MENOSUVT', :MENOSUVT*:UVT);
            INSERT INTO valores_nomina VALUES(:nite, 'MASUVT', :MASUVT*:UVT);
            VALOR = ((:VALOR - (:MENOSUVT*UVT)) * (:PORCEN /100)) + (MASUVT * UVT);
            INSERT INTO valores_nomina VALUES(:nite, 'RETENCION', :VALOR);
            END
        ELSE
            VALOR = 0;
        retfte = VALOR;
        /* AHORA LA RETENCION MINIMA */
        VALOR = TOTDEV - appens - apsalu - fsp;
        BASERM = VALOR;
        INSERT INTO valores_nomina VALUES(:nite, 'BASE RET MINIMA', :VALOR);
        VALOR = VALOR / UVT;
        INSERT INTO valores_nomina VALUES(:nite, 'BASE RETMIN EN UVT', :VALOR);
        SELECT FIRST 1 RETM_HASTA FROM retencion_minima WHERE RETM_ANO = :ANO
            ORDER BY RETM_HASTA INTO :RETMIN;
        if (VALOR > RETMIN) then
            BEGIN
            PORCEN = NULL;
            SELECT FIRST 1 RETM_RETE FROM retencion_minima WHERE RETM_HASTA <= :VALOR AND RETM_ANO = :ANO
                ORDER BY RETM_HASTA DESC
                INTO :PORCEN;
            if (PORCEN IS NULL) then
                PORCEN = 0;
            END
        ELSE
            PORCEN = 0;
        INSERT INTO valores_nomina VALUES(:nite, 'PORCENTAJE RETMIN', :PORCEN);
        if (PORCEN <> 0) then
            VALOR = PORCEN * UVT;
        else
            VALOR = 0;
        INSERT INTO valores_nomina VALUES(:nite, 'RET MINIMA', :VALOR);
        if (VALOR < RETFTE) then
            VALOR = RETFTE;
        ELSE
            BASERT = BASERM;
        end
    else if (CONC_APORTE = 'S') then
        begin
        if (CONC_DIAS = 'S') then
            execute procedure dias_laborados (:NITE, :PERIODO, :FECHA, :MENSUAL,:CONC_COD) returning_values (:DIASLAB);
        /* si no se ha pagado, calculelo */
        if (((CONC_DIAS = 'S') and (diaslab > 0)) or (NOT EXISTS (SELECT N.NOMI_ID FROM NOMINA N, NOMINA_CONCEPTOS NC WHERE
            N.nomi_id = NC.nomi_id AND N.nomi_ano = :ano AND N.nomi_periodo >= :perinicial AND N.nomi_periodo <= :perfinal
            AND NC.terc_nit = :NITE AND NC.conc_cod = :CONC_COD AND NC.noco_valor <> 0))) then
            BEGIN
            if (BASEAPINC = 'SUELDO') then
                BEGIN
                VALOR = ((:basicoemp/30)*:DIASLAB) + :CAMBSALTRANS;
                /* FACTOR SALARIAL, EXCEPTO VACACIONES */
                if ((CONC_COD <> 929) AND (CONC_COD <> 930) AND (CONC_COD <> 944)) then
                    VALOR = VALOR * :facsal / 100;
                /* DEMAS CONCEPTOS PAGADOS EXCEPTO SALARIO E INCAPACIDADES QUE LOS CUBRE EL BASICO */
                select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                    where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
                    N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_baseap = 'S'
                    AND (C.CONC_COD <> 901) AND (C.CONC_COD <> 902) AND (C.CONC_COD <> 903) AND (C.CONC_COD <> 949)
                    AND (C.CONC_COD <> 1011) AND (C.CONC_COD <> 1025) AND (C.CONC_COD <> 1026) AND (C.CONC_COD <> 1033)
                    AND (C.CONC_COD <> 1034) AND (C.CONC_COD <> 1035) AND (C.CONC_COD <> 1036) AND (C.CONC_COD <> 1037)
                    AND (C.CONC_COD <> 971) AND (C.CONC_COD <> 972) AND (C.CONC_COD <> 973)
                    AND (C.CONC_COD <> 974) AND (C.CONC_COD <> 980) AND (C.CONC_COD <> 981)
                    AND (C.CONC_COD <> 932) AND (C.CONC_COD <> 975) AND (C.CONC_COD <> 978)
                    AND (C.CONC_COD <> 997) AND (C.CONC_COD <> 998) AND (C.CONC_COD <> 999)
                    AND (C.CONC_COD <> 1000) AND (C.CONC_COD <> 1001) AND (C.CONC_COD <> 1002)
                    AND (C.CONC_COD <> 1003) AND (C.CONC_COD <> 1004) AND (C.CONC_COD <> 1005)
                    AND (C.CONC_COD <> 1006) AND (C.CONC_COD <> 1007) AND (C.CONC_COD <> 1008)
                    and (C.CONC_COD <> 970) and (C.CONC_COD <> 1009) and (C.CONC_COD <> 1010)
                    AND NC.TERC_NIT = :NITE into :sumavrprom;
                if (sumavrprom is null) then
                    sumavrprom = 0;
                VALOR = VALOR + sumavrprom;
                END
            ELSE
                BEGIN
                select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                    where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
                    N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_baseap = 'S'
                    AND NC.TERC_NIT = :NITE into :sumavrprom;
                if (sumavrprom is null) then
                    VALOR = 0;
                else
                    VALOR = sumavrprom;
                if ((CONC_COD <> 929) AND (CONC_COD <> 930) AND (CONC_COD <> 944)) then
                    VALOR = VALOR * :facsal / 100;
                END
            if (SALINTEG = 'S') then
                valor = valor * (tar_salinteg / 100);

            if ((VALOR / SMLV) > 25) then
                valor = SMLV * 25;

            /* SI APORTE A SEGURIDAD SOCIAL MENOR QUE EL MINIMO O MAYOR A 25 SMMLV */
            if ((:conc_cod = '904') OR (:conc_cod = '905') OR (:conc_cod = '906') OR (:conc_cod = '934') OR
                (:conc_cod = '908') OR (:conc_cod = '909') OR (:conc_cod = '935') or (CONC_COD = 1013) OR
                (:conc_cod = '907') OR (:conc_cod = '914') OR (:conc_cod = '915') OR (:conc_cod = '938') OR (:conc_cod = '976')) then
                BEGIN
                if (difaportmin <> 'EMPLEADOR') then
                    if (:VALOR < ((:SMLV/30)*:DIASLAB)) then
                        VALOR = (:SMLV/30)*:DIASLAB;
                if ((VALOR / SMLV) > 25) then
                    valor = SMLV * 25;
                END
            if (CONC_COD = 904) then /* AFP TRABAJADOR */
                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 /* AFP EMPLEADOR */
                begin
                ENTIDAD = :NITAFP;
                select A.PAAN_AFPEM, a.paan_afptr, A.paan_altoriesgo from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                    into :PORCEN, :porcentr, :taltor;
                if (taltor IS NULL) then
                    taltor = 0;
                if (altoriesgo = 'S') then
                    PORCEN = PORCEN + taltor;
                if ((difaportmin = 'EMPLEADOR') and (VALOR < (:SMLV/30)*:DIASLAB)) then
                    VALOR = ((:SMLV/30)*:DIASLAB * (PORCEN+PORCENTR) /100) - ((VALOR * :PORCENTR) /100);
                else
                    VALOR = (:VALOR * :PORCEN) /100;
                end
            else if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013) ) then /* ARP */
                begin
                ENTIDAD = :NITARP;
                if (VALOR < (:SMLV/30)*:DIASLAB) then
                    VALOR = (:SMLV/30)*:DIASLAB;
                VALOR = (:VALOR * :PORCEN) /100;
                end
            else if (CONC_COD = 921) then /* FSP */
                begin
                ENTIDAD = :NITAFP;
                if ((:PERIODICIDAD = 1) or (MENSUAL = 'S')) Then
                    BASEFSP = FLOOR(VALOR / smlv);
                else
                    if (:PERIODICIDAD = 2) then
                        BASEFSP = FLOOR(VALOR*2 / smlv);
                    else
                        BASEFSP = FLOOR(VALOR*4 / smlv);
                 if (BASEFSP >= 4) then
                     BEGIN
                     SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= :BASEFSP AND
                         FSPE_SMLVFIN >= :BASEFSP INTO :porcen;
                     VALOR = (:VALOR * :PORCEN) /100;
                     END
                 else
                     VALOR = 0;
                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 /* EPS TRABAJADOR */
                    begin
                    select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                    VALOR = ((:VALOR) * :PORCEN) /100;
                    end
                else
                    begin   /* EPS EMPLEADOR */
                    /* verifique si es menor a los 10 SMMLV */
                    if (((VALOR / SMLV) > MINAPEPS) or (salinteg = 'S')) then
                        BEGIN
                        select A.PAAN_EPSEM, a.paan_epstr from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                            into :PORCEN, :porcentr;
                        if ((difaportmin = 'EMPLEADOR') and (VALOR < (:SMLV/30)*:DIASLAB)) then
                            VALOR = ((:SMLV/30)*:DIASLAB * (PORCEN+PORCENTR) /100) - ((VALOR * :PORCENTR) /100);
                        else
                            VALOR = (:VALOR * :PORCEN) /100;
                        END
                    ELSE
                        VALOR = 0;
                    end
                end
            else if (conc_cod = 976) then /* EPS APRENDIZ SENA */
                begin
                ENTIDAD = :NITEPS;
                VALOR = (:VALOR * :CONC_PORC) /100;
                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;
                if (VALOR < (:SMLV/30)*:DIASLAB) then
                    VALOR = (:SMLV/30)*:DIASLAB;
                VALOR = (:VALOR * :PORCEN) /100;
                end
            else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) ) then
                begin
                /*icbf */
                ENTIDAD = :conc_entidad;
                select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                if (((VALOR / SMLV) > MINAPEPS) or (salinteg = 'S')) then
                    begin
                    if (VALOR < (:SMLV/30)*:DIASLAB) then
                        VALOR = (:SMLV/30)*:DIASLAB;
                    end
                else
                    VALOR = 0;
                VALOR = (:VALOR * :PORCEN) /100;
                end
            else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) ) then
                begin
                /*sena */
                ENTIDAD = :conc_entidad;
                select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                if (((VALOR / SMLV) > MINAPEPS) or (salinteg = 'S')) then
                    begin
                    if (VALOR < (:SMLV/30)*:DIASLAB) then
                        VALOR = (:SMLV/30)*:DIASLAB;
                    end
                else
                    VALOR = 0;
                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 (CN.conc_activo = 'S') AND (CE.emco_activo = 'S') AND
                        ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA) 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 (diaslab = 0) then
                    select PPAG_DIAS from PERIODO_PAGO where PPAG_COD = :periodicidad into :diaslab;
                if ((:VALOR/:DIASLAB) < ((:SMLV/30)*2)) then
                    AUXTRANS = (:AUXTRANO / 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 if ((CONC_COD = 923) or (CONC_COD = 924) or (CONC_COD = 941)) then
                begin
                /* INT CESANTIA */
                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 (CN.conc_activo = 'S') and (CE.emco_activo = 'S') AND
                        ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA) 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 ((:VALOR/:DIASLAB) < ((:SMLV/30)*2)) then
                    AUXTRANS = (:AUXTRANO / 30) * :DIASLAB;
                else
                    AUXTRANS = 0;
                anoing = extract (YEAR FROM FECING);
                if (ANOING = ANO) then
                    BEGIN
                    diasano = (12 - extract (MONTH FROM FECING)) * 30 + (30 - extract (DAY FROM FECING));
                    porcen = :CONC_PORC * DIASANO / 360;
                    END
                else
                    porcen = conc_porc;
                VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                end
            else
                begin
                if (CONC_PORC <> 0 and CONC_PORC is not null) then
                    VALOR = ((:VALOR) * CONC_PORC) /100;
                else
                    if (:PORCEN <> 0 and :PORCEN is not null) then
                        VALOR = ((:VALOR) * PORCEN) /100;
                    else
                        if (:MONTOEMP <> 0 and :MONTOEMP is not null) then
                            VALOR = :MONTOEMP;
                        else
                            if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                VALOR = :CONC_MONTO;
                end
            if (ENTIDAD is null or (ENTIDAD = '') ) then
                ENTIDAD = :CONC_ENTIDAD;
            end
        end /* aportes */
    else if (CONC_PROV = 'S') then
        begin
        select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
            where N.nomi_id = NC.nomi_id AND N.nomi_periodo >= :perinicial and ((N.nomi_periodocidad = :periodicidad) or (N.nomi_periodocidad = 5)) AND
            N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_basepr = 'S' AND
            NC.TERC_NIT = :NITE
            into :valor;
        if (valor is null) then
            valor = 0;
        AUXTRANS = 0;
        /* SI ES VACACIONES RESTE EL AUXILIO DE TRANSPORTE Y HORAS EXTRAS */
        if ((CONC_COD = 929) OR (CONC_COD = 930) OR (CONC_COD = 944)) then
            begin
            select SUM(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where N.nomi_id = NC.nomi_id AND N.nomi_periodocidad = :PERIODICIDAD and N.nomi_periodo >= :perinicial and
                N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO AND NC.TERC_NIT = :NITE AND
                ((conc_cod = 955) or (conc_cod = 956) or (conc_cod = 957) or (conc_cod = 2) or (conc_cod = 26))
                INTO AUXTRANS;
            if (AUXTRANS IS NULL) then
                AUXTRANS = 0;
            VALOR = VALOR - AUXTRANS;
            /* HORS EXTRAS */
            select SUM(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where N.nomi_id = NC.nomi_id AND N.nomi_periodocidad = :PERIODICIDAD and N.nomi_periodo >= :perinicial and
                N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.TERC_NIT = :NITE AND
                ((conc_cod = 931) or (conc_cod = 945) or (conc_cod = 900))
                INTO horasex;
            if (horasex IS NULL) then
                HORASEX = 0;
            VALOR = VALOR - HORASEX;
            end
        if (CONC_PORC <> 0 and CONC_PORC is not null) then
            BEGIN
            /* INTERESES DE CESANTIA PORC PROPORCIONAL AL TIEMPO LABORADO */
            if ((CONC_COD = 923) or (CONC_COD = 924) or (CONC_COD = 941)) then
                BEGIN
                anoing = extract (YEAR FROM FECING);
                if (ANOING = ANO) then
                    BEGIN
                    diasano = (12 - extract (MONTH FROM FECING)) * 30 + (30 - extract (DAY FROM FECING));
                    CONC_PORC = CONC_PORC * DIASANO / 360;
                    END
                END
            VALOR = :VALOR * :CONC_PORC /100;
            END
        else
            if (PORCEN <> 0 and PORCEN is not null) then
                VALOR = :VALOR * :PORCEN /100;
        end /* provision */
    /* VALOR PREDETERMINADO */
    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 if ((:MONTOEMP <> 0) and (:MONTOEMP is not null)) then
        begin
        /* MONTO EMPLEADO_CONCEPTOS */
        if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
            begin
            VALOR = :MONTOEMP;
            if (:CONC_DIAS = 'S') then
                VALOR = (:VALOR / 30) * :DIASLAB;
            end     
        else
            if ((:PORCEN <> 0) and (PORCEN is not null)) then
                VALOR = (:MONTOEMP * :PORCEN) /100;
            else
                VALOR = (:MONTOEMP * :CONC_PORC) /100;
        end
    else if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
        begin
        /* MONTO FIJO */
        if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
            begin
            VALOR = :CONC_MONTO;
            if (:CONC_DIAS = 'S') then
                VALOR = (:VALOR / 30) * :DIASLAB;
            end
        else
            if ((:PORCEN <> 0) and (PORCEN is not null)) then
                VALOR = (:CONC_MONTO * :PORCEN) /100;
            else
                VALOR = (:CONC_MONTO * :CONC_PORC) /100;
        end

    if ((VALOR <> 0) and (VALOR is not null)) then
        begin
        execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
        ITEM = :ITEM + 1;
        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, NOCO_CANT, NOCO_BASE)
                values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :diaslab, :BASERT);
        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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    end
                end
            VALOR = 0;
            end
      end /* empleado activo */
    end
suspend;
end^


ALTER PROCEDURE CAUSA_NOMINA (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
begin
execute procedure causa_nomina1(:fec, :periodo, :periodicidad, :pagoglobal, :ano, :depto) returning_values (:idnomina, :itemini);
execute procedure causa_nomina2(:idnomina, :depto) returning_values (:itemini);
suspend;
end^


ALTER PROCEDURE CAUSA_NOMINA_1_EMPLEADO (
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    NITE VARCHAR(20))
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
begin
execute procedure causa_nom1empleado(:periodo, :periodicidad, :ano, :nite) returning_values (:idnomina, :itemini);
execute procedure causa_nom2empleado(:idnomina, :nite) returning_values (:itemini);
suspend;
end^


ALTER PROCEDURE CAUSA_NOMINA_EMPLEADO (
    FECHA DATE,
    NITE VARCHAR(20),
    DIAS INTEGER,
    PAOB CHAR(1),
    VACAC CHAR(1))
RETURNS (
    CONC_COD INTEGER,
    CONC_NOMBRE VARCHAR(60),
    ENTIDAD VARCHAR(20),
    VALOR NUMERIC(18,2))
AS
declare variable PERIODO integer;
declare variable PERIODICIDAD integer;
declare variable ANO char(4);
declare variable MONTOEMP numeric(18,2);
declare variable porcen numeric(9,4);
declare variable conc_porc numeric(9,4);
declare variable conc_entidad varchar(20);
declare variable conc_monto numeric(18,2);
declare variable conc_promedio char(1);
declare variable diaslab integer;
declare variable conc_deduc char(1);
declare variable conc_aporte char(1);
declare variable conc_prov char(1);
declare variable numeroprom integer;
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 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 nitarp varchar(20);
declare variable nitccf varchar(20);
declare variable comision numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
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 auxtrano numeric(18,2);
declare variable auxtrans numeric(18,2);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable recargo 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 DIFAPORTMIN varchar(20);
declare variable porcentr numeric(9,4);
declare variable diasinc char(1);
declare variable licnr integer;
declare variable DIADOM CHAR(2);
declare variable DIASDOM INTEGER;
declare variable SEMANA INTEGER;
declare variable SEMANAUX INTEGER;
declare variable basefsp integer;
declare variable FACSAL numeric(18,2);
declare variable FECING DATE;
declare variable ANOING CHAR(4);
declare variable diasano integer;
declare variable MAXFS numeric(18,2);
declare variable benef char(1);
declare variable MINAPEPS integer;
declare variable OTROS numeric(18,2);
declare variable PRESTAMO CHAR(1);
declare variable IDPR INTEGER;
declare variable ITEMPR INTEGER;
declare variable VALORAUX numeric(18,2);
begin
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'INGRESO BASE EXENTO DE PAGO DE APORTES POR SALUD EXPRESADO EN SMMLV') returning_values(:minapeps);
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'RESPONSABLE DE LA DIFERENCIA SOBRE EL APORTE MINIMO A SEGURIDAD SOCIAL')returning_values(:difaportmin);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
ANO = extract (YEAR FROM FECHA);
select p.paan_maxfs from PARAMETROS_ANO P where P.PAAN_ANO = :ANO into :MAXFS;
for select E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_ARP, E.EMPL_CCF, E.empl_salinteg, e.empl_ppago, E.empl_facsal, e.empl_fecing
    from EMPLEADOS E where e.terc_nit = :nite and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FECHA)) and E.EMPL_FECING <= :FECHA
    into :NITEPS, :NITAFC, :NITAFP, :NITARP, :NITCCF, :SALINTEG, :periodicidad, :facsal, :fecing
    do
    begin
    if ((FACSAL IS NULL) or (FACSAL = 0))  then
        FACSAL = 100;
    if (FACSAL < MAXFS) then
        FACSAL = MAXFS;
    if (PERIODICIDAD = 1) then
        PERIODO = extract (MONTH FROM FECHA);
    if (PERIODICIDAD = 2) then
        begin
        PERIODO = (extract (MONTH FROM FECHA) * 2) - 1;
        if (extract (day from fecha) > 15) then
            PERIODO = PERIODO + 1;
        end
    if (PERIODICIDAD = 3) then
        PERIODO = extract (WEEK FROM FECHA);
    select P.paan_salinteg, P.PAAN_SALMINIMO, P.PAAN_AUXTR, P.paan_maxfs  from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_SALINTEG, SMLV, :auxtrano, :maxfs;
    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_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS,
        CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_APORTE, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CE.EMCO_TOMSAL, CN.conc_diasinc, CN.conc_nombre, cn.conc_deduc, CN.conc_benefic, cn.conc_prov, CN.conc_prestamo
        from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
        ( ((:paob = 'P') and (CN.conc_benefic = 'N') and (CN.conc_prov = 'N') AND (CN.conc_gtoempr = 'N')) or
          ((:paob = 'A') and (CN.conc_benefic = 'N') and (CN.conc_prov = 'N') AND (CN.conc_gtoempr = 'S')) or
          ((:paob = 'V') and (CN.conc_benefic = 'N') and (CN.conc_prov = 'S')) or
          ((:paob = 'B') and (CN.conc_benefic = 'S'))) AND
        ( ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA)) 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))))
        ) and (CN.conc_activo = 'S') AND (CE.emco_activo = 'S') and (CE.CONC_COD <> 962)
        order by TERC_NIT, CN.conc_cod
        into :MONTOEMP, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_PORC,
        :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_PROMEDIO, :SALARIO,:CONC_APORTE , :CONC_OTROCONC, :CONC_CODOTROCONC, :TOMASAL, :diasinc, :conc_nombre, :conc_deduc, :benef, :CONC_PROV, :PRESTAMO
            do
            begin
            if (MENSUAL = 'S') then
                begin
                if (PERIODICIDAD = 1) then
                    begin
                    perinicial = PERIODO;
                    PERFINAL = PERIODO;
                    end
                if (PERIODICIDAD = 2) then
                    begin
                    PERINICIAL =  (extract(month from :FECHA) * 2) -1;
                    PERFINAL =  (extract(month from :FECHA) * 2);
                    end
                if (PERIODICIDAD = 3) then
                    begin
                    PERINICIAL =  (extract(month from :FECHA) * 4) -3;
                    PERFINAL =  (extract(month from :FECHA) * 4);
                    end
                end /* mensual */
            else
                begin
                perinicial = PERIODO;
                PERFINAL = PERIODO;
                end
            /* EN LIQUIDACION DEFINITIVA NO INCLUYA PRESTAMOS */
            if ((PRESTAMO = 'N') OR (VACAC = 'S')) then
            /* NO INCLUYA CONCEPTOS PREVIAMENTE PAGADOS EN ESTE PERIODO */
            if (NOT EXISTS (SELECT N.NOMI_ID FROM NOMINA N, NOMINA_CONCEPTOS NC WHERE
              N.nomi_id = NC.nomi_id AND N.nomi_ano = :ano AND N.nomi_periodo >= :perinicial AND N.nomi_periodo <= :perfinal
              AND NC.terc_nit = :NITE AND NC.conc_cod = :CONC_COD AND NC.noco_valor <> 0)) then
              BEGIN
              if (CONC_DIAS = 'S') then
                BEGIN
                /* OJO CAMBIO PARA LIQUIDACION CON NOVEDADES */
                EXECUTE procedure dias_laborados_liq(:nite, :periodo, :fecha, :mensual, :conc_cod) returning_values (diaslab);
                if (VACAC = 'S') then
                    DIASLAB = DIASLAB - 1;
                END
              else
                begin
                select PPAG_DIAS from PERIODO_PAGO where PPAG_COD = :periodicidad into :diaslab;

                /* reste los dias no laborados no remunerados */
                SELECT SUM (ND.nnde_duracion), MAX(NONO_DOMINICAL) FROM nomina_novedades N, nomina_novedades_detalle ND
                    WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nite AND ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
                    AND ND.nnde_ano = substr(:fecha,1,4) AND ((ND.nnde_periodo = :periodo) OR
                     ((:mensual = 'S') AND (ND.nnde_periodo = :periodo - 1))) AND N.nono_fecha <= :fecha
                    INTO :LICNR, :DIADOM;
                if (licnr IS NULL) then
                    licnr = 0;
                if (DIADOM = 'S') then
                    BEGIN
                    DIASDOM = 0;
                    SEMANAUX = 0;
                    FOR SELECT EXTRACT(WEEK FROM N.nono_fecha) FROM nomina_novedades N, nomina_novedades_detalle ND
                        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nite AND (N.TNOV_COD = 13)
                        AND ND.nnde_ano = substr(:fecha,1,4) AND ((ND.nnde_periodo = :periodo) OR
                         ((:mensual = 'S') AND (ND.nnde_periodo = :periodo - 1))) ORDER BY N.nono_fecha INTO :SEMANA
                        DO
                        BEGIN
                        if (SEMANA <> SEMANAUX) then
                            DIASDOM = DIASDOM + 1;
                        SEMANAUX = SEMANA;
                        END
                    END
                ELSE
                    DIASDOM = 0;
                LICNR = LICNR + DIASDOM;
                diaslab = diaslab - licnr;
                end

              /* SI ES ARP TOME EL PORCENTAJE DEL DEPARTAMENTO */
              if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) then
                if ((:PORCEN = 0) or (:PORCEN is null)) then
                    BEGIN
                    select DPTO_TARARP from DEPARTAMENTO D, EMPLEADOS E where E.terc_nit = :nite and E.empl_dpto = D.dpto_cod
                        into :porcen;
                    END
              /* TOME EL SALARIO BASE */
              execute procedure ibc_empleado (:NITE, :ANO, :periodo, :conc_cod) returning_values (:BASICOEMP);
              /* 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 AND N.nono_fecha <= :fecha
                into :CAMBSALTRANS, :DURANOV;
              if (CAMBSALTRANS is null) then
                CAMBSALTRANS = 0;
              if (DURANOV is null) then
                DURANOV = 0;
              DIASLAB = :DIASLAB - :DURANOV;
              BASICO = ((:BASICOEMP/30)*:DIASLAB) + :CAMBSALTRANS;
              if (:benef = 'S') then
                BASICO = BASICO * (100 - :facsal) / 100;
              else
                BASICO = BASICO * :facsal / 100;
              if ((MENSUAL = 'S') AND (: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 /* tomasal */

              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 =  (extract(month from :FECHA) * 2) -1;
                            PERFINAL =  (extract(month from :FECHA) * 2);
                            end
                        if (PERIODICIDAD = 3) then
                            begin
                            PERINICIAL =  (extract(month from :FECHA) * 4) -3;
                            PERFINAL =  (extract(month from :FECHA) * 4);
                            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 COMPENSADAS ESTE PERIODO */
                    select sum(VD.vacd_monto) from vacaciones V, vacaciones_detalle VD
                        where v.vaca_id = vD.vaca_id and v.terc_nit = :NITE
                        and VD.vacd_periodo >= :perinicial and vD.vacd_periodo <= :perfinal and VD.vacd_ano = :ANO AND VD.vacd_paganom = 'S' AND V.vaca_disfr = 'N'
                        into :vacacdisf;
                    if (VACACDISF is null ) then
                        VACACDISF = 0;
                    /* INCAPACIDAD */
                    if (DIASINC <> 'S') then
                        BEGIN
                        select sum(ND.nnde_duracion), sum(ND.nnde_valor) 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) or (N.TNOV_COD = 12)) AND N.nono_fecha <= :fecha
                            into :diasnov, :incap;
                        if (:diasnov is null) then
                            diasnov = 0;
                        if (:incap is null) then
                            INCAP = 0;
                        END
                    ELSE
                        INCAP = 0;
                    /* DEMAS CONCEPTOS CON MONTO FIJO EXCEPTO SALARIO E INCAPACIDADES QUE LOS CUBRE EL BASICO */
                    select SUM(E.emco_monto) from conceptos_nomina C, empleado_conceptos E
                        where C.conc_baseap = 'S' AND C.conc_cod = E.conc_cod
                        AND (C.CONC_COD <> 901) AND (C.CONC_COD <> 902) AND (C.CONC_COD <> 903) AND (C.CONC_COD <> 1011)
                        AND (C.CONC_COD <> 949)
                        AND (C.CONC_COD <> 971) AND (C.CONC_COD <> 972) AND (C.CONC_COD <> 973) AND (C.CONC_COD <> 1023)
                        AND (C.CONC_COD <> 974) AND (C.CONC_COD <> 980) AND (C.CONC_COD <> 981)
                        AND (C.CONC_COD <> 932) AND (C.CONC_COD <> 975) AND (C.CONC_COD <> 978) AND (C.CONC_COD <> 1026)
                        AND (C.CONC_COD <> 997) AND (C.CONC_COD <> 998) AND (C.CONC_COD <> 999) AND (C.CONC_COD <> 1033)
                        AND (C.CONC_COD <> 1000) AND (C.CONC_COD <> 1001) AND (C.CONC_COD <> 1002) AND (C.CONC_COD <> 1034)
                        AND (C.CONC_COD <> 1003) AND (C.CONC_COD <> 1004) AND (C.CONC_COD <> 1005) AND (C.CONC_COD <> 1035)
                        AND (C.CONC_COD <> 1006) AND (C.CONC_COD <> 1007) AND (C.CONC_COD <> 1008) AND (C.CONC_COD <> 1036)
                        and (C.CONC_COD <> 970) and (C.CONC_COD <> 1009) and (C.CONC_COD <> 1010) AND (C.CONC_COD <> 1037)
                        AND E.TERC_NIT = :NITE into :otros;
                    if (otros is null) then
                        otros = 0;
                    BASICO = BASICO + OTROS;
                    /* DEMAS CONCEPTOS CON VALOR DIGITADO EXCEPTO SALARIO E INCAPACIDADES QUE LOS CUBRE EL BASICO */
                    select SUM(NV.nvpr_monto) from conceptos_nomina C, empleado_conceptos E, nomina_valor_predet NV
                        where C.conc_baseap = 'S' AND C.conc_cod = E.conc_cod AND C.conc_cod = NV.conc_cod AND NV.nvpr_ano = :ano
                        AND NV.nvpr_periodo >= :perinicial AND NV.nvpr_periodo <= :perfinal AND NV.terc_nit = :nite
                        AND (C.CONC_COD <> 901) AND (C.CONC_COD <> 902) AND (C.CONC_COD <> 903) AND (C.CONC_COD <> 1011)
                        AND (C.CONC_COD <> 949)
                        AND (C.CONC_COD <> 971) AND (C.CONC_COD <> 972) AND (C.CONC_COD <> 973) AND (C.CONC_COD <> 1023)
                        AND (C.CONC_COD <> 974) AND (C.CONC_COD <> 980) AND (C.CONC_COD <> 981)
                        AND (C.CONC_COD <> 932) AND (C.CONC_COD <> 975) AND (C.CONC_COD <> 978) AND (C.CONC_COD <> 1026)
                        AND (C.CONC_COD <> 997) AND (C.CONC_COD <> 998) AND (C.CONC_COD <> 999) AND (C.CONC_COD <> 1033)
                        AND (C.CONC_COD <> 1000) AND (C.CONC_COD <> 1001) AND (C.CONC_COD <> 1002) AND (C.CONC_COD <> 1034)
                        AND (C.CONC_COD <> 1003) AND (C.CONC_COD <> 1004) AND (C.CONC_COD <> 1005) AND (C.CONC_COD <> 1035)
                        AND (C.CONC_COD <> 1006) AND (C.CONC_COD <> 1007) AND (C.CONC_COD <> 1008) AND (C.CONC_COD <> 1036)
                        and (C.CONC_COD <> 970) and (C.CONC_COD <> 1009) and (C.CONC_COD <> 1010) AND (C.CONC_COD <> 1037)
                        AND E.TERC_NIT = :NITE AND ((E.emco_monto = 0) or (E.emco_monto IS NULL))  into :otros;
                    if (otros is null) then
                        otros = 0;
                    BASICO = BASICO + OTROS;
                    /*SALARIO INTEGRAL */
                    if (SALINTEG = 'S') then
                        BASICO = BASICO * (tar_salinteg / 100);

                    /*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 and ((c.noex_nomid is null) or (c.noex_nomid = 0))
                        into :HORASEX;
                    if (HORASEX is null) then
                        HORASEX = 0;
                    /*RECARGOS*/
                    select sum(C.noex_montorec) 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 and ((c.noex_nomid is null) or (c.noex_nomid = 0))
                        into :recargo;
                    if (RECARGO is null) then
                        RECARGO = 0;
                    /*BASE*/
                    VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :vacacdisf + :REEMBOLSO + :INCAP + :RECARGO + :CAMBSALTRANS;
                    if (VALOR < 0) then
                        VALOR = 0;
                    /* si es manor a un minimo aporte sobre el minimo */
                    if ((difaportmin <> 'EMPLEADOR') AND (vacacdisf = 0)) then
                        if (MENSUAL <> 'S') then
                            begin
                            if (:VALOR < ((:SMLV/30)*:DIASLAB)) then
                                VALOR = (:SMLV/30)*:DIASLAB;
                            end
                         else
                            begin
                            if (VALOR < :SMLV) then
                                VALOR = :SMLV;
                            end
                    if (CONC_COD = 904) then /* AFP TRABAJADOR */
                        begin
                        ENTIDAD = :NITAFP;
                        select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                        VALOR = VALOR - VACACDISF; /* NO INCLUYA VACACIONES COMPENSADAS */
                        VALOR = ((:VALOR) * :PORCEN) /100;
                        end
                    else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) or (CONC_COD = 1012) ) then /* AFP EMPLEADOR */
                        begin
                        ENTIDAD = :NITAFP;
                        VALOR = VALOR - VACACDISF; /* NO INCLUYA VACACIONES COMPENSADAS */
                        select A.PAAN_AFPEM, a.paan_afptr from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                            into :PORCEN, :porcentr;
                        if ((difaportmin = 'EMPLEADOR') and (VALOR < (:SMLV/30)*:DIASLAB)) then
                            VALOR = ((:SMLV/30)*:DIASLAB * (PORCEN+PORCENTR) /100) - ((VALOR * :PORCENTR) /100);
                        else
                            VALOR = (:VALOR * :PORCEN) /100;
                        end
                    else if (CONC_COD = 921) then /* FSP */
                        begin
                        ENTIDAD = :NITAFP;
                        VALOR = VALOR - VACACDISF; /* NO INCLUYA VACACIONES COMPENSADAS */
                        if (dias>0) then
                            begin
                            if (((VALOR/dias) / (smlv/30)) >= 4) then
                                BEGIN
                                SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= ((:VALOR/:dias) / (:smlv/30)) AND
                                    FSPE_SMLVFIN >= ((:VALOR/:dias) / (:smlv/30)) INTO :porcen;
                                VALOR = (:VALOR * :PORCEN) /100;
                                END
                            ELSE
                                VALOR = 0;
                            end
                        else
                            VALOR = 0;
                        end
                    else if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013) ) then /* ARL */
                        begin
                        ENTIDAD = :NITARP;
                        VALOR = VALOR - VACACDISF; /* NO INCLUYA VACACIONES COMPENSADAS */
                        VALOR = (:VALOR * :PORCEN) /100;
                        end
                    else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938) or (CONC_COD = 1016)) then /* EPS */
                        begin
                        ENTIDAD = :NITEPS;
                        VALOR = VALOR - VACACDISF; /* NO INCLUYA VACACIONES COMPENSADAS */
                        if (CONC_COD = 907) then /* TRABAJADOR */
                            begin
                            select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else
                            begin   /* EMPLEADOR */
                            if (DIASLAB <> 0) then
                                if ((((VALOR/:DIASLAB) / (SMLV/30)) > MINAPEPS) or (salinteg = 'S')) then
                                    BEGIN
                                    select A.PAAN_EPSEM, a.paan_epstr from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                        into :PORCEN, :porcentr;
                                    if ((difaportmin = 'EMPLEADOR') and (VALOR < (:SMLV/30)*:DIASLAB)) then
                                        VALOR = ((:SMLV/30)*:DIASLAB * (PORCEN+PORCENTR) /100) - ((VALOR * :PORCENTR) /100);
                                    else
                                        VALOR = (:VALOR * :PORCEN) /100;
                                    end
                                ELSE
                                    VALOR = 0;
                            ELSE
                                VALOR = 0;
                            end
                        end
                    else if (conc_cod = 976) then /* EPS APRENDIZ SENA */
                        begin
                        ENTIDAD = :NITEPS;
                        VALOR = (:VALOR * :CONC_PORC) /100;
                        end
                    else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936) or (CONC_COD = 1014)) then
                        begin
                        /*ccf */
                        ENTIDAD = :NITCCF;
                        select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                        if (VALOR < (:SMLV/30)*:DIASLAB) then
                            VALOR = (:SMLV/30)*:DIASLAB;
                        VALOR = (:VALOR * :PORCEN) /100;
                        end
                    else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) or (CONC_COD = 1017) ) then
                        begin
                        /*icbf */
                        ENTIDAD = :NITCCF;
                        select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                        if (((VALOR / SMLV) > MINAPEPS) or (salinteg = 'S')) then
                            BEGIN
                            if (VALOR < (:SMLV/30)*:DIASLAB) then
                                VALOR = (:SMLV/30)*:DIASLAB;
                            END
                        else
                            VALOR = 0;
                        VALOR = (:VALOR * :PORCEN) /100;
                        end
                    else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) or (CONC_COD = 1018) ) then
                        begin
                        /*sena */
                        ENTIDAD = :NITCCF;
                        select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                        if (((VALOR / SMLV) > MINAPEPS) or (salinteg = 'S')) then
                            BEGIN
                            if (VALOR < (:SMLV/30)*:DIASLAB) then
                                VALOR = (:SMLV/30)*:DIASLAB;
                            END
                        else
                            VALOR = 0;
                        VALOR = (:VALOR * :PORCEN) /100;
                        end
                    else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937) or (CONC_COD = 1015)) 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 <= :FECHA and CE.EMCO_FECFIN >= :FECHA) 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 (:BASICO < (:SMLV*2)) then
                            AUXTRANS = (:AUXTRANO / 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 if (CONC_COD = 921) then /* FSP */
                        begin
                        ENTIDAD = :NITAFP;
                        VALOR = VALOR - VACACDISF; /* NO INCLUYA VACACIONES COMPENSADAS */
                        if ((:PERIODICIDAD = 1) or (MENSUAL = 'S')) Then
                            BASEFSP = FLOOR(VALOR / smlv);
                        else
                            if (:PERIODICIDAD = 2) then
                                BASEFSP = FLOOR(VALOR*2 / smlv);
                            else
                                BASEFSP = FLOOR(VALOR*4 / smlv);
                         if (BASEFSP >= 4) then
                             BEGIN
                             SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= :BASEFSP AND
                                 FSPE_SMLVFIN >= :BASEFSP INTO :porcen;
                             VALOR = (:VALOR * :PORCEN) /100;
                             END
                         else
                             VALOR = 0;
                        end
                    else
                        begin
                        if (CONC_PORC <> 0 and CONC_PORC is not null) then
                            VALOR = ((:VALOR) * CONC_PORC) /100;
                        else
                            if (:PORCEN <> 0 and :PORCEN is not null) then
                                VALOR = ((:VALOR) * PORCEN) /100;
                            else
                                if (:MONTOEMP <> 0 and :MONTOEMP is not null) then
                                    VALOR = :MONTOEMP;
                                else
                                    if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                        VALOR = :CONC_MONTO;
                        end
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end /* aportes */
              else if (CONC_PROV = 'S') then
                begin
                select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                    where N.nomi_id = NC.nomi_id AND N.nomi_periodo >= :perinicial and
                    N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_basepr = 'S' AND
                    NC.TERC_NIT = :NITE
                    into :valor;
                if (valor is null) then
                    valor = 0;
                AUXTRANS = 0;
                /* SI ES VACACIONES RESTE EL AUXILIO DE TRANSPORTE Y HORAS EXTRAS */
                if ((CONC_COD = 929) OR (CONC_COD = 930) OR (CONC_COD = 944) or (CONC_COD = 1021)) then
                    begin
                    select SUM(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where N.nomi_id = NC.nomi_id AND N.nomi_periodocidad = :PERIODICIDAD and N.nomi_periodo >= :perinicial and
                        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO AND NC.TERC_NIT = :NITE AND
                        ((conc_cod = 955) or (conc_cod = 956) or (conc_cod = 957) or (conc_cod = 2) or (conc_cod = 26))
                        INTO AUXTRANS;
                    if (AUXTRANS IS NULL) then
                        AUXTRANS = 0;
                    VALOR = VALOR - AUXTRANS;
                    /* HORS EXTRAS */
                    select SUM(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where N.nomi_id = NC.nomi_id AND N.nomi_periodocidad = :PERIODICIDAD and N.nomi_periodo >= :perinicial and
                        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.TERC_NIT = :NITE AND
                        ((conc_cod = 931) or (conc_cod = 945) or (conc_cod = 900) or (CONC_COD = 1022))
                        INTO horasex;
                    if (horasex IS NULL) then
                        HORASEX = 0;
                    VALOR = VALOR - HORASEX;
                    end
                if (CONC_PORC <> 0 and CONC_PORC is not null) then
                    BEGIN
                    /* INTERESES DE CESANTIA PORC PROPORCIONAL AL TIEMPO LABORADO */
                    if ((CONC_COD = 923) or (CONC_COD = 924) or (CONC_COD = 941) or (CONC_COD = 1019)) then
                        BEGIN
                        anoing = extract (YEAR FROM FECING);
                        if (ANOING = ANO) then
                            BEGIN
                            diasano = (12 - extract (MONTH FROM FECING)) * 30 + (30 - extract (DAY FROM FECING));
                            CONC_PORC = CONC_PORC * DIASANO / 360;
                            END
                        END
                    VALOR = :VALOR * :CONC_PORC /100;
                    END
                else
                    if (PORCEN <> 0 and PORCEN is not null) then
                        VALOR = :VALOR * :PORCEN /100;
                end /* provision */
              else if ((CONC_COD = 900) or (:CONC_COD = 931) or (:CONC_COD = 945) or (CONC_COD = 1022)) 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 and ((c.noex_nomid is null) or (c.noex_nomid = 0)) into :VALOR;
                if (VALOR is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 953) or (CONC_COD = 982) or (CONC_COD = 983) or (CONC_COD = 1027))  then /* RECNOCT */
                begin
                select sum(C.noex_mrecnoct) 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 and ((c.noex_nomid is null) or (c.noex_nomid = 0))
                    into :VALOR;
                if (VALOR is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 988) or (CONC_COD = 989) or (CONC_COD = 990) or (CONC_COD = 1030))  then /* RECFEST */
                begin
                select sum(C.noex_mrecfest) 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 and ((c.noex_nomid is null) or (c.noex_nomid = 0))
                    into :VALOR;
                if (VALOR is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 991) or (CONC_COD = 992) or (CONC_COD = 993) or (CONC_COD = 1031))  then /* DOMIN */
                begin
                select sum(C.noex_mdomin) 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 and ((c.noex_nomid is null) or (c.noex_nomid = 0))
                    into :VALOR;
                if (VALOR is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 994) or (CONC_COD = 995) or (CONC_COD = 996) or (CONC_COD = 1032))  then /* rec fest noct */
                begin
                select sum(C.noex_mrecfnoc) 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 and ((c.noex_nomid is null) or (c.noex_nomid = 0))
                    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 = :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;
                end
              else if ((CONC_COD = 955) or (CONC_COD = 956) or (CONC_COD = 957) or (CONC_COD = 1024)) then /* auxilio de transporte */
                begin
                execute procedure salario_base_empleado (:NITE, :periodicidad, :ano, :periodo, :fecha, 'S', :conc_cod) returning_values (:BASICO);
                BASICO = BASICO * FACSAL / 100;
                if (:BASICO < (:SMLV*2)) then
                    VALOR = (:AUXTRANO / 30) * :DIASLAB;
                else
                    VALOR = 0;
                if (VALOR is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 932)or (CONC_COD = 975) or (CONC_COD = 978) or (CONC_COD = 1026))  then
                begin
                /* incapacidad EMPLEADOR */
                select sum(ND.nnde_valor) 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 ND.nnde_tipoinc = 1
                    and N.TNOV_COD = 2 into :valor;
                if (:valor is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 997)or (CONC_COD = 998) or (CONC_COD = 999) or (CONC_COD = 1033) )  then
                begin
                /* incapacidad EPS */
                select sum(ND.nnde_valor) 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 ND.nnde_tipoinc = 2
                    and N.TNOV_COD = 2 into :valor;
                if (:valor is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 1000)or (CONC_COD = 1001) or (CONC_COD = 1002) or (CONC_COD = 993) or (CONC_COD = 1034) )  then
                begin
                /* incapacidad 50% */
                select sum(ND.nnde_valor) 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 ND.nnde_tipoinc = 3
                    and N.TNOV_COD = 2 into :valor;
                if (:valor is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 1003)or (CONC_COD = 1004) or (CONC_COD = 1005) or (CONC_COD = 1035) )  then
                begin
                /* incapacidad ARP */
                select sum(ND.nnde_valor) 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 = 3 into :valor;
                if (:valor is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 1006)or (CONC_COD = 1007) or (CONC_COD = 1008) or (CONC_COD = 1036) )  then
                begin
                /* LICENCIA MATERNIDAD */
                select sum(ND.nnde_valor) 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 = 4 into :valor;
                if (:valor is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 958) or (CONC_COD = 959) or (CONC_COD = 960) or (CONC_COD = 1025))  then
                begin
                /* LICENCIAS */
                select sum(ND.nnde_valor) 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 = 12 AND N.nono_fecha <= :fecha into :valor;
                if (:valor is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 950) or (CONC_COD = 949))  then
                begin
                /* pago vacaciones */
                select sum(VD.vacd_monto) from vacaciones V, vacaciones_detalle VD
                        where v.vaca_id = vD.vaca_id and v.terc_nit = :NITE
                        and VD.vacd_periodo >= :perinicial and vD.vacd_periodo <= :perfinal and VD.vacd_ano = :ANO
                        AND VD.vacd_paganom = 'S' AND V.vaca_fecha < :fecha
                        into :valor;
                if (:valor is null) then
                    VALOR = 0;
                end
              else if ((CONC_COD = 922) or (:PRESTAMO = 'S'))  then  /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                begin
                select sum(P.PRCU_MONTO-P.PRCU_ABONO) 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
                    and PN.conc_cod = :conc_cod into :VALOR;
                if (VALOR is null) then
                    VALOR = 0;
                end
              else if (CONC_PROMEDIO = 'S') then
                begin
                /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                if (((periodicidad = 1) AND (periodo = 15)) or ((periodicidad = 2) AND (periodo = 27))) then
                    begin
                    execute procedure periodo_nom_fecha (:fecha, :periodicidad) returning_values (:perfinal, :anofin);
                    anofin = anofin - 1;
                    anoini = anofin;
                    perinicial = 1;
                    perfinal = 12;
                    end
                else
                    begin
                    execute procedure periodo_nom_fecha (:fecha, :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
                    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 /* promedio */
              else if (CONC_OTROCONC = 'S') then
                begin
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANO and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANO and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                if (VALOR is null) then
                    VALOR = 0;
                if (SALDOSINI is null) then
                    SALDOSINI = 0;
                else
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANO 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 = :ANO and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                end
              else
                begin
                /* SI HAY UN VALOR PREDETERMINADO, TOME ESE VALOR */
                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 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;
                    end
                else if ((:MONTOEMP <> 0) and (:MONTOEMP is not null)) then
                    begin
                    /* 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 = :MONTOEMP;
                        if (:CONC_DIAS = 'S') then
                            VALOR = (:VALOR / 30) * :DIASLAB;
                        end     
                    else
                        if ((:PORCEN <> 0) and (PORCEN is not null)) then
                            VALOR = (:MONTOEMP * :PORCEN) /100;
                        else
                            VALOR = (:MONTOEMP * :CONC_PORC) /100;
                    end
                else if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                    begin
                    /* EL CONCEPTO TIENE MONTO FIJO */
                    if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
                        begin
                        VALOR = :CONC_MONTO;
                        if (:CONC_DIAS = 'S') then
                            VALOR = (:VALOR / 30) * :DIASLAB;
                        end
                    else
                        if ((:PORCEN <> 0) and (PORCEN is not null)) then
                            VALOR = (:CONC_MONTO * :PORCEN) /100;
                        else
                            VALOR = (:CONC_MONTO * :CONC_PORC) /100;
                    end
                else
                    begin
                    if ((:PORCEN <> 0) and (PORCEN is not null)) then
                        VALOR = (:BASICO * :PORCEN) /100;
                    else
                        if ((:CONC_PORC <> 0) and (CONC_PORC is not null)) then
                            VALOR = (:BASICO * :CONC_PORC) /100;
                        else
                            if ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903) or (CONC_COD = 1011) or
                                (CONC_COD = 971) or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 1023) or
                                (CONC_COD = 974) or (CONC_COD = 980) or (CONC_COD = 981))  then
                               VALOR = :BASICO;
                            else
                                VALOR = 0;
                    end
                end
                
              if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if (conc_deduc = 'S') then
                    VALOR = VALOR * -1;
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    BEGIN
                    SUSPEND;
                    END
                else
                    SUSPEND;
/*                    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
                                SUSPEND;
                            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
                                SUSPEND;
                            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
                                SUSPEND;
                            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
                                SUSPEND;
                            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
                                SUSPEND;
                            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
                                SUSPEND;
                            end
                        end */
                VALOR = 0;
                BASICO = 0;
                end
              END /* no se ha liquidado en este periodo */
            end /* for */
    /* marque las novedades usadas en esta nomina
        update nomina_novedades_detalle ND
            SET NOMI_ID = :idnomina
            WHERE ND.NNDE_PERIODO = :periodo AND ND.NNDE_ANO = :ANO AND
            EXISTS (SELECT NONO_ID FROM nomina_novedades WHERE NONO_ID = ND.nono_id AND TERC_NIT = :nit_tercero AND NONO_PPAGO = :periodicidad);*/
    end
end^


ALTER PROCEDURE CAUSA_NOMINA_VACACIONES (
    FECHA DATE,
    NITE VARCHAR(20),
    DIAS INTEGER,
    MONTO NUMERIC(18,2))
RETURNS (
    CONC_COD INTEGER,
    CONC_NOMBRE VARCHAR(60),
    ENTIDAD VARCHAR(20),
    VALOR NUMERIC(18,2))
AS
declare variable PERIODO integer;
declare variable PERIODICIDAD integer;
declare variable ANO char(4);
declare variable MONTOEMP numeric(18,2);
declare variable PORCEN numeric(9,4);
declare variable CONC_PORC numeric(9,4);
declare variable CONC_ENTIDAD varchar(20);
declare variable CONC_MONTO numeric(18,2);
declare variable CONC_PROMEDIO char(1);
declare variable DIASLAB integer;
declare variable CONC_DEDUC char(1);
declare variable CONC_APORTE char(1);
declare variable NUMEROPROM integer;
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 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 SALDOSINI numeric(18,2);
declare variable APROX integer;
declare variable MENSUAL char(1);
declare variable TOMASAL integer;
declare variable AUXTRANO numeric(18,2);
declare variable AUXTRANS numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable BENEFICIOS numeric(18,2);
declare variable PARAMBENEF char(2);
declare variable VALORPREDET numeric(18,2);
declare variable BASICOEMP numeric(18,2);
declare variable DIFAPORTMIN varchar(20);
declare variable PORCENTR numeric(9,4);
declare variable PORCDD numeric(9,4);
declare variable DEDDP char(1);
declare variable DEDD numeric(18,2);
declare variable DEDV numeric(18,2);
declare variable DEDMP numeric(18,2);
declare variable MAXDD numeric(18,2);
declare variable MAXDV numeric(18,2);
declare variable MAXDMP numeric(18,2);
declare variable BASE numeric(18,2);
declare variable BASEFSP integer;
declare variable MINAPEPS integer;
declare variable SALINTEG char(1);
declare variable PRESTAMO char(1);
begin
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'INGRESO BASE EXENTO DE PAGO DE APORTES POR SALUD EXPRESADO EN SMMLV') returning_values(:minapeps);
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'RESPONSABLE DE LA DIFERENCIA SOBRE EL APORTE MINIMO A SEGURIDAD SOCIAL')returning_values(:difaportmin);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
for select E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_CCF, e.empl_ppago, E.empl_salinteg
    from EMPLEADOS E where e.terc_nit = :nite and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FECHA)) and E.EMPL_FECING <= :FECHA
    into :NITEPS, :NITAFC, :NITAFP, :NITCCF, :periodicidad, :salinteg
    do
    begin
    ANO = extract (YEAR FROM FECHA);
    if (PERIODICIDAD = 1) then
        PERIODO = extract (MONTH FROM FECHA);
    if (PERIODICIDAD = 2) then
        begin
        PERIODO = (extract (MONTH FROM FECHA) * 2) - 1;
        if (extract (day from fecha) > 15) then
            PERIODO = PERIODO + 1;
        end
    if (PERIODICIDAD = 3) then
        PERIODO = extract (WEEK FROM FECHA);
    select P.PAAN_SALMINIMO, P.PAAN_AUXTR from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :SMLV, :auxtrano;
    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_PORC, CN.CONC_ENTIDAD, CN.CONC_MONTO,  CN.CONC_DIAS,
        CN.CONC_PROMEDIO, CN.CONC_SALARIO, CN.CONC_APORTE, CN.CONC_OTROCONC, CN.CONC_CODOTROCONC, CE.EMCO_TOMSAL, CN.conc_nombre, cn.conc_deduc, CN.conc_prestamo
        from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and
        ((cn.CONC_DIAS = 'S') or (CN.conc_prestamo = 'S')) and ((CN.conc_benefic = 'N') and (CN.conc_prov = 'N') AND (CN.conc_gtoempr = 'N'))
        AND (cn.conc_pagovac = 'S') and ( ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA)) 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)))) )
        and (CN.conc_activo = 'S') AND (CE.emco_activo = 'S') and (CE.CONC_COD <> 962)
        order by TERC_NIT, CN.conc_cod
        into :MONTOEMP, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_PORC,
        :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_PROMEDIO, :SALARIO,:CONC_APORTE , :CONC_OTROCONC, :CONC_CODOTROCONC, :TOMASAL, :conc_nombre, :conc_deduc, :PRESTAMO
            do
            begin
            if (MENSUAL = 'S') then
                begin
                if (PERIODICIDAD = 1) then
                    begin
                    perinicial = PERIODO;
                    PERFINAL = PERIODO;
                    end
                IF (PERIODICIDAD = 2) THEN
                    BEGIN
                    perinicial =  (extract(month from :FECHA) * 2) -1;
                    perfinal =  (extract(month from :FECHA) * 2);
                    END
                if (PERIODICIDAD = 3) then
                    BEGIN
                    perinicial = (extract(month from :fecha) * 4) -3;
                    perfinal = (extract(month from :fecha) * 4);
                    END
                end /* mensual */
            else
                begin
                perinicial = PERIODO;
                PERFINAL = PERIODO;
                end
                            
            if ((mensual = 'S') AND (PERIODICIDAD = 2) AND (LIQUIDAPER = 2)) then
                DIASLAB = DIAS + 15;
            ELSE
                DIASLAB = DIAS;

            /* 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
                    BEGIN
                    select DPTO_TARARP from DEPARTAMENTO D, EMPLEADOS E where E.terc_nit = :nite and E.empl_dpto = D.dpto_cod
                        into :porcen;
                    END
            /* TOME EL SALARIO BASE */
            execute procedure ibc_empleado (:NITE, :ANO, :periodo, :CONC_COD) returning_values (:BASICOEMP);
            BASICO = ((:BASICOEMP/30)*:DIASLAB);
            if ((MENSUAL = 'S') AND (: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 /* tomasal */

            if (CONC_APORTE = 'S') then
                begin
                BENEFICIOS = null;
--                if ((:ENTIDAD = '' ) or (ENTIDAD is null)) then
                    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
                            
                    valor = MONTO;
                    if (VALOR < 0) then
                        VALOR = 0;
                    /* si es manor a un minimo aporte sobre el minimo */
                    if (difaportmin <> 'EMPLEADOR') then
                        if (MENSUAL <> 'S') then
                            begin
                            if (:VALOR < ((:SMLV/30)*:DIASLAB)) then
                                VALOR = (:SMLV/30)*:DIASLAB;
                            end
                         else
                            begin
                            if (VALOR < :SMLV) then
                                VALOR = :SMLV;
                            end
                    if (CONC_COD = 904) then /* AFP TRABAJADOR */
                        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 /* AFP EMPLEADOR */
                        begin
                        ENTIDAD = :NITAFP;
                        select A.PAAN_AFPEM, a.paan_afptr from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                            into :PORCEN, :porcentr;
                        if ((difaportmin = 'EMPLEADOR') and (VALOR < (:SMLV/30)*:DIASLAB)) then
                            VALOR = ((:SMLV/30)*:DIASLAB * (PORCEN+PORCENTR) /100) - ((VALOR * :PORCENTR) /100);
                        else
                            VALOR = (:VALOR * :PORCEN) /100;
                        end
                    else if (CONC_COD = 921) then /* FSP */
                        begin
                        ENTIDAD = :NITAFP;
                        if (((:VALOR/:dias) / (:smlv/30)) >= 4) then
                            BEGIN
                            SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= ((:VALOR/:dias) / (:smlv/30)) AND
                                FSPE_SMLVFIN >= ((:VALOR/:dias) / (:smlv/30)) INTO :porcen;
                            VALOR = (:VALOR * :PORCEN) /100;
                            END
                        ELSE
                            VALOR = 0;
                        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 /* EPS TRABAJADOR */
                            begin
                            select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else
                            begin   /* EPS EMPLEADOR */
                            if (DIASLAB <> 0) then
                                if ((((VALOR/:DIASLAB) / (SMLV/30)) > MINAPEPS) or (salinteg = 'S')) then
                                    BEGIN
                                    select A.PAAN_EPSEM, a.paan_epstr from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                        into :PORCEN, :porcentr;
                                    if ((difaportmin = 'EMPLEADOR') and (VALOR < (:SMLV/30)*:DIASLAB)) then
                                        VALOR = ((:SMLV/30)*:DIASLAB * (PORCEN+PORCENTR) /100) - ((VALOR * :PORCENTR) /100);
                                    else
                                        VALOR = (:VALOR * :PORCEN) /100;
                                    end
                                ELSE
                                    VALOR = 0;
                            ELSE
                                VALOR = 0;
                            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;
                        if (VALOR < (:SMLV/30)*:DIASLAB) then
                            VALOR = (:SMLV/30)*:DIASLAB;
                        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;
                        if (((VALOR / SMLV) > MINAPEPS) or (salinteg = 'S')) then
                            if (VALOR < (:SMLV/30)*:DIASLAB) then
                                VALOR = (:SMLV/30)*:DIASLAB;
                        else
                            VALOR = 0;
                        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;
                        if (((VALOR / SMLV) > MINAPEPS) or (salinteg = 'S')) then
                            if (VALOR < (:SMLV/30)*:DIASLAB) then
                                VALOR = (:SMLV/30)*:DIASLAB;
                        else
                            VALOR = 0;
                        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 <= :FECHA and CE.EMCO_FECFIN >= :FECHA) 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 (:BASICO < (:SMLV*2)) then
                            AUXTRANS = (:AUXTRANO / 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 if (CONC_COD = 962) then /* RETENCION */
                        begin
                        ENTIDAD = :nite;
                        /* descuente las exenciones */
                        SELECT PAAN_DEDDEP, PAAN_MAXDEDDEP, PAAN_MAXDEDMP, PAAN_MAXDEDAFC FROM parametros_ano WHERE PAAN_ANO = :ANO
                            INTO :PORCDD, :MAXDD, :MAXDMP, :MAXDV;
                        SELECT EMPL_DEDDEP, EMPL_DEDINTV+EMPL_DEDAFC,EMPL_DEDMEDP FROM empleados WHERE TERC_NIT = :NITE
                            INTO :DEDDP, :DEDV, :DEDMP;
                        if (DEDV IS NULL) THEN
                            DEDV = 0;
                        if (DEDMP IS NULL) THEN
                            DEDMP = 0;
                        if (DEDV > MAXDV) then
                            DEDV = MAXDV;
                        if (DEDMP > MAXDMP) then
                            DEDMP = MAXDMP;
                        VALOR = VALOR - DEDV - DEDMP;
                        if (DEDDP = 'S') then
                            BEGIN
                            DEDD = VALOR * PORCDD / 100;
                            if (DEDD > MAXDD) then
                                DEDD = MAXDD;
                            VALOR = VALOR - DEDD;
                            END
                        PORCEN = NULL;
                        SELECT FIRST 1 RETE_PORC FROM RETENCIONES WHERE RETE_DESDE <= :VALOR AND RETE_HASTA >= :VALOR
                            INTO :PORCEN;
                        if (PORCEN IS NULL) then
                            PORCEN = 0;
                        if (PORCEN <> 0) then
                            BEGIN
                            SELECT FIRST 1 RETE_DESDE FROM RETENCIONES WHERE RETE_PORC = 0 INTO :base;
                            VALOR = ((:VALOR - :BASE) * :PORCEN) /100;
                            END
                        ELSE
                            VALOR = 0;
                        end
                    else if (CONC_COD = 921) then /* FSP */
                        begin
                        ENTIDAD = :NITAFP;
                        if ((:PERIODICIDAD = 1) or (MENSUAL = 'S')) Then
                            BASEFSP = FLOOR(VALOR / smlv);
                        else
                            if (:PERIODICIDAD = 2) then
                                BASEFSP = FLOOR(VALOR*2 / smlv);
                            else
                                BASEFSP = FLOOR(VALOR*4 / smlv);
                         if (BASEFSP >= 4) then
                             BEGIN
                             SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= :BASEFSP AND
                                 FSPE_SMLVFIN >= :BASEFSP INTO :porcen;
                             VALOR = (:VALOR * :PORCEN) /100;
                             END
                         else
                             VALOR = 0;
                        end
                    else
                        begin
                        if (CONC_PORC <> 0 and CONC_PORC is not null) then
                            VALOR = ((:VALOR) * CONC_PORC) /100;
                        else
                            if (:PORCEN <> 0 and :PORCEN is not null) then
                                VALOR = ((:VALOR) * PORCEN) /100;
                            else
                                if (:MONTOEMP <> 0 and :MONTOEMP is not null) then
                                    VALOR = :MONTOEMP;
                                else
                                    if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                        VALOR = :CONC_MONTO;
                        end
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end /* aportes */
            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;
                end
            else if ((CONC_COD = 955) or (CONC_COD = 956) or (CONC_COD = 957)) then /* auxilio de transporte */
                begin
                VALOR = 0;
                end
            else if ((CONC_COD = 922) or (:PRESTAMO = 'S'))  then  /* SI ES UN PRESTAMO, TRAIGA LA CUOTA */
                begin
                if (NOT EXISTS (SELECT N.NOMI_ID FROM NOMINA N, NOMINA_CONCEPTOS NC WHERE
                  N.nomi_id = NC.nomi_id AND N.nomi_ano = :ano AND N.nomi_periodo >= :perinicial AND N.nomi_periodo <= :perfinal
                  AND NC.terc_nit = :NITE AND NC.conc_cod = :CONC_COD AND NC.noco_valor <> 0)) then
                  begin
                  VALOR = 0;
                  select sum(P.PRCU_MONTO-P.PRCU_ABONO) 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
                    and PN.conc_cod = :conc_cod into :VALOR;
                  if (VALOR is null) then
                    VALOR = 0;
                  end
                end
            else if ((CONC_COD = 950) or (CONC_COD = 949))  then
                begin
                /* pago vacaciones */
                select sum(VD.vacd_monto) from vacaciones V, vacaciones_detalle VD
                        where v.vaca_id = vD.vaca_id and v.terc_nit = :NITE
                        and VD.vacd_periodo >= :perinicial and vD.vacd_periodo <= :perfinal and VD.vacd_ano = :ANO
                        AND VD.vacd_paganom = 'S' AND V.vaca_fecha <= :fecha
                        into :valor;
                if (:valor is null) then
                    VALOR = 0;
                end
            else if (CONC_PROMEDIO = 'S') then
                begin
                /* CALCULO DEL PROMEDIO BASE DESDE LA FECHA MENOS EL NUMERO DE PERIODOS */
                if (((periodicidad = 1) AND (periodo = 15)) or ((periodicidad = 2) AND (periodo = 27))) then
                    begin
                    execute procedure periodo_nom_fecha (:fecha, :periodicidad) returning_values (:perfinal, :anofin);
                    anofin = anofin - 1;
                    anoini = anofin;
                    perinicial = 1;
                    perfinal = 12;
                    end
                else
                    begin
                    execute procedure periodo_nom_fecha (:fecha, :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
                    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
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANO and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANO and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                if (VALOR is null) then
                    VALOR = 0;
                if (SALDOSINI is null) then
                    SALDOSINI = 0;
                else
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANO 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 = :ANO and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                end
            else
                begin
                /* SI HAY UN VALOR PREDETERMINADO, TOME ESE VALOR */
                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 if ((:MONTOEMP <> 0) and (:MONTOEMP is not null)) then
                    begin
                    /* 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 = :MONTOEMP;
                        if (:CONC_DIAS = 'S') then
                            VALOR = (:VALOR / 30) * :DIASLAB;
                        end     
                    else
                        if ((:PORCEN <> 0) and (PORCEN is not null)) then
                            VALOR = (:MONTOEMP * :PORCEN) /100;
                        else
                            VALOR = (:MONTOEMP * :CONC_PORC) /100;
                    end
                else if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                    begin
                    /* EL CONCEPTO TIENE MONTO FIJO */
                    if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
                        begin
                        VALOR = :CONC_MONTO;
                        if (:CONC_DIAS = 'S') then
                            VALOR = (:VALOR / 30) * :DIASLAB;
                        end
                    else
                        if ((:PORCEN <> 0) and (PORCEN is not null)) then
                            VALOR = (:CONC_MONTO * :PORCEN) /100;
                        else
                            VALOR = (:CONC_MONTO * :CONC_PORC) /100;
                    end
                else
                    begin
                    if ((:PORCEN <> 0) and (PORCEN is not null)) then
                        VALOR = (:BASICO * :PORCEN) /100;
                    else
                        if ((:CONC_PORC <> 0) and (CONC_PORC is not null)) then
                            VALOR = (:BASICO * :CONC_PORC) /100;
                        else
                            if ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903) or (CONC_COD = 1011) or
                                (CONC_COD = 971) or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 1023) or
                                (CONC_COD = 974) or (CONC_COD = 980) or (CONC_COD = 981))  then
                               VALOR = :BASICO;
                            else
                                VALOR = 0;
                    end
                end
                
            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                if (conc_deduc = 'S') then
                    VALOR = VALOR * -1;
                if ((MENSUAL = 'N') or (PERIODICIDAD = 1))  then
                    BEGIN
                    SUSPEND;
                    END
                else
                    SUSPEND;
/*                    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
                                SUSPEND;
                            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
                                SUSPEND;
                            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
                                SUSPEND;
                            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
                                SUSPEND;
                            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
                                SUSPEND;
                            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
                                SUSPEND;
                            end
                        end    */
                    VALOR = 0;
                    BASICO = 0;
                    end
            end /* for */
    end
end^


ALTER PROCEDURE CAUSA_NOMINA1 (
    FEC DATE,
    PERIODO INTEGER,
    PERIODICIDAD INTEGER,
    PAGOGLOBAL CHAR(1),
    ANO CHAR(4),
    DEPTO INTEGER)
RETURNS (
    IDNOMINA INTEGER,
    ITEMINI INTEGER)
AS
declare variable fecha date;
declare variable item integer;
declare variable idpr integer;
declare variable itempr integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montoemp 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_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 salario char(1);
declare variable liquidaper integer;
declare variable basico numeric(18,2);
declare variable basicoAUX numeric(18,2);
declare variable gtoempr char(1);
declare variable cambsaltrans numeric(18,2);
declare variable saldosini numeric(18,2);
declare variable duranov integer;
declare variable aprox integer;
declare variable mensual char(1);
declare variable tomasal integer;
declare variable auxtrano numeric(18,2);
declare variable smlv numeric(18,2);
declare variable confirmado char(1);
declare variable valorpredet numeric(18,2);
declare variable valoraux numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable dpt integer;
declare variable varias char(2);
declare variable fecing date;
declare variable nomdpto varchar(60);
declare variable CANT numeric(18,2);
declare variable FACSAL numeric(18,2);
declare variable MAXFS numeric(18,2);
declare variable benef char(1);
declare variable benpag char(1);
declare variable DIASPER INTEGER;
declare variable DIASPRIMA INTEGER;
declare variable BASE numeric(18,2);
declare variable PRESTAMO CHAR(1);
declare variable perini integer;
declare variable perfin integer;
declare variable LICNR integer;
begin
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'PERMITIR GRABAR VARIAS NOMINAS PARA EL MISMO PERIODO') returning_values (:VARIAS);
select first 1 N.NOMI_ID, N.NOMI_LIQOK from NOMINA N where N.NOMI_PERIODO = :PERIODO and N.NOMI_PERIODOCIDAD = :PERIODICIDAD
    and N.NOMI_ANO = :ANO and NOMI_TIPO = 'N' into :IDNOMINA, :CONFIRMADO;
nomdpto = '';
if (DEPTO <> 0) then
    select dpto_nombre from departamento WHERE dpto_cod = :depto into :nomdpto;
if ((:IDNOMINA is null) or (:VARIAS = 'SI')) then
    begin
    execute procedure CAMBIE_ID_NOMINA returning_values(:IDNOMINA);
    if (periodicidad = 1) then
        BEGIN
        if ((nomdpto is null) or (nomdpto = '')) then
            nomdpto = 'NOMINA MENSUAL ';
        insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK, NOMI_CONC, NOMI_TIPO)
        values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N', SUBSTRING(:nomdpto FROM 1 FOR 23) ||' ANËœO ' || :ANO || ' PERIODO ' || :PERIODO, 'N');
        END
    else
        if (periodicidad = 2) then
            BEGIN
            if ((nomdpto is null) or (nomdpto = '')) then
                nomdpto = 'NOMINA QUINCENAL ';
            insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK, NOMI_CONC, NOMI_TIPO)
            values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N', SUBSTRING(:nomdpto FROM 1 FOR 23) || ' ANËœO ' || :ANO || ' PERIODO ' || :PERIODO, 'N');
            END
        else
            BEGIN
            if ((nomdpto is null) or (nomdpto = '')) then
                nomdpto = 'NOMINA SEMANAL ';
            insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK, NOMI_CONC, NOMI_TIPO)
            values (:IDNOMINA, :FEC,:PAGOGLOBAL, :PERIODICIDAD, :PERIODO, :ANO, 'N', SUBSTRING(:nomdpto FROM 1 FOR 23) || ' ANËœO ' || :ANO || ' PERIODO ' || :PERIODO, 'N');
            END
    ITEM = 1;
    end
else
    begin
    select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA into :ITEM;
    if ((CONFIRMADO = 'S') and (IDNOMINA is not null)) then
        begin
        IDNOMINA = 0;
        end
    end
if (idnomina <> 0) then
    begin
    DELETE FROM VALORES_NOMINA WHERE NOMI_ID = :idnomina;
    execute procedure fecha_final_periodo_pago (:periodicidad, :ano, :periodo) returning_values (:FECHA);
    if (DEPTO = 0) then
        begin
        for select dpto_cod from departamento into :dpt do
            insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:DPT);
        end
    else
        insert into NOMINA_DEPARTAMENTO (NOMI_ID, NODP_DEPTO)values(:IDNOMINA,:depto);
    select P.PAAN_SALMINIMO, P.PAAN_AUXTR, P.paan_maxfs from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :SMLV, :auxtrano, :maxfs;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.empl_fecing, E.empl_facsal
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FECHA)) and E.EMPL_FECING <= :FECHA
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        and not exists (select ND.NOMI_ID from nomina_detalle ND, NOMINA N where N.nomi_id = ND.nomi_id and ND.terc_nit = E.terc_nit
        and N.nomi_ano = :ano and N.nomi_periodo = :periodo and N.nomi_periodocidad = :periodicidad)
        into :NITE, :fecing, :facsal
        do
        begin
        if ((FACSAL IS NULL) or (FACSAL = 0))  then
            FACSAL = 100;
        if (FACSAL < MAXFS) then
            FACSAL = MAXFS;
        /* solo pagos y deducciones */
        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_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, CE.EMCO_TOMSAL, CN.conc_benefic, CN.CONC_BENPAG, CN.conc_prestamo
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and (CN.conc_activo = 'S') AND (CE.emco_activo = 'S') AND
            ( ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA) AND (((:periodicidad = 1) and (:PERIODO < 13)) or ((:periodicidad = 2) and (:PERIODO < 25)))) 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)))) )
            and conc_aporte = 'N' and conc_prov = 'N'
            order by TERC_NIT, CN.conc_cod
            into :NIT_TERCERO, :CONCEPT,  :MONTOEMP, :PORCEN, :ENTIDAD, :NUMEROPROM, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:CONC_PROMEDIO, :SALARIO,:CONC_PROV, :CONC_APORTE , :CONC_APLICAPROM, :CONC_OTROCONC, :CONC_CODOTROCONC, :GTOEMPR, :TOMASAL, :benef, :BENPAG, :PRESTAMO
            do
            begin
            CANT = 0;
            BASE = 0;
            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
            /* NO INCLUYA CONCEPTOS QUE NO SE CALCULAN POR DIAS, PREVIAMENTE PAGADOS EN EL PERIODO */
            if ((CONC_DIAS = 'S') or (NOT EXISTS (SELECT N.NOMI_ID FROM NOMINA N, NOMINA_CONCEPTOS NC WHERE
              N.nomi_id = NC.nomi_id AND N.nomi_ano = :ano AND N.nomi_periodo >= :perinicial AND N.nomi_periodo <= :perfinal
                AND NC.terc_nit = :NITE AND NC.conc_cod = :CONC_COD AND NC.noco_valor <> 0))) then
              BEGIN
              if (CONC_DIAS = 'S') then
                execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FECHA, :MENSUAL,:CONC_COD) returning_values (:DIASLAB);
              else
                select PPAG_DIAS from PERIODO_PAGO where PPAG_COD = :periodicidad into :diaslab;

              execute procedure ibc_empleado (:NITE, :ANO, :periodo, :conc_cod) returning_values (:BASICOEMP);
              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;
              BASICO = ((:BASICOEMP/30)*:DIASLAB) + :CAMBSALTRANS;
              if (:benef = 'S') then
                  BEGIN
                  BASICO = BASICO * (100 - :facsal) / 100;
                  if (benpag = 'V') then
                    begin
                    /* descuente auxilio transporte si lo hubo */
                    execute procedure salario_base_empleado (:NITE, :periodicidad, :ano, :periodo, :fec, 'S', :conc_cod) returning_values (:basicoaux);
                    basicoaux = basicoaux * FACSAL / 100;
                    if (((:basicoaux/30) < ((:SMLV/30)*2)) and (exists (select conc_cod from empleado_conceptos where terc_nit = :nite and (conc_cod = 955) or (conc_cod = 956) or (conc_cod = 957)))) Then
                        BASICO = BASICO - ((:AUXTRANO / 30) * :DIASLAB);
                    end
                  END
              else
                  BASICO = BASICO * :facsal / 100;

              if ((MENSUAL = 'S') and (: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 /* tomasal */

              if ((CONC_COD = 900) or (:CONC_COD = 931) or (:CONC_COD = 945) or (:CONC_COD = 1022) or -- EXTRAS DIURNAS
                 (CONC_COD = 1040) or (:CONC_COD = 1041) or (:CONC_COD = 1042) or (:CONC_COD = 1043) or -- NOCTURNAS
                 (CONC_COD = 1044) or (:CONC_COD = 1045) or (:CONC_COD = 1046) or (:CONC_COD = 1047) or -- FESTIVAS
                 (CONC_COD = 1048) or (:CONC_COD = 1049) or (:CONC_COD = 1050) or (:CONC_COD = 1051)) then /* horas extra */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(C.NOEX_MONTO), sum(c.noex_diur+c.noex_fdiur+c.noex_noct+c.noex_fnoct) 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
                         AND ((C.noex_nomid = 0) or (C.noex_nomid IS NULL))
                        into :VALOR, :cant;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 953) or (CONC_COD = 982) or (CONC_COD = 983) or (CONC_COD = 1027))  then /* RECNOCT */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(C.noex_mrecnoct), sum(c.noex_recnoct) 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
                         AND ((C.noex_nomid = 0) or (C.noex_nomid IS NULL))
                        into :VALOR, :cant;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 988) or (CONC_COD = 989) or (CONC_COD = 990) or (CONC_COD = 1030))  then /* RECFEST */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(C.noex_mrecfest), sum(c.noex_recfest) 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
                         AND ((C.noex_nomid = 0) or (C.noex_nomid IS NULL))
                        into :VALOR, :cant;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 991) or (CONC_COD = 992) or (CONC_COD = 993) or (CONC_COD = 1031))  then /* DOMIN */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(C.noex_mdomin), sum(c.noex_domin) 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
                         AND ((C.noex_nomid = 0) or (C.noex_nomid IS NULL))
                        into :VALOR, :cant;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 994) or (CONC_COD = 995) or (CONC_COD = 996) or (CONC_COD = 1032))  then /* RECFESTNOC */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(C.noex_mrecfnoc), sum(c.noex_recfnoc) 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
                         AND ((C.noex_nomid = 0) or (C.noex_nomid IS NULL))
                        into :VALOR, :cant;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                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;
                end
              else if ((CONC_COD = 955) or (CONC_COD = 956) or (CONC_COD = 957) or (CONC_COD = 1024)) then /* auxtransporte */
                begin
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    execute procedure salario_base_empleado (:NITE, :periodicidad, :ano, :periodo, :fec, 'S', :conc_cod) returning_values (:BASICO);
                    BASICO = BASICO * FACSAL / 100;
                    if ((:BASICO/30) < ((:SMLV/30)*2)) then
                        VALOR = (:AUXTRANO / 30) * :DIASLAB;
                    else
                        VALOR = 0;
                    if (VALOR is null) then
                        VALOR = 0;
                    END
                CANT = diaslab;
                end
              else if ((CONC_COD = 932)or (CONC_COD = 975) or (CONC_COD = 978) or (CONC_COD = 957) or (CONC_COD = 1026) )  then
                begin
                /* incapacidad EMPRESA */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 ND.nnde_tipoinc = 1
                        and N.TNOV_COD = 2 into :valor, :CANT;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 997)or (CONC_COD = 998) or (CONC_COD = 999) or (CONC_COD = 1033) )  then
                begin
                /* incap EPS */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 ND.nnde_tipoinc = 2
                        and N.TNOV_COD = 2 into :valor, :CANT;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 1000)or (CONC_COD = 1001) or (CONC_COD = 1002) or (CONC_COD = 1034) )  then
                begin
                /* incap 50% */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 ND.nnde_tipoinc = 3
                        and N.TNOV_COD = 2 into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 1003)or (CONC_COD = 1004) or (CONC_COD = 1005) or (CONC_COD = 1035) )  then
                begin
                /* incap ARP */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 = 3 into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 1006)or (CONC_COD = 1007) or (CONC_COD = 1008) or (CONC_COD = 1036) )  then
                begin
                /* LIC MATERNIDAD */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 = 4 into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 958) or (CONC_COD = 959) or (CONC_COD = 960) or (CONC_COD = 1025))  then
                begin
                /* LIC REMUNERADA */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(ND.nnde_valor), 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 = 12 into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if (CONC_COD = 950) then
                begin
                /* pago vac */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(VD.vacd_monto), SUM(VD.vacd_dias) from vacaciones V, vacaciones_detalle VD
                        where v.vaca_id = vD.vaca_id and v.terc_nit = :NITE and v.vaca_disfr = 'N'
                        and VD.vacd_periodo >= :perinicial and vD.vacd_periodo <= :perfinal and VD.vacd_ano = :ANO AND VD.vacd_paganom = 'S'
                        into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if (CONC_COD = 949) then
                begin
                /* pago vac */
                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 :VALOR;
                if ((VALOR is null) or (valor = 0)) then
                    BEGIN
                    select sum(VD.vacd_monto), SUM(VD.vacd_dias) from vacaciones V, vacaciones_detalle VD
                        where v.vaca_id = vD.vaca_id and v.terc_nit = :NITE and v.vaca_disfr = 'S'
                        and VD.vacd_periodo >= :perinicial and vD.vacd_periodo <= :perfinal and VD.vacd_ano = :ANO AND VD.vacd_paganom = 'S'
                        into :valor, :cant;
                    if (:valor is null) then
                        VALOR = 0;
                    END
                if (cant is null) then
                    cant = 0;
                end
              else if ((CONC_COD = 922) or (:PRESTAMO = 'S')) then  /* PRESTAMO */
                begin
                select sum(P.PRCU_MONTO-P.prcu_abono) 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
                    and PN.conc_cod = :conc_cod into :VALOR;
                if (VALOR is null) then
                    VALOR = 0;
                else
                    BEGIN
                    valorpredet = 0; /* PODIA TRAER EL VALOR DEL CONCEPTO ANTERIOR */
                    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 is null) then
                         valorpredet = 0;
                    if (valorpredet > valor) then
                        BEGIN
                        VALORAUX = VALOR;
                        VALOR = VALORPREDET;
                        /* ABONE A LA ULTIMA CUOTA */
                        VALORPREDET = VALORPREDET - VALORAUX;
                        for select max(p.prno_id), MAX(PRCU_ITEM) from PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
                            where PN.PRNO_ID = P.PRNO_ID and PN.TERC_NIT = :NITE and PN.conc_cod = :conc_cod
                            and p.prcu_monto > p.prcu_abono
                            group by p.prno_id  into :idpr, :ITEMPR
                            do
                            begin
                            if (valorpredet > 0) then
                                BEGIN
                                select sum(P.PRCU_MONTO-P.prcu_abono) from PRESTAMO_CUOTAS P
                                    where PRNO_ID = :idpr and prcu_item = :itempr into :valoraux;
                                if (valoraux is null) then
                                     valoraux = 0;
                                else
                                    if (valoraux > valorpredet) then
                                        BEGIN
                                        update PRESTAMO_CUOTAS  P set PRCU_OK = 'S', PRCU_ABONO = :valorpredet, PRCU_NOMIID = :idnomina
                                            where P.prno_id = :idpr and P.prcu_item = :itempr;
                                        VALORPREDET = 0;
                                        END
                                    else
                                        BEGIN
                                        update PRESTAMO_CUOTAS  P set PRCU_OK = 'S', PRCU_ABONO = :valoraux, PRCU_NOMIID = :idnomina
                                            where P.prno_id = :idpr and P.prcu_item = :itempr;
                                        VALORPREDET = VALORPREDET - VALORAUX;
                                        END
                                END
                            end
                        END
                    else
                        begin
                        /* MARQUE CUOTA PAGADA */
                        FOR SELECT P.prno_id, P.prcu_item 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
                            and PN.conc_cod = :conc_cod AND P.prcu_abono < P.prcu_monto into :IDPR, ITEMPR
                            DO
                            update PRESTAMO_CUOTAS P set PRCU_OK = 'S', PRCU_ABONO = PRCU_MONTO, PRCU_NOMIID = :idnomina
                                where P.prno_id = :IDPR and P.prcu_item = :ITEMPR;
                        end
                    END
                end
              else if (CONC_OTROCONC = 'S') then
                begin
                /* SE LIQUIDA SOBRE OTRO */
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_ANO = :ANO and N.CONC_COD = :CONC_CODOTROCONC and N.TERC_NIT = :NITE into :VALOR;
                select NOCO_VALOR from NOMINA_CONCEPTOS where NOCO_ANO = :ANO and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE and NOCO_PERIODO = 0 into :SALDOSINI;
                if (VALOR is null) then
                    VALOR = 0;
                if (SALDOSINI is null) then
                    SALDOSINI = 0;
                else
                    update NOMINA_CONCEPTOS set NOCO_PAGOOK = 'S' where NOCO_ANO = :ANO 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 = :ANO and CONC_COD = :CONC_CODOTROCONC and TERC_NIT = :NITE;
                CANT = DIASLAB;
                end
              else
                begin
                /* VALOR PREDETERMINADO */
                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
                    BEGIN
                    VALOR = VALORPREDET;
                    CANT = DIASLAB;
                    END
                else if (CONC_PROMEDIO = 'S') then
                    begin
                    /* CALCULO DEL PROMEDIO */
                    execute procedure periodo_nom_fechaf (:fecha, :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 NC, nomina N
                            where NC.NOCO_APLICAPROM = 'S' and N.nomi_id = NC.nomi_id AND N.nomi_feccausa >= :fecing AND
                            ((NC.NOCO_PERIODO >= :PERINICIAL and NC.NOCO_ANO = :anoini) or
                            (NC.NOCO_PERIODO <= :perfinal and NC.NOCO_ANO = :anofin)) and TERC_NIT = :NITE into :VALOR;
                    else
                        select sum (NOCO_VALOR) from NOMINA_CONCEPTOS NC, nomina N
                            where NC.NOCO_APLICAPROM = 'S' and N.nomi_id = NC.nomi_id AND N.nomi_feccausa >= :fecing AND
                            NC.NOCO_PERIODO >= :PERINICIAL and NC.NOCO_ANO = :anoini
                            and NC.NOCO_PERIODO <= :perfinal and TERC_NIT = :NITE into :VALOR;
                    INSERT INTO valores_nomina VALUES(:nite, 'ANOINI', :anoini, :IDNOMINA, :conc_cod);
                    INSERT INTO valores_nomina VALUES(:nite, 'PERINI', :perinicial, :IDNOMINA, :conc_cod);
                    INSERT INTO valores_nomina VALUES(:nite, 'ANOFIN', :anofin, :IDNOMINA, :conc_cod);
                    INSERT INTO valores_nomina VALUES(:nite, 'PERFIN', :perfinal, :IDNOMINA, :conc_cod);
                    INSERT INTO valores_nomina VALUES(:nite, 'VALOR PROMEDIO', :VALOR, :IDNOMINA, :conc_cod);
                    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;
                    INSERT INTO valores_nomina VALUES(:nite, 'VALOR PROMEDIO+SALDINI', :VALOR, :IDNOMINA, :conc_cod);
                    VALOR = VALOR / NUMEROPROM;
                    INSERT INTO valores_nomina VALUES(:nite, 'VALOR/NROPROM', :VALOR, :IDNOMINA, :conc_cod);
                    if ((conc_cod = 966) or (conc_cod = 967))  then
                        begin
                        /* pago de prima */
                        EXECUTE procedure salario_promedio(:nite,  :FECHA, 'P') returning_values (:VALOR);
                        INSERT INTO valores_nomina VALUES(:nite, 'SAL PROM', :VALOR, :IDNOMINA, :conc_cod);
                        if (CONC_COD = 966) then
                            execute procedure dias_entre_nomina(:fecing, :anofin || '/06/30') returning_values (diasprima);
                        else
                            execute procedure dias_entre_nomina(:fecing, :anofin || '/12/31') returning_values (diasprima);
                        if (DIASPRIMA > 180) then
                            DIASPRIMA = 180;
                        VALOR = VALOR * DIASPRIMA / 360;
                        CANT = DIASPRIMA;
                        end
                    ELSE if ((conc_cod = 951) or (conc_cod = 968))  then
                        begin
                        /* pago cesantias e intereses */
                        EXECUTE procedure salario_promedio(:nite,  :FECHA, 'C') returning_values (:VALOR);
                        INSERT INTO valores_nomina VALUES(:nite, 'SAL PROM', :VALOR, :IDNOMINA, :conc_cod);
                        if ((extract(month from :fec) = 12) AND (EXTRACT(day FROM :FEC) >= 30)) then
                            begin
                            execute procedure dias_entre_nomina(:fecing, :anofin || '/12/31') returning_values (diasprima);
                            if (DIASPRIMA > 360) then
                                DIASPRIMA = 360;
                            if (periodicidad = 1) then
                                BEGIN
                                PERINI = 1;
                                PERFIN = 12;
                                END
                            if (periodicidad = 2) then
                                BEGIN
                                PERINI = 1;
                                PERFIN = 24;
                                END
                            /* RESTE LOS DIAS DE SUSPENCION */
                            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 ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
                                AND ND.nnde_ano = substr(:FEC,1,4) AND (ND.nnde_periodo >= :perini) AND (ND.nnde_periodo <= :perfin)
                                INTO :LICNR;
                            if (licnr IS NULL) then
                                licnr = 0;
                            DIASPRIMA = DIASPRIMA - LICNR;
                            VALOR = VALOR * CAST(DIASPRIMA as NUMERIC(9,4)) / 360;
                            CANT = DIASPRIMA;
                            INSERT INTO valores_nomina VALUES(:nite, 'CESANTIA', :VALOR, :IDNOMINA, :conc_cod);
                            if (CONC_COD = 951) then
                                BEGIN
                                /* RESTE PAGOS ANTERIORES */
                                select sum(nc.noco_valor) from nomina_conceptos nc, nomina n where n.nomi_id = nc.nomi_id and nc.conc_cod = 951
                                    and n.nomi_ano = :ano and nc.terc_nit = :nite into :valoraux;
                                if (valoraux is null) then
                                    valoraux = 0;
                                INSERT INTO valores_nomina VALUES(:nite, 'PAGOS PREVIOS', :valoraux, :IDNOMINA, :conc_cod);
                                VALOR = VALOR - VALORAUX;
                                END
                            INSERT INTO valores_nomina VALUES(:nite, 'CESANTIA A PAGAR', :valor, :IDNOMINA, :conc_cod);
                            /* INTERESES */
                            if (conc_cod = 968) then
                                BEGIN
                                porcen = (CAST(DIASPRIMA AS NUMERIC(9,4)) / 360)*12;
                                INSERT INTO valores_nomina VALUES(:nite, 'PORC INT', :PORCEN, :IDNOMINA, :conc_cod);
                                VALOR = VALOR * PORCEN / 100;
                                END
                            end
                        else
                            begin
                            valorpredet = 0;
                            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 is null) then
                                 valorpredet = 0;
                            VALOR = VALORPREDET;
                            end
                        end
                    else
                        BEGIN
                        VALOR = VALOR * PORCEN / 100;
                        CANT = DIASLAB;
                        END
                    end
                else if (CONC_COD = 920) then /* comision */
                    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;
                    CANT = DIASLAB;
                    end
                else if ((:MONTOEMP <> 0) and (:MONTOEMP is not null)) then
                    begin
                    CANT = DIASLAB;
                    /* MONTO EMPLEADO_CONCEPTOS */
                    if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
                        begin
                        VALOR = :MONTOEMP;
                        if (:CONC_DIAS = 'S') then
                            BEGIN
                            select PPAG_DIAS from periodo_pago where ppag_cod = :periodicidad into :diasper;
                            VALOR = (:VALOR / :diasper) * :DIASLAB;
                            END
                        end     
                    else
                        BEGIN
                        if ((:PORCEN <> 0) and (PORCEN is not null)) then
                            VALOR = (:MONTOEMP * :PORCEN) /100;
                        else
                            VALOR = (:MONTOEMP * :CONC_PORC) /100;
                        BASE = MONTOEMP;
                        END
                    end
                else if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                    begin
                    /* MONTO FIJO */
                    CANT = DIASLAB;
                    if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
                        begin
                        VALOR = :CONC_MONTO;
                        if (:CONC_DIAS = 'S') then
                            BEGIN
                            select PPAG_DIAS from periodo_pago where ppag_cod = :periodicidad into :diasper;
                            VALOR = (:VALOR / :diasper) * :DIASLAB;
                            END
                        end
                    else
                        if ((:PORCEN <> 0) and (PORCEN is not null)) then
                            VALOR = (:CONC_MONTO * :PORCEN) /100;
                        else
                            VALOR = (:CONC_MONTO * :CONC_PORC) /100;
                    end
                else
                    begin
                    /* PORCENTAJE DEL SUELDO */
                    CANT = DIASLAB;
                    if ((:PORCEN <> 0) and (PORCEN is not null)) then
                        VALOR = (:BASICO * :PORCEN) /100;
                    else
                        if ((:CONC_PORC <> 0) and (CONC_PORC is not null)) then
                            VALOR = (:BASICO * :CONC_PORC) /100;
                        else
                            if ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903) or (CONC_COD = 1011) or
                                (CONC_COD = 971) or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 1023) or
                                (CONC_COD = 970) or (CONC_COD = 1009) or (CONC_COD = 1010) or (CONC_COD = 1037) or
                                (CONC_COD = 974) or (CONC_COD = 980) or (CONC_COD = 981))  then
                               VALOR = :BASICO;
                            else
                                VALOR = 0;
                    end
                end
                
              if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                if (CONC_COD = 962) then
                    INSERT INTO valores_nomina VALUES(:nite, 'VALOR FINAL', :VALOR, :IDNOMINA, :conc_cod);
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                ITEM = :ITEM + 1;
                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, NOCO_CANT, NOCO_BASE)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :CANT, :BASE);
                            end
                        end
                    VALOR = 0;
                    BASICO = 0;
                    end
                END
            end /* for */
        /* marque novedades usadas */
        update nomina_novedades_detalle ND
            set NOMI_ID = :idnomina
            where ND.NNDE_PERIODO = :periodo and ND.NNDE_ANO = :ANO and
            exists (select NONO_ID from nomina_novedades where NONO_ID = ND.nono_id and TERC_NIT = :nit_tercero and NONO_PPAGO = :periodicidad);
        /* marque horas usadas */
        update nomina_horasext ND
            set nd.noex_nomid = :idnomina
            where ND.noex_periodio = :periodo and ND.noex_ano = :ANO and nd.terc_nit = :nit_tercero
            and nd.noex_periodicidad = :periodicidad and ((nd.noex_nomid = 0) or (nd.noex_nomid is null));
        end
    end
suspend;
end^


ALTER PROCEDURE CAUSA_NOMINA2 (
    IDNOMINA INTEGER,
    DEPTO INTEGER)
RETURNS (
    ITEMINI INTEGER)
AS
declare variable FEC date;
declare variable PERIODO integer;
declare variable PERIODICIDAD integer;
declare variable ANO char(4);
declare variable fecha date;
declare variable item integer;
declare variable nite varchar(20);
declare variable nit_tercero varchar(20);
declare variable concept integer;
declare variable montoemp 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 varchar(20);
declare variable conc_monto numeric(18,2);
declare variable conc_modifi char(1);
declare variable valor numeric(18,2);
declare variable valorant numeric(18,2);
declare variable diaslab integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable conc_dias char(1);
declare variable salario char(1);
declare variable liquidaper integer;
declare variable niteps varchar(20);
declare variable nitafc varchar(20);
declare variable nitafp varchar(20);
declare variable nitarp varchar(20);
declare variable nitccf varchar(20);
declare variable gtoempr char(1);
declare variable sumavrprom numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable duranov integer;
declare variable aprox integer;
declare variable mensual char(1);
declare variable horasex numeric(18,2);
declare variable auxtrano 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 parambenef char(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 difaportmin varchar(20);
declare variable porcentr numeric(9,4);
declare variable fecing date;
declare variable anoing integer;
declare variable diasano integer;
declare variable basefsp integer;
declare variable porcdd numeric(9,4);
declare variable deddp char(1);
declare variable dedd numeric(18,2);
declare variable dedv numeric(18,2);
declare variable dedmp numeric(18,2);
declare variable maxdd numeric(18,2);
declare variable maxdv numeric(18,2);
declare variable maxdmp numeric(18,2);
declare variable PENS numeric(18,2);
declare variable SALU numeric(18,2);
declare variable UVT numeric(18,2);
declare variable EX25 numeric(18,2);
declare variable MASUVT numeric(18,2);
declare variable MENOSUVT numeric(18,2);
declare variable DEDSALUD numeric(18,2);
declare variable DEDPEN numeric(18,2);
declare variable FSP numeric(18,2);
declare variable APPENS numeric(18,2);
declare variable APSALU numeric(18,2);
declare variable BASEPEN numeric(18,2);
declare variable FACSAL numeric(18,2);
declare variable MAXFS numeric(18,2);
declare variable TOTDEV numeric(18,2);
declare variable RETFTE numeric(18,2);
declare variable BASERT numeric(18,2);
declare variable BASERM numeric(18,2);
declare variable RETMIN numeric(18,2);
declare variable MINAPEPS integer;
declare variable BASEAPINC VARCHAR(12);
declare variable altoriesgo CHAR(1);
declare variable TALTOR NUMERIC(9,4);
declare variable REDONRET CHAR(2);
declare variable SUBTIPOC INTEGER;
declare variable DIASP INTEGER;
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'RESPONSABLE DE LA DIFERENCIA SOBRE EL APORTE MINIMO A SEGURIDAD SOCIAL') returning_values(:difaportmin);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'INGRESO BASE EXENTO DE PAGO DE APORTES POR SALUD EXPRESADO EN SMMLV') returning_values(:minapeps);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'PAGAR APORTES EN INCAPACIDAD SOBRE EL VALOR DE LA INCAPACIDAD O EL SUELDO HABITUAL') returning_values(:baseapinc);
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
execute procedure lee_configuracion('NOMINA', 'LIQUIDACION', 'REDONDEAR RETENCION EN LA FUENTE AL MULTIPLO DE MIL') returning_values (:REDONRET);
select N.nomi_feccausa, N.nomi_periodocidad, N.nomi_periodo, N.nomi_ano, N.NOMI_LIQOK from NOMINA N
    where N.nomi_id = :IDNOMINA into :fec, :periodicidad, :periodo, :ano, :CONFIRMADO;
select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA into :ITEM;
if (CONFIRMADO = 'N') then
    begin
    execute procedure fecha_final_periodo_pago (:periodicidad, :ano, :periodo) returning_values (:FECHA);
    select P.paan_salinteg, P.PAAN_SALMINIMO, P.PAAN_AUXTR, p.paan_maxfs from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_SALINTEG, SMLV, :auxtrano, :MAXFS;
    ITEMINI = ITEM;
    for select E.TERC_NIT, E.EMPL_EPS, E.EMPL_AFC, E.EMPL_AFP, E.EMPL_ARP, E.EMPL_CCF, E.empl_salinteg, E.empl_fecing, E.empl_facsal, E.empl_altoriesgo, E.stco_cod
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FECHA)) and E.EMPL_FECING <= :FECHA
        and ((:DEPTO = 0) or (e.empl_dpto = :DEPTO))
        and not exists (select ND.NOMI_ID from nomina_detalle ND, NOMINA N where N.nomi_id = ND.nomi_id and ND.terc_nit = E.terc_nit
        and N.nomi_ano = :ano and N.nomi_periodo = :periodo and N.nomi_periodocidad = :periodicidad AND N.nomi_id <> :idnomina)
        into :NITE, :NITEPS, :NITAFC, :NITAFP, :NITARP, :NITCCF, :SALINTEG, :fecing, :facsal, :altoriesgo, :subtipoc
        do
        begin
        if ((FACSAL IS NULL) or (FACSAL = 0))  then
            FACSAL = 100;
        if (FACSAL < MAXFS) then
            FACSAL = MAXFS;
        for select CE.TERC_NIT, CE.CONC_COD, CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, 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_SALARIO, CN.CONC_PROV, CN.CONC_APORTE,
            CN.CONC_APLICAPROM, CN.CONC_GTOEMPR
            from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and (CN.conc_activo = 'S') AND (CE.emco_activo = 'S') AND
            ( ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA) AND (((:periodicidad = 1) and (:PERIODO < 13)) or ((:periodicidad = 2) and (:PERIODO < 25)))) 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)))) )
            AND ((CN.conc_aporte = 'S') or (CN.conc_prov = 'S'))
            order by TERC_NIT, CN.conc_cod
            into :NIT_TERCERO, :CONCEPT,  :MONTOEMP, :PORCEN, :ENTIDAD, :LIQUIDAPER, :MENSUAL ,:CONC_COD, :CONC_DEDUC, :CONC_PORC,
            :CONC_ENTIDAD, :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:SALARIO,:CONC_PROV, :CONC_APORTE ,
            :CONC_APLICAPROM, :GTOEMPR
            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, :FECHA, :MENSUAL, :CONC_COD) returning_values (:DIASLAB);
            else
                begin
                select PPAG_DIAS from PERIODO_PAGO where PPAG_COD = :periodicidad into :diaslab;
                if (mensual = 'S') then
                    diaslab = 30;
                end

            if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) then
                BEGIN
                if ((CONC_PORC = 0) or (CONC_PORC is null)) then
                    BEGIN
                    if ((:PORCEN = 0) or (:PORCEN is null)) then
                        BEGIN
                        select DPTO_TARARP from DEPARTAMENTO D, EMPLEADOS E where E.terc_nit = :nite and E.empl_dpto = D.dpto_cod
                            into :porcen;
                        END
                    END
                ELSE
                    if ((:PORCEN = 0) or (:PORCEN is null)) then
                        PORCEN = CONC_PORC;
                END
            execute procedure ibc_empleado (:NITE, :ANO, :periodo, :conc_cod) returning_values (:BASICOEMP);
            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;
            HORASEX = null;
            BENEFICIOS = 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
            BASERT = 0;
            if (CONC_COD = 962) Then  --RETEFTE
                begin
                select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                    where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
                    N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_basert = 'S' AND c.conc_benefic = 'N' and
                    NC.TERC_NIT = :NITE into :valor;
                if (valor is null) then
                    valor = 0;
                TOTDEV = VALOR;
                ENTIDAD = :nite;
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'VALOR', :VALOR, :idnomina, :CONC_COD);
                /* exenciones */
                SELECT PAAN_DEDDEP, PAAN_MAXDEDDEP*PAAN_UVT, PAAN_MAXDEDMP, PAAN_MAXDEDAFC, PAAN_AFPTR, PAAN_EPSTR, PAAN_UVT FROM parametros_ano WHERE PAAN_ANO = :ANO
                    INTO :PORCDD, :MAXDD, :MAXDMP, :MAXDV, :PENS, :SALU, :UVT;
                SELECT EMPL_DEDDEP, EMPL_DEDINTV, EMPL_DEDAFC+EMPL_AFPVOLNORET,EMPL_DEDMEDP,EMPL_DEDSALUD FROM empleados WHERE TERC_NIT = :NITE
                    INTO :DEDDP, :DEDV, :DEDPEN, :DEDMP, :DEDSALUD;
                if (DEDV IS NULL) THEN
                    DEDV = 0;
                if (DEDMP IS NULL) THEN
                    DEDMP = 0;
                if (DEDSALUD IS NULL) THEN
                    DEDSALUD = 0;
                if (DEDPEN IS NULL) THEN
                    DEDPEN = 0;
                /* APORTES A PENSIONES */
                FSP = 0;

                if (salinteg = 'S') then
                    BASEPEN = VALOR * tar_salinteg/100;
                else
                    BASEPEN = VALOR;
                if ((BASEPEN / SMLV) > 25) then
                    BASEPEN = SMLV * 25;

                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'BASEPEN', :BASEPEN, :idnomina, :CONC_COD);
                if ((subtipoc is null) or (subtipoc = 0)) then
                    begin
                    if ((:PERIODICIDAD = 1) or (MENSUAL = 'S')) Then
                        BASEFSP = FLOOR(BASEPEN / smlv);
                    else
                        if (:PERIODICIDAD = 2) then
                            BASEFSP = FLOOR(BASEPEN*2 / smlv);
                        else
                            BASEFSP = FLOOR(BASEPEN*4 / smlv);
                    if (BASEFSP >= 4) then
                         BEGIN
                         SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= :BASEFSP AND
                             FSPE_SMLVFIN >= :BASEFSP INTO :porcen;
                         FSP = basepen * PORCEN/100;
                         END
                    APPENS = BASEPEN * PENS/100;
                    end
                else
                    BEGIN
                    FSP = 0;
                    APPENS = 0;
                    END
                APSALU = BASEPEN * SALU/100;
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'FSP', :fsp, :idnomina, :CONC_COD);
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'AP PENSION', :appens, :idnomina, :CONC_COD);
                if (DEDV > (MAXDV * UVT)) then
                    DEDV = MAXDV*UVT;
                if (DEDMP > (MAXDMP*UVT)) then
                    DEDMP = MAXDMP*UVT;
                if (MENSUAL = 'N') then
                    BEGIN
                    if (periodicidad = 2) then
                        valor = valor * 2;
                    if (periodicidad = 3) then
                        valor = valor * 4;
                    END
                select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                    where N.nomi_id = NC.nomi_id AND N.nomi_periodocidad = :PERIODICIDAD and N.nomi_periodo >= :perinicial and
                    N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_basert = 'S' AND c.conc_benefic = 'S' and
                    NC.TERC_NIT = :NITE into :beneficios;
                if (beneficios is null) then
                    beneficios = 0;
                VALOR = VALOR + BENEFICIOS;
                TOTDEV = TOTDEV + BENEFICIOS;
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'BENEFICIOS', :beneficios, :idnomina, :CONC_COD);
                DEDPEN = DEDPEN + FSP + appens;
                if (DEDPEN > VALOR * 0.3) then
                    DEDPEN = VALOR * 0.3;
                if (DEDDP = 'S') then
                    BEGIN
                    DEDD = VALOR * PORCDD / 100;
                    if (DEDD > MAXDD) then
                        DEDD = MAXDD;
                    insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                        values (:nite, 'DED DEPENDIENTES', :dedd, :idnomina, :CONC_COD);
                    END
                ELSE
                    DEDD = 0;
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'DED PENSIONES', :dedpen, :idnomina, :CONC_COD);
                VALOR = VALOR - DEDPEN;
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'VALOR - DED PENS', :VALOR, :idnomina, :CONC_COD);
                VALOR = VALOR - DEDV - DEDMP;
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'VALOR-DED VIV-DED MEDPRE', :VALOR, :idnomina, :CONC_COD);
                VALOR = VALOR - DEDD;
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'VALOR-DED DEPEND', :VALOR, :idnomina, :CONC_COD);
                VALOR = VALOR - DEDSALUD;
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'VALOR-DED SALUD', :VALOR, :idnomina, :CONC_COD);
                EX25 = VALOR * 0.25;
                if (EX25 > 240*UVT) then
                    EX25 = 240*UVT;
                VALOR = VALOR - EX25;
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'VALOR - EX 25%', :VALOR, :idnomina, :CONC_COD);
                /* verificar que el 25% mas dependientes, mas med.prep mas vivienda no pase del 40% del ingreso menos aportes */
                if (((totdev - appens - fsp - apsalu) * 0.4) < (ex25 + dedsalud + dedd + dedv + dedmp + dedpen - FSP - appens)) then
                    BEGIN
                    VALOR = (totdev - appens - fsp - apsalu) * 0.6;
                    insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                        values (:nite, 'VALOR MIN 60%', :VALOR, :idnomina, :CONC_COD);
                    END
                PORCEN = NULL;
                SELECT FIRST 1 RETE_PORC, RETE_MASUVT, RETE_MENOSUVT FROM RETENCIONES WHERE RETE_DESDE <= :VALOR AND RETE_HASTA >= :VALOR AND RETE_ANO = :ANO
                    INTO :PORCEN, :MASUVT, :MENOSUVT;
                if (PORCEN IS NULL) then
                    PORCEN = 0;
                if (PORCEN <> 0) then
                    BEGIN
                    BASERT = VALOR;
                    insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                        values (:nite, 'PORC RETENCION', :porcen, :idnomina, :CONC_COD);
                    insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                        values (:nite, 'UVT A RESTAR', :menosuvt*:uvt, :idnomina, :CONC_COD);
                    insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                        values (:nite, 'UVT A SUMAR', :masuvt*:uvt, :idnomina, :CONC_COD);
                    VALOR = ((:VALOR - (:MENOSUVT*UVT)) * (:PORCEN /100)) + (MASUVT * UVT);
                    if (REDONRET = 'SI') then
                        VALOR = ROUND(:valor, -3);
                    insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                        values (:nite, 'RETENCION', :VALOR, :idnomina, :CONC_COD);
                    END
                ELSE
                    VALOR = 0;
                retfte = VALOR;
                /* AHORA LA RETENCION MINIMA */
                VALOR = TOTDEV - appens - apsalu - fsp;
                BASERM = VALOR;
--                INSERT INTO valores_nomina VALUES(:nite, 'BASE RET MINIMA', :VALOR);
                VALOR = VALOR / UVT;
--                INSERT INTO valores_nomina VALUES(:nite, 'BASE RETMIN EN UVT', :VALOR);
                SELECT FIRST 1 RETM_HASTA FROM retencion_minima WHERE RETM_ANO = :ANO
                    ORDER BY RETM_HASTA INTO :RETMIN;
                if (VALOR > RETMIN) then
                    BEGIN
                    PORCEN = NULL;
                    SELECT FIRST 1 RETM_RETE FROM retencion_minima WHERE RETM_HASTA <= :VALOR AND RETM_ANO = :ANO
                        ORDER BY RETM_HASTA DESC
                        INTO :PORCEN;
                    if (PORCEN IS NULL) then
                        PORCEN = 0;
                    END
                ELSE
                    PORCEN = 0;
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'ORCENTAJE RET MINIMA', :porcen, :idnomina, :CONC_COD);
                if (PORCEN <> 0) then
                    VALOR = PORCEN * UVT;
                else
                    VALOR = 0;
                if (REDONRET = 'SI') then
                    VALOR = ROUND(:valor, -3);
                insert into VALORES_NOMINA (TERC_NIT, VANO_NOM, ANO_VALOR, NOMI_ID, CONC_COD)
                    values (:nite, 'RETENCION MINIMA', :VALOR, :idnomina, :CONC_COD);
                if (VALOR < RETFTE) then
                    VALOR = RETFTE;
                ELSE
                    BASERT = BASERM;
                end
            else if (CONC_APORTE = 'S') then
                begin
                /* si no se ha pagado, calculelo */
                if (((CONC_DIAS = 'S') and (diaslab > 0)) or (NOT EXISTS (SELECT N.NOMI_ID FROM NOMINA N, NOMINA_CONCEPTOS NC WHERE
                    N.nomi_id = NC.nomi_id AND N.nomi_ano = :ano AND N.nomi_periodo >= :perinicial AND N.nomi_periodo <= :perfinal
                    AND NC.terc_nit = :NITE AND NC.conc_cod = :CONC_COD AND NC.noco_valor <> 0))) then
                    BEGIN
                    if (BASEAPINC = 'SUELDO') then
                        BEGIN
                        VALOR = ((:basicoemp/30)*:DIASLAB) + :CAMBSALTRANS;
                        /* FACTOR SALARIAL, EXCEPTO VACACIONES */
                        if ((CONC_COD <> 929) AND (CONC_COD <> 930) AND (CONC_COD <> 944)) then
                            VALOR = VALOR * :facsal / 100;
                        /* DEMAS CONCEPTOS PAGADOS EXCEPTO SALARIO E INCAPACIDADES QUE LOS CUBRE EL BASICO */
                        select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                            where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
                            N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_baseap = 'S'
                            AND (C.CONC_COD <> 901) AND (C.CONC_COD <> 902) AND (C.CONC_COD <> 903) AND (C.CONC_COD <> 949)
                            AND (C.CONC_COD <> 1011) AND (C.CONC_COD <> 1025) AND (C.CONC_COD <> 1026) AND (C.CONC_COD <> 1033)
                            AND (C.CONC_COD <> 1034) AND (C.CONC_COD <> 1035) AND (C.CONC_COD <> 1036) AND (C.CONC_COD <> 1037)
                            AND (C.CONC_COD <> 971) AND (C.CONC_COD <> 972) AND (C.CONC_COD <> 973)
                            AND (C.CONC_COD <> 974) AND (C.CONC_COD <> 980) AND (C.CONC_COD <> 981)
                            AND (C.CONC_COD <> 932) AND (C.CONC_COD <> 975) AND (C.CONC_COD <> 978)
                            AND (C.CONC_COD <> 997) AND (C.CONC_COD <> 998) AND (C.CONC_COD <> 999)
                            AND (C.CONC_COD <> 1000) AND (C.CONC_COD <> 1001) AND (C.CONC_COD <> 1002)
                            AND (C.CONC_COD <> 1003) AND (C.CONC_COD <> 1004) AND (C.CONC_COD <> 1005)
                            AND (C.CONC_COD <> 1006) AND (C.CONC_COD <> 1007) AND (C.CONC_COD <> 1008)
                            and (C.CONC_COD <> 970) and (C.CONC_COD <> 1009) and (C.CONC_COD <> 1010)
                            AND NC.TERC_NIT = :NITE into :sumavrprom;
                        if (sumavrprom is null) then
                            sumavrprom = 0;
                        VALOR = VALOR + sumavrprom;
                        END
                    ELSE
                        BEGIN
                        select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                            where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
                            N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_baseap = 'S'
                            AND NC.TERC_NIT = :NITE into :sumavrprom;
                        if (sumavrprom is null) then
                            VALOR = 0;
                        else
                            VALOR = sumavrprom;
                        END

                    /* reste las incapacidades si son parafiscales o ARL */
                    sumavrprom = 0;
                    select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                        where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and
                        N.nomi_periodo >= :perinicial and N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and
                        C.conc_baseap = 'S' AND ((NC.CONC_COD = 932) or (NC.conc_cod = 975) or (NC.conc_cod = 978) or (NC.conc_cod = 997) or (NC.conc_cod = 998)
                         or (NC.conc_cod = 999) or (NC.conc_cod = 1000) or (NC.conc_cod = 1001) or (NC.conc_cod = 1002) or (NC.conc_cod = 1003)
                          or (NC.conc_cod = 1004) or (NC.conc_cod = 1005) or (NC.conc_cod = 1026) or (NC.conc_cod = 1033) or (NC.conc_cod = 1034) or (NC.conc_cod = 1035))
                        AND NC.TERC_NIT = :NITE into :sumavrprom; -- SUMA DE INCAPACIDADES
                    if (sumavrprom is null) then
                        sumavrprom = 0;
                    if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936) or (CONC_COD = 1014) or
                        (CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) or (CONC_COD = 1017) or
                        (CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) or (CONC_COD = 1018) or
                        (CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013) ) then
                        VALOR = VALOR - sumavrprom;
                    /* si es ARL reste las vacaciones */
                    if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) then
                        begin
                        sumavrprom = 0;
                        select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                            where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and
                            N.nomi_periodo >= :perinicial and N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and
                            C.conc_baseap = 'S' AND ((NC.CONC_COD = 949) or (NC.conc_cod = 950))
                            AND NC.TERC_NIT = :NITE into :sumavrprom; -- SUMA DE INCAPACIDADES
                        if (sumavrprom is null) then
                            sumavrprom = 0;
                        VALOR = VALOR - sumavrprom;
                        end
                    /* si es EPS, AFP reste las vacaciones compensadas */
                    if ((:conc_cod = '904') OR (:conc_cod = '905') OR (:conc_cod = '906') OR (:conc_cod = '934') OR (:conc_cod = '1012') or
                        (:conc_cod = '907') OR (:conc_cod = '914') OR (:conc_cod = '915') OR (:conc_cod = '938') OR (:conc_cod = '976') OR (:conc_cod = '1016')) then
                        begin
                        sumavrprom = 0;
                        select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                            where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and
                            N.nomi_periodo >= :perinicial and N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and
                            C.conc_baseap = 'S' AND (NC.conc_cod = 950)
                            AND NC.TERC_NIT = :NITE into :sumavrprom;
                        if (sumavrprom is null) then
                            sumavrprom = 0;
                        VALOR = VALOR - sumavrprom;
                        end
                    if (SALINTEG = 'S') then
                        valor = valor * (tar_salinteg / 100);

                    if ((VALOR / SMLV) > 25) then
                        valor = SMLV * 25;
    
                    /* SI APORTE A SEGURIDAD SOCIAL MENOR QUE EL MINIMO O MAYOR A 25 SMMLV */
                    if ((:conc_cod = '904') OR (:conc_cod = '905') OR (:conc_cod = '906') OR (:conc_cod = '934') OR (:conc_cod = '1012') or
                        (:conc_cod = '908') OR (:conc_cod = '909') OR (:conc_cod = '935') or (CONC_COD = 1013) OR
                        (:conc_cod = '907') OR (:conc_cod = '914') OR (:conc_cod = '915') OR (:conc_cod = '938') OR (:conc_cod = '976') OR (:conc_cod = '1016')) then
                        BEGIN
                        if (difaportmin <> 'EMPLEADOR') then
                            if (:VALOR < ((:SMLV/30)*:DIASLAB)) then
                                VALOR = (:SMLV/30)*:DIASLAB;
                        if ((VALOR / SMLV) > 25) then
                            valor = SMLV * 25;
                        END

                    if (CONC_COD = 904) then /* AFP TRABAJADOR */
                        begin
                        if ((SUBTIPOC IS NULL) or (SUBTIPOC = 0)) then
                            BEGIN
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            BASERT =  VALOR;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            END
                        else
                            BEGIN
                            BASERT = 0;
                            VALOR = 0;
                            END
                        end
                    else if ((CONC_COD = 905) or (CONC_COD = 906) or (CONC_COD = 934) or (CONC_COD = 1012)) then /* AFP EMPLEADOR */
                        begin
                        if ((SUBTIPOC IS NULL) or (SUBTIPOC = 0)) then
                            BEGIN
                            ENTIDAD = :NITAFP;
                            select A.PAAN_AFPEM, a.paan_afptr, A.paan_altoriesgo from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                into :PORCEN, :porcentr, :taltor;
                            if (taltor IS NULL) then
                                taltor = 0;
                            if (altoriesgo = 'S') then
                                PORCEN = PORCEN + taltor;
                            if ((difaportmin = 'EMPLEADOR') and (VALOR < (:SMLV/30)*:DIASLAB)) then
                                BEGIN
                                BASERT =  (:SMLV/30)*:DIASLAB;
                                VALOR = (BASERT * (PORCEN+PORCENTR) /100) - ((VALOR * :PORCENTR) /100);
                                END
                            else
                                BEGIN
                                BASERT =  VALOR;
                                VALOR = (:VALOR * :PORCEN) /100;
                                END
                            END
                        else
                            BEGIN
                            BASERT = 0;
                            VALOR = 0;
                            END
                        end
                    else if ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) then /* ARP */
                        begin
                        ENTIDAD = :NITARP;
                        if (VALOR < (:SMLV/30)*:DIASLAB) then
                            VALOR = (:SMLV/30)*:DIASLAB;
                        BASERT =  VALOR;
                        VALOR = (:VALOR * :PORCEN) /100;
                        end
                    else if (CONC_COD = 921) then /* FSP */
                        begin
                        ENTIDAD = :NITAFP;
                        if ((:PERIODICIDAD = 1) or (MENSUAL = 'S')) Then
                            BASEFSP = FLOOR(VALOR / smlv);
                        else
                            if (:PERIODICIDAD = 2) then
                                BASEFSP = FLOOR(VALOR*2 / smlv);
                            else
                                BASEFSP = FLOOR(VALOR*4 / smlv);
                         if (BASEFSP >= 4) then
                             BEGIN
                             SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= :BASEFSP AND
                                 FSPE_SMLVFIN >= :BASEFSP INTO :porcen;
                             BASERT =  VALOR;
                             VALOR = (:VALOR * :PORCEN) /100;
                             END
                         else
                             BEGIN
                             VALOR = 0;
                             BASERT =  VALOR;
                             END
                   end
                    else if ((CONC_COD = 907) or (CONC_COD = 914) or (CONC_COD = 915) or (conc_cod = 938)or (CONC_COD = 1016)) then
                        begin
                        ENTIDAD = :NITEPS;
                        if (CONC_COD = 907) then /* EPS TRABAJADOR */
                            begin
                            select A.PAAN_EPSTR from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                            BASERT =  VALOR;
                            VALOR = ((:VALOR) * :PORCEN) /100;
                            end
                        else
                            begin   /* EPS EMPLEADOR */
                            /* verifique si es menor a los 10 SMMLV */
                            if (DIASLAB > 0) then
                                if ((((VALOR/DIASLAB) / (SMLV/30)) > MINAPEPS) or (salinteg = 'S')) then
                                    BEGIN
                                    select A.PAAN_EPSEM, a.paan_epstr from PARAMETROS_ANO A where A.PAAN_ANO = :ANO
                                        into :PORCEN, :porcentr;
                                    if ((difaportmin = 'EMPLEADOR') and (VALOR < (:SMLV/30)*:DIASLAB)) then
                                        BEGIN
                                        BASERT =  (:SMLV/30)*:DIASLAB;
                                        VALOR = (BASERT * (PORCEN+PORCENTR) /100) - ((VALOR * :PORCENTR) /100);
                                        END
                                    else
                                        BEGIN
                                        BASERT =  VALOR;
                                        VALOR = (:VALOR * :PORCEN) /100;
                                        END
                                    END
                                ELSE
                                    VALOR = 0;
                            ELSE
                                VALOR = 0;
                            end
                        end
                    else if (conc_cod = 976) then /* EPS APRENDIZ SENA */
                        begin
                        ENTIDAD = :NITEPS;
                        BASERT =  VALOR;
                        VALOR = (:VALOR * :CONC_PORC) /100;
                        end
                    else if ((CONC_COD = 910) or (CONC_COD = 911) or (CONC_COD = 936) or (CONC_COD = 1014)) then
                        begin /*ccf */
                        ENTIDAD = :NITCCF;
                        select A.PAAN_CCF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                        if (VALOR < (:SMLV/30)*:DIASLAB) then
                            VALOR = (:SMLV/30)*:DIASLAB;
                        BASERT =  VALOR;
                        VALOR = (:VALOR * :PORCEN) /100;
                        end
                    else if ((CONC_COD = 916) or (CONC_COD = 917) or (CONC_COD = 939) or (CONC_COD = 1017) ) then
                        begin
                        /*icbf */
                        ENTIDAD = :conc_entidad;
                        select A.PAAN_ICBF from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                        if (DIASLAB > 0) then
                            if ((((VALOR/DIASLAB) / (SMLV/30)) > MINAPEPS) or (salinteg = 'S')) then
                                begin
                                if (VALOR < (:SMLV/30)*:DIASLAB) then
                                    VALOR = (:SMLV/30)*:DIASLAB;
                                end
                            else
                                VALOR = 0;
                        else
                            VALOR = 0;
                        BASERT =  VALOR;
                        VALOR = (:VALOR * :PORCEN) /100;
                        end
                    else if ((CONC_COD = 918) or (CONC_COD = 919) or (CONC_COD = 940) or (CONC_COD = 1018) ) then
                        begin
                        /*sena */
                        ENTIDAD = :conc_entidad;
                        select A.PAAN_SENA from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                        if (DIASLAB > 0) then
                            if ((((VALOR/DIASLAB) / (SMLV/30)) > MINAPEPS) or (salinteg = 'S')) then
                                begin
                                if (VALOR < (:SMLV/30)*:DIASLAB) then
                                    VALOR = (:SMLV/30)*:DIASLAB;
                                end
                            else
                                VALOR = 0;
                        else
                            VALOR = 0;
                        BASERT =  VALOR;
                        VALOR = (:VALOR * :PORCEN) /100;
                        end
                    else if ((CONC_COD = 912) or (CONC_COD = 913) or (CONC_COD = 937)or (CONC_COD = 1015)) 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 (CN.conc_activo = 'S') AND (CE.emco_activo = 'S') AND
                                ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA) 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 (diaslab = 0) then
                            select PPAG_DIAS from PERIODO_PAGO where PPAG_COD = :periodicidad into :diaslab;
                        if ((:VALOR/:DIASLAB) < ((:SMLV/30)*2)) then
                            AUXTRANS = (:AUXTRANO / 30) * :DIASLAB;
                        else
                            AUXTRANS = 0;
                        select A.PAAN_CESEMP from PARAMETROS_ANO A where A.PAAN_ANO = :ANO into :PORCEN;
                        BASERT =  (:VALOR + :AUXTRANS + :BENEFICIOS);
                        VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        end
                    else if ((CONC_COD = 923) or (CONC_COD = 924) or (CONC_COD = 941)or (CONC_COD = 1019)) then
                        begin
                        /* INT CESANTIA */
                        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 (CN.conc_activo = 'S') and (CE.emco_activo = 'S') AND
                                ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA) 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 ((:VALOR/:DIASLAB) < ((:SMLV/30)*2)) then
                            AUXTRANS = (:AUXTRANO / 30) * :DIASLAB;
                        else
                            AUXTRANS = 0;
                        anoing = extract (YEAR FROM FECING);
                        if (ANOING = ANO) then
                            BEGIN
                            diasano = (12 - extract (MONTH FROM FECING)) * 30 + (30 - extract (DAY FROM FECING) + 1);
                            porcen = :CONC_PORC * DIASANO / 360;
                            END
                        else
                            porcen = conc_porc;
                        BASERT = (:VALOR + :AUXTRANS + :BENEFICIOS);
                        VALOR = ((:VALOR + :AUXTRANS + :BENEFICIOS) * :PORCEN) /100;
                        end
                    else
                        begin
                        if (CONC_PORC <> 0 and CONC_PORC is not null) then
                            VALOR = ((:VALOR) * CONC_PORC) /100;
                        else
                            if (:PORCEN <> 0 and :PORCEN is not null) then
                                VALOR = ((:VALOR) * PORCEN) /100;
                            else
                                if (:MONTOEMP <> 0 and :MONTOEMP is not null) then
                                    VALOR = :MONTOEMP;
                                else
                                    if (:CONC_MONTO <> 0 and :CONC_MONTO is not null) then
                                        VALOR = :CONC_MONTO;
                        end
                    /* reste lo pagado antes */
                    VALORANT = 0;
                    DIASP = 0;
                    select SUM(nc.noco_valor), SUM(NC.noco_cant) from nomina_conceptos NC, NOMINA N
                        where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and
                        N.nomi_periodo >= :perinicial and N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and
                        NC.conc_cod = :conc_cod AND NC.TERC_NIT = :NITE into :VALORANT, :DIASP;
                    if (VALORANT is null) then
                        VALORANT = 0;
                    if (DIASP is null) then
                        DIASP = 0;
                    if (VALORANT < 0) then
                        VALORANT = VALORANT * -1;
                    VALOR = VALOR - VALORANT;
                    DIASLAB = DIASLAB - DIASP;
                    if (ENTIDAD is null or (ENTIDAD = '') ) then
                        ENTIDAD = :CONC_ENTIDAD;
                    end
                end /* aportes */
            else if (CONC_PROV = 'S') then
                begin
                select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
                    where N.nomi_id = NC.nomi_id AND N.nomi_periodo >= :perinicial and
                    N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_basepr = 'S' AND
                    NC.TERC_NIT = :NITE
                    into :valor;
                if (valor is null) then
                    valor = 0;
                AUXTRANS = 0;
                /* SI ES VACACIONES RESTE EL AUXILIO DE TRANSPORTE Y HORAS EXTRAS */
                if ((CONC_COD = 929) OR (CONC_COD = 930) OR (CONC_COD = 944) OR (CONC_COD = 1021)) then
                    begin
                    select SUM(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where N.nomi_id = NC.nomi_id AND N.nomi_periodocidad = :PERIODICIDAD and N.nomi_periodo >= :perinicial and
                        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO AND NC.TERC_NIT = :NITE AND
                        ((conc_cod = 955) or (conc_cod = 956) or (conc_cod = 957) or (conc_cod = 1024))
                        INTO AUXTRANS;
                    if (AUXTRANS IS NULL) then
                        AUXTRANS = 0;
                    VALOR = VALOR - AUXTRANS;
                    /* HORS EXTRAS */
                    select SUM(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where N.nomi_id = NC.nomi_id AND N.nomi_periodocidad = :PERIODICIDAD and N.nomi_periodo >= :perinicial and
                        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.TERC_NIT = :NITE AND
                        ((conc_cod = 931) or (conc_cod = 945) or (conc_cod = 900) or (conc_cod = 1022))
                        INTO horasex;
                    if (horasex IS NULL) then
                        HORASEX = 0;
                    VALOR = VALOR - HORASEX;
                    end
                if (CONC_PORC <> 0 and CONC_PORC is not null) then
                    BEGIN
                    /* INTERESES DE CESANTIA PORC PROPORCIONAL AL TIEMPO LABORADO */
                    if ((CONC_COD = 923) or (CONC_COD = 924) or (CONC_COD = 941) OR (CONC_COD = 1019)) then
                        BEGIN
                        anoing = extract (YEAR FROM FECING);
                        if (ANOING = ANO) then
                            BEGIN
                            diasano = (12 - extract (MONTH FROM FECING)) * 30 + (30 - extract (DAY FROM FECING));
                            CONC_PORC = CONC_PORC * DIASANO / 360;
                            END
                        END
                    VALOR = :VALOR * :CONC_PORC /100;
                    END
                else
                    if (PORCEN <> 0 and PORCEN is not null) then
                        VALOR = :VALOR * :PORCEN /100;
                end /* provision */
            /* VALOR PREDETERMINADO */
            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 if ((:MONTOEMP <> 0) and (:MONTOEMP is not null)) then
                begin
                /* MONTO EMPLEADO_CONCEPTOS */
                if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
                    begin
                    VALOR = :MONTOEMP;
                    if (:CONC_DIAS = 'S') then
                        VALOR = (:VALOR / 30) * :DIASLAB;
                    end     
                else
                    if ((:PORCEN <> 0) and (PORCEN is not null)) then
                        VALOR = (:MONTOEMP * :PORCEN) /100;
                    else
                        VALOR = (:MONTOEMP * :CONC_PORC) /100;
                end
            else if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
                begin
                /* MONTO FIJO */
                if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
                    begin
                    VALOR = :CONC_MONTO;
                    if (:CONC_DIAS = 'S') then
                        VALOR = (:VALOR / 30) * :DIASLAB;
                    end
                else
                    if ((:PORCEN <> 0) and (PORCEN is not null)) then
                        VALOR = (:CONC_MONTO * :PORCEN) /100;
                    else
                        VALOR = (:CONC_MONTO * :CONC_PORC) /100;
                end

            if ((VALOR <> 0) and (VALOR is not null)) then
                begin
                execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
                ITEM = :ITEM + 1;
                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, NOCO_CANT, NOCO_BASE)
                        values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :diaslab, :BASERT);
                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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                            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, NOCO_CANT, NOCO_BASE)
                                    values (:IDNOMINA,:ITEM, :CONCEPT, :NIT_TERCERO, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                            end
                        end
                    VALOR = 0;
                    end
            end /* for */
        end
    end
suspend;
end^


ALTER PROCEDURE CAUSA_RETENCION_LABORAL (
    NITE VARCHAR(20),
    VACAID INTEGER)
AS
declare variable PERIODO integer;
declare variable PERIODICIDAD integer;
declare variable ANO char(4);
declare variable fecha date;
declare variable item integer;
declare variable montoemp numeric(18,2);
declare variable porcen numeric(9,4);
declare variable entidad varchar(20);
declare variable conc_deduc char(1);
declare variable conc_porc numeric(9,4);
declare variable conc_monto numeric(18,2);
declare variable conc_modifi 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 conc_aplicaprom char(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable conc_dias char(1);
declare variable salario char(1);
declare variable liquidaper integer;
declare variable gtoempr char(1);
declare variable cambsaltrans numeric(18,2);
declare variable duranov integer;
declare variable aprox integer;
declare variable mensual char(1);
declare variable smlv numeric(18,2);
declare variable beneficios numeric(18,2);
declare variable confirmado char(1);
declare variable valorpredet numeric(18,2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
declare variable basefsp integer;
declare variable porcdd numeric(9,4);
declare variable deddp char(1);
declare variable dedd numeric(18,2);
declare variable dedv numeric(18,2);
declare variable dedmp numeric(18,2);
declare variable maxdd numeric(18,2);
declare variable maxdv numeric(18,2);
declare variable maxdmp numeric(18,2);
declare variable PENS numeric(18,2);
declare variable SALU numeric(18,2);
declare variable UVT numeric(18,2);
declare variable EX25 numeric(18,2);
declare variable MASUVT numeric(18,2);
declare variable MENOSUVT numeric(18,2);
declare variable DEDSALUD numeric(18,2);
declare variable DEDPEN numeric(18,2);
declare variable FSP numeric(18,2);
declare variable APPENS numeric(18,2);
declare variable APSALU numeric(18,2);
declare variable BASEPEN numeric(18,2);
declare variable FACSAL numeric(18,2);
declare variable MAXFS numeric(18,2);
declare variable TOTDEV numeric(18,2);
declare variable RETFTE numeric(18,2);
declare variable BASERT numeric(18,2);
declare variable BASERM numeric(18,2);
declare variable RETMIN numeric(18,2);
declare variable REDONRET CHAR(2);
declare variable IDNOMINA INTEGER;
begin
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
execute procedure lee_configuracion('NOMINA', 'LIQUIDACION', 'REDONDEAR RETENCION EN LA FUENTE AL MULTIPLO DE MIL') returning_values (:REDONRET);
select first 1 vacd_nomid from vacaciones_detalle where vaca_id = :vacaid order by vacd_item into :IDNOMINA;
select empl_ppago from empleados where terc_nit = :NITE into :periodicidad;
select N.nomi_periodo, N.nomi_ano, N.NOMI_LIQOK from NOMINA N
    where N.nomi_id = :IDNOMINA into :periodo, :ano, :CONFIRMADO;
select max(N.NOCO_ITEM) from NOMINA_CONCEPTOS N where N.NOMI_ID = :IDNOMINA into :ITEM;
--if (CONFIRMADO = 'N') then
    begin
    execute procedure fecha_final_periodo_pago (:periodicidad, :ano, :periodo) returning_values (:FECHA);
    select P.paan_salinteg, P.PAAN_SALMINIMO, p.paan_maxfs from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
        into :TAR_SALINTEG, SMLV, :MAXFS;
    select E.empl_salinteg, E.empl_facsal
        from EMPLEADOS E
        where E.EMPL_PPAGO = :PERIODICIDAD and ((E.EMPL_FECRET is null) or (E.EMPL_FECRET > :FECHA)) and E.EMPL_FECING <= :FECHA
        and TERC_NIT = :NITE
        into :SALINTEG, :facsal;

    if ((FACSAL IS NULL) or (FACSAL = 0))  then
        FACSAL = 100;
    if (FACSAL < MAXFS) then
        FACSAL = MAXFS;
    select CE.EMCO_MONTO, CE.EMCO_PORC, CE.EMPL_ENTIDAD, CE.EMCO_LUQUIDAPER, CE.EMCO_MENSUAL, CN.CONC_DEDUC,CN.CONC_PORC,
        CN.CONC_MONTO,  CN.CONC_DIAS, CN.CONC_MODIFI, CN.CONC_SALARIO, CN.CONC_PROV, CN.CONC_APORTE,
        CN.CONC_APLICAPROM, CN.CONC_GTOEMPR
        from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN
        where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) and (CN.conc_activo = 'S') AND (CE.emco_activo = 'S') AND CE.CONC_COD = 962
        into :MONTOEMP, :PORCEN, :ENTIDAD, :LIQUIDAPER, :MENSUAL ,:CONC_DEDUC, :CONC_PORC,
        :CONC_MONTO, :CONC_DIAS, :CONC_MODIFI,:SALARIO,:CONC_PROV, :CONC_APORTE ,
        :CONC_APLICAPROM, :GTOEMPR;

    if (CONC_DIAS = 'S') then
        execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FECHA, :MENSUAL,962) returning_values (:DIASLAB);
    else
        begin
        select PPAG_DIAS from PERIODO_PAGO where PPAG_COD = :periodicidad into :diaslab;
        if (mensual = 'S') then
            diaslab = 30;
        end

    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;
    BENEFICIOS = 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
    BASERT = 0;
    select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N, vacaciones v, vacaciones_detalle d
        where N.nomi_id = NC.nomi_id and v.vaca_id = d.vaca_id and d.vacd_nomid = n.nomi_id
        AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and NC.CONC_COD = C.CONC_COD
        and C.conc_basert = 'S' AND c.conc_benefic = 'N' and v.vaca_id = :vacaid into :valor;
    /*select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
        where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_basert = 'S' AND c.conc_benefic = 'N' and
        NC.TERC_NIT = :NITE into :valor;*/
    if (valor is null) then
        valor = 0;
    TOTDEV = VALOR;
    ENTIDAD = :nite;
    INSERT INTO valores_nomina VALUES(:nite, 'VALOR', :VALOR);
    /* exenciones */
    SELECT PAAN_DEDDEP, PAAN_MAXDEDDEP*PAAN_UVT, PAAN_MAXDEDMP, PAAN_MAXDEDAFC, PAAN_AFPTR, PAAN_EPSTR, PAAN_UVT FROM parametros_ano WHERE PAAN_ANO = :ANO
        INTO :PORCDD, :MAXDD, :MAXDMP, :MAXDV, :PENS, :SALU, :UVT;
    SELECT EMPL_DEDDEP, EMPL_DEDINTV, EMPL_DEDAFC+EMPL_AFPVOLNORET,EMPL_DEDMEDP,EMPL_DEDSALUD FROM empleados WHERE TERC_NIT = :NITE
        INTO :DEDDP, :DEDV, :DEDPEN, :DEDMP, :DEDSALUD;
    if (DEDV IS NULL) THEN
        DEDV = 0;
    if (DEDMP IS NULL) THEN
        DEDMP = 0;
    if (DEDSALUD IS NULL) THEN
        DEDSALUD = 0;
    if (DEDPEN IS NULL) THEN
        DEDPEN = 0;
    /* APORTES A PENSIONES */
    FSP = 0;

    if (salinteg = 'S') then
        BASEPEN = VALOR * tar_salinteg/100;
    else
        BASEPEN = VALOR;
    if ((BASEPEN / SMLV) > 25) then
        BASEPEN = SMLV * 25;

    if ((:PERIODICIDAD = 1) or (MENSUAL = 'S')) Then
        BASEFSP = FLOOR(BASEPEN / smlv);
    else
        if (:PERIODICIDAD = 2) then
            BASEFSP = FLOOR(BASEPEN*2 / smlv);
        else
            BASEFSP = FLOOR(BASEPEN*4 / smlv);
    if (BASEFSP >= 4) then
        BEGIN
        SELECT FSPE_TARIFA FROM fodo_sol_pensional WHERE FSPE_SMLVINI <= :BASEFSP AND
            FSPE_SMLVFIN >= :BASEFSP INTO :porcen;
        FSP = basepen * PORCEN/100;
        END
    APPENS = BASEPEN * PENS/100;
    APSALU = BASEPEN * SALU/100;
    if (NOT EXISTS (SELECT CONC_COD FROM empleado_conceptos EC WHERE EC.terc_nit = :nite and
        ((EC.conc_cod = 904) or (EC.conc_cod = 921)))) then
        BEGIN
        /* NO APORTA A PENSIONES */
        BASEPEN = 0;
        BASEFSP = 0;
        FSP = 0;
        APPENS = 0;
        END
    INSERT INTO valores_nomina VALUES(:nite, 'BASEPEN', :BASEPEN);
    INSERT INTO valores_nomina VALUES(:nite, 'FSP', :FSP);
    INSERT INTO valores_nomina VALUES(:nite, 'APPENS', :APPENS);
    if (DEDV > (MAXDV * UVT)) then
        DEDV = MAXDV*UVT;
    if (DEDMP > (MAXDMP*UVT)) then
        DEDMP = MAXDMP*UVT;
    if (MENSUAL = 'N') then
        BEGIN
        if (periodicidad = 2) then
            valor = valor * 2;
        if (periodicidad = 3) then
            valor = valor * 4;
        END
    select SUM(nc.noco_valor) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
        where N.nomi_id = NC.nomi_id AND N.nomi_periodocidad = :PERIODICIDAD and N.nomi_periodo >= :perinicial and
        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and NC.CONC_COD = C.CONC_COD and C.conc_basert = 'S' AND c.conc_benefic = 'S' and
        NC.TERC_NIT = :NITE into :beneficios;
    if (beneficios is null) then
        beneficios = 0;
    VALOR = VALOR + BENEFICIOS;
    TOTDEV = TOTDEV + BENEFICIOS;
    INSERT INTO valores_nomina VALUES(:nite, 'BENEFICIOS', :beneficios);
    DEDPEN = DEDPEN + FSP + appens;
    if (DEDPEN > VALOR * 0.3) then
        DEDPEN = VALOR * 0.3;
    if (DEDDP = 'S') then
        BEGIN
        DEDD = VALOR * PORCDD / 100;
        if (DEDD > MAXDD) then
            DEDD = MAXDD;
        INSERT INTO valores_nomina VALUES(:nite, 'DEDDP', :DEDD);
        END
    ELSE
        DEDD = 0;
    INSERT INTO valores_nomina VALUES(:nite, 'DEDPEN', :dedpen);
    VALOR = VALOR - DEDPEN;
    INSERT INTO valores_nomina VALUES(:nite, 'VALOR - DEDPEN', :VALOR);
    VALOR = VALOR - DEDV - DEDMP;
    INSERT INTO valores_nomina VALUES(:nite, 'VALOR - DEDV-DEDMP', :VALOR);
    VALOR = VALOR - DEDD;
    INSERT INTO valores_nomina VALUES(:nite, 'VALOR - DEDD', :VALOR);
    VALOR = VALOR - DEDSALUD;
    INSERT INTO valores_nomina VALUES(:nite, 'VALOR - DEDSALUD', :VALOR);
    EX25 = VALOR * 0.25;
    if (EX25 > 240*UVT) then
        EX25 = 240*UVT;
    VALOR = VALOR - EX25;
    INSERT INTO valores_nomina VALUES(:nite, 'VALOR - EX25', :VALOR);

    PORCEN = NULL;
    SELECT FIRST 1 RETE_PORC, RETE_MASUVT, RETE_MENOSUVT FROM RETENCIONES WHERE RETE_DESDE <= :VALOR AND RETE_HASTA >= :VALOR AND RETE_ANO = :ANO
        INTO :PORCEN, :MASUVT, :MENOSUVT;
    if (PORCEN IS NULL) then
        PORCEN = 0;
    if (PORCEN <> 0) then
        BEGIN
        BASERT = VALOR;
        INSERT INTO valores_nomina VALUES(:nite, 'PORCEN', :PORCEN);
        INSERT INTO valores_nomina VALUES(:nite, 'MENOSUVT', :MENOSUVT*:UVT);
        INSERT INTO valores_nomina VALUES(:nite, 'MASUVT', :MASUVT*:UVT);
        VALOR = ((:VALOR - (:MENOSUVT*UVT)) * (:PORCEN /100)) + (MASUVT * UVT);
        if (REDONRET = 'SI') then
            VALOR = ROUND(:valor, -3);
        INSERT INTO valores_nomina VALUES(:nite, 'RETENCION', :VALOR);
        END
    ELSE
        VALOR = 0;
    retfte = VALOR;
    /* AHORA LA RETENCION MINIMA */
        BEGIN
        VALOR = TOTDEV - appens - apsalu - fsp;
        BASERM = VALOR;
        INSERT INTO valores_nomina VALUES(:nite, 'BASE RET MINIMA', :VALOR);
        VALOR = VALOR / UVT;
        INSERT INTO valores_nomina VALUES(:nite, 'BASE RETMIN EN UVT', :VALOR);
        SELECT FIRST 1 RETM_HASTA FROM retencion_minima WHERE RETM_ANO = :ANO
            ORDER BY RETM_HASTA INTO :RETMIN;
        if (VALOR > RETMIN) then
            BEGIN
            PORCEN = NULL;
            SELECT FIRST 1 RETM_RETE FROM retencion_minima WHERE RETM_HASTA <= :VALOR AND RETM_ANO = :ANO
                ORDER BY RETM_HASTA DESC
                INTO :PORCEN;
            if (PORCEN IS NULL) then
                PORCEN = 0;
            END
        ELSE
            PORCEN = 0;
        INSERT INTO valores_nomina VALUES(:nite, 'PORCENTAJE RETMIN', :PORCEN);
        if (PORCEN <> 0) then
            VALOR = PORCEN * UVT;
        else
            VALOR = 0;
        if (REDONRET = 'SI') then
            VALOR = ROUND(:valor, -3);
        INSERT INTO valores_nomina VALUES(:nite, 'RET MINIMA', :VALOR);
        if (VALOR < RETFTE) then
            VALOR = RETFTE;
        ELSE
            BASERT = BASERM;
        end
    /* VALOR PREDETERMINADO */
    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 = 962 and VP.TERC_NIT = :NITE
        into :VALORPREDET;
    if ((:VALORPREDET <> 0) and (VALORPREDET is not null)) then
        VALOR = VALORPREDET;
    else if ((:MONTOEMP <> 0) and (:MONTOEMP is not null)) then
        begin
        /* MONTO EMPLEADO_CONCEPTOS */
        if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
            begin
            VALOR = :MONTOEMP;
            if (:CONC_DIAS = 'S') then
                VALOR = (:VALOR / 30) * :DIASLAB;
            end     
        else
            if ((:PORCEN <> 0) and (PORCEN is not null)) then
                VALOR = (:MONTOEMP * :PORCEN) /100;
            else
                VALOR = (:MONTOEMP * :CONC_PORC) /100;
        end
    else if ((CONC_MONTO <> 0) and (CONC_MONTO is not null) ) then
        begin
        /* MONTO FIJO */
        if (((CONC_PORC = 0) or (CONC_PORC is null)) and ((:PORCEN = 0) or (PORCEN is null))) then
            begin
            VALOR = :CONC_MONTO;
            if (:CONC_DIAS = 'S') then
                VALOR = (:VALOR / 30) * :DIASLAB;
            end
        else
            if ((:PORCEN <> 0) and (PORCEN is not null)) then
                VALOR = (:CONC_MONTO * :PORCEN) /100;
            else
                VALOR = (:CONC_MONTO * :CONC_PORC) /100;
        end

    if ((VALOR <> 0) and (VALOR is not null)) then
        begin
        execute procedure REDONDEE(:VALOR, :APROX) returning_values (VALOR);
        ITEM = :ITEM + 1;
        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, NOCO_CANT, NOCO_BASE)
                values (:IDNOMINA,:ITEM, 962, :NITE, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :diaslab, :BASERT);
        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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, 962, :NITE, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, 962, :NITE, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, 962, :NITE, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, 962, :NITE, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, 962, :NITE, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    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, NOCO_CANT, NOCO_BASE)
                            values (:IDNOMINA,:ITEM, 962, :NITE, :VALOR, :ENTIDAD, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, :PERIODO, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR, :DIASLAB, :BASERT);
                    end
                end
            VALOR = 0;
            end
    end
end^


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^


ALTER PROCEDURE CERRAR_IMPORTACION (
    ID INTEGER,
    FECCIE DATE)
AS
declare variable tigi integer;
declare variable idf integer;
declare variable tipo char(1);
declare variable liquida char(1);
declare variable total double precision;
declare variable totitem double precision;
declare variable item integer;
declare variable gasto double precision;
declare variable CERRADA CHAR(1);
declare variable PREF VARCHAR(4);
declare variable IDC INTEGER;
declare variable IDI INTEGER;
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
begin
SELECT IMPO_CERRADA FROM IMPORTACION WHERE IMPO_ID = :ID INTO :CERRADA;
if (CERRADA = 'N') then
    BEGIN
    UPDATE IMPORTACION SET IMPO_CERRADA = 'S', IMPO_FECCIE = :FECCIE WHERE IMPO_ID = :ID;
    /* ASIGNE LOS GASTOS */
    FOR SELECT G.tigi_cod, G.gain_valor * G.gain_trm FROM gastos_importacion G WHERE G.gain_idimpor = :ID and g.gain_anulado = 'N'
        into :tigi, gasto
        DO
        BEGIN
        /* calcule la proporcion por item ya sea por peso, volumen, cantidad o valor */
        select t.tigi_tipo, t.tigi_liquidacion from tipo_gastos_importacion t where t.tigi_cod = :tigi
            into :tipo, :liquida;
        if (liquida = 'C') then
            begin
            /* cubicaje-volumen */
            select sum(fd.fpde_volumen) from factura_proforma_det fd, factura_proforma f
                where f.fapo_id = fd.fapo_id and f.fapo_idimpor = :id and fd.fpde_anulado = 'N' into :total;
            for select f.fapo_id, fd.fpde_item, fd.fpde_volumen from factura_proforma_det fd, factura_proforma f
                where f.fapo_id = fd.fapo_id and f.fapo_idimpor = :id and fd.fpde_anulado = 'N'
                into :idf, :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update factura_proforma_det fd
                        set fd.fpde_flete = fpde_flete + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'S') then
                    update factura_proforma_det fd
                        set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'I') then
                    update factura_proforma_det fd
                        set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'O') then
                    update factura_proforma_det fd
                        set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                end
            end
        if (liquida = 'P') then
            begin
            /* peso */
            select sum(fd.fpde_peso) from factura_proforma_det fd, factura_proforma f
                where f.fapo_id = fd.fapo_id and f.fapo_idimpor = :id and fd.fpde_anulado = 'N' into :total;
            for select fd.fapo_id, fd.fpde_item, fd.fpde_peso from factura_proforma_det fd, factura_proforma f
                where f.fapo_id = fd.fapo_id and f.fapo_idimpor = :id and fd.fpde_anulado = 'N'
                into :idf, :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update factura_proforma_det fd
                        set fd.fpde_flete = fpde_flete + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'S') then
                    update factura_proforma_det fd
                        set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'I') then
                    update factura_proforma_det fd
                        set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'O') then
                    update factura_proforma_det fd
                        set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                end
            end
        if (liquida = 'T') then
            begin
            /* cantidad total */
            select sum(fd.fpde_cant * fd.fpde_factor) from factura_proforma_det fd, factura_proforma f
                where f.fapo_id = fd.fapo_id and f.fapo_idimpor = :id and fd.fpde_anulado = 'N' into :total;
            for select fd.fapo_id, fd.fpde_item, fd.fpde_cant * fd.fpde_factor from factura_proforma_det fd, factura_proforma f
                where f.fapo_id = fd.fapo_id and f.fapo_idimpor = :id and fd.fpde_anulado = 'N'
                into :idf, :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update factura_proforma_det fd
                        set fd.fpde_flete = fpde_flete + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'S') then
                    update factura_proforma_det fd
                        set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'I') then
                    update factura_proforma_det fd
                        set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'O') then
                    update factura_proforma_det fd
                        set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                end
            end
        if (liquida = 'V') then
            begin
            /* valor */
            select sum(fd.fpde_fob) from factura_proforma_det fd, factura_proforma f
                where f.fapo_id = fd.fapo_id and f.fapo_idimpor = :id and fd.fpde_anulado = 'N' into :total;
            for select fd.fapo_id, fd.fpde_item, fd.fpde_fob from factura_proforma_det fd, factura_proforma f
                where f.fapo_id = fd.fapo_id and f.fapo_idimpor = :id and fd.fpde_anulado = 'N'
                into :idf, :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update factura_proforma_det fd
                        set fd.fpde_flete = fpde_flete + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'S') then
                    update factura_proforma_det fd
                        set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'I') then
                    update factura_proforma_det fd
                        set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                if (tipo = 'O') then
                    update factura_proforma_det fd
                        set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :totitem / :total)
                    where fd.fapo_id = :idf and fd.fpde_item = :item;
                end
            end
        END
    /* CIERRE LAS FACTURAS */
    for select FAPO_ID, PREF_PRE FROM factura_proforma WHERE fapo_idimpor = :ID AND fapo_anulado = 'N'
        INTO :IDF, :PREF
        DO
        BEGIN
        UPDATE factura_proforma SET fapo_estado = 'C', fapo_feccie = :FECCIE
            WHERE fapo_id = :IDF;
        SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE TIDO_COD = 131 AND PREF_PRE = :PREF INTO :IDI;
        EXECUTE PROCEDURE contabil_cierre_comp_int(:IDF, :IDI) returning_values (:ERROR, :VER, :IDC);
        if (ERROR = 0) then
            EXECUTE PROCEDURE contabiliza_pendiente (:IDC);
        END
    END
end^


ALTER PROCEDURE CERTIFICA_LABORAL (
    FEC DATE,
    NITEMPL VARCHAR(20))
RETURNS (
    NOMEMPL VARCHAR(60),
    FECING DATE,
    SALARIO NUMERIC(18,2),
    RECYEXT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    SALARIOLET VARCHAR(200),
    NOMTIPOCONT VARCHAR(60),
    FECHAEXPED DATE,
    CARGOEMPL VARCHAR(60),
    FIRMA VARCHAR(100),
    CARGOFIRMA VARCHAR(100))
AS
DECLARE VARIABLE PERIODIC INTEGER;
DECLARE VARIABLE TIPCONT CHAR(1);
DECLARE VARIABLE PERIODO INTEGER;
DECLARE VARIABLE PERINI INTEGER;
DECLARE VARIABLE PERFIN INTEGER;
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE FECINI DATE;
BEGIN
SELECT E.empl_fecing, E.empl_cargo, T.terc_nom, E.empl_tipocont, empl_ppago 
    FROM EMPLEADOS E, TERCEROS T
    WHERE T.terc_nit = E.terc_nit AND E.terc_nit = :nitempl
    INTO :fecing,:cargoempl, :nomempl, :tipcont, :periodic;
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';
/* BUSQUE LOS RECARGOS Y EXTRAS DEL ULTIMO PERIODO */
FECINI = EXTRACT(YEAR FROM FEC) || '/' || EXTRACT(MONTH FROM FEC) || '/01';
FECINI = FECINI -1;
EXECUTE PROCEDURE periodo_nom_fechaf (:fecini, :periodic) RETURNING_VALUES (:periodo, :ano);
IF (periodic = 2) THEN
    BEGIN
    IF (MOD(periodo,2) = 0) THEN
        perini = periodo - 1;
    ELSE
        perini = periodo;
    perfin = perini + 1;
    END
ELSE
    BEGIN
    perini = periodo;
    perfin = perini;
    END
SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, NOMINA N WHERE ((conc_cod = 953) OR (conc_cod = 900) OR (conc_cod = 931) OR (conc_cod = 945))
    AND TERC_NIT = :nitempl AND N.nomi_id = NC.nomi_id AND N.nomi_ano = :ano AND N.nomi_periodo >= :perini AND N.nomi_periodo <= :perfin
    AND ((N.nomi_periodocidad = :periodic) or (N.nomi_periodocidad = 4) or (N.nomi_periodocidad = 5))
    INTO :recyext;
IF (recyext IS NULL) THEN
    recyext = 0;
TOTAL = SALARIO + recyext;
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^


ALTER PROCEDURE CERTIFICADOS_RETENCION (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    FECINI VARCHAR(8),
    FECFIN VARCHAR(8),
    PRYINI VARCHAR(4),
    PRYFIN VARCHAR(4),
    CENINI VARCHAR(4),
    CENFIN VARCHAR(4),
    FECEXP DATE,
    ADMON VARCHAR(60),
    NUMERAR CHAR(1),
    INICIAL VARCHAR(6))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    CODCUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60),
    BASEIVA NUMERIC(18,2),
    BASE NUMERIC(18,2),
    PAGADO NUMERIC(18,2),
    PORC NUMERIC(9,2),
    RETENCION NUMERIC(18,2),
    FECHAEXP DATE,
    ADMINISTRACION VARCHAR(60),
    NUMERO VARCHAR(20))
AS
declare variable actual integer;
declare variable ANOINI CHAR(4);
declare variable MESINI CHAR(2);
declare variable FECHAINI CHAR(8);
declare variable SALDORET NUMERIC(18,2);
declare variable SALDOBASE NUMERIC(18,2);
declare variable CTARTIVA VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable BASEDB NUMERIC(18,2);
declare variable BASECR NUMERIC(18,2);
declare variable BASERET NUMERIC(18,2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (:ANOINI);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (:MESINI);
execute procedure compone_fecha_conta (:ANOINI, CAST(:MESINI AS INTEGER), 1) returning_values (FECHAINI);
FECHAEXP = FECEXP;
ADMINISTRACION = ADMON;
ACTUAL = CAST(INICIAL AS INTEGER);
if (pryini IS NULL) then
    PRYINI = '';
if (pryfin IS NULL) then
    PRYFIN = 'zz';
if (cenini IS NULL) then
    CENINI = '';
if (cenfin IS NULL) then
    CENFIN = 'zz';
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;
        SELECT CUEN_PORC FROM CUENTAS WHERE CUEN_COD = :CODCUENTA INTO :PORC;
        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 AND PROY_COD >= :pryini AND PROY_COD <= :pryfin
                AND CENT_COD >= :cenini AND CENT_COD <= :cenfin
                INTO :SALDORET;
            if (SALDORET IS NULL) then
                SALDORET = 0;
            if (PORC <> 0) then
                SALDOBASE = SALDORET * 100 / PORC;
            END
        /* SUME LOS MOVIMIENTOS DEL ANO DE LAS CUENTAS RELACIONADAS */
        SELECT SUM(CODE_DEBITO - CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, configura_certrete C
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(C.cfcr_ctabase)) = C.cfcr_ctabase AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND C.cfcr_cuenta = :codcuenta AND C.cfcr_base = 'N'
          AND PROY_COD >= :pryini AND PROY_COD <= :pryfin AND CENT_COD >= :cenini AND CENT_COD <= :cenfin
          INTO :PAGADO;
        if (PAGADO is null) then
            PAGADO = 0;
        SELECT SUM(CODE_DEBITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, configura_certrete C
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(C.cfcr_ctabase)) = C.cfcr_ctabase AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND C.cfcr_cuenta = :codcuenta AND C.cfcr_base = 'D'
          AND PROY_COD >= :pryini AND PROY_COD <= :pryfin AND CENT_COD >= :cenini AND CENT_COD <= :cenfin
          INTO :basedb;
        if (BASEDB is null) then
            BASEDB = 0;
        SELECT SUM(CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, configura_certrete C
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(C.cfcr_ctabase)) = C.cfcr_ctabase AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND C.cfcr_cuenta = :codcuenta AND C.cfcr_base = 'C'
          AND PROY_COD >= :pryini AND PROY_COD <= :pryfin AND CENT_COD >= :cenini AND CENT_COD <= :cenfin
          INTO :basecr;
        if (BASECR is null) then
            BASECR = 0;
        PAGADO = PAGADO + BASEDB + BASECR;
        SELECT SUM(CODE_BASE), SUM(CODE_DEBITO - CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :codcuenta AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
          AND PROY_COD >= :pryini AND PROY_COD <= :pryfin AND CENT_COD >= :cenini AND CENT_COD <= :cenfin
          INTO :BASE, :RETENCION;
        if (RETENCION is null) then
            RETENCION = 0;
        if (BASE is null) then
            BASE = 0;
        if ((PAGADO = 0) or (PAGADO IS NULL))  then
            PAGADO = BASE;
        /* CALCULO DE LA BASE DEL IVA SI EL CERIFICADO ES DE RETEIVA */
        execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'CUENTA DE RETENCION DE IVA PARA CERTIFICADOS') returning_values (:CTARTIVA);
        execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'CUENTA DE IVA PARA CERTIFICADOS DE RETENCION DE IVA') returning_values (:CTAIVA);
        if (SUBSTRING(CTAINI FROM 1 FOR STRLEN(CTARTIVA)) = CTARTIVA) then
            BEGIN
            BASEIVA = 0;
            SELECT SUM(CODE_BASE) FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
              WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR strlen(:ctaiva)) = :CTAIVA AND D.TERC_NIT = :NIT AND
              ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_detalle WHERE ENCO_CONSEC = D.enco_consec AND CUEN_COD = :CODCUENTA)
              AND PROY_COD >= :pryini AND PROY_COD <= :pryfin AND CENT_COD >= :cenini AND CENT_COD <= :cenfin
              INTO :BASEIVA;
            if (BASEIVA IS NULL) then
                BASEIVA = 0;
--            if (PORC <> 0) then
--                BASEIVA = BASE * 100 / PORC;
--            ELSE
--                BASEIVA = 0;
            END
        BASE = BASE + SALDOBASE;
        RETENCION = RETENCION + SALDORET;
        if ((RETENCION <> 0) or (PAGADO <> 0))  then
            begin
            if (substr(CODCUENTA, 1, 1) = '2') then
                BEGIN
                if (BASE < 0) then
                    BASE = BASE * -1;
                if (PAGADO < 0) then
                    PAGADO = PAGADO * -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^


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),
    GASTOS NUMERIC(18,2),
    PENSION NUMERIC(18,2),
    TOTALVACAC NUMERIC(18,2),
    CESANTIA NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    APSALUD NUMERIC(18,2),
    APPENSION NUMERIC(18,2),
    VOLUNTARIOS NUMERIC(18,2),
    RETENCION NUMERIC(18,2))
AS
declare variable SUMA numeric(18,2);
declare variable RESTA 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, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 37 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 37 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  SALARIOS = SUMA - RESTA;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE terc_nit = :nit AND conc_cod = 950 AND noco_ano >= :desdeano AND noco_ano <= :hastaano
    INTO :totalvacac;
  if (TOTALVACAC IS NULL) then
      TOTALVACAC = 0;
--  salarios = :salarios + :totalvacac;
  /* CESANTIAS */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 38 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 38 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  CESANTIA = SUMA - RESTA;
  /* GASTOS */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 39 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 39 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  GASTOS = SUMA - RESTA;
  /* PENSIONES */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 40 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 40 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  pension = SUMA - RESTA;
  /* OTROS */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 41 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 41 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  OTROS = SUMA - RESTA;
  total = salarios + cesantia + pension + otros;
  /* AP SALUD */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 43 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 43 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  APSALUD = SUMA - RESTA;
  if (apsalud < 0) then
    APSALUD = APSALUD * -1;
  /* AP PENSION */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 44 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 44 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  APPENSION = SUMA - RESTA;
  if (appension < 0) then
    appension = appension * -1;
  /* AP VOLUNTARIOS */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 45 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 45 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  voluntarios = SUMA - RESTA;
  /* RETENCION */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 46 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano >= :desdeano AND NC.noco_ano <= :hastaano AND CF.cocr_renglon = 46 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  if (SUMA < RESTA) then
    RETENCION = 0;
  else
    retencion = SUMA - RESTA;
  SUSPEND;
END^


ALTER PROCEDURE CHEQUEA_VENCIMIENTOS_CARGOS
AS
declare variable ID INTEGER;
declare variable VENCE DATE;
BEGIN
FOR SELECT NDPR_ID, NDPR_VENCE FROM notas_debito_proveedor order by ndpr_id into :id, :vence
    do
    UPDATE movimiento_proveedor set MVPR_VENCE = :VENCE WHERE MVPR_IDREF = :ID;
END^


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^


ALTER PROCEDURE CHEQUEO_COSTOS_NIIF (
    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_niif where arti_cod = :ARTICULO AND COST_FECHA > :FECHA;
for select mvar_cons, mvar_fecha, mvar_cant, mvar_costoniif, 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_niif(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
end^


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 COSTON NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
declare variable IDDOC INTEGER;
declare variable CANTTOT varchar(2);
declare variable comp varchar(20);
declare variable cantcomp numeric(18,2);
declare variable coscomp numeric(18,2);
declare variable coscompn 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_costoniif, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, MVAR_IDREF
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by arti_cod, mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :coston, :entrada, :bodega, :tipo, :lote, :iddoc
  do
    begin
    if ((TIPO <> 13)) then
        BEGIN
        if (TIPO = 33) then
            BEGIN
            execute procedure costo_promedio(:articulo, :FECHA) returning_values (:COSTO);
            execute procedure costo_promedio_niif(:articulo, :FECHA) returning_values (:COSTON);
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_COSTONIIF = :coston WHERE arti_cod = :articulo and MVAR_cons = :id;
            END
        if ((TIPO = 15) AND (ENTRADA = 'S')) Then
            begin
            costo = 0;
            coston = 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);
                execute procedure costo_promedio_niif(:comp, :FECHA) returning_values (:coscompn);
                costo = costo + (coscomp * cantcomp);
                coston = coston + (coscompn * cantcomp);
                end
            if ((canttot = 'SI') AND (CANT <> 0)) then
                BEGIN
                COSTO = COSTO / CANT;
                COSTON = COSTON / CANT;
                END
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo, MVAR_COSTONIIF = :coston WHERE arti_cod = :articulo and MVAR_cons = :id;
            end
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        EXECUTE PROCEDURE actualice_costo_niif(:ARTICULO, :fecha, :coston, :cant, :entrada, 'N', :id, :tipo);
        END
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega)) then
                BEGIN
                UPDATE EXISTENCIA_LOTE
                    SET EXLO_ENT = EXLO_ENT + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega;
                END
            ELSE
                BEGIN
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:articulo, :bodega, :LOTE, :FECHA, 0, :CANT);
                END
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE ARTI_COD = :ARTICULO AND MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT, 0);
            end
        end
    END
  END
END^


ALTER PROCEDURE CHEQUEO_INVENTARIO_FECHA (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    FECINI DATE,
    CLASE INTEGER)
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE COSTONIIF 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 coscomp numeric(18,2);
declare variable NIT VARCHAR(20);
declare variable CODSUC VARCHAR(10);
declare variable saldo numeric(18,4);
declare variable existe char(1);
declare variable comp varchar(20);
declare variable cantcomp numeric(18,2);
BEGIN
/* CLASE 1: SOLO COLGAP, 2: AMBOS, 5:SOLO NIIF */
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_tercero where arti_cod = :articulo AND EXTE_FECHA >= :FECINI;
  DELETE FROM existencia_lote where arti_cod = :articulo AND EXLO_FECHA >= :FECINI;
  DELETE FROM lotes where arti_cod = :articulo AND LOTE_FECHA >= :FECINI;
  /* los anteriores hay que ponerles saldo */
  for select BODE_COD, LOTE_NRO from lotes where arti_cod = :articulo AND LOTE_FECHA < :FECINI
    INTO :bodega, :lote
    DO
    BEGIN
    EXECUTE procedure SALDO_LOTE_FECHA (:ARTICULO, :BODEGA, :LOTE, :FECINI) returning_values (:CANT);
    UPDATE LOTES SET LOTE_SALDO = :CANT
        WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :LOTE;
    END
  if (CLASE <= 2) then
      delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECINI;
  if (CLASE >= 2) then
      delete from costos_niif where arti_cod = :ARTICULO AND COST_FECHA >= :FECINI;
  delete from existencia WHERE ARTI_COD = :ARTICULO AND EXIS_FECHA >= :FECINI;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_costoniif, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, MVAR_IDREF, TERC_NIT, CLSU_COD
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECINI
    order by arti_cod, mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :costoniif, :entrada, :bodega, :tipo, :lote, :iddoc, :NIT, :codsuc
  do
    begin
    if ((TIPO <> 13)) then
        BEGIN
        if (TIPO = 33) then
            BEGIN
            if (CLASE <= 2) then
                BEGIN
                execute procedure costo_promedio(:articulo, :FECHA) returning_values (:COSTO);
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
                END
            if (CLASE >= 2) then
                BEGIN
                execute procedure costo_promedio_niif(:articulo, :FECHA) returning_values (:COSTO);
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTONIIF = :costoniif WHERE arti_cod = :articulo and MVAR_cons = :id;
                END
            END
        if ((TIPO = 15) AND (ENTRADA = 'S')) Then
            begin
            costo = 0;
            costoniif = 0;
            if (CLASE <= 2) then
                BEGIN
                for select c.cost_salp
                    from ensambles_detalle ed, movimiento_articulo m, costos c
                    where ensa_id = :iddoc and ed.ensa_id = m.mvar_idref and m.mvar_tipodoc = 15 and m.mvar_cons = c.cost_idmov
                    and m.mvar_item = ed.esde_item AND ED.arti_cod <> :ARTICULO
                    into :coscomp
                    do
                    begin
                    costo = costo + coscomp;
                    END
                END
            if (CLASE >= 2) then
                BEGIN
                for select c.cost_salp
                    from ensambles_detalle ed, movimiento_articulo m, costos_niif c
                    where ensa_id = :iddoc and ed.ensa_id = m.mvar_idref and m.mvar_tipodoc = 15 and m.mvar_cons = c.cost_idmov
                    and m.mvar_item = ed.esde_item AND ED.arti_cod <> :ARTICULO
                    into :coscomp
                    do
                    begin
                    costoniif = costoniif + coscomp;
                    END
                END

            for select ed.arti_cod, ED.esde_cant * ED.esde_factor
                from ensambles_detalle ed where ensa_id = :iddoc AND ED.arti_cod = :ARTICULO
                into :comp, :cantcomp
                do
                begin
                if (CLASE <= 2) then
                    BEGIN
                    execute procedure costo_promedio(:comp, :FECHA) returning_values (:COSCOMP);
                    costo = costo + (coscomp * cantcomp);
                    END
                if (CLASE >= 2) then
                    BEGIN
                    execute procedure costo_promedio_niif(:comp, :FECHA) returning_values (:coscomp);
                    costoniif = costoniif + (coscomp * cantcomp);
                    END
                END
            if ((canttot = 'SI') AND (CANT <> 0)) then
                begin
                COSTO = COSTO / CANT;
                COSTONIIF = COSTONIIF / CANT;
                end
            if (CLASE <= 2) then
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            if (CLASE >= 2) then
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costoniif WHERE arti_cod = :articulo and MVAR_cons = :id;
            end
        if (CLASE <= 2) then
            EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        if (CLASE >= 2) then
            EXECUTE PROCEDURE actualice_costo_niif(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        END
    else
        begin
        execute procedure costo_promedio(:articulo, :FECHA) returning_values (:costo);
        update trasferencias_detalle d set d.tras_costo = :costo where d.tran_id = :iddoc and arti_cod = :articulo;
        end
    /* actualice existencias */
    if (TIPO <> 10) then
      if (:entrada = 'S') then
        begin
        if (TIPOEX = 'T') then
            BEGIN
            if (NIT IS NOT NULL) then
              if (EXISTS (SELECT TERC_NIT FROM existencia_tercero WHERE TERC_NIT = :nit AND EXTE_FECHA = :fecha AND ARTI_COD = :articulo AND CLSU_COD = :codsuc)) then
                BEGIN
                UPDATE existencia_tercero
                    SET EXTE_ENTR = EXTE_ENTR + :cant
                    WHERE TERC_NIT = :nit AND EXTE_FECHA = :FECHA AND ARTI_COD = :articulo AND CLSU_COD = :codsuc;
                END
              ELSE
                BEGIN
                INSERT INTO existencia_tercero (ARTI_COD, TERC_NIT, CLSU_COD, EXTE_FECHA, EXTE_SAL, EXTE_ENTR)
                    VALUES (:articulo, :nit, :codsuc, :FECHA, 0, :CANT);
                END
            END
        ELSE
            BEGIN
            execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
            if (TIPOEX = 'L') then
                begin
                if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                    UPDATE LOTES
                        set lote_saldo = lote_saldo + :cant
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                ELSE
                    INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                        VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
                if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega)) then
                    BEGIN
                    UPDATE EXISTENCIA_LOTE
                        SET EXLO_ENT = EXLO_ENT + :cant
                        WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega;
                    END
                ELSE
                    BEGIN
                    INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                        VALUES (:articulo, :bodega, :LOTE, :FECHA, 0, :CANT);
                    END
                end
            END
        end
      else
        begin
        if (TIPOEX = 'T') then
            BEGIN
            if (NIT IS NOT NULL) then
                if (TIPO <> 31) then
                  if (EXISTS (SELECT TERC_NIT FROM existencia_tercero WHERE TERC_NIT = :nit AND EXTE_FECHA = :FECHA AND ARTI_COD = :articulo AND CLSU_COD = :codsuc)) then
                    BEGIN
                    UPDATE existencia_tercero
                        SET EXTE_SAL = EXTE_SAL + :cant
                        WHERE TERC_NIT = :nit AND EXTE_FECHA = :FECHA AND ARTI_COD = :articulo AND CLSU_COD = :codsuc;
                    END
                  ELSE
                    BEGIN
                    INSERT INTO existencia_tercero (ARTI_COD, TERC_NIT, CLSU_COD, EXTE_FECHA, EXTE_SAL, EXTE_ENTR)
                        VALUES (:articulo, :nit, :codsuc, :FECHA, :CANT, 0);
                    END
            END
        ELSE
            BEGIN
            execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
            if (TIPOEX = 'L') then
                begin
                EXISTE = 'N';
                SELECT 'S', lote_saldo FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote
                    into :EXISTE, :SALDO;
                if (EXISTE = 'S') then
                    if (SALDO >= CANT) then
                        UPDATE LOTES
                            set lote_saldo = lote_saldo - :cant
                            where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
                    ELSE
                        exception lote_no_existe 'El saldo (' || :saldo || ') del lote ' || :lote || ' para el articulo ' || :articulo || ' en la bodega ' || :bodega || ' en la fecha ' || :fecha || ' es insuficiente para el movimiento ' || :cant;
                else
                    exception lote_no_existe 'No se encontro el lote ' || :lote || ' para el articulo ' || :articulo || ' en la bodega ' || :bodega || ' en ' || :fecha;

                if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                    AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                    UPDATE EXISTENCIA_LOTE
                           SET EXLO_SAL = EXLO_SAL + :cant
                        WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                else
                    INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                        VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT, 0);
                end
            END
        end
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 141, 1, 'I', :ARTICULO);
  END
END^


ALTER PROCEDURE CHEQUEO_LOTES (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
declare variable IDDOC INTEGER;
declare variable CANTTOT varchar(2);
declare variable comp varchar(20);
declare variable cantcomp numeric(18,2);
declare variable coscomp numeric(18,2);
declare variable LOTESAL varchar(20);
declare variable SALDOLOTE numeric(18,4);
declare variable CONC VARCHAR(60);
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable ITEM INTEGER;
declare variable NIT VARCHAR(20);
BEGIN
execute procedure LEE_CONFIGURACION ('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (CANTTOT);
for select arti_cod, ARTI_EXIST from articulo where arti_cod >= :artini and arti_cod <= :artfin order by arti_cod into :ARTICULO, :TIPOEX
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  delete from errores_lotes where articulo = :ARTICULO;
  ITEM = 1000;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, mvar_idref,
    MVAR_CONC, MVAR_PREF, MVAR_NUMERO, TERC_NIT
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by arti_cod, mvar_fecha, mvar_entrada desc, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote, :iddoc, :CONC, :PREF, :NUMERO, :NIT
  do
    begin
    if ((TIPO <> 13)) then
        BEGIN
        if (TIPO = 33) then
            BEGIN
            execute procedure costo_promedio(:articulo, :FECHA) returning_values (:COSTO);
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE MVAR_cons = :id;
            END
        if ((TIPO = 15) AND (ENTRADA = 'S')) Then
            begin
            costo = 0;
            for select arti_cod, esde_cant * esde_factor from ensambles_detalle where ensa_id = :iddoc
                into :comp, :cantcomp
                do
                begin
                execute procedure costo_promedio(:comp, :FECHA) returning_values (:coscomp);
                costo = costo + (coscomp * cantcomp);
                end
            if ((canttot = 'SI') AND (CANT <> 0)) then
                COSTO = COSTO / CANT;
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE MVAR_cons = :id;
            end
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        END
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (cant < 0) then
                begin
                SELECT LOTE_SALDO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :SALDOLOTE;
                if (SALDOLOTE >= abs(CANT)) then
                    begin
                    UPDATE LOTES
                        set lote_saldo = lote_saldo + :cant
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                    end
                else
                    begin
/*                    exception lote_negativo 'EL SALDO DEL ARTICULO ' || :ARTICULO || ' CON LOTE ' || :LOTE || ' EN LA BODEGA ' || :BODEGA || ' EN ' || :fecha || ' ES INSUFICIENTE: ' || :SALDOLOTE || ' PARA LA CANTIDAD ' || :CANT;*/
                    UPDATE MOVIMIENTO_ARTICULO SET MVAR_CANT = :SALDOLOTE WHERE MVAR_cons = :id;
                    UPDATE LOTES
                        set lote_saldo = 0
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                    INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, SALDOBOD)
                        VALUES ('ENTRADA NEGATIVA, SE AJUSTA LA CANTIDAD', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :SALDOLOTE);
                    end
                end
            else
                begin
                if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                    UPDATE LOTES
                        set lote_saldo = lote_saldo + :cant
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                ELSE
                    INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                        VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
                if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                    AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                    UPDATE EXISTENCIA_LOTE
                        SET EXLO_ENT = EXLO_ENT + :cant
                        WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                else
                    INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                        VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, 0, :CANT);
                end
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            /* VERIFIQUE SI EXISTE EL LOTE */
            if (exists (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                BEGIN
                SALDOLOTE = 0;
                SELECT LOTE_SALDO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :SALDOLOTE;
                if (SALDOLOTE >= CANT) then
                    BEGIN
                    UPDATE LOTES
                        set lote_saldo = lote_saldo - :cant
                        where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
                    if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                        AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                        UPDATE EXISTENCIA_LOTE
                           SET EXLO_SAL = EXLO_SAL + :cant
                            WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                    else
                        INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                            VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT, 0);
                    END
                ELSE
                    BEGIN
/*                    exception lote_negativo 'EL SALDO DEL ARTICULO ' || :ARTICULO || ' CON LOTE ' || :LOTE || ' EN LA BODEGA ' || :BODEGA || ' EN ' || :fecha || ' ES INSUFICIENTE: ' || :SALDOLOTE || ' PARA LA CANTIDAD ' || :CANT;*/
                    IDL = 0;
                    SELECT FIRST 1 LOTE_ID FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant
                        ORDER BY LOTE_FECHA INTO :IDL;
                    if (IDL <> 0) then
                        BEGIN
                        SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                        UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTESAL WHERE MVAR_CONS = :ID;
                        UPDATE LOTES
                            set lote_saldo = lote_saldo - :cant
                            where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                        INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                            VALUES ('LOTE INSUFICIENTE EN SALIDA, SE CAMBIA LOTE', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);

                        if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                            AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                            UPDATE EXISTENCIA_LOTE
                               SET EXLO_SAL = EXLO_SAL + :cant
                               WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                        else
                            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :CANT, 0);
                        END
                    ELSE
                        BEGIN
/*                     exception lote_negativo 'EL SALDO DEL ARTICULO ' || :ARTICULO || ' CON LOTE ' || :LOTE || ' EN LA BODEGA ' || :BODEGA || ' EN ' || :fecha || ' ES INSUFICIENTE: ' || :SALDOLOTE || ' PARA LA CANTIDAD ' || :CANT;*/
                        /* no hay un lote con cant. suficiente, use la cant. disponible y agregue un item */
                        UPDATE MOVIMIENTO_ARTICULO SET MVAR_CANT = :SALDOLOTE WHERE MVAR_cons = :id;
                        UPDATE LOTES
                            set lote_saldo = 0
                            where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                        if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                            AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                            UPDATE EXISTENCIA_LOTE
                                SET EXLO_SAL = EXLO_SAL + :SALDOLOTE
                                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                        else
                            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :SALDOLOTE, 0);

                        cant = cant - saldolote;
                        /* verifique si hay un lote con la cant restante suficiente */
                        IDL = 0;
                        SELECT FIRST 1 LOTE_ID FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant
                            ORDER BY LOTE_FECHA, LOTE_ID INTO :IDL;
                        if (IDL <> 0) then
                            BEGIN
                            SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                            ID = GEN_ID(id_movarti, 1);
                            ITEM = ITEM + 1;
                            INSERT INTO MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_IDREF, MVAR_CONC, MVAR_CANT,
                                MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_TIPODOC, MVAR_ITEM, TERC_NIT)
                                VALUES (:ARTICULO, :ID, :bodega, :FECHA, :IDDOC, :CONC, :CANT, :COSTO, 'N', :LOTESAL, :PREF, :NUMERO, :TIPO, :ITEM, :NIT);
                            UPDATE LOTES
                                set lote_saldo = lote_saldo - :cant
                                where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);

                            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                                UPDATE EXISTENCIA_LOTE
                                    SET EXLO_SAL = EXLO_SAL + :cant
                                    WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                            else
                                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                    VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :CANT, 0);
                            INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                VALUES ('LOTE INSUFICIENTE EN SALIDA, SE AGREGO ITEM', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);
                            END
                        ELSE
                            BEGIN
                            for SELECT LOTE_ID, LOTE_SALDO FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO > 0
                                ORDER BY LOTE_FECHA, LOTE_ID INTO :IDL, :SALDOLOTE
                                DO
                                BEGIN
                                if (CANT > 0) then
                                    BEGIN
                                    if (CANT < SALDOLOTE) then
                                        BEGIN
                                        CANT = 0;
                                        SALDOLOTE = CANT;
                                        END
                                    ELSE
                                        CANT = CANT - SALDOLOTE;
                                    SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                                    ID = GEN_ID(id_movarti, 1);
                                    ITEM = ITEM + 1;
                                    INSERT INTO MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_IDREF, MVAR_CONC, MVAR_CANT,
                                        MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_TIPODOC, MVAR_ITEM, TERC_NIT)
                                        VALUES (:ARTICULO, :ID, :bodega, :FECHA, :IDDOC, :CONC, :SALDOLOTE, :COSTO, 'N', :LOTESAL, :PREF, :NUMERO, :TIPO, :ITEM, :NIT);
                                    UPDATE LOTES
                                        set lote_saldo = LOTE_SALDO - :SALDOLOTE
                                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                                    if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                                        AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                                        UPDATE EXISTENCIA_LOTE
                                            SET EXLO_SAL = EXLO_SAL + :SALDOLOTE
                                            WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                                    else
                                        INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                            VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :SALDOLOTE, 0);

                                    INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                        VALUES ('LOTE INSUFICIENTE EN SALIDA, SE AGREGARON ITEMS', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :SALDOLOTE);
                                    END
                                END
                            if (CANT > 0) then
                                BEGIN
                                INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                    VALUES ('LOTE INSUFICIENTE EN SALIDA, SE AGREGO ITEMS QUEDO SALDO', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);
                                END
                            END
                        END
                    END
                END
            else
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                IDL = 0;
                SELECT FIRST 1 LOTE_ID FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant
                    ORDER BY LOTE_FECHA INTO :IDL;
                if (IDL <> 0) then
                    BEGIN
                    SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                    UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTESAL WHERE MVAR_CONS = :ID;
                    UPDATE LOTES
                        set lote_saldo = lote_saldo - :cant
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                    INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                        VALUES ('LOTE NO EXISTE EN SALIDA, SE CAMBIA LOTE', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);

                    if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                        AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                        UPDATE EXISTENCIA_LOTE
                            SET EXLO_SAL = EXLO_SAL + :cant
                            WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                    else
                        INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                            VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :CANT, 0);
                    END
                ELSE
                    BEGIN
                    /* no hay un lote con cant. suficiente, BORRE EL ACTUAL y agregue items nuevos con los saldos disponibles */
                    delete FROM movimiento_articulo WHERE MVAR_CONS = :ID;
                    for SELECT LOTE_ID, LOTE_SALDO FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO > 0
                        ORDER BY LOTE_FECHA, LOTE_ID INTO :IDL, :SALDOLOTE
                        DO
                        BEGIN
                        if (CANT > 0) then
                            BEGIN
                            if (CANT < SALDOLOTE) then
                                BEGIN
                                CANT = 0;
                                SALDOLOTE = CANT;
                                END
                            ELSE
                                CANT = CANT - SALDOLOTE;
                            SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                            ID = GEN_ID(id_movarti, 1);
                            ITEM = ITEM + 1;
                            INSERT INTO MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_IDREF, MVAR_CONC, MVAR_CANT,
                                MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_TIPODOC, MVAR_ITEM, TERC_NIT)
                                VALUES (:ARTICULO, :ID, :bodega, :FECHA, :IDDOC, :CONC, :SALDOLOTE, :COSTO, 'N', :LOTESAL, :PREF, :NUMERO, :TIPO, :ITEM, :NIT);
                            UPDATE LOTES
                                set lote_saldo = LOTE_SALDO - :SALDOLOTE
                                where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                                UPDATE EXISTENCIA_LOTE
                                    SET EXLO_SAL = EXLO_SAL + :SALDOLOTE
                                    WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                            else
                                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                    VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :SALDOLOTE, 0);

                            INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                VALUES ('LOTE NO EXISTE EN SALIDA, SE AGREGARON ITEMS', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :SALDOLOTE);
                            END
                        END
                    if (CANT > 0) then
                        BEGIN
                        INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                            VALUES ('ERROR LOTE NO EXISTE EN SALIDA, SE AGREGO ITEMS QUEDO SALDO', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);
                        END
                    END
                END
            end
        end
    END
  END
END^


ALTER PROCEDURE CHEQUEO_LOTES2 (
    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 IDDOC INTEGER;
declare variable CANTTOT varchar(2);
declare variable CONC VARCHAR(60);
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable ITEM INTEGER;
declare variable NIT VARCHAR(20);
declare variable EXISTENC NUMERIC(18,4);
declare variable LOTEANT VARCHAR(20);
declare variable IDMOV INTEGER;
declare variable FECHAENT DATE;
BEGIN
execute procedure LEE_CONFIGURACION ('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (CANTTOT);
for select arti_cod, ARTI_EXIST from articulo where arti_cod >= :artini and arti_cod <= :artfin order by arti_cod into :ARTICULO, :TIPOEX
  DO
  BEGIN
  ITEM = 1000;
  LOTEANT = '';
  EXISTENC = 0;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, mvar_idref,
    MVAR_CONC, MVAR_PREF, MVAR_NUMERO, TERC_NIT
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by arti_cod, mvar_fecha, mvar_entrada desc, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote, :iddoc, :CONC, :PREF, :NUMERO, :NIT
  do
    begin
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        if (TIPOEX = 'L') then
            begin
            if (LOTEANT <> LOTE) then
                EXISTENC = 0;
            end
        EXISTENC = EXISTENC + CANT;
        end
    else
        begin
        if (TIPOEX = 'L') then
            begin
            if (LOTEANT <> LOTE) then
                EXISTENC = 0;
            end
        EXISTENC = EXISTENC - CANT;
        end
    if (EXISTENC < 0) then
        BEGIN
        /* BUSQUE LA PROXIMA ENTRADA Y CAMBIELE LA FECHA */
        if (TIPOEX = 'L') then
            BEGIN
            IDMOV = 0;
            SELECT FIRST 1 MVAR_CONS, MVAR_FECHA FROM movimiento_articulo
                WHERE ARTI_COD = :ARTICULO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA > :FECHA AND MVAR_LOTE = :LOTE
                ORDER BY mvar_fecha, mvar_entrada desc, mvar_cons
                INTO :IDMOV, :fechaent;
            if ((IDMOV IS NOT NULL) AND (IDMOV <> 0)) then
                BEGIN
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_FECHA = :FECHA WHERE MVAR_CONS = :IDMOV;
                INSERT INTO errores_lotes (ARTICULO, BODEGA, lote, idmov, FECHA) VALUES (:ARTICULO, :bodega, :lote, :id,  :FECHA);
                INSERT INTO errores_lotes (ARTICULO, BODEGA, lote, idmov, FECHA) VALUES (:ARTICULO, :bodega, :lote, :idmov,  :fechaent);
                END
            ELSE
                exception lote_negativo 'ERROR LOTE NEGATIVO ARTICULO ' || :ARTICULO || ' LOTE ' || :LOTE || ' FECHA ' || :FECHA;
            END
        ELSE
            BEGIN
            IDMOV = 0;
            SELECT FIRST 1 MVAR_CONS FROM movimiento_articulo
                WHERE ARTI_COD = :ARTICULO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA > :FECHA
                ORDER BY mvar_fecha, mvar_entrada desc, mvar_cons
                INTO :IDMOV;
            if ((IDMOV IS NOT NULL) AND (IDMOV <> 0)) then
                BEGIN
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_FECHA = :FECHA WHERE MVAR_CONS = :IDMOV;
                INSERT INTO errores_lotes (ARTICULO, BODEGA, idmov, FECHA) VALUES (:ARTICULO, :bodega, :id,  :FECHA);
                INSERT INTO errores_lotes (ARTICULO, BODEGA, idmov, FECHA) VALUES (:ARTICULO, :bodega, :idmov,  :fechaent);
                END
            ELSE
                exception lote_negativo 'ERROR LOTE NEGATIVO ARTICULO ' || :ARTICULO || ' LOTE ' || :LOTE || ' FECHA ' || :FECHA;
            END
        END
    END
  END
END^


ALTER PROCEDURE CHEQUEO_MOVIMIENTO_ARTICULO (
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15))
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(8);
declare variable Nit varchar(20);
declare variable IVAINC CHAR(1);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable COSTON NUMERIC(18,2);
declare variable ULTIMO NUMERIC(18,2);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable ARTI_COD VARCHAR(15);
declare variable BODE_COD VARCHAR(2);
declare variable BODDES VARCHAR(2);
declare variable CANT NUMERIC(18,4);
declare variable CANTDET NUMERIC(18,4);
declare variable CANTAUX NUMERIC(18,4);
declare variable EXANT NUMERIC(18,4);
declare variable EXNUE NUMERIC(18,4);
declare variable DTOMONTO NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable IVAPORC NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable MENORV CHAR(2);
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 NUMPROV VARCHAR(15);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSOLIDA INTEGER;
declare variable LOTE VARCHAR(20);
declare variable LOTEDES VARCHAR(20);
declare variable aux VARCHAR(120);
declare variable CONFIRMA CHAR(1);
declare variable ORIGEN CHAR(2);
declare variable CANTOT CHAR(2);
declare variable NOAJUSTAR CHAR(1);
declare variable SALDO NUMERIC(18,4);
declare variable ESLOTE CHAR(1);
declare variable NOMCLI VARCHAR(60);
declare variable CEROS CHAR(2);
declare variable ACTREM CHAR(2);
declare variable IDFACT INTEGER;
declare variable EXISTE CHAR(1);
declare variable FACTURA VARCHAR(12);
declare variable REMISION VARCHAR(12);
declare variable OK CHAR(1);
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DEVREM CHAR(6);
declare variable PEDAUTO CHAR(2);
declare variable FECFAC DATE;
declare variable DEVNOF CHAR(2);
begin
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
for select ED.ENTR_ID, ENDE_ITEM, ARTI_COD, ED.BODE_COD, ENDE_CANT, ENDE_COSTO, ENDE_COSTON, ENDE_LOTE, ENDE_FACTOR, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_CONSUMO,
    entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
    from ENTRADAS_DETALLE ED, ENTRADAS E WHERE E.entr_id = ED.entr_id AND E.entr_anulado = 'N'
    AND ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN
    ORDER BY ENTR_FECHA, ENDE_ITEM, E.ENTR_ID
    into :ID, :ITEM, :ARTI_COD, :BODE_COD, :CANT, :COSTO, :COSTON, :LOTE, :FACTOR, :DTOMONTO, :IVAPORC, :CONSUMO,
    :fec, :conc, :Pref, :Num, :Nit, :ivainc
    do
    begin
    COSTO = ((:costo - :dtomonto) / :factor);
    COSTON = ((:coston - :dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        if (icoinc = 'SI') then
            BEGIN
            COSTO = COSTO - :consumo;
            COSTON = COSTON - :consumo;
            END
        COSTON = COSTON / (1 + :ivaporc/100);
        COSTO = COSTO / (1 + :ivaporc/100);
        END

    INSERT INTO MOVIMIENTO_ARTICULO
      (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_COSTONIIF, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
      VALUES(:ARTI_COD, :BODE_COD, :FEC, 11, :id, :CONC, :factor * :cant, :costo, :coston, 'S', :lote, :Pref, :Num, :item, :Nit);
    end

EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
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);
for select r.repr_id, rd.rpvd_item, ARTI_COD, rd.bode_cod, rd.rpvd_cant, rd.rpvd_lote, rd.rpvd_prunit, rd.rpvd_dtomonto, rd.rpvd_factor, rd.rpvd_ivaporc, rd.rpvd_consumo,
    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 r, remision_proveedor_det rd where r.repr_id = rd.repr_id and r.repr_anulado = 'N'
    into :ID, :ITEM, :ARTI_COD, :BODE_COD, :CANT, :LOTE, :COSTO, :DTOMONTO, :FACTOR, :IVAPORC, :CONSUMO,
        :fec, :Pref, :Num, :IVAINC, :NIT, :NUMPROV, :numped, :CONSOLIDA, :dtopie, :adicional, :total, :ivamonto, :extra
    do
    begin
    CONC = 'REMISION PROVEEDOR No.' || PREF || NUM || '-' || NUMPROV;
    if (numped <> '') then
        conc = conc || '-ORDEN ' || NUMPED;
    COSTO = ((:costo - :dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        if (icoinc = 'SI') then
            COSTO = COSTO - (:consumo/(:cant * :factor));
        COSTO = COSTO / (1 + :ivaporc/100);
        END
    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
        if ((ACTREM = 'SI') and (CEROS = 'NO')) then
            execute procedure costo_promedio(: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(:ARTI_COD, :BODE_COD, :FEC, 22, :id,
      :CONC, :factor * :cant, :COSTO, 'S', :lote, :Pref, :Num, :item, :Nit);
    end

execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
for select F.FACO_ID, FCDE_ITEM, ARTI_COD, FD.BODE_COD, FCDE_CANT, FCDE_LOTE, FCDE_PRUNIT, FCDE_DTOMONTO, FCDE_FACTOR, FCDE_IVAPORC, FCDE_CONSUMO,
    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_COMPRAS_DETALLE FD, facturas_compra F WHERE F.faco_id = FD.faco_id AND FACO_ANULADO = 'N'
    AND ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN
    into :ID, :ITEM, :ARTI_COD, :BODE_COD, :CANT, :LOTE, :COSTO, :DTOMONTO, :FACTOR, :IVAPORC, :CONSUMO,
        :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :CONSOLIDA,
        :total, :extra, :ivamonto, :adicional, :dtopie
    DO
    BEGIN
    conc = 'FACTURA COMPRA No.' || PREF || NUM || '-' || NUMPROV;
    if (NUMREM <> '') then
        BEGIN
        AUX = SUBSTR(NUMREM, 1, 15);
        conc = conc || '-REM:' || AUX;
        END
    else
        if (NUMPED <> '') then
            BEGIN
            AUX = SUBSTR(NUMPED, 1, 15);
            conc = conc || '-ORDEN ' || AUX;
            END
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    COSTO = ((:costo - :dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        if (icoinc = 'SI') then
            COSTO = COSTO - (:consumo/(:cant * :factor));
        COSTO = COSTO / (1 + :ivaporc/100);
        END
    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(:ARTI_COD, :BODE_COD, :FEC, 21, :id, :CONC, :factor * :cant, :COSTO, 'S', :lote, :Pref, :Num, :item, :Nit);
        end
    end

execute procedure LEE_CONFIGURACION ('COMPRAS','DEVOLUCIONES','PERMITIR DEVOLVER ARTICULOS NO FACTURADOS') returning_values (:devnof);
execute procedure lee_configuracion ('COMPRAS', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
for select DC.dvco_id, CD.dvcd_item, ARTI_COD, CD.BODE_COD, CD.dvcd_cant, CD.dvcd_lote, CD.dvcd_factor,
    dvco_fecha, pref_pre, dvco_numero, terc_nit, dvco_factura, DVCO_FACTID, dvco_remision, dvco_remid
    from devoluciones_compras DC, devoluciones_compras_det CD
    where DC.dvco_id = CD.dvco_id AND DC.dvco_anulado = 'N'
    into :ID, :ITEM, :ARTI_COD, :BODE_COD, :CANT, :LOTE, :FACTOR,
    :fec, :Pref, :Num, :Nit, :factura, :idfact, :remision, :idrem
    DO
    BEGIN
    if (idrem <> 0) then
        CONC = 'DEVOLUCION COMPRA No.' || PREF || NUM || ' - REMISION ' || REMISION;
    else
        CONC = 'DEVOLUCION COMPRA No.' || PREF || NUM || ' - FACTURA ' || FACTURA;
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    if (((idfact <> 0) or (devnof = 'SI')) AND ((IDREM IS NULL) or (IDREM = 0))) then
        BEGIN
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(:ARTI_COD, :BODE_COD, :FEC, 24, :id,
            :CONC, :factor * :cant, 0, 'N', :lote, :Pref, :Num, :item, :Nit);
        END
    if ((idrem <> 0) and (devrem = '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(:ARTI_COD, :BODE_COD, :FEC, 24, :id,
            :CONC, :factor * :cant, 0, 'N', :lote, :Pref, :Num, :item, :Nit);
        END
    END

for select SD.sali_id, SADE_ITEM, ARTI_COD, SD.BODE_COD, SADE_CANT, SADE_LOTE, SADE_FACTOR,
    sali_fecha, sali_conc, pref_pre, sali_numero, terc_nit
    from SALIDAS_DETALLE SD, SALIDAS S WHERE S.sali_id = SD.sali_id AND S.sali_anulado = 'N'
    AND ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN
    ORDER BY SALI_FECHA, SADE_ITEM, S.sali_id
    into :ID, :ITEM, :ARTI_COD, :BODE_COD, :CANT, :LOTE, :FACTOR,
    :fec, :conc, :Pref, :Num, :Nit
    do
    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(:ARTI_COD, :BODE_COD, :FEC, 12, :id, :CONC, :factor * :cant, 0, 'N', :lote, :Pref, :Num, :item, :Nit);
    end

EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values(ORIGEN);
for select TD.tran_id, TRAS_ITEM, ARTI_COD, TRAS_CANT, TRAS_LOTE, TRAS_FACTOR, TRAS_CONFIRMA, TRAS_COSTO, TRAS_LOTEDES,
    tran_fecha, tran_conc, BODE_COD, TRAN_BODDES, pref_pre, tran_numero, TERC_NIT
        from trasferencias T, trasferencias_detalle TD where T.tran_id = TD.tran_id AND T.tran_anulado = 'N'
        into :ID, :ITEM, :ARTI_COD, :CANT, :LOTE, :FACTOR, :CONFIRMA, :costo, :LOTEDES,
        :fec, :conc, :bode_cod, :boddes, :Pref, :Num, :NIT
    DO
    BEGIN
    if ((ORIGEN = 'NO') or (: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(:ARTI_COD, :bode_cod, :FEC, 13, :id,
          :CONC, :factor * :cant, 0, 'N', :lote, :Pref, :Num, :item);
    if (:confirma = 'S') 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)
            VALUES(:ARTI_COD, :boddes, :FEC, 13, :id,
            :CONC, :factor * :cant, :costo, 'S', :lotedes, :Pref, :Num, :item);
        END
    END

EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
for select ES.ensa_id, ESDE_ITEM, ESD.ARTI_COD, ESD.BODE_COD, ESDE_CANT, ESDE_LOTE, ESDE_FACTOR,
    ensa_fecha, ensa_conc, pref_pre, ensa_numero, (esde_cant * esde_factor)
    from ensambles ES, ensambles_detalle ESD where ES.ensa_id = ESD.ensa_id AND ES.ensa_anulado = 'N'
    into :id, :item, :arti_cod, :bode_cod, :cantdet, :lote, :factor,
    :fec, :conc, :Pref, :Num, :CANT
    DO
    BEGIN
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * :cantdet;
    ELSE
        CANT = factor * :cantdet;
    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(:ARTI_COD, :BODE_COD, :FEC, 15, :id,
      :CONC, :CANT, 0, 'N', :lote, :Pref, :Num, :item);
    END

for select ensa_id, ARTI_COD, ENSA_CANT, ENSA_LOTE, ENSA_FACTOR, ENSA_COSTO,
    ensa_fecha, ensa_conc, BODE_COD, pref_pre, ensa_numero
        from ensambles ES where es.ensa_anulado = 'N'
        into :ID, :ARTI_COD, :CANT, :LOTE, :FACTOR, :costo,
        :fec, :conc, :bode_cod, :Pref, :Num
    DO
    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)
        VALUES(:ARTI_COD, :bode_cod, :fec, 15, :id,
        :conc, :factor * :cant, :COSTO/:factor, 'S', :lote, :pref, :num, 0);
    END

for select D.dese_id, ARTI_COD, D.dese_cant, D.dese_lote, D.dese_factor,
    D.dese_fecha, D.dese_conc, D.bode_cod, D.pref_pre, D.dese_numero
        from desensambles D where D.dese_anulado = 'N'
        into :ID, :ARTI_COD, :CANT, :LOTE, :FACTOR,
        :fec, :conc, :bode_cod, :Pref, :Num
    DO
    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)
      VALUES(:ARTI_COD, :bode_cod, :fec, 16, :id,
      :conc, :factor * :cant, 0, 'N', :lote, :pref, :num, 0);
    END

for select d.dese_id, dd.dese_item, DD.ARTI_COD, DD.BODE_COD, DD.dede_cant, DD.dede_lote, DD.dede_factor,
    dese_fecha, dese_conc, pref_pre, dese_numero, dese_cant * dese_factor
    from desensambles D, desensambles_detalle DD where D.dese_id = DD.dese_id AND D.dese_anulado = 'N'
    into :id, :item, :arti_cod, :bode_cod, :cantdet, :lote, :factor,
        :fec, :conc, :Pref, :Num, :CANT
    DO
    BEGIN
    execute procedure costo_promedio(:arti_cod, :FEC) returning_values (:COSTO);
    if (CANTOT <> 'SI') then
        CANT = CANT * factor * :cantdet;
    ELSE
        CANT = factor * :cantdet;
    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(:ARTI_COD, :BODE_COD, :FEC, 16, :id,
      :CONC, :CANT, :COSTO, 'S', :lote, :Pref, :Num, :item);
    END

for select AD.ajus_id, AD.ajus_item, AD.arti_cod, AD.bode_cod, AD.ajus_exant, AD.ajus_exnue, AD.ajus_lote, AD.ajus_factor,
    AJUS_fecha, AJUS_conc, AJUS_NUMERO, PREF_PRE, AJUS_NOAJUSTAR
    from AJUSTES A, AJUSTES_DETALLE AD where A.AJUS_id = AD.AJUS_id
    into :id, :item, :arti_cod, :bode_cod, :exant, :exnue, :lote, :factor,
        :fec, :conc, :Num, :Pref, :noajustar
    DO
    BEGIN
    if (noajustar = 'N') then
        begin
        CANT = :exant - (:exnue * :factor);
        if (CANT > 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(:ARTI_COD, :BODE_COD, :FEC, 14, :id,
            :CONC, :cant, 0, 'N', :lote, :Pref, :Num, :item);
          END
        ELSE
          BEGIN
          /* ES UNA ENTRADA */
          EXECUTE PROCEDURE costo_promedio(: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(:ARTI_COD, :BODE_COD, :FEC, 14, :id,
            :CONC, abs(:cant), :COSTO, 'S', :lote, :Pref, :Num, :item);
          END
        end
    END

FOR SELECT CACO_ID, ARTI_COD, CACO_NVOCOSTO, CACO_FECHA, CACO_CONCEPTO, PREF_PRE, CACO_NUMERO
    FROM cambio_costo
    WHERE CACO_ANULADO = 'N' AND ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN
    ORDER BY CACO_FECHA, CACO_ID
    INTO :ID, :arti_cod, :costo, :fec, :conc, :pref, :num
    DO
    BEGIN
    FOR SELECT BODE_COD FROM BODEGA INTO :bode_cod
        do
        BEGIN
        EXECUTE PROCEDURE saldo_inventario(:ARTI_COD, :bode_cod, :fec) returning_values (:SALDO);
        if (SALDO <> 0) then
          BEGIN
          SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = :ARTI_COD INTO :ESLOTE;
          if (ESLOTE = 'L') then
            begin
            for select LOTE, SALDO from saldo_lotes_fecha(:arti_cod, :bode_cod, :fec)
                into :lote, :saldo
                do
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                    VALUES(:ARTI_COD, :bode_cod, :fec, 10, :id, :conc, :SALDO, :COSTO, 'N', :lote, :pref, :num, 1);
            end
          else
              INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(:ARTI_COD, :bode_cod, :fec, 10, :id, :conc, :SALDO, :COSTO, 'N', null, :pref, :num, 1);
          END
        END
    END

for select rd.revt_id, rd.rvde_item, ARTI_COD, rd.BODE_COD, rd.rvde_cant * rd.rvde_factor, rd.rvde_lote,
    revt_fecha, pref_pre, revt_numero, terc_nit, revt_nomterc, REVT_CONSOLIDA
    from remisiones_venta r, remisiones_venta_detalle rd where r.revt_id = rd.revt_id and r.revt_anulado = 'N'
    into :ID, :ITEM, :ARTI_COD, :BODE_COD, :CANT, :LOTE,
    :fec, :Pref, :Num, :Nit, :Nomcli, :consolida
    do
    BEGIN
    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 */
    EXISTE = 'N';
    if (Tipo = 31) Then
        select 'S' from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :idfact into :EXISTE;
    if (EXISTE = 'N') 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(:ARTI_COD, :BODE_COD, :FEC, 32, :id,
            :CONC, :factor * :cant, 0, 'N', :lote, :Pref, :Num, :item, :Nit);
        end
    end

for select fd.fact_id, FADE_ITEM, ARTI_COD, FD.BODE_COD, FADE_CANT * FADE_FACTOR, FADE_LOTE,
    fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida
    from facturas f, facturas_detalle fd where f.fact_id = fd.fact_id and f.fact_anulado = 'N'
    into :ID, :ITEM, :ARTI_COD, :BODE_COD, :CANT, :LOTE,
        :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida
    DO
    BEGIN
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo IS NULL) then
        Tipo = 0;
    if ((Tipo <> 32) and (INVFAC = 'SI')) then
        BEGIN
        if (STRLEN(NOMCLI) > 40) then
            CONC = 'FV No.' || :pref || :num || '-' || SUBSTR(NOMCLI, 1, 40);
        ELSE
            CONC = 'FV No.' || :pref || :NUM || '-' || NOMCLI;
        if (:cant <> 0)  then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(:ARTI_COD, :BODE_COD, :FEC, 31, :id,
                :CONC, :cant, 0, 'N', :lote, :Pref, :Num, :item, :Nit);
        END
    END

execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:devnof);
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
for select V.devt_id, VD.dvde_item, ARTI_COD, VD.BODE_COD, VD.dvde_cant * VD.dvde_factor, VD.dvde_lote,
    devt_fecha, pref_pre, devt_numero, terc_nit, devt_factura, devt_remid, DEVT_FACTID
    from devoluciones_ventas v, devoluciones_ventas_detalle vd where v.devt_id = vd.devt_id and v.devt_anulado = 'N'
    into :ID, :ITEM, :ARTI_COD, :BODE_COD, :CANT, :LOTE,
    :fec, :Pref, :Num, :Nit, :Factura, :idrem, :idfact
    do
    begin
    CONC = 'DEVOLUCION VENTA No.' || PREF || NUM || ' - FACTURA ' || FACTURA;
    if (devnof = 'SI') then
        OK = 'S';
    else
        BEGIN
        if (idfact <> 0) then
            begin
            SELECT SUM(FADE_CANT * FADE_FACTOR) FROM FACTURAS_DETALLE WHERE FACT_ID = :idfact AND ARTI_COD = :arti_cod
                INTO :cantdet;
            /* verifique si afecto el inventario */
            EXISTE = 'N';
            select 'S' from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :idfact and
                arti_cod = :arti_cod into :EXISTE;
            if (EXISTE = 'S') then
                OK = 'S';
            else
                BEGIN
                /* busque remisiones que pudieron afectarlo */
                /* primero posteriores a la factura */
                select sum(cofa_cantcr) from consolidado_faltantes where cofa_tipoori = 31 and cofa_idori = :idfact and cofa_tipodes = 32
                    and arti_cod = :arti_cod and cofa_cantcr <> 0 into :cantaux;
                if ((cantaux <> 0) and (cantaux is not null)) then
                    BEGIN
                    if ((cantdet - (:cant * :factor)) <> CANTAUX) then
                        OK = 'S';
                    ELSE
                        OK = 'N';
                    END
                else
                    begin
                    /* si no, anteriores a la factura */
                    select sum(cofa_cantcr) from consolidado_faltantes C, FACTURAS f where f.fact_consolida = c.cofa_id and
                        cofa_tipoori = 32 and f.fact_id = :idfact and cofa_tipodes = 31 and arti_cod = :arti_cod and
                        cofa_cantcr <> 0 into :cantaux;
                    if ((cantaux <> 0) and (cantaux is not null)) then
                        OK = 'S';
                    else
                        BEGIN
                        /* si hacen pedido automatico, puede que la remisiÃ³n este hecha con el pedido */
                        if (PEDAUTO = 'SI') then
                            BEGIN
                            SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = right(F.fact_numero,6)
                            AND F.fact_id = :idfact INTO :IDPED;
                            select sum(cofa_cantcr) from consolidado_faltantes where cofa_tipoori = 34 and cofa_idori = :idped
                            and cofa_tipodes = 32 and arti_cod = :arti_cod and cofa_cantcr <> 0 into :cantaux;
                            if ((cantaux <> 0) and (cantaux is not null)) then
                                if ((cantdet - (:cant * :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 */
            EXISTE = 'N';
            select 'S' from movimiento_articulo where mvar_tipodoc = 32 and mvar_idref = :idrem and arti_cod = :arti_cod
                into :EXISTE;
            if (EXISTE = 'S') 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(:arti_cod, :FEC) returning_values (:COSTO);
        if (COSTO = 0) then
            BEGIN
            if (id <> 0) then
                begin
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :idfact INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(: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 = :IDREM INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(: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(:ARTI_COD, :BODE_COD, :FEC, 33, :id,
            :CONC, :factor * :cant, :COSTO, 'S', :lote, :Pref, :Num, :item, :Nit);
        end
    END

end^


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

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

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

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

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

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

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

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

FOR select n.ncar_id, N.ncar_ano, NCAR_fecha, 'ABONO POR DESCUENTO NOMINA', terc_nit, ncde_abono+ncde_DTOF, ncde_rtfte, ncde_rtiva, ncde_rtica, ncde_rcree, ncde_sucursal
    from nomina_cartera_detalle ND, nomina_cartera N
    WHERE N.NCAR_id = ND.NCAR_id AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY NCAR_fecha
    INTO :IDR, :PREF, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :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 = 92 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 = 92 AND MVCL_IDREF = :IDR AND MVCL_SUCURSAL = :sucursal;
       END
    ELSE
        BEGIN
        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, 92, :idr, :FECHA, :FECHA, 'ABONO POR DESCUENTO NOMINA', :MONTO, :rtfte, :rtiva, :rtica, 'N', 'S', :PREF, :FECHA, :sucursal, :COBR, 1);
        END
    END
END^


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

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

FOR SELECT F.fapo_id, F.pref_pre, F.fapo_numero, F.fapo_fecha, F.fapo_vence, F.terc_nit, 0, 0, 0, 0, F.fapo_total, F.fapo_numero, F.taca_monto
    FROM factura_proforma F WHERE FAPO_ID <> 0 and fapo_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY FAPO_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :NUMPROV, :TRM
    DO
    BEGIN
    CONC = 'IMPORTACION No.' || :PREF || :NUMERO;
    INSERT INTO movimiento_proveedor(MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 137, :ID, :FECHA, :VENCE, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, 'S', 'N', :pref, :numero, :TRM);
    END

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

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

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

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

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

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

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


ALTER PROCEDURE CHEQUEO_PRESTAMOS (
    NIT VARCHAR(20))
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    MONTO NUMERIC(18,2),
    ANO CHAR(4),
    PERIODO INTEGER,
    SALDO NUMERIC(18,2))
AS
declare variable ABONO NUMERIC(18,2);
declare variable CONC INTEGER;
declare variable IDNOMINA INTEGER;
begin
FOR SELECT PC.prno_id, PC.prcu_item, PC.prcu_monto, PC.prcu_ano, PC.prcu_periodo
    FROM prestamo_cuotas PC, prestamo_nomina P WHERE PC.prno_id = P.prno_id AND P.terc_nit = :NIT
    ORDER BY PC.prcu_ano, PC.prcu_periodo, PC.prno_id, PC.prcu_item
    INTO :ID, :ITEM, :MONTO, :ANO, :PERIODO
    DO
    BEGIN
    UPDATE PRESTAMO_CUOTAS SET PRCU_ABONO = 0
        WHERE PRNO_ID = :ID AND PRCU_ITEM = :ITEM;
    /* RESTE LOS RECIBOS */
    FOR SELECT RP.rcpr_abono FROM recibos_prestamos RP
        WHERE RP.prno_id = :ID AND RP.prcu_item = :ITEM AND RP.rcpr_anulado = 'N'
        INTO :ABONO
        do
        BEGIN
        UPDATE PRESTAMO_CUOTAS SET PRCU_ABONO = PRCU_ABONO + :ABONO
            WHERE PRNO_ID = :ID AND PRCU_ITEM = :ITEM;
        suspend;
        END
    END
FOR SELECT NC.noco_ano, NC.noco_periodo, ABS(NC.noco_valor), NC.conc_cod, NC.nomi_id
    FROM nomina_conceptos NC, conceptos_nomina CN
    WHERE CN.conc_cod = NC.conc_cod AND NC.terc_nit = :NIT AND CN.conc_prestamo = 'S'
    INTO :ANO, :PERIODO, :MONTO, :CONC, :IDNOMINA
    DO
    BEGIN
    FOR SELECT P.prno_id, P.prcu_item, P.prcu_monto-P.prcu_abono 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 = :NIT
        and PN.conc_cod = :conc and prcu_abono < prcu_monto ORDER BY P.prno_id, P.prcu_item
        into :ID, ITEM, :saldo
        DO
        BEGIN
        if (MONTO >= SALDO) then
            BEGIN
            update PRESTAMO_CUOTAS P set PRCU_OK = 'S', PRCU_ABONO = PRCU_MONTO, PRCU_NOMIID = :idnomina
                where P.prno_id = :ID and P.prcu_item = :ITEM;
            MONTO = MONTO - SALDO;
            END
        ELSE
            BEGIN
            update PRESTAMO_CUOTAS P set PRCU_ABONO = PRCU_ABONO + :MONTO, PRCU_NOMIID = :idnomina
                where P.prno_id = :ID and P.prcu_item = :ITEM;
            MONTO = 0;
            END
        suspend;
        END
    END
end^


ALTER PROCEDURE CHEQUEO_PUNTOS_CLIENTE (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    FECINI DATE)
RETURNS (
    ID INTEGER,
    NIT VARCHAR(20),
    FECHA DATE,
    DB NUMERIC(18,2),
    CR NUMERIC(18,2),
    SALDO NUMERIC(18,2))
AS
declare variable FECAUX DATE;
declare variable NITAUX VARCHAR(20);
declare variable SALDOINI NUMERIC(18,2);
declare variable SALDOANT NUMERIC(18,2);
begin
NITAUX = '';
FOR SELECT P.ptcl_id, P.ptcl_nit, P.ptcl_fecha, P.ptcl_db, P.ptcl_cr, P.ptcl_saldo
    FROM puntos_cliente P WHERE P.ptcl_nit >= :nitini AND P.ptcl_nit <= :nitfin AND P.ptcl_fecha >= :fecini
    ORDER BY P.ptcl_nit, P.ptcl_fecha, P.ptcl_id
    INTO :ID, :NIT, :FECHA, :DB, :cr,  :SALDOINI
    DO
    BEGIN
    if (NITAUX <> NIT) then
        BEGIN
        SALDO = SALDOINI;
        SALDOANT = SALDO;
        FECAUX = FECHA;
        END
    ELSE
        BEGIN
        if (FECAUX <> FECHA) then
            begin
            SALDOANT = SALDO;
            SUSPEND;
            end
        UPDATE puntos_cliente SET PTCL_SALDO = :SALDOANT
            WHERE PTCL_ID = :ID;
        END
    NITAUX = NIT;
    FECAUX = FECHA;
    SALDO = saldo + DB - CR;
    END
end^


ALTER PROCEDURE CHEQUEO_PUNTOS_VENDEDOR (
    FECINI DATE,
    FECFIN DATE)
AS
declare variable ABONO NUMERIC(18,2);
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable FEC DATE;
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
declare variable COBR INTEGER;
declare variable COMIP VARCHAR(2);
begin
DELETE FROM puntos_vendedor WHERE PTVT_FECHA >= :FECINI AND PTVT_FECHA <= :FECFIN;

FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_ABONO, d.rcde_cobr, RCDE_COMIP, RECA_FECHA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D WHERE R.reca_id = D.reca_id AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN
    ORDER BY RECA_FECHA, R.RECA_ID
    INTO :TIPO, :IDDOC, :ABONO, :COBR, :COMIP, :FEC
    DO
    BEGIN
    SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = :comip INTO :FACTOR;
    if ((:tipo = 31) or (tipo = 41)) then
        begin
        if (TIPO = 31) then
            select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = :iddoc into :factord;
        if (:tipo = 41) then
            select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = :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, :tipo, :iddoc, (:abono*:factord*:factor), 0);
        end
    if ((tipo = 33) or (tipo = 42)) then
        begin
        if (tipo = 33) then
            select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = :iddoc into :factord;
        if (:tipo = 42) then
            select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = :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, :tipo, :iddoc, 0, (:abono*:factord*:factor));
        end
    end
FOR SELECT PTVR_ID, PTVR_FECHA, PTVR_PUNTOS, PTVR_VEND FROM puntos_vend_redencion
    WHERE PTVR_FECHA >= :FECINI AND PTVR_FECHA <= :FECFIN AND PTVR_ANULADO = 'N'
    INTO :iddoc, :fec, :abono, :cobr
    DO
    BEGIN
    insert into puntos_vendedor (vend_cod, ptvt_fecha, ptvt_tipodoc, ptvt_iddoc, ptvt_db, ptvt_cr)
        values (:cobr, :fec, 81, :iddoc, 0, :abono);
    END
end^


ALTER PROCEDURE CHEQUEO_SALDOS_BANCOS
AS
declare variable CUENTA INTEGER;
declare variable FECHA DATE;
declare variable TOTAL NUMERIC(18,2);
declare variable DB CHAR(1);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable OK CHAR(1);
BEGIN
DELETE FROM saldo_bancos;
DELETE FROM saldo_bancos_conf;

FOR SELECT CUBA_COD, moba_fecha, moba_total, moba_db, moba_tipodoc, moba_idref
    FROM movimiento_banco
    ORDER BY CUBA_COD, MOBA_FECHA, MOBA_ID
    INTO :CUENTA, :FECHA, :TOTAL, :DB, :TIPO, :ID
    DO
    if (:DB = 'S') then
        begin
        execute procedure sume_saldo_banco(CUENTA, FECHA, TOTAL, 'N');
        if (TIPO <> 72) then
            OK = 'S';
        ELSE
            SELECT CH.cheq_confirma FROM cheques CH WHERE CH.cheq_id = :ID INTO :OK;
        if (OK = 'S') then
            execute procedure sume_saldo_banco_conf(cuenta, fecha, total, 'N');
        end
    else
        begin
        execute procedure reste_saldo_banco(CUENTA, FECHA, TOTAL, 'N');
        if (TIPO <> 72) then
            OK = 'S';
        ELSE
            SELECT CH.cheq_confirma FROM cheques CH WHERE CH.cheq_id = :ID INTO :OK;
        if (OK = 'S') then
            execute procedure reste_saldo_banco_conf(cuenta, fecha, total, 'N');
        end
END^


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

/* 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 AND R.reca_fecha >= :FECINI
    ORDER BY CAJA_ID, R.RECA_FECHA, R.RECA_ID, RCPA_ITEM
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 61 and moca_idref = :id)) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 61 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        if (FORMA <> 1) then
            INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
                VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 61, :ID, 0, 0);
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, :MONTO, 'N');
    END

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

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

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

/* las planillas de pasajeros   */
FOR SELECT PLPA_ID, PLPA_fecha, PLPA_pref, PLPA_numero, PLPA_caja, PLPA_NETO
    from planilla_pasajeros where plpa_anulado = 'N' and plpa_neto > 0 AND PLPA_FECHA >= :FECINI
    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  AND EGRE_FECHA >= :FECINI
    ORDER BY CAJA_ID, E.EGRE_FECHA, E.EGRE_ID, EGCA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja)) then
        update movimiento_caja
        set moca_creditos = moca_creditos + :monto
        where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :caja, 62, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        begin
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY dpca_id INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 62, DPCA_IDSAL = :ID
                WHERE DPCA_ID = :IDD;
        else
            begin
/*            update egresos_caja set fopa_id = 1 where egre_id = :id and EGCA_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            end
        end
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

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

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

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

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


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);
BEGIN
/* BORRE LOS DB Y CR EN CERO */
UPDATE COMPROBANTE_DETALLE D SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL AND EXISTS (SELECT * FROM COMPROBANTE_ENCABEZADO C WHERE D.enco_consec = C.enco_consec AND C.enco_fecha >= :fecini);
UPDATE COMPROBANTE_DETALLE D SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL AND EXISTS (SELECT * FROM COMPROBANTE_ENCABEZADO C WHERE D.enco_consec = C.enco_consec AND C.enco_fecha >= :fecini);
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 */
        if (not EXISTS (SELECT CUEN_COD FROM SALDOS_CUENTAS WHERE CUEN_COD = :CUENTA AND SACU_FECHA = :INICIAL)) then
            BEGIN
            INSERT INTO SALDOS_CUENTAS(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                VALUES (:CUENTA, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
            END
        ELSE
            BEGIN
            UPDATE SALDOS_CUENTAS
                SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                WHERE (CUEN_COD = :CUENTA) AND (SACU_FECHA = :INICIAL);
            END
    
        /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
        if (not EXISTS (SELECT CUEN_COD FROM SALDOS_TERCEROS WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND SACU_FECHA = :INICIAL)) 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 */
        if (not EXISTS (SELECT 'S' FROM SALDOS_CENTROS WHERE CUEN_COD = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND SACU_FECHA = :INICIAL)) 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 */
        if (not EXISTS (SELECT CUEN_COD FROM SALDOS_CENTROS_TERCERO
            WHERE CUEN_COD = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND TERC_NIT = :NIT AND SACU_FECHA = :INICIAL)) 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
            if (not EXISTS (SELECT CUEN_COD FROM SALDOS_ARTICULO WHERE CUEN_COD = :CUENTA AND ARTI_COD = :ARTIC AND SAAR_FECHA = :INICIAL)) 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
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 143, 1, 'I', :fecini);
EXIT;
END^


ALTER PROCEDURE CHEQUEO_SALDOS_CONTA_NIIF (
    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 TIPO CHAR(1);
BEGIN
/* BORRE LOS DB Y CR EN CERO */
UPDATE comprobante_detalle_niif SET CODE_DEBITO = 0 WHERE CODE_DEBITO IS NULL;
UPDATE comprobante_detalle_niif SET CODE_CREDITO = 0 WHERE CODE_CREDITO IS NULL;
DELETE FROM saldos_centros_tercero_niif WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_centros_niif WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_terceros_niif WHERE SACU_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_articulo_niif WHERE SAAR_FECHA >= :FECINI AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN;
DELETE FROM saldos_cuentas_niif 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 NIIF') RETURNING_VALUES (ANO);
MES = 1;
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, 1) returning_values (INICIAL);
if (FECINI <= INICIAL) then
    BEGIN
    if (EXISTS (SELECT APND_ITEM FROM APERTURA_NIIF_DET WHERE APND_CTANIIF <> '' AND ((APND_DEBITO <> 0) or (APND_CREDITO <> 0) or (APND_RECLDB <> 0) or (APND_RECLCR <> 0)))) then
        EXECUTE PROCEDURE recalcula_apertura_niif;
    else
        FOR SELECT CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, SAIN_DEBITO, SAIN_CREDITO
            FROM saldos_iniciales_niif 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 */
            if (not EXISTS (SELECT CUEN_COD FROM saldos_cuentas_niif WHERE CUEN_COD = :CUENTA AND SACU_FECHA = :INICIAL)) then
                BEGIN
                INSERT INTO saldos_cuentas_niif(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
                    VALUES (:CUENTA, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE saldos_cuentas_niif
                    SET SACU_SALDO = SACU_SALDO + :DEBITOS - :CREDITOS
                    WHERE (CUEN_COD = :CUENTA) AND (SACU_FECHA = :INICIAL);
                END
        
            /* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
            if (not EXISTS (SELECT CUEN_COD FROM saldos_terceros_niif WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND SACU_FECHA = :INICIAL)) then
                BEGIN
                INSERT INTO saldos_terceros_niif(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_niif
                    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 */
            if (not EXISTS (SELECT 'S' FROM saldos_centros_niif WHERE CUEN_COD = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND SACU_FECHA = :INICIAL)) then
                BEGIN
                INSERT INTO saldos_centros_niif(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_niif
                    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 */
            if (not EXISTS (SELECT CUEN_COD FROM saldos_centros_tercero_niif
                WHERE CUEN_COD = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND TERC_NIT = :NIT AND SACU_FECHA = :INICIAL)) then
                BEGIN
                INSERT INTO saldos_centros_tercero_niif(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
                    VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :INICIAL, :DEBITOS-:CREDITOS, 0, 0);
                END
            ELSE
                BEGIN
                UPDATE saldos_centros_tercero_niif
                    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
                SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :cuenta INTO :TIPO;
                if (TIPO = 'I') then
                    BEGIN
                    if (not EXISTS (SELECT CUEN_COD FROM saldos_articulo_niif WHERE CUEN_COD = :CUENTA AND ARTI_COD = :ARTIC AND SAAR_FECHA = :INICIAL)) then
                        BEGIN
                        INSERT INTO saldos_articulo_niif(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_niif
                            SET SAAR_SALDO = SAAR_SALDO + :DEBITOS - :CREDITOS
                            WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTIC) AND (SAAR_FECHA = :INICIAL);
                        END
                    END
                else if (TIPO = 'A') then
                    BEGIN
                    IF (NOT EXISTS (SELECT CUEN_COD FROM saldos_activo_niif WHERE (CUEN_COD = :cuenta) AND (ACFJ_COD = :artic) AND (SAAC_FECHA = :INICIAL))) THEN
                        BEGIN
                        INSERT INTO saldos_activo_niif(CUEN_COD, ACFJ_COD, SAAC_FECHA, SAAC_SALDO, SAAC_DEBITOS, SAAC_CREDITOS)
                            VALUES (:cuenta, :artic, :INICIAL, :debitos-:creditos, 0, 0);
                        END
                    ELSE
                        BEGIN
                        UPDATE saldos_activo_niif
                          SET SAAC_SALDO = SAAC_SALDO + :debitos - :creditos
                        WHERE (CUEN_COD = :cuenta) AND (ACFJ_COD = :artic) AND (SAAC_FECHA = :INICIAL);
                        END
                    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_niif 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_niif(:CUENTA, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE actualice_saldo_tercero_niif(:CUENTA, :NIT, FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE actualice_saldo_centro_niif(:CUENTA, :PROY, :CENTRO, :FECHA, :DEBITOS, :CREDITOS);
    EXECUTE PROCEDURE actualice_saldo_cent_terc_niif(:CUENTA, :PROY, :CENTRO, :NIT, FECHA, :DEBITOS, :CREDITOS);
    IF (ARTIC IS NOT NULL) THEN
        BEGIN
        SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :cuenta INTO :TIPO;
        if (TIPO = 'I') then
            EXECUTE PROCEDURE actualice_saldo_articulo_niif(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
        else if (TIPO = 'A') then
            EXECUTE PROCEDURE actualice_saldo_activo_niif(:CUENTA, :ARTIC, :FECHA, :DEBITOS, :CREDITOS);
        END
    END
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 142, 1, 'I', :fecini);
EXIT;
END^


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(8))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable RCREE NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable 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_RTCREEM, 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, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (31, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, :RCREE, 0, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDCL_ID, NDCL_FECHA, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, NDCL_RTCREEM, 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, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (41, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, :RCREE, 0, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT tido_cod, cgrm_id, cgrm_fecha, cgrm_nit, 0, 0, 0, cgrm_total
    FROM carga_remesa WHERE CGRM_ID <> 0 and CGRM_anulado = 'N'  AND CGRM_NIT >= :CLIINI AND CGRM_NIT <= :CLIFIN
    ORDER BY CGRM_FECHA
    INTO :TIPO, :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 (:tipo, :id, :fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', :MONTO, 0);

FOR SELECT tiqp_id, tiqp_fecha, tiqp_nit, 0, 0, 0, tiqp_total
    FROM tiquete_pasajero WHERE TIQP_ID <> 0 and TIQP_anulado = 'N'  AND TIQP_NIT >= :CLIINI AND TIQP_NIT <= :CLIFIN
    ORDER BY TIQP_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 (86, :id, :fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', :MONTO, 0);

FOR SELECT manc_id, manc_fecha, TERC_NIT, 0, 0, 0, ABS(manc_apagar)
    FROM manifiesto_carga m, vehiculos v WHERE v.vehi_cod = m.manc_vehiculo AND MANC_ID <> 0 and MANC_anulado = 'N'  AND TERC_NIT >= :CLIINI AND TERC_NIT <= :CLIFIN
    ORDER BY MANC_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 (89, :id, :fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', :MONTO, 0);

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_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (77, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, 0, 0, 0, 0, 0, 'S', :MONTO, 1);

FOR SELECT DEVT_ID, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, DEVT_RTCREEM, 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, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (33, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCCL_ID, NCCL_FECHA, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, nccl_rtcreem, 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, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (42, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANCL_ID, ANCL_FECHA, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_rtcreem, 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, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
        VALUES (45, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 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, acde_rcree, 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, :rcree, :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_ABRCREE = SDCA_ABRCREE + :RCREE,
                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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :rcree, '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, RCDE_RCREE, RECA_TRM
    FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
    WHERE R.RECA_ID = D.RECA_id 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, :RCREE, :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_ABRCREE = SDCA_ABRCREE + :RCREE,
                    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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, '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, EGCC_RCREE, 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, :RCREE, :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_ABRCREE = SDCA_ABRCREE + :RCREE,
            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_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, 'N', 0, :TRM);
        END
    END

for select ancl_id, ancl_base+ancl_ivamonto, PREF_PRE, ANCL_NUMERO, ANCL_TRM from anticipos_cliente A
    where ANCL_ANULADO = 'N' and not EXISTS (select reca_id from recibos_caja where RECA_ID = A.reca_id AND 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
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 145, 1, 'I', :cliini);
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 145, 1, 'U', :clifin);

END^


ALTER PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR (
    PRVINI VARCHAR(20),
    PRVFIN VARCHAR(20))
RETURNS (
    ERROR VARCHAR(60),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
AS
declare variable FECHA DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable RCREE NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable EGREID INTEGER;
declare variable TRM NUMERIC(18, 2);
declare variable INGPAS INTEGER;
declare variable CANT INTEGER;
declare variable IDT INTEGER;
BEGIN
DELETE FROM anticipos_proveedor WHERE EGRE_ID = 0 AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;
DELETE FROM saldos_doc_cxpagar WHERE TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;

FOR SELECT FACO_ID, FACO_FECHA, TERC_NIT, FACO_RTFTEMONTO, FACO_rtivamonto, FACO_rticamonto, FACO_RTCREEM, FACO_TOTAL, FACO_TRM
    FROM FACTURAS_COMPRA WHERE FACO_ID <> 0 and faco_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY FACO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (21, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, :RCREE, 0, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT FAPO_ID, FAPO_FECHA, TERC_NIT, 0, 0, 0, 0, FAPO_TOTAL, TACA_MONTO
    FROM factura_proforma f WHERE FAPO_ID <> 0 and fapo_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY FAPO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (137, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, :rcree, 0, 0, 0, 0, 0, 'S', :MONTO, :TRM);

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

FOR SELECT DVCO_ID, DVCO_FECHA, TERC_NIT, DVCO_RTFTEMONTO, DVCO_rtivamonto, DVCO_rticamonto, DVCO_rtCREEM, dvco_total, DVCO_TRM
    FROM devoluciones_compras WHERE DVCO_ID <> 0 and DVCO_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY DVCO_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (24, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCPR_ID, NCPR_FECHA, TERC_NIT, NCPR_RTFTEMONTO, NCPR_rtivamonto, NCPR_rticamonto, ncpr_rtcreem, ncpr_monto+ncpr_ivamonto, NCPR_TRM
    FROM notas_credito_proveedor WHERE NCPR_ID <> 0 and NCPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NCPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANPR_ID, ANPR_FECHA, TERC_NIT, ANPR_RTFTEMONTO, ANPR_rtivamonto, ANPR_rticamonto, ANPR_RTCREEM, anpr_base+anpr_ivamonto, ANPR_TRM
    FROM anticipos_proveedor WHERE ANPR_ID <> 0 and ANPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY ANPR_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (55, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

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

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

FOR SELECT APPD_TIPODOC, APPD_IDDOC, APPR_FECHA, TERC_NIT, APPD_APLICADO-APPD_DIFCAMBIO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPD_RCREE, APPR_TRM
    FROM APLICACION_PROVEEDOR_DETALLE D, aplicacion_provedor A
    WHERE A.APPR_ID = D.appr_id AND A.APPR_ID <> 0 AND APPR_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY APPR_FECHA
    INTO :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                SDCP_ABRCREE = SDCP_ABRCREE + :RCREE,
                SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, 'N', 0, :TRM);
        END
    END

FOR SELECT E.EGRE_ID, EGDE_TIPODOC, EGDE_IDDOC, EGRE_FECHA, TERC_NIT, EGDE_ABONO+EGDE_DTOF-EGDE_DIFCAMBIO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_RCREE, EGRE_TRM
    FROM EGRESOS_DETALLE D, EGRESOS E
    WHERE E.EGRE_ID = D.EGRE_ID AND E.EGRE_ID <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 55) then
        BEGIN
        SELECT EGRE_ID FROM anticipos_proveedor WHERE ANPR_ID = :ID INTO :EGREID;
        if (EGREID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                    SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                    SDCP_ABRCREE = SDCP_ABRCREE + :RCREE,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
            END
        ELSE
            BEGIN
            /* Inserte un nuevo saldo diario */
            INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, 'N', 0, :TRM);
            END
        END
    END

FOR SELECT R.reca_id, D.rccr_tipodoc, D.rccr_iddoc, RECA_FECHA, TERC_NIT, D.rccr_abono+D.rccr_dtof-rccr_difcambio, D.rccr_rtfte, D.rccr_rtiva, D.rccr_rtica, D.rccr_rcree, RECA_TRM
    FROM recibos_caja_crucec D, recibos_caja R
    WHERE R.reca_id = D.reca_id AND R.reca_id <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
            SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
            SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
            SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
            SDCP_ABRCREE = SDCP_ABRCREE + :RCREE,
            SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, 'N', 0, :TRM);
        END
    END

for select anpr_id, anpr_base+anpr_ivamonto, PREF_PRE, ANPR_NUMERO, ANPR_TRM from anticipos_proveedor
    where anpr_anulado = 'N' and egre_id not in (select egre_id from egresos where egre_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO, :TRM
    do
    begin
    FECHA = cast('now' as date);
    execute procedure saldo_doc_cxpagar(55, :id, :FECHA, 0) 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^


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


ALTER PROCEDURE CHEQUES_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT CHEQ_ID, CUBA_COD, PRBA_PREF, CHEQ_NUMERO FROM CHEQUES
    WHERE CHEQ_ANULADO = 'N' AND CHEQ_FECHA >= :FECINI AND CHEQ_FECHA <= :FECFIN
    ORDER BY CHEQ_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 72 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 72 AND CUBA_COD = :CTA INTO :IDI;
  if (IDI is NOT NULL) then
      BEGIN
      EXECUTE PROCEDURE CONTABIL_CHEQUE (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
      if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
      ELSE
        ESTADO = 'ERROR';
      suspend;
      END
  end
  END
END^


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 ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
    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 ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
    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 ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
    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 ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
    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 ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
    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 */
/* EGRESOS PROVEEDORES */
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' and
    exists (select egre_id from egresos_detalle where egre_id = e.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^


ALTER PROCEDURE CIERRE_FACTURACION (
    FECHA DATE,
    PUNTO INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PREF VARCHAR(4),
    AUTORIZA VARCHAR(20),
    PUNTOVTA VARCHAR(60),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    NROFAC INTEGER,
    HORAINI TIME,
    HORAFIN TIME,
    BASEFAC NUMERIC(18,2),
    IVAFAC NUMERIC(18,2),
    BASEINALCF NUMERIC(18,2),
    CONSUMOF NUMERIC(18,2),
    INALCF NUMERIC(18,2),
    DEC2799F NUMERIC(18,2),
    EXTRAF NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    NROITE INTEGER,
    NRODEV INTEGER,
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    BASEINALCD NUMERIC(18,2),
    CONSUMOD NUMERIC(18,2),
    INALCD NUMERIC(18,2),
    DEC2799D NUMERIC(18,2),
    EXTRAD NUMERIC(18,2),
    TOTALDEV NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    EGRESOS NUMERIC(18,2),
    BASENETO NUMERIC(18,2),
    IVANETO NUMERIC(18,2),
    CONSUMON NUMERIC(18,2),
    BASEINALCN NUMERIC(18,2),
    INALCN 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),
    BASEF5 NUMERIC(18,2),
    IVAF5 NUMERIC(18,2),
    DEC2799F5 NUMERIC(18,2),
    TOTALF5 NUMERIC(18,2),
    BASED5 NUMERIC(18,2),
    IVAD5 NUMERIC(18,2),
    DEC2799D5 NUMERIC(18,2),
    TOTALD5 NUMERIC(18,2),
    BASEF6 NUMERIC(18,2),
    IVAF6 NUMERIC(18,2),
    DEC2799F6 NUMERIC(18,2),
    TOTALF6 NUMERIC(18,2),
    BASED6 NUMERIC(18,2),
    IVAD6 NUMERIC(18,2),
    DEC2799D6 NUMERIC(18,2),
    TOTALD6 NUMERIC(18,2),
    BASEF7 NUMERIC(18,2),
    IVAF7 NUMERIC(18,2),
    DEC2799F7 NUMERIC(18,2),
    TOTALF7 NUMERIC(18,2),
    BASED7 NUMERIC(18,2),
    IVAD7 NUMERIC(18,2),
    DEC2799D7 NUMERIC(18,2),
    TOTALD7 NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    FORMAP6 NUMERIC(18,2),
    FORMAP7 NUMERIC(18,2),
    FORMAP8 NUMERIC(18,2),
    FORMAP9 NUMERIC(18,2),
    FORMAP10 NUMERIC(18,2),
    FORMAP11 NUMERIC(18,2),
    FORMAP12 NUMERIC(18,2),
    FORMAP13 NUMERIC(18,2),
    FORMAP14 NUMERIC(18,2),
    FORMAP15 NUMERIC(18,2),
    FORMAPE1 NUMERIC(18,2),
    FORMAPE2 NUMERIC(18,2),
    FORMAPE3 NUMERIC(18,2),
    FORMAPE4 NUMERIC(18,2),
    FORMAPE5 NUMERIC(18,2),
    FORMAPE6 NUMERIC(18,2),
    FORMAPE7 NUMERIC(18,2),
    FORMAPE8 NUMERIC(18,2),
    FORMAPE9 NUMERIC(18,2),
    FORMAPE10 NUMERIC(18,2),
    FORMAPE11 NUMERIC(18,2),
    FORMAPE12 NUMERIC(18,2),
    FORMAPE13 NUMERIC(18,2),
    FORMAPE14 NUMERIC(18,2),
    FORMAPE15 NUMERIC(18,2),
    CANTFP1 INTEGER,
    CANTFP2 INTEGER,
    CANTFP3 INTEGER,
    CANTFP4 INTEGER,
    CANTFP5 INTEGER,
    CANTFP6 INTEGER,
    CANTFP7 INTEGER,
    CANTFP8 INTEGER,
    CANTFP9 INTEGER,
    CANTFP10 INTEGER,
    CANTFP11 INTEGER,
    CANTFP12 INTEGER,
    CANTFP13 INTEGER,
    CANTFP14 INTEGER,
    CANTFP15 INTEGER,
    CARTERA NUMERIC(18,2),
    RETES NUMERIC(18,2),
    VENDEDOR1 VARCHAR(60),
    VTAVEND1 NUMERIC(18,2),
    VENDEDOR2 VARCHAR(60),
    VTAVEND2 NUMERIC(18,2),
    VENDEDOR3 VARCHAR(60),
    VTAVEND3 NUMERIC(18,2),
    VENDEDOR4 VARCHAR(60),
    VTAVEND4 NUMERIC(18,2),
    VENDEDOR5 VARCHAR(60),
    VTAVEND5 NUMERIC(18,2),
    NROFACTANUL INTEGER,
    IVANUL NUMERIC(18,2),
    TOTALFACANUL NUMERIC(18,2),
    SALDOCAJA NUMERIC(18,2),
    ARQUEO NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    SOBRANTE 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 CONSD numeric(18,2);
declare variable basedv numeric(18,2);
declare variable ivad numeric(18,2);
declare variable inalc numeric(18,2);
declare variable baseinaldv numeric(18,2);
declare variable dec2799ad numeric(18,2);
declare variable totald numeric(18,2);
declare variable i integer;
declare variable codven integer;
declare variable vended varchar(60);
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
declare variable idarq integer;
declare variable arqobl char(2);
declare variable caja integer;
declare variable devite varchar(2);
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT MAX(PREF_PRE), MAX(AUTO_NUMERO) FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO and AUTO_FECHA <= :fecha AND AUTO_VENCE >= :FECHA
      INTO :PREF, :autoriza;
if (PUNTO <> 0) then
    SELECT PTVT_NOM, CAJA_ID FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta, :CAJA;
ELSE
    EXECUTE PROCEDURE lee_configuracion('GENERAL', 'GENERAL', 'NOMBRE COMPAÑIA') returning_values (:puntovta);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'POS', 'DETALLAR DEVOLUCIONES DE ITEMS DENTRO DE LA FACTURA COMO DEVOUCIONES EN CIERRE DIARIO') returning_values (:DEVITE);
/* 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), SUM(FACT_EXTRA)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0)) AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO, :dec2799f, :EXTRAF;
if (dec2799f is null) then
    dec2799f = 0;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_COD = :PREFIJO || :NUMINI AND AUDI_OPER = 'I' INTO :HORAINI;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_COD = :PREFIJO || :NUMFIN AND AUDI_OPER = 'I' INTO :HORAFIN;
if (DEVITE = 'SI') then
    BEGIN
    SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM(FADE_INALCM), SUM(FADE_TOTAL*fact_factor), SUM(fade_consumo)
        FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0)) 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, :INALCF, :TOTALFAC, :CONSUMOF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM)
        FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0)) AND
        ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
        AND FADE_INALCM <> 0 INTO :BASEINALCF;
    SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO+FADE_INALCM-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_INALCM*-1), SUM(FADE_TOTAL*FACT_FACTOR*-1), SUM(FADE_CONSUMO)
        FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0)) 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, :INALCD, :TOTALDEV, :CONSUMOD;
    SELECT SUM(FADE_IVAMONTO+FADE_INALCM-FADE_TOTAL)
        FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0)) AND
        ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
        AND FADE_INALCM <> 0 INTO :BASEINALCD;
    END
else
    BEGIN
    NRODEV = 0;
    BASEDEV = 0;
    IVADEV = 0;
    TOTALDEV = 0;
    SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM(FADE_INALCM), SUM(FADE_TOTAL*fact_factor), SUM(fade_consumo)
        FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0)) AND
        ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
        INTO :nroite, :BASEFAC, :IVAFAC, :INALCF, :TOTALFAC, :CONSUMOF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM)
        FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0)) AND
        ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
        AND FADE_INALCM <> 0 INTO :BASEINALCF;
    END
if (BASEINALCF is null) then
    BASEINALCF = 0;
if (BASEINALCD is null) then
    BASEINALCD = 0;
totalfac = totalfac - dec2799f + EXTRAF;
SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_INACM), SUM(DVDE_TOTAL*DEVT_FACTOR), SUM(DVDE_CONSUMO)
    FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0)) AND DEVT_ANULADO = 'N'
    and substring(d.arti_cod from 1 FOR 2) <> '.t' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
    INTO :I, :BASEDV, :IVAD, :INALC, :TOTALD, :CONSD;
SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_INACM)
    FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0)) AND DEVT_ANULADO = 'N'
    and substring(d.arti_cod from 1 FOR 2) <> '.t' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
    AND DVDE_INACM <> 0 INTO :BASEINALDV;
if (BASEINALDV is null) then
    BASEINALDV = 0;
CONSUMOD = CONSUMOD + CONSD;
BASEINALCD = BASEINALCD + BASEINALDV;
BASEINALCN = BASEINALCF + BASEINALCD;
select sum(devt_dec2799), SUM(DEVT_EXTRA) FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0))
    AND ((:prefijo = '') or (PREF_PRE = :prefijo))AND DEVT_ANULADO = 'N' into :dec2799d, :EXTRAD;
if (dec2799d is null) then
    dec2799d = 0;
totald = totald - dec2799d + EXTRAD;
/*  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) or (:PUNTO = 0)) 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 (consumof is null) then
    consumof = 0;
if (inalcf is null) then
    inalcf = 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 (consumod is null) then
    consumod = 0;
if (inalcd is null) then
    inalcd = 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 (inalc is null) then
    inalc = 0;
if (totald is null) then
    totald = 0;
NRODEV = NRODEV + I;
BASENETO = BASENETO - BASEDV;
IVANETO = IVANETO - IVAD - INALC;
TOTALNETO = TOTALNETO - TOTALD;

BASEDEV = BASEDEV + BASEDV;
IVADEV = IVADEV + IVAD;
consumon = consumof - consumod;
INALCD = INALCD + INALC;
INALCN = INALCF - INALCD;
TOTALDEV = TOTALDEV + TOTALD;
SELECT SUM(D.trcd_monto) FROM traslados_caja T, traslados_caja_det D, punto_venta PT
    WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha = :fecha AND PT.caja_id = T.caja_id AND PT.ptvt_id = :punto
    AND T.trcj_anulado = 'N'
    INTO :traslado;
if (TRASLADO IS NULL) then
    TRASLADO = 0;
SELECT SUM(EC.egca_monto) FROM egresos_caja EC, egresos E, punto_venta PT
    WHERE E.egre_id = EC.egre_id AND E.egre_fecha = :fecha AND PT.caja_id = EC.caja_id AND PT.ptvt_id = :punto AND E.egre_anulado = 'N'
    INTO :egresos;
if (EGRESOS IS NULL) then
    EGRESOS = 0;

/* 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;
BASEF5 = 0;
BASED5 = 0;
IVAF5 = 0;
IVAD5 = 0;
DEC2799F5 = 0;
DEC2799D5 = 0;
TOTALF5 = 0;
TOTALD5 = 0;
BASEF6 = 0;
BASED6 = 0;
IVAF6 = 0;
IVAD6 = 0;
DEC2799F6 = 0;
DEC2799D6 = 0;
TOTALF6 = 0;
TOTALD6 = 0;
BASEF7 = 0;
BASED7 = 0;
IVAF7 = 0;
IVAD7 = 0;
DEC2799F7 = 0;
DEC2799D7 = 0;
TOTALF7 = 0;
TOTALD7 = 0;
vtavend1 = 0;
vtavend2 = 0;
vtavend3 = 0;
vtavend4 = 0;
vtavend5 = 0;
FOR SELECT TAIV_COD FROM TARIFA_IVA ORDER BY TAIV_COD 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) or (:PUNTO = 0)) AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_TIVA = :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) or (:PUNTO = 0)) AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_TIVA = :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) or (:PUNTO = 0)) AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_TIVA = :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) or (:PUNTO = 0)) AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_TIVA = :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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
            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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo)) 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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
            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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo)) 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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
            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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo)) 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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
            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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo)) 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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
            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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo)) 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
    if (I = 6) then
        BEGIN
        BASEF5 = BASEF;
        BASED5 = :BASEDV;
        IVAF5 = IVAF;
        IVAD5 = IVAD;
        DEC2799F5 = DEC2799AF;
        DEC2799D5 = DEC2799AD;
        TOTALF5 = TOTALF;
        TOTALD5 = 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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
            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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo)) 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;
        DEC2799D5 = DEC2799D5 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED5 = BASED5 - BASEDV;
        IVAD5 = IVAD5 - IVAD;
        TOTALD5 = TOTALD5 - TOTALD;
        END
    if (I = 7) then
        BEGIN
        BASEF6 = BASEF;
        BASED6 = :BASEDV;
        IVAF6 = IVAF;
        IVAD6 = IVAD;
        DEC2799F6 = DEC2799AF;
        DEC2799D6 = DEC2799AD;
        TOTALF6 = TOTALF;
        TOTALD6 = 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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
            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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo)) 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;
        DEC2799D6 = DEC2799D6 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED6 = BASED6 - BASEDV;
        IVAD6 = IVAD6 - IVAD;
        TOTALD6 = TOTALD6 - TOTALD;
        END
    if (I = 8) then
        BEGIN
        BASEF7 = BASEF;
        BASED7 = :BASEDV;
        IVAF7 = IVAF;
        IVAD7 = IVAD;
        DEC2799F7 = DEC2799AF;
        DEC2799D7 = DEC2799AD;
        TOTALF7 = TOTALF;
        TOTALD7 = 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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
            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) or (:PUNTO = 0)) AND DVDE_TIVA = :TARIFA
            and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo)) 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;
        DEC2799D7 = DEC2799D7 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED7 = BASED7 - BASEDV;
        IVAD7 = IVAD7 - IVAD;
        TOTALD7 = TOTALD7 - TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 1) returning_values (CANTFP1, FORMAP1, FORMAPE1);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 2) returning_values (CANTFP2, FORMAP2, FORMAPE2);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 3) returning_values (CANTFP3, FORMAP3, FORMAPE3);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 4) returning_values (CANTFP4, FORMAP4, FORMAPE4);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 5) returning_values (CANTFP5, FORMAP5, FORMAPE5);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 6) returning_values (CANTFP6, FORMAP6, FORMAPE6);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 7) returning_values (CANTFP7, FORMAP7, FORMAPE7);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 8) returning_values (CANTFP8, FORMAP8, FORMAPE8);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 9) returning_values (CANTFP9, FORMAP9, FORMAPE9);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 10) returning_values (CANTFP10, FORMAP10, FORMAPE10);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 11) returning_values (CANTFP11, FORMAP11, FORMAPE11);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 12) returning_values (CANTFP12, FORMAP12, FORMAPE12);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 13) returning_values (CANTFP13, FORMAP13, FORMAPE13);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 14) returning_values (CANTFP14, FORMAP14, FORMAPE14);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 15) returning_values (CANTFP15, FORMAP15, FORMAPE15);
  cartera = 0;
  for SELECT FACT_ID FROM FACTURAS WHERE FACT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0)) AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    into :f_id
    do
    begin
    EXECUTE procedure saldo_doc_cartera(31, :f_id, :fecha,  0) returning_values (f_total);
    CARTERA = :cartera + :F_TOTAL;
    end
  for SELECT DEVT_ID FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND ((PTVT_ID = :PUNTO) or (:PUNTO = 0))
      and DEVT_ANULADO = 'N' AND ((:prefijo = '') or (PREF_PRE = :prefijo))
    into :f_id
    do
    begin
    EXECUTE procedure saldo_doc_cartera(33, :f_id, :FECHA, 0) returning_values (f_total);
    CARTERA = :cartera - :F_TOTAL;
    end
  /* LAS RETENCIONES */
  SELECT SUM(RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA) FROM recibos_caja_detalle D, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = D.RECA_ID AND ((PT.PTVT_ID = :PUNTO) or (:PUNTO = 0)) AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND RECA_ANULADO = 'N'
    INTO :RETES;
  if (RETES IS NULL) then
    RETES = 0;

  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND ((F.PTVT_ID = :PUNTO) or (:PUNTO = 0)) 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) or (:PUNTO = 0)) and DEVT_ANULADO = 'N' 
        AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
        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 + BASEF5 + basef6 + BASEF7;
    IVAFAC = IVAF0 + IVAF1 + IVAF2 + IVAF3 + IVAF4 + IVAF5 + IVAF6 + IVAF7;
    TOTALFAC = totalf0 + TOTALF1 + TOTALF2 + TOTALF3 + TOTALF4 + TOTALF5 + totalf6 + TOTALF7;
    BASEDEV = totald0 + TOTALD1 + TOTALD2 + TOTALD3 + TOTALD4 + TOTALD5 + totald6 + TOTALD7;
    IVADEV = IVAD0 + IVAD1 + IVAD2 + IVAD3 + IVAD4 + IVAD5 + IVAD6 + IVAD7;
    TOTALDEV = totald0 + TOTALD1 + totald2 + totald3 + totald4 + totald5 + totald6 + totald7;
    BASENETO = basefac + basedev;
    IVANETO = ivafac + ivadev;
    if (totalneto <> 0) Then
        begin
        formap1 = formap1 * (totalfac + totaldev) / totalneto;
        formap2 = formap2 * (totalfac + totaldev) / totalneto;
        formap3 = formap3 * (totalfac + totaldev) / totalneto;
        formap4 = formap4 * (totalfac + totaldev) / totalneto;
        formap5 = formap5 * (totalfac + totaldev) / totalneto;
        formap6 = formap6 * (totalfac + totaldev) / totalneto;
        formap7 = formap7 * (totalfac + totaldev) / totalneto;
        formap8 = formap8 * (totalfac + totaldev) / totalneto;
        formap9 = formap9 * (totalfac + totaldev) / totalneto;
        formap10 = formap10 * (totalfac + totaldev) / totalneto;
        formap11 = formap11 * (totalfac + totaldev) / totalneto;
        formap12 = formap12 * (totalfac + totaldev) / totalneto;
        formap13 = formap13 * (totalfac + totaldev) / totalneto;
        formap14 = formap14 * (totalfac + totaldev) / totalneto;
        formap15 = formap15 * (totalfac + totaldev) / totalneto;
        vtavend1 = vtavend1 * (totalfac + totaldev) / totalneto;
        vtavend2 = vtavend2 * (totalfac + totaldev) / totalneto;
        vtavend3 = vtavend3 * (totalfac + totaldev) / totalneto;
        vtavend4 = vtavend4 * (totalfac + totaldev) / totalneto;
        vtavend5 = vtavend5 * (totalfac + totaldev) / totalneto;
        end
    TOTALNETO = totalfac + totaldev;
    END
  EXECUTE PROCEDURE saldo_en_caja(:CAJA, :FECHA+1) returning_values (:SALDOCAJA);
  EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'POS', 'ARQUEO DE CAJA OBLIGATORIO AL HACER CIERRE ZETA') returning_values (ARQOBL);
  if (ARQOBL = 'SI') then
      BEGIN
      /* descuadre con respecto al mas reciente arqueo */
      select first 1 arqc_id from arqueo_caja A where arqc_fecha = :fecha AND A.arqc_caja = :caja AND A.arqc_anulado = 'N'
        order by arqc_id desc into :idarq;
      select sum(d.arqd_total) from arqueo_caja_det d where arqc_id = :idarq into :arqueo;
      if (ARQUEO IS NULL) then
        ARQUEO = 0;
      if (SALDOCAJA >= ARQUEO) then
        BEGIN
        SOBRANTE = 0;
        FALTANTE = SALDOCAJA - ARQUEO;
        END
      ELSE
        BEGIN
        SOBRANTE = ARQUEO - SALDOCAJA;
        FALTANTE = 0;
        END
      END
  ELSE
    BEGIN
    ARQUEO = 0;
    SOBRANTE = 0;
    FALTANTE = 0;
    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^


ALTER PROCEDURE CIERRE_FACTURACION_VEND (
    FECHA DATE,
    PUNTO INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PUNTOVTA VARCHAR(60),
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NROFAC INTEGER,
    BASEFAC NUMERIC(18,2),
    IVAFAC NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    NROITE INTEGER,
    NRODEV INTEGER,
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    TOTALDEV NUMERIC(18,2),
    BASENETO NUMERIC(18,2),
    IVANETO NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    FORMAP1 NUMERIC(18,2),
    FORMAP2 NUMERIC(18,2),
    FORMAP3 NUMERIC(18,2),
    FORMAP4 NUMERIC(18,2),
    FORMAP5 NUMERIC(18,2),
    FORMAP6 NUMERIC(18,2),
    FORMAP7 NUMERIC(18,2),
    FORMAP8 NUMERIC(18,2),
    FORMAP9 NUMERIC(18,2),
    FORMAP10 NUMERIC(18,2),
    FORMAP11 NUMERIC(18,2),
    FORMAP12 NUMERIC(18,2),
    FORMAP13 NUMERIC(18,2),
    FORMAP14 NUMERIC(18,2),
    FORMAP15 NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    RETES NUMERIC(18,2),
    NROFACTANUL INTEGER,
    IVANUL NUMERIC(18,2),
    TOTALFACANUL NUMERIC(18,2),
    TNROFAC INTEGER,
    TBASEFAC NUMERIC(18,2),
    TIVAFAC NUMERIC(18,2),
    TTOTALFAC NUMERIC(18,2),
    TNROITE INTEGER,
    TNRODEV INTEGER,
    TBASEDEV NUMERIC(18,2),
    TIVADEV NUMERIC(18,2),
    TTOTALDEV NUMERIC(18,2),
    TBASENETO NUMERIC(18,2),
    TIVANETO NUMERIC(18,2),
    TTOTALNETO NUMERIC(18,2),
    TFORMAP1 NUMERIC(18,2),
    TFORMAP2 NUMERIC(18,2),
    TFORMAP3 NUMERIC(18,2),
    TFORMAP4 NUMERIC(18,2),
    TFORMAP5 NUMERIC(18,2),
    TFORMAP6 NUMERIC(18,2),
    TFORMAP7 NUMERIC(18,2),
    TFORMAP8 NUMERIC(18,2),
    TFORMAP9 NUMERIC(18,2),
    TFORMAP10 NUMERIC(18,2),
    TFORMAP11 NUMERIC(18,2),
    TFORMAP12 NUMERIC(18,2),
    TFORMAP13 NUMERIC(18,2),
    TFORMAP14 NUMERIC(18,2),
    TFORMAP15 NUMERIC(18,2),
    TCARTERA NUMERIC(18,2),
    TRETES NUMERIC(18,2),
    TNROFACTANUL INTEGER,
    TIVANUL NUMERIC(18,2),
    TTOTALFACANUL NUMERIC(18,2))
AS
declare variable AUTORIZA varchar(20);
declare variable basedv numeric(18,2);
declare variable ivad numeric(18,2);
declare variable totald numeric(18,2);
declare variable i integer;
declare variable r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable FP INTEGER;
declare variable TFP numeric(18,2);
begin
SELECT AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
TNROFAC = 0;
TBASEFAC = 0;
TIVAFAC = 0;
TTOTALFAC = 0;
TNROITE = 0;
TNRODEV = 0;
TBASEDEV = 0;
TIVADEV = 0;
TTOTALDEV = 0;
TBASENETO = 0;
TIVANETO = 0;
TTOTALNETO = 0;
TFORMAP1 = 0;
TFORMAP2 = 0;
TFORMAP3 = 0;
TFORMAP4 = 0;
TFORMAP5 = 0;
TFORMAP6 = 0;
TFORMAP7 = 0;
TFORMAP8 = 0;
TFORMAP9 = 0;
TFORMAP10 = 0;
TFORMAP11 = 0;
TFORMAP12 = 0;
TFORMAP13 = 0;
TFORMAP14 = 0;
TFORMAP15 = 0;
TCARTERA = 0;
TRETES = 0;
TNROFACTANUL = 0;
TIVANUL = 0;
TTOTALFACANUL = 0;
FOR SELECT VEND_COD, VEND_NOMBRE FROM VENDEDORES V WHERE EXISTS (SELECT FACT_ID FROM FACTURAS WHERE FACT_FECHA = :FECHA AND FACT_ANULADO = 'N' AND VEND_COD = V.vend_cod AND PTVT_ID = :PUNTO)
  INTO :codvend, :nomvend
  DO
  BEGIN
  /* LAS VENTAS */
  SELECT COUNT(FACT_ID), SUM(FACT_TOTAL - FACT_IVAMONTO + FACT_DEC2799), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :codvend AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :codvend AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :codvend AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL)
    FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :codvend AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :codvend AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASENETO = BASENETO - BASEDV;
  IVANETO = IVANETO - IVAD;
  TOTALNETO = TOTALNETO - TOTALD;

  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;
  TNROFAC = TNROFAC + NROFAC;
  TBASEFAC = TBASEFAC + BASEFAC;
  TIVAFAC = TIVAFAC + IVAFAC;
  TTOTALFAC = TTOTALFAC + TOTALFAC;
  TNROITE = TNROITE + NROITE;
  TNRODEV = TNRODEV + NRODEV;
  TBASEDEV = TBASEDEV + BASEDEV;
  TIVADEV = TIVADEV + IVADEV;
  TTOTALDEV = TTOTALDEV + TOTALDEV;
  TBASENETO = TBASENETO + BASENETO;
  TIVANETO = TIVANETO + IVANETO;
  TTOTALNETO = TTOTALNETO + TOTALNETO;
  TNROFACTANUL = TNROFACTANUL + NROFACTANUL;
  TIVANUL = TIVANUL + IVANUL;
  TTOTALFACANUL = TTOTALFACANUL + TOTALFACANUL;
  SELECT SUM(D.trcd_monto) FROM traslados_caja T, traslados_caja_det D, punto_venta PT
    WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha = :fecha AND PT.caja_id = T.caja_id AND PT.ptvt_id = :punto AND T.trcj_anulado = 'N' AND T.vend_cod = :codvend
    INTO :traslado;
  if (TRASLADO IS NULL) then
    TRASLADO = 0;

  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    INTO :FORMAP6;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    INTO :FORMAP7;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    INTO :FORMAP8;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    INTO :FORMAP9;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    INTO :FORMAP10;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 11 and RECA_ANULADO = 'N'
    INTO :FORMAP11;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 12 and RECA_ANULADO = 'N'
    INTO :FORMAP12;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 13 and RECA_ANULADO = 'N'
    INTO :FORMAP13;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 14 and RECA_ANULADO = 'N'
    INTO :FORMAP14;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 15 and RECA_ANULADO = 'N'
    INTO :FORMAP15;
  /* RESTE LOS TRASLADOS DE CAJA */
  FOR SELECT MAX(D.fopa_id), SUM(D.trcd_monto) FROM traslados_caja T, traslados_caja_det D, punto_venta PT
    WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha = :fecha AND PT.caja_id = T.caja_id AND PT.ptvt_id = :punto AND T.trcj_anulado = 'N' AND T.vend_cod = :codvend AND D.fopa_id = 1
    GROUP BY D.fopa_id INTO :FP, :TFP
    DO
    BEGIN
    if (tfp IS NULL) then
      tfp = 0;
    if (FP = 1) then
      formap1 = FORMAP1 - TFP;
    if (FP = 2) then
      formap2 = FORMAP2 - TFP;
    if (FP = 3) then
      formap3 = FORMAP3 - TFP;
    if (FP = 4) then
      formap4 = FORMAP4 - TFP;
    if (FP = 5) then
      formap5 = FORMAP5 - TFP;
    if (FP = 6) then
      formap6 = FORMAP6 - TFP;
    if (FP = 7) then
      formap7 = FORMAP7 - TFP;
    if (FP = 8) then
      formap8 = FORMAP8 - TFP;
    if (FP = 9) then
      formap9 = FORMAP9 - TFP;
    if (FP = 10) then
      formap10 = FORMAP10 - TFP;
    if (FP = 11) then
      formap11 = FORMAP11 - TFP;
    if (FP = 12) then
      formap12 = FORMAP12 - TFP;
    if (FP = 13) then
      formap13 = FORMAP13 - TFP;
    if (FP = 14) then
      formap14 = FORMAP14 - TFP;
    if (FP = 15) then
      formap15 = FORMAP15 - TFP;
    END
  /* AJUSTE LOS CAMBIOS DE DOCUMENTOS */
  FOR SELECT MAX(E.fopa_id), SUM(E.cden_monto) FROM cambio_documentos C, cambiodoc_entradas E, punto_venta PT
    WHERE C.cado_id = E.cado_id AND C.cado_fecha = :fecha AND PT.caja_id = C.caja_id AND PT.ptvt_id = :punto AND C.cado_anulado = 'N' AND C.vend_cod = :codvend
    GROUP BY E.fopa_id INTO :FP, tfp
    DO
    BEGIN
    if (tfp IS NULL) then
      tfp = 0;
    if (FP = 1) then
      formap1 = FORMAP1 - TFP;
    if (FP = 2) then
      formap2 = FORMAP2 - TFP;
    if (FP = 3) then
      formap3 = FORMAP3 - TFP;
    if (FP = 4) then
      formap4 = FORMAP4 - TFP;
    if (FP = 5) then
      formap5 = FORMAP5 - TFP;
    if (FP = 6) then
      formap6 = FORMAP6 - TFP;
    if (FP = 7) then
      formap7 = FORMAP7 - TFP;
    if (FP = 8) then
      formap8 = FORMAP8 - TFP;
    if (FP = 9) then
      formap9 = FORMAP9 - TFP;
    if (FP = 10) then
      formap10 = FORMAP10 - TFP;
    if (FP = 11) then
      formap11 = FORMAP11 - TFP;
    if (FP = 12) then
      formap12 = FORMAP12 - TFP;
    if (FP = 13) then
      formap13 = FORMAP13 - TFP;
    if (FP = 14) then
      formap14 = FORMAP14 - TFP;
    if (FP = 15) then
      formap15 = FORMAP15 - TFP;
    end
  FOR SELECT MAX(S.fopa_id), SUM(S.cdsa_monto) FROM cambio_documentos C, cambiodoc_salidas S, punto_venta PT
    WHERE C.cado_id = s.cado_id AND C.cado_fecha = :fecha AND PT.caja_id = C.caja_id AND PT.ptvt_id = :punto AND C.cado_anulado = 'N' AND C.vend_cod = :codvend
    GROUP BY s.fopa_id INTO :FP, tfp
    DO
    BEGIN
    if (tfp IS NULL) then
      tfp = 0;
    if (FP = 1) then
      formap1 = FORMAP1 + TFP;
    if (FP = 2) then
      formap2 = FORMAP2 + TFP;
    if (FP = 3) then
      formap3 = FORMAP3 + TFP;
    if (FP = 4) then
      formap4 = FORMAP4 + TFP;
    if (FP = 5) then
      formap5 = FORMAP5 + TFP;
    if (FP = 6) then
      formap6 = FORMAP6 + TFP;
    if (FP = 7) then
      formap7 = FORMAP7 + TFP;
    if (FP = 8) then
      formap8 = FORMAP8 + TFP;
    if (FP = 9) then
      formap9 = FORMAP9 + TFP;
    if (FP = 10) then
      formap10 = FORMAP10 + TFP;
    if (FP = 11) then
      formap11 = FORMAP11 + TFP;
    if (FP = 12) then
      formap12 = FORMAP12 + TFP;
    if (FP = 13) then
      formap13 = FORMAP13 + TFP;
    if (FP = 14) then
      formap14 = FORMAP14 + TFP;
    if (FP = 15) then
      formap15 = FORMAP15 + TFP;
    end
  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :codvend AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  for SELECT DEVT_ID,DEVT_TOTAL FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO and VEND_COD = :codvend AND DEVT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 33 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera - :F_TOTAL;
    end
  /* SUME LAS RETENCIONES COMO CARTERA */
  SELECT SUM(RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA) FROM recibos_caja_detalle D, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = D.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND RECA_ANULADO = 'N'
    INTO :RETES;
  if (RETES IS NULL) then
    RETES = 0;

  if (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 0;
  if (formap13 is null) then
    formap13 = 0;
  if (formap14 is null) then
    formap14 = 0;
  if (formap15 is null) then
    formap15 = 0;
  if (cartera is null) then
    cartera = 0;
  TFORMAP1 = TFORMAP1 + FORMAP1;
  TFORMAP2 = TFORMAP2 + FORMAP2;
  TFORMAP3 = TFORMAP3 + FORMAP3;
  TFORMAP4 = TFORMAP4 + FORMAP4;
  TFORMAP5 = TFORMAP5 + FORMAP5;
  TFORMAP6 = TFORMAP6 + FORMAP6;
  TFORMAP7 = TFORMAP7 + FORMAP7;
  TFORMAP8 = TFORMAP8 + FORMAP8;
  TFORMAP9 = TFORMAP9 + FORMAP9;
  TFORMAP10 = TFORMAP10 + FORMAP10;
  TFORMAP11 = TFORMAP11 + FORMAP11;
  TFORMAP12 = TFORMAP12 + FORMAP12;
  TFORMAP13 = TFORMAP13 + FORMAP13;
  TFORMAP14 = TFORMAP14 + FORMAP14;
  TFORMAP15 = TFORMAP15 + FORMAP15;
  TCARTERA = TCARTERA + CARTERA;
  TRETES = TRETES + RETES;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 122, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
  END
end^


ALTER PROCEDURE CIERRE_FORMAPAGO (
    FECHA DATE,
    PUNTO INTEGER,
    PREFIJO VARCHAR(4),
    FP INTEGER)
RETURNS (
    CANT INTEGER,
    TOTAL NUMERIC(18,2),
    MONEDAEX NUMERIC(18,2))
AS
declare variable IDR INTEGER;
declare variable IDF INTEGER;
declare variable I INTEGER;
declare variable TOTALF NUMERIC(18,2);
declare variable TOTALR NUMERIC(18,2);
declare variable MONTO NUMERIC(18,2);
declare variable TRM DOUBLE PRECISION;
declare variable MONTOE NUMERIC(18,2);
begin
CANT = 0;
TOTAL = 0;
FOR SELECT fact_id FROM FACTURAS F
    where FACT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' AND ((ptvt_id = :punto) or (:PUNTO = 0))
    into :IDF
    do
    begin
    for select R.RECA_ID, R.RECA_MONTO, D.rcde_abono, R.reca_trm FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
        WHERE R.RECA_ID = D.RECA_ID AND RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' AND D.RCDE_TIPODOC = 31 AND D.RCDE_IDDOC = :IDF
        INTO :IDR, :TOTALR, :totalf, :TRM
        DO
        BEGIN
        SELECT count(RCPA_ITEM), SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P
            WHERE RECA_ID = :IDR AND FOPA_ID = :FP INTO :I, :MONTO;
        if (CANT IS NULL) then
            CANT = 0;
        CANT = CANT + I;
        if (MONTO IS NULL) then
            MONTO = 0;
        TOTAL = TOTAL + ROUND(MONTO * (TOTALF / TOTALR),2);
        MONTOE = (MONTO / :TRM);
        MONEDAEX = MONEDAEX + ROUND(MONTOE * (TOTALF / TOTALR),2);
        END
    END
FOR SELECT devt_id FROM devoluciones_ventas F
    where DEVT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N' AND ((ptvt_id = :punto) or (:PUNTO = 0))
    into :IDF
    do
    begin
    TOTALF = 0;
    TOTALR = 0;
    MONTO = 0;
    MONTOE = 0;
    for select E.egre_id, E.egre_monto, D.egcc_abono, E.egre_trm FROM egresos E, egresos_crucec D
        WHERE E.egre_id = D.egre_id AND EGRE_FECHA = :FECHA AND EGRE_ANULADO = 'N' AND D.egcc_tipodoc = 33 AND D.egcc_iddoc = :IDF
        INTO :IDR, :TOTALR, :totalf, :TRM
        DO
        BEGIN
        SELECT SUM(P.egca_monto) FROM egresos_caja P
            WHERE EGRE_ID = :IDR AND P.FOPA_ID = :FP INTO :MONTO;
        if (MONTO IS NULL) then
            MONTO = 0;
        TOTAL = TOTAL + ROUND(MONTO * (TOTALF / TOTALR),2);
        MONTOE = (MONTO / :TRM);
        MONEDAEX = MONEDAEX + ROUND(MONTOE * (TOTALF / TOTALR),2);
        END
    END
if (TOTAL is null) then
    TOTAL = 0;
if (MONEDAEX is null) then
    MONEDAEX = 0;
suspend;
end^


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^


ALTER PROCEDURE CLIENTES_ARTICULO (
    FECINI DATE,
    FECFIN DATE,
    ARTICULO VARCHAR(15),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DV CHAR(1),
    CODCLI VARCHAR(20),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
declare variable CANTIDADD numeric(18,4);
declare variable BASEDV numeric(18,2);
declare variable IVAD numeric(18,2);
declare variable TOTALD numeric(18,2);
BEGIN
FOR SELECT SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR),
    MAX(TERC_NIT), max(f.fact_sucursal)
    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 D.ARTI_COD = :articulo AND
    FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
    GROUP BY TERC_NIT, f.fact_sucursal
    INTO :CANTIDAD, :BASE, :IVA, :TOTAL, :NIT, :sucursal
    DO
    BEGIN
    select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod from terceros T, CLIENTES C, cliente_sucursales S
        where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
        INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CODCLI;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CANTIDAD IS NULL) then
        CANTIDAD = 0;
    if (BASE IS NULL) then
        BASE = 0;
    if (IVA IS NULL) then
        IVA = 0;
    if (TOTAL IS NULL) then
        TOTAL = 0;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_TOTAL*DEVT_FACTOR)
        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 V.terc_nit = :NIT AND
            DEVT_FECHA >= :FECINI and ((devt_remid is null) or (DEVT_REMID = 0)) AND DEVT_FECHA <= :FECFIN AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and d.arti_cod = :articulo
        INTO :CANTIDADD, :BASEDV, :IVAD, :TOTALD;
    if (CANTIDADD IS NULL) then
        CANTIDADD = 0;
    if (BASEDV IS NULL) then
        BASEDV = 0;
    if (IVAD IS NULL) then
        IVAD = 0;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    CANTIDAD = CANTIDAD - CANTIDADD;
    BASE = BASE - BASEDV;
    IVA = IVA - IVAD;
    TOTAL = TOTAL - TOTALD;
    SUSPEND;
    END
END^


ALTER PROCEDURE CLIENTES_DESCUENTO (
    FECINI DATE,
    FECFIN DATE,
    IDDTO INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FECHA DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANT NUMERIC(18,2),
    PRUNIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
begin
FOR SELECT FACT_FECHA, PREF_PRE, FACT_NUMERO, F.TERC_NIT, F.fact_nomcliente, DC.ARTI_COD, FD.fade_desc, FD.fade_cant * FD.fade_factor, FD.fade_prunit, FD.fade_total
    FROM descuentos_precios_cli DC, FACTURAS F, FACTURAS_DETALLE FD
    WHERE DC.dctp_id = :iddto AND FD.fact_id = F.fact_id AND F.terc_nit = DC.terc_nit AND FD.fade_iddto = :iddto
    AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    INTO :FECHA, :prefijo,  :NUMERO, :NIT, :nombre, :articulo, :descripcion, :cant, :prunit, :total
    DO
    BEGIN
    suspend;
    END
end^


ALTER PROCEDURE CLIENTES_SIN_REGISTRO (
    COBRADOR INTEGER,
    VENDEDOR INTEGER,
    LISTA INTEGER,
    ZONA VARCHAR(2))
RETURNS (
    NIT VARCHAR(20))
AS
declare variable nitclie VARCHAR(20) CHARACTER SET NONE;
begin
FOR SELECT TERC_NIT FROM TERCEROS WHERE TERC_CLIE = 'S' INTO :NIT
    DO
    BEGIN
    nitclie = NULL;
    SELECT TERC_NIT FROM CLIENTES WHERE TERC_NIT = :nit INTO :nitclie;
    if (nitclie IS NULL) then
       INSERT INTO CLIENTES (TERC_NIT, CLIE_ESTADO, ZONA_COD, COBR_COD, VEND_COD, LIPR_COD)
         VALUES (:NIT, 'A', :ZONA, :COBRADOR, :VENDEDOR, :LISTA);
    suspend;
    END
end^


ALTER PROCEDURE COBRADOR_NOTAS
RETURNS (
    NIT VARCHAR(20),
    COBR INTEGER)
AS
BEGIN
FOR SELECT TERC_NIT, COBR_COD FROM clientes ORDER BY TERC_NIT INTO :NIT, :COBR
    DO
    BEGIN
    UPDATE NOTAS_DEBITO_CLIENTES SET COBR_COD = :COBR WHERE TERC_NIT = :NIT;
    SUSPEND;
    END
END^


ALTER PROCEDURE CODIGO_BARRAS (
    ARTICULO VARCHAR(15))
RETURNS (
    CODIGO VARCHAR(20))
AS
declare variable DIG INTEGER;
declare variable COD VARCHAR(15);
declare variable LONPRE INTEGER;
begin
execute procedure lee_configuracion('INVENTARIO', 'ARTICULOS', 'PREFIJO EAN13 PARA CREAR CODIGOS DE BARRAS') returning_values (CODIGO);
if (CODIGO <> '') then
    BEGIN
    LONPRE = STRLEN(CODIGO);
    execute procedure completa_ceros8(:articulo) returning_values (:COD);
    CODIGO = CODIGO || SUBSTRING(COD FROM (LONPRE-3) FOR (12-LONPRE));
    EXECUTE PROCEDURE digito_chequeo (SUBSTRING(COD FROM (LONPRE-3) FOR (12-LONPRE))) returning_values (DIG);
    CODIGO = CODIGO || DIG;
    suspend;
    END
end^


ALTER PROCEDURE CODIGOS_BARRAS (
    CODIGO VARCHAR(20))
RETURNS (
    BARRAS VARCHAR(20),
    DESCRIPCION VARCHAR(60))
AS
begin
FOR SELECT B.coba_cod, B.coba_des FROM barras_articulo B WHERE B.arti_cod = :codigo INTO :barras, :descripcion
    DO
    BEGIN
    EXECUTE PROCEDURE NOMBRE_ASCII(descripcion) returning_values (descripcion);
    suspend;
    END
end^


ALTER PROCEDURE COLA_FUNCIONES (
    OPERARIO INTEGER,
    FUNCOCI INTEGER,
    CONFIRMA CHAR(1))
RETURNS (
    ITEM INTEGER,
    ARTICOD VARCHAR(15),
    FECHA DATE,
    CANT SMALLINT,
    TIEMPOF SMALLINT,
    TIEMPOO SMALLINT,
    ESTADO CHAR(1),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    HORA TIME,
    TIEMPOR SMALLINT,
    OPER INTEGER,
    TIEMPOA TIME,
    ARTIDES VARCHAR(60),
    NOMESTADO VARCHAR(15))
AS
begin
TIEMPOA = NULL;
NOMESTADO = '';
FOR SELECT COCF_ITEM, CPCF_FECHA, COCF_ARTICULO, COCF_CANT, COCF_TIEMPOF, COCF_TIEMPOO, COCF_ENTREGADO, COCF_OBS, COCF_HORA,
    COCF_TIEMPOREAL, COCF_OPERARIO, COCF_TIEMPOA FROM COCINA_COLA_FUNCION CF WHERE COFU_ID = :FUNCOCI
    AND ((CF.COCF_OPERARIO IS NULL) or (CF.COCF_OPERARIO = :OPERARIO)) AND ((CF.COCF_ENTREGADO = :CONFIRMA) or (CF.COCF_ENTREGADO = 'N'))
    INTO :ITEM, :FECHA, :ARTICOD, :CANT, :TIEMPOF, :TIEMPOO, :ESTADO, :OBS, :HORA, :TIEMPOR, :OPER, TIEMPOA
    DO
    BEGIN
    select ARTI_DES FROM articulo WHERE ARTI_COD = :ARTICOD INTO ARTIDES;
    if ((:ESTADO = 'N') AND (:OPER IS NULL)) then
        NOMESTADO = 'Sin asignar';
    if ((:ESTADO = 'N') and (:OPER IS NOT NULL)) then
        NOMESTADO = 'Asignado';
    if (:ESTADO = 'S') then
        NOMESTADO = 'Listo';
    if (:obs is null) then
        obs = '';
    if (:tiempor IS NULL) then
        tiempor = 0;
    suspend;
    TIEMPOA = NULL;
    END
end^


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


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^


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

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

            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            FACTORAB = CAST(abono AS double precision) / CAST(total AS double precision);
                        else
                            FACTORAB = 0;
                        BASE = BASEAUX * FACTORAB;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            FACTORAB = CAST(abono AS double precision) / CAST(total AS double precision);
                        else
                            FACTORAB = 0;
                        BASE = BASEAUX * FACTORAB;
                        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_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if ((TIPO = 42) AND (DESCNOTASCR = 'SI')) then
                SELECT NCCL_MONTO+NCCL_IVAMONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE+ANCL_IVAMONTO, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    BEGIN
                    FACTORAB = CAST(abono AS double precision) / CAST(total AS double precision);
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) * FACTORAB;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) * FACTORAB;
                    END
                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
                if (((DESCNOTASCR = 'SI') AND (TIPO = 42)) or ((DESCNOTASCR = 'NO') AND (TIPO <> 42)) or (TIPO <> 42))  then
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT ACDE_TIPODOC, ACDE_IDDOC, ACDE_PREFIJO, ACDE_NUMERO, R.TERC_NIT, TERC_NOM, APCL_FECHA, (ACDE_APLICADO+ACDE_RTFTE+ACDE_RTIVA+ACDE_RTICA), PREF_PRE, APCL_NUMERO, COBR_COD, 0, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA
    FROM aplicacion_cliente R, aplicacion_cliente_detalle RD, TERCEROS T
    WHERE R.apcl_id = RD.apcl_id AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND APCL_ANULADO = 'N'
    ORDER BY TERC_NIT, APCL_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT first 1 MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT first 1 MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
        SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if (TIPO = 31) then
        SELECT PTVT_ID FROM FACTURAS WHERE FACT_ID = :ID INTO :puntovta;
    else if (TIPO = 33) then
        SELECT PTVT_ID FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :puntovta;
    else    
        PUNTOVTA = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND
            INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :lista, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

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

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

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


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(8),
    FECDOC DATE,
    PUNTOVTA INTEGER,
    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), MAX(F.ptvt_id)
            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, :puntovta
            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), max(v.ptvt_id)
            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, :puntovta
            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), max(f.ptvt_id)
            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, :puntovta
            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), max(v.ptvt_id)
            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, :puntovta
            DO
            BEGIN
            SELECT FACT_PEDIDO FROM FACTURAS WHERE FACT_ID = :IDFACT INTO :PEDIDO;
            if (COMIPORC <> 0) then
                BEGIN
                BASEAUX = :comiaux * 100 / :comiporc;
                EXECUTE PROCEDURE redondee(:BASEAUX, 0) returning_values (:BASEAUX);
                BASEDV = BASEDV + BASEAUX;
                comimontodv = comimontodv + comiaux;
                END
            ELSE
                BEGIN
                if (comiaux <> 0) then
                    BEGIN
                    if (SITOT = 'SI') then
                        baseaux = TOTAL;
                    ELSE
                        baseaux = TOTAL - EXTRA - IVAMONTO - CONSUMO;
                    BASEDV = BASEDV + BASEAUX;
                    comimontodv = comimontodv + comiaux;
                    END
                END
            END
        BASE = basefv - basedv;
        COMIMONTO = comimontofv - comimontodv;
        SUSPEND;
        END
    END
END^


ALTER PROCEDURE COMPARA_CENTROS (
    ANO CHAR(4),
    MES INTEGER,
    PROY1 VARCHAR(4),
    CEN1 VARCHAR(4),
    PROY2 VARCHAR(4),
    CEN2 VARCHAR(4))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(60),
    NOM_CENTRO VARCHAR(60),
    INICIAL1 NUMERIC(18,2),
    DEBITOS1 NUMERIC(18,2),
    CREDITOS1 NUMERIC(18,2),
    FINAL1 NUMERIC(18,2),
    INICIAL2 NUMERIC(18,2),
    DEBITOS2 NUMERIC(18,2),
    CREDITOS2 NUMERIC(18,2),
    FINAL2 NUMERIC(18,2),
    NIVEL INTEGER)
AS
DECLARE VARIABLE OK CHAR(1);
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS ORDER BY CUEN_COD INTO CUENTA, NOM_CUENTA
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CENTRO_MES(CUENTA, PROY1, CEN1, ANO, MES, 'S') RETURNING_VALUES (INICIAL1);
  EXECUTE PROCEDURE MOVIMIENTO_CENTRO_MES(CUENTA, PROY1, CEN1, ANO, MES, 'S') RETURNING_VALUES(DEBITOS1);
  EXECUTE PROCEDURE MOVIMIENTO_CENTRO_MES(CUENTA, PROY1, CEN1, ANO, MES, 'N') RETURNING_VALUES(CREDITOS1);
  FINAL1 = INICIAL1 + DEBITOS1 - CREDITOS1;
  EXECUTE PROCEDURE SALDO_CENTRO_MES(CUENTA, PROY2, CEN2, ANO, MES, 'S') RETURNING_VALUES (INICIAL2);
  EXECUTE PROCEDURE MOVIMIENTO_CENTRO_MES(CUENTA, PROY2, CEN2, ANO, MES, 'S') RETURNING_VALUES(DEBITOS2);
  EXECUTE PROCEDURE MOVIMIENTO_CENTRO_MES(CUENTA, PROY2, CEN2, ANO, MES, 'N') RETURNING_VALUES(CREDITOS2);
  FINAL2 = INICIAL2 + DEBITOS2 - CREDITOS2;
  if ((final1 <> 0) or (inicial1 <> 0) or (debitos1 <> 0) or (creditos1 <> 0) or (final2 <> 0) or (inicial2 <> 0) or (debitos2 <> 0) or (creditos2 <> 0)) then
    SUSPEND;
  END
END^


ALTER PROCEDURE COMPARA_CENTROS_NIIF (
    ANO CHAR(4),
    MES INTEGER,
    PROY1 VARCHAR(4),
    CEN1 VARCHAR(4),
    PROY2 VARCHAR(4),
    CEN2 VARCHAR(4))
RETURNS (
    CUENTA VARCHAR(20),
    NOM_CUENTA VARCHAR(140),
    NOM_CENTRO VARCHAR(60),
    INICIAL1 NUMERIC(18,2),
    DEBITOS1 NUMERIC(18,2),
    CREDITOS1 NUMERIC(18,2),
    FINAL1 NUMERIC(18,2),
    INICIAL2 NUMERIC(18,2),
    DEBITOS2 NUMERIC(18,2),
    CREDITOS2 NUMERIC(18,2),
    FINAL2 NUMERIC(18,2),
    NIVEL INTEGER)
AS
DECLARE VARIABLE OK CHAR(1);
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM cuentas_niif ORDER BY CUEN_COD INTO CUENTA, NOM_CUENTA
DO
  BEGIN
  EXECUTE PROCEDURE saldo_centro_mes_niif(CUENTA, PROY1, CEN1, ANO, MES, 'S') RETURNING_VALUES (INICIAL1);
  EXECUTE PROCEDURE movimiento_centro_mes_niif(CUENTA, PROY1, CEN1, ANO, MES, 'S') RETURNING_VALUES(DEBITOS1);
  EXECUTE PROCEDURE movimiento_centro_mes_niif(CUENTA, PROY1, CEN1, ANO, MES, 'N') RETURNING_VALUES(CREDITOS1);
  FINAL1 = INICIAL1 + DEBITOS1 - CREDITOS1;
  EXECUTE PROCEDURE saldo_centro_mes_niif(CUENTA, PROY2, CEN2, ANO, MES, 'S') RETURNING_VALUES (INICIAL2);
  EXECUTE PROCEDURE movimiento_centro_mes_niif(CUENTA, PROY2, CEN2, ANO, MES, 'S') RETURNING_VALUES(DEBITOS2);
  EXECUTE PROCEDURE movimiento_centro_mes_niif(CUENTA, PROY2, CEN2, ANO, MES, 'N') RETURNING_VALUES(CREDITOS2);
  FINAL2 = INICIAL2 + DEBITOS2 - CREDITOS2;
  if ((final1 <> 0) or (inicial1 <> 0) or (debitos1 <> 0) or (creditos1 <> 0) or (final2 <> 0) or (inicial2 <> 0) or (debitos2 <> 0) or (creditos2 <> 0)) then
    SUSPEND;
  END
END^


ALTER PROCEDURE COMPARA_INVENTARIO (
    FECHA1 DATE,
    FECHA2 DATE,
    BODEGA VARCHAR(2),
    CEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    ESTADO CHAR(1),
    CANT1 NUMERIC(18,4),
    COSTO1 NUMERIC(18,2),
    CANT2 NUMERIC(18,4),
    COSTO2 NUMERIC(18,2),
    DIFCANT NUMERIC(18,4),
    DIFCOSTO NUMERIC(18,2))
AS
begin
for SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, ESAR_COD, GRUP_COD, SUBG_COD
    FROM ARTICULO ORDER BY ARTI_DES
    INTO :codigo, :descripcion, :unidad, :estado, :grupo, :subgrupo
    DO
    BEGIN
    DIFCANT = 0;
    DIFCOSTO = 0;
    execute PROCEDURE costo_promedio(:codigo, :fecha1) returning_values (:costo1);
    execute PROCEDURE costo_promedio(:codigo, :fecha2) returning_values (:costo2);
    if (BODEGA = '') then
        BEGIN
        EXECUTE PROCEDURE saldo_total_inventario(:codigo, :fecha1) returning_values (:cant1);
        EXECUTE PROCEDURE saldo_total_inventario(:codigo, :fecha2) returning_values (:cant2);
        END
    ELSE
        BEGIN
        EXECUTE PROCEDURE saldo_inventario(:codigo, :bodega, :fecha1) returning_values (:cant1);
        EXECUTE PROCEDURE saldo_inventario(:codigo, :bodega, :fecha2) returning_values (:cant2);
        END
    difcant = cant1 - cant2;
    COSTO1 = COSTO1 * CANT1;
    COSTO2 = COSTO2 * cant2;
    difcosto = COSTO1 - costo2;
    if ((CEROS = 'S') or (DIFCANT <> 0) or (DIFCOSTO <> 0))  then
        suspend;
    END
end^


ALTER PROCEDURE COMPARA_ITEM_FACTURA (
    IDFAC INTEGER,
    ITEM INTEGER,
    CODBAR VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
declare variable ID VARCHAR(20);
declare variable CODFAC VARCHAR(20);
declare variable TIPO CHAR(1);
begin
id = '';
TIPO = '0';
SELECT FIRST 1 '1', ARTI_COD from BARRAS_ARTICULO
    WHERE COBA_COD = :codbar AND COBA_ACTIVO = 'S'
    INTO :TIPO, :ID;
if (TIPO <> '1') then
    SELECT '2', ARTI_COD FROM ARTICULO
        WHERE ARTI_COD = :codbar
        INTO :TIPO, :ID;
if (ID <> '') then
    BEGIN
    SELECT ARTI_COD FROM FACTURAS_DETALLE WHERE FACT_ID = :IDFAC AND FADE_ITEM = :ITEM INTO :CODFAC;
    if (CODFAC <> ID) then
        OK = 'N';
    ELSE
        OK = 'S';
    suspend;
    END
ELSE
    BEGIN
    OK = 'N';
    suspend;
    END
end^


ALTER PROCEDURE COMPARA_MOVCAJA_DOCCAJA (
    CAJAINI INTEGER,
    CAJAFIN INTEGER)
RETURNS (
    CAJAID INTEGER,
    CAJANOM VARCHAR(60),
    SALDO NUMERIC(18,2),
    MONTOE NUMERIC(18,2),
    MONTOO NUMERIC(18,2))
AS
declare variable IDDOC INTEGER;
BEGIN
FOR SELECT CAJA_ID, CAJA_NOMBRE FROM CAJAS
    WHERE CAJA_ID >= :CAJAINI AND CAJA_ID <= :CAJAFIN
    ORDER BY CAJA_ID
    INTO :CAJAID, :CAJANOM
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_EN_CAJA(:CAJAID, '9999/12/31') returning_values(:SALDO);
    execute procedure SALDO_EN_EFECTIVO(:CAJAID, '9999/12/31') RETURNING_VALUES (:MONTOE);

    SELECT SUM(DPCA_MONTO) FROM DOCUMENTOS_PAGO_CAJA D
        WHERE D.CAJA_ID = :CAJAID AND D.FOPA_ID <> 1 AND DPCA_IDSAL = 0 AND DPCA_TIPOSAL = 0
        INTO :MONTOO;
    SUSPEND;
    END
END^


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') AND MVAR_TIPODOC <> 10 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') AND MVAR_TIPODOC <> 10 
            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') AND MVAR_TIPODOC <> 10 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') AND MVAR_TIPODOC <> 10
            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^


ALTER PROCEDURE COMPARA_SALIDAS_ENTRADAS (
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    TIVA NUMERIC(18,2),
    CANTS NUMERIC(18,2),
    CANTE NUMERIC(18,2),
    DIFER NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    TOTALPR NUMERIC(18,2),
    TOTALCO NUMERIC(18,2))
AS
begin
FOR SELECT MAX(SD.arti_cod), SUM(SD.sade_cant * SD.sade_factor), MAX(SD.sade_costo), MAX(SD.sade_ivaporc)
    FROM SALIDAS_DETALLE SD, SALIDAS S WHERE S.sali_id = SD.sali_id AND S.sali_fecha = :FECHA AND SD.sade_anulado = 'N'
    GROUP BY SD.arti_cod
    INTO :ARTICULO, :cants, :COSTO, :tiva
    DO
    BEGIN
    descripcion = '';
    SELECT ARTI_DES FROM ARTICULO A WHERE ARTI_COD = :ARTICULO INTO :descripcion;
    PRECIO = 0;
    SELECT FIRST 1 FADE_PRUNIT/FD.fade_factor FROM FACTURAS_DETALLE FD, FACTURAS F
        WHERE F.fact_id = FD.fact_id AND F.fact_fecha >= :FECHA AND FD.arti_cod = :articulo AND F.fact_anulado = 'N'
        ORDER BY FACT_FECHA, F.FACT_ID
        INTO :PRECIO;
    CANTE = 0;
    SELECT SUM(ED.ende_cant * ED.ende_factor) FROM ENTRADAS_DETALLE ED, ENTRADAS E
        WHERE E.entr_id = ED.entr_id AND E.entr_fecha = :FECHA AND ED.arti_cod = :articulo AND ED.ende_anulado = 'N'
        INTO CANTE;
    DIFER = CANTS - CANTE;
    TOTALPR = DIFER * PRECIO;
    TOTALCO = DIFER * COSTO;
    suspend;
    END
end^


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^


ALTER PROCEDURE COMPLETA_CEROS8 (
    NUMERO VARCHAR(8))
RETURNS (
    NUMCEROS VARCHAR(8))
AS
DECLARE VARIABLE AUX VARCHAR(16);
DECLARE VARIABLE TAM INTEGER;
BEGIN
/* DEJE SOLO LOS NUMEROS */
NUMERO = ltrim(NUMERO);    
NUMERO = rtrim(NUMERO);
AUX = '00000000' || NUMERO;
TAM = STRLEN(AUX);
NUMCEROS = SUBSTR(AUX, (TAM - 7), TAM);
SUSPEND;
END^


ALTER PROCEDURE COMPLETA_NUMERO_COMPROBANTE
RETURNS (
    ID INTEGER,
    NUMERO VARCHAR(8))
AS
begin
FOR SELECT ENCO_CONSEC, ENCO_NUMERO FROM comprobante_encabezado WHERE STRLEN(ENCO_NUMERO) < 6
    INTO :ID, :NUMERO
    DO
    BEGIN
    EXECUTE PROCEDURE COMPLETA_CEROS (:NUMERO) returning_values (:NUMERO);
    UPDATE comprobante_encabezado SET ENCO_NUMERO = :NUMERO WHERE ENCO_CONSEC = :ID;
    suspend;
    END
end^


ALTER PROCEDURE COMPONE_FECHA (
    ANO CHAR(4),
    PERIODO INTEGER,
    DIA INTEGER)
RETURNS (
    FECHA DATE)
AS
declare variable FECAUX VARCHAR(10);
BEGIN
  FECAUX = ANO || '/';
  IF (PERIODO < 10) THEN
    BEGIN
    FECAUX = FECAUX || '0';
    FECAUX = FECAUX || CAST (PERIODO AS CHAR(1));
    END
  ELSE
    FECAUX = FECAUX || CAST(PERIODO AS CHAR(2));
  IF (DIA < 10) THEN
    BEGIN
    FECAUX = FECAUX || '/0';
    FECAUX = FECAUX || CAST (DIA AS CHAR(1));
    END
  ELSE
    FECAUX = FECAUX || '/' || CAST(DIA AS CHAR(2));
  FECHA = CAST(FECAUX AS DATE);
  SUSPEND;
END^


ALTER PROCEDURE COMPONE_FECHA_CONTA (
    ANO CHAR(4),
    PERIODO INTEGER,
    DIA INTEGER)
RETURNS (
    FECHA CHAR(8))
AS
declare variable FECAUX VARCHAR(8);
BEGIN
  FECAUX = ANO;
  IF (PERIODO < 10) THEN
    BEGIN
    FECAUX = FECAUX || '0';
    FECAUX = FECAUX || CAST (PERIODO AS CHAR(1));
    END
  ELSE
    FECAUX = FECAUX || CAST(PERIODO AS CHAR(2));
  IF (DIA < 10) THEN
    BEGIN
    FECAUX = FECAUX || '0';
    FECAUX = FECAUX || CAST (DIA AS CHAR(1));
    END
  ELSE
    FECAUX = FECAUX || CAST(DIA AS CHAR(2));
  FECHA = FECAUX;
  SUSPEND;
END^


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^


ALTER PROCEDURE COMPRAS_ARTICULO_DETALLE (
    ARTICULO VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    IDFACT INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NUMPROV VARCHAR(15),
    NIT VARCHAR(20),
    PROVEEDOR VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2),
    DESCTO NUMERIC(9,2),
    NETO NUMERIC(18,2))
AS
begin
FOR SELECT F.FACO_ID, PREF_PRE, FACO_NUMERO, FACO_NUMPROV, FACO_FECHA, TERC_NIT, D.fcde_cant * D.fcde_factor, D.fcde_prunit/D.fcde_factor, D.fcde_dtoporc, (D.fcde_total-D.fcde_ivamonto)
    FROM FACTURAS_COMPRA F, facturas_compras_detalle D
    WHERE F.faco_id = D.faco_id AND D.arti_cod = :articulo AND F.faco_anulado = 'N' AND F.faco_fecha >= :FECINI AND F.faco_fecha <= :FECFIN
    ORDER BY F.faco_fecha DESC, F.faco_id DESC
    INTO :idfact, :prefijo, :numero, :numprov, :fecha, :nit, :cant, :costo, :descto, :neto
    DO
    BEGIN
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nit INTO :proveedor;
    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :articulo INTO :unidad;
    if (CANT <> 0) then
        NETO = NETO / CANT;
    suspend;
    END
end^


ALTER PROCEDURE COMPRAS_ARTICULO_MES (
    FECINI DATE,
    FECFIN DATE,
    GRUPO 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),
    UNIDAD VARCHAR(8),
    CANTVTAS NUMERIC(18,4),
    BASEVTAS NUMERIC(18,2),
    IVAVTAS NUMERIC(18,2),
    TOTVTAS NUMERIC(18,2),
    CANTDEV NUMERIC(18,4),
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    TOTDEV NUMERIC(18,2))
AS
BEGIN
if (GRUPO = 'S') then
  BEGIN
  UNIDAD = '';
  CODMARC = '';

  FOR SELECT G.grup_cod, G.grup_nom, G.grup_cod FROM grupo G
    where (exists (select c.faco_id from facturas_compra c, facturas_compras_detalle d, articulo a1
        where c.faco_id = d.faco_id and a1.arti_cod = d.arti_cod and a1.grup_cod = G.grup_cod
        AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N') or
        (exists (select v.dvco_id from devoluciones_compras V, devoluciones_compras_det Vd, articulo a2
        where V.dvco_id = VD.dvco_id AND a2.arti_cod = VD.arti_cod and a2.grup_cod = G.grup_cod
        AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N')))
    INTO :ARTICULO, :DESCRIPCION, :codgrupo
    DO
    BEGIN
    nomgrupo = '';
    NOMSUBG = '';
    NOMMARC = '';
    SELECT GRUP_NOM FROM grupo WHERE GRUP_COD = :codgrupo INTO nomgrupo;
    EXECUTE PROCEDURE compras_grupo (:codgrupo, '', :FECINI, :FECFIN, :SUCURSAL) returning_values (CANTVTAS, BASEVTAS, CANTDEV, BASEDEV, IVAVTAS, IVADEV);
    if ((CANTVTAS <> 0) or (CANTDEV <> 0)) then
        BEGIN
        TOTVTAS = BASEVTAS + IVAVTAS;
        TOTDEV = BASEDEV + IVADEV;
        SUSPEND;
        END
    END
  END
ELSE
  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
        BEGIN
        TOTVTAS = BASEVTAS + IVAVTAS;
        TOTDEV = BASEDEV + IVADEV;
        SUSPEND;
        END
    END
  END
END^


ALTER PROCEDURE COMPRAS_GRUPO (
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    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, ARTICULO A
    WHERE F.FACO_ID = D.FACO_ID AND D.ARTI_COD = A.arti_cod AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND
    FACO_ANULADO = 'N' AND A.grup_cod = :GRUPO AND ((:subgrupo = '') or (A.subg_cod = :SUBGRUPO)) 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, ARTICULO A
    WHERE F.DVCO_ID = D.DVCO_ID AND D.ARTI_COD = A.arti_cod AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND
    DVCO_ANULADO = 'N' AND A.grup_cod = :GRUPO AND ((:subgrupo = '') or (A.subg_cod = :SUBGRUPO))
    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^


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^


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^


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^


ALTER PROCEDURE COMPROBANTES_ACTIVO (
    ACTIVO VARCHAR(20))
RETURNS (
    ID INTEGER,
    TIPO VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(20),
    TIPOREF INTEGER,
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
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), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        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, :DEBITO, :CREDITO
        DO
            SUSPEND;
END^


ALTER PROCEDURE COMPROBANTES_DIARIO (
    FECINI VARCHAR(8),
    FECFIN VARCHAR(8),
    CONSOLIDADO CHAR(1))
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(20),
    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^


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^


ALTER PROCEDURE COMPROBANTES_TERCERO (
    NIT VARCHAR(20))
RETURNS (
    ID INTEGER,
    TIPO VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


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(8);
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 m.moba_total <> 0 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^


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(8);
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^


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(8),
    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^


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(8),
    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 sum(CODE_DEBITO), sum(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^


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;
declare variable AUTORCREE varchar(10);
declare variable FAUTORCREE date;
declare variable NITCOMP VARCHAR(20);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
ano = EXTRACT(YEAR FROM FECFIN);
mes = EXTRACT(MONTH FROM FECFIN);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') returning_values (NITCOMP);

for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_CLIE = 'S' AND TERC_NIT <> :NITCOMP 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
                if (FAUTORCREE <= 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_RTEIVA-MVCL_RTEICA-MVCL_RCREE) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :DEBITOS;
                    SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :CREDITOS;
                    end
                end
            else
                begin
                if (FAUTORCREE <= FECINI) 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;
                    end
                else
                    begin
                    SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :DEBITOS;
                    SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_DEBITO = 'N' AND MVCL_ABONO = 'N' and MVCL_TIPOREF <> 45 AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :CREDITOS;
                    end
                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;
            if (FAUTORCREE <= FECINI) then
                SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
            else
                SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA+MVCL_RCREE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
            END
        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^


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(8),
    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);
declare variable RCREE NUMERIC(18,2);
declare variable ABONO CHAR(1);
declare variable RETES CHAR(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';

FOR select MVCL_TIPOREF, MVCL_IDREF, MVCL_MONTO, MVCL_FECHA, MVCL_PREFREF, MVCL_NUMREF, MVCL_DEBITO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_ABONO
    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, :RCREE, :ABONO
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipo INTO :tipodoc;
    if (abono = 'N') then
      begin
      if (RETES = 'SI') then
        begin
        if (FAUTORET <= FECINI) then
            if (FAUTORCREE <= FECINI) then
                MONTO = MONTO - RTIVA - RTICA;
            else
                MONTO = MONTO - RTIVA - RTICA - RCREE;
        else
            if (FAUTORCREE <= FECINI) then
              MONTO = MONTO - RTFTE -RTIVA - RTICA;
            else
              MONTO = MONTO - RTFTE -RTIVA - RTICA - RCREE;
        end
      end
    else
      if (FAUTORCREE <= FECINI) then
        MONTO = MONTO - RTFTE -RTIVA - RTICA;
      else
        MONTO = MONTO - RTFTE -RTIVA - RTICA - RCREE;
        
--    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^


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(8),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(8),
    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^


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-MVPR_RCREE)
            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-MVPR_RCREE)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :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+MVPR_RCREE)
            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^


ALTER PROCEDURE CONCILIA_DEVCOMPRAS (
    FECINI DATE,
    FECFIN DATE,
    CTAEXE VARCHAR(20),
    CTAGRA VARCHAR(20),
    CTAOTRO VARCHAR(20))
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
begin
for select dvco_id, pref_pre, dvco_numero, enco_consec from devoluciones_compras f, comprobante_encabezado c
    where dvco_fecha >= :fecini and dvco_fecha <= :fecfin and dvco_id = enco_idref and enco_tiporef = 24
    into :idf, :pref, :numero, :idc
    do
    begin
    tarifa0 = 0;
    tarifa1 = 0;
    tarifa2 = 0;
    tarifa0c = 0;
    tarifa1c = 0;
    tarifa2c = 0;
    select SUM(CAST(DVCD_CANT AS DOUBLE PRECISION) * (DVCD_PRUNIT-DVCD_DTOMONTO))
        FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :idf and dvcd_ivaporc = 0 into :tarifa0;
    select SUM(CAST(DVCD_CANT AS DOUBLE PRECISION) * (DVCD_PRUNIT-DVCD_DTOMONTO))
        FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :idf and dvcd_ivaporc = 16 into :tarifa1;
    select SUM(CAST(DVCD_CANT AS DOUBLE PRECISION) * (DVCD_PRUNIT-DVCD_DTOMONTO))
        FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :idf and dvcd_ivaporc <> 16 and dvcd_ivaporc <> 0 into :tarifa2;
    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^


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(8),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(8),
    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^


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);
declare variable IDR INTEGER;
begin
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
IDR = GEN_ID(id_reputilidad, 1);
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;
    if ((IDF >= 51) AND (IDF <= 52)) then
        SELECT MAX(I.tico_cod) FROM interfaz_cxpagar 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;
    INSERT INTO reportes_aux (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (:IDR, USER, :TICO);
    if ((SOLODIF <> 'S') or (ENTRADASC <> ENTRADAS) or (SALIDASC <> SALIDAS)) then
        SUSPEND;
    END
FOR SELECT MAX(E.tico_cod), MAX(E.enco_tiporef), 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 NOT EXISTS (SELECT REPA_ID FROM reportes_aux WHERE REPA_ARTICULO = E.tico_cod)
    GROUP BY TICO_COD
    INTO :TICO, :IDF, :ENTRADASC, :SALIDASC
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :IDF INTO :TIPODOC;
    ENTRADAS = 0;
    SALIDAS = 0;
    SUSPEND;
    END
end^


ALTER PROCEDURE CONCILIA_PAT_DETALLE (
    ANO CHAR(4),
    MES INTEGER,
    CUENTA VARCHAR(20))
RETURNS (
    ID INTEGER,
    CONSEC INTEGER,
    TICO VARCHAR(3),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CONCEPTO VARCHAR(60),
    DB2649 NUMERIC(18,2),
    CR2649 NUMERIC(18,2),
    DBNIIF NUMERIC(18,2),
    CRNIIF NUMERIC(18,2),
    DIF NUMERIC(18,2))
AS
begin
ID = GEN_ID(id_conciliapatd, 1);
FOR SELECT CE.ENCO_CONSEC, CD.code_debito, CD.code_credito
    FROM comprobante_encabezado CE, COMPROBANTE_DETALLE CD
    WHERE CE.enco_consec = CD.enco_consec AND SUBSTRING(ENCO_FECHA FROM 1 FOR 4) = :ANO AND CAST(SUBSTRING(ENCO_FECHA FROM 5 FOR 2) AS INTEGER) = :MES AND CUEN_COD = :CUENTA
    INTO :CONSEC, :DB2649, :CR2649
    DO
    BEGIN
    insert into CONCILIACION_PAT_DET (COPD_ID, COPD_CONSEC, COPD_DB2649, COPD_CR2649, COPD_DBNIIF, COPD_CRNIIF)
        values (:ID, :CONSEC, :DB2649, :CR2649, 0, 0);
    END
FOR SELECT CE.ENCO_CONSEC, CN.code_debito, CN.code_credito
    FROM comprobante_encabezado CE, comprobante_detalle_niif CN
    WHERE CE.enco_consec = CN.enco_consec AND SUBSTRING(ENCO_FECHA FROM 1 FOR 4) = :ANO AND CAST(SUBSTRING(ENCO_FECHA FROM 5 FOR 2) AS INTEGER) = :MES AND CUEN_COD = :CUENTA
    INTO :CONSEC, :DBNIIF, :CRNIIF
    DO
    BEGIN
    if (EXISTS (SELECT COPD_ID FROM CONCILIACION_PAT_DET WHERE COPD_ID = :ID AND COPD_CONSEC = :CONSEC )) then
        UPDATE CONCILIACION_PAT_DET SET COPD_DBNIIF = :DBNIIF, COPD_CRNIIF = :CRNIIF
            WHERE COPD_ID = :ID AND COPD_CONSEC = :CONSEC;
    ELSE
        insert into CONCILIACION_PAT_DET (COPD_ID, COPD_CONSEC, COPD_DB2649, COPD_CR2649, COPD_DBNIIF, COPD_CRNIIF)
            values (:ID, :CONSEC, 0, 0, :DBNIIF, :CRNIIF);
    END
for select COPD_ID, COPD_CONSEC, COPD_DB2649, COPD_CR2649, COPD_DBNIIF, COPD_CRNIIF, COPD_DIF
    from CONCILIACION_PAT_DET
    WHERE COPD_ID = :ID ORDER BY COPD_CONSEC
    into :ID, :CONSEC, :DB2649, :CR2649, :DBNIIF, :CRNIIF, :DIF
    DO
    BEGIN
    SELECT TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, ENCO_CONCEPTO FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = :CONSEC
        INTO :TICO, :PREF, :NUMERO, :FECHA, :CONCEPTO;
    suspend;
    END
end^


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(8),
    FECHA DATE,
    COMPROBA VARCHAR(3),
    NUMCNT VARCHAR(8),
    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^


ALTER PROCEDURE CONCILIACION_PATRIMONIAL (
    ANO CHAR(4),
    MES INTEGER,
    NIVSAL INTEGER)
RETURNS (
    CUENTA VARCHAR(20),
    NOMBRE VARCHAR(60),
    CUENTANIIF VARCHAR(20),
    NOMBRENIIF VARCHAR(140),
    SALDO NUMERIC(18,2),
    SALDONIIF NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2),
    PORCENTAJE NUMERIC(9,2),
    NIVEL INTEGER)
AS
declare variable PORCAUX NUMERIC(18,2);
begin
DELETE FROM CONCILIACION_PAT;
/* pase cuentas colgap y llene tabla */
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_ACTIVA = 'S'
    ORDER BY CUEN_COD
    INTO :CUENTA, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
    EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, :ANO, :mes,  'S') returning_values (:SALDO);
    INSERT INTO CONCILIACION_PAT(CUENTAREF, CTALOCAL, CTALOCALNOM, SALDOLOCAL, NIVEL, CTANIIF, CTANIIFNOM, SALDONIIF)
        VALUES (:CUENTA, :cuenta,  :NOMBRE, :SALDO, :NIVEL, '', '', 0);
    END

/* pase cuentas Colgap y actualice las que existan e inserte las que no */
FOR SELECT CUEN_COD, CUEN_NOM FROM cuentas_niif WHERE CUEN_ACTIVA = 'S'
    ORDER BY CUEN_COD
    INTO :CUENTANIIF, :NOMBRENIIF
    DO
    BEGIN
    EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTANIIF) RETURNING_VALUES (:NIVEL);
    EXECUTE PROCEDURE saldo_cuenta_mes_niif(cuentaniif, :ANO, :mes,  'S') returning_values (:SALDONIIF);
    if (EXISTS (SELECT CUENTAREF FROM CONCILIACION_PAT WHERE CUENTAREF = :CUENTANIIF)) then
        UPDATE CONCILIACION_PAT
            SET CTANIIF = :cuentaniif,
                CTANIIFNOM = :nombreniif,
                SALDONIIF = :saldoniif
            WHERE CUENTAREF = :CUENTANIIF;
    ELSE
        INSERT INTO CONCILIACION_PAT(CUENTAREF, CTALOCAL, CTALOCALNOM, SALDOLOCAL, CTANIIF, CTANIIFNOM, SALDONIIF, NIVEL)
            VALUES (:CUENTANIIF, '', '', 0, :cuentaniif,  :nombreniif, :saldoniif, :NIVEL);
    END

/* genere el reporte en orden de cuentas ambas (no se muestra) */
FOR SELECT CTALOCAL, CTALOCALNOM, SALDOLOCAL, CTANIIF, CTANIIFNOM, SALDONIIF, NIVEL
    FROM CONCILIACION_PAT ORDER BY CUENTAREF
    INTO :CUENTA, :NOMBRE, :SALDO, :CUENTANIIF, :NOMBRENIIF, :SALDONIIF, :NIVEL
    DO
    BEGIN
    if (NIVEL <= NIVSAL) then
        BEGIN
        DIFERENCIA = SALDONIIF - SALDO;
        if (SALDO <> 0) then
            PORCAUX = (DIFERENCIA / SALDO) * 100;
        else
            PORCAUX = 0;
        if (PORCAUX > 9999999) then
            PORCENTAJE = 9999999;
        else
            PORCENTAJE = PORCAUX;
        suspend;
        END
    END
end^


ALTER PROCEDURE CONFIRMA_RUTERO_FAC (
    TIPO INTEGER,
    RUTA INTEGER,
    FECHA DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


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^


ALTER PROCEDURE CONSECUTIVOS_CONTA (
    TIPOINI VARCHAR(3),
    TIPOFIN VARCHAR(3),
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    CONSOLIDADO CHAR(1),
    NIIF CHAR(1))
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMTIPO VARCHAR(60))
AS
BEGIN
if (NIIF = 'N') then
  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
else
  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_niif 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_niif 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
END^


ALTER PROCEDURE CONSIGNA_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO FROM CONSIGNA
    WHERE CONS_ANULADO = 'N' AND CONS_FECHA >= :FECINI AND CONS_FECHA <= :FECFIN
    ORDER BY CONS_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 71 AND CUBA_COD = :CTA INTO :IDI;
    if (IDI is NOT NULL) then
      BEGIN
      if (CN <> 'N') then
        EXECUTE PROCEDURE CONTABIL_CONSIGNA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
      else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
      if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_consigna_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
      if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
      ELSE
        ESTADO = 'ERROR';
      suspend;
      END
  end
  END
END^


ALTER PROCEDURE CONSOLIDA_ARTICULOS (
    ARTICULOV VARCHAR(20),
    ARTICULON VARCHAR(20))
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE CONSOLIDA_CONC_NOMINA (
    ID_NOMINA INTEGER)
RETURNS (
    ID INTEGER)
AS
DECLARE VARIABLE noco_item INTEGER;
DECLARE VARIABLE nit VARCHAR(20) CHARACTER SET none;
DECLARE VARIABLE valor NUMERIC(18,2);
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 aporte CHAR(1) CHARACTER SET none;
DECLARE VARIABLE conc_cod VARCHAR(5);
declare variable ABONO numeric(18, 2);
BEGIN
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_PERIODO, NOCO_ANO, noco_deduc, noco_aporte
    FROM NOMINA_CONCEPTOS WHERE NOMI_ID = :id_nomina AND NOCO_gtoempr = 'N' AND NOCO_PROV = 'N'
    INTO :noco_item, :conc_cod, :nit, :valor, :periodo, :ano, :deduc, :aporte
    DO
    BEGIN
    IF (valor <> 0) THEN
        BEGIN
        SELECT SUM(c.cono_abono) FROM consolidado_nomina C
            WHERE C.cono_idori = :id_nomina AND C.terc_nit = :nit  and c.cono_pagook = 'S'
            AND C.cono_tipoori = 92 AND C.cono_deb = 'S' INTO :ABONO;
        if (ABONO IS NULL) then
            ABONO = 0;
        IF (ABONO = 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_APORTE, cono_deb)
                VALUES (:id, :noco_item, 91, 92, :id_nomina, :periodo, :ano, :valor, :conc_cod, :nit, 'N', :periodi, :deduc, :aporte, 'N');
        END
    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);
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^


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^


ALTER PROCEDURE CONSOLIDADO_PROVISIONES (
    ANO CHAR(4),
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    INACTIVOS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    VACACION NUMERIC(18,2),
    PROVVAC NUMERIC(18,2),
    PAGOVAC NUMERIC(18,2),
    SALARIOV NUMERIC(18,2),
    DIASV INTEGER,
    FECHAV DATE,
    CESANTIA NUMERIC(18,2),
    PAGOCES NUMERIC(18,2),
    PROVCES NUMERIC(18,2),
    SALARIOC NUMERIC(18,2),
    FECHAC DATE,
    INTCES NUMERIC(18,2),
    PAGOICES NUMERIC(18,2),
    PROVICES NUMERIC(18,2),
    PRIMA NUMERIC(18,2),
    PROVPRI NUMERIC(18,2),
    SALARIOP NUMERIC(18,2),
    FECHAP DATE,
    PAGOPRI NUMERIC(18,2))
AS
declare variable CONCEPTO integer;
declare variable FECFIN date;
declare variable PRESTAMO numeric(18,2);
declare variable CARTERA numeric(18,2);
declare variable TOTAL numeric(18,2);
declare variable TOTALDES numeric(18,2);
declare variable TOTALPAGOS numeric(18,2);
declare variable MONTO numeric(18,2);
begin
FECFIN = ANO || '/12/31';
FOR SELECT DISTINCT TERC_NIT FROM NOMINA_CONCEPTOS NC
    WHERE NC.noco_ano = :ANO AND NC.TERC_NIT >= :NITINI AND NC.TERC_NIT <= :NITFIN AND
    ((:INACTIVOS = 'S') or (EXISTS (SELECT TERC_NIT FROM EMPLEADOS WHERE TERC_NIT = NC.terc_nit AND ((EMPL_FECRET IS NULL) or (EMPL_FECRET > :FECFIN)))))
    INTO :NIT
    DO
    BEGIN
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nombre;
    FOR SELECT MAX(CONC_COD), SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
        WHERE NC.noco_ano = :ANO AND NC.noco_prov = 'S' AND NC.terc_nit = :NIT
        GROUP BY NC.conc_cod
        INTO :concepto, :MONTO
        DO
        BEGIN
        if ((CONCEPTO = 912) or (CONCEPTO = 913) or (CONCEPTO = 937)) then -- CESANTIA
            BEGIN
            PROVCES = MONTO;
            SELECT SUM(NOCO_VALOR) FROM nomina_conceptos WHERE TERC_NIT = :NIT AND NOCO_ANO = :ANO AND  ((CONC_COD = 951) or (CONC_COD = 969))
                INTO :PAGOCES;
            END
        if ((CONCEPTO = 923) or (CONCEPTO = 924) or (CONCEPTO = 941)) then -- INT. CESANTIA
            BEGIN
            PROVICES = MONTO;
            SELECT SUM(NOCO_VALOR) FROM nomina_conceptos WHERE TERC_NIT = :NIT AND NOCO_ANO = :ANO AND CONC_COD = 968
                INTO :pagoices;
            END
        if ((CONCEPTO = 925) or (CONCEPTO = 927) or (CONCEPTO = 942)) then -- PRIMA
            BEGIN
            PROVPRI = MONTO;
            SELECT SUM(NOCO_VALOR) FROM nomina_conceptos WHERE TERC_NIT = :NIT AND NOCO_ANO = :ANO AND ((CONC_COD = 966) or (CONC_COD = 967))
                INTO :PAGOPRI;
            END
        if ((CONCEPTO = 929) or (CONCEPTO = 930) or (CONCEPTO = 944)) then -- VACACIONES
            BEGIN
            PROVVAC = MONTO;
            SELECT SUM(NOCO_VALOR) FROM nomina_conceptos WHERE TERC_NIT = :NIT AND NOCO_ANO = :ANO AND ((CONC_COD = 949) or (CONC_COD = 950))
                INTO :PAGOVAC;
            END
        END
    if (PAGOCES IS NULL) then
        PAGOCES = 0;
    if (PAGOICES IS NULL) then
        PAGOICES = 0;
    if (PAGOPRI IS NULL) then
        PAGOPRI = 0;
    if (PAGOVAC IS NULL) then
        PAGOVAC = 0;
    /* PENDIENTE POR PAGAR */
    EXECUTE PROCEDURE liquidacion_empleado (:NIT, :fecfin, 0)
        returning_values (SALARIOP, PRIMA, :fechap, SALARIOC, :fechac, cesantia, intces,
            SALARIOV, :fechav, diasv, :vacacion, prestamo, :cartera, :totalpagos, :totaldes, :total);
    suspend;
    END
end^


ALTER PROCEDURE CONSOLIDE_AJUSTES (
    FECHA DATE,
    PREF VARCHAR(4),
    BOD VARCHAR(2),
    CEROS CHAR(1))
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);
declare variable EXI CHAR(1);
begin
ID = 0;
if (exists (SELECT AJUS_ID FROM AJUSTES WHERE AJUS_FECHA = :FECHA AND AJUS_NOAJUSTAR = 'S' AND AJUS_ANULADO = 'N' 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, AJUS_PASADA)
        VALUES (:id, 14, :PREF, :BOD, '000001', :FECHA, 'AJUSTE CONSOLIDADO ' || :FECHA, 'N', 'N', NULL, USER, 'N', 'S', NULL,3);
    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 and ((AJUS_PASADA = 2) or (AJUS_PASADA = 3)) AND AJUS_ANULADO = 'N' 
        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
    if (CEROS = 'S') then
        BEGIN
        /* AGREGUE LOS ARTICULOS NO CONTADOS CON EXISTENCIA CERO */
        FOR SELECT A.arti_cod, A.arti_exist FROM ARTICULO A WHERE A.esar_cod <> 'I' AND EXISTS (SELECT EXIS_FECHA FROM EXISTENCIA E WHERE arti_cod = A.arti_cod AND E.bode_cod = :bod)
            AND NOT EXISTS (SELECT AJUS_ITEM FROM AJUSTES_DETALLE WHERE AJUS_ID = :ID AND ARTI_COD = A.arti_cod)
            INTO :CODIGO, :EXI
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :CODIGO INTO :DES, :UNIDAD;
            EXECUTE PROCEDURE costo_promedio(:CODIGO, :FECHA) returning_values (:COSTO);
            if (EXI = 'B') then
                BEGIN
                ITEM = ITEM + 1;
                EXECUTE PROCEDURE saldo_inventario(:CODIGO, :BOD, :FECHA) returning_values (:CANTANT);
                if (CANTANT <> 0) then
                    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, 0, :UNIDAD, :LOTE, 1, :CODIGO, 'N', :DES, NULL, 'N', :COSTO);
                END
            ELSE
                BEGIN
                FOR SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :CODIGO AND BODE_COD = :BOD INTO :LOTE
                    DO
                    BEGIN
                    ITEM = ITEM + 1;
                    EXECUTE PROCEDURE saldo_lote_fecha(:CODIGO, :BOD, :LOTE, :FECHA) returning_values (:CANTANT);
                    if (CANTANT <> 0) then
                        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, 0, :UNIDAD, :LOTE, 1, :CODIGO, 'N', :DES, NULL, 'N', :COSTO);
                    END
                END
            END
        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^


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 REF VARCHAR(60);
declare variable OBS blob;
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 = 18) then
        BEGIN
        FOR SELECT O.orid_item, ARTI_COD, O.orid_codbar, O.orin_costo, O.orid_desc, O.bode_cod, O.orid_dtoporc, O.orid_lote
            FROM ordeninventario_detalle O
            WHERE O.orin_id = :IDORI ORDER BY O.orid_item INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE
            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)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE);
                ITCONS = ITCONS + 1;
                END
            END
        END
    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_REFERENCIA, FCDE_OBS from FACTURAS_COMPRAS_DETALLE
            where FACO_ID = :IDORI order by FCDE_ITEM into :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :ref,  :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_REF, CODE_OBSIT)
                    values (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :REF, :OBS);
                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, FADE_REFERENCIA, FADE_OBS from FACTURAS_DETALLE
            where FACT_ID = :IDORI order by FADE_ITEM into :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :ref, :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, COFA_LISTA, CODE_REF, CODE_OBSIT)
                    values (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :REF, :OBS);
                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_REFERENCIA, RVDE_OBS from remisiones_venta_detalle
            where REVT_ID = :IDORI order by RVDE_ITEM into :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :ref, :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, COFA_LISTA, CODE_REF, CODE_OBSIT)
                    values (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :REF, :OBS);
                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, d.pede_referencia, d.pede_obs 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, :REF, :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, COFA_LISTA, CODE_REF, CODE_OBSIT)
                    values (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :ref,  :OBS);
                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_REFERENCIA, CTDE_OBS 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, :REF, :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, COFA_LISTA, CODE_REF, CODE_OBSIT)
                    values (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :REF, :OBS);
                ITCONS = ITCONS + 1;
                end
            end
        end
    if (TIPORI = 40) then
        BEGIN
        FOR SELECT PEVD_ITEM, ARTI_COD, PEVD_CORBAR, PEVD_PRUNIT, SUBSTRING(PEVD_DESC FROM 1 FOR 60), D.BODE_COD, PEVD_DTOPORC, NULL, CAST('NOW' AS DATE), 1, PEVD_OBS, PEVD_REFERENCIA
            FROM pendiente_ventas_detalle D, pendiente_ventas P
            WHERE P.pend_id = :IDORI AND P.pend_id = D.pend_id ORDER BY PEVD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 139) then
        begin
        for select d.slde_item, d.arti_cod, d.slde_codbar, d.slde_prunitmon, d.slde_desc, null, d.slde_dtoporc, null, cast('NOW' as date) from solicitud_importacion_det d
            where d.slim_id = :IDORI order by d.slde_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
    end /* FOR CONSOLIDE */
end^


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(8);
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^


ALTER PROCEDURE CONSULTA_ARTICULOS (
    INACTIVOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    GRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    CONSUMO NUMERIC(18,2),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    CODIGO1 VARCHAR(20),
    CODIGO2 VARCHAR(20),
    CODIGO3 VARCHAR(20),
    UNIDAD2 VARCHAR(8),
    FACTOR2 NUMERIC(18,4),
    UNIDAD3 VARCHAR(8),
    FACTOR3 NUMERIC(18,4))
AS
declare variable I INTEGER;
declare variable BARRAS VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
BEGIN
FOR select a.arti_cod, arti_des, grup_cod, arti_unidad, arti_consumo, esar_cod, taiv_porc, marc_cod
    from articulo a, tarifa_iva t
    where a.taiv_cod = t.taiv_cod
    INTO :CODIGO, :DES, :GRUPO, :UNIDAD, :CONSUMO, :ESTADO, :IVA, :MARCA
    do
    BEGIN
    if ((INACTIVOS = 'S') or (ESTADO = 'A') or ((INACTIVOS = 'C') AND (ESTADO = 'N')) ) then
        begin
        I = 0;
        CODIGO1 = '';
        CODIGO2 = '';
        CODIGO3 = '';
        for SELECT COBA_COD FROM BARRAS_ARTICULO WHERE ARTI_COD = :CODIGO INTO :BARRAS
            DO
            BEGIN
            I = I + 1;
            if (I = 1) then
                CODIGO1 = BARRAS;
            if (I = 2) then
                CODIGO2 = BARRAS;
            if (I = 3) then
                CODIGO3 = BARRAS;
            END
        I = 0;
        UNIDAD2 = '';
        UNIDAD3 = '';
        for SELECT UNAR_UNIDAD, UNAR_FACCAN FROM UNIDAD_ARTICULO WHERE ARTI_COD = :CODIGO INTO :BARRAS, :FACTOR
            DO
            BEGIN
            I = I + 1;
            if (I = 1) then
                BEGIN
                UNIDAD2 = BARRAS;
                FACTOR2 = FACTOR;
                END
            if (I = 2) then
                BEGIN
                UNIDAD3 = BARRAS;
                FACTOR3 = FACTOR;
                END
            SUSPEND;
            end
        END
    END
END^


ALTER PROCEDURE CONSULTA_ARTICULOS_MOVIL (
    BUSCAR VARCHAR(100))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    DESCORTA VARCHAR(30),
    GRUPO VARCHAR(30),
    SUBGR VARCHAR(3),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ALTERNATIVA VARCHAR(30),
    IVA NUMERIC(9,2),
    CONSUMO NUMERIC(18,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
declare variable FECHA DATE;
declare variable CODBOD VARCHAR(2);
declare variable EXISTOT VARCHAR(6);
BEGIN
EXISTEN = 0;
FECHA = cast('now' as DATE);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'PEDIDOS', 'VALIDAR EXISTENCIA TOTAL O SOLO EN LA BODEGA INDICADA EN EL PUNTO DE VENTA') returning_values (:EXISTOT);
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;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
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, arti_descorta, grup_cod, subg_cod, arti_unidad, taiv_porc, marc_cod, ARTI_CONSUMO, ARTI_OBS, ARTI_FOTO
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            (esar_cod = 'A') AND (upper(A.ARTI_DES) like upper(:buscar))
            INTO :CODIGO, :DES, :DESCORTA, :GRUPO, :SUBGR, :UNIDAD, :IVA, :MARCA, :CONSUMO, :OBS, :FOTO
            do                                                                                         
            begin
            EXECUTE PROCEDURE NOMBRE_ASCII(DES) returning_values (DES);
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO GRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO MARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGR AND GRUP_COD = :GRUPO INTO :SUBGR;
            EXECUTE PROCEDURE NOMBRE_ASCII(GRUPO) returning_values (GRUPO);
            EXECUTE PROCEDURE NOMBRE_ASCII(SUBGR) returning_values (SUBGR);
            EXECUTE PROCEDURE NOMBRE_ASCII(MARCA) returning_values (MARCA);
            ALTERNATIVA = '';
            select FIRST 1 unar_unidad || ' x ' || unar_faccan FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :alternativa;
            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
                if (EXISTOT = 'TOTAL') then
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                ELSE
                    BEGIN
                    select first 1 bode_cod from punto_venta p, usuario u where u.user_cod = USER and ((u.sucu_id = p.sucu_id) or (u.sucu_id = 0))  into :codbod;
                    EXECUTE PROCEDURE saldo_inventario (:CODIGO, :CODBOD, :FECHA) returning_values (:EXISTEN);
                    END
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (ok = 'S') then
                SUSPEND;
            end
    END
END^


ALTER PROCEDURE CONSULTA_ARTICULOS_MOVILC (
    BUSCAR VARCHAR(100))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    DESCORTA VARCHAR(30),
    GRUPO VARCHAR(30),
    SUBGR VARCHAR(3),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ALTERNATIVA VARCHAR(30),
    IVA NUMERIC(9,2),
    CONSUMO NUMERIC(18,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
declare variable FECHA DATE;
declare variable CODBOD VARCHAR(2);
declare variable EXISTOT VARCHAR(6);
BEGIN
EXISTEN = 0;
FECHA = cast('now' as DATE);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'PEDIDOS', 'VALIDAR EXISTENCIA TOTAL O SOLO EN LA BODEGA INDICADA EN EL PUNTO DE VENTA') returning_values (:EXISTOT);
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;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
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, arti_descorta, grup_cod, subg_cod, arti_unidad, taiv_porc, marc_cod, ARTI_CONSUMO, ARTI_OBS, ARTI_FOTO
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            (esar_cod = 'A') AND A.ARTI_COD LIKE :BUSCAR
            INTO :CODIGO, :DES, :DESCORTA, :GRUPO, :SUBGR, :UNIDAD, :IVA, :MARCA, :CONSUMO, :OBS, :FOTO
            do                                                                                         
            begin
            EXECUTE PROCEDURE NOMBRE_ASCII(DES) returning_values (DES);
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO GRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO MARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGR AND GRUP_COD = :GRUPO INTO :SUBGR;
            EXECUTE PROCEDURE NOMBRE_ASCII(GRUPO) returning_values (GRUPO);
            EXECUTE PROCEDURE NOMBRE_ASCII(SUBGR) returning_values (SUBGR);
            EXECUTE PROCEDURE NOMBRE_ASCII(MARCA) returning_values (MARCA);
            ALTERNATIVA = '';
            select FIRST 1 unar_unidad || ' x ' || unar_faccan FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :alternativa;
            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
                if (EXISTOT = 'TOTAL') then
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                ELSE
                    BEGIN
                    select first 1 bode_cod from punto_venta p, usuario u where u.user_cod = USER and ((u.sucu_id = p.sucu_id) or (u.sucu_id = 0))  into :codbod;
                    EXECUTE PROCEDURE saldo_inventario (:CODIGO, :CODBOD, :FECHA) returning_values (:EXISTEN);
                    END
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (ok = 'S') then
                SUSPEND;
            end
    END
END^


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),
    UNIDAD1 VARCHAR(8),
    PRECIO1 NUMERIC(18,2),
    UNIDAD2 VARCHAR(8),
    PRECIO2 NUMERIC(18,2),
    UNIDAD3 VARCHAR(8),
    PRECIO3 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);
declare variable UNI2 VARCHAR(8);
declare variable FAC2 NUMERIC(18,4);
BEGIN
select count(arti_cod) from BARRAS_ARTICULO WHERE COBA_COD = :CODIGO INTO :ITEMS;
if (ITEMS > 0) then
    SELECT first 1 ARTI_COD, COBA_DES, COBA_UNIDAD from BARRAS_ARTICULO
        WHERE COBA_COD = :CODIGO INTO :ARTICULO, :DES, :UNIDAD;
ELSE
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD FROM ARTICULO
        WHERE ARTI_COD = :CODIGO INTO :ARTICULO, :DES, :UNIDAD;

EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
FOR select grup_cod, taiv_porc, marc_cod, ARTI_OBS, ARTI_PESO, ARTI_LARGO, ARTI_ALTO, ARTI_ANCHO, ARTI_FOTO
    from articulo a, tarifa_iva t
    where a.taiv_cod = t.taiv_cod AND ESAR_COD = 'A' AND A.arti_cod = :ARTICULO
    INTO :CODGRP, :IVA, :CODMAR, :observaciones, :peso, :largo, :alto, :ancho, :foto
    do
    begin
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRP INTO :GRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMAR INTO :MARCA;
    select first 1 ftar_imagen from fotos_articulo where arti_cod = :articulo and ftar_imagen is not null into :foto;
    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
        BEGIN
        IVAMONTO = PRECIO * IVA / 100;
        TOTAL = PRECIO + IVAMONTO + CONSUMO;
        END
    ELSE
        BEGIN
        TOTAL = PRECIO;
        IVAMONTO = (PRECIO - CONSUMO) * IVA / (100 + IVA);
        PRECIO = (PRECIO - CONSUMO) / (1 + (IVA/100));
        END
    ITEMS = 0;
    PRECIO1 = 0;
    UNIDAD1 = '';
    PRECIO2 = 0;
    UNIDAD2 = '';
    PRECIO3 = 0;
    UNIDAD3 = '';
    for select unar_unidad, unar_facpre from unidad_articulo where arti_cod = :articulo
        into :uni2, fac2
        do
        begin
        ITEMS = ITEMS + 1;
        if (ITEMS = 1) then
            BEGIN
            UNIDAD1 = UNI2;
            PRECIO1 = TOTAL * FAC2;
            END
        if (ITEMS = 2) then
            BEGIN
            UNIDAD2 = UNI2;
            PRECIO2 = TOTAL * FAC2;
            END
        if (ITEMS = 3) then
            BEGIN
            UNIDAD3 = UNI2;
            PRECIO3 = TOTAL * FAC2;
            END
        end
    SUSPEND;
    END
END^


ALTER PROCEDURE CONSULTA_ARTICULOS_VTAS (
    FECHA DATE,
    INACTIVOS CHAR(1),
    MODULO VARCHAR(20),
    BUSCAR VARCHAR(100),
    CUALQUIERA CHAR(1),
    COLUMNA INTEGER,
    BUSCAR2 VARCHAR(30),
    BUSCAR3 VARCHAR(30),
    BUSCAR4 VARCHAR(30),
    BUSCAR5 VARCHAR(30))
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    REF VARCHAR(20),
    GRUPO VARCHAR(30),
    SUBGR VARCHAR(3),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ESTADO VARCHAR(30),
    IVA NUMERIC(9,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    CLASE CHAR(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
declare variable USARDC CHAR(2);
declare variable DESCORTA VARCHAR(60);
declare variable EXISART 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);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'USAR DESCRIPCION CORTA EN LUGAR DE LA ESTANDAR EN BUSQUEDA Y DOCUMENTOS DE VENTA') returning_values (USARDC);
if ((USARDC = 'SI') AND (COLUMNA = 1)) then
    COLUMNA = 4;
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
      if (COLUMNA = 3) then
        BEGIN
        FOR select b.arti_cod, coba_cod from barras_articulo b, articulo a
            where (upper(b.coba_cod) like upper(:buscar)) and a.arti_cod = b.arti_cod and
            ((:INACTIVOS = 'S') or ((b.coba_activo = 'S') and (a.esar_cod = 'A')) or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            into :codigo, :ref
            do
            begin
            select arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA, arti_exist
                from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = :codigo
                INTO :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA, :EXISART;
            if (USARDC = 'SI') then
                DES = DESCORTA;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0) or (EXISART = 'N')) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (ok = 'S') then
                suspend;
            end
        END
      ELSE
        BEGIN
        FOR select a.arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA, ARTI_EXIST
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 4) or (upper(A.ARTI_DESCORTA) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA, :exisart
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0) or (EXISART = 'N')) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
        END
    ELSE
        FOR select a.arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA, ARTI_EXIST
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA, :EXISART
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0) or (EXISART = 'N')) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
      if (COLUMNA = 3) then
        BEGIN
        FOR select b.arti_cod, coba_cod from barras_articulo b, articulo a
            where (upper(b.coba_cod) like upper(:buscar)) and a.arti_cod = b.arti_cod and
            ((:INACTIVOS = 'S') or ((b.coba_activo = 'S') and (a.esar_cod = 'A')) or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            into :codigo, :ref
            do
            begin
            select arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA, ARTI_EXIST
                from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = :codigo
                INTO :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA, :EXISART;
            if (USARDC = 'SI') then
                DES = DESCORTA;
            if (EXIST = 'SI') then
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            suspend;
            end
        END
      ELSE
        begin
        FOR select arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase, ARTI_DESCORTA, ARTI_EXIST
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 4) or (upper(A.ARTI_DESCORTA) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE, :DESCORTA, :EXISART
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0) or (EXISART = 'N')) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
        END
    ELSE
        FOR select arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase, ARTI_DESCORTA, ARTI_EXIST
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE, :DESCORTA, :EXISART
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0) or (EXISART = 'N')) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END^


ALTER PROCEDURE CONSULTA_ARTICULOS_WEB (
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    UNIALT1 VARCHAR(8),
    FACTCN1 NUMERIC(18,2),
    FACTPR1 NUMERIC(18,2),
    UNIALT2 VARCHAR(8),
    FACTCN2 NUMERIC(18,2),
    FACTPR2 NUMERIC(18,2),
    UNIALT3 VARCHAR(8),
    FACTCN3 NUMERIC(18,2),
    FACTPR3 NUMERIC(18,2),
    CODGRP VARCHAR(2),
    NOMGRP VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    IVA NUMERIC(9,2),
    ESTAMPILLA NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    PRECIO2 NUMERIC(18,2),
    CANTMIN2 NUMERIC(18,2),
    PRECIO3 NUMERIC(18,2),
    CANTMIN3 NUMERIC(18,2),
    PRECIO4 NUMERIC(18,2),
    CANTMIN4 NUMERIC(18,2),
    BARRAS SMALLINT)
AS
DECLARE VARIABLE LISTA INTEGER;
declare variable DIG INTEGER;
declare variable I INTEGER;
declare variable uni VARCHAR(8);
declare variable facc NUMERIC(18,4);
declare variable facp NUMERIC(18,4);
declare variable CANTM NUMERIC(18,4);
declare variable FECAUD DATE;
declare variable HORAUD TIME;
declare variable FECULT DATE;
declare variable HORULT TIME;
declare variable OK CHAR(1);
BEGIN
BARRAS = 1;
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;
FOR select arti_cod, arti_des, grup_cod, subg_cod, marc_cod, arti_unidad, taiv_porc, arti_consumo
    from articulo a, tarifa_iva t
    where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and esar_cod = 'A'
    ORDER BY ARTI_COD
    INTO :CODIGO, :descripcion, :codgrp, :codsubg, :codmarca, :UNIDAD, :IVA, :estampilla
    do
    begin
    OK = 'N';

    SELECT FIRST 1 AUDI_FECHA, AUDI_HORA FROM AUDITORIA
        WHERE AUDI_COD = :CODIGO AND ((TIDO_COD = 101) or (TIDO_COD = 124) or (TIDO_COD = 126))
        ORDER BY AUDI_ID DESC
        INTO :FECAUD, :HORAUD;
    if ((FECAUD >= fecha) or (FECHA < '2016/01/01'))  then
        OK = 'S';
    if (OK =  'S') then
        BEGIN
        /* unidades alternativas */
        I = 0;
        unialt1 = '';
        factcn1 = 0;
        factpr1 = 0;
        unialt2 = '';
        factcn2 = 0;
        factpr2 = 0;
        unialt3 = '';
        factcn3 = 0;
        factpr3 = 0;
        for select first 3 u.unar_unidad, u.unar_faccan, u.unar_facpre from unidad_articulo u
            where arti_cod = :codigo and u.unar_activa = 'S'
            into :uni, :facc, :facp
            DO
            BEGIN
            if (I = 0) then
                BEGIN
                unialt1 = uni;
                factcn1 = facc;
                factpr1 = facp;
                END
            if (I = 1) then
                BEGIN
                unialt2 = uni;
                factcn2 = facc;
                factpr2 = facp;
                END
            if (I = 2) then
                BEGIN
                unialt3 = uni;
                factcn3 = facc;
                factpr3 = facp;
                END
            I = I + 1;
            END
        /* PRECIOS */
        I = 0;
        precio2 = 0;
        cantmin2 = 0;
        precio3 = 0;
        cantmin3 = 0;
        precio4 = 0;
        cantmin4 = 0;
        FOR SELECT FIRST 3 PRAR_FIJO, PRAR_REDON, PRAR_CANTMIN FROM PRECIOS_ARTICULO P
            WHERE ARTI_COD = :codigo AND LIPR_COD <> :LISTA ORDER BY PRAR_CANTMIN DESC
            INTO :PRECIO, :DIG, :cantm
            DO
            BEGIN
            EXECUTE procedure redondee(precio, DIG) returning_values (PRECIO);
            if (I = 0) then
                BEGIN
                precio2 = precio;
                cantmin2 = cantm;
                END
            if (I = 1) then
                BEGIN
                precio3 = precio;
                cantmin3 = cantm;
                END
            if (I = 2) then
                BEGIN
                precio4 = precio;
                cantmin4 = cantm;
                END
            I = I + 1;
            END
        SELECT PRAR_FIJO, PRAR_REDON FROM PRECIOS_ARTICULO WHERE ARTI_COD = :codigo AND LIPR_COD = :LISTA INTO :precio, :dig;
        EXECUTE procedure redondee(precio, DIG) returning_values (PRECIO);
        NOMGRP = '';
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :codgrp INTO :nomgrp;
        nomsubg = '';
        SELECT SUBG_NOM FROM SUBGRUPO WHERE GRUP_COD = :codgrp AND SUBG_COD = :codsubg INTO :nomsubg;
        nommarca = '';
        SELECT MARC_NOM FROM marcas WHERE MARC_COD = :codmarca INTO :nommarca;
        SUSPEND;
        END
    end
END^


ALTER PROCEDURE CONSULTA_BALANCE_MES (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1),
    NIVSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    NIVEL INTEGER,
    SUMINI NUMERIC(18,2),
    SUMDB NUMERIC(18,2),
    SUMCR NUMERIC(18,2),
    SUMFIN NUMERIC(18,2))
AS
DECLARE VARIABLE ACTIVA CHAR(1);
BEGIN
SUMINI = 0;
SUMDB = 0;
SUMCR = 0;
SUMFIN = 0;
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_ACTIVA  FROM CUENTAS order by CUEN_COD INTO CODIGO, NOMBRE, ACTIVA
DO
  BEGIN
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  if (NIVEL <= NIVSAL) then
    BEGIN
    EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
    EXECUTE PROCEDURE MOVIMIENTOS_CUENTA_MES(CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);

    FINAL = INICIAL + DEBITOS - CREDITOS;
    if (NIVEL = 1) then
      BEGIN
      SUMINI = SUMINI + INICIAL;
      SUMDB = SUMDB + DEBITOS;
      SUMCR = SUMCR + CREDITOS;
      SUMFIN = SUMFIN + FINAL;
      END
    
    if (((SIN_MOV = 'S') AND (ACTIVA = 'S')) or (FINAL <> 0) or (DEBITOS <> 0) or (CREDITOS <> 0))then
      SUSPEND;
    END
  END
END^


ALTER PROCEDURE CONSULTA_BALANCE_MES_NIIF (
    ANO CHAR(4),
    MES INTEGER,
    SIN_MOV CHAR(1),
    NIVSAL INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    NOMBRE VARCHAR(140),
    INICIAL NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    NIVEL INTEGER,
    SUMINI NUMERIC(18,2),
    SUMDB NUMERIC(18,2),
    SUMCR NUMERIC(18,2),
    SUMFIN NUMERIC(18,2))
AS
DECLARE VARIABLE ACTIVA CHAR(1);
BEGIN
SUMINI = 0;
SUMDB = 0;
SUMCR = 0;
SUMFIN = 0;
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_ACTIVA  FROM cuentas_niif order by CUEN_COD INTO CODIGO, NOMBRE, ACTIVA
DO
  BEGIN
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  if (NIVEL <= NIVSAL) then
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta_mes_niif(CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
    EXECUTE PROCEDURE movimientos_cuenta_mes_niif(CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);

    FINAL = INICIAL + DEBITOS - CREDITOS;
    if (NIVEL = 1) then
      BEGIN
      SUMINI = SUMINI + INICIAL;
      SUMDB = SUMDB + DEBITOS;
      SUMCR = SUMCR + CREDITOS;
      SUMFIN = SUMFIN + FINAL;
      END
    
    if (((SIN_MOV = 'S') AND (ACTIVA = 'S')) or (FINAL <> 0) or (DEBITOS <> 0) or (CREDITOS <> 0))then
      SUSPEND;
    END
  END
END^


ALTER PROCEDURE CONSULTA_CLIENTES
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CODIGO VARCHAR(20),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    COBR INTEGER,
    NOMCOBR VARCHAR(60),
    ESTADO CHAR(1))
AS
begin
FOR SELECT T.TERC_NIT, TERC_NOM, CLIE_COD, TERC_TEL, TERC_CIU, ZONA_COD, VEND_COD, COBR_COD, CLIE_ESTADO
    FROM TERCEROS T, CLIENTES C WHERE T.TERC_NIT = C.TERC_NIT ORDER BY T.TERC_NIT
    INTO :NIT, :NOMBRE, :CODIGO, :TEL, :CIU, :ZONA, :VEND, :COBR, :ESTADO
    DO
    BEGIN
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :ZONA into :NOMZONA;
    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND into :NOMVEND;
    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :COBR into :NOMCOBR;
    suspend;
    END
end^


ALTER PROCEDURE CONSULTA_EXISTENCIAS_WEB (
    FECHA DATE)
RETURNS (
    CODIGO VARCHAR(20),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    AGENCIA INTEGER,
    EXISTENCIA NUMERIC(18,2))
AS
declare variable EXISTANT NUMERIC(18,4);
begin
FOR SELECT ARTI_COD FROM ARTICULO WHERE ESAR_COD = 'A' AND SUBSTRING(ARTI_COD FROM 1 FOR 2) <> '.t' ORDER BY ARTI_COD INTO :CODIGO
    DO
    BEGIN
    FOR SELECT bodega, EXISTENCIA FROM existencias_menos_reserva(:CODIGO, :FECHA) INTO :CODBOD, :EXISTENCIA
        DO
        BEGIN
        existant = null;
        SELECT EXISTENCIA FROM existencias_articulo_web WHERE ARTICULO = :codigo AND BODEGA = :codbod INTO :existant;
        if (existant is null) then
            existant = 0;
        if (existant <> EXISTENCIA) then
            BEGIN
            delete from EXISTENCIAS_ARTICULO_WEB WHERE ARTICULO = :codigo AND BODEGA = :codbod;
            SELECT BODE_NOM, SUCU_ID FROM BODEGA WHERE BODE_COD = :codbod INTO :nombod, :AGENCIA;
            insert into EXISTENCIAS_ARTICULO_WEB (ARTICULO, BODEGA, EXISTENCIA)
                values (:CODIGO, :CODBOD, :EXISTENCIA);
            suspend;
            END
        END
    END
end^


ALTER PROCEDURE CONSULTA_PRESUPUESTO_MES (
    ANO CHAR(4),
    MES INTEGER,
    PROY CHAR(4),
    CENT CHAR(4))
RETURNS (
    CUENTA VARCHAR(20),
    NOMBRE VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
begin
if ((PROY <> '') AND (CENT <> '')) then
    begin
    FOR select p.cuen_cod, cuen_nom, pres_debito, pres_credito
        from presupuesto p, cuentas c
        where c.cuen_cod = p.Cuen_cod and pres_ano = :ANO AND pres_periodo = :MES and proy_cod = :PROY and cent_cod = :CENT
        order by p.cuen_cod
        into :cuenta, :nombre, :debito, :credito
        do
        begin
        suspend;
        end
    end
else
    begin
    FOR select max(p.cuen_cod), max(cuen_nom), sum(pres_debito), sum(pres_credito)
        from presupuesto p, cuentas c
        where c.cuen_cod = p.Cuen_cod and pres_ano = :ANO AND pres_periodo = :MES
        group by p.cuen_cod
        into :cuenta, :nombre, :debito, :credito
        do
        begin
        suspend;
        end
    end
end^


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^


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^


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 AND FACO_ANULADO = 'N' ORDER BY FACO_FECHA DESC
    INTO :CONSUMO;
if ((CONSUMO IS NULL) or (CONSUMO = 0))  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 AND FACO_ANULADO = 'N' ORDER BY FACO_FECHA
        INTO :CONSUMO;
if ((CONSUMO IS NULL) or (CONSUMO = 0))  then
    SELECT ARTI_CONSUMO FROM ARTICULO WHERE ARTI_COD = :ARTIC INTO :CONSUMO;
suspend;
end^


ALTER PROCEDURE CONSUMO_PRECIOS
AS
declare variable COD VARCHAR(20);
declare variable CONSUMO NUMERIC(18,2);
begin
FOR SELECT ARTI_COD, ARTI_CONSUMO FROM ARTICULO INTO :COD, :CONSUMO
DO
    UPDATE PRECIOS_ARTICULO SET PRAR_CONSUMO = :CONSUMO WHERE ARTI_COD = :COD;
end^


ALTER PROCEDURE CONTABIL_AJUSTE (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_TERCERO CHAR(1);
declare variable ES_CENTRO CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NITDET VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable NOAJUSTAR CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;

  if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 14 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DEL AJUSTE */
    SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, AJUS_ANULADO, AJUS_NOAJUSTAR
        FROM AJUSTES
        WHERE AJUS_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :ANULADO, :NOAJUSTAR;
    if ((ANULADO = 'N') AND (noajustar = 'N')) then
        BEGIN
        if (CENT = 'B') then
           SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, AJUSTES A
              WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, AJUSTES A
                WHERE P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND A.AJUS_ID = :IDDOC INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 14, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LOS AJUSTES POSITIVOS */
            FOR SELECT MAX(COAR_CTAINV), SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND AJUS_EXNUE > AJUS_EXANT
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEFINA EL TERCERO */
                    NITDET = NIT;
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                            WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE > AJUS_EXANT
                            INTO :ARTICULO, :MONTO
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */
            /* LOS AJUSTES NEGATIVOS */
            FOR SELECT MAX(COAR_CTAINV), SUM((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND AJUS_EXNUE < AJUS_EXANT
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEFINA EL TERCERO */
                    NITDET = NIT;
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                            WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE < AJUS_EXANT
                            INTO :ARTICULO, :MONTO
                            DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            CUENTA = :ctabase;
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO) FROM AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND AJUS_EXNUE > AJUS_EXANT INTO :MONTO;
        
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                        WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE > AJUS_EXANT 
                        INTO :ARTICULO, :MONTO
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            CUENTA = :ctabase;
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO) FROM AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND AJUS_EXNUE < AJUS_EXANT INTO :MONTO;
        
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, AJUSTES_DETALLE E
                        WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE < AJUS_EXANT
                        INTO :ARTICULO, :MONTO
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER AND INIC_CN <> 'N'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if ((:BASEADIC = 'SUBTOTAL') or (:BASEADIC = 'TOTAL')) then
                    SELECT SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO) FROM
                        AJUSTES_DETALLE WHERE AJUS_ID = :iddoc INTO :VALORADIC;
                MONTO = ABS(VALORADIC * PORCADIC / 100);
                END
            if (monto <> 0) then
                begin
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                end
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTACIERRE
                INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEFINA EL TERCERO */
            NITDET = NIT;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END /* EXISTE LA INTERFAZ */
      END
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (14, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END^


ALTER PROCEDURE CONTABIL_AJUSTE_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable CONCEPTO CHAR(60);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_TERCERO CHAR(1);
declare variable ES_CENTRO CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NITDET VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable NOAJUSTAR CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_IVAV, N.ININ_CONSUMO, N.ININ_TOTAL, N.ININ_CTABASE, N.ININ_CTAIVA, N.ININ_CTACONSUMO, N.ININ_CTACIERRE,
    ININ_CONFIRMAR, ININ_CENTRO, ININ_EQUIVALENCIA
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :NIIFEQ;

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


ALTER PROCEDURE CONTABIL_APLICACL (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(12);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable APLICADO NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
declare variable RETES CHAR(2);
BEGIN
execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCA_BASE, INCA_CLIE, INCA_CTABASE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;
if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 43 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA NOTA */
    SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, N.TERC_NIT, APCL_CONCEPTO, TERC_CTAVENTA,
        TERC_CTACLIENTE, APCL_ANULADO
        FROM aplicacion_cliente N, TERCEROS T
        WHERE N.APCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :TCTABASE, :TCTACLIEN, :ANULADO;

    if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, aplicacion_cliente N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 43 AND APCL_ID = :IDDOC INTO :CENTRO, :PROY;
        NUMERO = PREF || NUM;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        VENCE = FECHA;
        /* REGISTRE EL ENCABEZADO CONTABLE */
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 43, :IDDOC, :PREF, :NUM, 'N');
        NROI = 0;
        ERROR = 0;
        FOR SELECT ACDE_APLICADO+ACDE_RTFTE+ACDE_RTIVA+ACDE_RTICA, ACDE_PREFIJO || ACDE_NUMERO, ACDE_TIPODOC, ACDE_APLICADO
            FROM aplicacion_cliente_detalle WHERE APCL_ID = :IDDOC
            INTO :vrsubt, :numdoc, :tipodoc, :aplicado
            DO
            BEGIN
            if (RETES = 'SI') then
                vrsubt = aplicado;
            if (VRSUBT < 0) then
                BEGIN
                IF ((BASE = 'C') OR (BASE = 'K')) THEN
                    BEGIN
                    IF (BASE = 'C') THEN
                        CTABASE = TCTABASE;
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 43);
                        NROI = NROI + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                END /* SUBT < 0 */
            if ((VRSUBT > 0) and ((CLIE = 'C') or (CLIE = 'K'))) then
                BEGIN
                if (CLIE = 'C') then
                    CTACLIE = TCTACLIEN;
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :CTACLIE, 2);
                    CUENTA = CTACLIE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 42);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                end
            END /* for */
        END /* NO ANULADO */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_APLICACL_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(12);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable APLICADO NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
declare variable desc_rtes varchar(10);
declare variable fdesc_rtes date;
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCA_BASE, N.INCA_CLIE, N.INCA_CTABASE, N.INCA_CTACLIE, INCA_CONFIRMAR, INCA_EQUIVALENCIA
    FROM INTERFAZ_CARTERA I, interfaz_cartera_niif N
    WHERE I.INCA_ID = :IDINTER AND I.inca_id = N.inca_id
    INTO :EXISTE, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  BEGIN
  execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (:desc_rtes);
  if (strlen(desc_rtes) = 10) then
    fdesc_rtes = desc_rtes;
  else
    if (desc_rtes = 'SI') then
        fdesc_rtes = '1990/01/01';
    if (desc_rtes = 'NO') then
        fdesc_rtes = '9999/12/31';
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA NOTA */
    SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, N.TERC_NIT, APCL_CONCEPTO, TERC_CTAVENTA,
        TERC_CTACLIENTE, APCL_ANULADO
        FROM aplicacion_cliente N, TERCEROS T
        WHERE N.APCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :TCTABASE, :TCTACLIEN, :ANULADO;

    if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, aplicacion_cliente N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 43 AND APCL_ID = :IDDOC INTO :CENTRO, :PROY;
        NUMERO = PREF || NUM;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        VENCE = FECHA;
        /* REGISTRE EL ENCABEZADO CONTABLE */
        NROI = 100000;
        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 (fdesc_rtes <= FECAUX) then
                vrsubt = aplicado;
            if (VRSUBT < 0) then
                BEGIN
                IF ((BASE = 'C') OR (BASE = 'K')) THEN
                    BEGIN
                    IF (BASE = 'C') THEN
                        CTABASE = TCTABASE;
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT (1043, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT (1043, :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_niif
                    WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (1043, :IDDOC, :CTACLIE, 2);
                    CUENTA = CTACLIE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1043, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 42);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                end
            END /* for */
        END /* NO ANULADO */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (1043, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_APLICAPR (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
declare variable RETES CHAR(2);
declare variable APLICADO NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_PROV, INCP_CTABASE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;

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

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

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

    FOR SELECT APPD_APLICADO+APPD_RTFTE+APPD_RTIVA+APPD_RTICA, APPD_PREFIJO || APPD_NUMERO, APPD_TIPODOC, APPD_APLICADO
        FROM aplicacion_proveedor_detalle
        WHERE APPR_ID = :IDDOC
        INTO :vrsubt, :numdoc, :tipodoc, :aplicado
        DO
        BEGIN
        if (RETES = 'SI') then
            vrsubt = aplicado;
        IF ((VRSUBT < 0) AND ((BASE = 'T') OR (BASE = 'K'))) THEN
            BEGIN
            IF (BASE = 'T') THEN
                CTABASE = TCTABASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRSUBT), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRSUBT), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        if ((VRSUBT > 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
            BEGIN
            if (CLIE = 'T') then
                CTACLIE = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrsubt, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrsubt, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* CARTERA */
        END /* DO */
    END
  if (ERROR > 0) then
    VER = 'S';
  SUSPEND;
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_APLICAPR_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
declare variable RETES CHAR(2);
declare variable APLICADO NUMERIC(18,2);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCP_BASE, N.INCP_PROV, N.INCP_CTABASE, N.INCP_CTAPROV, INCP_CONFIRMAR, INCP_EQUIVALENCIA
  FROM INTERFAZ_CXPAGAR I, interfaz_cxpagar_niif N
  WHERE I.INCP_ID = :IDINTER AND I.incp_id = N.incp_id
  INTO :EXISTE, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    ERRORI = 0;
    if (EXISTE = 'S') then
      BEGIN
      /* TRAIGA EL ENCABEZADO DE LA NOTA */
      SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA, N.TERC_NIT, APPR_CONC, TERC_CTAVENTA, TERC_CTACLIENTE,
          APPR_ANULADO
        FROM aplicacion_provedor N, TERCEROS T
        WHERE N.APPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :TCTABASE, TCTACLIEN, ANULADO;
      if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, aplicacion_provedor N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 53 AND APPR_ID = :IDDOC INTO :CENTRO, :PROY;
        /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
        SELECT PROV_CTAPAGAR, PROV_CTACAUSA
            FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO TCTACLIEN, TCTABASE;
        NUMERO = PREF || NUM;
    
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    
        NROI = 100000;
    
        FOR SELECT APPD_APLICADO+APPD_RTFTE+APPD_RTIVA+APPD_RTICA, APPD_PREFIJO || APPD_NUMERO, APPD_TIPODOC, APPD_APLICADO
            FROM aplicacion_proveedor_detalle
            WHERE APPR_ID = :IDDOC
            INTO :vrsubt, :numdoc, :tipodoc, :aplicado
            DO
            BEGIN
            if (RETES = 'SI') then
                vrsubt = aplicado;
            IF ((VRSUBT < 0) AND ((BASE = 'T') OR (BASE = 'K'))) THEN
                BEGIN
                IF (BASE = 'T') THEN
                    CTABASE = TCTABASE;
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRSUBT), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRSUBT), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            if ((VRSUBT > 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
                BEGIN
                if (CLIE = 'T') then
                    CTACLIE = TCTACLIEN;
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CTACLIE, 2);
                    CUENTA = CTACLIE;
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrsubt, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrsubt, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* CARTERA */
            END /* DO */
        END
      if (ERRORI > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :PREF, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_CAMBCOSTO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable CANT NUMERIC(18,2);
declare variable NVOCOSTO NUMERIC(18,2);
declare variable ANTCOSTO NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROY, :centro;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL CAMBIO DE COSTO */
    SELECT PREF_PRE, CACO_NUMERO, CACO_FECHA, CACO_CONCEPTO, CACO_ANULADO, ARTI_COD, CACO_NVOCOSTO, CACO_ANTCOSTO
        FROM cambio_costo
        WHERE CACO_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :ANULADO, :ARTICULO, :NVOCOSTO, :ANTCOSTO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (:NIT);
        
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 10 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, cambio_costo E
            WHERE P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 10 AND E.caco_id = :IDDOC INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 10, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        EXECUTE PROCEDURE saldo_total_inventario(:ARTICULO, :fecaux) returning_values (:CANT);
        MONTO = CANT * (nvocosto - antcosto);
        if ((BASE = 'A') or (BASE = 'K'))  then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            if (BASE = 'A') then
                SELECT COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTABASE;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(10, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(10, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER AND INIC_CN <> 'N'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'TOTAL') then
                MONTO = MONTO * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(10, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(10, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(10, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(24, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(10, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(10, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(10, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END^


ALTER PROCEDURE CONTABIL_CAMBCOSTO_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable FECAUX DATE;
declare variable CONCEPTO CHAR(60);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable 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 CANT NUMERIC(18,2);
declare variable NVOCOSTO NUMERIC(18,2);
declare variable ANTCOSTO NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.ININ_BASE, N.ININ_CTABASE, N.ININ_CTACIERRE, ININ_CODPROY, ININ_CODCENT, inin_confirmar, ININ_EQUIVALENCIA
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :BASE, :CTABASE, :CTACIERRE, :PROY, :centro, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL CAMBIO DE COSTO */
    SELECT PREF_PRE, CACO_FECHA, CACO_CONCEPTO, CACO_ANULADO, ARTI_COD, CACO_NVOCOSTON, CACO_ANTCOSTON
        FROM cambio_costo
        WHERE CACO_ID = :IDDOC
        INTO :PREFIJO, :FECAUX, :CONCEPTO, :ANULADO, :ARTICULO, :NVOCOSTO, :ANTCOSTO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
        
    if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, cambio_costo E
            WHERE P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 10 AND E.caco_id = :IDDOC INTO :CENTRO, :PROY;
        NUMITEMS = 100000;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        EXECUTE PROCEDURE saldo_total_inventario(:ARTICULO, :fecaux) returning_values (:CANT);
        MONTO = CANT * (nvocosto - antcosto);
        if ((BASE = 'A') or (BASE = 'K'))  then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            if (BASE = 'A') then
                SELECT COAR_CTAINV FROM contabil_articulo_niif WHERE ARTI_COD = :articulo INTO :CTABASE;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1010, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1010, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER AND INIC_CN <> 'C'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'TOTAL') then
                MONTO = MONTO * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1010, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1010, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1010, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1010, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1010, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1010, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1010, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
  end
else
  begin
  --VER = 'N';
  end
SUSPEND;
END^


ALTER PROCEDURE CONTABIL_CHEQUE (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 71 AND CNTB_IDREF = :IDDOC;

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


ALTER PROCEDURE CONTABIL_CIERRE_COMP_INT (
    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 VRTOTAL numeric(18,2);
declare variable VREXTRA numeric(18,2);
declare variable TIPOCOMP varchar(3);
declare variable PREFCONT varchar(4);
declare variable INVEN char(1);
declare variable CTAINVEN varchar(20);
declare variable IVA char(1);
declare variable CTAIVA varchar(20);
declare variable CONSUMO char(1);
declare variable CTACONSUMO varchar(20);
declare variable CXP char(1);
declare variable CTACXP varchar(20);
declare variable RTFTE char(1);
declare variable CTARTFTE varchar(20);
declare variable RTIVA char(1);
declare variable CTARTIVA varchar(20);
declare variable RTICA char(1);
declare variable CTARTICA varchar(20);
declare variable RCREE char(1);
declare variable CTARCREE varchar(20);
declare variable CTADTO varchar(20);
declare variable CTAADIC varchar(20);
declare variable CTAEXTRA varchar(20);
declare variable EXISTE char(1);
declare variable CUENTA varchar(20);
declare variable MONTO numeric(18,2);
declare variable TIPOCUEN char(1);
declare variable NIT varchar(20);
declare variable NOMBRE varchar(60);
declare variable PROY varchar(4);
declare variable CENTRO varchar(4);
declare variable PROYDET varchar(4);
declare variable CENTRODET varchar(4);
declare variable NUMITEMS integer;
declare variable ARTICULO varchar(15);
declare variable IMPINC char(1);
declare variable IMPTOS numeric(18,2);
declare variable SUMA numeric(18,2);
declare variable PORCIVA numeric(9,2);
declare variable TCTAPROV varchar(20);
declare variable TCTARTFTE varchar(20);
declare variable TCTARTIVA varchar(20);
declare variable TCTARTICA varchar(20);
declare variable TCTARCREE varchar(20);
declare variable CUENTAADIC varchar(20);
declare variable BASEADIC varchar(20);
declare variable PORCADIC numeric(5,2);
declare variable VALORADIC numeric(18,2);
declare variable DBADIC char(1);
declare variable BODE_DET char(2);
declare variable NUMPROV varchar(10);
declare variable MERCANCIA numeric(18,2);
declare variable FACTOR double precision;
declare variable MENORV char(2);
declare variable DIG integer;
declare variable NETO numeric(18,2);
declare variable CENT char(1);
declare variable ANULADO char(1);
declare variable ERRORC integer;
declare variable SIMP char(1);
declare variable CTAIVARS varchar(20);
declare variable DEC1818 char(1);
begin
EXISTE = 'N';
select 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE,
    INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    from INTERFAZ_COMPRAS where INCO_ID = :IDINTER
    into :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :RCREE,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE,
    :CTARTIVA, :CTARTICA, :CTARCREE, :VER, :CENT;
if (EXISTE = 'S') then
    begin
    /* BORRE CONTABILIZACION PREVIA */
    delete from CONTABILIZACION where CNTB_TIPOREF = 132 and CNTB_IDREF = :IDDOC;

    select PREF_PRE, F.fapo_numero, FAPO_FECCIE, F.TERC_NIT, F.fapo_vence, F.fapo_dtomonto, F.fapo_adicional, F.fapo_ivamonto, F.fapo_extra, F.fapo_total,
        TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE, PROV_CTAPAGAR, F.fapo_anulado
        from factura_proforma F, TERCEROS T, PROVEEDORES P where FAPO_ID = :IDDOC and F.TERC_NIT = T.TERC_NIT and T.TERC_NIT = P.TERC_NIT
        into :PREFIJO, :NUM, :FECAUX, :NIT, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL,
        :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARCREE, TCTAPROV, :ANULADO;
    if (CENT = 'P') then        /* CENTRO DEL PREFIJO */
        select PREF_CENTRO, PREF_PROY from PREFIJOS P, factura_proforma F where P.PREF_PRE = F.PREF_PRE and F.fapo_id = :IDDOC and P.TIDO_COD = 137
            into :CENTRO, :PROY;
    else if (CENT = 'F') then        /* CENTRO DEL PREFIJO */
        select F.fapo_centro, F.fapo_proy from factura_proforma F where F.fapo_id = :IDDOC
            into :CENTRO, :PROY;
    else if (CENT = 'I') then
        select IMPO_CENTRO, IMPO_PROY from importacion I, factura_proforma F where I.impo_id = F.fapo_idimpor and F.fapo_id = :IDDOC
            into :CENTRO, :PROY;
    if (ANULADO = 'N') then
        begin
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        if (VENCEAUX < FECAUX) then
            VENCEAUX = FECAUX;
        execute procedure FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        execute procedure FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,36);
        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, '', 132, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        execute procedure lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        select sum(F.fpde_consumo) from factura_proforma_det F where fapo_id = :IDDOC into :valoradic;
        FACTOR = 1;

        DIG = -2;
        if (INVEN = 'A') then
            BEGIN
            for select max(COAR_CTACOMP), sum(f.fpde_total-f.fpde_ivamonto), sum(F.fpde_ivamonto), sum(F.fpde_consumo), max(F.BODE_COD)
                from ARTICULO A, CONTABIL_ARTICULO C, factura_proforma_det F where F.FAPO_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;
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(132, :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, (F.fpde_cant * (F.fpde_prunit-F.fpde_dtomonto)), F.fpde_ivamonto, F.fpde_consumo
                        from ARTICULO A, CONTABIL_ARTICULO C, factura_proforma_det F where F.fapo_id = :IDDOC and
                        F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and COAR_CTACOMP = :CUENTA
                        into :ARTICULO, :MONTO, :IMPTOS, :VALORADIC do
                        begin
                        MONTO = MONTO * 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_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, :MONTO, 0, 0, 0, :NIT,
                                :PROYDET, :CENTRODET, :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_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, :MONTO, 0, 0, 0, :NIT,
                               :PROY, :CENTRO, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        end
                    end
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                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, NULL, :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, NULL, :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') or (INVEN = 'I'))  then
            begin
            if (INVEN = 'I') then
                select i.impo_ctainv from factura_proforma f, importacion i where f.fapo_idimpor = i.impo_id
                    and f.fapo_id = :iddoc into :ctainven;
            for select sum(f.fpde_total-f.fpde_ivamonto), sum(F.fpde_ivamonto), sum(F.fpde_consumo), max(BODE_COD)
                from factura_proforma_det F where FAPO_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;
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(132, :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, (F.fpde_cant * (F.fpde_prunit-F.fpde_dtomonto)), F.fpde_ivamonto, F.fpde_consumo
                        FROM factura_proforma_det F WHERE FAPO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        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, NULL, :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, NULL, :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
                    TIPOCUEN = 'N';
                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_DOCTIPOA, CNDE_DOCTIPON)
                          values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, NULL, :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, 0, 0);
                    else
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, NULL, :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    end
                end
            end
        /* EL IVA */
        if ((IVA = 'A') and ((SIMP = 'N') or (ctaivars = ''))) then
            begin
            for select max(COAR_CTAIVAC), sum(F.fpde_ivamonto), sum(cast(F.fpde_cant as double precision) * (F.fpde_prunit-F.fpde_dtomonto)), sum(F.fpde_consumo)
                from ARTICULO A, CONTABIL_ARTICULO C, factura_proforma_det F
                where F.fapo_id = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and F.fpde_ivamonto <> 0
                group by COAR_CTAIVAC
                into :CTAIVA, :IMPTOS, :MONTO, :VALORADIC do
              if (IMPTOS <> 0) then
                begin
                if (MERCANCIA <> 0) then
                    IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    IMPTOS = 0;
                if (MERCANCIA <> 0) then
                    MONTO = cast(MONTO as double precision) * VRSUBT / MERCANCIA;
                else
                    MONTO = 0;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure CUENTA_INTERFAZ(132, :IDDOC, :CTAIVA, '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, F.fpde_ivamonto, (F.fpde_cant * (F.fpde_prunit-F.fpde_dtomonto)), TAIV_PORC, F.fpde_consumo
                        from ARTICULO A, CONTABIL_ARTICULO C, factura_proforma_det F, TARIFA_IVA T
                        where F.fapo_id = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and COAR_CTAIVAV = :CUENTA and A.TAIV_COD = T.TAIV_COD
                        into :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    do
                        begin
                        if (MERCANCIA <> 0) then
                            IMPTOS = cast(IMPTOS as double precision) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (MERCANCIA <> 0) then
                            MONTO = cast(MONTO as double precision) * VRSUBT / MERCANCIA;
                        else
                            MONTO = 0;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, :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
                    TIPOCUEN = 'N';
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, :IMPTOS, 0, :MONTO, cast(:IMPTOS as double precision)*100/cast(:MONTO as double precision), :NIT, :PROY, :CENTRO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        /* DESCUENTO */
        if ((CTADTO is not null) and
            (CTADTO <> '')) then
          begin
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            execute procedure CUENTA_INTERFAZ(132, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                TIPOCUEN = 'N';
            if (TIPOCUEN = 'N') then
                begin
                /* INSERTE EL REGISTRO DE LA BASE */
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, 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(132, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                TIPOCUEN = 'N';
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, 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(132, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                TIPOCUEN = 'N';
            if (TIPOCUEN = 'N') then
                begin
                if (VREXTRA > 0) then
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
                else
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, 0, (:VREXTRA*-1), 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                end
            end
          end

        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K') or (CXP = 'I') ) then
            begin
            SUMA = NETO;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            if (CXP = 'I') then
                select i.impo_ctainv from factura_proforma f, importacion i where f.fapo_idimpor = i.impo_id
                    and f.fapo_id = :iddoc into :CTACXP;
            execute procedure CUENTA_INTERFAZ(132, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                TIPOCUEN = 'N';
            if (TIPOCUEN = 'N') then
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, 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 = '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(132, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                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_DOCTIPOA, CNDE_DOCTIPON)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, NULL, :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, 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_DOCTIPOA, CNDE_DOCTIPON)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, NULL, 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, 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(132, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                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_DOCTIPOA, CNDE_DOCTIPON)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, 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_DOCTIPOA, CNDE_DOCTIPON)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, NULL, 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
                        end
                    end
                end
            end
        end
    if (ERROR > 0) then
        VER = 'S';
    suspend;
    end
else
    begin
    execute PROCEDURE ERRORINT (132, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    suspend;
    end
end^


ALTER PROCEDURE CONTABIL_CONSIGNA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable AUX CHAR(120);
declare variable CONC CHAR(60);
declare variable VALOR NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 71 AND CNTB_IDREF = :IDDOC;

  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO  */
    SELECT PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, CONS_ANULADO, BANC_NIT
        FROM CONSIGNA C, CUENTAS_BANCO B, bancos A
        WHERE CONS_ID = :IDDOC AND C.CUBA_COD = B.CUBA_COD AND B.BANC_COD = A.BANC_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, BCTABANCO, BCTAIVA, BCTAGMF, ANULADO, NIT;
    if (ANULADO = 'N') then
      BEGIN
      NUMERO = PREF || NUM;
      SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, CONSIGNA C
        WHERE P.PRBA_PREF = C.PRBA_PREF AND P.CUBA_COD = C.CUBA_COD AND P.TIDO_COD = 71 AND C.CONS_ID = :IDDOC
        INTO :CENTRO, :PROY;
      EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
      /* REGISTRE EL ENCABEZADO CONTABLE */
      IDC = GEN_ID(ID_CONTABILIZA, 1);
      AUX = SUBSTR(CONC, 1, 32);
      CONC = 'CONSIGNACION No. ' || NUMERO || '-' || AUX;
      INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 71, :IDDOC, :PREF, :NUM, 'N');
      NROI = 0;
      SUMA = 0;
      ERROR = 0;
      /* CUENTA BANCO */
      if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        SELECT SUM(CODE_MONTO) FROM CONSIGNA_DETALLE
            WHERE CONS_ID = :IDDOC INTO :VALOR;

        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        if (VALOR <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VALOR, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VALOR;
                END
            END /* MONTO <> 0 */
        END /* BANCO K O B */
      /* CUENTA BASE */
      if ((BASE = 'C') or (BASE = 'K')) then
        if (BASE = 'C') then
            BEGIN
            FOR SELECT MAX(CAJA_CUENTA), SUM(CODE_MONTO) FROM CONSIGNA_DETALLE D, CAJAS C
                WHERE D.CAJA_ID = C.CAJA_ID AND CONS_ID = :IDDOC
                GROUP BY CAJA_CUENTA
                INTO :CTABASE, :VALOR
                DO
                BEGIN
                if (VALOR <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VALOR, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VALOR;
                        END
                    END /* VALOR <> 0 */
                END /* FOR */
            END /* BASE = C */
        ELSE
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTABASE
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VALOR;
                END
            END /* BASE = K */
            
      /* recorra las cuentas adicionales */
      FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER AND INBC_CN <> 'N'
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO
            FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC
            INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTAADIC, 2);
                CUENTA = CUENTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  /* ANULADO = N */
  END /* EXISTE  */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_CONSIGNA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable CONC CHAR(60);
declare variable VALOR NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INBA_BANCO, N.INBA_IVA, N.INBA_GMF, N.INBA_BASE, N.INBA_CTABCO, N.INBA_CTAIVA, N.INBA_CTAGMF, N.INBA_CTABASE, INBA_CONFIRMAR, INBA_EQUIVALENCIA
    FROM INTERFAZ_BANCOS I, interfaz_bancos_niif N
    WHERE I.INBA_ID = :IDINTER AND I.inba_id = N.inba_id
    INTO :EXISTE, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO  */
    SELECT PRBA_PREF, CONS_NUMERO, CONS_CONCEPTO, CUBA_CTANIIF, CUBA_CTAIVA, CUBA_CTAGMF, CONS_ANULADO, BANC_NIT
        FROM CONSIGNA C, CUENTAS_BANCO B, bancos A
        WHERE CONS_ID = :IDDOC AND C.CUBA_COD = B.CUBA_COD AND B.BANC_COD = A.BANC_COD
        INTO :PREF, :NUM, :CONC, BCTABANCO, BCTAIVA, BCTAGMF, ANULADO, NIT;
    if (ANULADO = 'N') then
      BEGIN
      SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, CONSIGNA C
        WHERE P.PRBA_PREF = C.PRBA_PREF AND P.CUBA_COD = C.CUBA_COD AND P.TIDO_COD = 71 AND C.CONS_ID = :IDDOC
        INTO :CENTRO, :PROY;
      NROI = 100000;
      SUMA = 0;
      ERROR = 0;
      /* CUENTA BANCO */
      if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        SELECT SUM(CODE_MONTO) FROM CONSIGNA_DETALLE
            WHERE CONS_ID = :IDDOC INTO :VALOR;

        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        if (VALOR <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM cuentas_niif
                WHERE CUEN_COD = :CTABANCO
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VALOR, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VALOR;
                END
            END /* MONTO <> 0 */
        END /* BANCO K O B */
      /* CUENTA BASE */
      if ((BASE = 'C') or (BASE = 'K')) then
        if (BASE = 'C') then
            BEGIN
            FOR SELECT MAX(CAJA_CTANIIF), SUM(CODE_MONTO) FROM CONSIGNA_DETALLE D, CAJAS C
                WHERE D.CAJA_ID = C.CAJA_ID AND CONS_ID = :IDDOC
                GROUP BY CAJA_CUENTA
                INTO :CTABASE, :VALOR
                DO
                BEGIN
                if (VALOR <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO
                        FROM cuentas_niif
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VALOR, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VALOR;
                        END
                    END /* VALOR <> 0 */
                END /* FOR */
            END /* BASE = C */
        ELSE
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM cuentas_niif
                WHERE CUEN_COD = :CTABASE
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VALOR;
                END
            END /* BASE = K */
            
      /* recorra las cuentas adicionales */
      FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER AND INBC_CN <> 'C'
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO
            FROM cuentas_niif
            WHERE CUEN_COD = :CUENTAADIC
            INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CUENTAADIC, 2);
                CUENTA = CUENTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END  /* ANULADO = N */
    END /* EXISTE  */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (1071, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_CONSIGNATAR (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable PORC NUMERIC(8,2);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable CTAGMF VARCHAR(20);
declare variable GMFPOR NUMERIC(9,2);
declare variable VRGMF NUMERIC(18,2);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CHEQUE CHAR(1);
declare variable IDCAJA INTEGER;
declare variable IDBANCO INTEGER;
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable TOTALNETO CHAR(5);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 64 AND CNTB_IDREF = :IDDOC;

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

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

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

        NROI = 0;
        SUMA = 0;
        ERROR = 0;
        VRBASE = VRTOTAL;
        if (TOTALNETO = 'TOTAL') then
            VRTOTAL = VRTOTAL + vrdto + vrrtfte + vrrtica + vrrtiva;
        SELECT CUBA_CTAGMF, CUBA_GMFPOR FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO ctagmf, :gmfpor;
        if ((CTAGMF <> '') AND (GMFPOR <> 0))then
            EXECUTE procedure REDONDEE((vrdto + vrrtfte + vrrtiva + vrrtica) * GMFPOR / 1000,0) returning_values (:VRGMF);
        else    
            VRGMF = 0;
        IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
            BEGIN
            if (VRTOTAL <> 0) then
                BEGIN
                IF ((CAJA = 'F')) THEN
                    BEGIN
                    /* TRAIGA LA CUENTA DE LA CAJA O EL BANCO A ABONAR */
                    SELECT CUBA_CTACONTA FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO CTACAJA;
--                    ELSE
--                        SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTACAJA;
                    END
                
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRTOTAL;
                    if (TOTALNETO = 'TOTAL') then
                        BEGIN
                        if (VRDTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - VRDTO;
                            END
                        if (vrrtfte <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtfte, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtfte;
                            END
                        if (vrrtiva <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtiva, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtiva;
                            END
                        if (vrrtica <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtica;
                            END
                        if (vrgmf <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRGMF, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - VRGMF;
                            END
                        END
                    END
                END /* VRTOTAL <> 0 */
            END /* CAJA CONSTANTE */
        
        if (DTO = 'K') then /* COMISION */
            BEGIN
            if (VRDTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRDTO;
                    END
                END /* VRDTO <> 0 */
            END /* DTO EN CTA CONSTANTE */
        
        /* RETENCION FUENTE */
        if (RTFTE = 'K') then
          if (VRRTFTE <> 0) then
            BEGIN
            PORC = vrrtfte * 100 / vrbase;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :ctartfte, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :vrbase, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END /* RTFTE */
        
        /* RETENCION IVA */
        if (RTIVA = 'K') then
          if (VRRTIVA <> 0) then
            BEGIN
            PORC = VRRTIVA * 100 / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :ctartiva, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTIVA;
                END
            END /* RTIVA */
        
        /* RETENCION ICA */
        if (rtica = 'K') then
          if (vrrtica <> 0) then
            BEGIN
            PORC = vrrtica * 100 / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :ctartica
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :ctartica, 2);
                CUENTA = ctartica;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            END /* RTIVA */
        
        /* CUENTA GMF */
        if (VRGMF <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CTAGMF, 2);
                CUENTA = CTAGMF;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
              if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRGMF;
                END
            END /* GMF */

        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
        if ((SUMA <> 0) and ((BASE = 'F') or (BASE = 'K'))) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE    
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (BASE = 'F') then
                SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */

        /* recorra las cuentas adicionales */
        FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
            FROM INTERFAZ_CAJA_CTAS
            WHERE INCJ_ID = :IDINTER AND INJC_CN <> 'N'
            INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'RTFTE') then
                VALORADIC = VRRTFTE;
            if (:BASEADIC = 'RTIVA') then
                VALORADIC = VRRTIVA;
            MONTO = VALORADIC * PORCADIC;
        
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            NROI = NROI + 1;
            END     
        
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_CONSIGNATAR_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable 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 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);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCJ_BASE, N.INCJ_DTOPP, N.INCJ_RTFTE, N.INCJ_RTIVA, N.INCJ_RTICA, N.INCJ_CAJA, N.INCJ_CTABASE, N.INCJ_CTADTO, N.INCJ_CTARTFTE,
    N.INCJ_CTARTIVA, N.INCJ_CTARTICA, N.INCJ_CTACAJA, INCJ_CONFIRMAR, INCJ_EQUIVALENCIA
    FROM INTERFAZ_CAJA I, interfaz_caja_niif N
    WHERE I.INCJ_ID = :IDINTER AND I.incj_id = N.incj_id
    INTO :EXISTE, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
    if (EXISTE = 'S') then
        BEGIN
        /* TRAIGA EL ENCABEZADO DE LA CONSIGNACION */
        SELECT PREF_PRE, COTJ_NUMERO, 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, :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;
    
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
                WHERE PREF_PRE = :PREF AND TIDO_COD = 64 INTO :CENTRO, :PROY;
            NROI = 100000;
            SUMA = 0;
            ERROR = 0;
            VRBASE = VRTOTAL;
            if (TOTALNETO = 'TOTAL') then
                VRTOTAL = VRTOTAL + vrdto + vrrtfte + vrrtica + vrrtiva;
            SELECT CUBA_CTAGMF, CUBA_GMFPOR FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO ctagmf, :gmfpor;
            if ((CTAGMF <> '') AND (GMFPOR <> 0))then
                EXECUTE procedure REDONDEE((vrdto + vrrtfte + vrrtiva + vrrtica) * GMFPOR / 1000,0) returning_values (:VRGMF);
            else    
                VRGMF = 0;
            IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
                BEGIN
                if (VRTOTAL <> 0) then
                    BEGIN
                    IF ((CAJA = 'F')) THEN
                        BEGIN
                        /* TRAIGA LA CUENTA DE LA CAJA O EL BANCO A ABONAR */
                        SELECT CUBA_CTANIIF 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_niif
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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_NIIF
                        WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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_NIIF
                    WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :ctartfte, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_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 * 100 / VRBASE;
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO
                    FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTARTIVA
                    INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :ctartiva, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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 * 100 / VRBASE;
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO
                    FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctartica
                    INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :ctartica, 2);
                    CUENTA = ctartica;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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_NIIF
                    WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CTAGMF, 2);
                    CUENTA = CTAGMF;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                  if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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_CTANIIF FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;
    
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1064, :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 AND INJC_CN <> 'C'
                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_NIIF
                    WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    END
                NROI = NROI + 1;
                END     
            
            if (ERROR > 0) then
                VER = 'S';
            SUSPEND;
            END
        END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1064, :IDDOC, :PREF, 1);
        ERROR = ERROR + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_COSTOS (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable prtcree numeric(9,2);
declare variable vrrtcree numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable rtcree char(1);
declare variable ctartcree varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable tctartcree varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable INALC numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
declare variable TERCEXENTO CHAR(1);
declare variable CTAD1818 varchar(20);
declare variable DEC1818 char(1);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA VENTAS EXENTAS DEL DECRETO 1818 DE 2015') returning_values (:CTAD1818);
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'TERCEROS', 'CONTABILIZAR VENTAS Y RECIBOS DE CAJA CON TERCERO CONTABLE EN LUGAR DEL NIT') returning_values (CNTNIT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', 'COS', PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_RTCREE,
    INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA,
    INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTARTCREE, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :RTCREE,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA,
    :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO,
    FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_RTCREE, FACT_RTCREEM,
    FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO, T.terc_nitconta, terc_exento
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree,
        :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta, :tercexento;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
  if (ANULADO = 'N') then
    BEGIN
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    SELECT SUM (FADE_INALCM) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO INALC;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETENCION */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 41 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,41);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 0, 0, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* 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(1031, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 1031);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(1031, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 1031);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(1031, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 1031);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(1031, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 1031);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER AND INVC_CN <> 'N'
        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;
            if (:BASEADIC = 'COSTO') then
                BEGIN
                SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :valoradic;
                END
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(1031, :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, 1031);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, 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, 1031);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1031, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_COSTOS_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 prcree numeric(9,2);
declare variable vrrcree numeric(18,2);
declare variable rcree char(1);
declare variable ctarcree varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable 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 tctarcree varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable inalc numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable factoraj double precision;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (autoret);
if (AUTORET <> '') then
    fautoret = CAST(AUTORET AS DATE);
else
    fautoret = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';

/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', 'COS', 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
  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;

  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTARCREE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, TCTARCREE;
  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), SUM(FACT_RTCREEM)
        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, :vrrcree;
  SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE D, FACTURAS F WHERE D.fact_id = F.fact_id
      AND FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
      INTO MERCANCIA;
  SELECT SUM (FADE_INALCM) FROM FACTURAS_DETALLE D, FACTURAS F WHERE D.fact_id = F.fact_id
      AND FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
      INTO INALC;
  if (INALC IS NULL) then
    INALC = 0;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;

  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;

  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;

  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;

    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_DESENSAMBLE (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
declare variable VRCONSUMO NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 16 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_ANULADO
        FROM DESENSAMBLES
        WHERE DESE_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DESENSAMBLES E
                WHERE B.BODE_COD = E.BODE_COD AND E.DESE_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, DESENSAMBLES E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.DESE_ID = :IDDOC AND P.TIDO_COD = 16 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 16, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(DEDE_CANT as double precision) * DEDE_COSTO), SUM(DEDE_IVAMONTO + DEDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, DESENSAMBLES_DETALLE D, DESENSAMBLES E
                WHERE E.DESE_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND E.DESE_ID = D.DESE_ID
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        SELECT ARTI_COD FROM DESENSAMBLES WHERE DESE_ID = :iddoc INTO :ARTICULO;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */

            /* LOS COMPONENTES */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(DEDE_CANT as double precision) * DEDE_COSTO), SUM(DEDE_IVAMONTO + DEDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, DESENSAMBLES_DETALLE E
                WHERE E.DESE_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                   SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (cast(DEDE_CANT as double precision) * DEDE_COSTO), (DEDE_IVAMONTO + DEDE_CONSUMO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, DESENSAMBLES_DETALLE E
                            WHERE E.DESE_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(cast(DEDE_CANT as double precision) * DEDE_COSTO), SUM(DEDE_IVAMONTO + DEDE_CONSUMO)
                FROM DESENSAMBLES_DETALLE E
                WHERE E.DESE_ID = :IDDOC
                INTO :MONTO, :IMPTOS;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    SELECT ARTI_COD FROM DESENSAMBLES WHERE DESE_ID = :IDDOC INTO :ARTICULO;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* LOS COMPONENTES CON LA CUENTA DE CIERRE */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    SELECT ARTI_COD FROM DESENSAMBLES WHERE DESE_ID = :IDDOC INTO :ARTICULO;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER AND INIC_CN <> 'N'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRBASE;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                VALORADIC = VRCONSUMO;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRBASE + VRIVA + VRCONSUMO;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


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

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


ALTER PROCEDURE CONTABIL_DETERIORO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable 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 NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DPROY VARCHAR(4);
declare variable DCENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable PREFND VARCHAR(4);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
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 = 47 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA NOTA */
    SELECT PREF_PRE, DECA_NUMERO, DECA_FECHA, DECA_CONCEPTO, DECA_ANULADO, DECA_PREFND
        FROM DETERIORO_CARTERA_ENC WHERE DECA_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :CONC, ANULADO, :PREFND;

    if ((ANULADO = 'N') AND ((PREFND IS NULL) or (PREFND = ''))) then
      BEGIN
      SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, deterioro_cartera_enc N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 47 AND DECA_ID = :IDDOC INTO :CENTRO, :PROY;
      NUMERO = PREF || NUM;
      EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
      /* REGISTRE EL ENCABEZADO CONTABLE */
      IDC = GEN_ID(ID_CONTABILIZA, 1);
      INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 47, :IDDOC, :PREF, :NUM, 'N');

      NROI = 0;
      SUMA = 0;
      ERROR = 0;
      IF ((BASE = 'C') OR (BASE = 'K')) THEN
        BEGIN
        FOR SELECT D.decd_tipodoc, D.decd_prefdoc, D.decd_monto, D.terc_nit, TERC_NOM, TERC_CTADETERIORO, TERC_CTACLIENTE
            FROM deterioro_cartera_det D, TERCEROS T
            WHERE DECA_ID = :IDDOC AND D.TERC_NIT = T.TERC_NIT
            INTO :tipoit, :PREFIT, :vrsubt, :NIT, :nombre, :TCTABASE, TCTACLIEN
            DO
            BEGIN
            if (VRSUBT <> 0) then
                BEGIN
                dproy = NULL;
                dcentro = NULL;
                SELECT PREF_PROY, PREF_CENTRO FROM PREFIJOS WHERE TIDO_COD = :TIPOIT AND PREF_PRE = :PREFIT INTO :dproy, :dcentro;
                if (dproy IS NULL) then
                    dproy = PROY;
                if (dcentro IS NULL) then
                    dcentro = CENTRO;
                IF (BASE = 'C') THEN
                    CTABASE = TCTABASE;
                /* DETERIORO */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(47, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(47, :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, '', :VRSUBT, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                /* CARTERA */
                if ((CLIE = 'C') or (CLIE = 'K')) then
                    begin
                    IF (CLIE = 'C') THEN
                        CTACLIE = tctaclien;
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(47, :IDDOC, :CTACLIE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(47, :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, '', 0, :VRSUBT, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRSUBT;
                        END
                    END
                END /* MONTO <> 0 */
            END /* FOR DETALLE */
        END /* BASE CLIENTE O CONSTANTE */

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


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


ALTER PROCEDURE CONTABIL_DEVOLCHEQ_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable CONC CHAR(120);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable CART CHAR(1);
declare variable IDCAJA INTEGER;
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INBA_BANCO, N.INBA_IVA, N.INBA_GMF, N.INBA_BASE, N.INBA_CTABCO, N.INBA_CTAIVA, N.INBA_CTAGMF, N.INBA_CTABASE, INBA_CONFIRMAR, INBA_EQUIVALENCIA
    FROM INTERFAZ_BANCOS I, interfaz_bancos_niif N
    WHERE I.INBA_ID = :IDINTER AND I.inba_id = N.inba_id
    INTO :EXISTE, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO  */
    SELECT PRBA_PREF, DVCH_NUMDOC, DVCH_CONC, DVCH_MONTO, DVCH_CARTERA, CAJA_ID, TERC_NIT, CUBA_CTANIIF, CUBA_CTAIVAN, CUBA_CTAGMFN
        FROM DEVOLUCION_CHEQUES C, CUENTAS_BANCO B
        WHERE DVCH_ID = :IDDOC AND C.CUBA_COD = B.CUBA_COD
        INTO :PREF, :NUM, :CONC, :MONTO, :CART, :IDCAJA, :NIT, :BCTABANCO, :BCTAIVA, :BCTAGMF;
    SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, devolucion_cheques C
        WHERE P.PRBA_PREF = C.PRBA_PREF AND P.CUBA_COD = C.CUBA_COD AND C.DVCH_ID = :IDDOC AND P.TIDO_COD = 77
        INTO :CENTRO, :PROY;
    NROI = 100000;
    SUMA = 0;
    ERROR = 0;
    /* CUENTA BASE */
    if ((BASE = 'C') or (BASE = 'K')) then
        BEGIN
        if (BASE = 'C') then
            if (CART = 'S') then /* LA CUENTA DEL CLIENTE */
                SELECT TERC_CTACLIENIIF FROM TERCEROS
                    WHERE TERC_NIT = :NIT INTO :CTABASE;
            ELSE /* LA CUENTA DE CAJA */
                SELECT CAJA_CTANIIF FROM CAJAS
                    WHERE CAJA_ID = :IDCAJA INTO :CTABASE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(1077, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(1077, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(1077, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = C O K */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        SUMA = MONTO;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(1077, :IDDOC, :CTABANCO, 2);
            CUENTA = CTABANCO;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(1077, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(1077, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* BANCO K O B */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER AND INBC_CN <> 'C'
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(1077, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(1077, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(1077, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1077, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_DEVOLCLI (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(12);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable ART VARCHAR(15);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
DECLARE VARIABLE INALC NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
declare variable CTAD1818 varchar(20);
declare variable DEC1818 char(1);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA DEVOLUCIONES EXENTAS DEL DECRETO 1818 DE 2015') returning_values (:CTAD1818);
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'TERCEROS', 'CONTABILIZAR VENTAS Y RECIBOS DE CAJA CON TERCERO CONTABLE EN LUGAR DEL NIT') returning_values (CNTNIT);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_RTCREE,
    INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA,
    INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTARTCREE, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :RTCREE,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE,
    :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL,
        DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_RTCREE, DEVT_RTCREEM,
        TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID, T.terc_nitconta
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL,
        :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :PRTCREE, :VRRTCREE,
        :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARTCREE, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED, :nitconta;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :MERCANCIA;
    SELECT SUM(DVDE_INACM) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :INALC;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        SELECT PREF_DEC1818 FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = :pref INTO :DEC1818;
        if (DEC1818 = 'S') then
            BEGIN
            SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
                FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B, grupo g
                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)) and g.grup_cod = a.grup_cod and g.grup_dec1818 = 'S'
                INTO :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi;
            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 (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 /* MONTO <> 0 */
            END
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B, grupo g
            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)) and g.grup_cod = a.grup_cod and ((grup_dec1818 = 'N') or (:dec1818 = 'N'))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (icoing = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_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 /* MONTO <> 0 */
        END /* VENTAS C O K */

    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVADV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVADV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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 /* IMPTOS <> 0 */
        END /* IVA K */

    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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 /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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 /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* INALC */
        BEGIN
        SELECT SUM(DVDE_INACM)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA EL IMPUESTO NACIONAL AL CONSUMO') returning_values (ctaconsumo);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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 /* IMPTOS <> 0 */
        END /* INALC */

    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END

    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END

    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        debito = 0;
        credito = 0;
        if (VREXTRA > 0) then
            DEBITO = VREXTRA;
        else
            CREDITO = ABS(VREXTRA);
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, 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);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END

    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
     if (VRRTFTE <> 0) then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END

    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */

    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    if (RTICA = 'A') then
      BEGIN
      if (VRRTICA <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTICAV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)/1000)*:prtica)
          FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
          WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
          GROUP BY COAR_CTARTICAV
          INTO :ctartica, :MONTO, :vrrtica
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtica = vrrtica * FACTOR;
          execute procedure redondee(vrrtica, DIG) returning_values (vrrtica);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtica <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :ctartica, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, (:MONTO*-1), :prtica/10, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtica;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, (:MONTO*-1), :prtica/10, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtica;
                END
            END
          END
        END
      END   /* RTICA */

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

    /* CIERRE CONTRA CUENTA TERCERO O CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE EL IMPOCONSUMO */
            SELECT SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle F WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :IMPTOS;
            SUMA = SUMA - IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA CARTERA */
    /* COSTOS VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(DVDE_CONSUMO)
            FROM COSTO_VENTAS CV, devoluciones_ventas_detalle D WHERE CV.cove_item = D.dvde_item AND D.devt_id = :iddoc AND
            TIDO_COD = 33 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
        DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER AND INVC_CN <> 'N'
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_DEVOLCLI_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable NUMFAC VARCHAR(12);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTAVENTA VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PTOVTA INTEGER;
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
DECLARE VARIABLE INALC NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INVE_VENTAS, N.INVE_IVA, N.INVE_CONSUMO, N.INVE_CARTERA, N.INVE_RTFTE, N.INVE_RTIVA, N.INVE_RTICA, N.INVE_RTCREE,
    N.INVE_COSTO, N.INVE_INVEN, N.INVE_CTAVENTAS, N.INVE_CTAIVA, N.INVE_CTACONSUMO, N.INVE_CTADTO, N.INVE_CTAADIC, N.INVE_CTAEXTRA,
    N.INVE_CTACARTERA, N.INVE_CTARTFTE, N.INVE_CTARTIVA, N.INVE_CTARTICA, N.INVE_CTARTCREE, N.INVE_CTAINVEN, N.INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO, INVE_EQUIVALENCIA
    FROM interfaz_ventas I, interfaz_ventas_niif N
    WHERE I.inve_id = :IDINTER AND I.inve_id = N.inve_id
    INTO :EXISTE, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :RTCREE,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA,
    :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTAINVEN, :CTACOSTOS, :VER, :CENT, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
  EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'TERCEROS', 'CONTABILIZAR VENTAS Y RECIBOS DE CAJA CON TERCERO CONTABLE EN LUGAR DEL NIT') returning_values (CNTNIT);
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
  if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
  else
    FAUTORCREE = '9999/12/31';
  if (EXISTE = 'S') then
   BEGIN
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL,
        DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_RTCREE, DEVT_RTCREEM,
        TERC_CTARFTENIIF, TERC_CTARIVANIIF, TERC_CTARICANIIF, TERC_CTARCREENIIF, TERC_CTAVTANIIF, TERC_CTACLIENIIF, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID, T.terc_nitconta
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL,
        :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :PRTCREE, :VRRTCREE,
        :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARTCREE, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED, :nitconta;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :MERCANCIA;
    SELECT SUM(DVDE_INACM) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :INALC;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    NROI = 100000;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (icoing = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS C O K */

    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVADV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVADV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA K */

    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* INALC */
        BEGIN
        SELECT SUM(DVDE_INACM)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA EL IMPUESTO NACIONAL AL CONSUMO') returning_values (ctaconsumo);
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */

    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END

    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END

    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END

    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
     if (VRRTFTE <> 0) then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO_NIIF C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END

    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */

    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    if (RTICA = 'A') then
      BEGIN
      if (VRRTICA <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTICAV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)/1000)*:prtica)
          FROM CONTABIL_ARTICULO_NIIF C, devoluciones_ventas_detalle F
          WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
          GROUP BY COAR_CTARTICAV
          INTO :ctartica, :MONTO, :vrrtica
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtica = vrrtica * FACTOR;
          execute procedure redondee(vrrtica, DIG) returning_values (vrrtica);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtica <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(31, :IDDOC, :ctartica, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, (:MONTO*-1), :prtica/10, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtica;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, (:MONTO*-1), :prtica/10, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtica;
                END
            END
          END
        END
      END   /* RTICA */

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

    /* CIERRE CONTRA CUENTA TERCERO O CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE EL IMPOCONSUMO */
            SELECT SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle F WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :IMPTOS;
            SUMA = SUMA - IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            SELECT CAJA_CTANIIF FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA CARTERA */
    /* COSTOS VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(DVDE_CONSUMO)
            FROM COSTO_VENTAS CV, devoluciones_ventas_detalle D WHERE CV.cove_item = D.dvde_item AND D.devt_id = :iddoc AND
            TIDO_COD = 33 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
        DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(cast(CANT as double precision) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS WHERE INVE_ID = :IDINTER AND INVC_CN <> 'C'
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (valoradic <> 0) then
            monto = valoradic;
        else
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1033, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_DEVOLCOMP (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(100);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable FOMENTO CHAR(2);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
declare variable IDREM INTEGER;
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE,
    INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :RTCREE,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA,
    :CTARTICA, :CTARTCREE, :VER, :CENT;
if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 24 AND CNTB_IDREF = :IDDOC;
   /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.TERC_NIT, DVCO_FACTURA, DVCO_IMPTOS, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
        DVCO_EXTRA, DVCO_TOTAL, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO,
        DVCO_RTCREE, DVCO_RTCREEM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE, PROV_CTAPAGAR, DVCO_ANULADO, d.dvco_remid
        FROM DEVOLUCIONES_COMPRAS D, TERCEROS T, PROVEEDORES P
        WHERE DVCO_ID = :IDDOC AND D.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :NUMFAC, :IMPINC, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA,
        :prtcree, :vrrtcree, :TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTAPROV, ANULADO, :idrem;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DEVOLUCIONES_COMPRAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DVCO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS P, DEVOLUCIONES_COMPRAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DVCO_ID = :IDDOC AND P.TIDO_COD = 24 INTO :CENTRO, :PROY;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(DVCD_consumo) from devoluciones_compras_det where dvco_id = :IDDOC into :valoradic;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

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

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

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

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


ALTER PROCEDURE CONTABIL_DEVOLCOMP_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(100);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable FOMENTO CHAR(2);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
declare variable IDREM INTEGER;
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCO_INVEN, N.INCO_IVA, N.INCO_CONSUMO, N.INCO_CXP, N.INCO_RTFTE, N.INCO_RTIVA, N.INCO_RTICA, N.INCO_RTCREE,
    N.INCO_CTAINVEN, N.INCO_CTAIVA, N.INCO_CTACONSUMO, N.INCO_CTADTO, N.INCO_CTAADIC, N.INCO_CTAEXTRA, N.INCO_CTACXP, N.INCO_CTARTFTE,
    N.INCO_CTARTIVA, N.INCO_CTARTICA, N.INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO, INCO_EQUIVALENCIA
    FROM INTERFAZ_COMPRAS I, interfaz_compras_niif N
    WHERE I.INCO_ID = :IDINTER AND I.inco_id = N.inco_id
    INTO :EXISTE, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :RTCREE,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA,
    :CTARTICA, :CTARTCREE, :VER, :CENT, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
  if (EXISTE = 'S') then
   BEGIN
   /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.TERC_NIT, DVCO_FACTURA, DVCO_IMPTOS, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
        DVCO_EXTRA, DVCO_TOTAL, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO,
        DVCO_RTCREE, DVCO_RTCREEM, PROV_CTARFTENIIF, PROV_CTARIVANIIF, PROV_CTARICANIIF, PROV_CTARCREENIIF, PROV_CTAPAGNIIF, DVCO_ANULADO, d.dvco_remid
        FROM DEVOLUCIONES_COMPRAS D, TERCEROS T, PROVEEDORES P
        WHERE DVCO_ID = :IDDOC AND D.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :NUMFAC, :IMPINC, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA,
        :prtcree, :vrrtcree, :TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTAPROV, ANULADO, :idrem;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DEVOLUCIONES_COMPRAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DVCO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS P, DEVOLUCIONES_COMPRAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DVCO_ID = :IDDOC AND P.TIDO_COD = 24 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(DVCD_consumo) from devoluciones_compras_det where dvco_id = :IDDOC into :valoradic;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

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

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

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

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


ALTER PROCEDURE CONTABIL_EGRESO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(8);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTCREEC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RTCREER CHAR(1);
declare variable CTARTCREER VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
declare variable NUMPROV CHAR(15);
declare variable TIPO INTEGER;
declare variable PAGLOBAL CHAR(1);
declare variable IDPAGON INTEGER;
declare variable VRPAGON NUMERIC(18,2);
declare variable NITEMP 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_RTCREE, INCJ_CTABASE,
    INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTARTCREE, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :RTCREE, :CTABASE,
    :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

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

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* SI ES PRESTAMO DE NOMINA CONTABILICE LA CONTRAPARTIDA */
    if (TIPO = 5) then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('NOMINA', 'PAGOS', 'CUENTA POR COBRAR POR PRESTAMOS A EMPLEADOS') returning_values (:tctacart);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + VRTOTAL;
            NROI = NROI + 1;
            END
        END
    /* SI ES PAGO DE NOMINA CONTABILICE CADA EMPLEADO CON SU MONTO */
    if (TIPO = 6) then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('NOMINA', 'PAGOS', 'CUENTA CONTABLE PARA NOMINA POR PAGAR A EMPLEADOS A USAR EN EGRESOS') returning_values (:tctacart);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* PARA CADA EMPLEADO */
            SELECT PN.PGNO_ID, PGNO_GLOBAL FROM PAGO_NOMINA PN, PAGO_NOMINA_EGRESOS PE WHERE PE.pgno_id = PN.pgno_id AND PE.egre_id = :iddoc
                INTO :IDPAGON, :PAGLOBAL;
            if (PAGLOBAL = 'S') then
                BEGIN
                FOR SELECT PD.terc_nit, PD.pgnd_monto FROM pago_nomina_det PD WHERE PD.pgno_id = :IDPAGON
                    INTO :NITEMP, :valoradic
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :valoradic, 0, 0, 0, :NITEMP, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + valoradic;
                    NROI = NROI + 1;
                    END
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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
        END
    /* LOS CRUCES CON CUENTAS X COBRAR */
    if ((CRUCES <> 0) AND (BASE <> 'N')) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 0) then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            else
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_RTCREE, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTARTCREE
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :RTCREER, CTARTFTER, :CTARTIVAR, :CTARTICAR, :CTARTCREER;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        /* RETECREE DEL CRUCE */
        SELECT SUM(EGCC_RCREE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtcreec;
        IF ((rtcreec IS NOT NULL) AND (rtcreec <> 0)) THEN
            BEGIN
            if ((rtcreer = 'T') or (rtcreer = 'K')) then
                BEGIN
                if (rtcreer = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO ctartcreer;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :ctartcreer INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartcreer, 2);
                    CUENTA = ctartcreer;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtcreec > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtcreec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtcreec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtcreec;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (vrdto > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:VRDTO), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

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


ALTER PROCEDURE CONTABIL_EGRESO_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(8);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTCREEC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RTCREER CHAR(1);
declare variable CTARTCREER VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
declare variable NUMPROV CHAR(8);
declare variable TIPO INTEGER;
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCJ_BASE, N.INCJ_DTOPP, N.INCJ_RTFTE, N.INCJ_RTIVA, N.INCJ_RTICA, N.INCJ_CAJA, N.incj_rtcree, N.INCJ_CTABASE,
    N.INCJ_CTADTO, N.INCJ_CTARTFTE, N.INCJ_CTARTIVA, N.INCJ_CTARTICA, N.INCJ_CTARTCREE, N.INCJ_CTACAJA, INCJ_CONFIRMAR, INCJ_EQUIVALENCIA
    FROM INTERFAZ_CAJA I, interfaz_caja_niif N
    WHERE I.INCJ_ID = :IDINTER AND I.incj_id = N.incj_id
    INTO :EXISTE, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :RTCREE, :CTABASE,
    :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACAJA, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
  if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO,
        EGRE_RTICAMONTO, EGRE_RTCREE, TERC_CTARFTENIIF, TERC_CTARIVANIIF, TERC_CTARICANIIF, TERC_CTARCREENIIF, TERC_CTACLIENIIF, EGRE_TIPO
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA,
        :VRRTICA, :vrrtcree, :TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, :TIPO;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGNIIF, PROV_CTARFTENIIF, PROV_CTARIVANIIF, PROV_CTARICANIIF, PROV_CTARCREENIIF
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 100000;
    SUMA = 0;
    ERRORI = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CTANIIF, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTANIIF, 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_niif_c (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE valide_cuenta_niif_c (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

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

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE valide_cuenta_niif_c (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1062, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (vrdto > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:VRDTO), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

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


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


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

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


ALTER PROCEDURE CONTABIL_ENTRADA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROY, :centro;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA ENTRADA */
    SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, TERC_NIT, ENTR_IMPTOS, ENTR_ANULADO
        FROM ENTRADAS
        WHERE ENTR_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
        
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 11 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, ENTRADAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.ENTR_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
          if (CENT = 'P') then
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, ENTRADAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND E.ENTR_ID = :IDDOC INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 11, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            CUENTA = :ctabase;
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CUENTA;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CUENTA;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC
                INTO :MONTO, :IMPTOS;
        
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) Then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE K O T */
        /* EL IVA  */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* IVA */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVACMP), SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVACMP
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVACMP = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* IVA K */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                        DO
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR) FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR
                        FROM ARTICULO A, CONTABIL_ARTICULO C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* CONSUMO K */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER and INIC_CN <> 'N'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * (ENDE_COSTO-ENDE_DTOMONTO)) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(ENDE_IVAMONTO) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'TOTAL') then
                    SELECT SUM((CAST(ENDE_CANT AS DOUBLE PRECISION) * (ENDE_COSTO-ENDE_DTOMONTO)) + ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR)) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if (TOTAL <> 'K') then
                BEGIN
                SELECT TERC_CTAPROV, TERC_PROV
                    FROM TERCEROS WHERE TERC_NIT = :NIT
                    INTO :CTACIERRE, :PROV;
                if (PROV = 'S') then
                    SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :CUENTA;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(24, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END^


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


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

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


ALTER PROCEDURE CONTABIL_FACTCOMP_INT (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO varchar(4);
declare variable NUM varchar(6);
declare variable NUMERO varchar(10);
declare variable FECAUX date;
declare variable FECHA char(8);
declare variable CONCEPTO char(60);
declare variable VENCEAUX date;
declare variable VENCE char(8);
declare variable VRDTO numeric(18,2);
declare variable VRADIC numeric(18,2);
declare variable VRSUBT numeric(18,2);
declare variable VRIVA numeric(18,2);
declare variable PRTFTE numeric(9,2);
declare variable VRRTFTE numeric(18,2);
declare variable VRRTIVA numeric(18,2);
declare variable PRTICA numeric(9,2);
declare variable VRRTICA numeric(18,2);
declare variable PRCREE numeric(9,2);
declare variable VRRCREE numeric(18,2);
declare variable VRTOTAL numeric(18,2);
declare variable VREXTRA numeric(18,2);
declare variable TIPOCOMP varchar(3);
declare variable PREFCONT varchar(4);
declare variable INVEN char(1);
declare variable CTAINVEN varchar(20);
declare variable IVA char(1);
declare variable CTAIVA varchar(20);
declare variable CONSUMO char(1);
declare variable CTACONSUMO varchar(20);
declare variable CXP char(1);
declare variable CTACXP varchar(20);
declare variable RTFTE char(1);
declare variable CTARTFTE varchar(20);
declare variable RTIVA char(1);
declare variable CTARTIVA varchar(20);
declare variable RTICA char(1);
declare variable CTARTICA varchar(20);
declare variable RCREE char(1);
declare variable CTARCREE varchar(20);
declare variable CTADTO varchar(20);
declare variable CTAADIC varchar(20);
declare variable CTAEXTRA varchar(20);
declare variable EXISTE char(1);
declare variable CUENTA varchar(20);
declare variable MONTO numeric(18,2);
declare variable TIPOCUEN char(1);
declare variable NIT varchar(20);
declare variable NOMBRE varchar(60);
declare variable PROY varchar(4);
declare variable CENTRO varchar(4);
declare variable 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 IMPTOS numeric(18,2);
declare variable SUMA numeric(18,2);
declare variable PORCIVA numeric(9,2);
declare variable TCTAPROV varchar(20);
declare variable TCTARTFTE varchar(20);
declare variable TCTARTIVA varchar(20);
declare variable TCTARTICA varchar(20);
declare variable TCTARCREE varchar(20);
declare variable CUENTAADIC varchar(20);
declare variable BASEADIC varchar(20);
declare variable PORCADIC numeric(5,2);
declare variable VALORADIC numeric(18,2);
declare variable DBADIC char(1);
declare variable BODE_DET char(2);
declare variable NUMPROV varchar(10);
declare variable MERCANCIA numeric(18,2);
declare variable FACTOR double precision;
declare variable MENORV char(2);
declare variable DIG integer;
declare variable NETO numeric(18,2);
declare variable CENT char(1);
declare variable ANULADO char(1);
declare variable ERRORC integer;
declare variable SIMP char(1);
declare variable CTAIVARS varchar(20);
declare variable DEC1818 char(1);
begin
EXISTE = 'N';
select 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE,
    INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    from INTERFAZ_COMPRAS where INCO_ID = :IDINTER
    into :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :RCREE,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE,
    :CTARTIVA, :CTARTICA, :CTARCREE, :VER, :CENT;
if (EXISTE = 'S') then
    begin
    /* BORRE CONTABILIZACION PREVIA */
    delete from CONTABILIZACION where CNTB_TIPOREF = 137 and CNTB_IDREF = :IDDOC;

    select PREF_PRE, F.fapo_numero, FAPO_FECHA, F.TERC_NIT, F.fapo_vence, F.fapo_dtomonto, F.fapo_adicional, F.fapo_ivamonto, F.fapo_extra, F.fapo_total,
        TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE, PROV_CTAPAGAR, F.fapo_anulado
        from factura_proforma F, TERCEROS T, PROVEEDORES P where FAPO_ID = :IDDOC and F.TERC_NIT = T.TERC_NIT and T.TERC_NIT = P.TERC_NIT
        into :PREFIJO, :NUM, :FECAUX, :NIT, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL,
        :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARCREE, TCTAPROV, :ANULADO;
    if (CENT = 'P') then        /* CENTRO DEL PREFIJO */
        select PREF_CENTRO, PREF_PROY from PREFIJOS P, factura_proforma F where P.PREF_PRE = F.PREF_PRE and F.fapo_id = :IDDOC and P.TIDO_COD = 137
            into :CENTRO, :PROY;
    else if (CENT = 'F') then        /* CENTRO DEL PREFIJO */
        select F.fapo_centro, F.fapo_proy from factura_proforma F where F.fapo_id = :IDDOC
            into :CENTRO, :PROY;
    else
        select IMPO_CENTRO, IMPO_PROY from importacion I, factura_proforma F where I.impo_id = F.fapo_idimpor and F.fapo_id = :IDDOC
            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);
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,36);
        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, '', 137, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        execute procedure lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        select sum(F.fpde_consumo) from factura_proforma_det F where fapo_id = :IDDOC into :valoradic;
        FACTOR = 1;

        DIG = -2;
        if (INVEN = 'A') then
            BEGIN
            for select max(COAR_CTACOMP), sum(cast(F.fpde_cant as double precision) * (F.fpde_prunit-F.fpde_dtomonto)), sum(F.fpde_ivamonto), sum(F.fpde_consumo), max(F.BODE_COD)
                from ARTICULO A, CONTABIL_ARTICULO C, factura_proforma_det F where F.FAPO_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;
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(137, :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, (F.fpde_cant * (F.fpde_prunit-F.fpde_dtomonto)), F.fpde_ivamonto, F.fpde_consumo
                        from ARTICULO A, CONTABIL_ARTICULO C, factura_proforma_det F where F.fapo_id = :IDDOC and
                        F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and COAR_CTACOMP = :CUENTA
                        into :ARTICULO, :MONTO, :IMPTOS, :VALORADIC do
                        begin
                        MONTO = MONTO * 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_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT,
                                :PROYDET, :CENTRODET, :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_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT,
                               :PROY, :CENTRO, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        end
                    end
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                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') or (INVEN = 'I'))  then
            begin
            if (INVEN = 'I') then
                select i.impo_ctaimp from factura_proforma f, importacion i where f.fapo_idimpor = i.impo_id
                    and f.fapo_id = :iddoc into :ctainven;
            for select sum(cast(F.fpde_cant as double precision) * (F.fpde_prunit-F.fpde_dtomonto)), sum(F.fpde_ivamonto), sum(F.fpde_consumo), max(BODE_COD)
                from factura_proforma_det F where FAPO_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;
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(137, :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, (F.fpde_cant * (F.fpde_prunit-F.fpde_dtomonto)), F.fpde_ivamonto, F.fpde_consumo
                        FROM factura_proforma_det F WHERE FAPO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        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
                    TIPOCUEN = 'N';
                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_DOCTIPOA, CNDE_DOCTIPON)
                          values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, 0, 0);
                    else
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    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(137, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                TIPOCUEN = 'N';
            if (TIPOCUEN = 'N') then
                begin
                /* INSERTE EL REGISTRO DE LA BASE */
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, 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(137, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                TIPOCUEN = 'N';
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, 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(137, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                TIPOCUEN = 'N';
            if (TIPOCUEN = 'N') then
                begin
                if (VREXTRA > 0) then
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
                else
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, (:VREXTRA*-1), 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                end
            end
          end

        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K') or (CXP = 'I') ) then
            begin
            SUMA = VRTOTAL;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            if (CXP = 'I') then
                select i.impo_ctainv from factura_proforma f, importacion i where f.fapo_idimpor = i.impo_id
                    and f.fapo_id = :iddoc into :CTACXP;

            execute procedure CUENTA_INTERFAZ(137, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                TIPOCUEN = 'N';
            if (TIPOCUEN = 'N') then
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, 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 = '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(137, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                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_DOCTIPOA, CNDE_DOCTIPON)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, 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_DOCTIPOA, CNDE_DOCTIPON)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, 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(137, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                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_DOCTIPOA, CNDE_DOCTIPON)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, 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_DOCTIPOA, CNDE_DOCTIPON)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
                        end
                    end
                end
            end
        end
    if (ERROR > 0) then
        VER = 'S';
    suspend;
    end
else
    begin
    execute PROCEDURE ERRORINT (137, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    suspend;
    end
end^


ALTER PROCEDURE CONTABIL_FACTCOMP_INTN (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE PRTCREE NUMERIC(9,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE RTCREE CHAR(1);
DECLARE VARIABLE CTARTCREE VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,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 BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(15);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
declare variable SIMPLIF CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
/* INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCO_INVEN, N.INCO_IVA, N.INCO_CONSUMO, N.INCO_CXP, N.INCO_RTFTE, N.INCO_RTIVA, N.INCO_RTICA, N.INCO_RTCREE,
    N.INCO_CTAINVEN, N.INCO_CTAIVA, N.INCO_CTACONSUMO, N.INCO_CTADTO, N.INCO_CTAADIC, N.INCO_CTAEXTRA, N.INCO_CTACXP, N.INCO_CTARTFTE, N.INCO_CTARTIVA,
    N.INCO_CTARTICA, N.INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO, INCO_EQUIVALENCIA
    FROM INTERFAZ_COMPRAS I, interfaz_compras_niif N WHERE I.INCO_ID = :IDINTER AND I.inco_id = N.inco_id
    INTO :EXISTE, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :RTCREE,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA,
    :CTARTICA, :CTARTCREE, :VER, :CENT, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
  if (EXISTE = 'S') then
    BEGIN
    /* ENCABEZADO DE LA FACTURA */
    select PREF_PRE, F.fapo_numero, FAPO_FECHA, F.TERC_NIT, F.fapo_vence, F.fapo_dtomonto, F.fapo_adicional, F.fapo_ivamonto, F.fapo_extra, F.fapo_total,
        TERC_NOM, PROV_CTARFTENIIF, PROV_CTARIVANIIF, PROV_CTARICANIIF, PROV_CTAPAGNIIF, F.fapo_anulado
        from factura_proforma F, TERCEROS T, PROVEEDORES P where FAPO_ID = :IDDOC and F.TERC_NIT = T.TERC_NIT and T.TERC_NIT = P.TERC_NIT
        into :PREFIJO, :NUM, :FECAUX, :NIT, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL,
        :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :ANULADO;
    /* CENTRO DE LA BODEGA */
    if (CENT = 'P') then        /* CENTRO DEL PREFIJO */
        select PREF_CENTRO, PREF_PROY from PREFIJOS P, factura_proforma F where P.PREF_PRE = F.PREF_PRE and F.fapo_id = :IDDOC and P.TIDO_COD = 137
            into :CENTRO, :PROY;
    else if (CENT = 'F') then        /* CENTRO DEL PREFIJO */
        select F.fapo_centro, F.fapo_proy from factura_proforma F where F.fapo_id = :IDDOC
            into :CENTRO, :PROY;
    else
        select IMPO_CENTRO, IMPO_PROY from importacion I, factura_proforma F where I.impo_id = F.fapo_idimpor and F.fapo_id = :IDDOC
            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);
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,36);
        NUMITEMS = 100000;
        SUMA = 0;
        NETO = 0;
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        select sum(F.fpde_consumo) from factura_proforma_det F where fapo_id = :IDDOC into :valoradic;
        FACTOR = 1;
        DIG = -2;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(FPDE_CANT AS DOUBLE PRECISION) * (fpde_prunit-FPDE_DTOMONTO)), SUM(FPDE_IVAMONTO), SUM(FPDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, factura_proforma_det F WHERE F.fapo_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;
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(1137, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FPDE_CANT * (FPDE_PRUNIT-FPDE_DTOMONTO)), FPDE_IVAMONTO, FPDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, factura_proforma_det F WHERE F.fapo_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        MONTO = MONTO * 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(FPDE_CANT AS DOUBLE PRECISION) * (FPDE_PRUNIT-FPDE_DTOMONTO)), SUM(FPDE_IVAMONTO), SUM(FPDE_CONSUMO), MAX(BODE_COD)
                FROM factura_proforma_det WHERE FAPO_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;
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(1137, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                   BEGIN
                    FOR SELECT ARTI_COD, (FPDE_CANT * (FPDE_PRUNIT-FPDE_DTOMONTO)), FPDE_IVAMONTO, FPDE_CONSUMO
                      FROM factura_proforma_det WHERE FAPO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       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
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(1137, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(1137, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(1137, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                else
                    begin
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                    if (CTAEXTRA <> '') then
                        CUENTA = CTAEXTRA;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    end
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                else
                    begin
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                    if (CTAEXTRA <> '') then
                        CUENTA = CTAEXTRA;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                    end
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(1137, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER AND INCC_CN <> 'C'
            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 = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(1137, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(1137, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1137, :IDDOC, :PREFIJO, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_FACTCOMP_IVA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(15);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
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,21) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(TAIV_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM TARIFA_IVA T, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.fcde_ivaporc = T.taiv_porc
                GROUP BY TAIV_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(TAIV_CTAIVACMP), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM TARIFA_IVA T, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.fcde_ivaporc = T.taiv_porc AND FCDE_IVAMONTO <> 0
                GROUP BY TAIV_CTAIVACMP
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERROR = ERROR + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

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


ALTER PROCEDURE CONTABIL_FACTCOMP_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE PRTCREE NUMERIC(9,2);
DECLARE VARIABLE VRRTCREE NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE RTFTE CHAR(1);
DECLARE VARIABLE CTARTFTE VARCHAR(20);
DECLARE VARIABLE RTIVA CHAR(1);
DECLARE VARIABLE CTARTIVA VARCHAR(20);
DECLARE VARIABLE RTICA CHAR(1);
DECLARE VARIABLE CTARTICA VARCHAR(20);
DECLARE VARIABLE RTCREE CHAR(1);
DECLARE VARIABLE CTARTCREE VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE PORC NUMERIC(5,2);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE TCTARTFTE VARCHAR(20);
DECLARE VARIABLE TCTARTIVA VARCHAR(20);
DECLARE VARIABLE TCTARTICA VARCHAR(20);
DECLARE VARIABLE TCTARTCREE VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(15);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
declare variable SIMPLIF CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
/* INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCO_INVEN, N.INCO_IVA, N.INCO_CONSUMO, N.INCO_CXP, N.INCO_RTFTE, N.INCO_RTIVA, N.INCO_RTICA, N.INCO_RTCREE,
    N.INCO_CTAINVEN, N.INCO_CTAIVA, N.INCO_CTACONSUMO, N.INCO_CTADTO, N.INCO_CTAADIC, N.INCO_CTAEXTRA, N.INCO_CTACXP, N.INCO_CTARTFTE, N.INCO_CTARTIVA,
    N.INCO_CTARTICA, N.INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO, INCO_EQUIVALENCIA
    FROM INTERFAZ_COMPRAS I, interfaz_compras_niif N WHERE I.INCO_ID = :IDINTER AND I.inco_id = N.inco_id
    INTO :EXISTE, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :RTCREE,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA,
    :CTARTICA, :CTARTCREE, :VER, :CENT, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
  if (EXISTE = 'S') then
    BEGIN
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO,
        FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO,
        FACO_RTCREE, FACO_RTCREEM, TERC_NOM, PROV_CTARFTENIIF, PROV_CTARIVANIIF, PROV_CTARICANIIF, PROV_CTARCREENIIF, PROV_CTAPAGNIIF, FACO_NUMPROV,
        FACO_ANULADO, PROV_SIMPLIFICADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA,
        :prtcree, :vrrtcree, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, :TCTAPROV, :NUMPROV, :ANULADO, :simplif;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, FACTURAS_COMPRA F WHERE P.PREF_PRE = F.PREF_PRE AND F.FACO_ID = :IDDOC AND P.TIDO_COD = 21 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,21) || '-NPROV.' || NUMPROV;
        NUMITEMS = 100000;
        SUMA = 0;
        NETO = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'DOCUMENTOS' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if ((IVA = 'A') AND (SIMPLIF = 'N')) then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FCDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                if (MERCANCIA <> 0) then
                    IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    IMPTOS = 0;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                if (MERCANCIA <> 0) then
                    MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    MONTO = 0;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (MERCANCIA <> 0) then
                            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        if (MERCANCIA <> 0) then
                            MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            MONTO = 0;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if ((IVA = 'K') or (SIMPLIF = 'S')) then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC  AND FCDE_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                if (MERCANCIA <> 0) then
                    IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    IMPTOS = 0;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                if (MERCANCIA <> 0) then
                    MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    MONTO = 0;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (SIMPLIF = 'S') then
                    BEGIN
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA DE IVA PARA EL REGIMEN SIMPLIFICADO') returning_values (:CTAIVA);
                    END
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        if (MERCANCIA <> 0) then
                            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        if (MERCANCIA <> 0) then
                            MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            MONTO = 0;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                else
                    begin
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                    if (CTAEXTRA <> '') then
                        CUENTA = CTAEXTRA;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    end
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                else
                    begin
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                    if (CTAEXTRA <> '') then
                        CUENTA = CTAEXTRA;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                    end
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

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


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

  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO,
    FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_RTCREE, FACT_RTCREEM,
    FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO, T.terc_nitconta, terc_exento
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree,
        :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta, :tercexento;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
  if (ANULADO = 'N') then
    BEGIN
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    SELECT SUM (FADE_INALCM) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO INALC;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETENCION */

    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);
    VENCE = VENCEAUX;
    /* ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 41 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,41);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    if (:tercexento = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA CONTABLE PARA VENTAS A CLIENTES EXENTOS DE IVA') returning_values (:CTAVENTAS);
        VENTAS = 'K';
        END
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_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 /* MONTO <> 0 */
        END /* VENTAS C O K */
    if (VENTAS = 'A') then
        BEGIN
        /* decreto 1818 */
        SELECT PREF_DEC1818 FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :pref INTO :DEC1818;
        if (DEC1818 = 'S') then
            BEGIN
            SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b, GRUPO G
            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 AND G.grup_cod = A.grup_cod AND G.grup_dec1818 = 'S'
            INTO :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI;

            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, :ctad1818, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                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 /* MONTO <> 0 */
            END
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b, grupo G
            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 AND G.grup_cod = A.grup_cod AND ((G.grup_dec1818 = 'N') or (:dec1818 = 'N'))
            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 (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 /* MONTO <> 0 */
            END
        END /* VENTAS A */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), sum(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            AND FADE_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_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   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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 /* IMPTOS <> 0 */
        END /* IVA K */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_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 /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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 /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* IMP NACIONAL CONSUMO */
        BEGIN
        SELECT SUM(FADE_INALCM), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM) FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            FADE_INALCM <> 0
            INTO :IMPTOS, :MONTO;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (MONTO <> 0) then
            PORC = IMPTOS / MONTO;
        execute procedure redondee(PORC, 0) returning_values (PORC);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA EL IMPUESTO NACIONAL AL CONSUMO') returning_values (ctaconsumo);
            if ((ctaconsumo <> '') AND (ctaconsumo IS NOT null)) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 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, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            debito = 0;
            credito = 0;
            if (VREXTRA > 0) then
                CREDITO = VREXTRA;
            else
                DEBITO = ABS(VREXTRA);
            if (TIPOCUEN = 'C') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:VREXTRA), 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            ELSE
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:VREXTRA), 0, 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END

            END
        END /* VR. EXTRA */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      if (VRRTFTE <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
          FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
          WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
          GROUP BY COAR_CTARTFTEV
          INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
          END
        END /* RTFTE */
      END
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    if (RTICA = 'A') then
      BEGIN
      if (VRRTICA <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTICAV), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)/1000)*:prtica)
          FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
          WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
          GROUP BY COAR_CTARTICAV
          INTO :ctartica, :MONTO, :vrrtica
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtica = vrrtica * FACTOR;
          execute procedure redondee(vrrtica, DIG) returning_values (vrrtica);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtica <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :ctartica, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :MONTO, :prtica/10, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :MONTO, :prtica/10, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            END
          END
        END
      END   /* RTICA */
    if ((RTCREE = 'C') or (RTCREE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTCREE, DIG) returning_values (VRRTCREE);
      if (VRRTCREE <> 0) then
        BEGIN
        if (RTCREE = 'C') then
            CTARTCREE = TCTARTCREE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTCREE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTCREE, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTCREE;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTCREE, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTCREE;
            END
        /* AUTORETECREE */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, :IDDOC, :ctartcree, 2);
                CUENTA = ctartcree;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            END
        END /* RTCREE */
      END
    if (RTCREE = 'A') then
      BEGIN
      if (VRRTCREE <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTCREE), MAX(COAR_RTCREE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTCREE)
          FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
          WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
          GROUP BY COAR_CTARTCREE
          INTO :ctartcree, :prtcree, :MONTO, :vrrtcree
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtcree = vrrtcree * FACTOR / 100;
          execute procedure redondee(vrrtcree, DIG) returning_values (vrrtcree);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtcree <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :ctartcree, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            /* AUTORETENCION */
            if (fautorcree <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :ctartcree, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - vrrtcree;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - vrrtcree;
                    END
                END
            END
          END
        END /* RTCREE */
      END
    /* ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE F, ARTICULO A
        WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        BEGIN
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        /* reste las retenciones en la misma cuenta (4 digitos) */
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA DE CARTERA PARA INGRESOS DE TERCEROS') returning_values(:CTAVENTAS);
        select sum(cnde_debitos-cnde_creditos) from contabilizacion_det where cntb_id = :idc and substring(cnde_cuenta from 1 for 4) = substring(:ctaventas from 1 for 4)
            into :vrrtfte;
        if (vrrtfte is null) then
            vrrtfte = 0;
        monto = monto - vrrtfte;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END
    /* CIERRE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE IMPOCONSUMO DEL COSTO */
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            SUMA = SUMA + IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* CUENTA DE CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        ELSE
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS CV, FACTURAS_DETALLE D WHERE CV.cove_item = D.fade_item AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER AND INVC_CN <> 'N'
        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;
            if (:BASEADIC = 'COSTO') then
                BEGIN
                SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :valoradic;
                END
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


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

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

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro), MAX(T.taiv_porc)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b, TARIFA_IVA T
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND T.taiv_cod = A.taiv_cod AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT, TAIV_PORC
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI, :porcajus
            DO
            BEGIN
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecaux AND AJCI_FECFIN >= :fecaux
                INTO :factoraj;
            if (factoraj is not null) then
                MONTO = MONTO * factoraj;

            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                        MONTO = MONTO + VRCONSUMO;
                    if ((CTADTO IS NULL) OR (CTADTO = '')) then
                        MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (MONTO <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO), MAX(T.taiv_porc)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.taiv_cod = T.taiv_cod AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV, T.taiv_porc
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC, :porcajus
        DO
            BEGIN
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecaux AND AJCI_FECFIN >= :fecaux
                INTO :factoraj;
            if (factoraj is not null) then
                BEGIN
                MONTO = MONTO * factoraj;
                IMPTOS = IMPTOS * factoraj;
                END

            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    MONTO = MONTO * -1;
                    MONTO = MONTO * FACTOR;
                    IMPTOS = IMPTOS * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTFTEV
        INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SUMA = SUMA + IMPTOS;
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS CV, FACTURAS_DETALLE D WHERE CV.cove_item = D.fade_item AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


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

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

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


ALTER PROCEDURE CONTABIL_FACTURA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecaux date;
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable prtcree numeric(9,2);
declare variable vrrtcree numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable rtcree char(1);
declare variable ctartcree varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable tctartcree varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable INALC numeric(18,2);
declare variable fomento varchar(2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
declare variable TERCEXENTO CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INVE_VENTAS, N.INVE_IVA, N.INVE_CONSUMO, N.INVE_CARTERA, N.INVE_RTFTE, N.INVE_RTIVA, N.INVE_RTICA, N.INVE_RTCREE,
    N.INVE_COSTO, N.INVE_INVEN, N.INVE_CTAVENTAS, N.INVE_CTAIVA, N.INVE_CTACONSUMO, N.INVE_CTADTO, N.INVE_CTAADIC, N.INVE_CTAEXTRA,
    N.INVE_CTACARTERA, N.INVE_CTARTFTE, N.INVE_CTARTIVA, N.INVE_CTARTICA, N.INVE_CTARTCREE, N.INVE_CTAINVEN, N.INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO, INVE_EQUIVALENCIA
    FROM interfaz_ventas I, interfaz_ventas_niif N
      WHERE I.inve_id = :IDINTER AND I.inve_id = N.inve_id
      INTO :EXISTE, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :RTCREE,
      :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA,
      :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTAINVEN, :CTACOSTOS, :VER, :CENT, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
  EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'TERCEROS', 'CONTABILIZAR VENTAS Y RECIBOS DE CAJA CON TERCERO CONTABLE EN LUGAR DEL NIT') returning_values (CNTNIT);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
  if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
  else
    FAUTORET = '9999/12/31';
  if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
  else
    FAUTORCREE = '9999/12/31';

  if (EXISTE = 'S') then
    BEGIN
    SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO,
      FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_RTCREE, FACT_RTCREEM,
      FACT_NOMCLIENTE, TERC_CTARFTENIIF, TERC_CTARIVANIIF, TERC_CTARICANIIF, TERC_CTARCREENIIF, TERC_CTAVTANIIF, TERC_CTACLIENIIF, FACT_ANULADO, T.terc_nitconta, terc_exento
      FROM FACTURAS F, TERCEROS T
      WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
      INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree,
        :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta, :tercexento;
    if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
      NIT = NITCONTA;
    if (ANULADO = 'N') then
      BEGIN
      IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
          WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
      IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
          WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
      IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, FACTURAS F
          WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
      NUMERO = PREF || NUM;
      SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
      SELECT SUM (FADE_INALCM) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO INALC;
      VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC;
    
      EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
      if (DTOXIT = 'SI') then
        VRDTO = 0;
      MERCANCIA = VRSUBT - VRADIC + VRDTO;
      EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
      if (STRLEN(NOMBRE)> 41 ) then
        CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,41);
      ELSE
        CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
      NROI = 100000;
      SUMA = 0;

      if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
      ELSE
        FACTOR = 1;
      SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
      if (:tercexento = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA CONTABLE PARA VENTAS A CLIENTES EXENTOS DE IVA') returning_values (:CTAVENTAS);
        VENTAS = 'K';
        END
      IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
          CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
          FROM FACTURAS_DETALLE F
          WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
          INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
          MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
          MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
          BEGIN
          EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
          if (ERRORC <> 0) then
            ERROR = ERROR + 1;
          if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
              VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA - MONTO;
            END
          ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
              VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - MONTO;
            END
          END
        END
      if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, contabil_articulo_niif C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                ELSE
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            END
        END
      if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), sum(FADE_CONSUMO)
            FROM ARTICULO A, contabil_articulo_niif C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            AND FADE_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END
        END
      if (IVA = 'K') then
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END
        END
      if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, contabil_articulo_niif C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END
        END
      if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END
        END
      /* IMP NACIONAL CONSUMO */
      SELECT SUM(FADE_INALCM), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM) FROM FACTURAS_DETALLE F
        WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
        FADE_INALCM <> 0
        INTO :IMPTOS, :MONTO;
      execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
      if (MONTO <> 0) then
        PORC = IMPTOS / MONTO;
      execute procedure redondee(PORC, 0) returning_values (PORC);
      if (IMPTOS <> 0) then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA EL IMPUESTO NACIONAL AL CONSUMO') returning_values (ctaconsumo);
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA - IMPTOS;
            END
        ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - IMPTOS;
            END
        END
      if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END
      if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END
      if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END
      if ((RTFTE = 'C') or (RTFTE = 'K')) then
        BEGIN
        execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
        if (VRRTFTE <> 0) then
          BEGIN
          if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
          EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
          if (ERRORC <> 0) then
            ERROR = ERROR + 1;
          if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
          ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
          /* AUTORETENCION */
          if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
          END
        END
      if (RTFTE = 'A') then
        BEGIN
        if (VRRTFTE <> 0) then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
              FROM contabil_articulo_niif C, FACTURAS_DETALLE F
              WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
              GROUP BY COAR_CTARTFTEV
              INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
              DO
              BEGIN
              MONTO = MONTO * FACTOR;
              if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    /* AUTORETENCION */
                    if (FAUTORET <= fecaux) then
                        BEGIN
                        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                        if (ERRORC <> 0) then
                            ERROR = ERROR + 1;
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                            NROI = NROI + 1;
                            SUMA = SUMA - VRRTFTE;
                            END
                        ELSE
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - VRRTFTE;
                            END
                        END
                    END
                END
              END
          END
        END
      if ((RTIVA = 'C') or (RTIVA = 'K')) then
        BEGIN
        execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
        if (VRRTIVA <> 0) then
          BEGIN
          if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
          EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
          if (ERRORC <> 0) then
            ERROR = ERROR + 1;
          if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
          ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
          END
        END
      if ((RTICA = 'C') or (RTICA = 'K')) then
        BEGIN
        execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
        if (VRRTICA <> 0) then
          BEGIN
          if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
          EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
          if (ERRORC <> 0) then
            ERROR = ERROR + 1;
          if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
          ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
          END
        END
      if (RTICA = 'A') then
        BEGIN
        if (VRRTICA <> 0) then
          BEGIN
          FOR SELECT MAX(COAR_CTARTICAV), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)/1000)*:prtica)
              FROM contabil_articulo_niif C, FACTURAS_DETALLE F
              WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
              GROUP BY COAR_CTARTICAV
              INTO :ctartica, :MONTO, :vrrtica
              DO
              BEGIN
              MONTO = MONTO * FACTOR;
              vrrtica = vrrtica * FACTOR;
              execute procedure redondee(vrrtica, DIG) returning_values (vrrtica);
              execute procedure redondee(MONTO, DIG) returning_values (MONTO);
              if (vrrtica <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :ctartica, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :MONTO, :prtica/10, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtica;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :MONTO, :prtica/10, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtica;
                    END
                END
              END
          END
        END
      if ((RTCREE = 'C') or (RTCREE = 'K')) then
        BEGIN
        execute procedure redondee(VRRTCREE, DIG) returning_values (VRRTCREE);
        if (VRRTCREE <> 0) then
          BEGIN
          if (RTCREE = 'C') then
            CTARTCREE = TCTARTCREE;
          EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTCREE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
          if (ERRORC <> 0) then
            ERROR = ERROR + 1;
          if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTCREE, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTCREE;
            END
          ELSE
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTCREE, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTCREE;
            END
          /* AUTORETECREE */
          if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTCREE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            END
          END
        END
      if (RTCREE = 'A') then
        BEGIN
        if (VRRTCREE <> 0) then
          BEGIN
          FOR SELECT MAX(COAR_CTARTCREE), MAX(COAR_RTCREE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTCREE)
              FROM contabil_articulo_niif C, FACTURAS_DETALLE F
              WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
              GROUP BY COAR_CTARTCREE
              INTO :ctartcree, :prtcree, :MONTO, :vrrtcree
              DO
              BEGIN
              MONTO = MONTO * FACTOR;
              vrrtcree = vrrtcree * FACTOR / 100;
              execute procedure redondee(vrrtcree, DIG) returning_values (vrrtcree);
              execute procedure redondee(MONTO, DIG) returning_values (MONTO);
              if (vrrtcree <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :ctartcree, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtcree;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtcree;
                    END
                /* AUTORETENCION */
                if (fautorcree <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
                    EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :ctartcree, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - vrrtcree;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - vrrtcree;
                        END
                    END
                END
              END
          END
        END
      /* ARTICULOS DE TERCEROS */
      SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE F, ARTICULO A
        WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
      if (MONTO IS NULL) then
        MONTO = 0;
      if (MONTO <> 0) then
        BEGIN
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        /* reste retenciones en la misma cuenta (4 digitos) */
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA DE CARTERA PARA INGRESOS DE TERCEROS') returning_values(:CTAVENTAS);
        select sum(cnde_debitos-cnde_creditos) from contabilizacion_det where cntb_id = :idc and substring(cnde_cuenta from 1 for 4) = substring(:ctaventas from 1 for 4)
            into :vrrtfte;
        if (vrrtfte is null) then
            vrrtfte = 0;
        monto = monto - vrrtfte;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END
        END
      /* CIERRE CONTRA EL TERCERO O LA CONSTANTE */
      if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE IMPOCONSUMO DEL COSTO */
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            SUMA = SUMA + IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* CUENTA CAJA */
            SELECT CAJA_CTANIIF FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        ELSE
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END
      /* COSTOS EN VENTAS */
      EXECUTE PROCEDURE costo_en_ventas_niif(31, :IDDOC);
      if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM costo_ventas_niif CV, FACTURAS_DETALLE D WHERE CV.cove_item = D.fade_item AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            END
        END
      if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM costo_ventas_niif WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END
        END
      if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM costo_ventas_niif WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            END
        END
      if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM costo_ventas_niif WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END
        END
      /* cuentas adicionales */
      FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER AND INVC_CN <> 'C'
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
          END
        if (ERROR > 0) then
            VER = 'S';
        END /* NO ANULADO */
      END /* EXISTE LA INTERFAZ */
    ELSE
      BEGIN
      EXECUTE PROCEDURE ERRORINT(1031, :IDDOC, :PREF, 1);
      ERROR = ERROR + 1;
      VER = 'S';
      END
    end
else
  --VER = 'N';
SUSPEND;
END^


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 prcree numeric(9,2);
declare variable vrrcree numeric(18,2);
declare variable rcree char(1);
declare variable ctarcree varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable 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 tctarcree varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable inalc numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable factoraj double precision;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (autoret);
if (AUTORET <> '') then
    fautoret = CAST(AUTORET AS DATE);
else
    fautoret = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';

/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, 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
  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;

  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTARCREE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, TCTARCREE;
  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), SUM(FACT_RTCREEM)
        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, :vrrcree;
  SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE D, FACTURAS F WHERE D.fact_id = F.fact_id
      AND FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
      INTO MERCANCIA;
  SELECT SUM (FADE_INALCM) FROM FACTURAS_DETALLE D, FACTURAS F WHERE D.fact_id = F.fact_id
      AND FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
      INTO INALC;
  if (INALC IS NULL) then
    INALC = 0;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;

  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;

  if (MERCANCIA <> 0) then
    FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
  ELSE
    FACTOR = 1;

  SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;

  if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL), SUM(FADE_IVAMONTO+FADE_CONSUMO+FADE_INALCM), MAX(TAIV_PORC)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, tarifa_iva T
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.taiv_cod = T.taiv_cod AND 
            F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT, T.taiv_porc
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :porcajus
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecfac AND AJCI_FECFIN >= :fecfac
                INTO :factoraj;
            if (factoraj is not null) then
                MONTO = MONTO * factoraj;

            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO+FADE_CONSUMO+FADE_INALCM)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL), sum(FADE_CONSUMO), MAX(TAIV_PORC)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND A.taiv_cod = T.taiv_cod AND
            FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV, T.taiv_porc
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC, :porcajus
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;

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

            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_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, ROUND(ABS(:IMPTOS*100/:MONTO),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, :MONTO, ROUND(ABS(:IMPTOS*100/:MONTO),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(FADE_IVAMONTO), SUM(FADE_TOTAL), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - VALORADIC;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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, ROUND(ABS(:IMPTOS*100/:MONTO),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, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ROUND(ABS(:IMPTOS*100/:MONTO),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') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* IMP NACIONAL CONSUMO */
        BEGIN
        SELECT SUM(FADE_INALCM), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM)
            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))
            and FADE_INALCM <> 0
            INTO :IMPTOS, :MONTO;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (MONTO <> 0) then
            PORC = IMPTOS / MONTO;
        execute procedure redondee(PORC, 0) returning_values (PORC);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA EL IMPUESTO NACIONAL AL CONSUMO') returning_values (ctaconsumo);
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    /* DESCUENTE IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE D, FACTURAS F WHERE D.fact_id = F.fact_id AND
            ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND
            FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
            INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= :fecfac) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (31, 0, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUM, 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
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    if ((RCREE = 'C') or (RCREE = 'K')) then
      BEGIN
      execute procedure redondee(vrrcree, DIG) returning_values (vrrcree);
      if (vrrcree <> 0) then
        BEGIN
        if (RCREE = 'C') then
            ctarcree = tctarcree;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO, CUEN_PORC FROM CUENTAS
            WHERE CUEN_COD = :ctarcree INTO :CUENTA, :TIPOCUEN, :prcree;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (31, 0, :ctarcree, 2);
            CUENTA = ctarcree;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prcree, :NIT, :PROY, :CENTRO, :NUM, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + vrrcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + vrrcree;
            END
        /* AUTORETECREE */
        if (fautorcree <= fecfac) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctarcree);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_PORC FROM CUENTAS
                WHERE CUEN_COD = :ctarcree INTO :CUENTA, :TIPOCUEN, :prcree;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (31, 0, :ctarcree, 2);
                CUENTA = ctarcree;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, (:VRSUBT*-1), :prcree, :NIT, :PROY, :CENTRO, :NUM, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - vrrcree;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, (:VRSUBT*-1), :prcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrcree;
                END
            END
        END /* RCREE */
      END
    /* CIERRE CONTRA CUENTA DEL TERCERO O CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO_NIT (
    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 inalc 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 CUALQUIER 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 AND TERC_NIT = :NIT
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE D, FACTURAS F WHERE D.fact_id = F.fact_id
      AND FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF AND TERC_NIT = :NIT
      AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
      INTO MERCANCIA;
  SELECT SUM (FADE_INALCM) FROM FACTURAS_DETALLE D, FACTURAS F WHERE D.fact_id = F.fact_id
      AND FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF AND TERC_NIT = :NIT
      AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
      INTO INALC;
  if (INALC IS NULL) then
    INALC = 0;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* 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(T.taiv_ctavta), SUM(FADE_TOTAL), SUM(FADE_IVAMONTO+FADE_CONSUMO+FADE_INALCM), MAX(fd.fade_tiva)
            FROM tarifa_iva T, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.fade_tiva = T.taiv_cod AND TERC_NIT = :NIT 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 TAIV_CTAVTA, fd.fade_tiva
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :porcajus
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecfac AND AJCI_FECFIN >= :fecfac
                INTO :factoraj;
            if (factoraj is not null) then
                MONTO = MONTO * factoraj;

            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (FADE_TOTAL), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA
                        AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND TERC_NIT = :NIT
                        AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO+FADE_CONSUMO+FADE_INALCM)
            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 TERC_NIT = :NIT AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_TOTAL, (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA
                    AND FACT_ANULADO = 'N' AND TERC_NIT = :NIT 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(t.taiv_ctaivavnt), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL), sum(FADE_CONSUMO), MAX(fd.fade_tiva)
            FROM 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.fade_tiva = T.taiv_cod AND TERC_NIT = :NIT AND 
            FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAIVAVNT, FD.fade_tiva
            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) and (MONTO <> 0)) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_IVAMONTO, FADE_TOTAL, TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA
                        AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND TERC_NIT = :NIT
                        AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - VALORADIC;
                        MONTO = MONTO * -1;
                        MONTO = MONTO * FACTOR;
                        IMPTOS = IMPTOS * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA
            AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND TERC_NIT = :NIT
            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) AND (MONTO <> 0)) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_TOTAL, FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA
                    AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND TERC_NIT = :NIT
                    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 TERC_NIT = :NIT
            AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA
                        AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND TERC_NIT = :NIT
                        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 TERC_NIT = :NIT AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA
                    AND FACT_ANULADO = 'N' AND TERC_NIT = :NIT 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 */
    /* IMP NACIONAL CONSUMO */
        BEGIN
        SELECT SUM(FADE_INALCM), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM)
            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 TERC_NIT = :NIT AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            and FADE_INALCM <> 0
            INTO :IMPTOS, :MONTO;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (MONTO <> 0) then
            PORC = IMPTOS / MONTO;
        execute procedure redondee(PORC, 0) returning_values (PORC);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA EL IMPUESTO NACIONAL AL CONSUMO') returning_values (ctaconsumo);
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTACONSUMO, 2);
                CUENTA = CTACONSUMO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado_NIT(:fecfac,  :pref, :ptvta, :NIT);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0 AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
                    INTO :ART, :MONTO
                DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_LIQRUTA (
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CXPAGAR CHAR(1);
declare variable CTAPAGAR 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 NITCLI VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable ANTICIPO NUMERIC(18,2);
declare variable INGRESO NUMERIC(18,2);
declare variable BECAS NUMERIC(18,2);
declare variable CTAANTICIPO VARCHAR(20);
declare variable CTAINGRESO VARCHAR(20);
declare variable CTABECAS VARCHAR(20);
declare variable CTAINGEMP VARCHAR(20);
declare variable RETFTEP NUMERIC(18,2);
declare variable RETICAP NUMERIC(18,2);
declare variable RETFTEM NUMERIC(18,2);
declare variable RETICAM NUMERIC(18,2);
declare variable EFECTIVOS NUMERIC(18,2);
declare variable RELEVOSP NUMERIC(18,2);
declare variable RELEVOSN NUMERIC(18,2);
declare variable VRCONCEPTO NUMERIC(18,2);
declare variable CTACONCEPTO VARCHAR(20);
declare variable CTARETEFTE VARCHAR(20);
declare variable CTARETEICA VARCHAR(20);
declare variable PORCOMIT NUMERIC(9,2);
declare variable PORCOMIC NUMERIC(9,2);
declare variable CTACOMIC VARCHAR(20);
declare variable COMITOT NUMERIC(18,2);
declare variable COMICOL NUMERIC(18,2);
declare variable NITCOL VARCHAR(20);
declare variable BASE NUMERIC(18,2);
declare variable RUTA INTEGER;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable PAGO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
PREF = '0000';
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_CONFIRMAR, INVE_CARTERA, INVE_CTACARTERA, inve_ctartfte, INVE_CTARTICA,
    INVE_CTACONSUMO, INVE_CTAVENTAS
    FROM interfaz_ventas IT
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VER, :CXPAGAR, :CTAPAGAR, :ctaretefte, :ctareteica,
        :ctaingreso, :ctaingemp;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 182 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO  */
    SELECT L.liqr_numero, L.liqr_fecha, L.liqr_conductor, L.liqr_vranticipos, L.liqr_vrcontratos, L.liqr_vrefectivos, L.liqr_vrrelevosp, L.liqr_vrrelevosn,
        L.liqr_rtftepor, L.liqr_rtftemonto, L.liqr_rticapor, L.liqr_rticamonto, L.liqr_comimonto, L.liqr_ruta, L.liqr_becas
        FROM liquidacion_ruta_colegio L WHERE L.liqr_id = :IDDOC
        INTO :NUM, :FECAUX, :nitcli, :ANTICIPO, :INGRESO, :EFECTIVOS, :RELEVOSP, :RELEVOSN,
        :RETFTEP, :RETFTEM, :RETICAP, :RETICAM, :comitot, :ruta, :becas;
    NUMERO = NUM;
    SELECT PREF_CENTRO, PREF_PROY FROM prefijos P WHERE P.pref_pre = '0000' AND P.tido_cod = 182
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONC = 'LIQUIDACION RUTA No. ' || :NUMERO;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 182, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    ERROR = 0;

    suma = 0;
    if (INGRESO <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaingreso INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctaingreso, 2);
            CUENTA = ctaingreso;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :ingreso, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + ingreso;
            END
        END
    /* BECAS */
    if (BECAS <> 0) then
        BEGIN
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE PARA BECAS EN LIQUIDACION DE RUTA') returning_values (:ctabecas);
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctabecas INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctabecas, 2);
            CUENTA = ctabecas;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :becas, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + becas;
            END
        end
    /* RELEVOS+ */
    if (relevosp <> 0) then
        BEGIN
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE PARA RELEVOS PAGADOS EN LIQUIDACION DE RUTA') returning_values (:ctabecas);
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctabecas INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctabecas, 2);
            CUENTA = ctabecas;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :relevosp, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - relevosp;
            END
        end
    /* RELEVOS- */
    if (relevosp <> 0) then
        BEGIN
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE PARA RELEVOS DESCONTADOS EN LIQUIDACION DE RUTA') returning_values (:ctabecas);
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctabecas INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctabecas, 2);
            CUENTA = ctabecas;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :relevosn, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + relevosn;
            END
        end
    /* EFECTIVOS */
    if (EFECTIVOS <> 0) then
        BEGIN
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE PARA EFECTIVOS EN LIQUIDACION DE RUTA') returning_values (:ctabecas);
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctabecas INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctabecas, 2);
            CUENTA = ctabecas;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :efectivos, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + efectivos;
            END
        end
    /* COMISION */
    if (comitot <> 0) then
        BEGIN
        SELECT R.rutc_porccom, R.rutc_ctacomis, R.rutc_porcentaje, R.rutc_colegio FROM rutas_colegios R WHERE RUTC_ID = :RUTA
            INTO :porcomic, :ctacomic, :porcomit, :nitcol;
        if ((PORCOMIC IS NOT NULL) AND (porcomic <> 0)) then
            BEGIN
            COMICOL = ROUND((comitot / :porcomit) * porcomic, 0);
            COMITOT = COMITOT - COMICOL;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacomic INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctacomic, 2);
                CUENTA = ctacomic;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :comicol, ROUND(:comitot / :porcomit, 0), :porcomic, :nitcol, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - comicol;
                END
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaingemp INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctaingemp, 2);
            CUENTA = ctaingemp;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (retftep <> 0) then
                BASE = retftem * 100 / retftep;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :comitot, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - comitot;
            END
        end /* COMISION */
    /* RETEFUENTE */
    if (retftem <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaretefte INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctaretefte, 2);
            CUENTA = ctaretefte;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (retftep <> 0) then
                BASE = retftem * 100 / retftep;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :retftem, :base, :retftep, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - retftem;
            END
        end /* RETEFTE */
    /* RETEICA */
    if (reticam <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctareteica INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctareteica, 2);
            CUENTA = ctareteica;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (reticap <> 0) then
                BASE = reticam * 100 / reticap;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :reticam, :base, :reticap, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - reticam;
            END
        end /* RETEICA */
    for SELECT R.liqc_valor, CT.cotr_ctaconta, CT.cotr_pago
        FROM liquidacion_ruta_conc R, conceptos_transporte CT
        WHERE r.liqr_id = :iddoc AND R.liqc_concepto = CT.cotr_id AND R.liqc_valor <> 0
        INTO :vrconcepto, :ctaconcepto, :PAGO
        do
        begin
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaconcepto INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctaconcepto, 2);
            CUENTA = ctaconcepto;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (pago = '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, :CUENTA, :CONC, '', :vrconcepto, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + VRCONCEPTO;
                END
            else
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrconcepto, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - VRCONCEPTO;
                END
            NROI = NROI + 1;
            END
        END

    /* ANTICIPO */
    if (ANTICIPO <> 0) then
        BEGIN
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE ANTICIPOS EN LIQUIDACION DE RUTA') returning_values (:ctaanticipo);
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaanticipo INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctaanticipo, 2);
            CUENTA = ctaanticipo;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :anticipo, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - anticipo;
            END
        end /* anticipo */
    /* CUADRE TODO CONTRA LA CXP CONDUCTOR */
    CUENTA = NULL;
    if (SUMA < 0) then
        BEGIN
        DEBITO = ABS(SUMA);
        credito = 0;
        END
    else
        BEGIN
        CREDITO = SUMA;
        DEBITO = 0;
        END
    if (CXPAGAR = 'T') then
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitcli INTO :ctapagar;
    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
        WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
    if (CUENTA IS NULL) then
        begin
        EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :ctapagar, 2);
        CUENTA = ctapagar;
        ERROR = ERROR + 1;
        end
    if (TIPOCUEN = 'I') then
        BEGIN
        EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 3);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'C') then
        BEGIN
        EXECUTE PROCEDURE ERRORINT (182, :IDDOC, :CUENTA, 4);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'N') then
        BEGIN
        if (SUMA > 0) then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        else
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END

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


ALTER PROCEDURE CONTABIL_MANIFIESTO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CXPAGAR CHAR(1);
declare variable CTAPAGAR VARCHAR(20);
declare variable CTAPAGARF VARCHAR(20);
declare variable CTACONCEPTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NITASOC VARCHAR(20);
declare variable NITCLI VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable SUMACAJA NUMERIC(18,2);
declare variable SEGURO NUMERIC(18,2);
declare variable CTASEGURO VARCHAR(20);
declare variable CTACONTRAE VARCHAR(20);
declare variable CTAXCCONTRAE VARCHAR(20);
declare variable FORMA CHAR(1);
declare variable ANTICIPO NUMERIC(18,2);
declare variable CTAANTICIPO VARCHAR(20);
declare variable INGRESO NUMERIC(18,2);
declare variable CTAINGRESO VARCHAR(20);
declare variable RETENCION NUMERIC(18,2);
declare variable FONDOM NUMERIC(18,2);
declare variable CTARETENCION VARCHAR(20);
declare variable PORCRTF NUMERIC(9,2);
declare variable BASE NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PREF, INTR_CONFIRMAR, INTR_CXPAGAR, INTR_CTAPAGAR, intr_ctartfte,
    INTR_CTAINGREM, INTR_CTASEGURO, intr_ctacontrae
    FROM interfaz_transporte
    WHERE INTR_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VER, :CXPAGAR, :CTAPAGAR, :ctaretencion,
        :ctaingreso, :ctaseguro, :ctacontrae;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 89 AND CNTB_IDREF = :IDDOC;

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

    suma = 0;
    for SELECT sum(MNCD_VALOR), SUM(CGRM_SEGURO), max(f.fprm_ctaconta), max(f.fprm_ctaseguro), max(r.cgrm_fpago)
        FROM carga_remesa R, manifiesto_carga_det M, forma_pago_remesa f
        WHERE M.mncd_remesa = R.cgrm_id and R.cgrm_fpago = f.fprm_cod and M.manc_id = :iddoc and r.cgrm_fpago <> 'E'
        group by r.cgrm_fpago
        INTO :sumacaja, :seguro, :ctapagarf, :ctaseguro, :forma
        do
        begin
        if (sumacaja <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctapagarf INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :ctapagarf, 2);
                CUENTA = ctapagarf;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :sumacaja, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + sumacaja;
                END
            END
        end /* do */
    for SELECT sum(MNCD_VALOR), SUM(CGRM_SEGURO), max(f.fprm_ctaconta), max(f.fprm_ctaseguro), max(r.cgrm_nitdest)
        FROM carga_remesa R, manifiesto_carga_det M, forma_pago_remesa f
        WHERE M.mncd_remesa = R.cgrm_id and R.cgrm_fpago = f.fprm_cod and M.manc_id = :iddoc and r.cgrm_fpago = 'E'
        group by r.cgrm_nitdest
        INTO :sumacaja, :seguro, :ctaxccontrae, :ctaseguro, :nitcli
        do
        begin
        if (NITCLI IS NULL) then
            EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') returning_values (:NITCLI);
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaseguro INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :ctaseguro, 2);
            CUENTA = ctaseguro;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :seguro, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - seguro;
            END
        /* CONTRAENTREGA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :ctacontrae, 2);
            CUENTA = ctacontrae;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :sumacaja, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        /* CXC CONTRAENTREGA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaxccontrae INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :ctaxccontrae, 2);
            CUENTA = ctacontrae;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (89, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :sumacaja, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END

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

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


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 ctaxpem varchar(20);
declare variable ctagastem varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(8);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(8);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
declare variable codconc integer;
declare variable base numeric(18,2);
declare variable det char(1);
declare variable ctaadmin char(1);
declare variable CONCXEMP CHAR(2);
declare variable NOMCONC VARCHAR(60);
declare variable NOMTERC VARCHAR(60);
declare variable CONTANETO CHAR(2);
declare variable DEBITO NUMERIC(18, 2);
declare variable CREDITO NUMERIC(18, 2);
declare variable DEBCTA NUMERIC(18, 2);
declare variable CREDCTA NUMERIC(18, 2);
declare variable ITECTA INTEGER;
declare variable GASTO CHAR(1);
declare variable NITGASTO VARCHAR(20);
declare variable NITENT VARCHAR(2);
declare variable AJUSPROV CHAR(2);
declare variable SALDOPRV NUMERIC(18, 2);
declare variable CTARECUP VARCHAR(20);
BEGIN
SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
NUMERO = :periodicidad || :periodo;
SELECT I.tico_cod, I.prco_pre, I.inno_det, I.inno_dtlleadmin FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom,:det,:ctaadmin;
concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
EXECUTE PROCEDURE completa_ceros(:numero)RETURNING_VALUES :numero;
SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
idcontabil = GEN_ID(ID_CONTABILIZA,1);
EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) RETURNING_VALUES (:FECHA);
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'CONTABILIZAR CON CONCEPTO INDIVIDUAL POR CADA EMPLEADO') returning_values (:CONCXEMP);
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'CONTABILIZAR CON IDENTIFICACION DEL EMPLEADO/ADMINISTRADORA EL GASTO DE APORTES') returning_values (:NITGASTO);
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'CONTABILIZAR CON EL NIT DE LA ENTIDAD SI ESTA DISPONIBLE PARA EL CONCEPTO') returning_values (:NITENT);
EXECUTE PROCEDURE lee_configuracion ('NOMINA', 'LIQUIDACION', 'AJUSTAR CONTABLEMENTE PROVISIONES AL HACER PAGO DE CESANTIA, INTERESES O PRIMA') returning_values (AJUSPROV);
EXECUTE PROCEDURE lee_configuracion ('NOMINA', 'LIQUIDACION', 'CUENTA CONTABLE DE RECUPERACION SI PROVISION MAYOR AL PAGO DE CESANTIA, PRIMA O VACACIONES') returning_values (ctarecup);
/* BORRE CUALQUIER OTRA ANTERIOR */
DELETE FROM CONTABILIZACION WHERE CNTB_IDREF = :iddoc AND CNTB_TIPOREF = 92;

INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
    VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
idc = :idcontabil;
itemdet = 0;
IF (DET = 'N') THEN
    BEGIN
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad), MAX(CN.conc_gtoempr), MAX(NC.noco_base)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctagast,nc.terc_nit
        INTO :codconc,:valor, :ctagast, :tercnit, :aporte, :entidad, :gasto, :base
        DO
        BEGIN
        SELECT EMCO_CTAGASTO, EMCO_CTAPAGAR FROM empleado_conceptos WHERE TERC_NIT = :tercnit AND CONC_COD = :codconc
            INTO :ctagastem, :ctaxpem;
        IF (ctagastem IS NOT NULL) THEN
            ctagast = ctagastem;
        IF (ctaxpem IS NOT NULL) THEN
            ctaxp = ctaxpem;

        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 ERRORINT(14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF ((aporte = 'N') or (GASTO = 'N')) THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                BEGIN
                if (NITGASTO = 'EMPLEADO') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            END
        END
    SUSPEND;
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad), MAX(CN.conc_gtoempr), MAX(NC.noco_base)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctacxp,nc.noco_nitcont
        INTO :codconc,:valor, :ctaxp, :tercnit, :aporte, :entidad, :gasto, :base
        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;
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERRORINT(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 > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                if ((ctaxp is null) or (ctaxp = '')) then
                    begin
                    if ((codconc = 905) OR (codconc = 906) or (codconc = 904) OR (codconc = 934)) then
                        SELECT A.admi_ctaafp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 914) OR (codconc = 915) or (codconc = 907) OR (codconc = 938)) then
                        SELECT A.admi_ctaeps FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 912) OR (codconc = 913) OR (codconc = 937)) then
                        SELECT A.admi_ctaafc FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 910) OR (codconc = 911) OR (codconc = 936)) then
                        SELECT A.admi_ctaccf FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 908) OR (codconc = 909) OR (codconc = 935)) then
                        SELECT A.admi_ctaarp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    end
                end
            IF (aporte = 'N') THEN
                BEGIN
                if ((nitent = 'SI') AND (ENTIDAD <> '')) 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);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            END
        END
    SUSPEND;
    if (AJUSPROV = 'SI') then
        BEGIN
        /* SI ES EL PAGO DE CESANTIA, INTERESES O PRIMA AJUSTE LA PROVISION */
        FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad), MAX(CN.conc_gtoempr), MAX(NC.noco_base)
            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 ((CN.CONC_COD = 951) or (CN.CONC_COD = 968) or (CN.CONC_COD = 969) or (CN.CONC_COD = 966) or (CN.CONC_COD = 967))
            group by cn.conc_cod,nc.noco_nitcont
            INTO :codconc, :valor, :ctagast, :tercnit, :aporte, :entidad, :gasto, :base
            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;
            SALDOPRV = 0;
            EXECUTE PROCEDURE saldo_tercero(:ctagast, :tercnit, :fecha) returning_values (:SALDOPRV);
            SALDOPRV = SALDOPRV + :valor;
            SELECT FIRST 1 CONC_CTAGAST FROM conceptos_nomina CN, empleado_conceptos EC WHERE EC.conc_cod = CN.conc_cod AND EC.terc_nit = :tercnit
                AND ((EC.CONC_COD = 912) or (EC.CONC_COD = 913) OR (EC.CONC_COD = 937) or (EC.CONC_COD = 1015)) INTO :ctaxp;
            if (SALDOPRV > 0) 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, 0, :SALDOPRV, 'AJUSTE PROVISION EMPLEADO ' || :tercnit, :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, :SALDOPRV, 0, 'AJUSTE PROVISION EMPLEADO ' || :tercnit, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            if (SALDOPRV < 0) 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, 0, ABS(:SALDOPRV), 'AJUSTE PROVISION EMPLEADO ' || :tercnit, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                if ((ctarecup is not null) and (ctarecup <> ''))  then
                    ctaxp = ctarecup;
                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, ABS(:SALDOPRV), 0, 'AJUSTE PROVISION EMPLEADO ' || :tercnit, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            END
        END
    /* SI LA CONFIGURACION LO INDICA HAGA EL RESUMEN NETO */
    EXECUTE PROCEDURE lee_configuracion('NOMINA', 'LIQUIDACION', 'CONTABILIZAR NETO DEBITO MENOS CREDITO EN CONTABILIZACION RESUMIDA') returning_values (:CONTANETO);
    if (CONTANETO = 'SI') then
        BEGIN
        FOR SELECT CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_PROY, CNDE_CENTRO
            FROM CONTABILIZACION_DET WHERE CNTB_ID = :idcontabil ORDER BY CNDE_ITEM
            INTO :itemdet,  :ctagast, :tercnit, :debcta, :credcta, :proyecto, :centro
            DO
            BEGIN
            FOR SELECT CNDE_ITEM, CNDE_DEBITOS, CNDE_CREDITOS FROM CONTABILIZACION_DET
                WHERE CNTB_ID = :idcontabil AND CNDE_CUENTA = :ctagast AND CNDE_TERC = :tercnit AND CNDE_ITEM > :itemdet 
                AND (((CNDE_PROY = :proyecto) AND (CNDE_CENTRO = :centro)) or
                ((:PROYECTO IS NULL) AND (CNDE_PROY IS NULL) AND (:CENTRO IS NULL) AND (CNDE_CENTRO IS NULL)))
                INTO :itecta, :debito, :credito
                DO
                BEGIN
                if (debcta <> 0) then
                    BEGIN
                    if (CREDITO <> 0) then
                        if (credito > DEBCTA) then
                            BEGIN
                            UPDATE contabilizacion_det SET CNDE_CREDITOS = :CREDITO - CNDE_DEBITOS, CNDE_DEBITOS = 0
                                WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                            CREDCTA = CREDITO - DEBCTA;
                            DEBCTA = 0;
                            END
                        else
                            BEGIN
                            UPDATE contabilizacion_det SET CNDE_DEBITOS = CNDE_DEBITOS - :CREDITO
                                WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                            DEBCTA = DEBCTA - CREDITO;
                            END
                    if (DEBITO <> 0) then
                        BEGIN
                        UPDATE contabilizacion_det SET CNDE_DEBITOS = CNDE_DEBITOS + :DEBITO
                            WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                        DEBCTA = DEBCTA + DEBITO;
                        END
                    END
                ELSE
                    BEGIN
                    if (DEBITO <> 0) then
                        if (debito > credcta) then
                            BEGIN
                            UPDATE contabilizacion_det SET CNDE_DEBITOS = :DEBITO - CNDE_CREDITOS, CNDE_CREDITOS = 0
                                WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                            DEBCTA = DEBITO - CREDCTA;
                            CREDCTA = 0;
                            END
                        else
                            BEGIN
                            UPDATE contabilizacion_det SET CNDE_CREDITOS = CNDE_CREDITOS - :DEBITO
                                WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                            CREDCTA = CREDCTA - DEBITO;
                            END
                    if (CREDITO <> 0) then
                        BEGIN
                        UPDATE contabilizacion_det SET CNDE_CREDITOS = CNDE_CREDITOS + :CREDITO
                            WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                        CREDCTA = CREDCTA + CREDITO;
                        END
                    END
                DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itecta;
                END
            END     
        END
    END
ELSE
    BEGIN
    FOR SELECT NC.conc_cod,NC.NOCO_VALORCONT, CN.conc_ctagast, CN.conc_ctacxp, NC.terc_nit, NC.noco_aporte, NC.noco_entidad, SUBSTRING(CN.conc_nomcorto FROM 1 FOR 14), CN.conc_gtoempr, NC.noco_base
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc
        INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad, :nomconc, :gasto, :base
        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;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERRORINT(14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERRORINT(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 > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                if ((ctaxp is null) or (ctaxp = '')) then
                    begin
                    if ((codconc = 905) OR (codconc = 906) or (codconc = 904) OR (codconc = 934)) then
                        SELECT A.admi_ctaafp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 914) OR (codconc = 915) or (codconc = 907) OR (codconc = 938)) then
                        SELECT A.admi_ctaeps FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 912) OR (codconc = 913) OR (codconc = 937)) then
                        SELECT A.admi_ctaafc FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 910) OR (codconc = 911) OR (codconc = 936)) then
                        SELECT A.admi_ctaccf FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 908) OR (codconc = 909) OR (codconc = 935)) then
                        SELECT A.admi_ctaarp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    end
                end
            if (concxemp = 'SI') then
                BEGIN
                SELECT SUBSTRING(TERC_NOM FROM 1 FOR 45) FROM TERCEROS WHERE TERC_NIT = :tercnit INTO :nomterc;
                CONCEPTO = NOMTERC || '-' || nomconc;
                END
            /* CUENTA DEL GASTO */
            IF ((aporte = 'N') or (GASTO = 'N')) THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                END
            ELSE
                BEGIN
                if (NITGASTO = 'EMPLEADO') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                END
            /* CUENTA POR PAGAR */
            itemdet = itemdet + 1;
            if (APORTE = 'N') then
                BEGIN
                if ((nitent = 'SI') AND (ENTIDAD <> '')) 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);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                END
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
            itemdet = itemdet + 1;
            END
        END
    SUSPEND;
    if (AJUSPROV = 'SI') then
        BEGIN
        /* SI ES EL PAGO DE CESANTIA, INTERESES O PRIMA AJUSTE LA PROVISION */
        FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad), MAX(CN.conc_gtoempr), MAX(NC.noco_base)
            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 ((CN.CONC_COD = 951) or (CN.CONC_COD = 968) or (CN.CONC_COD = 969) or (CN.CONC_COD = 966) or (CN.CONC_COD = 967))
            group by cn.conc_cod,nc.noco_nitcont
            INTO :codconc, :valor, :ctagast, :tercnit, :aporte, :entidad, :gasto, :base
            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;
            SALDOPRV = 0;
            EXECUTE PROCEDURE saldo_tercero(:ctagast, :tercnit, :fecha) returning_values (:SALDOPRV);
            SALDOPRV = SALDOPRV + :valor;
            SELECT FIRST 1 CONC_CTAGAST FROM conceptos_nomina CN, empleado_conceptos EC WHERE EC.conc_cod = CN.conc_cod AND EC.terc_nit = :tercnit
                AND ((EC.CONC_COD = 912) or (EC.CONC_COD = 913) OR (EC.CONC_COD = 937) or (EC.CONC_COD = 1015)) INTO :ctaxp;
            if (SALDOPRV > 0) 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, 0, :SALDOPRV, 'AJUSTE PROVISION EMPLEADO ' || :tercnit, :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, :SALDOPRV, 0, 'AJUSTE PROVISION EMPLEADO ' || :tercnit, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            if (SALDOPRV < 0) 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, 0, ABS(:SALDOPRV), 'AJUSTE PROVISION EMPLEADO ' || :tercnit, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                if ((ctarecup is not null) and (ctarecup <> ''))  then
                    ctaxp = ctarecup;
                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, ABS(:SALDOPRV), 0, 'AJUSTE PROVISION EMPLEADO ' || :tercnit, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            END
        END
    END
END^


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


ALTER PROCEDURE CONTABIL_NOTACRBC_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable CONC CHAR(120);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INBA_BANCO, N.INBA_IVA, N.INBA_GMF, N.INBA_BASE, N.INBA_CTABCO, N.INBA_CTAIVA, N.INBA_CTAGMF, N.INBA_CTABASE, INBA_CONFIRMAR, INBA_EQUIVALENCIA
    FROM INTERFAZ_BANCOS I, interfaz_bancos_niif N
    WHERE I.INBA_ID = :IDINTER AND I.inba_id = N.inba_id
    INTO :EXISTE, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
  if (EXISTE = 'S') then
      BEGIN
      /* TRAIGA EL ENCABEZADO  */
      SELECT PRBA_PREF, NCBC_NUMERO, NCBC_CONCEPTO, NCBC_MONTO, CUBA_CTANIIF, NCBC_ANULADO, BANC_NIT
            FROM NOTAS_CREDITO N, CUENTAS_BANCO C, BANCOS B
            WHERE NCBC_ID = :IDDOC AND C.CUBA_COD = N.CUBA_COD AND B.BANC_COD = C.BANC_COD
            INTO :PREF, :NUM, :CONC, :MONTO, :BCTABANCO, :ANULADO, :NIT;
      if (ANULADO = 'N') then
        BEGIN
        SELECT PRBA_CENTRO, PRBA_PROY
            FROM PREFIJOS_BANCOS P, NOTAS_CREDITO N
            WHERE P.PRBA_PREF = N.PRBA_PREF AND P.CUBA_COD = N.CUBA_COD AND p.tido_cod = 75 and N.NCBC_ID = :IDDOC
            INTO :CENTRO, :PROY;
        NROI = 100000;
        SUMA = 0;
        ERROR = 0;
        /* CUENTA BASE */
        if (BASE = 'K') then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1075, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1075, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1075, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* BASE = K */
        /* CUENTA BANCO */
        if ((BANCO = 'B') or (BANCO = 'K')) then
            BEGIN
            if (BANCO = 'B') then
                CTABANCO = BCTABANCO;
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1075, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1075, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1075, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* SUMA <> 0 */
            END /* BANCO K O B */
            
        /* recorra las cuentas adicionales */
        FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
            FROM INTERFAZ_BANCOS_CTAS
            WHERE INBA_ID = :IDINTER AND INBC_CN <> 'C'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'MONTO') then
                VALORADIC = MONTO;
            MONTO = VALORADIC * PORCADIC;
            
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1075, :IDDOC, :CUENTAADIC, 2);
                CUENTA = CUENTAADIC;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1075, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1075, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NROI = NROI + 1;
                END
            
            NROI = NROI + 1;
            END
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END
      END /* EXISTE */
  ELSE
      BEGIN
      EXECUTE PROCEDURE ERRORINT(1075, :IDDOC, :PREF, 1);
      ERROR = ERROR + 1;
      VER = 'S';
      SUSPEND;
      END
  END
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_NOTACRCL (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable monto NUMERIC(18, 2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCA_BASE, INCA_IVA, INCA_RTFTE, INCA_RTIVA, INCA_RTICA, INCA_RTCREE, INCA_CLIE, INCA_CTABASE, INCA_CTAIVA, INCA_CTARTFTE, INCA_CTARTIVA, INCA_CTARTICA, INCA_CTARTCREE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :CTACLIE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 42 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA NOTA */
    SELECT PREF_PRE, NCCL_NUMERO, NCCL_FECHA, N.TERC_NIT, NCCL_CONC, NCCL_IVAMONTO, NCCL_MONTO, NCCL_RTFTEPORC, NCCL_RTFTEMONTO,
        NCCL_RTIVAPORC, NCCL_RTIVAMONTO, NCCL_RTICAPORC, NCCL_RTICAMONTO, NCCL_RTCREE, NCCL_RTCREEM, TERC_NOM,
        TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NCCL_ANULADO
        FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T
        WHERE NCCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
        :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrcree, :NOMBRE,
        :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO;
    if (ANULADO = 'N') then
      BEGIN
      SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_CREDITO_CLIENTES N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 42 AND NCCL_ID = :IDDOC INTO :CENTRO, :PROY;
      NUMERO = PREF || NUM;
      VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
      EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
      /* REGISTRE EL ENCABEZADO CONTABLE */
      IDC = GEN_ID(ID_CONTABILIZA, 1);
      INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 42, :IDDOC, :PREF, :NUM, 'N');
      NROI = 0;
      SUMA = 0;
      ERROR = 0;
      IF ((BASE = 'C') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'C') THEN
            CTABASE = TCTABASE;
        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC);
                else
                    montobase = VRSUBT;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :montobase, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :montobase, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE CLIENTE O CONSTANTE */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        if ((prtfte = 0) AND (vrsubt <> 0)) then
            prtfte = vrrtfte / vrsubt;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT * -1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT * -1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        if ((porc = 0) AND (vriva <> 0)) then
            porc = vrrtiva / vriva;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        if ((prtica = 0) AND (vrsubt <> 0)) then
            prtica = vrrtica / vrsubt;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((RTCREE = 'C') or (RTCREE = 'K')) then
      if (vrrcree <> 0) then
        BEGIN
        if (RTCREE = 'C') then
            ctarcree = tctartcree;
        if ((prtcree = 0) AND (vrsubt <> 0)) then
            prtcree = vrrcree / vrsubt;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :ctarcree, 2);
            CUENTA = ctarcree;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
            NROI = NROI + 1;
            SUMA = SUMA - vrrcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - vrrcree;
            END
        /* AUTORETENCION */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctarcree);
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctarcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                NROI = NROI + 1;
                SUMA = SUMA + vrrcree;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrcree;
                END
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INCD_CUENTA, INCD_BASE, INCD_PORC, INCD_VALOR, INCD_DB
        FROM INTERFAZ_CARTERA_CTAS
        WHERE INCA_ID = :IDINTER AND INCD_CN <> 'N'
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 42);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 42);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'C') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'C') then
            CTACLIE = TCTACLIEN;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
  BEGIN
  EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :PREF, 1);
  ERROR = ERROR + 1;
  VER = 'S';
  SUSPEND;
  END
END^


ALTER PROCEDURE CONTABIL_NOTACRCL_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable monto NUMERIC(18, 2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCA_BASE, N.INCA_IVA, N.INCA_RTFTE, N.INCA_RTIVA, N.INCA_RTICA, N.INCA_RTCREE, N.INCA_CLIE, N.INCA_CTABASE, N.INCA_CTAIVA, N.INCA_CTARTFTE,
    N.INCA_CTARTIVA, N.INCA_CTARTICA, N.INCA_CTARTCREE, N.INCA_CTACLIE, INCA_CONFIRMAR, INCA_EQUIVALENCIA
    FROM INTERFAZ_CARTERA I, interfaz_cartera_niif N
    WHERE I.INCA_ID = :IDINTER AND I.inca_id = N.inca_id
    INTO :EXISTE, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :CTACLIE, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') 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';
    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
    if (AUTORCREE <> '') then
        FAUTORCREE = CAST(AUTORCREE AS DATE);
    else
        FAUTORCREE = '9999/12/31';
    if (EXISTE = 'S') then
        BEGIN
        /* TRAIGA EL ENCABEZADO DE LA NOTA */
        SELECT PREF_PRE, NCCL_NUMERO, NCCL_FECHA, N.TERC_NIT, NCCL_CONC, NCCL_IVAMONTO, NCCL_MONTO, NCCL_RTFTEPORC, NCCL_RTFTEMONTO,
            NCCL_RTIVAPORC, NCCL_RTIVAMONTO, NCCL_RTICAPORC, NCCL_RTICAMONTO, NCCL_RTCREE, NCCL_RTCREEM,
            TERC_CTAVTANIIF, TERC_CTARFTENIIF, TERC_CTARIVANIIF, TERC_CTARICANIIF, TERC_CTARCREENIIF, TERC_CTACLIENIIF, NCCL_ANULADO
            FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T
            WHERE NCCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
            INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
            :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrcree,
            :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO;
        if (ANULADO = 'N') then
          BEGIN
          SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_CREDITO_CLIENTES N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 42 AND NCCL_ID = :IDDOC INTO :CENTRO, :PROY;
          NUMERO = PREF || NUM;
          VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
          EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
          NROI = 100000;
          SUMA = 0;
          ERRORI = 0;
          IF ((BASE = 'C') OR (BASE = 'K')) THEN
            BEGIN
            IF (BASE = 'C') THEN
                CTABASE = TCTABASE;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (ES_RETENCION = 'S') then
                    if (PORC <> 0) then
                        montobase = FLOOR(VRSUBT / PORC);
                    else
                        montobase = VRSUBT;
                else
                    montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :montobase, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :montobase, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* BASE CLIENTE O CONSTANTE */
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* IVA EN CTA CONSTANTE */
        /* RETENCION FUENTE */
        if ((RTFTE = 'C') or (RTFTE = 'K')) then
          if (VRRTFTE <> 0) then
            BEGIN
            if (RTFTE = 'C') then
                CTARTFTE = TCTARTFTE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT * -1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT * -1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            /* AUTORETENCION */
            if (FAUTORET <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CTARTFTE, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                END
            END /* RTFTE */
        /* RETENCION IVA */
        if ((RTIVA = 'C') or (RTIVA = 'K')) then
          if (VRRTIVA <> 0) then
            BEGIN
            if (RTIVA = 'C') then
                CTARTIVA = TCTARTIVA;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CTARTIVA, 2);
                CUENTA = CTARTIVA;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTIVA;
                END
            END /* RTIVA */
        /* RETENCION DE ICA */
        if ((RTICA = 'C') or (RTICA = 'K')) then
          if (VRRTICA <> 0) then
            BEGIN
            if (RTICA = 'C') then
                CTARTICA = TCTARTICA;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CTARTICA, 2);
                CUENTA = CTARTICA;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTICA;
                END
            END /* RTICA */
        /* RETENCION CREE */
        if ((RTCREE = 'C') or (RTCREE = 'K')) then
          if (vrrcree <> 0) then
            BEGIN
            if (RTCREE = 'C') then
                ctarcree = tctartcree;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :ctarcree, 2);
                CUENTA = ctarcree;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                NROI = NROI + 1;
                SUMA = SUMA - vrrcree;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrcree;
                END
            /* AUTORETENCION */
            if (fautorcree <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctarcree);
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctarcree INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CTARTFTE, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrcree;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrcree;
                    END
                END
            END /* RTCREE */
        /* recorra las cuentas adicionales */
        FOR SELECT INCD_CUENTA, INCD_BASE, INCD_PORC, INCD_VALOR, INCD_DB
            FROM INTERFAZ_CARTERA_CTAS
            WHERE INCA_ID = :IDINTER AND INCD_CN <> 'C'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VRIVA;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTAADIC, 2);
                CUENTA = CUENTAADIC;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 42);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 42);
                    SUMA = SUMA - MONTO;
                    END
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NROI = NROI + 1;
                END
            
            NROI = NROI + 1;
            END
            
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((SUMA <> 0) and ((CLIE = 'C') or (CLIE = 'K'))) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (CLIE = 'C') then
                CTACLIE = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (ERRORI > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
      END /* EXISTE LA INTERFAZ */
    ELSE
      BEGIN
      EXECUTE PROCEDURE ERRORINT(1042, :IDDOC, :PREF, 1);
      ERRORI = ERRORI + 1;
      VER = 'S';
      SUSPEND;
      END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_NOTACRPR (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable BASE3 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable IVA3 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CUENTAADIC VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable MONTOBASE NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable BASERTFTE NUMERIC(18,2);
declare variable IDFAC INTEGER;
declare variable SUMAFAC NUMERIC(18,2);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_RTCREE, INCP_PROV, INCP_CTABASE,
  INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTARTCREE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE,
    :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 52 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO,
    NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, NCPR_RTCREE, NCPR_RTCREEM, TERC_NOM, TERC_CTAVENTA, NCPR_FACID,
    TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NCPR_ANULADO, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_BASE3, NCPR_IVA1, NCPR_IVA2, NCPR_IVA3, NCPR_BASERTFTE
    FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T
    WHERE NCPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
    :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree, :NOMBRE, TCTABASE, :IDFAC,
    :TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO, :BASE0, BASE1, :BASE2, :BASE3, :IVA1, :IVA2, :IVA3, :basertfte;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_CREDITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 52 AND NCPR_ID = :IDDOC INTO :CENTRO, :PROY;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA, PROV_CTARTCREE
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE, tctartcree;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NCPR_CTAPAGAR, NCPR_CTACAUSA
        FROM NOTAS_CREDITO_PROVEEDOR N
        WHERE NCPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

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

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

    NROI = 0;
    SUMA = 0;

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

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, T.taiv_ordimp FROM TARIFA_IVA t WHERE TAIV_ORDIMP <= 3 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (TARIFA = 3) then
                vrsubt = BASE3;
            if (IDFAC <> 0) then
                BEGIN
                /* SI ES A UNA FACTURA REPARTA EL TOTAL PROPORCIONAL A LAS TARIFAS DE LA FACTURA */
                SELECT SUM(FD.fcde_total) FROM facturas_compras_detalle FD WHERE FACO_ID = :idfac INTO :SUMAFAC;
                SELECT SUM(FD.fcde_total) FROM facturas_compras_detalle FD WHERE FACO_ID = :idfac AND FCDE_TIVA = :TARIFA
                    INTO :VRSUBT;
                if (SUMAFAC <> 0) then
                    porcadic = VRSUBT / SUMAFAC;
                VRSUBT = VRTOTAL * PORCADIC;
                END
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* BASE TARIFA IVA */
    IF ((BASE = 'A') AND (IDFAC <> 0)) THEN
        BEGIN
        /* SI ES A UNA FACTURA REPARTA EL TOTAL PROPORCIONAL A LAS CUENTAS DE LA FACTURA */
        SELECT SUM(FD.fcde_total) FROM facturas_compras_detalle FD WHERE FACO_ID = :idfac INTO :SUMAFAC;
        if (SUMAFAC <> 0) then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(FD.fcde_total) FROM facturas_compras_detalle FD, CONTABIL_ARTICULO C
                WHERE FACO_ID = :idfac AND FD.arti_cod = C.arti_cod group by COAR_CTACOMP
                INTO :CTABASE, :VRSUBT
                DO
                BEGIN
                porcadic = VRSUBT / SUMAFAC;
                VRSUBT = VRTOTAL * PORCADIC;
                if (VRSUBT <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    montobase = 0;
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRSUBT;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRSUBT;
                        END
                    END
                END /* FOR */
            END
        END /* BASE ARTICULO */

    if (IVA = 'I') then /* IVA X TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_ORDIMP, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_ORDIMP <> 0) AND (TAIV_ORDIMP <= 3) 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 (TARIFA = 3) then
                BEGIN
                VRIVA = IVA3;
                vrsubt = BASE3 * -1;
                END
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :basertfte, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :basertfte, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
        
    /* RETENCION CREE */
    if ((rtcree = 'T') or (rtcree = 'K')) then
      if (vrrtcree <> 0) then
        BEGIN
        if (rtcree = 'T') then
            ctartcree = tctartcree;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER AND INPC_CN <> 'N'
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_NOTACRPR_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CUENTAADIC VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable MONTOBASE NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable BASERTFTE NUMERIC(18,2);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCP_BASE, N.INCP_IVA, N.INCP_RTFTE, N.INCP_RTIVA, N.INCP_RTICA, N.INCP_RTCREE, N.INCP_PROV, N.INCP_CTABASE,
  N.INCP_CTAIVA, N.INCP_CTARTFTE, N.INCP_CTARTIVA, N.INCP_CTARTICA, N.INCP_CTARTCREE, N.INCP_CTAPROV, INCP_CONFIRMAR, INCP_EQUIVALENCIA
  FROM INTERFAZ_CXPAGAR I, interfaz_cxpagar_niif N
  WHERE I.INCP_ID = :IDINTER AND I.incp_id = N.incp_id
  INTO :EXISTE, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE,
    :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER, :NIIFEQ;
    
IF (NIIFEQ = 'N') THEN
  begin
    ERRORI = 0;
    if (EXISTE = 'S') then
      BEGIN
      /* TRAIGA EL ENCABEZADO DE LA NOTA */
      SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO,
        NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, NCPR_RTCREE, NCPR_RTCREEM, TERC_CTAVTANIIF,
        TERC_CTARFTENIIF, TERC_CTARIVANIIF, TERC_CTARICANIIF, TERC_CTARCREENIIF, TERC_CTACLIENIIF, NCPR_ANULADO, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2, NCPR_BASERTFTE
        FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T
        WHERE NCPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
        :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree, :TCTABASE,
        :TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2, :basertfte;
      if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_CREDITO_PROVEEDOR N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 52 AND NCPR_ID = :IDDOC INTO :CENTRO, :PROY;
        /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
        SELECT PROV_CTAPAGNIIF, PROV_CTARFTENIIF, PROV_CTARIVANIIF, PROV_CTARICANIIF, PROV_CTACAUSANIIF, PROV_CTARCREENIIF
            FROM PROVEEDORES WHERE TERC_NIT = :NIT
            INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE, tctartcree;
            
        /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
        SELECT NCPR_CTAPAGARN, NCPR_CTACAUSAN
            FROM NOTAS_CREDITO_PROVEEDOR N
            WHERE NCPR_ID = :IDDOC
            INTO :TCTACLIEN, TCTABASE;
        NUMERO = PREF || NUM;
        VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    
        NROI = 100000;
        SUMA = 0;
    
        IF ((BASE = 'T') OR (BASE = 'K')) THEN
            BEGIN
            IF (BASE = 'T') THEN
                CTABASE = TCTABASE;
    
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERRORI = ERRORI + 1;
                    end
                if (ES_RETENCION = 'S') then
                    if (PORC <> 0) then
                        montobase = FLOOR(VRSUBT / PORC * -1);
                    else
                        montobase = VRSUBT * -1;
                else
                    montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* BASE TERCERO O CONSTANTE */
        IF ((BASE = 'I')) THEN
            BEGIN
            FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
                DO
                BEGIN
                if (TARIFA = 0) then
                    vrsubt = BASE0;
                if (TARIFA = 1) then
                    vrsubt = BASE1;
                if (TARIFA = 2) then
                    vrsubt = BASE2;
                if (VRSUBT <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERRORI = ERRORI + 1;
                        end
                    montobase = 0;
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRSUBT;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRSUBT;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* BASE TARIFA IVA */
    
        if (IVA = 'I') then /* IVA X TARIFA */
            BEGIN
            FOR SELECT TAIV_CTAIVACMP, TAIV_COD, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa, :PORC
                DO
                BEGIN
                if (TARIFA = 1) then
                    BEGIN
                    VRIVA = IVA1;
                    vrsubt = BASE1 * -1;
                    END
                if (TARIFA = 2) then
                    BEGIN
                    VRIVA = IVA2;
                    vrsubt = BASE2 * -1;
                    END
                if (VRIVA <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRIVA;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRIVA;
                        END
                    END /* VRIVA <> 0 */
                END /* FOR */
            END /* IVA EN CTA CONSTANTE */
            
        VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* IVA EN CTA CONSTANTE */
            
        /* RETENCION FUENTE */
        if ((RTFTE = 'T') or (RTFTE = 'K')) then
          if (VRRTFTE <> 0) then
            BEGIN
            if (RTFTE = 'T') then
                CTARTFTE = TCTARTFTE;
                
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :basertfte, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :basertfte, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END /* RTFTE */
            
        /* RETENCION IVA */
        if ((RTIVA = 'T') or (RTIVA = 'K')) then
          if (VRRTIVA <> 0) then
            BEGIN
            if (RTIVA = 'T') then
                CTARTIVA = TCTARTIVA;
                
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CTARTIVA, 2);
                CUENTA = CTARTIVA;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTIVA;
                END
            END /* RTIVA */
            
        /* RETENCION DE ICA */
        if ((RTICA = 'T') or (RTICA = 'K')) then
          if (VRRTICA <> 0) then
            BEGIN
            if (RTICA = 'T') then
                CTARTICA = TCTARTICA;
                
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CTARTICA, 2);
                CUENTA = CTARTICA;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTICA;
                END
            END /* RTICA */
            
        /* RETENCION CREE */
        if ((rtcree = 'T') or (rtcree = 'K')) then
          if (vrrtcree <> 0) then
            BEGIN
            if (rtcree = 'T') then
                ctartcree = tctartcree;
                
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :ctartcree, 2);
                CUENTA = ctartcree;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            END /* RTCREE */
        /* recorra las cuentas adicionales */
        FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
            FROM INTERFAZ_CXPAGAR_CTAS
            WHERE INCP_ID = :IDINTER AND INPC_CN <> 'C'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VRIVA;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTAADIC, 2);
                CUENTA = CUENTAADIC;
                ERRORI = ERRORI + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                    SUMA = SUMA - MONTO;
                    END
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NROI = NROI + 1;
                END
            
            NROI = NROI + 1;
            END
            
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (CLIE = 'T') then
                CTACLIE = TCTACLIEN;
    
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (ERRORI > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
      END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1052, :IDDOC, :PREF, 1);
        ERRORI = ERRORI + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


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


ALTER PROCEDURE CONTABIL_NOTADBBC_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable CONC CHAR(120);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INBA_BANCO, N.INBA_IVA, N.INBA_GMF, N.INBA_BASE, N.INBA_CTABCO, N.INBA_CTAIVA, N.INBA_CTAGMF, N.INBA_CTABASE, INBA_CONFIRMAR, INBA_EQUIVALENCIA
    FROM INTERFAZ_BANCOS I, interfaz_bancos_niif N
    WHERE I.INBA_ID = :IDINTER AND I.inba_id = N.inba_id
    INTO :EXISTE, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
    if (EXISTE = 'S') then
      BEGIN
      /* TRAIGA EL ENCABEZADO  */
      SELECT PRBA_PREF, NDBC_NUMERO, NDBC_CONCEPTO, NDBC_MONTO, NDBC_GMFMONTO, NDBC_IVAMONTO, CUBA_CTANIIF, CUBA_CTAIVAN, CUBA_CTAGMFN, NDBC_ANULADO, BANC_NIT
            FROM NOTAS_DEBITO N, CUENTAS_BANCO C, BANCOS B
            WHERE NDBC_ID = :IDDOC AND C.CUBA_COD = N.CUBA_COD AND B.BANC_COD = C.BANC_COD
            INTO :PREF, :NUM, :CONC, :MONTO, :VRGMF, :VRIVA, :BCTABANCO, :BCTAIVA, :BCTAGMF, :ANULADO, :NIT;
      if (ANULADO = 'N') then
        BEGIN
        if (VRIVA IS NULL) then
            VRIVA = 0;
        if (VRGMF IS NULL) then
            VRGMF = 0;
        SELECT PRBA_CENTRO, PRBA_PROY
            FROM PREFIJOS_BANCOS P, NOTAS_DEBITO N
            WHERE P.PRBA_PREF = N.PRBA_PREF AND P.CUBA_COD = N.CUBA_COD AND p.tido_cod = 74 and N.NDBC_ID = :IDDOC
            INTO :CENTRO, :PROY;
        NROI = 100000;
        SUMA = 0;
        ERROR = 0;
        /* CUENTA BASE */
        if (BASE = 'K') then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* BASE = K */
        /* CUENTA GMF */
        if ((VRGMF <> 0) AND ((GMF = 'K') or (GMF = 'B'))) then
            BEGIN
            if (GMF = 'B') then
                CTAGMF = BCTAGMF;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CTAGMF, 2);
                CUENTA = CTAGMF;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* GMF */
        /* CUENTA IVA */
        if ((VRIVA <> 0) AND ((IVA = 'K') or (IVA = 'B'))) then
            BEGIN
            if (IVA = 'B') then
                CTAIVA = BCTAIVA;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* IVA */
        /* CUENTA BANCO */
        if ((BANCO = 'B') or (BANCO = 'K')) then
            BEGIN
            if (BANCO = 'B') then
                CTABANCO = BCTABANCO;
            SUMA = MONTO + VRGMF + VRIVA;
            if (SUMA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CTABANCO, 2);
                    CUENTA = CTABANCO;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* SUMA <> 0 */
            END /* BANCO K O B */
            
        /* recorra las cuentas adicionales */
        FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
            FROM INTERFAZ_BANCOS_CTAS
            WHERE INBA_ID = :IDINTER AND INBC_CN <> 'C'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'MONTO') then
                VALORADIC = MONTO;
            MONTO = VALORADIC * PORCADIC;
            
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTAADIC, 2);
                CUENTA = CUENTAADIC;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NROI = NROI + 1;
                END
            
            NROI = NROI + 1;
            END
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END
      END
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1074, :IDDOC, :PREF, 1);
        ERROR = ERROR + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_NOTADBCL (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCE CHAR(8);
declare variable VENCEAUX DATE;
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable MONTO NUMERIC(18,2);
declare variable MONTOBASE NUMERIC(18,2);
declare variable ANULADO CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCA_BASE, INCA_IVA, INCA_RTFTE, INCA_RTIVA, INCA_RTICA, INCA_RTCREE, INCA_CLIE, INCA_CTABASE, INCA_CTAIVA,
    INCA_CTARTFTE, INCA_CTARTIVA, INCA_CTARTICA, INCA_CTARTCREE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA,
    :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 41 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_VENCE, N.TERC_NIT, NDCL_CONC, NDCL_IVAMONTO, NDCL_MONTO, NDCL_RTFTEPORC, NDCL_RTFTEMONTO,
    NDCL_RTIVAPORC, NDCL_RTIVAMONTO, NDCL_RTICAPORC, NDCL_RTICAMONTO, NDCL_RTCREE, NDCL_RTCREEM, TERC_NOM, TERC_CTAVENTA,
    TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NDCL_ANULADO
    FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T
    WHERE NDCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
    :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree, :NOMBRE, TCTABASE,
    :TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_CLIENTES N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 41 AND NDCL_ID = :IDDOC INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 41, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    IF ((BASE = 'C') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'C') THEN
            CTABASE = TCTABASE;
        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE CLIENTE O CONSTANTE */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        if ((prtfte = 0) AND (vrsubt <> 0)) then
            prtfte = vrrtfte / vrsubt;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        if ((porc = 0) AND (vriva <> 0)) then
            porc = vrrtiva / vriva;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        if ((prtica = 0) AND (vrsubt <> 0)) then
            prtica = vrrtica / vrsubt;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((RTCREE = 'C') or (RTCREE = 'K')) then
      if (VRRTCREE <> 0) then
        BEGIN
        if (RTCREE = 'C') then
            CTARTCREE = TCTARTCREE;
        if ((prtcree = 0) AND (vrsubt <> 0)) then
            prtcree = vrrtcree / vrsubt;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTCREE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTCREE, 2);
            CUENTA = CTARTCREE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        /* AUTORETENCION */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :ctartcree, 2);
                CUENTA = ctartcree;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INCD_CUENTA, INCD_BASE, INCD_PORC, INCD_VALOR, INCD_DB
        FROM INTERFAZ_CARTERA_CTAS
        WHERE INCA_ID = :IDINTER AND INCD_CN <> 'N'
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 41);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 41);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'C') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'C') then
            CTACLIE = TCTACLIEN;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_NOTADBCL_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCE CHAR(8);
declare variable VENCEAUX DATE;
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable MONTO NUMERIC(18,2);
declare variable MONTOBASE NUMERIC(18,2);
declare variable ANULADO CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCA_BASE, N.INCA_IVA, N.INCA_RTFTE, N.INCA_RTIVA, N.INCA_RTICA, N.INCA_RTCREE, N.INCA_CLIE, N.INCA_CTABASE, N.INCA_CTAIVA,
    N.INCA_CTARTFTE, N.INCA_CTARTIVA, N.INCA_CTARTICA, N.INCA_CTARTCREE, N.INCA_CTACLIE, INCA_CONFIRMAR, INCA_EQUIVALENCIA
    FROM INTERFAZ_CARTERA I, interfaz_cartera_niif N
    WHERE I.INCA_ID = :IDINTER AND I.inca_id = N.inca_id
    INTO :EXISTE, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA,
    :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') 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';
    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
    if (AUTORCREE <> '') then
        FAUTORCREE = CAST(AUTORCREE AS DATE);
    else
        FAUTORCREE = '9999/12/31';
    if (EXISTE = 'S') then
      BEGIN
      /* TRAIGA EL ENCABEZADO DE LA NOTA */
      SELECT PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_VENCE, N.TERC_NIT, NDCL_CONC, NDCL_IVAMONTO, NDCL_MONTO, NDCL_RTFTEPORC, NDCL_RTFTEMONTO,
        NDCL_RTIVAPORC, NDCL_RTIVAMONTO, NDCL_RTICAPORC, NDCL_RTICAMONTO, NDCL_RTCREE, NDCL_RTCREEM, TERC_CTAVENTA,
        TERC_CTARFTENIIF, TERC_CTARIVANIIF, TERC_CTARICANIIF, TERC_CTARCREENIIF, TERC_CTACLIENIIF, NDCL_ANULADO
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T
        WHERE NDCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
        :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree, :TCTABASE,
        :TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO;
      if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_CLIENTES N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 41 AND NDCL_ID = :IDDOC INTO :CENTRO, :PROY;
        NUMERO = PREF || NUM;
        VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        NROI = 100000;
        SUMA = 0;
        ERRORI = 0;
        IF ((BASE = 'C') OR (BASE = 'K')) THEN
            BEGIN
            IF (BASE = 'C') THEN
                CTABASE = TCTABASE;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (ES_RETENCION = 'S') then
                    if (PORC <> 0) then
                        montobase = FLOOR(VRSUBT / PORC * -1);
                    else
                        montobase = VRSUBT * -1;
                else
                    montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* BASE CLIENTE O CONSTANTE */
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* IVA EN CTA CONSTANTE */
        /* RETENCION FUENTE */
        if ((RTFTE = 'C') or (RTFTE = 'K')) then
          if (VRRTFTE <> 0) then
            BEGIN
            if (RTFTE = 'C') then
                CTARTFTE = TCTARTFTE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            /* AUTORETENCION */
            if (FAUTORET <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CTARTFTE, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    END
                END
            END /* RTFTE */
        /* RETENCION IVA */
        if ((RTIVA = 'C') or (RTIVA = 'K')) then
          if (VRRTIVA <> 0) then
            BEGIN
            if (RTIVA = 'C') then
                CTARTIVA = TCTARTIVA;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CTARTIVA, 2);
                CUENTA = CTARTIVA;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTIVA;
                END
            END /* RTIVA */
        /* RETENCION DE ICA */
        if ((RTICA = 'C') or (RTICA = 'K')) then
          if (VRRTICA <> 0) then
            BEGIN
            if (RTICA = 'C') then
                CTARTICA = TCTARTICA;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CTARTICA, 2);
                CUENTA = CTARTICA;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTICA;
                END
            END /* RTICA */
        /* RETENCION CREE */
        if ((RTCREE = 'C') or (RTCREE = 'K')) then
          if (VRRTCREE <> 0) then
            BEGIN
            if (RTCREE = 'C') then
                CTARTCREE = TCTARTCREE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTCREE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CTARTCREE, 2);
                CUENTA = CTARTCREE;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            /* AUTORETENCION */
            if (fautorcree <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :ctartcree, 2);
                    CUENTA = ctartcree;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA - vrrtcree;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - vrrtcree;
                    END
                END
            END /* RTCREE */
        /* recorra las cuentas adicionales */
        FOR SELECT INCD_CUENTA, INCD_BASE, INCD_PORC, INCD_VALOR, INCD_DB
            FROM INTERFAZ_CARTERA_CTAS
            WHERE INCA_ID = :IDINTER AND INCD_CN <> 'C'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VRIVA;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTAADIC, 2);
                CUENTA = CUENTAADIC;
                ERRORI = ERRORI + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 41);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 41);
                    SUMA = SUMA - MONTO;
                    END
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NROI = NROI + 1;
                END
            
            NROI = NROI + 1;
            END
            
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((SUMA <> 0) and ((CLIE = 'C') or (CLIE = 'K'))) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (CLIE = 'C') then
                CTACLIE = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (ERRORI > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
      END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1041, :IDDOC, :PREF, 1);
        ERRORI = ERRORI + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


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(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable DTO1M NUMERIC(18, 2);
declare variable DTO2M NUMERIC(18, 2);
declare variable DTO3M NUMERIC(18, 2);
declare variable DTO4M NUMERIC(18, 2);
declare variable DTO1P NUMERIC(18, 2);
declare variable DTO2P NUMERIC(18, 2);
declare variable DTO3P NUMERIC(18, 2);
declare variable DTO4P NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable BASE3 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable IVA3 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable PRTIVA NUMERIC(9, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable CTADTO1 VARCHAR(20);
declare variable CTADTO2 VARCHAR(20);
declare variable CTADTO3 VARCHAR(20);
declare variable CTADTO4 VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NPROY VARCHAR(4);
declare variable NCENTRO VARCHAR(4);
declare variable ANULADO CHAR(1);
declare variable TARIFA INTEGER;
declare variable basertfte NUMERIC(18,2);
declare variable basertiva NUMERIC(18,2);
declare variable DTOS4 CHAR(2);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_RTCREE, INCP_PROV, INCP_CTABASE, INCP_CTAIVA,
    INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTARTCREE, INCP_CTAPROV, INCP_CONFIRMAR,
    INCP_CTADTO1, INCP_CTADTO2, INCP_CTADTO3, INCP_CTADTO4
    FROM INTERFAZ_CXPAGAR
    WHERE INCP_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA,
    :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER,
    CTADTO1, CTADTO2, CTADTO3, CTADTO4;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 51 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, N.TERC_NIT, NDPR_CONC, NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_MONTO,
    NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, NDPR_RTCREE, NDPR_RTCREEM,
    TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NDPR_PROY, NDPR_CENTRO,
    NDPR_ANULADO, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_BASE3, NDPR_IVA1, NDPR_IVA2, NDPR_IVA3, NDPR_BASERTFTE,
    NDPR_DTO1M, NDPR_DTO2M, NDPR_DTO3M, NDPR_DTO4M, NDPR_DTO1P, NDPR_DTO2P, NDPR_DTO3P, NDPR_DTO4P
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T
        WHERE NDPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :PORC, :VRIVA, :VRTOTAL,
        :PRTFTE, :VRRTFTE, :PRTIVA, :VRRTIVA, :PRTICA, :VRRTICA, :PRTCREE, :VRRTCREE,
        :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARTCREE, TCTACLIEN, NPROY, NCENTRO,
        ANULADO, :BASE0, BASE1, :BASE2, :BASE3, :IVA1, :IVA2, :IVA3, :basertfte,
        DTO1M, DTO2M, DTO3M, DTO4M, DTO1P, DTO2P, DTO3P, DTO4P;
  if (ANULADO = 'N') then
    BEGIN
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA, PROV_CTARTCREE
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE, tctartcree;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NDPR_CTAPAGAR, NDPR_CTACAUSA
        FROM NOTAS_DEBITO_PROVEEDOR
        WHERE NDPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND N.NDPR_ID = :IDDOC INTO :CENTRO, :PROY;
    if (NPROY <> '') then
        PROY = NPROY;
    if (NCENTRO <> '') then
        CENTRO = NCENTRO;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    EXECUTE PROCEDURE lee_configuracion('CXPAGAR', 'DOCUMENTOS', 'INCLUIR CAMPOS DE DESCUENTOS ADICIONALES EN CARGOS POR PAGAR') returning_values (:DTOS4);
    if (DTOS4 = 'SI') then
        VRSUBT = VRTOTAL + DTO1M + DTO2M + DTO3M + DTO4M;
    /* 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, 51);
                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_ORDIMP FROM TARIFA_IVA WHERE TAIV_ORDIMP <= 3 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (TARIFA = 3) then
                vrsubt = BASE3;
            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, 51);
                    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 (DTOS4 = 'SI') then
        BEGIN
        if (DTOS4 = 'SI') then
            VRSUBT = VRTOTAL + DTO1M + DTO2M + DTO3M + DTO4M;
        if ((DTO1M <> 0) AND (CTADTO1 <> '')) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTADTO1 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, :CTADTO1);
                CUENTA = CTADTO1;
                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, '', 0, :DTO1M, :vrsubt*-1, :dto1p, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 51);
                NROI = NROI + 1;
                SUMA = SUMA - DTO1M;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :DTO1M, :vrsubt*-1, :dto1p, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - DTO1M;
                END
            END
        if ((DTO2M <> 0) AND (CTADTO2 <> '')) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTADTO2 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, :CTADTO2);
                CUENTA = CTADTO2;
                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, '', 0, :DTO2M, :vrsubt*-1, :dto2p, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 51);
                NROI = NROI + 1;
                SUMA = SUMA - DTO2M;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :DTO2M, :vrsubt*-1, :dto2p, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - DTO2M;
                END
            END
        if ((DTO3M <> 0) AND (CTADTO3 <> '')) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTADTO3 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, :CTADTO3);
                CUENTA = CTADTO3;
                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, '', 0, :DTO3M, :vrsubt*-1, :dto3p, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 51);
                NROI = NROI + 1;
                SUMA = SUMA - DTO3M;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :DTO3M, :vrsubt*-1, :dto3p, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - DTO3M;
                END
            END
        if ((DTO4M <> 0) AND (CTADTO4 <> '')) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTADTO4 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, :CTADTO4);
                CUENTA = CTADTO4;
                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, '', 0, :DTO4M, :vrsubt*-1, :dto4p, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 51);
                NROI = NROI + 1;
                SUMA = SUMA - DTO4M;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :DTO4M, :vrsubt*-1, :dto4p, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - DTO4M;
                END
            END
        END
    if (IVA = 'I') then /* IVA POR TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_ORDIMP, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_ORDIMP <> 0) AND (TAIV_ORDIMP <= 3)
            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 (TARIFA = 3) then
                BEGIN
                VRIVA = IVA3;
                vrsubt = BASE3;
                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, 51);
                    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) and (base3 = 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+:BASE3), :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 51);
                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+:base3), :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, (:basertfte*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 51);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:basertfte*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        /* SI ES SIMPLIFICADO IVA=RTIVA TOME COMO BASE EL SUBTOTAL COMO EN EL IVA */
        if (VRIVA = VRRTIVA) then
            BEGIN
            if ((:base1+:base2+:base3) <> 0) then
                BEGIN
                basertiva = (:base1+:base2+:base3);
                PORC = basertiva / (:base1+:base2+:base3);
                END
            ELSE
                BEGIN
                basertiva = vrsubt;
                PORC = basertiva / vrsubt;
                END
            END
        ELSE
            basertiva = VRIVA;
        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, :basertiva*-1, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 51);
            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, :basertiva*-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, 51);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
        
    /* RETENCION CREE */
    if ((rtcree = 'T') or (rtcree = 'K')) then
      if (vrrtcree <> 0) then
        BEGIN
        if (rtcree = 'T') then
            ctartcree = tctartcree;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :ctartcree);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 51);
            NROI = NROI + 1;
            SUMA = SUMA - vrrtcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - vrrtcree;
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER and INPC_CN <> 'N'
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                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
        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, 51);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, 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^


ALTER PROCEDURE CONTABIL_NOTADBPR_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable PRTIVA NUMERIC(9, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NPROY VARCHAR(4);
declare variable NCENTRO VARCHAR(4);
declare variable ANULADO CHAR(1);
declare variable TARIFA INTEGER;
declare variable basertfte NUMERIC(18,2);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCP_BASE, N.INCP_IVA, N.INCP_RTFTE, N.INCP_RTIVA, N.INCP_RTICA, N.INCP_RTCREE, N.INCP_PROV, N.INCP_CTABASE, N.INCP_CTAIVA,
    N.INCP_CTARTFTE, N.INCP_CTARTIVA, N.INCP_CTARTICA, N.INCP_CTARTCREE, N.INCP_CTAPROV, INCP_CONFIRMAR, INCP_EQUIVALENCIA
    FROM INTERFAZ_CXPAGAR I, interfaz_cxpagar_niif N
    WHERE I.INCP_ID = :IDINTER AND I.incp_id = N.incp_id
    INTO :EXISTE, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA,
    :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
    ERRORI = 0;

    if (EXISTE = 'S') then
      BEGIN
      /* TRAIGA EL ENCABEZADO DE LA NOTA */
      SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, N.TERC_NIT, NDPR_CONC, NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_MONTO,
        NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, NDPR_RTCREE, NDPR_RTCREEM,
        TERC_CTAVTANIIF, TERC_CTARFTENIIF, TERC_CTARIVANIIF, TERC_CTARICANIIF, TERC_CTARCREENIIF, TERC_CTACLIENIIF, NDPR_PROY, NDPR_CENTRO,
        NDPR_ANULADO, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2, NDPR_BASERTFTE
            FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T
            WHERE NDPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
            INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :PORC, :VRIVA, :VRTOTAL,
            :PRTFTE, :VRRTFTE, :PRTIVA, :VRRTIVA, :PRTICA, :VRRTICA, :PRTCREE, :VRRTCREE,
            :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARTCREE, TCTACLIEN, NPROY, NCENTRO,
            ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2, :basertfte;
      if (ANULADO = 'N') then
        BEGIN
        /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
        SELECT PROV_CTAPAGNIIF, PROV_CTARFTENIIF, PROV_CTARIVANIIF, PROV_CTARICANIIF, PROV_CTACAUSANIIF, PROV_CTARCREENIIF
            FROM PROVEEDORES WHERE TERC_NIT = :NIT
            INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE, tctartcree;
            
        /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
        SELECT NDPR_CTAPAGARN, NDPR_CTACAUSAN
            FROM NOTAS_DEBITO_PROVEEDOR
            WHERE NDPR_ID = :IDDOC
            INTO :TCTACLIEN, TCTABASE;
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_PROVEEDOR N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND N.NDPR_ID = :IDDOC INTO :CENTRO, :PROY;
        if (NPROY <> '') then
            PROY = NPROY;
        if (NCENTRO <> '') then
            CENTRO = NCENTRO;
        NUMERO = PREF || NUM;
        VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    
        NROI = 100000;
        SUMA = 0;
    
        IF ((BASE = 'T') OR (BASE = 'K')) THEN
            BEGIN
            IF (BASE = 'T') THEN
                CTABASE = TCTABASE;
    
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERRORI = ERRORI + 1;
                    end
                if (ES_RETENCION = 'S') then
                    if ((prtiva <> 0) and (vriva = 0)) then
                        montobase = FLOOR(VRSUBT / prtiva);
                    else
                        montobase = VRSUBT;
                else
                    montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* BASE TERCERO O CONSTANTE */
        IF ((BASE = 'I')) THEN
            BEGIN
            FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
                DO
                BEGIN
                if (TARIFA = 0) then
                    vrsubt = BASE0;
                if (TARIFA = 1) then
                    vrsubt = BASE1;
                if (TARIFA = 2) then
                    vrsubt = BASE2;
                if (VRSUBT <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERRORI = ERRORI + 1;
                        end
                    montobase = 0;
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRSUBT;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRSUBT;
                        END
                    END /* MONTO <> 0 */
                END
            END /* BASE TARIFA DE IVA */
    
        if (IVA = 'I') then /* IVA POR TARIFA */
            BEGIN
            FOR SELECT TAIV_CTAIVACMP, TAIV_COD, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa, :PORC
                DO
                BEGIN
                if (TARIFA = 1) then
                    BEGIN
                    vrsubt = BASE1;
                    VRIVA = IVA1;
                    END
                if (TARIFA = 2) then
                    BEGIN
                    VRIVA = IVA2;
                    vrsubt = BASE2;
                    END
                if (VRIVA <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRIVA;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRIVA;
                        END
                    END /* VRIVA <> 0 */
                end /* FOR */
            END /* IVA EN CTA CONSTANTE */
            
        VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
        if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
            BEGIN
            if (VRIVA <> 0) then
                BEGIN
                /* si no discrimino tarifas, asuma el subtotal como base del iva */
                if ((base1 = 0) and (base2 = 0)) then
                    base1 = vrsubt;
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, (:base1+:base2), :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, (:base1+:base2), :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* IVA EN CTA CONSTANTE */
            
        /* RETENCION FUENTE */
        if ((RTFTE = 'T') or (RTFTE = 'K')) then
          if (VRRTFTE <> 0) then
            BEGIN
            if (RTFTE = 'T') then
                CTARTFTE = TCTARTFTE;
                
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:basertfte*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:basertfte*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END /* RTFTE */
            
        /* RETENCION IVA */
        if ((RTIVA = 'T') or (RTIVA = 'K')) then
          if (VRRTIVA <> 0) then
            BEGIN
            if (RTIVA = 'T') then
                CTARTIVA = TCTARTIVA;
                
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CTARTIVA, 2);
                CUENTA = CTARTIVA;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTIVA;
                END
            END /* RTIVA */
            
        /* RETENCION DE ICA */
        if ((RTICA = 'T') or (RTICA = 'K')) then
          if (VRRTICA <> 0) then
            BEGIN
            if (RTICA = 'T') then
                CTARTICA = TCTARTICA;
                
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CTARTICA, 2);
                CUENTA = CTARTICA;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTICA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTICA;
                END
            END /* RTICA */
            
        /* RETENCION CREE */
        if ((rtcree = 'T') or (rtcree = 'K')) then
          if (vrrtcree <> 0) then
            BEGIN
            if (rtcree = 'T') then
                ctartcree = tctartcree;
                
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CTARTCREE, 2);
                CUENTA = CTARTICA;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            END /* RTCREE */
        /* recorra las cuentas adicionales */
        FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
            FROM INTERFAZ_CXPAGAR_CTAS
            WHERE INCP_ID = :IDINTER AND INPC_CN <> 'C'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VRIVA;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) THEN
                    begin
                    EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERRORI = ERRORI + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        END
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NROI = NROI + 1;
                    END
                
                NROI = NROI + 1;
                END
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (CLIE = 'T') then
                CTACLIE = TCTACLIEN;
    
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (ERRORI > 0) then
            VER = 'S';
        SUSPEND;
        END /* ANULADO */
      END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1051, :IDDOC, :PREF, 1);
        ERRORI = ERRORI + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
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 CONTABIL_PLANILLA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CXPAGAR CHAR(1);
declare variable CTAPAGAR VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable CTACONCEPTO VARCHAR(20);
declare variable CTAINGPLA VARCHAR(20);
declare variable CTAINGREM VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NITASOC VARCHAR(20);
declare variable NITCLI VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable SUMACAJA NUMERIC(18,2);
declare variable SUMACART NUMERIC(18,2);
declare variable INGPAS NUMERIC(18,2);
declare variable INGREM NUMERIC(18,2);
declare variable NUMDET VARCHAR(10);
declare variable SEGURO NUMERIC(18,2);
declare variable CTASEGURO VARCHAR(20);
declare variable DOMICILIO NUMERIC(18,2);
declare variable CTADOMIC VARCHAR(20);
declare variable CTACONTRAE VARCHAR(20);
declare variable CXPP NUMERIC(18,2);
declare variable CXPR NUMERIC(18,2);
declare variable CONTRAE NUMERIC(18,2);
declare variable CANT INTEGER;
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PREF, INTR_CONFIRMAR, INTR_CAJA, INTR_CTACAJA, INTR_CXPAGAR, INTR_CTAPAGAR,
    INTR_CARTERA, INTR_CTACARTERA, INTR_CTAINGPLA, INTR_CTAINGREM, INTR_CTASEGURO, INTR_CTADOMICIL, intr_ctacontrae
    FROM interfaz_transporte
    WHERE INTR_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VER, :CAJA, :CTACAJA, :CXPAGAR, :CTAPAGAR,
        :CARTERA, :CTACARTERA, :CTAINGPLA, :CTAINGREM, :ctaseguro, :ctadomic, :ctacontrae;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 88 AND CNTB_IDREF = :IDDOC;

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

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

    /* SOLO LA PARTE DE CONTADO */
    CONC = 'TIQUETES CONTADO PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPA_VALOR) FROM planilla_pasajeros_det P, tiquete_pasajero t
        WHERE p.plpa_tiquete = t.tiqp_id and t.tiqp_formap = 'C' and P.plpa_id = :iddoc INTO :sumacaja;
    if (sumacaja <> 0) then
        BEGIN
        /* LA CAJA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacaja, 2);
            CUENTA = ctacaja;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :sumacaja, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        /* la cuenta por pagar al transportador */
        SELECT FPRM_CTAPASAJE FROM forma_pago_remesa WHERE FPRM_COD = 'C' INTO :ctapagar;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :sumacaja, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            CXPP = SUMACAJA;
            NROI = NROI + 1;
            END
        END /* PASAJES CONTADO */

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

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacartera, 2);
                CUENTA = ctacartera;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                sumacart = sumacart + MONTO;
                END

            /* INGRESO PASAJES A CREDITO */
            CONC = 'TIQUETES CREDITO PLANILLA DE PASAJEROS No. ' || :NUMERO;
            execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR PASAJES A CREDITO') returning_values (:ingpas);
            MONTO = ingpas * :cant;
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctaingpla INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctaingpla, 2);
                    CUENTA = ctaingpla;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMACART = SUMACART - MONTO;
                    END
                END /* INGRESO PASAJES CREDITO */
            END
        END

    /* la cuenta por pagar al transportador */
    SELECT FPRM_CTAPASAJE FROM forma_pago_remesa WHERE FPRM_COD = 'R' INTO :ctapagar;
    if (sumacart <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :sumacart, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* PASAJES CREDITO */

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

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacartera, 2);
                CUENTA = ctacartera;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                sumacart = sumacart + MONTO;
                END
            END
        END
    /* REMESAS DE CONTADO */
    CONC = 'REMESAS CONTADO PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_VALOR) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago = 'C' AND P.plpa_id = :iddoc
        INTO :sumacaja;
    if (sumacaja <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacaja, 2);
            CUENTA = ctacaja;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :sumacaja, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* REMESAS CAJA */

    /* CONTRAENTREGAS  */
    CONC = 'REMESAS CONTRAENTREGA PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_CONTRAE), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago = 'E' AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR REMESAS DE PASAJEROS') returning_values (:ingrem);
    execute procedure redondee(((sumacaja-seguro-domicilio) * ingrem / 100)+seguro+domicilio, 0) returning_values (CONTRAE);
    if (CONTRAE <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacontrae, 2);
            CUENTA = ctacontrae;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :CONTRAE, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* CONTRAENTREGAS */

    /* INGRESO REMESAS  */
    CONC = 'REMESAS PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_VALOR+PLPR_CONTRAE), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure redondee((sumacaja-seguro-domicilio) * ingrem / 100, 0) returning_values (MONTO);
    if (MONTO <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaingrem INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctaingrem, 2);
            CUENTA = ctaingrem;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* INGRESO REMESAS */

    /* DOMICILIO */
    if (domicilio <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctadomic INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctadomic, 2);
            CUENTA = ctadomic;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :domicilio, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* DOMICILIO */

    /* SEGUROS */
    if (seguro <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaseguro INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctaseguro, 2);
            CUENTA = ctaseguro;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :seguro, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* SEGUROS */

    /* la cuenta por pagar al transportador */
    SELECT FPRM_CTACONTA FROM forma_pago_remesa WHERE FPRM_COD = 'C' INTO :ctapagar;
    CONC = 'REMESAS PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_VALOR), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago <> 'E' AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure redondee(((sumacaja-seguro-domicilio) * ingrem / 100), 0) returning_values (MONTO);
    sumacaja = sumacaja - MONTO - domicilio - seguro;
    if (sumacaja <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :sumacaja, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* CTA X PAGAR REMESAS */

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

    /* CUADRE TODO CONTRA LA CAJA */
    CUENTA = NULL;
    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
        WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
    if (CUENTA IS NULL) then
        begin
        EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacaja, 2);
        CUENTA = ctacaja;
        ERROR = ERROR + 1;
        end
    if (TIPOCUEN = 'I') then
        BEGIN
        EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'C') then
        BEGIN
        EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'N') then
        BEGIN
        if (SUMA > 0) then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NITASOC, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        else
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:SUMA), 0, 0, 0, :NITASOC, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END

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


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

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


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


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

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


ALTER PROCEDURE CONTABIL_PRODUCCION (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable CLIENTE VARCHAR(60);
declare variable CODPROD VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 19 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, PROR_NUMERO, PROR_FECHA, PROR_NIT, PROR_NOMCLIENTE, PROR_ANULADO, ARTI_COD
        FROM PRODUCCION_ORDEN
        WHERE PROR_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :NIT, :CLIENTE, :ANULADO, :CODPROD;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_orden E
                WHERE B.BODE_COD = E.pror_bodega AND E.pror_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_orden E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.pror_id = :IDDOC AND P.TIDO_COD = 19 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'ORDEN DE PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 19, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.pode_cant as double precision) * D.pode_costo), SUM(D.pode_ivamonto)
                FROM ARTICULO A, CONTABIL_ARTICULO C, produccion_orden_detalle D
                WHERE D.pror_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                VRBASE = MONTO;
                VRIVA = :IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(19, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(19, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */

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


ALTER PROCEDURE CONTABIL_PRODUCCION_DEV (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ORDEN VARCHAR(10);
declare variable CODPROD VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 29 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRDD_PREF, PRDD_NUMERO, PRDD_FECHA, P.PROR_NIT, P.pref_pre || P.pror_numero, PRDD_ANULADO, P.ARTI_COD
        FROM produccion_devolucion S, produccion_orden P
        WHERE S.PRDD_ID = :IDDOC AND S.pror_id = P.pror_id
        INTO :PREFIJO, :NUMERO, :FECAUX, :NIT, :ORDEN, :ANULADO, :CODPROD;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_devolucion E
                WHERE B.BODE_COD = E.prdd_bodega AND E.prdd_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_devolucion E
                WHERE P.PREF_PRE = E.prdd_pref AND E.prdd_id = :IDDOC AND P.TIDO_COD = 29 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'DEVOLUCION MATERIALES ' || :prefijo || :numero || ' EN ORDEN ' || :ORDEN;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 29, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.prdd_cant as double precision) * D.prdd_costo)
                FROM ARTICULO A, CONTABIL_ARTICULO C, produccion_devolucion_det D
                WHERE D.prdd_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(29, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(29, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */

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


ALTER PROCEDURE CONTABIL_PRODUCCION_ENT (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NUMITEMS INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable CLIENTE VARCHAR(60);
declare variable CODPROD VARCHAR(20);
declare variable COSTO NUMERIC(18,2);
declare variable CODRECH VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 20 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRDE_PREF, PRDE_NUMERO, PRDE_FECHA, P.PROR_NIT, P.PROR_NOMCLIENTE, PRDE_ANULADO, P.ARTI_COD, E.prde_costo, E.prde_rechazado
        FROM produccion_entrada_enc E, produccion_orden P
        WHERE E.prde_id = :IDDOC AND E.pror_id = P.pror_id
        INTO :PREFIJO, :NUMERO, :FECAUX, :NIT, :CLIENTE, :ANULADO, :CODPROD, :COSTO, :codrech;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_entrada_enc E
                WHERE B.BODE_COD = E.prde_bodprod AND E.prde_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_entrada_enc E
                WHERE P.PREF_PRE = E.prde_pref AND E.prde_id = :IDDOC AND P.TIDO_COD = 20 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'ENTRADA PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 20, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        if (BASE = 'A') then
            BEGIN
            /* PRIMERO EL PRODUCTO BUENO */
            SELECT MAX(COAR_CTAINV), SUM(cast(D.pren_cantok as double precision) * :costo)
                FROM ARTICULO A, CONTABIL_ARTICULO C, produccion_entrada_det D
                WHERE D.prde_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                INTO :CTABASE, :MONTO;
            VRBASE = MONTO;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            /* EL PRODUCTO MALO */
            SELECT MAX(COAR_CTAINV), SUM(cast(D.pren_cantmal as double precision) * :costo)
                FROM ARTICULO A, CONTABIL_ARTICULO C, produccion_entrada_det D
                WHERE D.prde_id = :IDDOC AND A.arti_cod = :codrech AND A.ARTI_COD = C.ARTI_COD
                INTO :CTABASE, :MONTO;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE */
        /* DSCARGA EL MATERIAL */
        SELECT SUM(cast(D.pren_cantmal+D.pren_cantok as double precision) * :costo)
            FROM produccion_entrada_det D WHERE D.prde_id = :IDDOC INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :ctacierre, 2);
                CUENTA = ctacierre;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER AND INIC_CN <> 'N'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRBASE;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRBASE;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(28, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


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

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


ALTER PROCEDURE CONTABIL_PRODUCCION_SAL (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable CLIENTE VARCHAR(60);
declare variable CODPROD VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 28 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRSA_PREF, PRSA_NUMERO, PRSA_FECHA, P.PROR_NIT, P.PROR_NOMCLIENTE, PRSA_ANULADO, P.ARTI_COD
        FROM produccion_salida_enc S, produccion_orden P
        WHERE S.PRSA_ID = :IDDOC AND S.pror_id = P.pror_id
        INTO :PREFIJO, :NUMERO, :FECAUX, :NIT, :CLIENTE, :ANULADO, :CODPROD;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_salida_enc E
                WHERE B.BODE_COD = E.prsa_bodega AND E.prsa_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_salida_enc E
                WHERE P.PREF_PRE = E.prsa_pref AND E.prsa_id = :IDDOC AND P.TIDO_COD = 28 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'SALIDA A PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 28, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.prsa_cant as double precision) * D.prsa_costo)
                FROM ARTICULO A, CONTABIL_ARTICULO C, produccion_salida_det D
                WHERE D.prsa_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(28, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(28, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */

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


ALTER PROCEDURE CONTABIL_RECICAJA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18,2);
declare variable VRRTFTE NUMERIC(18,2);
declare variable VRRTIVA NUMERIC(18,2);
declare variable VRRTICA NUMERIC(18,2);
declare variable VRRTCREE NUMERIC(18,2);
declare variable VRTOTAL NUMERIC(18,2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(8);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTCREEC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RTCREER CHAR(1);
declare variable CTARTCREER VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable EXEDENTE NUMERIC(18,2);
declare variable CTAEXCEDENTE VARCHAR(20);
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',TICO_COD,PRCO_PRE,INCJ_BASE,INCJ_DTOPP,INCJ_RTFTE,INCJ_RTIVA,INCJ_RTICA,INCJ_RTCREE,INCJ_CAJA,INCJ_CTABASE,INCJ_CTADTO,
    INCJ_CTARTFTE,INCJ_CTARTIVA,INCJ_CTARTICA,INCJ_CTARTCREE,INCJ_CTACAJA,INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE,:TIPOCOMP,:PREFCONT,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:RTCREE,:CAJA,:CTABASE,:CTADTO,
    :CTARTFTE,:CTARTIVA,:CTARTICA,:CTARTCREE,:CTACAJA,:VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  execute procedure lee_configuracion('CAJA', 'RECIBOS', 'CUENTA CONTABLE PARA EXCENTES EN RECIBOS DE CAJA') returning_values (ctaexcedente);
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE,RECA_NUMERO,RECA_FECHA,R.TERC_NIT,RECA_CONC,RECA_DTOF,RECA_MONTO,RECA_RTFTEMONTO,RECA_RTIVAMONTO,
    RECA_RTICAMONTO,RECA_RTCREEM,TERC_CTARTFTE,TERC_CTARTIVA,TERC_CTARTICA,TERC_CTARCREE,TERC_CTACLIENTE,RECA_ANULADO,
    RECA_PROVID, RECA_EXEDENTE
    FROM RECIBOS_CAJA R,TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF,:NUM,:FECAUX,:NIT,:CONC,:VRDTO,:VRTOTAL,:VRRTFTE,:VRRTIVA,
    :VRRTICA,:vrrtcree,TCTARTFTE,TCTARTIVA,TCTARTICA,tctartcree,TCTACLIEN,:ANULADO,:PROVID, :exedente;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO,:PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    IDC = GEN_ID(ID_CONTABILIZA,1);
    INSERT INTO CONTABILIZACION (CNTB_ID,CNTB_TIPOCOMP,CNTB_PREFCNT,CNTB_NUMERO,CNTB_FECHA,CNTB_CONCEPTO,CNTB_REF,CNTB_TIPOREF,CNTB_IDREF,CNTB_PREFREF,CNTB_NUMREF,CNTB_PROCESADO)
        VALUES (:IDC,:TIPOCOMP,:PREFCONT,:NUM,:FECHA,:CONC,'',61,:IDDOC,:PREF,:NUM,'N');
    NROI = 0;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTACAJA,2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRCAJA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                       VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:VRCAJA),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END
        END
    IF ((CAJA = 'F')) THEN
        BEGIN
        FOR SELECT MAX(FOPA_CTACONTA),SUM(RCPA_MONTO)
            FROM formas_pago F,recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA,:MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    IF ((CAJA = 'C')) THEN
        BEGIN
        FOR SELECT f.caja_cuenta, r.reca_monto
            FROM cajas F,recibos_caja R
            WHERE R.RECA_ID = :IDDOC AND R.caja_id = F.caja_id
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = C */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTADTO,2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (VRDTO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRDTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0, abs(:VRDTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

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

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


ALTER PROCEDURE CONTABIL_RECICAJA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18,2);
declare variable VRRTFTE NUMERIC(18,2);
declare variable VRRTIVA NUMERIC(18,2);
declare variable VRRTICA NUMERIC(18,2);
declare variable VRRTCREE NUMERIC(18,2);
declare variable VRTOTAL NUMERIC(18,2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(8);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTCREEC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RTCREER CHAR(1);
declare variable CTARTCREER VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable EXEDENTE NUMERIC(18,2);
declare variable CTAEXCEDENTE VARCHAR(20);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
NIIFEQ = 'N';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',N.INCJ_BASE,N.INCJ_DTOPP,N.INCJ_RTFTE,N.INCJ_RTIVA,N.INCJ_RTICA,N.INCJ_RTCREE,N.INCJ_CAJA,N.INCJ_CTABASE,N.INCJ_CTADTO,
    N.INCJ_CTARTFTE,N.INCJ_CTARTIVA,N.INCJ_CTARTICA,N.INCJ_CTARTCREE,N.INCJ_CTACAJA,INCJ_CONFIRMAR, INCJ_EQUIVALENCIA
    FROM INTERFAZ_CAJA I, interfaz_caja_niif N
    WHERE I.INCJ_ID = :IDINTER AND I.incj_id = N.incj_id
    INTO :EXISTE,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:RTCREE,:CAJA,:CTABASE,:CTADTO,
    :CTARTFTE,:CTARTIVA,:CTARTICA,:CTARTCREE,:CTACAJA,:VER, :NIIFEQ;
if (NIIFEQ = 'N') then
    BEGIN
    if (EXISTE = 'S') then
      BEGIN
      OK = 0;
      /* TRAIGA EL ENCABEZADO DEL RECIBO */
      SELECT PREF_PRE,R.TERC_NIT,RECA_CONC,RECA_DTOF,RECA_MONTO,RECA_RTFTEMONTO,RECA_RTIVAMONTO,
        RECA_RTICAMONTO,RECA_RTCREEM,TERC_CTARFTENIIF,TERC_CTARIVANIIF,TERC_CTARICANIIF,TERC_CTARCREENIIF,TERC_CTACLIENIIF,RECA_ANULADO,
        RECA_PROVID, RECA_EXEDENTE
        FROM RECIBOS_CAJA R,TERCEROS T
        WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
        INTO :PREF,:NIT,:CONC,:VRDTO,:VRTOTAL,:VRRTFTE,:VRRTIVA,
        :VRRTICA,:vrrtcree,TCTARTFTE,TCTARTIVA,TCTARTICA,tctartcree,TCTACLIEN,:ANULADO,:PROVID, :exedente;
      if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS
            WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO,:PROY;
        NROI = 100000;
        SUMA = 0;
        /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
        SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
        if (CRUCES IS NULL) then
            CRUCES = 0;
        VRCAJA = VRTOTAL;
        IF ((CAJA = 'K')) THEN
            BEGIN
            if (VRCAJA <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (VRCAJA > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRCAJA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + VRCAJA;
                        END
                    ELSE   
                        BEGIN                     
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                           VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:VRCAJA),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + VRCAJA;
                        END
                    NROI = NROI + 1;
                    END
                END
            END
        IF ((CAJA = 'F')) THEN
            BEGIN
            FOR SELECT MAX(FOPA_CTANIIF),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_niif_c (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CTACAJA,2);
                        CUENTA = CTACAJA;
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        IF (MONTO > 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                            SUMA = SUMA + MONTO;
                            END
                        ELSE
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                            SUMA = SUMA + MONTO;
                            END
                        NROI = NROI + 1;
                        END
                    END /* MONTO <> 0 */
                END /* DO FORMA_PAGO */
            END /* CAJA = F */
        IF ((CAJA = 'C')) THEN
            BEGIN
            FOR SELECT f.caja_ctaniif, r.reca_monto
                FROM cajas F,recibos_caja R
                WHERE R.RECA_ID = :IDDOC AND R.caja_id = F.caja_id
                INTO :CTACAJA, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    EXECUTE PROCEDURE valide_cuenta_niif_c (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CTACAJA,2);
                        CUENTA = CTACAJA;
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        IF (MONTO > 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                            SUMA = SUMA + MONTO;
                            END
                        ELSE
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                            SUMA = SUMA + MONTO;
                            END
                        NROI = NROI + 1;
                        END
                    END /* MONTO <> 0 */
                END /* DO FORMA_PAGO */
            END /* CAJA = C */
        if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
            BEGIN
            if (VRDTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE valide_cuenta_niif_c (CTADTO) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CTADTO,2);
                    CUENTA = CTADTO;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (VRDTO > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRDTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0, abs(:VRDTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRDTO;
                    END
                END /* VRDTO <> 0 */
            END /* DTO EN CTA CONSTANTE */
    
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE valide_cuenta_niif_c (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:ctadif,2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:difcambio,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:difcambio),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        IF ((exedente IS NOT NULL) AND (exedente <> 0)) THEN
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('CAJA', 'RECIBOS', 'CUENTA CONTABLE PARA EXCENTES EN RECIBOS DE CAJA') returning_values (ctaexcedente);
            CUENTA = NULL;
            EXECUTE PROCEDURE valide_cuenta_niif_c (ctaexcedente) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctaexcedente INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:ctaexcedente,2);
                CUENTA = ctaexcedente;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (exedente > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:exedente,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:exedente),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA - exedente;
                END
            END
        /* RETENCION FUENTE */
        if ((RTFTE = 'T') or (RTFTE = 'K')) then
          if (VRRTFTE <> 0) then
            BEGIN
            if (RTFTE = 'T') then
                CTARTFTE = TCTARTFTE;
            CUENTA = NULL;
            EXECUTE PROCEDURE valide_cuenta_niif_c (CTARTFTE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTARTFTE INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CTARTFTE,2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (ES_RETENCION = 'S') then
                    BEGIN
                    VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                    SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                    END
                ELSE
                    BEGIN
                    VRBASE = 0;
                    PORC = 0;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTFTE,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END /* RTFTE */
        /* RETENCION IVA */
        if ((RTIVA = 'T') or (RTIVA = 'K')) then
          if (VRRTIVA <> 0) then
            BEGIN
            if (RTIVA = 'T') then
                CTARTIVA = TCTARTIVA;
            CUENTA = NULL;
            EXECUTE PROCEDURE valide_cuenta_niif_c (CTARTIVA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTARTIVA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CTARTIVA,2);
                CUENTA = CTARTIVA;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (ES_RETENCION = 'S') then
                    BEGIN
                    VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                    SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                    END
                ELSE
                    BEGIN
                    VRBASE = 0;
                    PORC = 0;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTIVA,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTIVA;
                END
            END /* RTIVA */
        /* RETENCION DE ICA */
        if ((RTICA = 'T') or (RTICA = 'K')) then
          if (VRRTICA <> 0) then
            BEGIN
            if (RTICA = 'T') then
                CTARTICA = TCTARTICA;
            CUENTA = NULL;
            EXECUTE PROCEDURE valide_cuenta_niif_c (CTARTICA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTARTICA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CTARTICA,2);
                CUENTA = CTARTICA;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (ES_RETENCION = 'S') then
                    BEGIN
                    VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                    SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                    END
                ELSE
                    BEGIN
                    VRBASE = 0;
                    PORC = 0;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTICA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTICA;
                END
            END /* RTICA */
        /* RETENCION CREE */
        if ((rtcree = 'T') or (rtcree = 'K')) then
            BEGIN
            if (rtcree = 'T') then
                ctartcree = tctartcree;
            if (vrrtcree <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE valide_cuenta_niif_c (ctartcree) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctartcree INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:ctartcree,2);
                    CUENTA = CTARTICA;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (ES_RETENCION = 'S') then
                        BEGIN
                        VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica + vrrtcree;
                        SELECT CLIE_RTcree from clientes where terc_nit = :NIT INTO :PORC;
                        END
                    ELSE
                        BEGIN
                        VRBASE = 0;
                        PORC = 0;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:vrrtcree,0,:vrbase,:porc,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtcree;
                    END
                END
            END /* RTCREE */
        /* CRUCES CON CXP */
        if (CRUCES <> 0) then
            BEGIN
            SELECT PROV_CTAPAGNIIF FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
            if (CTABASE IS NULL) then
                ctabase = tctaclien;
            CUENTA = NULL;
            EXECUTE PROCEDURE valide_cuenta_niif_c (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CTABASE,2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCCR_TIPODOC,RCCR_PREFIJO,RCCR_NUMERO,RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                    FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT,PREFIT,NUMIT,ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    if (ABONOIT > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:ABONOIT,0,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0, ABS(:ABONOIT),0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                    SUMA = SUMA + ABONOIT;
                    NROI = NROI + 1;
                    END
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (CRUCES > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:CRUCES,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:CRUCES),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                SUMA = SUMA + CRUCES;
                NROI = NROI + 1;
                END
    
            /* LA DIFERENCIA EN CAMBIO */
            SELECT SUM(RCCR_DIFCAMBIO) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
            IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
                BEGIN
                if (DIFCAMBIO > 0) then
                    execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
                else
                    execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
                CUENTA = NULL;
                EXECUTE PROCEDURE valide_cuenta_niif_c (ctadif) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:ctadif,2);
                    CUENTA = ctadif;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DIFCAMBIO > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:difcambio,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    else
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:difcambio),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    NROI = NROI + 1;
                    SUMA = SUMA + difcambio;
                    END
                END
            /* RETEFUENTE DEL CRUCE */
            SELECT first 1 N.INCJ_RTFTE,N.INCJ_RTIVA,N.INCJ_RTICA,N.INCJ_RTCREE,N.INCJ_CTARTFTE,N.INCJ_CTARTIVA,N.INCJ_CTARTICA,N.INCJ_CTARTCREE
                FROM interfaz_caja I, interfaz_caja_niif N WHERE I.incj_id = N.incj_id AND I.tido_cod = 62 into :RTFTER,:RTIVAR,:RTICAR,:RTCREER,:CTARTFTER,:CTARTIVAR,:CTARTICAR,:ctartcreer;
            SELECT SUM(RCCR_RTFTE) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rtftec;
            IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
                BEGIN
                if ((RTFTER = 'T') or (RTFTER = 'K')) then
                    BEGIN
                    if (RTFTER = 'T') then
                        SELECT PROV_CTARFTENIIF FROM proveedores WHERE TERC_NIT = :NIT INTO CTARTFTER;
                    CUENTA = NULL;
                    EXECUTE PROCEDURE valide_cuenta_niif_c (ctartfter) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :ctartfter INTO :CUENTA,:TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:ctartfter,2);
                        CUENTA = ctartfter;
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:rtftec,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        NROI = NROI + 1;
                        SUMA = SUMA - rtftec;
                        END
                    END
                END
            /* RETEIVA DEL CRUCE */
            SELECT SUM(RCCR_RTIVA) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rtivac;
            IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
                BEGIN
                if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                    BEGIN
                    if (RTIVAR = 'T') then
                        SELECT PROV_CTARIVANIIF FROM proveedores WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                    CUENTA = NULL;
                    EXECUTE PROCEDURE valide_cuenta_niif_c (ctartivar) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :ctartivar INTO :CUENTA,:TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:ctartivar,2);
                        CUENTA = ctartivar;
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:rtivac,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        NROI = NROI + 1;
                        SUMA = SUMA - rtivac;
                        END
                    END
                END
            /* RETEICA DEL CRUCE */
            SELECT SUM(RCCR_RTICA) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rticac;
            IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
                BEGIN
                if ((RTICAR = 'T') or (RTICAR = 'K')) then
                    BEGIN
                    if (RTICAR = 'T') then
                        SELECT PROV_CTARICANIIF FROM proveedores WHERE TERC_NIT = :NIT INTO CTARTICAR;
                    CUENTA = NULL;
                    EXECUTE PROCEDURE valide_cuenta_niif_c (ctarticar) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :ctarticar INTO :CUENTA,:TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(1062,:IDDOC,:ctarticar,2);
                        CUENTA = ctarticar;
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:rticac,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        NROI = NROI + 1;
                        SUMA = SUMA - rticac;
                        END
                    END
                END
            /* RETECREE DEL CRUCE */
            SELECT SUM(RCCR_RCREE) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rtcreec;
            IF ((rtcreec IS NOT NULL) AND (rtcreec <> 0)) THEN
                BEGIN
                if ((rtcreer = 'T') or (rtcreer = 'K')) then
                    BEGIN
                    if (rtcreer = 'T') then
                        SELECT PROV_CTARCREENIIF FROM proveedores WHERE TERC_NIT = :NIT INTO ctartcreer;
                    CUENTA = NULL;
                    EXECUTE PROCEDURE valide_cuenta_niif_c (ctartcreer) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :ctartcreer INTO :CUENTA,:TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:ctartcreer,2);
                        CUENTA = ctartcreer;
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:rtcreec,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        NROI = NROI + 1;
                        SUMA = SUMA - rtcreec;
                        END
                    END
                END
            END /* cruces */
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
        if (SUMA <> 0) THEN
            BEGIN
            if  ((BASE = 'T') or (BASE = 'K')) then
                BEGIN
                if (SUMA < 0) then
                    BEGIN
                    DEBITO = SUMA * -1;
                    CREDITO = 0;
                    END
                ELSE
                    BEGIN
                    DEBITO = 0;
                    CREDITO = SUMA;
                    END
                if (BASE = 'T') then
                    CTABASE = TCTACLIEN;
                CUENTA = NULL;
                EXECUTE PROCEDURE valide_cuenta_niif_c (CTABASE) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CTABASE,2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    FOR SELECT RCDE_TIPODOC,RCDE_PREFIJO,RCDE_NUMERO,RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                        FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                        INTO :TIPOIT,PREFIT,NUMIT,ABONOIT
                        DO
                        BEGIN
                        NUMEROIT = PREFIT || NUMIT;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:ABONOIT,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                        NROI = NROI + 1;
                        END
                    END
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:DEBITO,:CREDITO,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            if (BASE = 'D') then
                BEGIN
                CTABASE = NULL;
                execute procedure lee_configuracion('CARTERA','SALDOS','DESCONTAR RETENCIONES POR CAUSACION') returning_values (RET);
                FOR SELECT RCDE_TIPODOC,RCDE_IDDOC,RCDE_PREFIJO,RCDE_NUMERO,RCDE_ABONO+RCDE_DTOF,RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC INTO :tipoit,:idit,:PREFIT,:NUMIT,:suma,:RTIT DO
                    BEGIN
                    if (TIPOIT <> 45) then
                        SELECT FIRST 1 CUEN_COD,PROY_COD,CENT_COD FROM COMPROBANTE_ENCABEZADO E,comprobante_detalle_niif D
                            WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT
                            AND ((SUBSTR(CUEN_COD,1,2) = '13') or (SUBSTR(CUEN_COD,1,4) = '2805') ) AND SUBSTR(CUEN_COD,1,4) <> '1355'
                            INTO :ctabase,:proy,:centro;
                    ELSE
                        SELECT ZONA_CTAANTINIIF 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_niif_c (ctabase) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CTABASE,2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        end
                    if (RET = 'NO') then
                        SUMA = SUMA + RTIT;
                    if (SUMA < 0) then
                        BEGIN
                        DEBITO = SUMA * -1;
                        CREDITO = 0;
                        END
                    ELSE
                        BEGIN
                        DEBITO = 0;
                        CREDITO = SUMA;
                        END
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        NUMEROIT = PREFIT || NUMIT;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:debito,:credito,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                        END
                    if (TIPOCUEN = 'N') then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:DEBITO,:CREDITO,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    NROI = NROI + 1;
                    END /* SUMA EN CARTERA */
                END
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INJC_CUENTA,INJC_BASE,INJC_PORC,INJC_VALOR,INJC_DB
            FROM INTERFAZ_CAJA_CTAS
            WHERE INCJ_ID = :IDINTER AND INJC_CN <> 'C'
            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_niif_c (CTADIC) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTADIC INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CTADIC,2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CTADIC,:CONC,'',:MONTO,0,:VALORADIC,:PORCADIC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CTADIC,:CONC,'',0,:MONTO,:VALORADIC,:PORCADIC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                END
            NROI = NROI + 1;
            END
        /* REVERSE EL PROVISIONAL SI EXISTE */
        if ((PROVID IS NOT NULL) AND (PROVID <> 0))  then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID,CNDE_ITEM,CNDE_CUENTA,CNDE_CONC,CNDE_REF,CNDE_DEBITOS,CNDE_CREDITOS,CNDE_BASE,CNDE_PORC,CNDE_TERC,CNDE_PROY,CNDE_CENTRO,CNDE_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                SELECT :IDC,CODE_ITEM+:NROI,CUEN_COD,:CONC,'',CODE_CREDITO,CODE_DEBITO,CODE_BASE*-1,CODE_PORC,D.TERC_NIT,PROY_COD,CENT_COD,NULL,NULL,NULL,NULL,0,0
                    FROM comprobante_detalle_niif D,COMPROBANTE_ENCABEZADO E WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = 65 AND E.enco_idref = :provid;
            END
        if (ERRORI > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
      END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1061,:IDDOC,:PREF,1);
        ERRORI = ERRORI + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_RECIPROV (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(8);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 65 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, R.TERC_NIT, RCPR_CONC, RCPR_DTOF, RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RCPR_ANULADO
    FROM recibo_provisional R, TERCEROS T
    WHERE RCPR_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 65 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 65, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (vrtotal <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (vrtotal > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrtotal, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + vrtotal;
                    END
                ELSE   
                    BEGIN                     
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:vrtotal), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + vrtotal;
                    END
                NROI = NROI + 1;
                END
            END /* VRtotal <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RPPA_MONTO)
            FROM formas_pago F, recibo_provisional_pago R
            WHERE R.RCPR_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:MONTO), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                END
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and ((BASE = 'T') or (BASE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'T') then
            CTABASE = TCTACLIEN;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER AND INJC_CN <> 'N'
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_RECIPROV_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable 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 BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(8);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCJ_BASE, N.INCJ_DTOPP, N.INCJ_RTFTE, N.INCJ_RTIVA, N.INCJ_RTICA, N.INCJ_CAJA, N.INCJ_CTABASE, N.INCJ_CTADTO, N.INCJ_CTARTFTE,
    N.INCJ_CTARTIVA, N.INCJ_CTARTICA, N.INCJ_CTACAJA, INCJ_CONFIRMAR, INCJ_EQUIVALENCIA
    FROM INTERFAZ_CAJA I, interfaz_caja_niif N
    WHERE I.INCJ_ID = :IDINTER AND I.incj_id = N.incj_id
    INTO :EXISTE, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
    ERROR = 0;
    if (EXISTE = 'S') then
      BEGIN
      OK = 0;
      /* TRAIGA EL ENCABEZADO DEL RECIBO */
      SELECT PREF_PRE, RCPR_NUMERO, R.TERC_NIT, RCPR_CONC, RCPR_DTOF, RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, TERC_CTARFTENIIF, TERC_CTARIVANIIF, TERC_CTARICANIIF, TERC_CTACLIENIIF, RCPR_ANULADO
        FROM recibo_provisional R, TERCEROS T
        WHERE RCPR_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :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;
        NROI = 100000;
        SUMA = 0;
        IF ((CAJA = 'K')) THEN
            BEGIN
            if (vrtotal <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE valide_cuenta_niif_c (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1065, :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_CTANIIF), 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_niif_c (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1065, :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_niif_c (CTADTO) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                        WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CTADTO, 2);
                    CUENTA = CTADTO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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_niif_c (CTARTFTE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1065, :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_niif_c (CTARTIVA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CTARTIVA, 2);
                CUENTA = CTARTIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1065, :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_niif_c (CTARTICA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CTARTICA, 2);
                CUENTA = CTARTICA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1065, :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_niif_c (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1065, :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 AND INJC_CN <> 'C'
            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_niif_c (CTADIC) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            NROI = NROI + 1;
            END
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
      END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1065, :IDDOC, :PREF, 1);
        ERROR = ERROR + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_REMESA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTAPAGARF VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NITASOC VARCHAR(20);
declare variable NITCLI VARCHAR(20);
declare variable NITDEST VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SEGURO NUMERIC(18,2);
declare variable CTASEGURO VARCHAR(20);
declare variable CTACONTRAE VARCHAR(20);
declare variable CTASEGXC VARCHAR(20);
declare variable FORMA CHAR(1);
declare variable VALOR NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PREF, INTR_CONFIRMAR, INTR_CAJA, INTR_CTACAJA,
    INTR_CARTERA, INTR_CTACARTERA, INTR_CTASEGURO, intr_ctacontrae
    FROM interfaz_transporte
    WHERE INTR_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VER, :CAJA, :CTACAJA,
        :CARTERA, :CTACARTERA, :ctaseguro, :ctacontrae;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 85 AND CNTB_IDREF = :IDDOC;

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

    SELECT FPRM_CTASEGURO, FPRM_CTACONTA FROM forma_pago_remesa WHERE FPRM_COD = :FORMA INTO :ctasegxc, :ctapagarf;
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (:nitasoc);
    if (VALOR <> 0) then
      BEGIN
      /* SI ES DE CONTADO */
      if (FORMA = 'C') then
        BEGIN
        /* LA CAJA */
        if (CAJA = 'C') then
            SELECT FIRST 1 CAJA_CUENTA FROM CAJAS c, carga_remesa R
            WHERE r.cgrm_fpago = 'C' AND R.cgrm_caja = C.caja_id AND R.cgrm_id = :iddoc
            INTO :ctacaja;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctacaja, 2);
            CUENTA = ctacaja;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :valor, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END
      if (FORMA = 'R') then
        BEGIN
        /* LA CARTERA */
        if (CARTERA = 'T') then
            SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitcli INTO :ctacartera;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctacartera, 2);
            CUENTA = ctacartera;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :valor-:seguro, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        /* SEGURO X COBRAR */
        if (SEGURO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctasegxc INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctasegxc, 2);
                CUENTA = ctasegxc;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :seguro, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END
        END
      if (FORMA = 'E') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctacontrae, 2);
            CUENTA = ctacontrae;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :valor-:seguro, 0, 0, 0, :nitdest, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        NITCLI = NITDEST; /* PARA QUE EL INGRESO POR SEGUROS QUEDE AL MISMO NIT */
        nitasoc = NITDEST;
        if (seguro <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctasegxc INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctasegxc, 2);
                CUENTA = ctasegxc;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :seguro, 0, 0, 0, :nitdest, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SEGUROS */
        END
      END /* VALOR */

    /* INGRESO POR SEGUROS */
    if (seguro <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaseguro INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctaseguro, 2);
            CUENTA = ctaseguro;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :seguro, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* SEGUROS */

    /* la cuenta por pagar al transportador */
    if ((VALOR - seguro) <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagarf INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctapagarf, 2);
            CUENTA = ctapagarf;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :valor-:seguro, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_REMICLIE (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable INALC numeric(18,2);
declare variable fomento varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable cent char(1);
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'TERCEROS', 'CONTABILIZAR VENTAS Y RECIBOS DE CAJA CON TERCERO CONTABLE EN LUGAR DEL NIT') returning_values (CNTNIT);
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA,
    INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO,
    INVE_CTACARTERA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO,
    :CTACARTERA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 32 AND CNTB_IDREF = :IDDOC;

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

    MERCANCIA = VRSUBT;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 38 ) then
      CONC = 'REMCLI No.' || NUMERO || '-' || SUBSTRING(NOMBRE FROM 1 FOR 38);
    ELSE
      CONC = 'REMCLI No.' || NUMERO || '-' || NOMBRE;
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 32, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_IVAMONTO), SUM (RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 32);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS C O K */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, remisiones_venta_detalle F, bodega b
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                ELSE
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), sum(RVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            AND RVDE_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        BEGIN
        SELECT SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC and RVDE_IVAMONTO <> 0 AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA K */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(RVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* IMP NACIONAL CONSUMO */
        BEGIN
        SELECT SUM(RVDE_INALCM), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM) FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) and
            RVDE_INALCM <> 0
            INTO :IMPTOS, :MONTO;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (MONTO <> 0) then
            PORC = IMPTOS / MONTO;
        execute procedure redondee(PORC, 0) returning_values (PORC);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA EL IMPUESTO NACIONAL AL CONSUMO') returning_values (ctaconsumo);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */

    /* ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
    SELECT SUM(RVDE_TOTAL) FROM remisiones_venta_detalle F, ARTICULO A
        WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        BEGIN
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END
    /* CIERRE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE IMPOCONSUMO DEL COSTO */
            SELECT SUM(RVDE_CONSUMO) FROM remisiones_venta_detalle F WHERE F.revt_id = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            SUMA = SUMA + IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
        ELSE
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(32, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(RVDE_CONSUMO)
            FROM COSTO_VENTAS CV, remisiones_venta_detalle D WHERE CV.cove_item = D.rvde_item AND D.revt_id = :iddoc AND
            TIDO_COD = 32 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER AND INVC_CN <> 'N'
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 32);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, 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, 32);
                NROI = NROI + 1;
                END
            ELSE
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(32, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_REMICLIE_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable INALC numeric(18,2);
declare variable fomento varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable cent char(1);
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INVE_VENTAS, N.INVE_IVA, N.INVE_CONSUMO, N.INVE_CARTERA,
    N.INVE_COSTO, N.INVE_INVEN, N.INVE_CTAVENTAS, N.INVE_CTAIVA, N.INVE_CTACONSUMO,
    N.INVE_CTACARTERA, N.INVE_CTAINVEN, N.INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO, INVE_EQUIVALENCIA
    FROM INTERFAZ_VENTAS I, interfaz_ventas_niif N
    WHERE I.INVE_ID = :IDINTER AND I.inve_id = N.inve_id
    INTO :EXISTE, :VENTAS, :IVA, :CONSUMO, :CARTERA,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO,
    :CTACARTERA, :CTAINVEN, :CTACOSTOS, :VER, :CENT, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
    EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'TERCEROS', 'CONTABILIZAR VENTAS Y RECIBOS DE CAJA CON TERCERO CONTABLE EN LUGAR DEL NIT') returning_values (CNTNIT);
    if (EXISTE = 'S') then
      BEGIN
      SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA, F.TERC_NIT, REVT_IVAMONTO, REVT_TOTAL,
        REVT_NOMTERC, TERC_CTAVTANIIF, TERC_CTACLIENIIF, REVT_ANULADO, T.terc_nitconta
            FROM remisiones_venta F, TERCEROS T
            WHERE REVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
            INTO :PREF, :NUM, :FECAUX, :NIT, :VRIVA, :VRTOTAL,
            :NOMBRE, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta;
      if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
        NIT = NITCONTA;
      if (ANULADO = 'N') then
        BEGIN
        IF (CENT = 'B') THEN
            SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, remisiones_venta F
                WHERE B.BODE_COD = F.BODE_COD AND F.REVT_ID = :IDDOC INTO :CENTRO, :PROY;
        IF (CENT = 'V') THEN
            SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, remisiones_venta F
                WHERE V.VEND_COD = F.VEND_COD AND F.REVT_ID = :IDDOC INTO :CENTRO, :PROY;
        IF (CENT = 'P') THEN
            SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, remisiones_venta F
                WHERE P.PREF_PRE = F.PREF_PRE AND F.REVT_ID = :IDDOC AND P.TIDO_COD = 32 INTO :CENTRO, :PROY;
        NUMERO = PREF || NUM;
        SELECT SUM (RVDE_CONSUMO) FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC  AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO MERCANCIA;
        SELECT SUM (RVDE_INALCM) FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC  AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO INALC;
        VRSUBT = VRTOTAL - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */
    
        MERCANCIA = VRSUBT;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        if (STRLEN(NOMBRE)> 39) then
          CONC = 'REMCLI No.' || NUMERO || '-' || SUBSTRING(NOMBRE FROM 1 FOR 39);
        ELSE
          CONC = 'REMCLI No.' || NUMERO || '-' || NOMBRE;
        NROI = 100000;
        SUMA = 0;
        ERRORI = 0;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
            CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
         IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
            BEGIN
            IF (VENTAS = 'C') THEN
                CTAVENTAS = TCTAVENTA;
            SELECT SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_IVAMONTO), SUM (RVDE_CONSUMO)
                FROM remisiones_venta_detalle F
                WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
                INTO :MONTO, :IMPTOS, :VRCONSUMO;
            if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* VENTAS C O K */
        if (VENTAS = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAVNT), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remisiones_venta_detalle F, bodega b
                WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) and
                f.bode_cod = b.bode_cod
                GROUP BY COAR_CTAVNT
                INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
                DO
                BEGIN
                if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                    MONTO = MONTO + VRCONSUMO;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (MONTO <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    ELSE
                        BEGIN
                        IF (CENT = 'B') THEN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                        ELSE
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* VENTAS A */
        if (IVA = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAV), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), sum(RVDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remisiones_venta_detalle F
                WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
                AND RVDE_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
                DO
                BEGIN
                if (FOMENTO = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * -1;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (IMPTOS <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END   /* IMPTOS <> 0 */
                END /* FOR */
            END /* IVA A */
        if (IVA = 'K') then
            BEGIN
            SELECT SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_CONSUMO)
                FROM remisiones_venta_detalle F
                WHERE F.REVT_ID = :IDDOC and RVDE_IVAMONTO <> 0 AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
                INTO :IMPTOS, :MONTO, :valoradic;
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* IVA K */
        if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(RVDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remisiones_venta_detalle F
                WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                if (IMPTOS <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END /* IMPTOS <> 0 */
                END /* FOR */
            END /* CONSUMO A */
        if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
            BEGIN
            SELECT SUM(RVDE_CONSUMO)
                FROM remisiones_venta_detalle F
                WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* CONSUMO K */
        /* IMP NACIONAL CONSUMO */
            BEGIN
            SELECT SUM(RVDE_INALCM), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM) FROM remisiones_venta_detalle F
                WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) and
                RVDE_INALCM <> 0
                INTO :IMPTOS, :MONTO;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (MONTO <> 0) then
                PORC = IMPTOS / MONTO;
            execute procedure redondee(PORC, 0) returning_values (PORC);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA EL IMPUESTO NACIONAL AL CONSUMO') returning_values (ctaconsumo);
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* INALC */
    
        /* ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
        SELECT SUM(RVDE_TOTAL) FROM remisiones_venta_detalle F, ARTICULO A
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
            INTO :MONTO;
        if (MONTO IS NULL) then
            MONTO = 0;
        if (MONTO <> 0) then
            BEGIN
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END
        /* CIERRE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K'))) then
            BEGIN
            if (icoing = 'SI') then
                BEGIN
                /* DESCUENTE IMPOCONSUMO DEL COSTO */
                SELECT SUM(RVDE_CONSUMO) FROM remisiones_venta_detalle F WHERE F.revt_id = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
                    INTO :IMPTOS;
                SUMA = SUMA + IMPTOS;
                END
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (CARTERA = 'C') then
                CTACARTERA = TCTACLIEN;
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        /* CALCULE COSTOS EN VENTAS */
        EXECUTE PROCEDURE COSTO_EN_VENTAS(32, :IDDOC);
        if (COSTOS = 'A') then
            BEGIN
            FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(RVDE_CONSUMO)
                FROM COSTO_VENTAS CV, remisiones_venta_detalle D WHERE CV.cove_item = D.rvde_item AND D.revt_id = :iddoc AND
                TIDO_COD = 32 AND COVE_ID = :iddoc
                GROUP BY CTACOS
                INTO :CTACOSTOS, :MONTO, :vrconsumo
                DO
                BEGIN
                if (icoing = 'SI') then
                    MONTO = MONTO + VRCONSUMO;
                if (MONTO <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        NROI = NROI + 1;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* COSTOS */
        if (COSTOS = 'K') then
            BEGIN
            SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
                INTO :MONTO;
            if (icoing = 'SI') then
                MONTO = MONTO + imptos;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* COSTOS = K */
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
                GROUP BY CTAINV
                INTO :CTAINVEN, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        NROI = NROI + 1;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* INVEN = A */
        if (INVEN = 'K') then
            BEGIN
            SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
                FROM COSTO_VENTAS WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* INVEN = K */
        /* recorra las cuentas adicionales */
        FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
            FROM INTERFAZ_VENTAS_CTAS
            WHERE INVE_ID = :IDINTER AND INVC_CN <> 'C'
            INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = vrsubt;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    END
                ELSE
                    BEGIN
                    if (DBADIC = 'S') then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                NROI = NROI + 1;
                END
            END
        if (ERRORI > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
      END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1032, :IDDOC, :PREF, 1);
        ERRORI = ERRORI + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_REMIPROV (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(15);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
declare variable SIMPLIF CHAR(1);
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP,
    INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP,
    :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 22 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA REMISION */
    SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA, F.TERC_NIT, REPR_IMPTOS, REPR_DTOMONTO, REPR_ADICIONAL, REPR_IVAMONTO,
        REPR_EXTRA, REPR_TOTAL, TERC_NOM, PROV_CTAPAGAR, REPR_NUMPROV, REPR_ANULADO, PROV_SIMPLIFICADO
        FROM remision_proveedor F, TERCEROS T, PROVEEDORES P WHERE REPR_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :NOMBRE, :TCTAPROV, :NUMPROV, :ANULADO, :simplif;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, remision_proveedor F WHERE B.BODE_COD = F.BODE_COD AND F.repr_id = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, remision_proveedor F WHERE P.PREF_PRE = F.PREF_PRE AND F.repr_id = :IDDOC AND P.TIDO_COD = 22 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'REMIPRV No.' || NUMERO || '-' || SUBSTRING(NOMBRE FROM 1 FOR 16) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 22, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERRORI = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(RPVD_consumo) from remision_proveedor_det where REPR_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
            ELSE
                FACTOR = 1;
        ELSE
           FACTOR = 1;
        SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'DOCUMENTOS' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_IVAMONTO), SUM(RPVD_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO C, remision_proveedor_det F WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), RPVD_IVAMONTO, RPVD_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, remision_proveedor_det F WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_IVAMONTO), SUM(RPVD_CONSUMO), MAX(BODE_COD)
                FROM remision_proveedor_det WHERE REPR_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                   BEGIN
                    FOR SELECT ARTI_COD, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), RPVD_IVAMONTO, RPVD_CONSUMO
                      FROM remision_proveedor_det WHERE REPR_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       IF (CENT = 'B') THEN
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       ELSE
                          INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       NUMITEMS = NUMITEMS + 1;
                       NETO = NETO + MONTO;
                       END
                   END
                  if (TIPOCUEN = 'C') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                  if (TIPOCUEN = 'N') then
                   BEGIN
                    IF (CENT = 'B') THEN
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    ELSE
                       INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if ((IVA = 'A') AND (SIMPLIF = 'N')) then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(RPVD_IVAMONTO), SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, remision_proveedor_det F
                WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND RPVD_IVAMONTO <> 0
                GROUP BY COAR_CTAIVAC
                INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
              if (IMPTOS <> 0) then
                BEGIN
                if (MERCANCIA <> 0) then
                    IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    IMPTOS = 0;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                if (MERCANCIA <> 0) then
                    MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    MONTO = 0;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, RPVD_IVAMONTO, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), TAIV_PORC, RPVD_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, remision_proveedor_det F, TARIFA_IVA T WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAC = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (MERCANCIA <> 0) then
                            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        if (MERCANCIA <> 0) then
                            MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            MONTO = 0;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if ((IVA = 'K') or (SIMPLIF = 'S')) then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(RPVD_IVAMONTO), SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_CONSUMO)
                FROM remision_proveedor_det F
                WHERE F.repr_id = :IDDOC  AND RPVD_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                BEGIN
                if (MERCANCIA <> 0) then
                    IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    IMPTOS = 0;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                if (MERCANCIA <> 0) then
                    MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    MONTO = 0;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (SIMPLIF = 'S') then
                    BEGIN
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA DE IVA PARA EL REGIMEN SIMPLIFICADO') returning_values (:CTAIVA);
                    END
                EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), RPVD_IVAMONTO, TAIV_PORC, RPVD_CONSUMO
                        FROM ARTICULO A, remision_proveedor_det F, TARIFA_IVA T WHERE F.repr_id = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                        BEGIN
                        if (MERCANCIA <> 0) then
                            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        if (MERCANCIA <> 0) then
                            MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            MONTO = 0;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(RPVD_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO C, remision_proveedor_det F
                WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(RPVD_CONSUMO) FROM remision_proveedor_det F WHERE F.repr_id = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
              BEGIN
              execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
              /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
              EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                END
              end
            END
        /* DESCUENTO */
        if ((CTADTO IS NOT NULL) AND
            (CTADTO <> '')) THEN
          BEGIN
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            end
          END
        /* VALOR ADIC */
        if ((CTAADIC IS NOT NULL) AND
            (CTAADIC <> '')) THEN
          BEGIN
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                END
            end
          END
        /* VALOR EXTRA */
        if ((CTAEXTRA IS NOT NULL) AND
            (CTAEXTRA <> '')) THEN
          BEGIN
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                else
                    begin
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                    if (CTAEXTRA <> '') then
                        CUENTA = CTAEXTRA;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    end
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                else
                    begin
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                    if (CTAEXTRA <> '') then
                        CUENTA = CTAEXTRA;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                    end
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(RPVD_CONSUMO) FROM remision_proveedor_det F WHERE F.repr_id = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
            WHERE INCO_ID = :IDINTER AND INCC_CN <> 'N'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(RPVD_CONSUMO) FROM remision_proveedor_det F WHERE F.repr_id = :IDDOC INTO :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        if (NETO <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(22, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        END
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(22, :IDDOC, :PREFIJO, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_REMIPROV_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI INTEGER,
    VER CHAR(1))
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE VRTOTAL NUMERIC(18,2);
DECLARE VARIABLE VREXTRA NUMERIC(18,2);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE CTADTO VARCHAR(20);
DECLARE VARIABLE CTAADIC VARCHAR(20);
DECLARE VARIABLE CTAEXTRA VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE CUENTA VARCHAR(20);
DECLARE VARIABLE MONTO NUMERIC(18,2);
DECLARE VARIABLE TIPOCUEN CHAR(1);
DECLARE VARIABLE NIT VARCHAR(20);
DECLARE VARIABLE NOMBRE VARCHAR(60);
DECLARE VARIABLE PROY VARCHAR(4);
DECLARE VARIABLE CENTRO VARCHAR(4);
DECLARE VARIABLE PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
DECLARE VARIABLE NUMITEMS INTEGER;
DECLARE VARIABLE ARTICULO VARCHAR(15);
DECLARE VARIABLE IMPINC CHAR(1);
DECLARE VARIABLE IMPTOS NUMERIC(18,2);
DECLARE VARIABLE SUMA NUMERIC(18,2);
DECLARE VARIABLE PORCIVA NUMERIC(9,2);
DECLARE VARIABLE TCTAPROV VARCHAR(20);
DECLARE VARIABLE CUENTAADIC VARCHAR(20);
DECLARE VARIABLE BASEADIC VARCHAR(20);
DECLARE VARIABLE PORCADIC NUMERIC(5,2);
DECLARE VARIABLE VALORADIC NUMERIC(18,2);
DECLARE VARIABLE DBADIC CHAR(1);
DECLARE VARIABLE FOMENTO CHAR(2);
DECLARE VARIABLE BODE_DET CHAR(2);
DECLARE VARIABLE NUMPROV VARCHAR(15);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
DECLARE VARIABLE MENORV CHAR(2);
declare variable DIG INTEGER;
declare variable NETO NUMERIC(18,2);
declare variable CENT CHAR(1);
declare variable ANULADO CHAR(1);
declare variable ERRORC INTEGER;
declare variable SIMPLIF CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERRORI = 0;
/* INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCO_INVEN, N.INCO_IVA, N.INCO_CONSUMO, N.INCO_CXP,
    N.INCO_CTAINVEN, N.INCO_CTAIVA, N.INCO_CTACONSUMO, N.INCO_CTADTO, N.INCO_CTAADIC, N.INCO_CTAEXTRA, N.INCO_CTACXP,
    INCO_CONFIRMAR, INCO_CENTRO, INCO_EQUIVALENCIA
    FROM INTERFAZ_COMPRAS I, interfaz_compras_niif N WHERE I.INCO_ID = :IDINTER AND I.inco_id = N.inco_id
    INTO :EXISTE, :INVEN, :IVA, :CONSUMO, :CXP,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :VER, :CENT, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
      if (EXISTE = 'S') then
        BEGIN
        /* ENCABEZADO DE LA REMISION */
        SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA, F.TERC_NIT, REPR_IMPTOS, REPR_DTOMONTO, REPR_ADICIONAL, REPR_IVAMONTO,
            REPR_EXTRA, REPR_TOTAL, TERC_NOM, PROV_CTAPAGNIIF, REPR_NUMPROV, REPR_ANULADO, PROV_SIMPLIFICADO
            FROM remision_proveedor F, TERCEROS T, PROVEEDORES P WHERE REPR_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
            INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VRDTO, :VRADIC, :VRIVA,
            :VREXTRA, :VRTOTAL, :NOMBRE, :TCTAPROV, :NUMPROV, :ANULADO, :simplif;
        /* CENTRO DE LA BODEGA */
        IF (CENT = 'B') THEN
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, remision_proveedor F WHERE B.BODE_COD = F.BODE_COD AND F.repr_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, remision_proveedor F WHERE P.PREF_PRE = F.PREF_PRE AND F.repr_id = :IDDOC AND P.TIDO_COD = 22 INTO :CENTRO, :PROY;
        if (ANULADO = 'N') then
            BEGIN
            NUMERO = PREFIJO || NUM;
            VRSUBT = VRTOTAL - VREXTRA - VRIVA;
            MERCANCIA = VRSUBT - VRADIC + VRDTO;
            EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
            if (NUMPROV IS NULL) then
                NUMPROV = NUMERO;
            CONCEPTO = 'REMIPROV No.' || NUMERO || '-' || SUBSTRING(NOMBRE FROM 1 FOR 15) || '-NPROV.' || NUMPROV;
            NUMITEMS = 100000;
            SUMA = 0;
            NETO = 0;
            ERRORI = 0;
            EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            SELECT SUM(RPVD_consumo) from remision_proveedor_det where REPR_id = :IDDOC into :valoradic;
            if (MENORV = 'SI') then
                if (MERCANCIA <> 0) then
                    FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
                ELSE
                    FACTOR = 1;
            ELSE
               FACTOR = 1;
            SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'DOCUMENTOS' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
            if (INVEN = 'A') then
                BEGIN
                FOR SELECT MAX(COAR_CTACOMP), SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_IVAMONTO), SUM(RPVD_CONSUMO), MAX(F.BODE_COD)
                    FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remision_proveedor_det F WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                    GROUP BY COAR_CTACOMP, F.BODE_COD INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :BODE_DET DO
                    BEGIN
                    IF (CENT = 'B') THEN
                      SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                    MONTO = MONTO * FACTOR;
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                        BEGIN
                        FOR SELECT F.ARTI_COD, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), RPVD_IVAMONTO, RPVD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remision_proveedor_det F WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACOMP = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                            BEGIN
                            if (IMPINC = 'S') then
                                BEGIN
                                MONTO = MONTO - IMPTOS;
                                if (FOMENTO <> 'SI' ) then
                                    MONTO = MONTO - VALORADIC;
                                END
                            MONTO = MONTO * FACTOR;
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                            IF (CENT = 'B') THEN
                               INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                   VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            ELSE
                               INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                   VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + MONTO;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :fecha, NULL, 0, 22);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        END
                    END
                END
            if (INVEN = 'K') then
                BEGIN
                FOR SELECT SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_IVAMONTO), SUM(RPVD_CONSUMO), MAX(BODE_COD)
                    FROM remision_proveedor_det WHERE REPR_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                    BEGIN
                      IF (CENT = 'B') THEN
                        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                      if (IMPINC = 'S') then
                       BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI' ) then
                          MONTO = MONTO - VALORADIC;
                       END
                      MONTO = MONTO * FACTOR;
                      execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                      execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                      EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                      if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                       BEGIN
                        FOR SELECT ARTI_COD, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), RPVD_IVAMONTO, RPVD_CONSUMO
                          FROM remision_proveedor_det WHERE REPR_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                           BEGIN
                           if (IMPINC = 'S') then
                            BEGIN
                             MONTO = MONTO - IMPTOS;
                             if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                           MONTO = MONTO * FACTOR;
                           execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           IF (CENT = 'B') THEN
                              INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                 VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                           ELSE
                              INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                 VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                           NUMITEMS = NUMITEMS + 1;
                           NETO = NETO + MONTO;
                           END
                       END
                      if (TIPOCUEN = 'C') then
                       BEGIN
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :fecha, NULL, 0, 22);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                       END
                      if (TIPOCUEN = 'N') then
                       BEGIN
                        IF (CENT = 'B') THEN
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                              VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                        ELSE
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                              VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                       END
                    END
                END
            /* EL IVA */
            if ((IVA = 'A') AND (SIMPLIF = 'N')) then
                BEGIN
                FOR SELECT MAX(COAR_CTAIVAC), SUM(RPVD_IVAMONTO), SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_CONSUMO)
                    FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remision_proveedor_det F
                    WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND RPVD_IVAMONTO <> 0
                    GROUP BY COAR_CTAIVAC
                    INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC DO
                  if (IMPTOS <> 0) then
                    BEGIN
                    if (MERCANCIA <> 0) then
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                    else
                        IMPTOS = 0;
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                    if (MERCANCIA <> 0) then
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                    else
                        MONTO = 0;
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, RPVD_IVAMONTO, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), TAIV_PORC, RPVD_CONSUMO
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remision_proveedor_det F, TARIFA_IVA T WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAC = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                            INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                        DO
                            BEGIN
                            if (MERCANCIA <> 0) then
                                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                            else
                                IMPTOS = 0;
                            if (IMPINC = 'S') then
                                BEGIN
                                MONTO = MONTO - IMPTOS;
                                if (FOMENTO <> 'SI' ) then
                                    MONTO = MONTO - VALORADIC;
                                END
                            if (MERCANCIA <> 0) then
                                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                            else
                                MONTO = 0;
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                END
            if ((IVA = 'K') or (SIMPLIF = 'S')) then /* IVA EN CTA CONSTANTE */
                BEGIN
                SELECT SUM(RPVD_IVAMONTO), SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_CONSUMO)
                    FROM remision_proveedor_det F
                    WHERE F.repr_id = :IDDOC  AND RPVD_IVAMONTO <> 0
                    INTO :IMPTOS, :MONTO, :VALORADIC;
                if (IMPTOS <> 0) then
                    BEGIN
                    if (MERCANCIA <> 0) then
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                    else
                        IMPTOS = 0;
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                    if (MERCANCIA <> 0) then
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                    else
                        MONTO = 0;
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    if (SIMPLIF = 'S') then
                        BEGIN
                        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA DE IVA PARA EL REGIMEN SIMPLIFICADO') returning_values (:CTAIVA);
                        END
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), RPVD_IVAMONTO, TAIV_PORC, RPVD_CONSUMO
                            FROM ARTICULO A, remision_proveedor_det F, TARIFA_IVA T WHERE F.repr_id = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                            INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC DO
                            BEGIN
                            if (MERCANCIA <> 0) then
                                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                            else
                                IMPTOS = 0;
                            if (IMPINC = 'S') then
                                BEGIN
                                MONTO = MONTO - IMPTOS;
                                if (FOMENTO <> 'SI' ) then
                                    MONTO = MONTO - VALORADIC;
                                END
                            if (MERCANCIA <> 0) then
                                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                            else
                                MONTO = 0;
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                NETO = NETO + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                END
            /* EL IMPOCONSUMO */
            if (CONSUMO = 'A') then
                BEGIN
                FOR SELECT MAX(COAR_CTACONS), SUM(RPVD_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remision_proveedor_det F
                    WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
                DO
                  if (IMPTOS <> 0) then
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if (FOMENTO <> 'SI') then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    ELSE
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                END
            if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
                BEGIN
                SELECT SUM(RPVD_CONSUMO) FROM remision_proveedor_det F WHERE F.repr_id = :IDDOC INTO :IMPTOS;
                if (IMPTOS <> 0) then
                  BEGIN
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                  EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                  if (FOMENTO <> 'SI') then
                    BEGIN
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                  ELSE
                    BEGIN
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                  end
                END
            /* DESCUENTO */
            if ((CTADTO IS NOT NULL) AND
                (CTADTO <> '')) THEN
              BEGIN
              execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
              if (VRDTO <> 0) then
                begin
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - VRDTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - VRDTO;
                    END
                end
              END
            /* VALOR ADIC */
            if ((CTAADIC IS NOT NULL) AND
                (CTAADIC <> '')) THEN
              BEGIN
              execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
              if (VRADIC <> 0) then
                begin
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + VRADIC;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + VRADIC;
                    END
                end
              END
            /* VALOR EXTRA */
            if ((CTAEXTRA IS NOT NULL) AND
                (CTAEXTRA <> '')) THEN
              BEGIN
              execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
              if (VREXTRA <> 0) then
                begin
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (vrextra > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    else
                        begin
                        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                        if (CTAEXTRA <> '') then
                            CUENTA = CTAEXTRA;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                        end
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + VREXTRA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (vrextra > 0) then
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                    else
                        begin
                        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                        if (CTAEXTRA <> '') then
                            CUENTA = CTAEXTRA;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                        end
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + VREXTRA;
                    END
                end
              END
    
            /* DESCUENTE EL IMPOCONSUMO */
            SELECT SUM(RPVD_CONSUMO) FROM remision_proveedor_det F WHERE F.repr_id = :IDDOC INTO :IMPTOS;
            if (IMPTOS IS NULL) then
                IMPTOS = 0;
            vrsubt = vrsubt - IMPTOS;
            /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
            if ((CXP = 'P') or (CXP = 'K')) then
                BEGIN
                SUMA = VRTOTAL - SUMA;
                execute procedure redondee(SUMA, DIG) returning_values (SUMA);
                if (CXP = 'P') then
                    CTACXP = TCTAPROV;
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'C') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NETO = NETO - SUMA;
                NUMITEMS = NUMITEMS + 1;
                END
            /* recorra las cuentas adicionales */
            FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB FROM INTERFAZ_COMPRAS_CTAS
                WHERE INCO_ID = :IDINTER AND INCC_CN <> 'C'
                INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
                DO
                BEGIN
                if (VALORADIC <> 0) then
                    MONTO = VALORADIC;
                ELSE
                    BEGIN
                    if (:BASEADIC = 'SUBTOTAL') then
                        VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                    if (:BASEADIC = 'DESCUENTO') then
                        VALORADIC = VRDTO;
                    if (:BASEADIC = 'IVA') then
                        VALORADIC = VRIVA;
                    if (:BASEADIC = 'CONSUMO') then
                        SELECT SUM(RPVD_CONSUMO) FROM remision_proveedor_det F WHERE F.repr_id = :IDDOC INTO :VALORADIC;
                    if (:BASEADIC = 'ADICIONAL') then
                        VALORADIC = VRADIC;
                    if (:BASEADIC = 'EXTRA') then
                        VALORADIC = VREXTRA;
                    if (:BASEADIC = 'TOTAL') then
                        VALORADIC = VRTOTAL;
                    MONTO = CAST(VALORADIC AS DOUBLE PRECISION) * PORCADIC / 100;
                    END
                if (MONTO <> 0) then
                    BEGIN
                    execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        if (DBADIC = 'S') then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                            SUMA = SUMA + MONTO;
                            NETO = NETO + MONTO;
                            END
                        ELSE
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                            SUMA = SUMA - MONTO;
                            NETO = NETO - MONTO;
                            END
                        NUMITEMS = NUMITEMS + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        if (DBADIC = 'S') then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            SUMA = SUMA + MONTO;
                            NETO = NETO + MONTO;
                            END
                        ELSE
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            SUMA = SUMA - MONTO;
                            NETO = NETO - MONTO;
                            END
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END
            if (NETO <> 0) then
                BEGIN
                EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
                if (ctaadic <> '') then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        if (NETO < 0) then
                            BEGIN
                            NETO = NETO * -1;
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                            END
                        ELSE
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                            END
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        if (NETO < 0) then
                            BEGIN
                            NETO = NETO * -1;
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            END
                        ELSE
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            END
                        END
                    END
                END
            END
        if (ERRORI > 0) then
            VER = 'S';
        SUSPEND;
        END
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1022, :IDDOC, :PREFIJO, 1);
        ERRORI = ERRORI + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


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


ALTER PROCEDURE CONTABIL_RUTERO (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(12);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCE CHAR(8);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable VENTAS CHAR(1);
declare variable CTAVENTAS VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_CARTERA, INVE_CTAVENTAS, INVE_CTACARTERA, INVE_CONFIRMAR
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :CARTERA, :CTAVENTAS, :CTACARTERA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 37 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DEL RUTERO */
  SELECT PREF_PRE, RUTE_NUMERO, RUTE_FECHA, RUTE_ANULADO
        FROM rutero R
        WHERE RUTE_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, rutero R
        WHERE P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 37 AND RUTE_ID = :IDDOC INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;

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


ALTER PROCEDURE CONTABIL_SALIDA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :proy, :centro;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, TERC_NIT, SALI_IMPTOS, SALI_ANULADO
        FROM SALIDAS
        WHERE SALI_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 12 AND CNTB_IDREF = :IDDOC;

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


ALTER PROCEDURE CONTABIL_SALIDA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable CONCEPTO CHAR(60);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_IVAV, N.ININ_CONSUMO, N.ININ_TOTAL, N.ININ_CTABASE, N.ININ_CTAIVA, N.ININ_CTACONSUMO, N.ININ_CTACIERRE,
    ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT, ININ_EQUIVALENCIA
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROY, :centro, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
    ERROR = 0;
    if (EXISTE = 'S') then
        BEGIN
        /* TRAIGA EL ENCABEZADO DE LA SALIDA */
        SELECT PREF_PRE, SALI_CONC, TERC_NIT, SALI_IMPTOS, SALI_ANULADO
            FROM SALIDAS
            WHERE SALI_ID = :IDDOC
            INTO :PREFIJO, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
        if ((NIT IS NULL) or (NIT = '')) then
            EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
    
        if (ANULADO = 'N') then
            BEGIN
            if (CENT = 'B') then
                SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, SALIDAS E
                    WHERE B.BODE_COD = E.BODE_COD AND E.SALI_ID = :IDDOC INTO :CENTRO, :PROY;
            ELSE
              if (CENT = 'P') then
                SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, SALIDAS E
                    WHERE P.PREF_PRE = E.PREF_PRE AND E.SALI_ID = :IDDOC AND P.TIDO_COD = 12 INTO :CENTRO, :PROY;
            NUMITEMS = 100000;
            SUMA = 0;
            /* PRIMERO LA BASE */
            if (BASE = 'A') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT MAX(COAR_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                    FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                    GROUP BY COAR_CTAINV
                    INTO :CTABASE, :MONTO, :IMPTOS
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if (MONTO <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTABASE, 2);
                            CUENTA = CTABASE;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        /* DEPENDE DEL TIPO DE CUENTA */
                        if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                                INTO :ARTICULO, :MONTO, :IMPTOS
                            DO
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                if (MONTO <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - MONTO;
                                    END
                                END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DE LA BASE */
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END /* FOR */
                END /* BASE POR ARTICULO */
            if (BASE = 'I') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT MAX(TAIV_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                    FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                    GROUP BY TAIV_CTAINV
                    INTO :CTABASE, :MONTO, :IMPTOS
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if (MONTO <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTABASE, 2);
                            CUENTA = CTABASE;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        /* DEPENDE DEL TIPO DE CUENTA */
                        if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                                INTO :ARTICULO, :MONTO, :IMPTOS
                            DO
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                if (MONTO <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - MONTO;
                                    END
                                END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DE LA BASE */
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END /* FOR */
                END /* BASE POR IVA */
            if ((BASE = 'K') or (BASE = 'T')) then
                BEGIN
                if (BASE = 'T') then
                    BEGIN
                    SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                    if (:PROV = 'S') then
                        SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                    END
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                    FROM SALIDAS_DETALLE
                    WHERE SALI_ID = :IDDOC
                    INTO :MONTO, :IMPTOS
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if (MONTO <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTABASE, 2);
                            CUENTA = CTABASE;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        /* DEPENDE DEL TIPO DE CUENTA */
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                                INTO :ARTICULO, :MONTO, :IMPTOS
                            DO
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                if (MONTO <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - MONTO;
                                    END
                                END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DE LA BASE */
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    END /* FOR */
                END /* BASE K O POR TERCERO */
            /* EL IVA EN VENTAS */
            if (IVAV = 'A') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT MAX(COAR_CTAIVAV), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                    FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                    GROUP BY COAR_CTAIVAV
                    INTO :CTAIVA, :IMPTOS, :MONTO
                DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTAIVA, 2);
                            CUENTA = CTAIVA;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                                INTO :ARTICULO, :IMPTOS, :MONTO
                            DO
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                MONTO = MONTO * -1;
                                if (IMPTOS <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - IMPTOS;
                                    END
                                END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END /* FOR */
                END /* IVA POR ARTICULO */
            if (IVAV = 'I') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                    FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                    GROUP BY TAIV_CTAIVAVNT
                    INTO :CTAIVA, :IMPTOS, :MONTO
                DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTAIVA, 2);
                            CUENTA = CTAIVA;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                                INTO :ARTICULO, :IMPTOS, :MONTO
                            DO
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                MONTO = MONTO * -1;
                                if (IMPTOS <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - IMPTOS;
                                    END
                                END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END /* FOR */
                END /* IVA POR TARIFA */
            if (IVAV = 'K') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                SELECT SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                    FROM SALIDAS_DETALLE
                    WHERE SALI_ID = :IDDOC
                    INTO :IMPTOS, :MONTO;
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                MONTO = MONTO * -1;
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* IVA CONSTANTE */
            /* EL IMPOCONSUMO */
            if (CONSUMO = 'A') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT MAX(COAR_CTACONS), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                    FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                    GROUP BY COAR_CTACONS
                    INTO :CTACONSUMO, :IMPTOS
                DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTACONSUMO, 2);
                            CUENTA = CTACONSUMO;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                                INTO :ARTICULO, :IMPTOS
                                DO
                                if (IMPTOS <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - IMPTOS;
                                    END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DE LA BASE */
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END /* FOR */
                END /* CONSUMO POR ARTICULO */
            if (CONSUMO = 'K') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                    FROM SALIDAS_DETALLE
                    WHERE SALI_ID = :IDDOC
                    INTO :IMPTOS;
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctaconsumo INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* CONSUMO CONSTANTE */
            /* recorra las cuentas adicionales */
            FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
                FROM INTERFAZ_INVENTARIO_CTAS
                WHERE ININ_ID = :IDINTER AND INIC_CN <> 'C'
                INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
                DO
                BEGIN
                if (VALORADIC <> 0) then
                    MONTO = VALORADIC;
                ELSE
                    BEGIN
                    if (:BASEADIC = 'SUBTOTAL') then
                        SELECT SUM(SADE_CANT * SADE_COSTO)
                        FROM SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC 
                        INTO :VALORADIC;
                    if (:BASEADIC = 'IVA') then
                        SELECT SUM(SADE_IVAMONTO)
                        FROM SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC 
                        INTO :VALORADIC;
                    if (:BASEADIC = 'CONSUMO') then
                        SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                        FROM SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC 
                        INTO :VALORADIC;
                    MONTO = VALORADIC * PORCADIC / 100;
                    END
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTAADIC, 2);
                        CUENTA = CUENTAADIC;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        if (DBADIC = 'S') then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            SUMA = SUMA + MONTO;
                            END
                        ELSE
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            SUMA = SUMA - MONTO;
                            END
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END
            /* CIERRE EL COMPROBANTE  */
            if (SUMA <> 0) then
                BEGIN
                if (SUMA > 0) then
                    BEGIN
                    DEBITO = 0;
                    CREDITO = SUMA;
                    END
                ELSE    
                    BEGIN
                    DEBITO = SUMA * -1;
                    CREDITO = 0;
                    END
                if ((TOTAL = 'K') or (TOTAL = 'T')) then
                    BEGIN
                    if (TOTAL = 'T') then
                        BEGIN
                        SELECT TERC_CTAPROV, TERC_PROV
                            FROM TERCEROS WHERE TERC_NIT = :NIT
                            INTO :CTACIERRE, :PROV;
                        if (PROV = 'S') then
                            SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                            INTO :CTACIERRE;
                        END
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTACIERRE, 2);
                        CUENTA = CTACIERRE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    END
                END /* SUMA */
            if (ERROR > 0) then
                VER = 'S';
            SUSPEND;
            END /* NO ANULADO */
        END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :PREFIJO, 1);
        ERROR = ERROR + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


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


ALTER PROCEDURE CONTABIL_TRASCUENTA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable CONC CHAR(120);
declare variable CTADEST INTEGER;
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
declare variable VRNOTA NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable ANULADO CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INBA_BANCO, N.INBA_IVA, N.INBA_GMF, N.INBA_BASE, N.INBA_CTABCO, N.INBA_CTAIVA, N.INBA_CTAGMF, N.INBA_CTABASE, INBA_CONFIRMAR, INBA_EQUIVALENCIA
    FROM INTERFAZ_BANCOS I, interfaz_bancos_niif N
    WHERE I.INBA_ID = :IDINTER AND I.inba_id = N.inba_id
    INTO :EXISTE, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
    if (EXISTE = 'S') then
      BEGIN
      /* TRAIGA EL ENCABEZADO  */
      SELECT PRBA_PREF, TRAS_NUMERO, TRAS_CONCEPTO, TRAS_CTADEST, TRAS_MONTO, TRAS_GMFMONTO, TRAS_IVAMONTO2, TRAS_NOTAMONTO, CUBA_CTANIIF, CUBA_CTAIVAN, CUBA_CTAGMFN, TRAS_ANULADO, BANC_NIT
            FROM TRASLADOS T, CUENTAS_BANCO C, BANCOS B
            WHERE TRAS_ID = :IDDOC AND C.CUBA_COD = T.CUBA_COD AND C.BANC_COD = B.BANC_COD
            INTO :PREF, :NUM, :CONC, :CTADEST, :MONTO, :VRGMF, :VRIVA, :VRNOTA, :BCTABANCO, :BCTAIVA, :BCTAGMF, :ANULADO, :NIT;
      if (ANULADO = 'N') then
        BEGIN
        if (VRIVA IS NULL) then
            VRIVA = 0;
        if (VRGMF IS NULL) then
            VRGMF = 0;
        if (VRNOTA IS NULL) then
            VRNOTA = 0;
        SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, TRASLADOS T
            WHERE P.PRBA_PREF = T.PRBA_PREF AND P.CUBA_COD = T.CUBA_COD AND P.tido_cod = 76 AND T.TRAS_ID = :IDDOC
            INTO :CENTRO, :PROY;
        NUMERO = PREF || NUM;
        NROI = 100000;
        SUMA = 0;
        /* CUENTA BASE */
        if ((BASE = 'K') or (BASE = 'C')) then
            BEGIN
            if (BASE = 'C') then
                BEGIN
                SELECT CUBA_CTANIIF FROM CUENTAS_BANCO
                    WHERE CUBA_COD = :CTADEST INTO :CTABASE;
                END
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = MONTO;
                END
            END /* BASE = K */
        /* CUENTA GMF */
        if ((VRGMF <> 0) AND ((GMF = 'K') or (GMF = 'B'))) then
            BEGIN
            if (GMF = 'B') then
                CTAGMF = BCTAGMF;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CTAGMF, 2);
                CUENTA = CTAGMF;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRGMF;
                END
            END /* GMF */
        /* CUENTA IVA */
        if ((VRIVA <> 0) AND ((IVA = 'K') or (IVA = 'B'))) then
            BEGIN
            if (IVA = 'B') then
                CTAIVA = BCTAIVA;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* IVA */
        /* CUENTA BANCO */
        if ((BANCO = 'B') or (BANCO = 'K')) then
            BEGIN
            if (BANCO = 'B') then
                CTABANCO = BCTABANCO;
            if (SUMA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CTABANCO, 2);
                    CUENTA = CTABANCO;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                END /* SUMA <> 0 */
            END /* BANCO K O B */
        /* recorra las cuentas adicionales */
        FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
            FROM INTERFAZ_BANCOS_CTAS
            WHERE INBA_ID = :IDINTER AND INBC_CN <> 'C'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'MONTO') then
                VALORADIC = MONTO;
            MONTO = VALORADIC * PORCADIC;
            
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTAADIC, 2);
                CUENTA = CUENTAADIC;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NROI = NROI + 1;
                END
            
            NROI = NROI + 1;
            END
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
      END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1076, :IDDOC, :PREF, 1);
        ERROR = ERROR + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


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

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

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

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRTOTAL;
                END
            END /* VRTOTAL <> 0 */
        END /* CAJA CONSTANTE */
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
    if ((SUMA <> 0) and ((BASE = 'F') or (BASE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (BASE = 'F') then
            SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CAJA */

    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER AND INJC_CN <> 'N'
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
        
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_TRASLACAJA_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable CONC CHAR(120);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable CTADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable IDCAJA INTEGER;
declare variable IDDEST INTEGER;
declare variable ANULADO CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', N.INCJ_BASE, N.INCJ_DTOPP, N.INCJ_RTFTE, N.INCJ_RTIVA, N.INCJ_RTICA, N.INCJ_CAJA, N.INCJ_CTABASE, N.INCJ_CTADTO, N.INCJ_CTARTFTE,
    N.INCJ_CTARTIVA, N.INCJ_CTARTICA, N.INCJ_CTACAJA, INCJ_EQUIVALENCIA
    FROM INTERFAZ_CAJA I, interfaz_caja_niif N
    WHERE I.INCJ_ID = :IDINTER AND I.incj_id = N.incj_id
    INTO :EXISTE, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
    if (EXISTE = 'S') then
      BEGIN
      /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
      execute procedure lee_configuracion ('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (NIT);
      /* TRAIGA EL ENCABEZADO DEL TRASLADO */
      SELECT MAX(PREF_PRE), MAX(TRCJ_NUMERO), MAX(TRCJ_CONC), SUM(TRCD_MONTO), MAX(CAJA_ID), MAX(TRCJ_DESTINO), max(trcj_anulado)
            FROM TRASLADOS_CAJA T, traslados_caja_det D
            WHERE T.TRCJ_ID = D.TRCJ_ID AND T.TRCJ_ID = :IDDOC
            INTO :PREF, :NUM, :CONC, :VRTOTAL, :IDCAJA, :IDDEST, :ANULADO;
      if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
            WHERE PREF_PRE = :PREF AND TIDO_COD = 66 INTO :CENTRO, :PROY;
        NUMERO = PREF || NUM;
        NROI = 100000;
        SUMA = 0;
        ERROR = 0;
        IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
            BEGIN
            if (VRTOTAL <> 0) then
                BEGIN
                IF ((CAJA = 'F')) THEN
                    BEGIN
                    /* TRAIGA LA CUENTA DE LA CAJA DESTINO */
                    SELECT CAJA_CTANIIF FROM CAJAS WHERE CAJA_ID = :IDDEST INTO CTACAJA;
                    END
    
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRTOTAL;
                    END
                END /* VRTOTAL <> 0 */
            END /* CAJA CONSTANTE */
            
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
        if ((SUMA <> 0) and ((BASE = 'F') or (BASE = 'K'))) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (BASE = 'F') then
                SELECT CAJA_CTANIIF FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;
    
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CAJA */
    
        /* recorra las cuentas adicionales */
        FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
            FROM INTERFAZ_CAJA_CTAS
            WHERE INCJ_ID = :IDINTER AND INJC_CN <> 'C'
            INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) THEN
                begin
                EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            NROI = NROI + 1;
            END
            
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
      END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1066, :IDDOC, :PREF, 1);
        ERROR = ERROR + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


ALTER PROCEDURE CONTABIL_TRASLAMERCANCIA (
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYDES VARCHAR(4);
declare variable CENTRODES VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable DEBITODES NUMERIC(18,2);
declare variable CREDITODES NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable SUMADES NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable VRBASE NUMERIC(18,2);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROYDES, :CENTRODES;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TERC_NIT, TRAN_IMPTOS, TRAN_ANULADO
        FROM TRASFERENCIAS
        WHERE TRAN_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 13 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
          BEGIN
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.tran_id = :IDDOC INTO :CENTRO, :PROY;
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.TRAN_BODDES AND E.tran_id = :IDDOC INTO :CENTRODES, :PROYDES;
          END
        ELSE
          if (CENT = 'P') then
            BEGIN
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, TRASFERENCIAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.TRAN_ID = :IDDOC AND P.TIDO_COD = 13 INTO :CENTRO, :PROY;
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, TRASFERENCIAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.TRAN_ID = :IDDOC AND P.TIDO_COD = 13 INTO :CENTRODES, :PROYDES;
            END
          ELSE
            BEGIN
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.tran_id = :IDDOC INTO :CENTRO, :PROY;
            END
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUMERO, :FECHA, :CONCEPTO, '', 13, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        SUMADES = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                /*PRIMERO LA SALIDA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE POR ARTICULO */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE POR IVA */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE K O POR TERCERO */
        /* EL IVA EN VENTAS */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1; */
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        /*MONTO = MONTO * -1;*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO *-1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* IVA POR ARTICULO */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVAVNT
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1; */
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        /*MONTO = MONTO * -1;*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* IVA POR TARIFA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1;*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                              VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    /*MONTO = MONTO * -1;*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    /*AHORA LA ENTRADA*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    SUMADES = SUMADES + MONTO;
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END /* IVA CONSTANTE */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTACONS
                INTO :CTACONSUMO, :IMPTOS
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* CONSUMO POR ARTICULO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                    FROM ARTICULO A, CONTABIL_ARTICULO C, TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    /*AHORA LA ENTRADA*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                       VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    SUMADES = SUMADES + MONTO;
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END /* CONSUMO CONSTANTE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER AND INIC_CN <> 'N'
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(TRAS_CANT * TRAS_COSTO)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(TRAS_IVAMONTO)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA + MONTO;
                        END
                    ELSE
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE  */
        if ((SUMA <> 0) AND (SUMADES <> 0)) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE    
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if (SUMADES > 0) then
                BEGIN
                DEBITODES = 0;
                CREDITODES = SUMADES;
                END
            ELSE    
                BEGIN
                DEBITODES = SUMADES * -1;
                CREDITODES = 0;
                END
            if ((TOTAL = 'K') or (TOTAL = 'T')) then
                BEGIN
                if (TOTAL = 'T') then
                    BEGIN
                    SELECT TERC_CTAPROV, TERC_PROV
                        FROM TERCEROS WHERE TERC_NIT = :NIT
                        INTO :CTACIERRE, :PROV;
                    if (PROV = 'S') then
                        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                        INTO :CTACIERRE;
                    END
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                /*AHORA LA ENTRADA*/
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITODES, :CREDITODES, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, NULL, 0, 0);
                END
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^


ALTER PROCEDURE CONTABIL_TRASMERC_NIIF (
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable CONCEPTO CHAR(60);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYDES VARCHAR(4);
declare variable CENTRODES VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable DEBITODES NUMERIC(18,2);
declare variable CREDITODES NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable SUMADES NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable NIIFEQ VARCHAR(15);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
NIIFEQ = 'N';
SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_IVAV, N.ININ_CONSUMO, N.ININ_TOTAL, N.ININ_CTABASE, N.ININ_CTAIVA, N.ININ_CTACONSUMO, N.ININ_CTACIERRE,
    ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT, ININ_EQUIVALENCIA
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROY, :centro, :NIIFEQ;
IF (NIIFEQ = 'N') THEN
  begin
    if (EXISTE = 'S') then
        BEGIN
        /* TRAIGA EL ENCABEZADO DE LA SALIDA */
        SELECT PREF_PRE, TRAN_CONC, TERC_NIT, TRAN_IMPTOS, TRAN_ANULADO
            FROM TRASFERENCIAS
            WHERE TRAN_ID = :IDDOC
            INTO :PREFIJO, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    
        if (ANULADO = 'N') then
            BEGIN
            if (CENT = 'B') then
              BEGIN
                SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                    WHERE B.BODE_COD = E.BODE_COD AND E.tran_id = :IDDOC INTO :CENTRO, :PROY;
                SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                    WHERE B.BODE_COD = E.TRAN_BODDES AND E.tran_id = :IDDOC INTO :CENTRODES, :PROYDES;
              END
            ELSE
              if (CENT = 'P') then
                BEGIN
                SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, TRASFERENCIAS E
                    WHERE P.PREF_PRE = E.PREF_PRE AND E.TRAN_ID = :IDDOC AND P.TIDO_COD = 13 INTO :CENTRO, :PROY;
                SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, TRASFERENCIAS E
                    WHERE P.PREF_PRE = E.PREF_PRE AND E.TRAN_ID = :IDDOC AND P.TIDO_COD = 13 INTO :CENTRODES, :PROYDES;
                END
              ELSE
                BEGIN
                SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                    WHERE B.BODE_COD = E.BODE_COD AND E.tran_id = :IDDOC INTO :CENTRO, :PROY;
                END
            NUMITEMS = 100000;
            SUMA = 0;
            SUMADES = 0;
            ERROR = 0;
            /* PRIMERO LA BASE */
            if (BASE = 'A') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT MAX(COAR_CTAINV), SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                    FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                    GROUP BY COAR_CTAINV
                    INTO :CTABASE, :MONTO, :IMPTOS
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if (MONTO <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTABASE, 2);
                            CUENTA = CTABASE;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        /* DEPENDE DEL TIPO DE CUENTA */
                        if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                                INTO :ARTICULO, :MONTO, :IMPTOS
                            DO
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                if (MONTO <> 0) then
                                    BEGIN
                                    /*PRIMERO LA SALIDA*/
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - MONTO;
                                    /*AHORA LA ENTRADA*/
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    SUMADES = SUMADES + MONTO;
                                    NUMITEMS = NUMITEMS + 1;
                                    END
                                END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DE LA BASE */
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - MONTO;
                                    /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                              VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                        END
                    END /* FOR */
                END /* BASE POR ARTICULO */
            if (BASE = 'I') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT MAX(TAIV_CTAINV), SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                    FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                    GROUP BY TAIV_CTAINV
                    INTO :CTABASE, :MONTO, :IMPTOS
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if (MONTO <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTABASE, 2);
                            CUENTA = CTABASE;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        /* DEPENDE DEL TIPO DE CUENTA */
                        if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                                FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                                INTO :ARTICULO, :MONTO, :IMPTOS
                            DO
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                if (MONTO <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - MONTO;
                                    /*AHORA LA ENTRADA*/
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                      VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    SUMADES = SUMADES + MONTO;
                                    NUMITEMS = NUMITEMS + 1;
                                    END
                                END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DE LA BASE */
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - MONTO;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                        END
                    END /* FOR */
                END /* BASE POR IVA */
            if ((BASE = 'K') or (BASE = 'T')) then
                BEGIN
                if (BASE = 'T') then
                    BEGIN
                    SELECT TERC_PROV, TERC_CTAVTANIIF FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                    if (:PROV = 'S') then
                        SELECT PROV_CTACAUSANIIF FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                    END
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                    FROM TRASFERENCIAS_DETALLE
                    WHERE TRAN_ID = :IDDOC
                    INTO :MONTO, :IMPTOS
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    if (MONTO <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTABASE, 2);
                            CUENTA = CTABASE;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        /* DEPENDE DEL TIPO DE CUENTA */
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                                INTO :ARTICULO, :MONTO, :IMPTOS
                            DO
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                if (MONTO <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - MONTO;
                                    /*AHORA LA ENTRADA*/
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                      VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    SUMADES = SUMADES + MONTO;
                                    NUMITEMS = NUMITEMS + 1;
                                    END
                                END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DE LA BASE */
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - MONTO;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                        END
                    END /* FOR */
                END /* BASE K O POR TERCERO */
            /* EL IVA EN VENTAS */
            if (IVAV = 'A') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT MAX(COAR_CTAIVAV), SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                    FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                    GROUP BY COAR_CTAIVAV
                    INTO :CTAIVA, :IMPTOS, :MONTO
                DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTAIVA, 2);
                            CUENTA = CTAIVA;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                                INTO :ARTICULO, :IMPTOS, :MONTO
                            DO
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                /*MONTO = MONTO * -1; */
                                if (IMPTOS <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - IMPTOS;
                                    /*AHORA LA ENTRADA*/
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                      VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    SUMADES = SUMADES + MONTO;
                                    NUMITEMS = NUMITEMS + 1;
                                    END
                                END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1;*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO *-1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                        END
                    END /* FOR */
                END /* IVA POR ARTICULO */
            if (IVAV = 'I') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                    FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                    GROUP BY TAIV_CTAIVAVNT
                    INTO :CTAIVA, :IMPTOS, :MONTO
                DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTAIVA, 2);
                            CUENTA = CTAIVA;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                                FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                                INTO :ARTICULO, :IMPTOS, :MONTO
                            DO
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                /*MONTO = MONTO * -1; */
                                if (IMPTOS <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - IMPTOS;
                                    /*AHORA LA ENTRADA*/
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                      VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    SUMADES = SUMADES + MONTO;
                                    NUMITEMS = NUMITEMS + 1;
                                    END
                                END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1;*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                        END
                    END /* FOR */
                END /* IVA POR TARIFA */
            if (IVAV = 'K') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                    FROM TRASFERENCIAS_DETALLE
                    WHERE TRAN_ID = :IDDOC
                    INTO :IMPTOS, :MONTO;
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                if (IMPINC = 'S') then
                                    MONTO = MONTO - IMPTOS;
                                /*MONTO = MONTO * -1;*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        /*MONTO = MONTO * -1;*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* IVA CONSTANTE */
            /* EL IMPOCONSUMO */
            if (CONSUMO = 'A') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                FOR SELECT MAX(COAR_CTACONS), SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                    FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                    GROUP BY COAR_CTACONS
                    INTO :CTACONSUMO, :IMPTOS
                DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                        if (CUENTA IS NULL) then
                            begin
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTACONSUMO, 2);
                            CUENTA = CTACONSUMO;
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            end
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT E.ARTI_COD, (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                                INTO :ARTICULO, :IMPTOS
                                DO
                                if (IMPTOS <> 0) then
                                    BEGIN
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    NUMITEMS = NUMITEMS + 1;
                                    SUMA = SUMA - IMPTOS;
                                    /*AHORA LA ENTRADA*/
                                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                    SUMADES = SUMADES + MONTO;
                                    NUMITEMS = NUMITEMS + 1;
                                    END
                            END
                        if (TIPOCUEN = 'C') then
                            BEGIN
                            EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                            TIPOCUEN = 'N';
                            ERROR = ERROR + 1;
                            END
                        if (TIPOCUEN = 'N') then
                            BEGIN
                            /* INSERTE EL REGISTRO DE LA BASE */
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                        END
                    END /* FOR */
                END /* CONSUMO POR ARTICULO */
            if (CONSUMO = 'K') then
                BEGIN
                /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
                SELECT SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                    FROM TRASFERENCIAS_DETALLE
                    WHERE TRAN_ID = :IDDOC
                    INTO :IMPTOS;
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CUENTA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* CONSUMO CONSTANTE */
            /* recorra las cuentas adicionales */
            FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
                FROM INTERFAZ_INVENTARIO_CTAS
                WHERE ININ_ID = :IDINTER AND INIC_CN <> 'C'
                INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
                DO
                BEGIN
                if (VALORADIC <> 0) then
                    MONTO = VALORADIC;
                ELSE
                    BEGIN
                    if (:BASEADIC = 'SUBTOTAL') then
                        SELECT SUM(TRAS_CANT * TRAS_COSTO)
                        FROM TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC
                        INTO :VALORADIC;
                    if (:BASEADIC = 'IVA') then
                        SELECT SUM(TRAS_IVAMONTO)
                        FROM TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC
                        INTO :VALORADIC;
                    if (:BASEADIC = 'CONSUMO') then
                        SELECT SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                        FROM TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC
                        INTO :VALORADIC;
                    MONTO = VALORADIC * PORCADIC / 100;
                    END
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTAADIC, 2);
                        CUENTA = CUENTAADIC;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        if (DBADIC = 'S') then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            SUMA = SUMA + MONTO;
                            END
                        ELSE
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            SUMA = SUMA - MONTO;
                            END
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END
            /* CIERRE EL COMPROBANTE  */
            if ((SUMA <> 0) AND (SUMADES <> 0)) then
                BEGIN
                if (SUMA > 0) then
                    BEGIN
                    DEBITO = 0;
                    CREDITO = SUMA;
                    END
                ELSE    
                    BEGIN
                    DEBITO = SUMA * -1;
                    CREDITO = 0;
                    END
                if (SUMADES > 0) then
                    BEGIN
                    DEBITODES = 0;
                    CREDITODES = SUMADES;
                    END
                ELSE    
                    BEGIN
                    DEBITODES = SUMADES * -1;
                    CREDITODES = 0;
                    END
                if ((TOTAL = 'K') or (TOTAL = 'T')) then
                    BEGIN
                    if (TOTAL = 'T') then
                        BEGIN
                        SELECT TERC_CTAPROV, TERC_PROV
                            FROM TERCEROS WHERE TERC_NIT = :NIT
                            INTO :CTACIERRE, :PROV;
                        if (PROV = 'S') then
                            SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                            INTO :CTACIERRE;
                        END
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTACIERRE, 2);
                        CUENTA = CTACIERRE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    /*AHORA LA ENTRADA*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITODES, :CREDITODES, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, NULL, 0, 0);
                    END
                END /* SUMA */
            if (ERROR > 0) then
                VER = 'S';
            SUSPEND;
            END /* NO ANULADO */
        END /* EXISTE LA INTERFAZ */
    ELSE
        BEGIN
        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :PREFIJO, 1);
        ERROR = ERROR + 1;
        VER = 'S';
        SUSPEND;
        END
  end
else
  begin
  --VER = 'N';
  SUSPEND;
  end
END^


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


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


ALTER PROCEDURE CONTABILICE_EQUIVALENCIA_NIIF (
    IDC INTEGER,
    BORRAR CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    ESTADO CHAR(20))
AS
declare variable ITEM INTEGER;
declare variable CTANIIF VARCHAR(20);
declare variable AFECTABLE CHAR(1);
begin
if (BORRAR = 'S') then
    DELETE FROM comprobante_detalle_niif WHERE ENCO_CONSEC = :IDC;
ESTADO = 'OK';
FOR SELECT CODE_ITEM, CUEN_COD FROM comprobante_detalle WHERE ENCO_CONSEC = :IDC ORDER BY CODE_ITEM
    INTO :ITEM, :CUENTA
    DO
    BEGIN
    if (ESTADO = 'OK') then
        BEGIN
        SELECT cuen_eqniif FROM CUENTAS WHERE CUEN_COD = :CUENTA INTO :ctaniif;
        if ((CTANIIF IS NULL) or (CTANIIF = '')) then
            ESTADO = 'SIN EQUIVALENCIA';
        ELSE
            BEGIN
            if (EXISTS (SELECT CUEN_NOM FROM cuentas_niif WHERE CUEN_COD = :ctaniif)) then
                BEGIN
                EXECUTE PROCEDURE es_afectable_niif(CTANIIF) returning_values (AFECTABLE);
                if (AFECTABLE = 'S') then
                    BEGIN
                    INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
                        SELECT ENCO_CONSEC, CODE_ITEM, :CTANIIF, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE
                        FROM comprobante_detalle WHERE ENCO_CONSEC = :IDC and CODE_ITEM = :ITEM;
                    END
                ELSE
                    ESTADO = 'CUENTA NO AFECTABLE';
                END
            else
                ESTADO = 'CUENTA NO EXISTE';
            END
        END
    if (ESTADO <> 'OK') then
        SUSPEND;
    END
if (ESTADO = 'OK') then
    SUSPEND;
end^


ALTER PROCEDURE CONTABILIZA_PENDIENTE (
    IDCNT INTEGER)
AS
declare variable idc integer;
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
declare variable ANULADO CHAR(1);
declare variable ITEMS INTEGER;
declare variable FECCNT CHAR(8);
declare variable ANONIIF CHAR(4);
declare variable NIIFEQ CHAR(13);
BEGIN
SELECT CNTB_TIPOREF, CNTB_IDREF, CNTB_FECHA FROM contabilizacion WHERE CNTB_ID = :IDCNT INTO :TIPO, :IDDOC, :FECCNT;
if (TIPO = 0) then
  begin
  select count(cntb_id) from contabilizacion_det where cntb_id = :idcnt into :items;
  if (ITEMS > 0) then
    ANULADO = 'N';
  else
    ANULADO = 'S';
  end
if (TIPO = 10) then
    SELECT CACO_ANULADO FROM cambio_costo WHERE CACO_ID = :IDDOC INTO :ANULADO;
if (TIPO = 11) then
    SELECT ENTR_ANULADO FROM ENTRADAS WHERE ENTR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 12) then
    SELECT SALI_ANULADO FROM SALIDAS WHERE SALI_ID = :IDDOC INTO :ANULADO;
if (TIPO = 13) then
    SELECT TRAN_ANULADO FROM trasferencias WHERE TRAN_ID = :IDDOC INTO :ANULADO;
if (TIPO = 14) then
    SELECT AJUS_ANULADO FROM ajustes WHERE AJUS_ID = :IDDOC INTO :ANULADO;
if (TIPO = 15) then
    SELECT ENSA_ANULADO FROM ensambles WHERE ENSA_ID = :IDDOC INTO :ANULADO;
if (TIPO = 16) then
    SELECT DESE_ANULADO FROM desensambles WHERE DESE_ID = :IDDOC INTO :ANULADO;
if (TIPO = 21) then
    SELECT FACO_ANULADO FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :ANULADO;
if (TIPO = 22) then
    SELECT REPR_ANULADO FROM remision_proveedor WHERE REPR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 24) then
    SELECT DVCO_ANULADO FROM devoluciones_compras WHERE DVCO_ID = :IDDOC INTO :ANULADO;
if (TIPO = 30) then
    ANULADO = 'N';
if (TIPO = 31) then
    SELECT FACT_ANULADO FROM FACTURAS WHERE FACT_ID = :IDDOC INTO :ANULADO;
if (TIPO = 32) then
    SELECT REVT_ANULADO FROM remisiones_venta WHERE REVT_ID = :IDDOC INTO :ANULADO;
if (TIPO = 33) then
    SELECT DEVT_ANULADO FROM devoluciones_ventas WHERE DEVT_ID = :IDDOC INTO :ANULADO;
if (TIPO = 37) then
    SELECT RUTE_ANULADO FROM rutero WHERE RUTE_ID = :IDDOC INTO :ANULADO;
if (TIPO = 41) then
    SELECT NDCL_ANULADO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :IDDOC INTO :ANULADO;
if (TIPO = 42) then
    SELECT NCCL_ANULADO FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :IDDOC INTO :ANULADO;
if (TIPO = 43) then
    SELECT APCL_ANULADO FROM aplicacion_cliente WHERE APCL_ID = :IDDOC INTO :ANULADO;
if (TIPO = 45) then
    SELECT ANCL_ANULADO FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :IDDOC INTO :ANULADO;
if (TIPO = 77) then
    SELECT DVCH_ANULADO FROM devolucion_cheques WHERE DVCH_ID = :IDDOC INTO :ANULADO;
if (TIPO = 51) then
    SELECT NDPR_ANULADO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 52) then
    SELECT NCPR_ANULADO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 53) then
    SELECT APPR_ANULADO FROM aplicacion_provedor WHERE APPR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 55) then
    SELECT ANPR_ANULADO FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 61) then
    SELECT RECA_ANULADO FROM recibos_caja WHERE RECA_ID = :IDDOC INTO :ANULADO;
if (TIPO = 62) then
    SELECT EGRE_ANULADO FROM EGRESOS WHERE EGRE_ID = :IDDOC INTO :ANULADO;
if (TIPO = 64) then
    SELECT COTJ_ANULADO FROM consigna_tarjetas WHERE COTJ_ID = :IDDOC INTO :ANULADO;
if (TIPO = 65) then
    SELECT RCPR_ANULADO FROM recibo_provisional WHERE RCPR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 66) then
    SELECT TRCJ_ANULADO FROM traslados_caja WHERE TRCJ_ID = :IDDOC INTO :ANULADO;
if (TIPO = 71) then
    SELECT CONS_ANULADO FROM CONSIGNA WHERE CONS_ID = :IDDOC INTO :ANULADO;
if (TIPO = 72) then
    SELECT CHEQ_ANULADO FROM CHEQUES WHERE CHEQ_ID = :IDDOC INTO :ANULADO;
if (TIPO = 73) then
    SELECT RETI_ANULADO FROM RETIROS WHERE RETI_ID = :IDDOC INTO :ANULADO;
if (TIPO = 74) then
    SELECT NDBC_ANULADO FROM notas_debito WHERE NDBC_ID = :IDDOC INTO :ANULADO;
if (TIPO = 75) then
    SELECT NCBC_ANULADO FROM notas_credito WHERE NCBC_ID = :IDDOC INTO :ANULADO;
if (TIPO = 76) then
    SELECT TRAS_ANULADO FROM traslados WHERE TRAS_ID = :IDDOC INTO :ANULADO;
if (TIPO = 77) then
    SELECT DVCH_ANULADO FROM devolucion_cheques WHERE DVCH_ID = :IDDOC INTO :ANULADO;
if (TIPO = 85) then
    SELECT CGRM_ANULADO FROM carga_remesa WHERE CGRM_ID = :IDDOC INTO :ANULADO;
if (TIPO = 88) then
    SELECT PLPA_ANULADO FROM planilla_pasajeros WHERE PLPA_ID = :IDDOC INTO :ANULADO;
if (TIPO = 89) then
    SELECT MANC_ANULADO FROM manifiesto_carga WHERE MANC_ID = :IDDOC INTO :ANULADO;
if (TIPO = 92) then
    if (exists (select nomi_id from nomina where nomi_id = :IDDOC)) then
        ANULADO = 'N';
    else
        ANULADO = 'S';
if ((TIPO = 137) or (TIPO = 132))  then
    SELECT FAPO_ANULADO FROM factura_proforma WHERE FAPO_ID = :IDDOC INTO :ANULADO;
if (TIPO = 182) then
    SELECT liqr_anulado FROM liquidacion_ruta_colegio WHERE LIQR_ID = :IDDOC INTO :ANULADO;

if (ANULADO = 'N') then
  BEGIN
  /* PASA DE CONTABILIZACION A COMPROBANTES */
  /* EL ENCABEZADO */
  IDC = NULL;
  if (tipo <> 0) then
      SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = :TIPO AND ENCO_IDREF = :IDDOC into :IDC;
  if (IDC IS NULL) then
    BEGIN
    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;
    END
  EXECUTE PROCEDURE lee_configuracion ('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE APERTURA NIIF') returning_values (:ANONIIF);
  /* REMIENDO PARA NOMINA MIENTRAS SE AGRGAN CUENTAS DE NIIF A CONCEPTOS */
  if ((SUBSTRING(FECCNT FROM 1 FOR 4) <= :ANONIIF) or (TIPO = 92)) then
      update comprobante_encabezado SET ENCO_REPNIIF = 'S' WHERE ENCO_CONSEC = :IDC;
  ELSE
      update comprobante_encabezado SET ENCO_REPNIIF = 'N' WHERE ENCO_CONSEC = :IDC;
  /* LOS DETALLES */
  INSERT INTO COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
    SELECT :IDC, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_CONC, CNDE_REF, CNDE_CONCOD, CNDE_BASE, CNDE_PORC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_DOCTIPON, CNDE_DOCNUMERO, CNDE_DOCTIPOA, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO
        FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDCNT AND CNDE_ITEM < 100000;

  /* SOLO SI NIIF SE GENERA POR INTERFAZ */
  EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'GENERAR COMPROBANTES DE NIIF POR INTERFAZ O EQUIVALENCIAS') RETURNING_VALUES (:niifeq);
  IF (NIIFEQ = 'INTERFAZ') THEN
    begin
    INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
        SELECT :IDC, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_CONC, CNDE_REF, CNDE_CONCOD, CNDE_BASE, CNDE_PORC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_DOCTIPON, CNDE_DOCNUMERO, CNDE_DOCTIPOA, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO
            FROM CONTABILIZACION_DET WHERE CNTB_ID = :idcnt AND CNDE_ITEM >= 100000;
    UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDC;
    end
  UPDATE CONTABILIZACION SET CNTB_PROCESADO = 'S'
    WHERE CNTB_ID = :IDCNT;
  END
END^


ALTER PROCEDURE CONTABILIZA_PENDIENTE_NIIF (
    IDCNT INTEGER)
AS
declare variable idc integer;
BEGIN
IDC = 0;
SELECT ENCO_CONSEC FROM comprobante_encabezado E, CONTABILIZACION C
    WHERE ENCO_TIPOREF = C.cntb_tiporef AND ENCO_IDREF = C.cntb_idref AND C.cntb_id = :idcnt INTO :IDC;
if (IDC <> 0) then
    BEGIN
    /* PASA DE CONTABILIZACION A COMPROBANTES */
    INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
        SELECT :IDC, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_CONC, CNDE_REF, CNDE_CONCOD, CNDE_BASE, CNDE_PORC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_DOCTIPON, CNDE_DOCNUMERO, CNDE_DOCTIPOA, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO
        FROM CONTABILIZACION_DET WHERE CNTB_ID = :idcnt AND CNDE_ITEM >= 100000;
    UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDC;
    END
END^


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^


ALTER PROCEDURE CONTADO_COSTOS (
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta WHERE PREF_PRE = :PREF ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_costos_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_costos(idf,  IDIN) returning_values (ERROR, VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
       END
    FECHA = FECHA + 1;
    END
end^


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


ALTER PROCEDURE CONTADO_MVERDE_NIT (
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta WHERE PREF_PRE = :PREF and PTVT_ACTIVO = 'S'
        ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado_nit (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^


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^


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


ALTER PROCEDURE COPIA_CUENTAS_NIIF
AS
begin
INSERT INTO CUENTAS_NIIF (CUEN_COD, CUEN_NOM, CUEN_TERCERO, CUEN_CENTRO, CUEN_RETENCION, CUEN_BASEMIN, CUEN_PORC, CUEN_TIPO, CUEN_ACTIVA, CUEN_AFECTABLE)
    SELECT CUEN_COD, CUEN_NOM, CUEN_TERCERO, CUEN_CENTRO, CUEN_RETENCION, CUEN_BASEMIN, CUEN_PORC, CUEN_TIPO, CUEN_ACTIVA, CUEN_AFECTABLE FROM CUENTAS C
    WHERE C.CUEN_ACTIVA = 'S' order by cuen_cod;
UPDATE CUENTAS SET CUEN_EQNIIF = CUEN_COD WHERE CUEN_EQNIIF IS NULL;
end^


ALTER PROCEDURE COPIA_INTERFAZ_BANCOS (
    TIPO INTEGER)
AS
declare variable NUMROWS INTEGER;
declare variable CTA INTEGER;
declare variable CTAORI INTEGER;
declare variable PREF VARCHAR(4);
begin
SELECT COUNT(*) FROM INTERFAZ_BANCOS WHERE TIDO_COD = :TIPO INTO :NUMROWS;
if (NUMROWS = 1) then
    begin
    SELECT MAX(CUBA_COD) FROM INTERFAZ_BANCOS WHERE TIDO_COD = :TIPO INTO :CTAORI;
    FOR SELECT CUBA_COD, PRBA_PREF FROM PREFIJOS_BANCOS WHERE CUBA_COD <> :CTAORI ORDER BY CUBA_COD into :CTA, :PREF DO
        BEGIN
        if (CTA <> CTAORI) then
            INSERT INTO interfaz_bancos (INBA_ID, TIDO_COD, PREF_PRE, INBA_NOMBRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_CTABCO, INBA_CTAGMF, INBA_CTABASE, TICO_COD, PRCO_PRE, INBA_CONFIRMAR, INBA_BASE, CUBA_COD)
                SELECT GEN_ID(id_interbanco, 1), :TIPO, :PREF, INBA_NOMBRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_CTABCO, INBA_CTAGMF, INBA_CTABASE, TICO_COD, PRCO_PRE, INBA_CONFIRMAR, INBA_BASE, :CTA
                    FROM INTERFAZ_BANCOS WHERE CUBA_COD = :CTA;
        END
    END
end^


ALTER PROCEDURE COPIA_LISTA_PRECIOS (
    ORIGEN INTEGER,
    DESTINO INTEGER)
AS
begin
delete from lista_precios where LIPR_COD = :DESTINO;
INSERT INTO lista_precios (LIPR_COD, LIPR_NOM, LIPR_COMI, LIPR_DIASMAX, LIPR_FECINI, LIPR_FECFIN, LIPR_MARGEN, LIPR_UTIL, LIPR_COMIMONTO, LIPR_MODIF, SUCU_ID, LIPR_AUTO, LIPR_DIASEM, LIPR_HORAINI, LIPR_HORAFIN, LIPR_DSCTO, LIPR_PREDET)
    SELECT :DESTINO, CAST(:DESTINO AS VARCHAR(30)), LIPR_COMI, LIPR_DIASMAX, LIPR_FECINI, LIPR_FECFIN, LIPR_MARGEN, LIPR_UTIL, LIPR_COMIMONTO, LIPR_MODIF, SUCU_ID, LIPR_AUTO, LIPR_DIASEM, LIPR_HORAINI, LIPR_HORAFIN, LIPR_DSCTO, 'N'
        FROM LISTA_PRECIOS WHERE LIPR_COD = :ORIGEN;

delete from precios_articulo WHERE LIPR_COD = :DESTINO;
INSERT INTO PRECIOS_ARTICULO (LIPR_COD, ARTI_COD, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, PRAR_AUTO, PRAR_CONSUMO, PRAR_COMI, PRAR_COMIMONTO, PRAR_CANTMIN)
    SELECT :DESTINO, ARTI_COD, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, PRAR_AUTO, PRAR_CONSUMO, PRAR_COMI, PRAR_COMIMONTO, PRAR_CANTMIN
        FROM PRECIOS_ARTICULO WHERE LIPR_COD = :ORIGEN;
end^


ALTER PROCEDURE COPIA_SALDOS_NIIF (
    ANO CHAR(4),
    MES INTEGER,
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20))
RETURNS (
    CODIGO VARCHAR(20),
    NIT VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    SALDO NUMERIC(18,2),
    CUENTANIIF VARCHAR(20))
AS
declare variable ANOINI CHAR(4);
declare variable CTAANT VARCHAR(20);
declare variable ITEM INTEGER;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
BEGIN
CTAANT = '';
item = 0;
FOR SELECT CUEN_COD, CUEN_EQNIIF FROM CUENTAS WHERE CUEN_ACTIVA = 'S' AND CUEN_AFECTABLE = 'S'
    AND CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN order by CUEN_COD
    INTO CODIGO, CUENTANIIF
DO
  BEGIN
  FOR SELECT PROY_COD, CENT_COD FROM centros C WHERE EXISTS (SELECT SACU_FECHA from SALDOS_CENTROS WHERE CUEN_COD = :codigo AND PROY_COD = C.proy_cod
    AND CENT_COD = C.cent_cod)
    INTO :proy, :centro
    DO
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (:ANOINI);
    if (ANO > ANOINI) then
        FOR SELECT CODIGO, FINAL FROM balance_centro_tercero_mes(:CODIGO, :proy,  :centro, :ano, :mes)
            INTO :NIT, :SALDO
            DO
            BEGIN
            if (SALDO <> 0)  then
                BEGIN
                if (CTAANT <> CODIGO) then
                    BEGIN
                    insert into APERTURA_NIIF (CUEN_COD, APNI_SALDOANT, APNI_AJUSTEDB, APNI_AJUSTECR, APNI_SALDONIIF, APNI_CUENNIIF)
                        values (:codigo, :saldo, 0, 0, :saldo, :cuentaniif);
                    ITEM = 0;
                    END
                ITEM = ITEM + 1;
                if (SALDO > 0) then
                    BEGIN
                    DEBITO = 0;
                    CREDITO = saldo;
                    END
                ELSE
                    BEGIN
                    DEBITO = SALDO * -1;
                    CREDITO = 0;
                    END
                insert into APERTURA_NIIF_DET (CUEN_COD, APND_ITEM, APND_CUENTA, APND_SALDOINI, APND_DEBITO, APND_CREDITO, APND_SALDOFIN,
                    APND_CTANIIF, APND_RECLDB, APND_RECLCR, TERC_NIT, PROY_COD, CENT_COD)
                    values (:codigo, :ITEM, :codigo, :saldo, 0, 0, 0, '', :debito, :credito, :NIT, :proy, :centro);
                SUSPEND;
                ITEM = ITEM + 1;
                insert into APERTURA_NIIF_DET (CUEN_COD, APND_ITEM, APND_CUENTA, APND_SALDOINI, APND_DEBITO, APND_CREDITO, APND_SALDOFIN,
                    APND_CTANIIF, APND_RECLDB, APND_RECLCR, TERC_NIT, PROY_COD, CENT_COD)
                    values (:codigo, :ITEM, '', 0, :saldo, 0, 0, :cuentaniif, :credito, :debito, :NIT, :proy, :centro);
                CTAANT = CODIGO;
                END
            END
    END
  END
END^


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^


ALTER PROCEDURE CORTE_CXPAGAR (
    FECHA DATE)
RETURNS (
    TIPO INTEGER,
    IDDOC INTEGER,
    FECDOC DATE,
    NIT VARCHAR(20))
AS
declare variable IDM INTEGER;
declare variable IDR INTEGER;
declare variable SALDO 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 RTCRE NUMERIC(18,2);
begin
FOR SELECT M.mvpr_id, M.mvpr_tiporef, M.mvpr_idref, M.mvpr_fecha, M.terc_nit
    FROM movimiento_proveedor M WHERE M.mvpr_abono = 'N' and MVPR_FECHA < :FECHA
    INTO :IDM, :TIPO, :IDDOC, :FECDOC, :NIT
    DO
    BEGIN
    /* SI EL SALDO ES CERO PUEDE BORRAR EL DOCUMENTO Y SUS ABONOS */
    EXECUTE PROCEDURE saldo_doc_cxpagar(:TIPO, :IDDOC, :FECHA, 0) returning_values (:SALDO);
    if (SALDO = 0) then
        BEGIN
        FOR SELECT D.egre_id, D.egde_abono+D.egde_dtof-D.egde_difcambio, D.egde_rtfte, D.egde_rtiva, D.egde_rtica, D.egde_rcree
            FROM egresos_detalle D, egresos R
            WHERE R.egre_id = D.egre_id AND D.egde_tipodoc = :TIPO AND D.egde_iddoc = :iddoc AND D.egde_anulado = 'N'
            AND R.egre_fecha < :fecha
            INTO :IDR, :ABONO, :rtfte, :rtiva, :rtica, :rtcre
            DO
            BEGIN
            UPDATE movimiento_proveedor
                SET MVPR_MONTO = MVPR_MONTO - :abono,
                    MVPR_RTFTE = MVPR_RTFTE - :rtfte,
                    MVPR_RTIVA = MVPR_RTIVA - :rtiva,
                    MVPR_RTICA = MVPR_RTICA - :rtica,
                    MVPR_RCREE = MVPR_RCREE - :rtcre
                WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :IDR;
            END
        FOR SELECT D.appr_id, D.appd_aplicado+D.appd_difcambio, D.appd_rtfte, D.appd_rtiva, D.appd_rtica, D.appd_rcree
            FROM aplicacion_proveedor_detalle D, aplicacion_provedor R
            WHERE R.appr_id = D.appr_id AND D.appd_tipodoc = :TIPO AND D.appd_iddoc = :iddoc AND D.appd_anulado = 'N'
            AND R.appr_fecha < :fecha
            INTO :IDR, :ABONO, :rtfte, :rtiva, :rtica, :rtcre
            DO
            BEGIN
            UPDATE movimiento_proveedor
                SET MVPR_MONTO = MVPR_MONTO - :abono,
                    MVPR_RTFTE = MVPR_RTFTE - :rtfte,
                    MVPR_RTIVA = MVPR_RTIVA - :rtiva,
                    MVPR_RTICA = MVPR_RTICA - :rtica,
                    MVPR_RCREE = MVPR_RCREE - :rtcre
                WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = :IDR;
            END
        FOR SELECT D.reca_id, D.rccr_abono+D.rccr_dtof+D.rccr_difcambio, D.rccr_rtfte, D.rccr_rtiva, D.rccr_rtica, D.rccr_rcree
            FROM recibos_caja_crucec D, recibos_caja R
            WHERE R.reca_id = D.reca_id AND D.rccr_tipodoc = :TIPO AND D.rccr_iddoc = :iddoc AND D.rccr_anulado = 'N'
            AND R.reca_fecha < :fecha
            INTO :IDR, :ABONO, :rtfte, :rtiva, :rtica, :rtcre
            DO
            BEGIN
            UPDATE movimiento_proveedor
                SET MVPR_MONTO = MVPR_MONTO - :abono,
                    MVPR_RTFTE = MVPR_RTFTE - :rtfte,
                    MVPR_RTIVA = MVPR_RTIVA - :rtiva,
                    MVPR_RTICA = MVPR_RTICA - :rtica,
                    MVPR_RCREE = MVPR_RCREE - :rtcre
                WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = :IDR;
            END
        DELETE FROM movimiento_proveedor WHERE MVPR_ID = :IDM;
        END

    suspend;
    END
end^


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


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(T.coar_ctacos), MAX(T.coar_ctainv)
        FROM FACTURAS F, FACTURAS_DETALLE D, contabil_articulo T
        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = T.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
        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^


ALTER PROCEDURE COSTO_EN_VENTAS_CONTADO_NIT (
    FECFAC DATE,
    PREF VARCHAR(4),
    PTVTA INTEGER,
    NIT VARCHAR(20))
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(TAIV_CTACOSTO), MAX(TAIV_CTAINV)
        FROM FACTURAS F, FACTURAS_DETALLE D, TARIFA_IVA T
        WHERE F.FACT_ID = D.FACT_ID AND D.fade_tiva = T.taiv_cod AND FACT_ANULADO = 'N' AND FACT_FECHA = :FECFAC AND
        F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND TERC_NIT = :NIT
        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^


ALTER PROCEDURE COSTO_EN_VENTAS_NIIF (
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
declare variable ITEM INTEGER;
BEGIN
DELETE FROM COSTO_VENTAS_NIIF WHERE TIDO_COD = :TIPO AND COVE_ID = :ID;
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, FACT_FECHA, fade_item
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N' AND FADE_CANT <> 0
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM contabil_articulo_niif WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_SALP / COST_SALC FROM costos_niif 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_niif 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_niif(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO costo_ventas_niif (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, RVDE_ITEM
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N' AND RVDE_CANT <> 0
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_SALP / COST_SALC FROM costos_niif 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_niif 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_niif(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO costo_ventas_niif (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, DVDE_ITEM
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N' AND DVDE_CANT <> 0
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM costos_niif 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_niif 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_niif(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO costo_ventas_niif (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    END
END^


ALTER PROCEDURE COSTO_NIIF_PROM_Y_ULT_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_NIIF
    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^


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^


ALTER PROCEDURE COSTO_PROMEDIO_NIIF (
    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_NIIF
    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^


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^


ALTER PROCEDURE COSTO_PROMEDIO_UNIDAD_NIIF (
    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_NIIF(ARTICULO, FECHA) returning_values (COSTO);
  EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(ARTICULO, UNIDAD) returning_values (FACTOR);
  COSTO = COSTO * FACTOR;
  SUSPEND;
END^


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^


ALTER PROCEDURE COSTO_PROMEDIO_Y_ULTIMO_NIIF (
    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_NIIF
    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^


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^


ALTER PROCEDURE COSTO_PROVEEDOR (
    NIT VARCHAR(20),
    ARTI VARCHAR(15),
    UNI VARCHAR(8),
    FECHA DATE)
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable UNIDAD VARCHAR(8);
declare variable TRM NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
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, PVAR_TRM, PVAR_UNIDAD, PVAR_FACTOR FROM PROVEEDOR_ARTICULO
    WHERE TERC_NIT = :Nit AND ARTI_COD = :ARTI
    INTO :COSTO, :TRM, :UNIDAD, :FACTOR;
if (TRM <> 0) then
    COSTO = COSTO / TRM;
if ((UNIDAD <> UNI) AND (FACTOR <> 0)) then
    BEGIN
    COSTO = COSTO / FACTOR;
    EXECUTE PROCEDURE factor_unidad_cant (:ARTI, :UNI) returning_values (:FACTOR);
    COSTO = COSTO * FACTOR;
    END
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);
    EXECUTE PROCEDURE factor_unidad_cant (:ARTI, :UNI) returning_values (:FACTOR);
    COSTO = COSTO * FACTOR;
    END
SUSPEND;
END^


ALTER PROCEDURE COSTO_VENTAS_ARTICULO (
    ARTICULO VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANTDET NUMERIC(18,2);
declare variable COSTOUNIT NUMERIC(18,2);
declare variable FECHA DATE;
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 = :AGENCIA) or (:AGENCIA = 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 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);
    if (costounit IS NULL) then
        costounit = 0;
    COSTO = COSTO + costounit * cantdet;
    END
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 = :AGENCIA) or (:AGENCIA = 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 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);
    if (costounit IS NULL) then
        costounit = 0;
    COSTO = COSTO - (costounit * cantdet);
    END
suspend;
end^


ALTER PROCEDURE COSTO_VENTAS_CLIENTE (
    CLIENTE VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable COSTOUNIT NUMERIC(18,2);
begin
COSTO = 0;
FOR SELECT FACT_ID FROM FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND TERC_NIT = :CLIENTE AND
    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
    INTO :id
    DO
    BEGIN
    EXECUTE PROCEDURE costo_en_ventas(31, :ID);
    SELECT SUM(COSTO*CANT) FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID INTO :costounit;
    COSTO = COSTO + COSTOUNIT;
    END
FOR SELECT DEVT_ID FROM devoluciones_ventas F, PREFIJOS P
    WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND TERC_NIT = :CLIENTE AND
    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
    INTO :id
    DO
    BEGIN
    EXECUTE PROCEDURE costo_en_ventas(33, :ID);
    SELECT SUM(COSTO*CANT) FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID INTO :costounit;
    COSTO = COSTO - COSTOUNIT;
    END
suspend;
end^


ALTER PROCEDURE COSTO_VENTAS_FECHA (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable COSTOUNIT NUMERIC(18,2);
begin
COSTO = 0;
FOR SELECT FACT_ID FROM FACTURAS F, PREFIJOS P
    WHERE 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 :id
    DO
    BEGIN
    EXECUTE PROCEDURE costo_en_ventas(31, :ID);
    SELECT SUM(COSTO*CANT) FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID INTO :costounit;
    COSTO = COSTO + COSTOUNIT;
    END
FOR SELECT DEVT_ID FROM devoluciones_ventas F, PREFIJOS P
    WHERE 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 :id
    DO
    BEGIN
    EXECUTE PROCEDURE costo_en_ventas(33, :ID);
    SELECT SUM(COSTO*CANT) FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID INTO :costounit;
    COSTO = COSTO - COSTOUNIT;
    END
suspend;
end^


ALTER PROCEDURE COSTO_VENTAS_FECHAS (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable COSTOUNIT NUMERIC(18,2);
begin
COSTO = 0;
FOR SELECT FACT_ID 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 = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
    INTO :id
    DO
    BEGIN
    EXECUTE PROCEDURE costo_en_ventas(31, :ID);
    SELECT SUM(COSTO*CANT) FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID INTO :costounit;
    COSTO = COSTO + COSTOUNIT;
    END
FOR SELECT DEVT_ID FROM devoluciones_ventas F, PREFIJOS P
    WHERE 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 = :AGENCIA) or (:AGENCIA = 0))
    INTO :id
    DO
    BEGIN
    EXECUTE PROCEDURE costo_en_ventas(33, :ID);
    SELECT SUM(COSTO*CANT) FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID INTO :costounit;
    COSTO = COSTO - COSTOUNIT;
    END
suspend;
end^


ALTER PROCEDURE COSTO_VENTAS_ITEM (
    TIPO INTEGER,
    ID INTEGER,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    COSTOPROM NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2))
AS
declare variable FACCOST NUMERIC(18,4);
begin
if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
    SELECT first 1 COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = :TIPO AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM
        INTO :costoprom, :ultcosto;
else
    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costoprom, :ultcosto);
if (costoprom IS NULL) then
    costoprom = 0;
if (ultcosto IS NULL) then
    ultcosto = 0;
FACCOST = 1;
SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
if (faccost IS NULL) then
    FACCOST = 1;
ultcosto = ultcosto * FACCOST;
costoprom = costoprom * FACCOST;
suspend;
end^


ALTER PROCEDURE COSTO_VENTAS_PUNTO (
    PUNTO INTEGER,
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable COSTOUNIT NUMERIC(18,2);
begin
COSTO = 0;
FOR SELECT FACT_ID FROM FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PTVT_ID = :punto AND
    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
    INTO :id
    DO
    BEGIN
    EXECUTE PROCEDURE costo_en_ventas(31, :ID);
    SELECT SUM(COSTO*CANT) FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID INTO :costounit;
    COSTO = COSTO + COSTOUNIT;
    END
FOR SELECT DEVT_ID FROM devoluciones_ventas F, PREFIJOS P
    WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND PTVT_ID = :punto AND
    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
    INTO :id
    DO
    BEGIN
    EXECUTE PROCEDURE costo_en_ventas(33, :ID);
    SELECT SUM(COSTO*CANT) FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID INTO :costounit;
    COSTO = COSTO - COSTOUNIT;
    END
suspend;
end^


ALTER PROCEDURE COSTO_VENTAS_VENDEDOR (
    VENDEDOR INTEGER,
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    COSTO NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable COSTOUNIT NUMERIC(18,2);
begin
COSTO = 0;
FOR SELECT FACT_ID FROM FACTURAS F, PREFIJOS P
    WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :vendedor AND
    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
    INTO :id
    DO
    BEGIN
    EXECUTE PROCEDURE costo_en_ventas(31, :ID);
    SELECT SUM(COSTO*CANT) FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID INTO :costounit;
    COSTO = COSTO + COSTOUNIT;
    END
FOR SELECT DEVT_ID FROM devoluciones_ventas F, PREFIJOS P
    WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :vendedor AND
    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
    INTO :id
    DO
    BEGIN
    EXECUTE PROCEDURE costo_en_ventas(33, :ID);
    SELECT SUM(COSTO*CANT) FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID INTO :costounit;
    COSTO = COSTO - COSTOUNIT;
    END
suspend;
end^


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


ALTER PROCEDURE CREA_BARRAS (
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15))
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIP VARCHAR(60),
    UNIDAD VARCHAR(8),
    BARRAS VARCHAR(15))
AS
begin
update barras_articulo b set b.coba_activo = 'N';
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD FROM ARTICULO A WHERE ARTI_COD >= :artini AND ARTI_COD <= :artfin AND
    NOT EXISTS (SELECT COBA_COD FROM barras_articulo WHERE ARTI_COD = A.arti_cod and coba_activo = 'S')
    INTO :articulo, :descrip, :unidad
    DO
    BEGIN
    EXECUTE PROCEDURE codigo_barras(:articulo) returning_values (BARRAS);
    insert into BARRAS_ARTICULO (ARTI_COD, COBA_COD, COBA_DES, COBA_UNIDAD, COBA_ACTIVO)
        values (:articulo, :barras, :descrip, :unidad, 'S');
    suspend;
    END
end^


ALTER PROCEDURE CREAR_CLIENTE (
    NIT VARCHAR(20),
    TIPOID CHAR(1),
    RAZONSOCIAL VARCHAR(60),
    APELLIDO1 VARCHAR(60),
    APELLIDO2 VARCHAR(60),
    NOMBRE1 VARCHAR(60),
    NOMBRE2 VARCHAR(60),
    DIR VARCHAR(60),
    CIUDAD VARCHAR(40),
    TEL VARCHAR(40),
    CEL VARCHAR(25),
    FAX VARCHAR(25),
    EMAIL VARCHAR(100),
    CONTACTO VARCHAR(255),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ZONA VARCHAR(2))
AS
declare variable VEND integer;
declare variable DV char(1);
begin
    SELECT VEND_COD FROM USUARIO WHERE USER_COD = USER INTO :VEND;
    EXECUTE PROCEDURE DV(:NIT) returning_values (:DV);
    if ((razonsocial = '') or (razonsocial is null)) then
        razonsocial = :nombre1||' '||:nombre2||' '||apellido1||' '||apellido2;
    /*GRABE EL TERCERO*/
    INSERT INTO TERCEROS (TERC_NIT, TERC_DV, TERC_TIPOID, TERC_NOM, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1,
    TERC_NOMBRE2, TERC_DIR, CIUD_COD, TERC_TEL, TERC_CEL, TERC_FAX, TERC_EMAIL, TERC_CONTACTO, TERC_OBS, TERC_CLIE)
    VALUES (:NIT, :DV, :TIPOID, :RAZONSOCIAL, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :DIR, :CIUDAD, :TEL,
    :CEL, :FAX, :EMAIL, :CONTACTO, :OBS, 'S');
    /*GRABE COMO CLIENTE*/
    INSERT INTO CLIENTES (TERC_NIT, CLIE_COD, CLIE_ESTADO, VEND_COD, ZONA_COD)
    VALUES (:NIT, :NIT, 'A', :vend, :ZONA);
end^


ALTER PROCEDURE CREE_CUENTA_PUC (
    CUENTA VARCHAR(20))
AS
declare variable EXIST CHAR(1);
declare variable NIVEL smallint;
declare variable CTAPADRE VARCHAR(20);
declare variable TIPOPUC VARCHAR(20);
BEGIN
  /* Verifica si la cuenta existe */
  EXIST = 'N';
  select 'S' from cuentas where cuen_cod = :CUENTA into :EXIST;
  if (EXIST <> 'S') then
    begin
    /* Como no existe, mire si los padres existen */
    execute procedure valide_estructura(CUENTA) returning_values (NIVEL);
    if (NIVEL > 1) then
        begin
        execute procedure padre (CUENTA) returning_values (CTAPADRE);
        select 'S' from cuentas where cuen_cod = :CTAPADRE into :EXIST;
        if (EXIST <> 'S') then
            execute procedure cree_cuenta_puc(CTAPADRE);
        end
    /* Ahora si creela */
    EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'TIPO DE PUC A UTILIZAR') returning_values (tipopuc);
    if (TIPOPUC = 'COMERCIAL') then
        insert into cuentas (cuen_cod, cuen_nom, cuen_tipo, cuen_tercero, cuen_centro, cuen_retencion, cuen_ctajuste, cuen_ctacorrecion, cuen_basemin, cuen_porc, cuen_ajusdb)
            select puc_cod, puc_nom, 'N', puc_terc, 'N', puc_reten, puc_ctaajus, puc_ctacorr, 0, 0, puc_ajdb FROM PUC WHERE PUC_COD = :CUENTA AND TIPU_COD = 1;
    if (TIPOPUC = 'OFICIAL') then
        insert into cuentas (cuen_cod, cuen_nom, cuen_tipo, cuen_tercero, cuen_centro, cuen_retencion, cuen_ctajuste, cuen_ctacorrecion, cuen_basemin, cuen_porc, cuen_ajusdb)
            select puc_cod, puc_nom, 'N', puc_terc, 'N', puc_reten, puc_ctaajus, puc_ctacorr, 0, 0, puc_ajdb FROM PUC WHERE PUC_COD = :CUENTA AND TIPU_COD = 2;
    if (TIPOPUC = 'COOPERATIVO') then
        insert into cuentas (cuen_cod, cuen_nom, cuen_tipo, cuen_tercero, cuen_centro, cuen_retencion, cuen_ctajuste, cuen_ctacorrecion, cuen_basemin, cuen_porc, cuen_ajusdb)
            select puc_cod, puc_nom, 'N', puc_terc, 'N', puc_reten, puc_ctaajus, puc_ctacorr, 0, 0, puc_ajdb FROM PUC WHERE PUC_COD = :CUENTA AND TIPU_COD = 3;
    if (TIPOPUC = 'SERVICIOS PUBLICOS') then
        insert into cuentas (cuen_cod, cuen_nom, cuen_tipo, cuen_tercero, cuen_centro, cuen_retencion, cuen_ctajuste, cuen_ctacorrecion, cuen_basemin, cuen_porc, cuen_ajusdb)
            select puc_cod, puc_nom, 'N', puc_terc, 'N', puc_reten, puc_ctaajus, puc_ctacorr, 0, 0, puc_ajdb FROM PUC WHERE PUC_COD = :CUENTA AND TIPU_COD = 4;
    if (TIPOPUC = 'SALUD') then
        insert into cuentas (cuen_cod, cuen_nom, cuen_tipo, cuen_tercero, cuen_centro, cuen_retencion, cuen_ctajuste, cuen_ctacorrecion, cuen_basemin, cuen_porc, cuen_ajusdb)
            select puc_cod, puc_nom, 'N', puc_terc, 'N', puc_reten, puc_ctaajus, puc_ctacorr, 0, 0, puc_ajdb FROM PUC WHERE PUC_COD = :CUENTA AND TIPU_COD = 5;
    end
END^


ALTER PROCEDURE CRONOLOGICO_CONTA (
    TIPOINI VARCHAR(3),
    TIPOFIN VARCHAR(3),
    FECINI VARCHAR(8),
    FECFIN VARCHAR(8),
    CONSOLIDADO CHAR(1),
    NIIF CHAR(1))
RETURNS (
    ID INTEGER,
    TIPOCOMP VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(20),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    TIPOREF INTEGER,
    IDREF INTEGER,
    NOMTIPO VARCHAR(60))
AS
BEGIN
if (NIIF = 'N') then
  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
else
  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_niif 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_niif 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
END^


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

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

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

    tipodes = 37;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select r.rute_id, r.pref_pre, r.rute_numero, r.rute_fecha from rutero_detalle d, rutero r
        where r.rute_id = d.rute_id and d.rutd_factid = :idori and r.rute_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 32) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_remid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 34) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_pedid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 40) then
    BEGIN
    tipodes = 31;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select f.fact_id, pref_pre, fact_numero, fact_fecha, D.arti_cod, D.fade_desc, D.fade_cant, D.fade_unidad, D.bode_cod, D.fade_lote
        from facturas F, facturas_detalle D
        where F.fact_id = D.fact_id AND d.fade_idpend = :idori and fade_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA, ARTIC, DESCRIPCION, CANT, UNIDAD, CODBOD, LOTE
        do
        suspend;
    END
end^


ALTER PROCEDURE CRUCES_DOCUMENTOS (
    TIPOORI INTEGER,
    IDORI INTEGER)
RETURNS (
    USOORI VARCHAR(6),
    TIPODES INTEGER,
    ID INTEGER,
    NOMTIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE)
AS
declare variable idc integer;
declare variable pedauto char(2);
declare variable idp integer;
begin
USOORI = 'USO';
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_CANTCR <> 0 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;
    if (TIPODES = 131) then
        SELECT FAPO_ID, PREF_PRE, FAPO_NUMERO, FAPO_FECHA FROM factura_proforma WHERE FAPO_CONSOLIDADO = :IDC AND FAPO_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;
    TIPODES = 40;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    FOR SELECT DISTINCT (PEND_ID) FROM pendiente_ventas_detalle WHERE PEVD_IDFACT = :idori AND PEVD_ANULADO = 'N' INTO :ID
        DO
        BEGIN
        SELECT PREF_PRE, PEND_NUMERO, PEND_FECHA FROM pendiente_ventas WHERE PEND_ID = :ID
            into :PREFIJO, :NUMERO, :FECHA;
        SUSPEND;
        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
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

USOORI = 'ORIGEN';
FOR SELECT DISTINCT COFA_TIPOORI, COFA_IDORI FROM CONSOLIDADO_FALTANTES
    WHERE COFA_TIPODES = :TIPOORI AND COFA_IDDES = :IDORI AND COFA_CANTCR <> 0 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_ID = :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_ID = :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_ID = :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_ID = :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_ID = :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_ID = :IDC AND PEDI_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 139) then
        SELECT SLIM_ID, PREF_PRE, SLIM_NUMERO, SLIM_FECHA FROM solicitud_importacion WHERE SLIM_ID = :IDC AND SLIM_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    suspend;
    END
if (tipoori = 33) then
    BEGIN
    select devt_factid, devt_remid, devt_pedid from devoluciones_ventas where devt_id = :idori and devt_anulado = 'N'
        into :ID, :IDC, :IDP;
    if (ID <> 0) then
        BEGIN
        tipodes = 31;
        SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
        SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID AND FACT_ANULADO = 'N' INTO :PREFIJO, :NUMERO, :FECHA;
        END
    if (IDC <> 0) then
        BEGIN
        tipodes = 34;
        SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
        SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = :IDC AND PEDI_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
        END
    if (IDP <> 0) then
        BEGIN
        tipodes = 32;
        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;
        END
    suspend;
    END


end^


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


ALTER PROCEDURE CUADRE_AGENCIA (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    CAJA INTEGER,
    NOMCAJA VARCHAR(60),
    NOMVEND VARCHAR(60),
    INICIAL NUMERIC(18,2),
    NROFAC INTEGER,
    NROCLI INTEGER,
    ITEMFAC INTEGER,
    ITEMDEV INTEGER,
    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),
    TOTDIA NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    CONSIGNAT NUMERIC(18,2),
    BONOS NUMERIC(18,2),
    TRASLADOIN NUMERIC(18,2),
    TRASLADOEG NUMERIC(18,2),
    TRASLADOSE NUMERIC(18,2),
    TRASLADOSO NUMERIC(18,2),
    DESCUADRE NUMERIC(18,2),
    TINICIAL NUMERIC(18,2),
    TVTACONTADO NUMERIC(18,2),
    TVTACREDITO NUMERIC(18,2),
    TVTATOTAL NUMERIC(18,2),
    TVTARETS NUMERIC(18,2),
    TDEVCONTADO NUMERIC(18,2),
    TDEVCREDITO NUMERIC(18,2),
    TDEVTOTAL NUMERIC(18,2),
    TDEVOTRODIA NUMERIC(18,2),
    TDEVRETS NUMERIC(18,2),
    TNETOCONTADO NUMERIC(18,2),
    TNETOCREDITO NUMERIC(18,2),
    TNETOTOTAL NUMERIC(18,2),
    TNETORETS NUMERIC(18,2),
    TINGCONTADO NUMERIC(18,2),
    TINGDESCTO NUMERIC(18,2),
    TINGCXC NUMERIC(18,2),
    TINGOTROS NUMERIC(18,2),
    TINGTOTAL NUMERIC(18,2),
    TEGRCXP NUMERIC(18,2),
    TEGROTROS NUMERIC(18,2),
    TEGRTOTAL NUMERIC(18,2),
    TTOTDIA NUMERIC(18,2),
    TCONSIGNA NUMERIC(18,2),
    TCONSIGNAT NUMERIC(18,2),
    TTRASLADOIN NUMERIC(18,2),
    TTRASLADOEG NUMERIC(18,2),
    TTRASLADOS NUMERIC(18,2))
AS
declare variable devdsctos numeric(18,2);
declare variable aplidev numeric(18,2);
declare variable aplifac numeric(18,2);
declare variable devite integer;
declare variable cajadif integer;
begin
DEVOTRODIA = 0;
TINICIAL = 0;
TVTACONTADO = 0;
TVTACREDITO = 0;
TVTATOTAL = 0;
TVTARETS = 0;
TDEVCONTADO = 0;
TDEVCREDITO = 0;
TDEVTOTAL = 0;
TDEVOTRODIA = 0;
TDEVRETS = 0;
TNETOCONTADO = 0;
TNETOCREDITO = 0;
TNETOTOTAL = 0;
TNETORETS = 0;
TINGCONTADO = 0;
TINGDESCTO = 0;
TINGCXC = 0;
TINGOTROS = 0;
TINGTOTAL = 0;
TEGRCXP = 0;
TEGROTROS = 0;
TEGRTOTAL = 0;
TTOTDIA = 0;
TCONSIGNA = 0;
TCONSIGNAT = 0;
TTRASLADOIN = 0;
TTRASLADOEG = 0;
TTRASLADOS = 0;

FOR SELECT CAJA_ID, CAJA_NOMBRE FROM CAJAS WHERE (SUCU_ID = :AGENCIA) or (:AGENCIA = 0) or (SUCU_ID = 0)
    INTO :CAJA, :NOMCAJA
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_EN_CAJA(:CAJA, :FECINI) returning_values (:INICIAL);
    TINICIAL = TINICIAL + INICIAL;
    /* ventas totales */
    SELECT SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO+FACT_RTIVAMONTO+FACT_RTICAMONTO), COUNT(FACT_ID), count( distinct f.terc_nit), MAX(FACT_USUARIO), max(p.ptvt_cajadif)
    FROM FACTURAS F, punto_venta P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.caja_id = :CAJA  AND P.ptvt_id = F.ptvt_id
        INTO :VTATOTAL, :vtarets, :nrofac, :nrocli, :nomvend, :cajadif;
    if (vtatotal IS NULL) then
        vtatotal = 0;
    if (vtarets IS NULL) then
        vtarets = 0;
    if (nrofac IS NULL) then
        nrofac = 0;
    SELECT COUNT(FADE_ITEM) FROM FACTURAS_DETALLE D, FACTURAS F, PUNTO_VENTA P
        WHERE F.fact_id = D.fact_id AND F.ptvt_id = P.ptvt_id AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
        AND P.caja_id = :CAJA AND D.fade_cant > 0
        INTO ITEMFAC;
    if (ITEMFAC IS NULL) then
        ITEMFAC = 0;
    SELECT COUNT(FADE_ITEM) FROM FACTURAS_DETALLE D, FACTURAS F, PUNTO_VENTA P
        WHERE F.fact_id = D.fact_id AND F.ptvt_id = P.ptvt_id AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
        AND P.caja_id = :CAJA AND D.fade_cant < 0
        INTO ITEMDEV;
    if (ITEMDEV IS NULL) then
        ITEMDEV = 0;
    SELECT COUNT(DVDE_ITEM) FROM devoluciones_ventas_detalle DV, devoluciones_ventas V, PUNTO_VENTA P
        WHERE V.devt_id = DV.devt_id AND V.ptvt_id = P.ptvt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND P.caja_id = :CAJA
        INTO DEVITE;
    if (DEVITE IS NULL) then
        DEVITE = 0;
    ITEMDEV = ITEMDEV + DEVITE;
--    SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :nomvend INTO :nomvend;
    if (nrocli IS NULL) then
        nrocli = 0;
    vtatotal = VTATOTAL - VTARETS;

    SELECT SUM(DEVT_TOTAL*-1), SUM(DEVT_RTFTEMONTO+DEVT_RTIVAMONTO+DEVT_RTICAMONTO) FROM DEVOLUCIONES_VENTAS V, punto_venta P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND P.caja_id = :CAJA AND P.ptvt_id = V.ptvt_id
        INTO :DEVTOTAL, :devrets;
    if (devtotal IS NULL) then
        devtotal = 0;
    if (devrets IS NULL) then
        devrets = 0;
    else
        devrets = devrets * -1;
    devtotal = DEVTOTAL - DEVRETS;
    /* ventas contado */
    SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R, FACTURAS F
        WHERE F.fact_fecha >= :FECINI AND F.fact_fecha <= :FECFIN AND D.rcde_tipodoc = 31 AND D.rcde_iddoc = F.fact_id AND R.reca_id = D.reca_id
            AND RECA_FECHA = F.fact_fecha AND RCDE_ANULADO = 'N' AND R.caja_id = :CAJA
        INTO :vtacontado, :ingdescto;
    SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  devoluciones_ventas V
        WHERE V.devt_fecha >= :FECINI AND V.devt_fecha <= :FECFIN AND D.rcde_tipodoc = 33 AND D.rcde_iddoc = V.devt_id AND R.reca_id = D.reca_id
        AND RECA_FECHA = V.devt_fecha AND RCDE_ANULADO = 'N' AND R.caja_id = :CAJA
        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(D.egcc_abono) FROM egresos_crucec D, egresos E, FACTURAS F
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND D.egcc_tipodoc = 31 AND D.egcc_iddoc = F.fact_id AND E.egre_id = D.egre_id
        AND EGRE_FECHA = F.fact_fecha AND D.egcc_anulado = 'N' AND E.caja_id = :CAJA
        INTO :aplifac;
    if (APLIFAC IS NULL) then
        APLIFAC = 0;
    vtacontado = vtacontado + aplifac;
    /* DESGLOCE LAS DEV DE HOY DE LAS DE AYER */
    APLIDEV = 0;
    SELECT SUM(EGCC_ABONO) FROM egresos_crucec D, egresos E, devoluciones_ventas V
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND D.egcc_tipodoc = 33 AND D.egcc_iddoc = V.devt_id AND E.egre_id = D.egre_id
        AND EGRE_FECHA = V.devt_fecha AND EGCC_ANULADO = 'N' AND E.caja_id = :CAJA
        INTO :aplidev;
    if (APLIDEV IS NULL) then
        APLIDEV = 0;
    aplidev = aplidev * -1;
    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
        where reca_fecha >= :fecini AND reca_fecha <= :fecfin AND RECA_ANULADO = 'N' AND R.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 >= :fecini AND reca_fecha <= :fecfin AND RECA_ANULADO = 'N' AND R.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 r.reca_id = d.reca_id and r.reca_fecha >= :fecini and r.reca_fecha <= :fecfin and d.rcde_tipodoc = m.mvcl_tiporef and d.rcde_iddoc = m.mvcl_idref
        AND R.caja_id = :CAJA AND RCDE_ANULADO = 'N' AND ((MVCL_TIPOREF <> 31 AND MVCL_TIPOREF <> 33) OR (mvcl_fecha <> R.reca_fecha))
        into :ingcxc;
    if (ingcxc IS NULL) then
        ingcxc = 0;
    
    /* EGRESOS totales */
    select sum(egca_monto*-1) from egresos e, egresos_caja c
        where e.egre_id = c.egre_id and E.egre_fecha >= :fecini AND E.egre_fecha <= :fecfin AND E.egre_anulado = 'N'
        AND C.CAJA_ID = :CAJA
        into :egrtotal;
    if (egrtotal IS NULL) then
        egrtotal = 0;
    /* EGRESOS otros */
    select sum(egca_monto*-1) from egresos e, egresos_caja c
        where e.egre_id = c.egre_id and E.egre_fecha >= :fecini AND E.egre_fecha <= :fecfin AND E.egre_anulado = 'N' AND C.CAJA_ID = :CAJA 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*-1) from consigna c, consigna_detalle d
        where c.cons_id = d.cons_id and cons_fecha >= :fecini AND cons_fecha <= :fecfin AND CONS_ANULADO = 'N' and d.caja_id = :CAJA
        into :consigna;
    if (consigna IS NULL) then
        consigna = 0;
    /* CONSIGNACIONES TARJETAS */
    select sum(D.ctjd_base*-1) from consigna_tarjetas c, consigna_tarjetas_det d
        where c.cotj_id = d.cotj_id and cotj_fecha >= :fecini AND cotj_fecha <= :fecfin AND COTJ_ANULADO = 'N' and C.caja_id = :CAJA
        into :consignat;
    if (consignat IS NULL) then
        consignat = 0;
    /* BONOS - FORMAS DE PAGO DIFERENTES AL EFECTIVO QUE NO SE CONSIGNAN Y NO SON CARTERA */
    select sum(rp.rcpa_monto) from recibos_caja_pago RP, recibos_caja R, formas_pago f
        where r.reca_id = rp.reca_id and reca_fecha >= :fecini AND reca_fecha <= :fecfin AND reca_anulado = 'N' and r.caja_id = :CAJA
        and rp.fopa_id = f.fopa_id and f.fopa_consigna <> 'S' and f.fopa_id <> 1 into :bonos;
    if (bonos IS NULL) then
        bonos = 0;
    /* TRASLADOS */
    TRASLADOEG = 0;
    TRASLADOIN = 0;
    SELECT SUM(TRCD_MONTO) FROM traslados_caja_det D, traslados_caja T
        WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha >= :fecini AND T.trcj_fecha <= :fecfin AND D.trcd_anulado = 'N' AND T.caja_id = :caja
        INTO :trasladoeg;
    if (trasladoeg IS NULL) then
        trasladoeg = 0;
    SELECT SUM(TRCD_MONTO*-1) FROM traslados_caja_det D, traslados_caja T
        WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha >= :fecini AND T.trcj_fecha <= :fecfin AND D.trcd_anulado = 'N' AND T.trcj_destino = :caja
        INTO :trasladoin;
    if (trasladoin IS NULL) then
        trasladoin = 0;
    SELECT SUM(TRCD_MONTO) FROM traslados_caja_det D, traslados_caja T
        WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha >= :fecini AND T.trcj_fecha <= :fecfin AND D.trcd_anulado = 'N' AND T.caja_id = :caja and t.trcj_destino <> :cajadif
        AND D.fopa_id = 1
        INTO :trasladose;
    if (trasladose IS NULL) then
        trasladose = 0;
    SELECT SUM(TRCD_MONTO) FROM traslados_caja_det D, traslados_caja T
        WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha >= :fecini AND T.trcj_fecha <= :fecfin AND D.trcd_anulado = 'N' AND T.caja_id = :caja and t.trcj_destino = :cajadif
        AND D.fopa_id = 1
        INTO :descuadre;
    if (descuadre IS NULL) then
        descuadre = 0;
    SELECT SUM(TRCD_MONTO) FROM traslados_caja_det D, traslados_caja T
        WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha >= :fecini AND T.trcj_fecha <= :fecfin AND D.trcd_anulado = 'N' AND T.caja_id = :caja
        AND D.fopa_id <> 1
        INTO :trasladoso;
    if (trasladoso IS NULL) then
        trasladoso = 0;
    EXECUTE PROCEDURE SALDO_EN_CAJA(:CAJA, :fecfin+1) returning_values (:TOTDIA);

    TVTACONTADO = TVTACONTADO + VTACONTADO;
    TVTACREDITO = TVTACREDITO + VTACREDITO;
    TVTATOTAL = TVTATOTAL + VTATOTAL;
    TVTARETS = TVTARETS + VTARETS;
    TDEVCONTADO = TDEVCONTADO + DEVCONTADO;
    TDEVCREDITO = TDEVCREDITO + DEVCREDITO;
    TDEVTOTAL = TDEVTOTAL + DEVTOTAL;
    TDEVOTRODIA = TDEVOTRODIA + DEVOTRODIA;
    TDEVRETS = TDEVRETS + DEVRETS;
    TNETOCONTADO = TNETOCONTADO + NETOCONTADO;
    TNETOCREDITO = TNETOCREDITO + NETOCREDITO;
    TNETOTOTAL = TNETOTOTAL + NETOTOTAL;
    TNETORETS = TNETORETS + NETORETS;
    TINGCONTADO = TINGCONTADO + INGCONTADO;
    TINGDESCTO = TINGDESCTO + INGDESCTO;
    TINGCXC = TINGCXC + INGCXC;
    TINGOTROS = TINGOTROS + INGOTROS;
    TINGTOTAL = TINGTOTAL + INGTOTAL;
    TEGRCXP = TEGRCXP + EGRCXP;
    TEGROTROS = TEGROTROS + EGROTROS;
    TEGRTOTAL = TEGRTOTAL + EGRTOTAL;
    TTOTDIA = TTOTDIA + TOTDIA;
    TCONSIGNA = TCONSIGNA + CONSIGNA;
    TCONSIGNAT = TCONSIGNAT + CONSIGNAT;
    TTRASLADOIN = TTRASLADOIN + TRASLADOIN;
    TTRASLADOEG =  TTRASLADOEG + TRASLADOEG;
    TTRASLADOS =  TTRASLADOS + TRASLADOIN - TRASLADOEG;
    SUSPEND;
    END
end^


ALTER PROCEDURE CUADRE_AGENCIA_FP (
    AGENCIA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    CAJA INTEGER)
RETURNS (
    FORMAID INTEGER,
    NOMFORMA VARCHAR(60),
    FORMAMONTO NUMERIC(18,2),
    FORMATOTAL NUMERIC(18,2),
    FORMASALDO NUMERIC(18,2),
    FORMASALDOT NUMERIC(18,2))
AS
declare variable MONTO NUMERIC(18,2);
declare variable CAJAUX INTEGER;
begin
FOR SELECT MAX(F.FOPA_ID), MAX(F.fopa_nom), SUM(G.rcpa_monto) FROM formas_pago F, RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R, CAJAS C
    WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND RECA_ANULADO = 'N' AND R.caja_id = C.caja_id AND G.FOPA_ID = F.fopa_id
    AND ((C.SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) AND CAJA_ACTIVA = 'S'
    GROUP BY G.FOPA_ID
    INTO :FORMAID, :NOMFORMA, :FORMATOTAL
    DO
    BEGIN
    if (CAJA <> 0) then
        BEGIN
        SELECT SUM(G.rcpa_monto) FROM RECIBOS_CAJA_PAGO G, RECIBOS_CAJA R
            WHERE R.RECA_ID = G.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND RECA_ANULADO = 'N'
            AND R.caja_id = :CAJA AND FOPA_ID = :FORMAID
            INTO :FORMAMONTO;
        if (FORMAMONTO IS NULL) then
            FORMAMONTO = 0;
        if (FORMAID = 1) then
            EXECUTE PROCEDURE saldo_en_efectivo (:CAJA, :fecfin+1) returning_values (formasaldo);
        else    
            EXECUTE PROCEDURE saldo_forma_pago (:CAJA, :FORMAID, :fecfin) returning_values (formasaldo);
        END

    FORMASALDOT = 0;
    FOR SELECT CAJA_ID FROM CAJAS WHERE (SUCU_ID = :AGENCIA) or (:AGENCIA = 0) INTO :CAJAUX
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_forma_pago (:CAJAUX, FORMAID, :fecfin) returning_values (MONTO);
        FORMASALDOT = FORMASALDOT + MONTO;
        END
    SUSPEND;
    END
end^


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),
    TRASLADOIN NUMERIC(18,2),
    TRASLADOEG 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),
    SALDOINI NUMERIC(18,2),
    SALDOFIN NUMERIC(18,2),
    MOVDIA NUMERIC(18,2))
AS
declare variable DEVDSCTOS NUMERIC(18,2);
declare variable DEVCONTADOE NUMERIC(18,2);
declare variable DEVDSCTOSE 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);
declare variable IDCAJA INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable MOVDIAC 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;
SELECT SUM(ec.egcc_abono), SUM(ec.egcc_dtof) FROM egresos_crucec EC, egresos e,  DEVOLUCIONES_VENTAS V, PREFIJOS P
    WHERE DEVT_FECHA = :FECHA AND ec.egcc_tipodoc = 33 AND ec.egcc_iddoc = V.devt_id AND e.egre_id = ec.egre_id AND
    EGRE_FECHA = :FECHA AND EC.egcc_anulado = 'N' AND P.tido_cod = 62 AND P.pref_pre = E.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    INTO :devcontadoe, :devdsctose;
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;
if (devcontadoe IS NULL) then
    devcontadoe = 0;
else
    devcontadoe = devcontadoe * -1;
if (devdsctose IS NULL) then
    devdsctose = 0;
devcontado = devcontado + devcontadoe;
devdsctose = devdsctos + devdsctose;
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;
/* SALDOS */
SALDOINI = 0;
SALDOFIN = 0;
MOVDIA = 0;
FOR SELECT CAJA_ID FROM CAJAS WHERE SUCU_ID = :AGENCIA INTO :IDCAJA
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_en_caja(:IDCAJA, :fecha) returning_values (:saldo);
    SALDOINI = SALDOINI +SALDO;
    EXECUTE PROCEDURE saldo_en_caja(:IDCAJA, :fecha+1) returning_values (:saldo);
    SALDOFIN = SALDOFIN +SALDO;
    MOVDIAC = 0;
    SELECT SUM(MOCA_DEBITOS-MOCA_CREDITOS) FROM MOVIMIENTO_CAJA WHERE CAJA_ID = :IDCAJA INTO :movdiac;
    if (MOVDIAC IS NULL) then
        MOVDIAC = 0;
    MOVDIA = MOVDIA + MOVDIAC;
    END
/* 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(axcmonto) from cuadre_caja_abonos(:fecha, :agencia) into :ingcxc;
/*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 e.egre_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 e.egre_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;

/* TRASLADOS */
TRASLADOEG = 0;
TRASLADOIN = 0;
SELECT SUM(TRCD_MONTO) FROM traslados_caja_det D, traslados_caja T, cajas j
    WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha = :fecha AND D.trcd_anulado = 'N'
    AND T.caja_id = j.caja_id AND ((:AGENCIA = 0) or (j.sucu_id = :AGENCIA)) INTO :trasladoeg;
SELECT SUM(TRCD_MONTO) FROM traslados_caja_det D, traslados_caja T, cajas j
    WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha = :fecha AND D.trcd_anulado = 'N'
    AND T.trcj_destino = j.caja_id AND ((:AGENCIA = 0) or (j.sucu_id = :AGENCIA)) INTO :trasladoin;
if (trasladoeg IS NULL) then
    trasladoeg = 0;
if (trasladoin IS NULL) then
    trasladoin = 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^


ALTER PROCEDURE CUADRE_CAJA_ABONOS (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    AXCTIPO VARCHAR(10),
    AXCNUMERO VARCHAR(12),
    AXCNIT VARCHAR(20),
    AXCNOMBRE VARCHAR(60),
    AXCMONTO NUMERIC(18,2),
    AXCSALDO NUMERIC(18,2))
AS
declare variable TIPO integer;
declare variable IDDOC integer;
declare variable IDAPL integer;
declare variable APLICADO NUMERIC(18,2);
begin
/* DETALLE DE LOS ABONOS DE OTROS DIAS */
for select tido_nomcorto, rcde_prefijo || rcde_numero, rcde_abono, R.terc_nit, rcde_tipodoc, rcde_iddoc
    from recibos_caja_detalle d, recibos_caja r, movimiento_clientes m, tipo_documento t, PREFIJOS P
    where r.reca_id = d.reca_id and r.reca_fecha = :fecha and d.rcde_tipodoc = m.mvcl_tiporef and
    d.rcde_iddoc = m.mvcl_idref AND RCDE_ANULADO = 'N' and t.tido_cod = d.rcde_tipodoc AND
    P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    ((MVCL_TIPOREF <> 31 AND MVCL_TIPOREF <> 33) OR mvcl_fecha <> :fecha)
    order by tido_nomcorto, rcde_prefijo, rcde_numero
    into :axctipo, :axcnumero, axcmonto, :axcnit, :tipo, :iddoc
    do
    begin
    if (axcmonto IS NULL) then
        axcmonto = 0;
    /* si es anticipo, reste lo que se aplico a una factura del mismo dia */
    if (tipo = 45) then
        BEGIN
        IDAPL = 0;
        APLICADO = 0;
        for SELECT R.apcl_id FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R
            WHERE D.acde_tipodoc = 45 AND D.acde_iddoc = :iddoc AND R.apcl_id = D.apcl_id AND
            APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N' INTO :IDAPL
            do
            BEGIN
            SELECT SUM(D.acde_aplicado) FROM APLICACION_CLIENTE_DETALLE D, APLICACION_CLIENTE R, FACTURAS F
                WHERE D.acde_tipodoc = 31 AND D.acde_iddoc = F.fact_id AND R.apcl_id = D.apcl_id AND R.apcl_id = :IDAPL
                AND F.fact_fecha = :FECHA AND ACDE_ANULADO = 'N' INTO :APLICADO;
            AXCMONTO = AXCMONTO - APLICADO;
            END
        END
    if (AXCMONTO <> 0) then
        BEGIN
        axcnombre = '';
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :axcnit INTO :axcnombre;
        EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :iddoc, :fecha, 0) returning_values (:AXCSALDO);
        SUSPEND;
        END
    end
end^


ALTER PROCEDURE CUADRE_CAJA_DETALLE (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    CXCTIPO VARCHAR(10),
    CXCNUMERO VARCHAR(12),
    CXCNIT VARCHAR(20),
    CXCNOMBRE VARCHAR(60),
    CXCMONTO NUMERIC(18,2))
AS
declare variable id integer;
declare variable TIPO integer;
declare variable ABONO NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
begin
/* DETALLE DE LA CARTERA DEL DIA */
for SELECT MVCL_IDREF, terc_nit, mvcl_tiporef, TIDO_NOMCORTO, MVCL_PREFREF || MVCL_NUMREF, MVCL_MONTO
    FROM MOVIMIENTO_CLIENTES M, TIPO_DOCUMENTO T
    WHERE (MVCL_FECHA = :FECHA) AND (MVCL_tiporef <> 45) AND (MVCL_ABONO = 'N') AND (M.mvcl_tiporef = T.tido_cod) AND ((:AGENCIA = 0) or (M.sucu_id = :agencia))
    order by MVCL_PREFREF, MVCL_NUMREF
    into :id, :cxcnit, :TIPO, :cxctipo, :cxcnumero, cxcmonto
    do
    BEGIN
    execute procedure saldo_doc_cartera(:TIPO, :ID, :FECHA, 0) returning_values (:cxcmonto);
    if (cxcmonto <> 0) then
        begin
        cxcnombre = '';
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :cxcnit INTO :cxcnombre;
        SUSPEND;
        END
/*    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^


ALTER PROCEDURE CUADRE_CAJA_DETALLE_F (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    CAJA INTEGER)
RETURNS (
    CXCTIPO VARCHAR(10),
    CXCTIPOREF INTEGER,
    CXCIDDOC INTEGER,
    CXCPREF VARCHAR(4),
    CXCNUM VARCHAR(8),
    CXCNUMERO VARCHAR(12),
    CXCNIT VARCHAR(20),
    CXCNOMBRE VARCHAR(60),
    CXCMONTO NUMERIC(18,2))
AS
declare variable ABONO NUMERIC(18,2);
declare variable PREF VARCHAR(4);
begin
select FIRST 1 P.pref_pre from punto_venta P where caja_id = :caja into :pref;
/* DETALLE DE LA CARTERA DEL DIA */
for SELECT MVCL_IDREF, terc_nit, mvcl_tiporef, TIDO_NOMCORTO, MVCL_PREFREF || MVCL_NUMREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_MONTO
    FROM MOVIMIENTO_CLIENTES M, TIPO_DOCUMENTO T
    WHERE (MVCL_FECHA >= :FECINI) AND (MVCL_FECHA <= :FECFIN) AND (MVCL_tiporef <> 45) AND (MVCL_ABONO = 'N') AND (M.mvcl_tiporef = T.tido_cod)
    AND ((:AGENCIA = 0) or (M.sucu_id = :agencia)) AND M.mvcl_prefref = :PREF
    ORDER BY MVCL_FECHA, MVCL_ID
    into :cxciddoc, :cxcnit, :cxctiporef, :cxctipo, :cxcnumero, cxcpref, cxcnum, 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 = :cxciddoc AND sdca_tiporef = :cxctiporef AND SDCA_FECHA <= :FECFIN 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^


ALTER PROCEDURE CUADRE_CAJA_EGRESOS (
    FECHA DATE,
    AGENCIA INTEGER,
    CAJA INTEGER)
RETURNS (
    EGRTIPO VARCHAR(8),
    EGRNUM VARCHAR(10),
    EGRCONC VARCHAR(60),
    EGRNIT VARCHAR(20),
    EGRNOMBRE VARCHAR(60),
    EGRMONTO NUMERIC(18,2))
AS
declare variable EGREID INTEGER;
begin
/* DETALLE DE LOS ABONOS DE OTROS DIAS */
EGRTIPO = 'EGRESO';
for select egre_id, e.pref_pre || egre_numero, egre_conc, terc_nit, egre_nomterc
    from egresos e, PREFIJOS P
    where egre_fecha = :fecha and egre_anulado = 'N' and P.tido_cod = 62 AND
    P.pref_pre = e.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    into :egreid, :egrnum, :egrconc, :egrnit, :egrnombre
    do
    begin
    EGRMONTO = 0;
    SELECT sum(egca_monto) FROM egresos_caja WHERE EGRE_ID = :egreid
        AND ((CAJA_ID = :CAJA) or (:CAJA = 0))
        INTO :egrmonto;
    if ((NOT EGRMONTO IS NULL) AND (EGRMONTO <> 0)) then
        SUSPEND;
    end
EGRTIPO = 'TRASLADO';
egrnombre = '';
FOR SELECT T.trcj_id, T.pref_pre || T.trcj_numero, T.trcj_conc FROM traslados_caja T, PREFIJOS P
    WHERE T.trcj_fecha = :fecha AND T.trcj_anulado = 'N' AND T.caja_id = :CAJA AND
    P.tido_cod = 66 AND P.pref_pre = T.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
    order by t.trcj_id
    into :egreid, :egrnum, :egrconc
    do
    begin
    EGRNOMBRE = EGRCONC;
    EGRMONTO = 0;
    SELECT sum(d.trcd_monto) FROM traslados_caja_det d WHERE d.trcj_id = :egreid
        INTO :egrmonto;
    if ((NOT EGRMONTO IS NULL) AND (EGRMONTO <> 0)) then
        SUSPEND;
    end
end^


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^


ALTER PROCEDURE CUADRE_COMPROBANTES_CONTABLES (
    FECINI CHAR(8),
    FECFIN CHAR(8),
    TIPOCOMP CHAR(3))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE CUADRE_UNA_CAJA (
    FECHA DATE,
    CAJA 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),
    TOTDIA NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    TRASLADOIN NUMERIC(18,2),
    TRASLADOEG 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),
    SALDOINI NUMERIC(18,2),
    SALDOFIN NUMERIC(18,2),
    MOVDIA NUMERIC(18,2))
AS
declare variable DEVDSCTOS NUMERIC(18,2);
declare variable APLIDEV NUMERIC(18,2);
declare variable APLIFAC NUMERIC(18,2);
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
declare variable FECDOC DATE;
declare variable APLICA NUMERIC(18,2);
declare variable SALDO NUMERIC(18,2);
declare variable MOVDIAC NUMERIC(18,2);
declare variable IDCAJA INTEGER;
declare variable PUNTO INTEGER;
declare variable VTAUX numeric(18,2);
declare variable DVAUX numeric(18,2);
declare variable RTVTAUX numeric(18,2);
declare variable RTDVAUX numeric(18,2);
begin
vtatotal = 0;
devtotal = 0;
vtarets = 0;
devrets = 0;
FOR select ptvt_id from punto_venta where caja_id = :caja into :punto
    do
    begin
    VTAUX = 0;
    DVAUX = 0;
    RTVTAUX = 0;
    RTDVAUX = 0;
    /* 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 F.ptvt_id = :PUNTO INTO :VTAUX, :RTVTAUX;
    if (VTAUX IS NULL) then
        VTAUX = 0;
    if (RTVTAUX IS NULL) then
        RTVTAUX = 0;
    VTAUX = VTAUX - RTVTAUX;
    /* devoluciones totales */
    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 V.ptvt_id = :PUNTO INTO :DVAUX, :RTDVAUX;
    if (DVAUX IS NULL) then
        DVAUX = 0;
    if (RTDVAUX IS NULL) then
        RTDVAUX = 0;
    DVAUX = DVAUX - RTDVAUX;
    vtatotal = vtatotal + VTAUX;
    devtotal = devtotal + DVAUX;
    vtarets = vtarets + RTVTAUX;
    devrets = devrets + RTDVAUX;
    end
/* ventas contado */
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R, movimiento_clientes M, PREFIJOS P
    WHERE MVCL_FECHA = :FECHA AND D.rcde_tipodoc = M.mvcl_tiporef AND D.rcde_iddoc = M.mvcl_idref AND R.reca_id = D.reca_id
        AND M.mvcl_abono = 'N' AND M.mvcl_debito = 'S' AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
        AND P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:CAJA = 0) or (CAJA_ID = :CAJA))
    INTO :vtacontado, :ingdescto;
SELECT SUM(RCDE_ABONO), SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R,  movimiento_clientes M, PREFIJOS P
    WHERE MVCL_FECHA = :FECHA AND D.rcde_tipodoc = M.mvcl_tiporef AND D.rcde_iddoc = M.mvcl_idref AND R.reca_id = D.reca_id
    AND M.mvcl_abono = 'N' AND M.mvcl_debito = 'N' AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
    AND P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:CAJA = 0) or (CAJA_ID = :CAJA))
    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, movimiento_clientes M, PREFIJOS P
    WHERE MVCL_FECHA = :FECHA AND D.acde_tipodoc = M.mvcl_tiporef AND D.acde_iddoc = M.mvcl_idref AND R.apcl_id = D.apcl_id AND M.mvcl_abono = 'N' AND M.mvcl_debito = 'S'
    AND APCL_FECHA = :FECHA AND ACDE_ANULADO = 'N' AND P.tido_cod = 43 AND P.pref_pre = R.pref_pre
    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_tipodoc, 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) or (D.acde_tipodoc = 42)) AND P.tido_cod = 43 AND P.pref_pre = R.pref_pre
    INTO :TIPO, :IDDOC, :aplica
    DO
    BEGIN
    if (TIPO = 33) then
        BEGIN
        SELECT DEVT_FECHA, DEVT_FACTID FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :IDDOC INTO :FECDOC, :IDDOC;
        if (FECDOC = FECHA) then
            BEGIN
            SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :IDDOC INTO :FECDOC;
            if (FECDOC = FECHA) then
                APLIDEV = APLIDEV + aplica;
            ELSE
                devotrodia = devotrodia + APLICA;
            END
        END
    ELSE
        devotrodia = devotrodia + APLICA;
    END
aplidev = aplidev * -1;
devotrodia = devotrodia * -1;
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;
/* SALDOS */
SALDOINI = 0;
SALDOFIN = 0;
MOVDIA = 0;
if (caja = 0) then
    FOR SELECT CAJA_ID FROM CAJAS INTO :IDCAJA
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_en_caja(:IDCAJA, :fecha) returning_values (:saldo);
        SALDOINI = SALDOINI +SALDO;
        EXECUTE PROCEDURE saldo_en_caja(:IDCAJA, :fecha+1) returning_values (:saldo);
        SALDOFIN = SALDOFIN +SALDO;
        MOVDIAC = 0;
        SELECT SUM(MOCA_DEBITOS-MOCA_CREDITOS) FROM MOVIMIENTO_CAJA WHERE CAJA_ID = :IDCAJA INTO :movdiac;
        if (MOVDIAC IS NULL) then
            MOVDIAC = 0;
        MOVDIA = MOVDIA + MOVDIAC;
        END
else
    begin
    EXECUTE PROCEDURE saldo_en_caja(:CAJA, :fecha) returning_values (:saldoini);
    EXECUTE PROCEDURE saldo_en_caja(:CAJA, :fecha+1) returning_values (:saldofin);
    SELECT SUM(MOCA_DEBITOS-MOCA_CREDITOS) FROM MOVIMIENTO_CAJA WHERE CAJA_ID = :CAJA INTO :movdia;
    if (MOVDIA IS NULL) then
        MOVDIA = 0;
    end
/* 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 R.caja_id = :CAJA
    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 ((:CAJA = 0) or (R.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, 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 ((:CAJA = 0) or (CAJA_ID = :CAJA)) 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 R.caja_id = :CAJA
    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 e.egre_fecha = :fecha AND E.egre_anulado = 'N'
    AND P.tido_cod = 62 AND P.pref_pre = e.pref_pre AND C.CAJA_ID = :CAJA
    AND ((:CAJA = 0) or (C.CAJA_ID = :CAJA))
    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 e.egre_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 C.caja_id = :CAJA
    AND ((:CAJA = 0) or (C.CAJA_ID = :CAJA))
    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 ((:CAJA = 0) or (D.caja_id = :CAJA))
    into :consigna;
if (consigna IS NULL) then
    consigna = 0;

/* TRASLADOS */
TRASLADOEG = 0;
TRASLADOIN = 0;
SELECT SUM(TRCD_MONTO) FROM traslados_caja_det D, traslados_caja T, cajas j
    WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha = :fecha AND D.trcd_anulado = 'N' AND ((:CAJA = 0) or (T.caja_id = :caja))
    AND T.caja_id = j.caja_id
    INTO :trasladoeg;
SELECT SUM(TRCD_MONTO) FROM traslados_caja_det D, traslados_caja T, cajas j
    WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha = :fecha AND D.trcd_anulado = 'N' AND ((:CAJA = 0) or (T.trcj_destino = :caja))
    AND T.trcj_destino = j.caja_id
    INTO :trasladoin;
if (trasladoeg IS NULL) then
    trasladoeg = 0;
if (trasladoin IS NULL) then
    trasladoin = 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 ((:CAJA = 0) or (R.CAJA_ID = :CAJA))
    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 ((:CAJA = 0) or (R.CAJA_ID = :CAJA))
    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 ((:CAJA = 0) or (R.CAJA_ID = :CAJA))
    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 ((:CAJA = 0) or (R.CAJA_ID = :CAJA))
    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 ((:CAJA = 0) or (R.CAJA_ID = :CAJA))
    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 ((:CAJA = 0) or (R.CAJA_ID = :CAJA))
    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 ((:CAJA = 0) or (R.CAJA_ID = :CAJA))
    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 ((:CAJA = 0) or (R.CAJA_ID = :CAJA))
    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 ((:CAJA = 0) or (R.CAJA_ID = :CAJA))
    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 ((:CAJA = 0) or (R.CAJA_ID = :CAJA))
    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;
totdia = ingtotal - :egrtotal - :consigna;
SUSPEND;
end^


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


ALTER PROCEDURE CUADRE_UNA_CAJA_DETALLE (
    FECHA DATE,
    CAJA INTEGER)
RETURNS (
    CXCIDTIPO INTEGER,
    CXCTIPO VARCHAR(10),
    CXCIDDOC INTEGER,
    CXCPREF VARCHAR(4),
    CXCNUM VARCHAR(8),
    CXCNUMERO VARCHAR(12),
    CXCNIT VARCHAR(20),
    CXCNOMBRE VARCHAR(60),
    CXCMONTO NUMERIC(18,2))
AS
declare variable ABONO NUMERIC(18,2);
declare variable PUNTO VARCHAR(4);
begin
select FIRST 1 P.ptvt_id from punto_venta P where caja_id = :caja into :punto;
/* DETALLE DE LA CARTERA DEL DIA */
CXCTIPO = 'FACTVENT';

for SELECT FACT_ID, terc_nit, 31, F.PREF_PRE || FACT_NUMERO, F.PREF_PRE, FACT_NUMERO, FACT_TOTAL
    FROM FACTURAS F WHERE FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND FACT_ANULADO = 'N'
    into :CXCIDDOC, :cxcnit, :CXCIDTIPO, :cxcnumero, cxcpref, cxcnum, cxcmonto
    do
    BEGIN
    SELECT sum(SDCA_ABONO) FROM SALDOS_DOC_CARTERA WHERE sdca_idref = :CXCIDDOC AND sdca_tiporef = :CXCIDTIPO 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
CXCTIPO = 'DEVOLCLI';
cxcidtipo = 33;
for SELECT DEVT_ID, terc_nit, 33, D.PREF_PRE || DEVT_NUMERO, D.PREF_PRE, DEVT_NUMERO, DEVT_TOTAL
    FROM devoluciones_ventas D WHERE DEVT_FECHA = :FECHA AND D.PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N'
    into :CXCIDDOC, :cxcnit, :CXCIDTIPO, :cxcnumero, cxcpref, cxcnum, cxcmonto
    do
    BEGIN
    SELECT sum(SDCA_ABONO) FROM SALDOS_DOC_CARTERA WHERE sdca_idref = :CXCIDDOC AND sdca_tiporef = :CXCIDTIPO AND SDCA_FECHA = :FECHA AND SDCA_ABONO <> 0
        INTO :ABONO;
    if (ABONO IS NULL) then
        ABONO = 0;
    if (ABS(CXCMONTO) <> ABS(ABONO)) then
        BEGIN
        cxcmonto = cxcmonto - abono;
        cxcnombre = '';
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :cxcnit INTO :cxcnombre;
        SUSPEND;
        END
    END
end^


ALTER PROCEDURE CUADRE_UNA_CAJA_EGRESOS (
    FECHA DATE,
    CAJA INTEGER)
RETURNS (
    EGRTIPO VARCHAR(8),
    EGRNUM VARCHAR(10),
    EGRCONC VARCHAR(60),
    EGRNIT VARCHAR(20),
    EGRNOMBRE VARCHAR(60),
    EGRMONTO NUMERIC(18,2))
AS
declare variable EGREID INTEGER;
begin
/* DETALLE DE LOS ABONOS DE OTROS DIAS */
EGRTIPO = 'EGRESO';
for select egre_id, e.pref_pre || egre_numero, egre_conc, terc_nit, egre_nomterc
    from egresos e where egre_fecha = :fecha and egre_anulado = 'N'
    into :egreid, :egrnum, :egrconc, :egrnit, :egrnombre
    do
    begin
    EGRMONTO = 0;
    SELECT sum(egca_monto) FROM egresos_caja WHERE EGRE_ID = :egreid AND CAJA_ID = :caja
    AND ((CAJA_ID = :CAJA) or (:CAJA = 0))
        INTO :egrmonto;
    if ((NOT EGRMONTO IS NULL) AND (EGRMONTO <> 0)) then
        SUSPEND;
    end
EGRTIPO = 'TRASLADO';
egrnombre = '';
FOR SELECT T.trcj_id, T.pref_pre || T.trcj_numero, T.trcj_conc FROM traslados_caja T
    WHERE T.trcj_fecha = :fecha AND T.trcj_anulado = 'N' AND T.caja_id = :CAJA
    order by t.trcj_id
    into :egreid, :egrnum, :egrconc
    do
    begin
    EGRNOMBRE = EGRCONC;
    EGRMONTO = 0;
    SELECT sum(d.trcd_monto) FROM traslados_caja_det d WHERE d.trcj_id = :egreid
        INTO :egrmonto;
    if ((NOT EGRMONTO IS NULL) AND (EGRMONTO <> 0)) then
        SUSPEND;
    end
end^


ALTER PROCEDURE CUADRE_UNA_CAJA_FPAGO (
    FECHA DATE,
    CAJA INTEGER)
RETURNS (
    CHETIPO VARCHAR(30),
    CHENUMERO VARCHAR(20),
    CHERECIBO VARCHAR(10),
    CHEMONTO NUMERIC(18,2))
AS
begin
/* DETALLE DE LAS FORMAS DE PAGO */
FOR SELECT FOPA_NOM, RCPA_MONTO, RECA_NUMERO, RP.rcpa_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 ((:CAJA = 0) AND (R.CAJA_ID = :CAJA))
    order by RP.FOPA_ID, RP.rcpa_numero
    INTO :chetipo, :chemonto, :cherecibo, :chenumero
    DO
    BEGIN
    if (chemonto IS NULL) then
        chemonto = 0;
    SUSPEND;
    END
end^


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^


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


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


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


ALTER PROCEDURE CUENTA_MAL_AFECTABLE
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    AFECTABLE CHAR(1))
AS
declare variable ITEMS INTEGER;
begin
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_AFECTABLE FROM CUENTAS ORDER BY CUEN_COD
    INTO :CODIGO, :NOMBRE, :AFECTABLE
    DO
    BEGIN
    SELECT COUNT(CUEN_COD) FROM CUENTAS WHERE SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(:CODIGO)) = :CODIGO
        INTO :ITEMS;
    if (ITEMS = 1) then
        BEGIN
        if (AFECTABLE = 'N') then
            BEGIN
            UPDATE CUENTAS SET CUEN_AFECTABLE = 'S' WHERE CUEN_COD = :CODIGO;
            SUSPEND;
            END
        END
    ELSE
        BEGIN
        if (AFECTABLE = 'S') then
            BEGIN
            UPDATE CUENTAS SET CUEN_AFECTABLE = 'N' WHERE CUEN_COD = :CODIGO;
            SUSPEND;
            END
        END
    END
end^


ALTER PROCEDURE CUENTAS_ARTICULOS
AS
declare variable GRUP_TIVA CHAR(10);
BEGIN
DELETE FROM CONTABIL_ARTICULO;
DELETE FROM contabil_articulo_niif;

EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
if (GRUP_TIVA = 'GRUPOS') then
    begin
    INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTARTFTE, COAR_CTARTFTEV, COAR_RTBASE, COAR_RTFTE, COAR_CTARTCREE, COAR_RTCREE, COAR_CTARTICAV, COAR_RTICA, COAR_CTAIVADV, COAR_CTAIVADC)
        SELECT ARTI_COD, GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP, GRUP_CTARTCREE, GRUP_RTCREE, GRUP_CTARTICA, GRUP_RTICA, GRUP_CTAIVADV, GRUP_CTAIVADC
            FROM ARTICULO A, GRUPO G
            WHERE A.GRUP_COD = G.GRUP_COD;
    INSERT INTO contabil_articulo_niif (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTARTFTE, COAR_CTARTFTEV, COAR_CTARTCREE, COAR_CTARTICAV, COAR_CTAIVADV, COAR_CTAIVADC)
        SELECT ARTI_COD, G.grup_ctainvniif, G.grup_ctaivacniif, G.grup_ctaivavniif, G.grup_ctavtaniif, G.grup_ctacosniif, GRUP_CTADEV, G.grup_ctacmpniif, G.grup_ctartfcniif, G.grup_ctartfvniif, G.grup_ctartcrniif, G.grup_ctaricaniif, G.grup_ctaivdvniif, G.grup_ctaivdcniif
            FROM ARTICULO A, GRUPO G
            WHERE A.GRUP_COD = G.GRUP_COD;
    end
ELSE
    begin
    INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTAIVADV, COAR_CTAIVADC)
        SELECT ARTI_COD, TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTADEV, TAIV_CTACOMP, TAIV_CTAIVADV, TAIV_CTAIVADC
            FROM ARTICULO A, TARIFA_IVA T
            WHERE A.taiv_cod = T.taiv_cod;
    INSERT INTO contabil_articulo_niif (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTAIVADV, COAR_CTAIVADC)
        SELECT ARTI_COD, T.taiv_ctainvniif, T.taiv_ctaivacniif, T.taiv_ctaivavniif, T.taiv_ctavtaniif, T.taiv_ctacosniif, T.taiv_ctadevniif, T.taiv_ctacmpniif, T.taiv_ctaivdvniif, T.taiv_ctaivdcniif
            FROM ARTICULO A, TARIFA_IVA T
            WHERE A.taiv_cod = T.taiv_cod;
    end
END^


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^


ALTER PROCEDURE CXPAGAR_PROVEEDOR (
    NIT VARCHAR(20),
    FECHA DATE,
    MONEDA INTEGER)
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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 (TIPO = 137) then
            SELECT fp.fapo_dtomonto, fp.fapo_dtofecha, fp.fapo_numprov, fp.taca_monto FROM factura_proforma FP
                WHERE fp.fapo_id = :ID INTO :DTOF, :FEC, :REFERENCIA, :TRMDOC;
        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 AND EGRE_ANULADO = 'N' 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 AND EGRE_ANULADO = 'N' 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^


ALTER PROCEDURE DATOS_COMPANIA
RETURNS (
    NITCOMP VARCHAR(20),
    NOMBRECOMP VARCHAR(255))
AS
begin
  execute procedure lee_configuracion('CONTABILIDAD','GENERAL','NIT COMPAÑIA')returning_values(:NITCOMP);
  execute procedure lee_configuracion('GENERAL','GENERAL','NOMBRE COMPAÑIA')returning_values(:NOMBRECOMP);
  EXECUTE PROCEDURE nombre_ascii(:NITCOMP) returning_values(:NITCOMP);
  EXECUTE PROCEDURE nombre_ascii(:NOMBRECOMP) returning_values(:NOMBRECOMP);
  suspend;
end^


ALTER PROCEDURE DATOS_VEHICULO (
    PLACA VARCHAR(8))
RETURNS (
    NITASOC VARCHAR(20),
    NOMASOC VARCHAR(60),
    AFILIADO CHAR(1),
    CODTIPO INTEGER,
    TIPO VARCHAR(30),
    LINEA VARCHAR(60),
    MARCA VARCHAR(60),
    CARROC VARCHAR(60),
    MODELO VARCHAR(4),
    NUMERO VARCHAR(15),
    COLOR VARCHAR(60),
    PESO NUMERIC(18,2),
    REGNC VARCHAR(20),
    CAPAC INTEGER,
    NITCOND VARCHAR(20),
    CONDUCTOR VARCHAR(60),
    FECSOAT DATE,
    SOAT VARCHAR(20),
    SEGCONTR DATE,
    SEGEXTRA DATE,
    NITTENE VARCHAR(20),
    NOMTENE VARCHAR(60))
AS
declare variable codlin varchar(3);
declare variable codmar VARCHAR(3);
declare variable codcar integer;
begin
select terc_nit, vehi_conductor, vehi_numero, vehi_capacidad, vehi_color, vehi_carroc, vehi_linea, vehi_marca, vehi_pesov, vehi_modelo, vehi_registronc, vehi_tipo, vehi_fecsoat, vehi_soat, vehi_tenedor, vehi_segcontr, vehi_segextra, vehi_afiliado
    from vehiculos v where vehi_cod = :placa
    into :nitasoc, :nitcond, :numero,  :capac, :color, :codcar, :codlin, codmar, :peso, :modelo, :regnc, :codtipo, :fecsoat, :soat, :nittene, :segcontr, :segextra, :afiliado;
select tich_nom from tipo_vehiculo where tivh_cod = :codtipo into :tipo;
select vhca_nom from vehiculo_carroceria where vhca_id = :codcar into :carroc;
select vhli_nom from vehiculo_linea where vhli_cod = :codlin into :linea;
select vhma_nom from vehiculo_marca where vhma_cod = :codmar into :marca;
select terc_nom from terceros where terc_nit = :nittene into :nomtene;
select terc_nom from terceros where terc_nit = :nitasoc into :nomasoc;
select terc_nom from terceros where terc_nit = :nitcond into :conductor;
suspend;
end^


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


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(18,2))
AS
begin
FOR SELECT ARTI_COD, PEDE_DESC, PEDE_CANT, PEDE_UNIDAD, (PEDE_PRUNIT-PEDE_DTOMONTO), LIPR_COD, PEDE_PRLISTA
    FROM pedidos_detalle WHERE PEDI_ID = :ID INTO :codart, :descr, :cant, :unidad, :prunit, :lista, :prlista
    DO
    BEGIN
    if (prlista <> 0) then
        DTO = (prlista - prunit) * 100 / prlista;
    ELSE
        DTO = 0;
    suspend;
    END
end^


ALTER PROCEDURE DESENSAMBLES_SIN_CONTABIL_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
declare variable IDREF INTEGER;
BEGIN
FOR SELECT DESE_ID, PREF_PRE, DESE_NUMERO FROM desensambles WHERE DESE_ANULADO = 'N' AND
    DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN AND ((:PREFIJO = '') or (PREF_PRE = :PREFIJO))
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idc = null;
  if (not exists (SELECT E.ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE ENCO_TIPOREF = 16 AND ENCO_IDREF = :ID AND E.enco_consec = D.enco_consec)) then
    BEGIN
    SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 16 AND CNTB_IDREF = :ID into :idc;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= 100000;
    if (idc IS NOT NULL) then
        begin
        ESTADO = 'PROCESANDO';
        ERROR = NULL;
        SUSPEND;
        SELECT MAX(ININ_ID) FROM interfaz_inventario WHERE PREF_PRE = :PREF AND TIDO_COD = 16 INTO :IDI;
        EXECUTE PROCEDURE contabil_desensamble_niif (:ID, :IDI, :idc) RETURNING_VALUES (:ERROR, VER);
        if ((ERROR = 0) or (error IS NULL)) then
            BEGIN
            SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E WHERE ENCO_TIPOREF = 16 AND ENCO_IDREF = :ID INTO :IDREF;
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
                SELECT :IDREF, 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 = :idc AND CNDE_ITEM >= 100000;
            UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDREF;
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        end
    END
  END
END^


ALTER PROCEDURE DESENSAMBLES_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DESE_ID, PREF_PRE, DESE_NUMERO FROM DESENSAMBLES WHERE DESE_ANULADO = 'N' AND
    DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 16 INTO :IDI;
    if (IDI is NOT NULL) then
      BEGIN
      if (CN <> 'N') then
        EXECUTE PROCEDURE CONTABIL_DESENSAMBLE (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
      else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
      if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_desensamble_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
      if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    end
  END
END^


ALTER PROCEDURE DETALLE_COMPRAS_ARTICULO (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    NIT VARCHAR(20))
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
declare variable ANOAUX INTEGER;
BEGIN
  TIPO = 'FACTCOMP';
  if ((NIT = '') or (NIT IS NULL)) then
      FOR SELECT F.FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, FCDE_CANT * FCDE_FACTOR, FCDE_PRUNIT / FCDE_FACTOR, FCDE_DTOPORC, FCDE_IVAMONTO, FCDE_TOTAL
        FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D WHERE F.FACO_ID = D.FACO_ID AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND ARTI_COD = :ARTICULO AND FACO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CANTIDAD, :PRUNIT, :DTO, :IVA, :TOTAL
        DO
        SUSPEND;
  ELSE
      FOR SELECT F.FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, FCDE_CANT * FCDE_FACTOR, FCDE_PRUNIT / FCDE_FACTOR, FCDE_DTOPORC, FCDE_IVAMONTO, FCDE_TOTAL
        FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.FACO_ID AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND ARTI_COD = :ARTICULO AND TERC_NIT = :NIT AND FACO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CANTIDAD, :PRUNIT, :DTO, :IVA, :TOTAL
        DO
        SUSPEND;
    
  TIPO = 'DEVOLPRV';
  if ((NIT = '') or (NIT IS NULL)) then
      FOR SELECT V.DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, DVCD_CANT * DVCD_FACTOR, DVCD_PRUNIT / DVCD_FACTOR, DVCD_DTOPORC, DVCD_IVAMONTO, DVCD_TOTAL
        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'
        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.DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, DVCD_CANT * DVCD_FACTOR, DVCD_PRUNIT / DVCD_FACTOR, DVCD_DTOPORC, DVCD_IVAMONTO, DVCD_TOTAL
        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 TERC_NIT = :NIT AND DVCO_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^


ALTER PROCEDURE DETALLE_COMPRAS_PROVEEDOR (
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  TIPO = 'FACTCOMP';
  FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA
    FROM FACTURAS_COMPRA
    WHERE TERC_NIT = :NIT AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE total_doc_compra(21, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
    TOTAL = SUBTOTAL + IVA + CONSUMO;
    SUSPEND;
    END
    
  TIPO = 'DEVOLPRV';
  FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA
    FROM DEVOLUCIONES_COMPRAS
    WHERE TERC_NIT = :NIT AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N'
    INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
    BEGIN
    EXECUTE PROCEDURE total_doc_compra(24, 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^


ALTER PROCEDURE DETALLE_DEVOLUCIONES_POS (
    FECHA DATE,
    PUNTO INTEGER,
    VENDEDOR INTEGER,
    PREFIJO VARCHAR(4))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE DETALLE_VENTAS_ARTICULO (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    NIT VARCHAR(20))
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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
declare variable ANOAUX INTEGER;
BEGIN
  TIPO = 'FACTVENT';
  if ((NIT = '') or (NIT 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 TERC_NIT = :NIT AND FACT_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :CANTIDAD, :PRUNIT, :DTO, :IVA, :TOTAL
        DO
        SUSPEND;
    
  TIPO = 'DEVOLCLI';
  if ((NIT = '') or (NIT 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'
        AND ((devt_remid is null) or (DEVT_REMID = 0)) AND ((devt_pedid is null) or (DEVT_PEDID = 0))
        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 TERC_NIT = :NIT 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, :CANTIDAD, :PRUNIT, :DTO, :IVA, :TOTAL
        DO
        BEGIN
        CANTIDAD = CANTIDAD * -1;
        IVA = IVA * -1;
        TOTAL = TOTAL * -1;
        SUSPEND;
        END
END^


ALTER PROCEDURE DETALLE_VENTAS_ARTICULO_VEND (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    VEND INTEGER)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE DETALLE_VENTAS_CIUDAD (
    CODCIU VARCHAR(5),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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 F, TERCEROS T
    WHERE T.ciud_cod = :codciu AND F.terc_nit = T.terc_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 V, TERCEROS T
    WHERE V.terc_nit = T.terc_nit AND T.ciud_cod = :codciu 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^


ALTER PROCEDURE DETALLE_VENTAS_CLIENTE (
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE DETALLE_VENTAS_VENDEDOR (
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE DETERIORO_CARTERA (
    FECHA DATE,
    DIAS INTEGER,
    TASA DOUBLE PRECISION)
RETURNS (
    NIT VARCHAR(20),
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    SALDO NUMERIC(18,2),
    DIASDOC INTEGER,
    DETERIORO NUMERIC(18,2))
AS
declare variable INCLANTI char(2);
declare variable NOMINAL double precision;
declare variable VPRESENTE double precision;
declare variable VENCE date;
declare variable AUX1 double precision;
declare variable AUX2 double precision;
begin
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA')
  returning_values (INCLANTI);
/* tasa diaria */
AUX1 = (1 + TASA / 100);
AUX2 = 1.0000 / 365.0000;
NOMINAL = power(AUX1, AUX2) - 1;
for select TERC_NIT from CLIENTES C where exists(select M.MVCL_ID from MOVIMIENTO_CLIENTES M
    where TERC_NIT = C.TERC_NIT and MVCL_FECHA <= :FECHA)
    into :NIT
    do
    begin
    for select MVCL_TIPOREF, MVCL_IDREF, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF from MOVIMIENTO_CLIENTES
      where MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and TERC_NIT = :NIT and (:FECHA - MVCL_VENCE) >= :DIAS
      into :TIPO, :ID, :VENCE, :PREF, :NUMERO
        do
        begin
        if ((INCLANTI = 'SI') or (TIPO <> 45)) then
            begin
            execute procedure SALDO_DOC_CARTERA(TIPO, ID, FECHA, 0) returning_values (SALDO);
            if (SALDO <> 0) then
                begin
                DIASDOC = (:FECHA - :VENCE) - :DIAS;
                /* calcule el valor presente  */
                VPRESENTE = SALDO / (power((1 + NOMINAL), DIASDOC));
                DETERIORO = (SALDO - VPRESENTE);
                SUSPEND;
                end
            end
        end
    end
end^


ALTER PROCEDURE DEV_INVENTARIO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ARTI VARCHAR(20),
    IDDEV INTEGER,
    NUMDEV VARCHAR(10),
    IDFACT INTEGER,
    NUMFAC VARCHAR(10),
    IDREM INTEGER,
    NUMREM VARCHAR(10))
AS
declare variable numrows integer;
begin
for select arti_cod, mvar_idref, devt_factid, pref_pre || devt_numero
    from MOVIMIENTO_ARTICULO M, DEVOLUCIONES_VENTAS V
    WHERE MVAR_TIPODOC = 33 AND MVAR_IDREF = v.devt_id and mvar_fecha >= :fecini and mvar_fecha <= :fecfin
    into :arti, :iddev, :idfact, :numdev
    do
    begin
    numrem = '';
    idrem = 0;
    select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :idfact into :numrows;
    if (numrows = 0) then
        begin
        select max(cofa_iddes) from consolidado_faltantes
            where cofa_tipoori = 31 and cofa_idori = :idfact and cofa_tipodes = 32 and arti_cod = :arti and cofa_cantcr <> 0 into :idrem;
        select pref_pre || revt_numero from remisiones_venta where revt_id = :idrem into :numrem;
        end
    else
        begin
        select pref_pre || fact_numero from facturas where fact_id = :idfact into :numfac;
        end
    end
end^


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


ALTER PROCEDURE DEVOLCLI_SIN_CONTABILIDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
declare variable IDREF INTEGER;
BEGIN
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (PREF_PRE = :PREFIJO))
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idc = null;
  if (not exists (SELECT E.ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE ENCO_TIPOREF = 33 AND ENCO_IDREF = :ID AND E.enco_consec = D.enco_consec)) then
    BEGIN
    SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :ID into :idc;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= 100000;
    if (idc IS NOT NULL) then
        begin
        ESTADO = 'PROCESANDO';
        ERROR = NULL;
        SUSPEND;
        SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
        EXECUTE PROCEDURE contabil_devolcli_niif (:ID, :IDI, :idc) RETURNING_VALUES (:ERROR, VER);
        if ((ERROR = 0) or (error IS NULL)) then
            BEGIN
            SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E WHERE ENCO_TIPOREF = 33 AND ENCO_IDREF = :ID INTO :IDREF;
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
                SELECT :IDREF, 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 = :idc AND CNDE_ITEM >= 100000;
            UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDREF;
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        end
    END
  END
END^


ALTER PROCEDURE DEVOLCOMP_SIN_INVENTARIO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    IDF INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4))
AS
begin
FOR select F.dvco_id, F.PREF_PRE, DVCO_NUMERO, DVCO_FECHA, ARTI_COD, D.dvcd_desc, DVCD_UNIDAD, DVCD_CANT
    from devoluciones_compras f, devoluciones_compras_det d, PREFIJOS P
    where f.dvco_fecha >= :FECINI and dvco_fecha <= :FECFIN and f.dvco_id = d.dvco_id and f.dvco_anulado = 'N' and
    P.tido_cod = 24 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    not exists (select mvar_cons from movimiento_articulo m where m.mvar_tipodoc = 24 and m.mvar_idref = d.dvco_id and m.mvar_item = d.dvcd_item)
    order by f.dvco_fecha, f.dvco_id
    INTO :IDF, :PREF, :NUMERO, :FECHA, :ARTICULO, :DESCRIPCION, :UNIDAD, :cant
    DO
    BEGIN
    SUSPEND;
    END
end^


ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT 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_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    /* BORRE LA CONTABILIZACION ANTERIOR */
    DELETE FROM contabilizacion WHERE cntb_tiporef = 33 AND cntb_idref = :ID;
    SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
    if (IDI is NOT NULL) then
      BEGIN
      if (CN <> 'N') then
        EXECUTE PROCEDURE contabil_devolcli (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
      else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
      if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_devolcli_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
      if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
      ELSE
        ESTADO = 'ERROR';
      suspend;
      END
    end
  END
END^


ALTER PROCEDURE DEVOLUCIONES_SIN_INVENTARIO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    IDF INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4))
AS
begin
FOR select F.devt_id, F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_DESC, DVDE_UNIDAD, DVDE_CANT
    from devoluciones_ventas f, devoluciones_ventas_detalle d, PREFIJOS P
    where f.devt_fecha >= :FECINI and devt_fecha <= :FECFIN and f.devt_id = d.devt_id and f.devt_anulado = 'N' and
    P.tido_cod = 33 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    not exists (select mvar_cons from movimiento_articulo m where m.mvar_tipodoc = 33 and m.mvar_idref = d.devt_id and m.mvar_item = d.dvde_item)
    order by f.devt_fecha, f.devt_id
    INTO :IDF, :PREF, :NUMERO, :FECHA, :ARTICULO, :DESCRIPCION, :UNIDAD, :cant
    DO
    BEGIN
    SUSPEND;
    END
end^


ALTER PROCEDURE DEVOLVER_ITEM_NEGATIVOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    IDD INTEGER,
    ITEM INTEGER,
    FECHA DATE,
    PREFDEV VARCHAR(4),
    NUMERO VARCHAR(12),
    CODBAR VARCHAR(20),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable NIT VARCHAR(20);
declare variable SUCURSAL VARCHAR(10);
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable ARTIC VARCHAR(20);
declare variable ACTUAL VARCHAR(8);
declare variable IVAINC CHAR(1);
declare variable NOMTERC VARCHAR(60);
declare variable BODEGA VARCHAR(2);
declare variable USUARIO VARCHAR(10);
declare variable LOTE VARCHAR(15);
declare variable TIVA INTEGER;
declare variable PORIVA NUMERIC(9,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable DESCR VARCHAR(60);
declare variable LIPR INTEGER;
begin
FOR SELECT pref_pre, F.FACT_ID, TERC_NIT, FACT_SUCURSAL, VEND_COD, PTVT_ID, FACT_FECHA, PREF_PRE || FACT_NUMERO, F.fact_nomcliente, F.fact_usuario,
    FADE_ITEM, FD.BODE_COD, ARTI_COD, FADE_CODBAR, FADE_DESC, FADE_CANT*-1, FADE_UNIDAD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_TIVA, fade_ivaporc, FADE_IVAMONTO*-1, FADE_CONSUMO*-1, FADE_TOTAL*-1
    FROM FACTURAS_DETALLE FD, FACTURAS F
    WHERE F.FACT_ID = FD.fact_id AND FD.fade_cant < 0 AND F.fact_anulado = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
    ORDER BY FD.FACT_ID, FD.FADE_ITEM
    INTO :prefdev, :ID, :NIT, :SUCURSAL, VEND, :PTVT, :FECHA, :NUMERO, :NOMTERC, :USUARIO,
    :ITEM, :BODEGA, :ARTIC, :CODBAR, :DESCR, :CANT, :UNIDAD, :LOTE, :LIPR, :PRUNIT, :TIVA, :PORIVA, :IVAMONTO, :CONSUMO, :TOTAL
    DO
    BEGIN
    UPDATE FACTURAS_DETALLE SET FADE_DEVUELTO = 0
        WHERE FACT_ID = :ID AND FADE_CANT > 0 AND ARTI_COD = :ARTIC;
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 33 AND PREF_PRE = :prefdev INTO :ACTUAL, :IVAINC;
    IDD = GEN_ID(id_devolcli, 1);
    insert into DEVOLUCIONES_VENTAS (DEVT_ID, VEND_COD, TERC_NIT, TIDO_COD, PREF_PRE, PTVT_ID, DEVT_NUMERO, DEVT_FECHA,
         DEVT_OBS, DEVT_IVAINC, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO,
         DEVT_EXTRA, DEVT_RTFTEPORC, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC,
         DEVT_RTICAMONTO, DEVT_ANULADO, DEVT_TRANSMIT, DEVT_TOTAL, DEVT_NOMTERC,
         DEVT_RTFTEMONTO, DEVT_DTOPOR, DEVT_DTOMONTO, BODE_COD, DEVT_FACTURA, DEVT_FACTID,
         DEVT_NROCOPIA, DEVT_CONSOLIDA, DEVT_USUARIO, DEVT_SUCURSAL, NUMOK, COBR_COD,
         DEVT_FACTOR, DEVT_REMISION, DEVT_REMID, DEVT_TRM, DEVT_DTOIT1, DEVT_DTOIT2,
         DEVT_DTOIT3, DEVT_CONFIRMACXC, DEVT_PEDIDO, DEVT_PEDID, DEVT_APLICA, DEVT_DEC2799,
         DEVT_RTCREE, DEVT_RTCREEM, DEVT_IDFMAR, DEVT_FLETE, DEVT_TRANSP, DEVT_VEHICULO,
         DEVT_VRFLETE, DEVT_DEVREM)
        VALUES( :IDD, :VEND, :NIT, 33, :prefdev, :PTVT, :ACTUAL, :FECHA, NULL, :IVAINC,
           0, 0, 0, :IVAMONTO, 0, 0, 0, 0, 0, 0, 'N', 'N', :TOTAL, :NOMTERC,
           0, 0, 0, :BODEGA, :numero, :ID, 0, 0, :usuario, :SUCURSAL, 'N', :VEND, 1, NULL, 0, 1, 0,
           0, 0, 'S', NULL, 0, 'N', 0, 0, 0, 0, 'N', NULL, NULL, 0, 'N');
     insert into DEVOLUCIONES_VENTAS_DETALLE (DEVT_ID, DVDE_ITEM, BODE_COD, ARTI_COD, DVDE_CANT, DVDE_UNIDAD, DVDE_LOTE,
        DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO,
        DVDE_CONSUMO, DVDE_FACTOR, DVDE_DESC, DVDE_OBS, DVDE_CODBAR, DVDE_TOTAL,
        DVDE_ANULADO, DVDE_TRANSMIT, DVDE_REFERENCIA, LOTE_VENCE, DVDE_FACTORLISTA,
        DVDE_DTO1, DVDE_DTO2, DVDE_DTO3, DVDE_DTOM1, DVDE_DTOM2, DVDE_DTOM3, DVDE_TIVA,
        DVDE_INALCP, DVDE_INACM, LIPR_COD)
         values (:IDD, :ITEM, :bodega, :artic, :CANT, :UNIDAD, :LOTE, :PRUNIT, 0,
             0, :PORIVA, :IVAMONTO, :CONSUMO, 1, :DESCR, NULL, :CODBAR,
             :TOTAL, 'N', 'N', NULL, '2017/12/31', 0, 0, 0, 0, 0, 0, 0, :TIVA, 0, 0, :LIPR);
    SUSPEND;
    END
end^


ALTER PROCEDURE DIA_FECHA (
    FECHA CHAR(8))
RETURNS (
    DIA CHAR(2))
AS
BEGIN
DIA = SUBSTR(FECHA, 7, 8);
SUSPEND;
END^


ALTER PROCEDURE DIAS_ENTRE_NOMINA (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    DIAS INTEGER)
AS
declare variable ANOINI INTEGER;
declare variable MESINI INTEGER;
declare variable DIAINI INTEGER;
declare variable ANOFIN INTEGER;
declare variable MESFIN INTEGER;
declare variable DIAFIN INTEGER;
declare variable FINMES INTEGER;
declare variable ffinmes DATE;
begin
ANOINI = EXTRACT(YEAR FROM FECINI);
MESINI = EXTRACT(MONTH FROM FECINI);
DIAINI = EXTRACT(DAY FROM FECINI);
ANOFIN = EXTRACT(YEAR FROM FECFIN);
MESFIN = EXTRACT(MONTH FROM FECFIN);
DIAFIN = EXTRACT(DAY FROM FECFIN);
execute proCedure fecha_final_periodo_pago(1, ANOFIN, MESFIN) returning_values (ffinmes);
FINMES = EXTRACT(DAY FROM ffinmes);
if (DIAFIN = FINMES) then
    DIAFIN = 30;
DIAS = (ANOFIN - ANOINI) * 360 + (MESFIN-MESINI) * 30 + (DIAFIN - DIAINI) + 1;
suspend;
end^


ALTER PROCEDURE DIAS_LABORADOS (
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1),
    CONCEPTO INTEGER)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
declare variable diasinc char(1);
declare variable diaslinr char(2);
declare variable APORTE char(1);
declare variable PROVISION char(1);
declare variable GASTO char(1);
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable fecini date;
declare variable licnr integer;
declare variable DIA integer;
declare variable PAGONOM CHAR(2);
declare variable PAGOVAC CHAR(2);
declare variable DIASVAC INTEGER;
declare variable FECINIV DATE;
declare variable FECHAI DATE;
declare variable DIADOM CHAR(1);
declare variable DIASDOM INTEGER;
declare variable SEMANA INTEGER;
declare variable SEMANAUX INTEGER;
declare variable PERINI INTEGER;
declare variable PERFIN INTEGER;
declare variable PERVAC INTEGER;
BEGIN
SELECT E.empl_ppago, E.empl_fecing FROM EMPLEADOS E WHERE TERC_NIT = :nitempl INTO :perpago, :fecing;
IF (mensual = 'N') THEN
    BEGIN
    PERINI = PERIODO;
    PERFIN = PERIODO;
    IF (perpago = 1) THEN
        BEGIN
        diaslabxper = 30;
        END
    ELSE
        IF (perpago = 2) THEN
            BEGIN
            diaslabxper = 15;
            END
        ELSE
            IF (perpago = 3) THEN
                BEGIN
                diaslabxper = 7;
                END
    END
ELSE
    BEGIN
    diaslabxper = 30;
    IF (perpago = 1) THEN
        BEGIN
        PERINI = PERIODO;
        PERFIN = PERIODO;
        END
    ELSE
        IF (perpago = 2) THEN
            BEGIN
            PERINI =  (extract(month from :FEC) * 2) -1;
            PERFIN =  (extract(month from :FEC) * 2);
            END
        ELSE
            IF (perpago = 3) THEN
                BEGIN
                PERINI =  (extract(month from :FEC) * 4) -3;
                PERFIN =  (extract(month from :FEC) * 4);
                END
    END
/* AJUSTE LOS DIAS EN EL PERIODO INICIAL DE TRABAJO */
execute procedure fecha_inicial_periodo_pago(:perpago, extract(YEAR from fec), :perini) returning_values (fecini);
if (fecing > fecini) then
    BEGIN
    DIA = extract (DAY FROM FECING);
    if (DIA > diaslabxper) then /* QUINCENA O 1A SEMANA */
        if ((perpago = 1) or (MENSUAL = 'S')) then
            DIA = 30;
        ELSE
            DIA = DIA - diaslabxper;
    if (perpago = 2) then
        BEGIN
        if (DIA > diaslabxper) then
            DIA = 15;
        END
    ELSE
        BEGIN
        if (DIA > diaslabxper) then /* 2A SEMANA */
            DIA = DIA - diaslabxper;
        if (DIA > diaslabxper) then /* 3A SEMANA */
            DIA = DIA - diaslabxper;
        END
    diaslabxper = diaslabxper - DIA + 1;
    END
if (CONCEPTO <> 0) then
    BEGIN
    /* SI NO ES EPS A CARGO DEL EMPLEADOR DESCUENTE LAS SUSPENCIONES */
    if ((CONCEPTO <> 914) AND (CONCEPTO <> 938) AND (CONCEPTO <> 915) AND (CONCEPTO <> 976) AND (CONCEPTO <> 1016) AND
        (CONCEPTO <> 905) AND (CONCEPTO <> 906) AND (CONCEPTO <> 934) AND (CONCEPTO <> 1012)) then
        begin
        SELECT SUM (ND.nnde_duracion), max(n.nono_dominical) 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 = 13))
            AND ND.nnde_ano = substr(:FEC,1,4) AND (ND.nnde_periodo >= :perini) AND (ND.nnde_periodo <= :perfin)
            INTO :LICNR, :diadom;
        if (licnr IS NULL) then
            licnr = 0;
        if (DIADOM = 'S') then
            BEGIN
            DIASDOM = 0;
            SEMANAUX = 0;
            FOR SELECT EXTRACT(WEEK FROM N.nono_fecha) FROM nomina_novedades N, nomina_novedades_detalle ND
                WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitempl AND (N.TNOV_COD = 13)
                AND ND.nnde_ano = substr(:FEC,1,4) AND (ND.nnde_periodo >= :perini) AND (ND.nnde_periodo <= :perfin)
                ORDER BY N.nono_fecha INTO :SEMANA
                DO
                BEGIN
                if (SEMANA <> SEMANAUX) then
                    DIASDOM = DIASDOM + 1;
                SEMANAUX = SEMANA;
                END
            END
        ELSE
            DIASDOM = 0;
        LICNR = LICNR + DIASDOM;
        end
    else
        LICNR = 0;
    execute procedure lee_configuracion('NOMINA', 'LIQUIDACION', 'LIQUIDAR APORTES SOBRE DIAS EN LICENCIA NO REMUNERADA') returning_values (:diaslinr);
    SELECT CONC_APORTE, CONC_PROV, conc_diasinc, conc_gtoempr, conc_pagovac FROM CONCEPTOS_NOMINA WHERE CONC_COD = :CONCEPTO
        INTO :APORTE, :PROVISION, :diasinc, :gasto, :pagovac;
    if ((APORTE = 'N') or (DIASLINR <> 'SI')) then
        if (diaslabxper >= licnr) then
            diaslabxper =  :diaslabxper - :licnr;
        ELSE
            diaslabxper = 0;
    if (diasinc = 'N') 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 = 2) OR
            (TNOV_COD =3) OR (TNOV_COD = 4) OR (N.TNOV_COD = 12)) AND ND.nnde_ano = extract(year from :FEC)
            AND (ND.nnde_periodo >= :perini) AND (ND.nnde_periodo <= :perfin)
            INTO :diasnolab;
        end
    if (diasnolab IS NULL) then
        diasnolab = 0;
    /* SI SON VACACIONES Y NO SE PAGAN DENTRO DE LA NOMINA NORMAL VERIFIQUE SI SE PAGARON DIAS ANTERIORES DEL PERIODO */
    DIASVAC = 0;
    if (PAGOVAC = 'N') then
      FOR SELECT VACA_FECHA, D.vacd_dias, D.vacd_paganom, D.vacd_periodo FROM VACACIONES V, vacaciones_detalle D
        WHERE V.vaca_id = D.vaca_id AND V.TERC_NIT = :nitempl AND D.vacd_periodicidad = :perpago AND D.vacd_ano = extract(year from :FEC)
        AND (D.vacd_periodo >= :perini) AND (D.vacd_periodo <= :perfin)
        AND V.vaca_disfr = 'S'
        INTO :FECINIV, :diasvac, :PAGONOM, :PERVAC
        DO
        BEGIN
        if (FECINIV <= FEC) then    /* no tenga en cuenta periodos posteriores a la liquidación */
            BEGIN
            if (DIASVAC IS NULL) then
                DIASVAC = 0;
            if ((PAGONOM = 'N') AND (GASTO = 'N') and (((perpago = 1) and (periodo <= 12)) or ((perpago = 2) and (periodo <= 24)) or ((perpago = 4) and (periodo <= 54)))) then
                BEGIN
                execute procedure fecha_inicial_periodo_pago (:perpago, extract(year from :FEC), :pervac) returning_values (:fechai);
                if (FECINIV > FECHAI) then
                    DIASVAC = DIASVAC + (FECINIV - FECHAI);
                DIASNOLAB = DIASNOLAB + DIASVAC;
                END
            else
                if (PROVISION = 'N') then
                    DIASNOLAB = DIASNOLAB + DIASVAC;
            END
        END
    if (diaslabxper >= diasnolab) then
        diaslabxper =  :diaslabxper - :diasnolab;
    else
        diaslabxper = 0;
    END
totaldiaslab =  :diaslabxper;
SUSPEND;
END^


ALTER PROCEDURE DIAS_LABORADOS_LIQ (
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1),
    CONCEPTO INTEGER)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
declare variable diasinc char(1);
declare variable diaslinr char(2);
declare variable APORTE char(1);
declare variable GASTO char(1);
declare variable diasnolab integer;
declare variable diaslab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable licnr integer;
declare variable DIA integer;
declare variable PAGOVAC CHAR(2);
declare variable DIASVAC INTEGER;
declare variable FECINIV DATE;
declare variable FECHAI DATE;
declare variable FECHAF DATE;
declare variable DIADOM CHAR(2);
declare variable DIASDOM INTEGER;
declare variable SEMANA INTEGER;
declare variable SEMANAUX INTEGER;
declare variable PERINI INTEGER;
declare variable PERFIN INTEGER;
declare variable SEPAGAENVAC CHAR(1);
declare variable DIASPAG INTEGER;
declare variable PERING INTEGER;
declare variable ANOING INTEGER;
BEGIN
SELECT E.empl_ppago, E.empl_fecing FROM EMPLEADOS E WHERE TERC_NIT = :nitempl INTO :perpago, :fecing;
EXECUTE PROCEDURE periodo_nom_fechaf(fecing, perpago) returning_values (:pering, :anoing);
IF (mensual = 'N') THEN
    BEGIN
    PERINI = PERIODO;
    PERFIN = PERIODO;
    IF (perpago = 1) THEN
        BEGIN
        diaslabxper = 30;
        END
    ELSE
        IF (perpago = 2) THEN
            BEGIN
            diaslabxper = 15;
            END
        ELSE
            IF (perpago = 3) THEN
                BEGIN
                diaslabxper = 7;
                END
    END
ELSE
    BEGIN
    diaslabxper = 30;
    IF (perpago = 1) THEN
        BEGIN
        PERINI = PERIODO;
        PERFIN = PERIODO;
        END
    ELSE
        IF (perpago = 2) THEN
            BEGIN
            PERINI =  (extract(month from :FEC) * 2) -1;
            PERFIN =  (extract(month from :FEC) * 2);
            END
        ELSE
            IF (perpago = 3) THEN
                BEGIN
                PERINI =  (extract(month from :FEC) * 4) -3;
                PERFIN =  (extract(month from :FEC) * 4);
                END
    END
/* AJUSTE LOS DIAS EN EL PERIODO INICIAL DE TRABAJO */
if ((extract(YEAR from :fec) = :anoing) AND (PERINI <= PERING)) then
    BEGIN
    DIA = extract (DAY FROM FECING);
    if (DIA > diaslabxper) then /* QUINCENA O 1A SEMANA */
        DIA = DIA - diaslabxper;
    if (DIA > diaslabxper) then /* 2A SEMANA */
        DIA = DIA - diaslabxper;
    if (DIA > diaslabxper) then /* 3A SEMANA */
        DIA = DIA - diaslabxper;
    diaslab = diaslabxper - DIA + 1;
    END
else
    diaslab = diaslabxper;
if (CONCEPTO <> 0) then
    BEGIN
    /* DESCUENTE LOS DIAS YA PAGADOS */
    if (exists (SELECT n.nomi_id FROM NOMINA N, nomina_conceptos NC, conceptos_nomina CN
        WHERE N.nomi_id = NC.nomi_id AND NC.CONC_COD = :concepto AND N.nomi_ano = substr(:FEC,1,4) AND CN.conc_cod = NC.conc_cod
        AND (N.nomi_periodo >= :PERINI) AND (N.nomi_periodo <= :PERFIN) AND NC.terc_nit = :nitempl AND CN.conc_dias = 'S')) Then
        diaspag = diaslab;
    IF (DIASPAG IS NULL) THEN
        DIASPAG = 0;
    diaslab =  :diaslab - :diaspag;
    /* SI NO ES EPS A CARGO DEL EMPLEADOR DESCUENTE LAS SUSPENCIONES */
    if ((CONCEPTO <> 914) AND (CONCEPTO <> 938) AND (CONCEPTO <> 915) AND (CONCEPTO <> 976)) then
        begin
        SELECT SUM (ND.nnde_duracion), MAX(NONO_DOMINICAL) 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 = 13))
            AND ND.nnde_ano = substr(:FEC,1,4) AND (ND.nnde_periodo >= :perini) AND (ND.nnde_periodo <= :perfin)
            INTO :LICNR, :DIADOM;
        if (licnr IS NULL) then
            licnr = 0;
        if (DIADOM = 'S') then
            BEGIN
            DIASDOM = 0;
            SEMANAUX = 0;
            FOR SELECT EXTRACT(WEEK FROM N.nono_fecha) 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 = 13))
                AND ND.nnde_ano = substr(:FEC,1,4) AND ((ND.nnde_periodo = :periodo) OR
                 ((:mensual = 'S') AND (ND.nnde_periodo = :periodo - 1))) ORDER BY N.nono_fecha INTO :SEMANA
                DO
                BEGIN
                if (SEMANA <> SEMANAUX) then
                    DIASDOM = DIASDOM + 1;
                SEMANAUX = SEMANA;
                END
            END
        ELSE
            DIASDOM = 0;
        LICNR = LICNR + DIASDOM;
        end
    else
        LICNR = 0;
    execute procedure lee_configuracion('NOMINA', 'LIQUIDACION', 'LIQUIDAR APORTES SOBRE DIAS EN LICENCIA NO REMUNERADA') returning_values (:diaslinr);
    SELECT CONC_APORTE, CONC_GTOEMPR, CONC_PAGOVAC FROM CONCEPTOS_NOMINA
        WHERE CONC_COD = :CONCEPTO INTO :APORTE, :GASTO, :SEPAGAENVAC;

    if ((APORTE = 'N') or ((DIASLINR <> 'SI') AND (GASTO = 'N'))) then
        if (diaslab >= licnr) then
            diaslab =  :diaslab - :licnr;
        ELSE
            diaslab = 0;
    /* DESCUENTE LAS INCAPACIDADES Y LICENCIAS DE MATERNIDAD Y REMUNERADAS */
    select conc_diasinc from conceptos_nomina where conc_cod = :concepto into :diasinc;
    if (diasinc = 'N') 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 = 2) OR
            (TNOV_COD =3) OR (TNOV_COD = 4) OR (N.TNOV_COD = 12)) AND ND.nnde_ano = extract(year from :FEC)
            AND (ND.nnde_periodo >= :perini) AND (ND.nnde_periodo <= :perfin)
            INTO :diasnolab;
        end
    if (diasnolab IS NULL) then
        diasnolab = 0;
    /* SI SON VACACIONES Y NO SE PAGAN DENTRO DE LA NOMINA NORMAL VERIFIQUE SI SE PAGARON DIAS ANTERIORES DEL PERIODO */
    DIASVAC = 0;
    FOR SELECT VACA_FECHA, D.vacd_dias, D.vacd_paganom FROM VACACIONES V, vacaciones_detalle D
        WHERE V.vaca_id = D.vaca_id AND V.TERC_NIT = :nitempl AND D.vacd_periodicidad = :perpago AND D.vacd_ano = extract(year from :FEC)
        AND (D.vacd_periodo >= :perini) AND (D.vacd_periodo <= :perfin)
        AND V.vaca_disfr = 'S'
        INTO :FECINIV, :diasvac, :PAGOVAC
        DO
        BEGIN
        if (DIASVAC IS NULL) then
            DIASVAC = 0;
/*      YA LOS AJUSTO AL DESCONTAR LOS PREVIAMENTE PAGADOS
        if ((PAGOVAC = 'N') and (((perpago = 1) and (periodo <= 12)) or ((perpago = 2) and (periodo <= 24)) or ((perpago = 4) and (periodo <= 54)))) then
            BEGIN
            execute procedure fecha_inicial_periodo_pago (:perpago, extract(year from :FEC), :perini) returning_values (:fechai);
            if (FECINIV > FECHAI) then
                DIASVAC = DIASVAC + (FECINIV - FECHAI);
            END */
        if (SEPAGAENVAC = 'N') then
            DIASNOLAB = DIASNOLAB + DIASVAC;
        END

    if (diaslab >= diasnolab) then
        diaslab =  :diaslab - :diasnolab;
    else
        diaslab = 0;
    END
execute procedure fecha_final_periodo_pago (:perpago, extract(year from :FEC), :periodo) returning_values (:fechaf);
execute procedure fecha_inicial_periodo_pago (:perpago, extract(year from :FEC), :perini) returning_values (:fechai);
if (fechaf > fec) then
    totaldiaslab = (FEC - fechai + 1) - (diaslabxper - diaslab);
ELSE
    totaldiaslab = diaslab;
if (totaldiaslab > diaslabxper) then
    totaldiaslab = diaslabxper;
SUSPEND;
END^


ALTER PROCEDURE DIAS_LABORADOS_SINV (
    NITEMPL VARCHAR(20),
    PERIODO INTEGER,
    FEC DATE,
    MENSUAL CHAR(1),
    CONCEPTO INTEGER)
RETURNS (
    TOTALDIASLAB INTEGER)
AS
declare variable diasinc char(1);
declare variable diaslinr char(2);
declare variable APORTE char(1);
declare variable PROVISION char(1);
declare variable GASTO char(1);
declare variable diasnolab integer;
declare variable diaslabxper integer;
declare variable perpago integer;
declare variable fecing date;
declare variable fecini date;
declare variable licnr integer;
declare variable DIA integer;
declare variable PAGONOM CHAR(2);
declare variable PAGOVAC CHAR(2);
declare variable DIASVAC INTEGER;
declare variable FECINIV DATE;
declare variable FECHAI DATE;
declare variable DIADOM CHAR(2);
declare variable DIASDOM INTEGER;
declare variable SEMANA INTEGER;
declare variable SEMANAUX INTEGER;
declare variable PERINI INTEGER;
declare variable PERFIN INTEGER;
declare variable PERVAC INTEGER;
BEGIN
SELECT E.empl_ppago, E.empl_fecing FROM EMPLEADOS E WHERE TERC_NIT = :nitempl INTO :perpago, :fecing;
IF (mensual = 'N') THEN
    BEGIN
    PERINI = PERIODO;
    PERFIN = PERIODO;
    IF (perpago = 1) THEN
        BEGIN
        diaslabxper = 30;
        END
    ELSE
        IF (perpago = 2) THEN
            BEGIN
            diaslabxper = 15;
            END
        ELSE
            IF (perpago = 3) THEN
                BEGIN
                diaslabxper = 7;
                END
    END
ELSE
    BEGIN
    diaslabxper = 30;
    IF (perpago = 1) THEN
        BEGIN
        PERINI = PERIODO;
        PERFIN = PERIODO;
        END
    ELSE
        IF (perpago = 2) THEN
            BEGIN
            PERINI =  (extract(month from :FEC) * 2) -1;
            PERFIN =  (extract(month from :FEC) * 2);
            END
        ELSE
            IF (perpago = 3) THEN
                BEGIN
                PERINI =  (extract(month from :FEC) * 4) -3;
                PERFIN =  (extract(month from :FEC) * 4);
                END
    END
/* AJUSTE LOS DIAS EN EL PERIODO INICIAL DE TRABAJO */
execute procedure fecha_inicial_periodo_pago(:perpago, extract(YEAR from fec), :perini) returning_values (fecini);
if (fecing > fecini) then
    BEGIN
    DIA = extract (DAY FROM FECING);
    if (DIA > diaslabxper) then /* QUINCENA O 1A SEMANA */
        if ((perpago = 1) or (MENSUAL = 'S')) then
            DIA = 30;
        ELSE
            DIA = DIA - diaslabxper;
    if (perpago = 2) then
        BEGIN
        if (DIA > diaslabxper) then
            DIA = 15;
        END
    ELSE
        BEGIN
        if (DIA > diaslabxper) then /* 2A SEMANA */
            DIA = DIA - diaslabxper;
        if (DIA > diaslabxper) then /* 3A SEMANA */
            DIA = DIA - diaslabxper;
        END
    diaslabxper = diaslabxper - DIA + 1;
    END
if (CONCEPTO <> 0) then
    BEGIN
    /* SI NO ES EPS A CARGO DEL EMPLEADOR DESCUENTE LAS SUSPENCIONES */
    if ((CONCEPTO <> 914) AND (CONCEPTO <> 938) AND (CONCEPTO <> 915) AND (CONCEPTO <> 976)) 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 ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
            AND ND.nnde_ano = substr(:FEC,1,4) AND (ND.nnde_periodo >= :perini) AND (ND.nnde_periodo <= :perfin)
            INTO :LICNR;
        if (licnr IS NULL) then
            licnr = 0;
        execute procedure lee_configuracion ('NOMINA', 'LIQUIDACION', 'DESCONTAR DOMINICAL EN SANCIONES POR DIAS NO LABORADOS') returning_values (:diadom);
        if (DIADOM = 'SI') then
            BEGIN
            DIASDOM = 0;
            SEMANAUX = 0;
            FOR SELECT EXTRACT(WEEK FROM N.nono_fecha) FROM nomina_novedades N, nomina_novedades_detalle ND
                WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitempl AND (N.TNOV_COD = 13)
                AND ND.nnde_ano = substr(:FEC,1,4) AND (ND.nnde_periodo >= :perini) AND (ND.nnde_periodo <= :perfin)
                ORDER BY N.nono_fecha INTO :SEMANA
                DO
                BEGIN
                if (SEMANA <> SEMANAUX) then
                    DIASDOM = DIASDOM + 1;
                SEMANAUX = SEMANA;
                END
            END
        ELSE
            DIASDOM = 0;
        LICNR = LICNR + DIASDOM;
        end
    else
        LICNR = 0;
    execute procedure lee_configuracion('NOMINA', 'LIQUIDACION', 'LIQUIDAR APORTES SOBRE DIAS EN LICENCIA NO REMUNERADA') returning_values (:diaslinr);
    SELECT CONC_APORTE, CONC_PROV, conc_diasinc, conc_gtoempr, conc_pagovac FROM CONCEPTOS_NOMINA WHERE CONC_COD = :CONCEPTO
        INTO :APORTE, :PROVISION, :diasinc, :gasto, :pagovac;
    if ((APORTE = 'N') or ((DIASLINR <> 'SI') AND (GASTO = 'N'))) then
        if (diaslabxper >= licnr) then
            diaslabxper =  :diaslabxper - :licnr;
        ELSE
            diaslabxper = 0;
    if (diasinc = 'N') 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 = 2) OR
            (TNOV_COD =3) OR (TNOV_COD = 4) OR (N.TNOV_COD = 12)) AND ND.nnde_ano = extract(year from :FEC)
            AND (ND.nnde_periodo >= :perini) AND (ND.nnde_periodo <= :perfin)
            INTO :diasnolab;
        end
    if (diasnolab IS NULL) then
        diasnolab = 0;
    if (diaslabxper >= diasnolab) then
        diaslabxper =  :diaslabxper - :diasnolab;
    else
        diaslabxper = 0;
    END
totaldiaslab =  :diaslabxper;
SUSPEND;
END^


ALTER PROCEDURE DIAS_LIQUIDACION (
    EMPL VARCHAR(20),
    FECHA DATE)
RETURNS (
    DIAS INTEGER)
AS
declare variable PERIODICIDAD INTEGER;
declare variable PERIODO INTEGER;
declare variable ANO CHAR(4);
declare variable CONC INTEGER;
begin
SELECT E.empl_ppago FROM empleados E WHERE TERC_NIT = :empl INTO :periodicidad;
SELECT FIRST 1 CONC_COD FROM EMPLEADO_CONCEPTOS WHERE TERC_NIT = :empl AND ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903) or (CONC_COD = 1011) OR
    (CONC_COD = 971) or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 974) OR (CONC_COD = 980) or (CONC_COD = 981) or (CONC_COD = 1023))
    INTO :CONC;
EXECUTE PROCEDURE PERIODO_NOM_FECHAF(:FECHA, :periodicidad) returning_values (:periodo, :ano);
EXECUTE PROCEDURE dias_laborados_liq(:empl, :periodo, :fecha, 'N', :CONC) returning_values (:DIAS);
suspend;
end^


ALTER PROCEDURE DIAS_MES (
    MES INTEGER,
    ANO INTEGER)
RETURNS (
    DIAS INTEGER)
AS
BEGIN
IF (MES > 12) THEN
  DIAS = 31;
ELSE
    BEGIN
  IF (MES < 8) THEN
    IF (MOD(MES, 2) = 1) THEN
      DIAS = 31;
    ELSE
      DIAS = 30;
  ELSE
    IF (MOD(MES, 2) = 1) THEN
      DIAS = 30;
    ELSE
      DIAS = 31;
   END
IF (MES = 2) THEN
  BEGIN
  DIAS = 28;
  IF (MOD(ANO, 4) = 0) THEN
    DIAS = 29;
  END
SUSPEND;
END^


ALTER PROCEDURE DIAS_VACACIONES (
    EMPLEADO VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ANO CHAR(4),
    PERIODO INTEGER,
    DIAS INTEGER)
AS
declare variable periodic INTEGER;
declare variable fecfinp DATE;
declare variable fecinip DATE;
declare variable DIASMAX INTEGER;
declare variable DIASINI INTEGER;
begin
SELECT E.empl_ppago, P.ppag_dias FROM empleados E, periodo_pago P
    WHERE TERC_NIT = :EMPLEADO AND P.ppag_cod = E.empl_ppago INTO :periodic, :DIASMAX;
/* LOS DIAS DEL PRIMER PERIODO */
EXECUTE PROCEDURE periodo_nom_fechaf (fecini,  :periodic) returning_values (:periodo, :ANO);
EXECUTE procedure fecha_inicial_periodo_pago(:periodic, :ANO, :periodo) returning_values (:FECINIP);
EXECUTE PROCEDURE dias_entre_nomina (:FECINIP, :FECINI) returning_values (:DIASINI);
DIASINI = DIASINI -1;
EXECUTE procedure fecha_final_periodo_pago(:periodic, :ANO, :periodo) returning_values (:FECFINP);
/* CALCULE LOS DIAS RESTANTES */
if (FECFINP > FECFIN) then
    BEGIN
    EXECUTE PROCEDURE dias_entre_nomina (:FECFIN, :FECFINP) returning_values (:DIAS);
    DIAS = DIASMAX - DIAS - DIASINI;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE dias_entre_nomina (:FECINI, :FECFINP) returning_values (:DIAS);
    if (DIAS < DIASMAX) then
        DIAS = DIAS - DIASINI + 1;
    END
suspend;
/* UN PERIODO MAS */
WHILE (FECFIN > FECFINP) DO
    BEGIN
    FECINI = FECFINP + 1;
    EXECUTE PROCEDURE periodo_nom_fechaf (fecini,  :periodic) returning_values (:periodo, :ANO);
    EXECUTE procedure fecha_final_periodo_pago(:periodic, :ANO, :periodo) returning_values (:FECFINP);
    if (FECFINP > FECFIN) then
        BEGIN
        EXECUTE PROCEDURE dias_entre_nomina (:FECFIN, :FECFINP) returning_values (:DIAS);
        DIAS = dias - 1;
        DIAS = DIASMAX - DIAS;
        END
    ELSE
        BEGIN
        EXECUTE PROCEDURE dias_entre_nomina (:FECINI, :FECFINP) returning_values (:DIAS);
        if (DIAS < DIASMAX) then
            DIAS = DIAS + 1;
        END
    SUSPEND;
    END
end^


ALTER PROCEDURE DIF_MOVBANCO_CONCILIACION (
    FECINI DATE,
    FECFIN DATE,
    CUENTA VARCHAR(3))
RETURNS (
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    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^


ALTER PROCEDURE DIFERENCIAS_ARTICULOS_BD (
    COMPANIA VARCHAR(3),
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    LISTA INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    DESCRIPCION2 VARCHAR(60),
    UNIDAD VARCHAR(8),
    UNIDAD2 VARCHAR(8),
    GRUPO VARCHAR(2),
    GRUPO2 VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    SUBGRUPO2 VARCHAR(3),
    MARCA VARCHAR(3),
    MARCA2 VARCHAR(3),
    ESTADO CHAR(1),
    ESTADO2 CHAR(1),
    PRECIO NUMERIC(18,2),
    PRECIO2 NUMERIC(18,2))
AS
declare variable CADSQL VARCHAR(1024);
declare variable SERVER VARCHAR(100);
declare variable USUARIO VARCHAR(10);
declare variable CLAVE VARCHAR(10);
begin
SELECT RPCO_SERVIDOR FROM replica_compania WHERE rpco_cod = :compania INTO :SERVER;
if (SERVER <> '') then
    BEGIN
    SERVER = SERVER || '\DATOS\' || :COMPANIA || '\SYSPLUS.FDB';
    EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'NOMBRE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (USUARIO);
    EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'CLAVE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (CLAVE);
    FOR SELECT ARTI_COD, ARTI_DES, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, ESAR_COD FROM ARTICULO
        WHERE ARTI_COD >= :artini AND ARTI_COD <= :artfin
        into :codigo, :descripcion, :grupo, :subgrupo, :marca, :unidad, :estado
        DO
        BEGIN
        descripcion2 = '';
        grupo2 = '';
        subgrupo2 = '';
        marca2 = '';
        estado2 = '';
        precio = 0;
        precio2 = 0;
        CADSQL = 'SELECT ARTI_DES, GRUP_COD, SUBG_COD, MARC_COD, ARTI_UNIDAD, ESAR_COD FROM ARTICULO WHERE ARTI_COD = ''' || :codigo || '''';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
        INTO :descripcion2, :grupo2, :subgrupo2, :marca2, :unidad2, :estado2;
        if ((descripcion <> descripcion2) or (grupo <> grupo2) or (subgrupo <> subgrupo2) or (marca <> marca2) or (unidad <> unidad2) or (estado <> estado2)) then
            BEGIN
            if (ESTADO2 <> ESTADO) then
                if (ESTADO2 = 'I') then
                    BEGIN
                    CADSQL = 'UPDATE ARTICULO SET ESAR_COD = ''' || :estado || ''' WHERE ARTI_COD = ''' || :codigo || '''';
                    EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE;
                    END
            suspend;
            END
        else
            begin
            SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = :LISTA AND ARTI_COD = :codigo INTO :precio;
            precio2 = 0;
            CADSQL = 'SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = ' || :LISTA || ' AND ARTI_COD = ''' || :codigo || '''';
            EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :PRECIO2;
            if (PRECIO <> PRECIO2) then
                SUSPEND;
            end
        END
    END
end^


ALTER PROCEDURE DIFERENCIAS_CONTEO (
    FECHA DATE,
    BODEGA VARCHAR(2),
    STAND VARCHAR(20))
RETURNS (
    ID1 INTEGER,
    ID2 INTEGER,
    ITEM INTEGER,
    ARTICULO VARCHAR(20),
    LOTE VARCHAR(20),
    CANT1 NUMERIC(18,2),
    CANT2 NUMERIC(18,2),
    DIF NUMERIC(18,2))
AS
declare variable EXIST CHAR(1);
begin
SELECT AJUS_ID FROM AJUSTES WHERE BODE_COD = :bodega AND AJUS_STAND = :STAND AND AJUS_FECHA = :FECHA AND AJUS_ANULADO = 'N' AND AJUS_PASADA = 0
    INTO :ID1;
SELECT AJUS_ID FROM AJUSTES WHERE BODE_COD = :bodega AND AJUS_STAND = :STAND AND AJUS_FECHA = :FECHA AND AJUS_ANULADO = 'N' AND AJUS_PASADA = 1
    INTO :ID2;
FOR SELECT MAX(AJUS_ITEM), MAX(D.ARTI_COD), SUM(AJUS_EXNUE * AJUS_FACTOR), MAX(A.arti_exist), MAX(D.ajus_lote)
    FROM ajustes_detalle D, ARTICULO A
    WHERE D.arti_cod = A.arti_cod AND AJUS_ID = :ID1
    GROUP BY D.ARTI_COD, d.ajus_lote
    INTO :ITEM , :ARTICULO, :CANT1, :exist, :lote
    DO
    BEGIN
    CANT2 = 0;
    if (exist = 'L') then
        SELECT SUM(AJUS_EXNUE*AJUS_FACTOR) FROM ajustes_detalle WHERE AJUS_ID = :ID2 AND ARTI_COD = :articulo and AJUS_LOTE = :LOTE INTO :CANT2;
    else
        SELECT SUM(AJUS_EXNUE*AJUS_FACTOR) FROM ajustes_detalle WHERE AJUS_ID = :ID2 AND ARTI_COD = :articulo INTO :CANT2;
    if (CANT2 IS NULL) then
        CANT2 = 0;

    if (CANT1 <> CANT2) then
        BEGIN
        DIF = CANT1 - CANT2;
        SUSPEND;
        END
    END
/* AGREGUE LOS QUE SOLO ESTAN EN LA SEGUNDA PASADA */
FOR SELECT AJUS_ITEM, D.ARTI_COD, AJUS_EXNUE * AJUS_FACTOR, A.arti_exist, D.ajus_lote FROM ajustes_detalle D, ARTICULO A
    WHERE D.arti_cod = A.arti_cod AND AJUS_ID = :ID2
    ORDER BY AJUS_ITEM
    INTO :ITEM , :ARTICULO, :CANT2, :exist, :lote
    DO
    BEGIN
    if (exist = 'L') then
        begin
        if (NOT EXISTS (SELECT AJUS_EXNUE FROM ajustes_detalle WHERE AJUS_ID = :ID1 AND ARTI_COD = :articulo and AJUS_LOTE = :LOTE)) then
            BEGIN
            CANT1 = 0;
            DIF = CANT2;
            SUSPEND;
            END
        end
    else
        begin
        if (NOT EXISTS (SELECT AJUS_EXNUE FROM ajustes_detalle WHERE AJUS_ID = :ID1 AND ARTI_COD = :articulo)) then
            BEGIN
            CANT1 = 0;
            DIF = CANT2;
            SUSPEND;
            END
        end
    END
end^


ALTER PROCEDURE DIFERENCIAS_TERCEROS_BD (
    COMPANIA VARCHAR(3),
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    NOMBRE2 VARCHAR(60))
AS
declare variable CADSQL VARCHAR(1024);
declare variable SERVER VARCHAR(100);
declare variable USUARIO VARCHAR(10);
declare variable CLAVE VARCHAR(10);
begin
SELECT RPCO_SERVIDOR FROM replica_compania WHERE rpco_cod = :compania INTO :SERVER;
if (SERVER <> '') then
    BEGIN
    SERVER = SERVER || '\DATOS\' || :COMPANIA || '\SYSPLUS.FDB';
    EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'NOMBRE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (USUARIO);
    EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'CLAVE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (CLAVE);
    FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS
        WHERE TERC_NIT >= :nitini AND TERC_NIT <= :nitfin
        into :nit, :nombre
        DO
        BEGIN
        nombre2 = '';
        CADSQL = 'SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = ''' || :nit || '''';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
        INTO :nombre2;
        if ((nombre <> nombre2)) then
            suspend;
        END
    END
end^


ALTER PROCEDURE DIGITO_CHEQUEO (
    CODIGO VARCHAR(20))
RETURNS (
    DIG 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 SUMA INTEGER;
declare variable PREF VARCHAR(12);
begin
execute procedure lee_configuracion('INVENTARIO', 'ARTICULOS', 'PREFIJO EAN13 PARA CREAR CODIGOS DE BARRAS') returning_values (PREF);
if (PREF <> '') then
    BEGIN
    CODIGO = PREF || CODIGO;
    LON = STRLEN(CODIGO);
    if (lon <> 12) then
        exception codigo_ean_incorrecto;
    N1 = CAST(SUBSTR(CODIGO,1,1) AS INTEGER);
    SUMA = N1;
    if (LON >= 2) then
        begin
        N2 = CAST(SUBSTR(CODIGO,2,2) AS INTEGER);
        SUMA = SUMA + N2*3;
        end
    if (LON >= 3) then
        begin
        N3 = CAST(SUBSTR(CODIGO,3,3) AS INTEGER);
        SUMA = SUMA + N3;
        end
    if (LON >= 4) then
        begin
        N4 = CAST(SUBSTR(CODIGO,4,4) AS INTEGER);
        SUMA = SUMA + N4*3;
        end
    if (LON >= 5) then
        begin
        N5 = CAST(SUBSTR(CODIGO,5,5) AS INTEGER);
        SUMA = SUMA + N5;
        end
    if (LON >= 6) then
        begin
        N6 = CAST(SUBSTR(CODIGO,6,6) AS INTEGER);
        SUMA = SUMA + N6*3;
        end
    if (LON >= 7) then
        begin
        N7 = CAST(SUBSTR(CODIGO,7,7) AS INTEGER);
        SUMA = SUMA + N7;
        end
    if (LON >= 8) then
        begin
        N8 = CAST(SUBSTR(CODIGO,8,8) AS INTEGER);
        SUMA = SUMA + N8*3;
        end
    if (LON >= 9) then
        begin
        N9 = CAST(SUBSTR(CODIGO,9,9) AS INTEGER);
        SUMA = SUMA + N9;
        end
    if (LON >= 10) then
        begin
        N10 = CAST(SUBSTR(CODIGO,10,10) AS INTEGER);
        SUMA = SUMA + N10*3;
        end
    if (LON >= 11) then
        begin
        N11 = CAST(SUBSTR(CODIGO,11,11) AS INTEGER);
        SUMA = SUMA + N11;
        end
    if (LON >= 12) then
        begin
        N12 = CAST(SUBSTR(CODIGO,12,12) AS INTEGER);
        SUMA = SUMA + N12*3;
        end
    DIG = 10 - MOD(SUMA, 10);
    if (DIG = 10) then
        DIG = 0;
    suspend;
    END
ELSE
    exception codigo_ean_incorrecto;
end^


ALTER PROCEDURE DIGITOS_NIVEL (
    NIVEL SMALLINT)
RETURNS (
    DIGITOS SMALLINT)
AS
BEGIN
  SELECT SUM(ESTR_DIGITOS) FROM ESTRUCTURA WHERE ESTR_NIVEL <= :NIVEL INTO :DIGITOS;
  SUSPEND;
END^


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


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^


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^


ALTER PROCEDURE DOCCOMPRA_X_IMPORT (
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    VALIDEZ INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL 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 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 = 139) THEN /* SOL IMPORT */
    BEGIN
    FOR SELECT S.slim_id, PREF_PRE, S.slim_numero, S.slim_fecha, S.slim_vence, s.slim_totmon
        FROM SOLICITUD_IMPORTACION S WHERE TERC_NIT = :NIT AND SLIM_FECHA <= :FECHA AND (SLIM_FECHA >= (:FECHA-:DIAS)) AND SLIM_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :SUBTOTAL
        DO
        BEGIN
        TOTAL = SUBTOTAL;
        VALIDEZ = VENCE - FECDOC;
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 139 AND COFA_IDORI = :id AND COFA_TIPODES <> :tipodes AND COFA_CANTCR <> 0)) then
            BEGIN
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FALTAT = 0;
                FOR SELECT SLDE_ITEM FROM solicitud_importacion_det WHERE SLIM_ID = :ID ORDER BY SLDE_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 = 132) THEN /* ORD EMBAR IMPORT */
    BEGIN
    FOR SELECT S.orem_id, S.pref_pre, S.orem_numero, S.orem_fecha
        FROM ORDEN_EMBARQUE s WHERE s.deto_nit = :NIT AND OREM_FECHA <= :FECHA AND (OREM_FECHA >= (:FECHA-:DIAS))/* AND SLIM_ANULADO = 'N'*/
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC DO
        BEGIN
        EXECUTE PROCEDURE total_doc_import(TIPODOC, ID) RETURNING_VALUES (SUBTOTAL);
        TOTAL = SUBTOTAL;
        VALIDEZ = VENCE - FECDOC;
        SUSPEND;
        END
    END
END^


ALTER PROCEDURE DOCCOMPRA_X_PROVEEDOR (
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NROPROV VARCHAR(15),
    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_TIPODES <> :tipodes AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            VALIDEZ = VENCE - FECDOC;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT FCDE_ITEM, (FCDE_CANT*FCDE_FACTOR-FCDE_DEVUELTO) FROM FACTURAS_COMPRAS_DETALLE
                    WHERE FACO_ID = :ID ORDER BY FCDE_ITEM INTO :ITEM, :FALTA DO
                    BEGIN
                    if (tipodes <> 24) then
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 22) then /* REMISION */
    BEGIN
    FOR SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA, 0, REPR_NUMPROV
        FROM remision_proveedor WHERE TERC_NIT = :NIT AND REPR_FECHA <= :FECHA AND (REPR_FECHA >= (:FECHA-:DIAS)) AND REPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 22 AND COFA_IDORI = :id AND COFA_TIPODES <> :tipodes AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT RPVD_ITEM FROM remision_proveedor_det WHERE REPR_ID = :ID ORDER BY RPVD_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 24) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, 0, DVCO_FACTID
        FROM DEVOLUCIONES_COMPRAS WHERE TERC_NIT = :NIT AND DVCO_FECHA <= :FECHA AND DVCO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :idf DO
        BEGIN
        nroprov = '';
        SELECT FACO_NUMPROV FROM facturas_compra WHERE FACO_ID = :idF INTO :nroprov;
        EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
if (TIPODOC = 23) then /* ORDEN */
    BEGIN
    FOR SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, ''
        FROM ORDENES_COMPRA WHERE TERC_NIT = :NIT AND ORDC_FECHA <= :FECHA AND ((ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA) AND ORDC_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 23 AND COFA_IDORI = :id AND COFA_TIPODES <> :tipodes AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FALTAT = 0;
                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_TIPODES <> :tipodes AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT 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^


ALTER PROCEDURE DOCUMENTOS_IMPORTACION (
    IDIMP INTEGER)
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(8),
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    FECHA DATE)
AS
begin
/* ordenes de compra internacional */
TIPO = 139;
SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 139 INTO :nomtipo;
FOR SELECT S.SLIM_ID, PREF_PRE, SLIM_NUMERO, SLIM_FECHA, S.terc_nit, S.slim_conc, S.slim_total, T.terc_nom
    FROM solicitud_importacion S, TERCEROS T WHERE S.slim_idimpor = :idimp AND S.slim_anulado = 'N' AND S.terc_nit = T.terc_nit
    INTO :ID, :PREFIJO, :NUMERO, :FECHA, :nit, :concepto, :monto, :nomterc
    DO
    SUSPEND;

/* factura internacional */
TIPO = 137;
SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 131 INTO :nomtipo;
FOR SELECT FP.fapo_id, FP.PREF_PRE, FP.fapo_numero, FP.fapo_fecha, FP.terc_nit, FP.fapo_conc, FP.fapo_total, T.terc_nom
    FROM factura_proforma FP, TERCEROS T WHERE FP.fapo_idimpor = :idimp AND FP.fapo_anulado = 'N' AND T.terc_nit = FP.terc_nit
    INTO :ID, :PREFIJO, :NUMERO, :FECHA, :nit, :concepto, :monto, :nomterc
    DO
    SUSPEND;

/* Gastos importacion */
TIPO = 138;
SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = 138 INTO :nomtipo;
FOR SELECT G.gain_id, G.gain_pref, G.gain_numero, g.gain_fecha, G.terc_nit, G.gain_conc, G.gain_valor, T.terc_nom
    FROM gastos_importacion G, TERCEROS T WHERE G.gain_idimpor = :idimp AND G.gain_anulado = 'N' AND T.terc_nit = G.terc_nit
    INTO :ID, :PREFIJO, :NUMERO, :FECHA, :nit, :concepto, :monto, :nomterc
    DO
    SUSPEND;
end^


ALTER PROCEDURE DOCUMENTOS_SERIAL (
    ARTICULO VARCHAR(20),
    SERIAL VARCHAR(30))
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(8),
    IDDOC INTEGER,
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    CODBOD VARCHAR(2),
    ENTRADA CHAR(1))
AS
declare variable ITEM INTEGER;
declare variable CODART VARCHAR(20);
begin
FOR SELECT S.tido_cod, S.sedo_iddoc, S.sedo_item, S.sedo_entrada, S.sedo_articulo
    FROM seriales_documento S
    WHERE ((S.sedo_articulo = :ARTICULO) or (:ARTICULO = '')) AND S.sedo_serial = :SERIAL
    INTO :TIPO, :IDDOC, :ITEM, :ENTRADA, :codart
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    FOR SELECT M.mvar_fecha, M.mvar_pref, M.mvar_numero, M.bode_cod FROM movimiento_articulo M
        WHERE ARTI_COD = :codart AND M.mvar_tipodoc = :TIPO AND M.mvar_idref = :IDDOC AND M.mvar_item = :ITEM
        INTO :FECHA, :PREF, :NUMERO, :CODBOD
        DO
        suspend;
    END
end^


ALTER PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR (
    FECINI DATE,
    FECFIN DATE,
    CONTADO CHAR(1),
    NIIF CHAR(1))
RETURNS (
    TIPO VARCHAR(10),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    ID INTEGER,
    TIDO INTEGER,
    CTABCO INTEGER)
AS
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable IDREF INTEGER;
declare variable CONTANIIF CHAR(1);
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, ENTR_CONC FROM ENTRADAS
    WHERE ENTR_ANULADO = 'N' AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
    INTO :ID, :concepto
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 11 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID
    INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA FROM ENTRADAS WHERE ENTR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'SALIDA';
TIDO = 12;
FOR SELECT SALI_ID, SALI_CONC FROM SALIDAS
    WHERE SALI_ANULADO = 'N' AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID, :concepto
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 12 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID 
    INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA FROM SALIDAS WHERE SALI_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'TRASLADO';
TIDO = 13;
FOR SELECT TRAN_ID, TRAN_CONC FROM TRASFERENCIAS
    WHERE TRAN_ANULADO = 'N' AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN
    INTO :ID, :concepto
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 13 AND ENCO_IDREF = :ID
    INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA FROM TRASFERENCIAS WHERE TRAN_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'AJUS INV.';
TIDO = 14;
FOR SELECT AJUS_ID, AJUS_CONC FROM AJUSTES
    WHERE AJUS_ANULADO = 'N' AND AJUS_NOAJUSTAR = 'N' AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN
    INTO :ID, :concepto
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 14 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'ENSAMBLE';
TIDO = 15;
FOR SELECT ENSA_ID, ENSA_CONC FROM ENSAMBLES
    WHERE ENSA_ANULADO = 'N' AND ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN
    INTO :ID, :concepto
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 15 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, ENSA_NUMERO, ENSA_FECHA FROM ENSAMBLES WHERE ENSA_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'DESENSAMB.';
TIDO = 16;
FOR SELECT DESE_ID, DESE_CONC FROM DESENSAMBLES
    WHERE DESE_ANULADO = 'N' AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN
    INTO :ID, :concepto
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 16 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, DESE_NUMERO, DESE_FECHA FROM DESENSAMBLES WHERE DESE_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'FAC.COMPRA';
TIDO = 21;
FOR SELECT FACO_ID, FACO_CONC FROM FACTURAS_COMPRA
    WHERE FACO_ANULADO = 'N' AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN
    INTO :ID, :concepto
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'REM.PROV.';
TIDO = 22;
FOR SELECT REPR_ID, REPR_CONC FROM remision_proveedor
    WHERE REPR_ANULADO = 'N' AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 22 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  if (IDREF IS NULL) then
    begin
    SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA FROM remision_proveedor WHERE REPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
    end
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA FROM remision_proveedor WHERE REPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'DEV.COMPRA';
TIDO = 24;
FOR SELECT DVCO_ID, DVCO_CONC FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_ANULADO = 'N' AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'FACT.VENTA';
TIDO = 31;
FOR SELECT FACT_ID, FACT_NOMCLIENTE FROM FACTURAS F
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
    ((:CONTADO = 'S') or (NOT EXISTS (SELECT PREF_PRE FROM AUTORIZACIONES WHERE PREF_PRE = F.pref_pre AND AUTO_CONTADO = 'S')))
    INTO :ID, :concepto
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'REM.CLIE.';
TIDO = 32;
FOR SELECT REVT_ID, REVT_NOMTERC FROM remisiones_venta
    WHERE REVT_ANULADO = 'N' AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 32 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  if (IDREF IS NULL) then
    begin
    SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
    end
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'DEV.VENTA';
TIDO = 33;
FOR SELECT DEVT_ID, DEVT_NOMTERC 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, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 33 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'NOTADB.CLI';
TIDO = 41;
FOR SELECT NDCL_ID, NDCL_CONC FROM NOTAS_DEBITO_CLIENTES
    WHERE NDCL_ANULADO = 'N' AND NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 41 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, NDCL_NUMERO, NDCL_FECHA FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'NOTACR.CLI';
TIDO = 42;
FOR SELECT NCCL_ID, NCCL_CONC FROM NOTAS_CREDITO_CLIENTES
    WHERE NCCL_ANULADO = 'N' AND NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 42 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, NCCL_NUMERO, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'APLICA CLI';
TIDO = 43;
FOR SELECT APCL_ID, APCL_CONCEPTO FROM aplicacion_cliente
    WHERE APCL_ANULADO = 'N' AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 43 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA FROM aplicacion_cliente WHERE APCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'CAUSA.CXP';
TIDO = 51;
FOR SELECT NDPR_ID, NDPR_CONC FROM NOTAS_DEBITO_PROVEEDOR
    WHERE NDPR_ANULADO = 'N' AND NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'DESCTO.CXP';
TIDO = 52;
FOR SELECT NCPR_ID, NCPR_CONC FROM NOTAS_CREDITO_PROVEEDOR
    WHERE NCPR_ANULADO = 'N' AND NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'APLICA PRV';
TIDO = 53;
FOR SELECT APPR_ID, APPR_CONC FROM aplicacion_provedor
    WHERE APPR_ANULADO = 'N' AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 53 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA FROM aplicacion_provedor WHERE APPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
/* EXCLUYA LOS DE PREFIJO PARA IGUAL VENTAS DE CONTADO */
TIPO = 'RECI.CAJA';
TIDO = 61;
FOR SELECT RECA_ID, RECA_CONC FROM RECIBOS_CAJA R
    WHERE RECA_ANULADO = 'N' AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND
    ((:CONTADO = 'S') or (NOT EXISTS (SELECT PREF_PRE FROM AUTORIZACIONES WHERE AUTO_PREFRDC = R.pref_pre AND AUTO_CONTADO = 'S')))
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 61 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA FROM RECIBOS_CAJA WHERE RECA_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'EGRESOS';
TIDO = 62;
FOR SELECT EGRE_ID, EGRE_CONC FROM EGRESOS
    WHERE EGRE_ANULADO = 'N' AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA FROM EGRESOS WHERE EGRE_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'CONS.TARJ.';
TIDO = 64;
FOR SELECT COTJ_ID, COTJ_CONCEPTO FROM CONSIGNA_TARJETAS
    WHERE COTJ_ANULADO = 'N' AND COTJ_FECHA >= :FECINI AND COTJ_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 64 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE,COTJ_NUMERO, COTJ_FECHA FROM CONSIGNA_TARJETAS WHERE COTJ_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'TR. CAJA';
TIDO = 66;
FOR SELECT TRCJ_ID, TRCJ_CONC FROM TRASLADOS_CAJA
    WHERE TRCJ_ANULADO = 'N' AND TRCJ_FECHA >= :FECINI AND TRCJ_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 66 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            SELECT PREF_PRE, TRCJ_NUMERO, TRCJ_FECHA FROM TRASLADOS_CAJA WHERE TRCJ_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
            suspend;
            END
        END
end
TIPO = 'CONSIGNA';
TIDO = 71;
FOR SELECT CONS_ID, CONS_CONCEPTO FROM CONSIGNA
    WHERE CONS_ANULADO = 'N' AND CONS_FECHA >= :FECINI AND CONS_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 71 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) 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
end
TIPO = 'CARGO BCO';
TIDO = 74;
FOR SELECT NDBC_ID, NDBC_CONCEPTO FROM NOTAS_DEBITO
    WHERE NDBC_ANULADO = 'N' AND NDBC_FECHA >= :FECINI AND NDBC_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 74 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) 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
end
TIPO = 'ABONO BCO';
TIDO = 75;
FOR SELECT NCBC_ID, NCBC_CONCEPTO FROM NOTAS_CREDITO
    WHERE NCBC_ANULADO = 'N' AND NCBC_FECHA >= :FECINI AND NCBC_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 75 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) 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
end
TIPO = 'TRAS.BANCO';
TIDO = 76;
FOR SELECT TRAS_ID, TRAS_CONCEPTO FROM TRASLADOS
    WHERE TRAS_ANULADO = 'N' AND TRAS_FECHA >= :FECINI AND TRAS_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 76 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) 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
end
TIPO = 'DEVOL.CHQ.';
TIDO = 77;
FOR SELECT DVCH_ID, DVCH_CONC FROM DEVOLUCION_CHEQUES
    WHERE DVCH_ANULADO = 'N' AND DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 77 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  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
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) 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
TIPO = 'NOMINA';
TIDO = 92;
CTABCO = NULL;
FOR SELECT max(N.NOMI_ID), max(N.NOMI_CONC) FROM nomina N, NOMINA_CONCEPTOS NC WHERE N.nomi_id = NC.nomi_id
    and NOMI_FECCAUSA >= :FECINI AND NOMI_FECCAUSA <= :FECFIN
    group by n.nomi_id
    INTO :ID, :CONCEPTO
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF, ENCO_CONTANIIF FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = 92 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF, :CONTANIIF;
  if (IDREF IS NULL) then
    begin
    if (EXISTS (SELECT NOMI_ID FROM nomina_departamento WHERE NOMI_ID = :ID)) then
        SELECT FIRST 1 NOMI_ANO, NOMI_TIPO || '-' || NOMI_PERIODO || '-' || ND.nodp_depto, NOMI_FECCAUSA
            FROM NOMINA N, nomina_departamento ND WHERE N.NOMI_ID = :ID AND ND.nomi_id = N.nomi_id
            INTO :PREFIJO, :NUMERO, :FECHA;
    else
        SELECT FIRST 1 NOMI_ANO, NOMI_TIPO || '-' || NOMI_PERIODO, NOMI_FECCAUSA
            FROM NOMINA N WHERE N.NOMI_ID = :ID
            INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
    end
  ELSE
    if (NIIF = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE_NIIF WHERE ENCO_CONSEC = :IDREF)) AND (:CONTANIIF = 'N')) THEN
            BEGIN
            if (EXISTS (SELECT NOMI_ID FROM nomina_departamento WHERE NOMI_ID = :ID)) then
                SELECT FIRST 1 NOMI_ANO, NOMI_TIPO || '-' || NOMI_PERIODO || '-' || ND.nodp_depto, NOMI_FECCAUSA
                    FROM NOMINA N, nomina_departamento ND WHERE N.NOMI_ID = :ID AND ND.nomi_id = N.nomi_id
                    INTO :PREFIJO, :NUMERO, :FECHA;
            else
                SELECT FIRST 1 NOMI_ANO, NOMI_TIPO || '-' || NOMI_PERIODO, NOMI_FECCAUSA
                    FROM NOMINA N WHERE N.NOMI_ID = :ID
                    INTO :PREFIJO, :NUMERO, :FECHA;
                    suspend;
                    END
        END
end
end^


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

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


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;
begin
LON = STRLEN(NIT);
N1 = CAST(SUBSTR(NIT,1,1) AS INTEGER);
SUMA = N1*3;
if (LON >= 2) then
    begin
    N2 = CAST(SUBSTR(NIT,2,2) AS INTEGER);
    SUMA = N2*3 + N1*7;
    end
if (LON >= 3) then
    begin
    N3 = CAST(SUBSTR(NIT,3,3) AS INTEGER);
    SUMA = N3*3 + N2*7 + N1*13;
    end
if (LON >= 4) then
    begin
    N4 = CAST(SUBSTR(NIT,4,4) AS INTEGER);
    SUMA = N4*3 + N3*7 + N2*13 + N1*17;
    end
if (LON >= 5) then
    begin
    N5 = CAST(SUBSTR(NIT,5,5) AS INTEGER);
    SUMA = N5*3 + N4*7 + N3*13 + N2*17 + N1*19;
    end
if (LON >= 6) then
    begin
    N6 = CAST(SUBSTR(NIT,6,6) AS INTEGER);
    SUMA = N6*3 + N5*7 + N4*13 + N3*17 + N2*19 + N1*23;
    end
if (LON >= 7) then
    begin
    N7 = CAST(SUBSTR(NIT,7,7) AS INTEGER);
    SUMA = N7*3 + N6*7 + N5*13 + N4*17 + N3*19 + N2*23 + N1*29;
    end
if (LON >= 8) then
    begin
    N8 = CAST(SUBSTR(NIT,8,8) AS INTEGER);
    SUMA = N8*3 + N7*7 + N6*13 + N5*17 + N4*19 + N3*23 + N2*29 + N1*37;
    end
if (LON >= 9) then
    begin
    N9 = CAST(SUBSTR(NIT,9,9) AS INTEGER);
    SUMA = N9*3 + N8*7 + N7*13 + N6*17 + N5*19 + N4*23 + N3*29 + N2*37 + N1*41;
    end
if (LON >= 10) then
    begin
    N10 = CAST(SUBSTR(NIT,10,10) AS INTEGER);
    SUMA = N10*3 + N9*7 + N8*13 + N7*17 + N6*19 + N5*23 + N4*29 + N3*37 + N2*41 + N1*43;
    end
if (LON >= 11) then
    begin
    N11 = CAST(SUBSTR(NIT,11,11) 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;
    end
if (LON >= 12) then
    begin
    N12 = CAST(SUBSTR(NIT,12,12) 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;
    end
if (LON >= 13) 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;
    end
if (LON >= 14) then
    begin
    N14 = CAST(SUBSTR(NIT,14,14) 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;
    end
if (LON >= 15) then
    begin
    N15 = CAST(SUBSTR(NIT,15,15) 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;
    end
if (LON >= 16) then
    begin
    N16 = CAST(SUBSTR(NIT,16,16) 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;
    end
if (LON >= 17) then
    begin
    N17 = CAST(SUBSTR(NIT,17,17) 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;
    end
if (LON >= 18) then
    begin
    N18 = CAST(SUBSTR(NIT,18,18) 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;
    end
if (LON >= 19) 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;
    end
if (LON >= 20) 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
DV = MOD(SUMA, 11);
if (DV > 1) Then
  DV = 11 - DV;
suspend;
end^


ALTER PROCEDURE EDITA_CLIENTE_MOVIL (
    NIT VARCHAR(20))
RETURNS (
    TERC_NIT VARCHAR(20),
    TERC_DV CHAR(1),
    TERC_TIPOID CHAR(1),
    TERC_NOM VARCHAR(60),
    TERC_DIR VARCHAR(60),
    TERC_CIU VARCHAR(60),
    TERC_TEL VARCHAR(60),
    TERC_CEL VARCHAR(60),
    TERC_FAX VARCHAR(60),
    TERC_EMAIL VARCHAR(60),
    TERC_APELLIDO1 VARCHAR(60),
    TERC_APELLIDO2 VARCHAR(60),
    TERC_NOMBRE1 VARCHAR(60),
    TERC_NOMBRE2 VARCHAR(60),
    TERC_CONTACTO VARCHAR(60),
    TERC_OBS VARCHAR(1024))
AS
begin
select t.terc_nit, terc_dv, terc_tipoid, terc_nom, terc_apellido1, terc_apellido2, terc_nombre1, terc_nombre2,
    terc_dir, terc_ciu, terc_tel, terc_cel, terc_fax, terc_email, terc_contacto, SUBSTRING(terc_obs FROM 1 FOR 1024)
    from terceros t, clientes c where t.terc_nit = c.terc_nit and t.terc_nit = :NIT
    INTO :terc_nit, :terc_dv, :terc_tipoid, :terc_nom, :terc_apellido1, :terc_apellido2, :terc_nombre1, :terc_nombre2,
    :terc_dir, :terc_ciu, :terc_tel, :terc_cel, :terc_fax, :terc_email, :terc_contacto, :terc_obs;
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_NOM) returning_values (TERC_NOM);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_APELLIDO1) returning_values (TERC_APELLIDO1);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_APELLIDO2) returning_values (TERC_APELLIDO2);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_NOMBRE1) returning_values (TERC_NOMBRE1);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_NOMBRE2) returning_values (TERC_NOMBRE2);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_DIR) returning_values (TERC_DIR);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_CIU) returning_values (TERC_CIU);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_TEL) returning_values (TERC_TEL);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_CEL) returning_values (TERC_CEL);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_FAX) returning_values (TERC_FAX);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_EMAIL) returning_values (TERC_EMAIL);
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_OBS) returning_values (TERC_OBS);
suspend;
end^


ALTER PROCEDURE EGRESOS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
declare variable idinte integer;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero, egre_idinter FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO, :idinte
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    if ((idinte <> 0) and (idinte is not null)) then
        IDI = IDINTE;
    else
        SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
    if (CN <> 'N') then
        EXECUTE PROCEDURE CONTABIL_EGRESO (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
    if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_egreso_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
    IF (ERROR = 0) THEN
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
      ELSE
        ESTADO = 'ERROR';
      suspend;
    end
  END
END^


ALTER PROCEDURE EMPLEADO_ACTIVO (
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    FECING DATE,
    FECRET DATE)
AS
declare variable INIMES DATE;
declare variable FECAUX DATE;
begin
INIMES = DATEADD (-EXTRACT(DAY FROM :FECHA)+1 DAY TO :FECHA);
SELECT MAX(INEM_FECHA) FROM ingresos_empleado WHERE TERC_NIT = :NIT AND INEM_INGRESO = 'S' AND INEM_FECHA < :INIMES
    INTO :FECING;
if (FECING IS NULL) then
    SELECT MAX(INEM_FECHA) FROM ingresos_empleado WHERE TERC_NIT = :NIT AND INEM_INGRESO = 'S' AND INEM_FECHA <= :FECHA
        INTO :FECING;

SELECT MAX(INEM_FECHA) FROM ingresos_empleado WHERE TERC_NIT = :NIT AND INEM_INGRESO = 'N' AND INEM_FECHA <= :FECHA
    INTO :fecret;
SELECT MAX(INEM_FECHA) FROM ingresos_empleado WHERE TERC_NIT = :NIT AND INEM_INGRESO = 'S' AND INEM_FECHA <= :FECHA
    INTO :FECAUX;
if (FECAUX > FECRET) then
    begin
    if ((FECRET < INIMES) AND (FECAUX > INIMES)) then
        FECING = FECAUX;
    FECRET = NULL;
    end
suspend;
end^


ALTER PROCEDURE ENSAMBLES_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT ENSA_ID, PREF_PRE, ENSA_NUMERO FROM ENSAMBLES WHERE ENSA_ANULADO = 'N' AND
    ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 15 INTO :IDI;
    if (CN <> 'N') then
      EXECUTE PROCEDURE CONTABIL_ENSAMBLE (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
    if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_ensamble_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
        ESTADO = 'ERROR';
    suspend;
    end
  end
END^


ALTER PROCEDURE ENSAMBLES_SIN_CONTABILIDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
declare variable IDREF INTEGER;
BEGIN
FOR SELECT ENSA_ID, PREF_PRE, ENSA_NUMERO FROM ensambles WHERE ENSA_ANULADO = 'N' AND
    ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN AND ((:PREFIJO = '') or (PREF_PRE = :PREFIJO))
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idc = null;
  if (not exists (SELECT E.ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE ENCO_TIPOREF = 15 AND ENCO_IDREF = :ID AND E.enco_consec = D.enco_consec)) then
    BEGIN
    SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 15 AND CNTB_IDREF = :ID into :idc;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= 100000;
    if (idc IS NOT NULL) then
        begin
        ESTADO = 'PROCESANDO';
        ERROR = NULL;
        SUSPEND;
        SELECT MAX(ININ_ID) FROM interfaz_inventario WHERE PREF_PRE = :PREF AND TIDO_COD = 15 INTO :IDI;
        EXECUTE PROCEDURE contabil_ensamble_niif (:ID, :IDI, :idc) RETURNING_VALUES (:ERROR, VER);
        if ((ERROR = 0) or (error IS NULL)) then
            BEGIN
            SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E WHERE ENCO_TIPOREF = 15 AND ENCO_IDREF = :ID INTO :IDREF;
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
                SELECT :IDREF, 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 = :idc AND CNDE_ITEM >= 100000;
            UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDREF;
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        end
    END
  END
END^


ALTER PROCEDURE ENTRADA_AJUSTE (
    IDAJUSTE INTEGER,
    PREFENT VARCHAR(4))
RETURNS (
    IDENT INTEGER)
AS
begin
IDENT = gen_id(id_entrada, 1);

INSERT INTO ENTRADAS (ENTR_ID, TIDO_COD, PREF_PRE, BODE_COD, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, ENTR_TIPOREF, ENTR_IDREF, ENTR_IMPTOS, ENTR_NOMTERC, ENTR_ANULADO, ENTR_TRANSMIT, ENTR_OBS, TERC_NIT, ENTR_USUARIO, NUMOK, ENTR_ORDEN, ENTR_ORDENID)
    SELECT :IDENT, 11, :PREFENT, BODE_COD, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, NULL, NULL, NULL, 'N', NULL, 'N', 'N', AJUS_OBS, NULL, AJUS_USUARIO, 'N', NULL, NULL
        FROM AJUSTES WHERE AJUS_ID = :idajuste;

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)
    SELECT :IDENT, AJUS_ITEM, AD.ARTI_COD, BODE_COD, (AJUS_EXNUE-AJUS_EXANT), AJUS_UNIDAD, AJDE_COSTO, AJUS_LOTE, AJUS_FACTOR, AJDE_DESC, AJDE_OBS, 0, 0, TAIV_PORC, ((AJUS_EXNUE-AJUS_EXANT)*AJDE_COSTO*TAIV_PORC/100), ARTI_CONSUMO, AJUS_CODBAR, ((AJUS_EXNUE-AJUS_EXANT)*AJDE_COSTO), 'N', 'N', NULL, NULL
        FROM ajustes_detalle AD, ARTICULO A, tarifa_iva T WHERE AD.arti_cod = A.arti_cod AND A.taiv_cod = T.taiv_cod AND AJUS_ID = :idajuste;
suspend;
end^


ALTER PROCEDURE ENTRADAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT 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_CONSEC 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) or (CN = 'N')) then
    BEGIN
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 11 INTO :IDI;
    if (CN <> 'N') then
       EXECUTE PROCEDURE CONTABIL_ENTRADA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
    if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_entrada_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    end
  END
END^


ALTER PROCEDURE ENTRADAS_SIN_CONTABILIDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
declare variable IDREF INTEGER;
BEGIN
FOR SELECT ENTR_ID, PREF_PRE, ENTR_NUMERO FROM ENTRADAS WHERE ENTR_ANULADO = 'N' AND
    ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN AND ((:PREFIJO = '') or (PREF_PRE = :PREFIJO))
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idc = null;
  if (not exists (SELECT E.ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE ENCO_TIPOREF = 11 AND ENCO_IDREF = :ID AND E.enco_consec = D.enco_consec)) then
    BEGIN
    SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 11 AND CNTB_IDREF = :ID into :idc;
    if (idc IS NOT NULL) then
        begin
        ESTADO = 'PROCESANDO';
        ERROR = NULL;
        SUSPEND;
        SELECT MAX(ININ_ID) FROM interfaz_inventario WHERE PREF_PRE = :PREF AND TIDO_COD = 11 INTO :IDI;
        EXECUTE PROCEDURE contabil_entrada_niif (:ID, :IDI, :idc) RETURNING_VALUES (:ERROR, VER);
        if ((ERROR = 0) or (error IS NULL)) then
            BEGIN
            SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E WHERE ENCO_TIPOREF = 11 AND ENCO_IDREF = :ID INTO :IDREF;
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
                SELECT :IDREF, 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 = :idc AND CNDE_ITEM >= 100000;
            UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDREF;
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        end
    END
  END
END^


ALTER PROCEDURE ENTREGA_FIN (
    IDDOC INTEGER)
AS
begin
UPDATE ENTREGA_DOCUMENTOS E SET E.endo_fechal = CAST('NOW' AS DATE), E.endo_horal = CAST('NOW' AS TIME)
    WHERE TIDO_COD = 31 AND ENDO_IDDOC = :IDDOC;
end^


ALTER PROCEDURE ENTREGA_ITEM (
    IDDOC INTEGER,
    ITEM INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    NOMCLI VARCHAR(60),
    HORAREG TIME,
    ITEMS INTEGER,
    STAND VARCHAR(20),
    DESARTI VARCHAR(60),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    ITEM2 INTEGER,
    STAND2 VARCHAR(20),
    DESARTI2 VARCHAR(60))
AS
declare variable CODART VARCHAR(20);
declare variable CODART2 VARCHAR(20);
declare variable BOD VARCHAR(2);
begin
SELECT FIRST 1 PREF_PRE, FACT_NUMERO, FACT_NOMCLIENTE, A.audi_hora FROM FACTURAS F, AUDITORIA A
    WHERE A.tido_cod = 31 AND A.audi_iddoc = F.fact_id AND FACT_ID = :iddoc
    INTO :PREF, :NUMERO, :NOMCLI, :HORAREG;
SELECT COUNT(FACT_ID) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC INTO :ITEMS;
SELECT FIRST 1 D.ARTI_COD, BODE_COD, ARTI_DES, FADE_CANT, FADE_UNIDAD FROM FACTURAS_DETALLE D, ARTICULO A
    WHERE FACT_ID = :IDDOC AND D.arti_cod = A.arti_cod AND FADE_ITEM = :ITEM
    ORDER BY FADE_ITEM
    INTO :CODART, :BOD, :DESARTI, :CANT, :UNIDAD;
SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODART AND STAND_BODEGA = :BOD INTO :STAND;
CODART2 = '';
SELECT FIRST 1 FADE_ITEM, D.ARTI_COD, ARTI_DES FROM FACTURAS_DETALLE D, ARTICULO A
    WHERE FACT_ID = :IDDOC AND D.arti_cod = A.arti_cod AND FADE_ITEM > :ITEM
    ORDER BY FADE_ITEM
    INTO :ITEM2, :CODART2, :DESARTI2;
if ((CODART2 <> '') AND (CODART2 IS NOT NULL)) then
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODART2 AND STAND_BODEGA = :BOD INTO :STAND2;
ELSE
    STAND2 = '';
SUSPEND;
end^


ALTER PROCEDURE ENTREGA_SIGUIENTE_ITEM (
    IDDOC INTEGER,
    ITEMANT INTEGER)
RETURNS (
    ITEM INTEGER,
    STAND VARCHAR(20),
    DESARTI VARCHAR(60),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    ITEM2 INTEGER,
    STAND2 VARCHAR(20),
    DESARTI2 VARCHAR(60))
AS
declare variable CODART VARCHAR(20);
declare variable CODART2 VARCHAR(20);
declare variable BOD VARCHAR(2);
begin
/* Procedure Text */
ITEM = NULL;
SELECT FIRST 1 FADE_ITEM, D.ARTI_COD, BODE_COD, ARTI_DES, FADE_CANT, FADE_UNIDAD FROM FACTURAS_DETALLE D, ARTICULO A
    WHERE FACT_ID = :IDDOC AND D.arti_cod = A.arti_cod AND FADE_ITEM > :ITEMANT
    ORDER BY FADE_ITEM
    INTO :ITEM, :CODART, :BOD, :DESARTI, :CANT, :UNIDAD;
if (ITEM IS NULL) then
    BEGIN
    ITEM = 0;
    DESARTI = '';
    CANT = 0;
    UNIDAD = '';
    STAND = '';
    END
ELSE
    BEGIN
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODART AND STAND_BODEGA = :BOD INTO :STAND;
    CODART2 = '';
    SELECT FIRST 1 FADE_ITEM, D.ARTI_COD, ARTI_DES FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE FACT_ID = :IDDOC AND D.arti_cod = A.arti_cod AND FADE_ITEM > :ITEM
        ORDER BY FADE_ITEM
        INTO :ITEM2, :CODART2, :DESARTI2;
    if ((CODART2 <> '') AND (CODART2 IS NOT NULL)) then
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODART2 AND STAND_BODEGA = :BOD INTO :STAND2;
    ELSE
        STAND2 = '';
    END
SUSPEND;
end^


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


ALTER PROCEDURE ES_AFECTABLE (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
DECLARE VARIABLE LON SMALLINT;
DECLARE VARIABLE NRO SMALLINT;
BEGIN
  /* Verifica que una cuenta no tenga hijas */
  OK = 'N';
  SELECT 'S' FROM CUENTAS WHERE CUEN_COD = :CUENTA INTO :OK;
  IF (OK = 'S') THEN
    BEGIN
    LON = STRLEN(CUENTA);
    SELECT COUNT(*) FROM CUENTAS WHERE SUBSTR(CUEN_COD, 1, :LON) = :CUENTA INTO :NRO;
    IF (NRO <> 1) THEN
      OK = 'N';
    END
  SUSPEND;
END^


ALTER PROCEDURE ES_AFECTABLE_NIIF (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
DECLARE VARIABLE LON SMALLINT;
DECLARE VARIABLE NRO SMALLINT;
BEGIN
  /* Verifica que una cuenta no tenga hijas */
  OK = 'N';
  SELECT 'S' FROM cuentas_niif WHERE CUEN_COD = :CUENTA INTO :OK;
  IF (OK = 'S') THEN
    BEGIN
    LON = STRLEN(CUENTA);
    SELECT COUNT(*) FROM cuentas_niif WHERE SUBSTR(CUEN_COD, 1, :LON) = :CUENTA INTO :NRO;
    IF (NRO <> 1) THEN
      OK = 'N';
    END
  SUSPEND;
END^


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^


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^


ALTER PROCEDURE ESTADO_FLUJO_EFECTIVO (
    ANO CHAR(4),
    NIIF CHAR(1))
RETURNS (
    SECCION INTEGER,
    CUENTA VARCHAR(140),
    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
if (NIIF = 'N') then
  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 AND FLEF_NIIF = 'N'
    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 AND FLEF_NIIF = 'N'
      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 AND FLEF_NIIF = 'N'
      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 AND FLEF_NIIF = 'N'
      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 AND FLEF_NIIF = 'N'
      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
ELSE
  BEGIN
  /* CALCULE LA UTILIDAD DEL EJERCICIO */
  EXECUTE PROCEDURE SALDO_CUENTA_MES_NIIF('4', ANO, 13, 'N') RETURNING_VALUES (AUX);
  CIERRE = AUX;
  EXECUTE PROCEDURE SALDO_CUENTA_MES_NIIF('5', ANO, 13, 'N') RETURNING_VALUES (AUX);
  CIERRE = CIERRE + AUX;
  EXECUTE PROCEDURE SALDO_CUENTA_MES_NIIF('6', ANO, 13, 'N') RETURNING_VALUES (AUX);
  CIERRE = CIERRE + AUX;
  EXECUTE PROCEDURE SALDO_CUENTA_MES_NIIF('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_NIIF C
    WHERE F.FLEF_CUENTA = C.CUEN_COD AND FLEF_SECCION = 1 AND FLEF_NIIF = 'S'
    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_niif
        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_NIIF C
      WHERE F.FLEF_CUENTA = C.CUEN_COD AND FLEF_SECCION = 2 AND FLEF_NIIF = 'S'
      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_niif
          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_NIIF C
      WHERE f.FLEF_CUENTA = C.CUEN_COD AND FLEF_SECCION = 3 AND FLEF_NIIF = 'S'
      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_niif
          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_NIIF C
      WHERE F.FLEF_CUENTA = C.CUEN_COD AND FLEF_SECCION = 4 AND FLEF_NIIF = 'S'
      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_niif
          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_NIIF C
      WHERE F.FLEF_CUENTA = C.CUEN_COD AND FLEF_SECCION = 5 AND FLEF_NIIF = 'S'
      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_niif
          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
END^


ALTER PROCEDURE EXISTE_CENTRO (
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4))
RETURNS (
    OK CHAR(1))
AS
declare variable PORAG CHAR(2);
declare variable AGENCIA INTEGER;
BEGIN
execute procedure lee_configuracion('CONTABILIDAD', 'COMPROBANTES', 'FILTRAR CENTROS DE COSTO POR AGENCIA') returning_values (:porag);
OK = 'N';
if (PORAG = 'SI') then
  BEGIN
  SELECT SUCU_ID FROM USUARIO WHERE USER_COD = USER INTO :AGENCIA;
  SELECT 'S' FROM CENTROS WHERE PROY_COD = :PROYECTO AND CENT_COD = :CENTRO AND ((SUCU_ID = 0) or (SUCU_ID = :AGENCIA)) INTO :OK;
  END
ELSE
  SELECT 'S' FROM CENTROS WHERE PROY_COD = :PROYECTO AND CENT_COD = :CENTRO INTO :OK;
  SUSPEND;
END^


ALTER PROCEDURE EXISTE_CUENTA (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  OK = 'N';
  SELECT 'S' FROM CUENTAS WHERE CUEN_COD = :CUENTA INTO :OK;
  SUSPEND;
END^


ALTER PROCEDURE EXISTE_CUENTA_NIIF (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  OK = 'N';
  SELECT 'S' FROM CUENTAS_NIIF WHERE CUEN_COD = :CUENTA INTO :OK;
  SUSPEND;
END^


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^


ALTER PROCEDURE EXISTENCIA_BODEGA (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2))
AS
declare variable ORDENC numeric(18,4);
declare variable PEDIDO numeric(18,4);
declare variable PEDWEB numeric(18,4);
declare variable ITEM integer;
declare variable ID integer;
declare variable UND varchar(8);
declare variable CANT numeric(18,4);
declare variable FACTOR2 numeric(18,4);
declare variable PEDAUTO char(2);
declare variable RESWEB char(2);
declare variable VALIDEZ integer;
BEGIN
execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
/* LO RESERVADO */
SELECT SUM(RSDE_LIBERAR)
  FROM RESERVAS_DETALLE RD, RESERVAS R
  WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
  INTO :RESERVADO;
if (RESERVADO IS NULL) then
    RESERVADO = 0;
PEDIDO = 0;
FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
    FROM PEDIDOS P, PEDIDOS_DETALLE PD, EVENTOS_VENTAS E
    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
    AND BODE_COD = :BODEGA AND ((P.PEDI_EVENTO = E.EVVE_ID) or (P.PEDI_EVENTO IS NULL)) AND ((E.EVVE_EXIS = 'S') or (E.EVVE_EXIS IS NULL))
    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;
execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'RESERVAR MERCANCIA CON PEDIDO WEB SIN CONFIRMAR') returning_values (:resweb);
if (RESWEB = 'SI') then
    BEGIN
    execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'DIAS DE VALIDEZ') returning_values (VALIDEZ);
    PEDWEB = 0;
    for select P.pewe_id, PD.pewd_item, PD.pewd_cant * PD.pewd_factor
        from PEDIDO_WEB P, pedido_web_detalle PD, EVENTOS_VENTAS E
        where P.pewe_id = PD.pewe_id and PD.arti_cod = :ARTICULO and P.pewe_fecha >= (:FECHA-:VALIDEZ) AND PEWE_FECHA <= :FECHA
        and PD.bode_cod = :BODEGA AND P.pewe_idped = 0 AND ((P.PEWE_EVENTO = E.EVVE_ID) or (P.PEWE_EVENTO IS NULL))
        AND ((E.EVVE_EXIS = 'S') or (E.EVVE_EXIS IS NULL))
        into :ID, :ITEM, :CANT
        do
        begin
        PEDWEB = PEDWEB + CANT;
        end
    RESERVADO = RESERVADO + PEDWEB;
    END
SUSPEND;
END^


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^


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

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

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


ALTER PROCEDURE EXISTENCIAS_COMPRAS (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    VENTAANO NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20),
    NOMBOD VARCHAR(30))
AS
declare variable FACTOR numeric(15,4);
declare variable ORDENC numeric(18,4);
declare variable PEDIDO numeric(18,4);
declare variable TRASLADO 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);
declare variable DIASC varchar(255);
declare variable PEDAUTO char(2);
declare variable SALIDAS numeric(18,4);
declare variable FECREM date;
declare variable CANTREM numeric(18,4);
declare variable DIASANO integer;
declare variable BODINA char(2);
begin
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR BODEGAS INACTIVAS EN CONSULTA DE EXISTENCIAS') returning_values (:BODINA);

for select bode_cod, SUCU_ID, BODE_NOM from bodega where ((bode_activa = 'S') or (:BODINA = 'SI')) order by bode_cod
    into :bodega, :agencia, :nombod
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    execute procedure FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    select STAND_COD from STANDS where ARTI_COD = :ARTICULO and STAND_BODEGA = :BODEGA into :stand;
    execute procedure salidas_ano_anterior (:ARTICULO, :FECHA, :BODEGA) returning_values (:ventaano);
    execute procedure promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        begin
        DIAS = cast(DIASC as integer);
        end
    else
        select ARTI_DIAS from ARTICULO where ARTI_COD = :ARTICULO into :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    /* TRASLADOS POR CONFIRMAR */
    TRASLADO = 0;
    SELECT SUM(TD.tras_cant * TD.tras_factor) FROM TRASFERENCIAS_DETALLE TD, TRASFERENCIAS T
    WHERE T.tran_id = TD.tran_id AND ARTI_COD = :ARTICULO AND T.tran_boddes = :bodega AND TD.tras_anulado = 'N' AND TD.tras_confirma = 'N'
        INTO :traslado;
    if (TRASLADO is null) then
        TRASLADO = 0;
    ORDENADO = ORDENADO + TRASLADO;
    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_VENCE >= :FECHA and PEDI_FECHA <= :FECHA
        and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    /* VENTAS MES */
    FECHAAUX = cast (FECHA as varchar(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = cast (FECHAAUX as date);
    execute procedure ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia, :bodega ) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        where F.FACO_ID = D.faco_id and D.ARTI_COD = :articulo and FACO_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by FACO_FECHA desc, F.FACO_ID desc
        into :fechacmp, :cantcmp;
    select first 1 REPR_FECHA, RPVD_CANT * RPVD_FACTOR from remision_proveedor F, remision_proveedor_det D
        where F.repr_id = D.repr_id and D.ARTI_COD = :articulo and REPR_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by REPR_FECHA desc, F.repr_id desc
        into :fecrem, :cantrem;
    if ((FECREM is not null) and (FECREM > fechacmp)) then
        begin
        fechacmp = FECREM;
        cantcmp = cantrem;
        end
    suspend;
    end
end^


ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA (
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    INACTIVOS CHAR(1),
    NIIF CHAR(1),
    SUCURSAL INTEGER,
    LISTART INTEGER)
RETURNS (
    CANT NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    INVIMA VARCHAR(20),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    LOTEV DATE,
    SERIALES VARCHAR(2048),
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    COSTOIVA NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20),
    ESTADO CHAR(1),
    MAXIMO NUMERIC(18,2),
    MINIMO NUMERIC(18,2),
    FECHAVTA DATE,
    ARTI_OBS VARCHAR(1024))
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);
declare variable COSTON_LOTE numeric(18,2);
declare variable PORART VARCHAR(8);
declare variable MAXBOD NUMERIC(18,4);
declare variable MINBOD NUMERIC(18,4);
declare variable ULTV CHAR(2);
declare variable SERIE VARCHAR(30);
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 ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR FECHA DE ULTIMA VENTA AL EXPORTAR REPORTE DE EXISTENCIAS') returning_values (:ultv);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if ((DETALLE = 'B') or (DETALLE = 'L')) then
  BEGIN
  if (listart <> 0) then
    begin
    FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,
    BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA, ESAR_COD, ARTI_MAX, ARTI_MIN, substring(arti_obs from 1 for 1024)
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T, LISTA_ARTICULOS L, LISTA_ARTICULOS_DET D
      WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      AND L.liar_id = D.liar_id AND ((D.arti_cod = A.arti_cod) AND (L.liar_id = :LISTART) or (:LISTART = 0))
      and exists (select exis_fecha from existencia where arti_cod = a.arti_cod and bode_cod = b.bode_cod)
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC,
      :CODBOD, :NOMBOD, :CONSUMO, :pesounit, :invima, :estado, :maximo, :minimo, :arti_obs
      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 = '';
            fechacosto = null;
            fechavta = null;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_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, STAND_MAX, STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD
                    INTO :STAND, :MAXBOD, :MINBOD;
                if (PORART = 'STAND') then
                    BEGIN
                    MAXIMO = MAXBOD;
                    MINIMO = MINBOD;
                    END
                if (NIIF = 'S') then
                    EXECUTE PROCEDURE costo_niif_prom_y_ult_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                else
                    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 (ULTV = 'SI') then
                    begin
                    SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'N' AND MVAR_FECHA <= :FECHA
                        AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32))  ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :fechavta;
                    end
                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.bode_cod||'-'||L.lote_nro||'|'||L.lote_vence, l.lote_costo, l.lote_costoniif, LOTE_VENCE
                        FROM LOTES L WHERE ARTI_COD = :codigo AND BODE_COD = :codbod
                        INTO :LOTE, :NOMBOD, :costo_lote, :coston_lote, :lotev
                        DO
                        BEGIN
                        if (NIIF = 'S') then
                            costo_lote = coston_lote;
                        if (CONSUMO <> 0) then
                            EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                        execute procedure saldo_lote_fecha(:codigo, :codbod,  :lote,  :fecha-1) returning_values (:cant);
                        if (cant <> 0) then
                            begin
                            COSTOTOT = :CANT * :COSTO;
                            IVAMONTO = COSTOTOT /100 * IVA;
                            COSTOIVA = COSTOTOT;
                            if (MASIVA = 'S') then
                                BEGIN
                                COSTOIVA = COSTOTOT + IVAMONTO;
                                COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                                END
                            CONSUMO = CONSUMO * CANT;
                            COSTOIVA = COSTOIVA + CONSUMO;
                            if (ENPESO = 'S') then
                                BEGIN
                                if (pesounit IS NULL) then
                                    pesounit = 0;
                                if (PESOUNIT <> 0) then
                                    BEGIN
                                    pesototal = PESOUNIT * cant;
                                    SUSPEND;
                                    END
                                END
                            ELSE
                                SUSPEND;
                            end
                        END
                    END
                else
                    BEGIN
                    EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                    SERIALES = '';
                    FOR SELECT S.sear_cod FROM seriales_articulo S WHERE S.arti_cod = :codigo AND S.bode_cod = :codbod AND S.sear_existe = 'S'
                        ORDER BY SEAR_COD
                        INTO :SERIE
                        DO
                        BEGIN
                        SERIALES = SERIALES || SERIE || '-';
                        END
                    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 --select de articulos con join listart
    end  --listart <> 0
  else
    begin
    FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,
    BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA, ESAR_COD, ARTI_MAX, ARTI_MIN, substring(arti_obs from 1 for 1024)
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      and exists (select exis_fecha from existencia where arti_cod = a.arti_cod and bode_cod = b.bode_cod)
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC,
      :CODBOD, :NOMBOD, :CONSUMO, :pesounit, :invima, :estado, :maximo, :minimo, :arti_obs
      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 = '';
            fechacosto = null;
            fechavta = null;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_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, STAND_MAX, STAND_MIN FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD
                    INTO :STAND, :MAXBOD, :MINBOD;
                if (PORART = 'STAND') then
                    BEGIN
                    MAXIMO = MAXBOD;
                    MINIMO = MINBOD;
                    END
                if (NIIF = 'S') then
                    EXECUTE PROCEDURE costo_niif_prom_y_ult_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                else
                    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 (ULTV = 'SI') then
                    begin
                    SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'N' AND MVAR_FECHA <= :FECHA
                        AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32))  ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :fechavta;
                    end
                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.bode_cod||'-'||L.lote_nro||'|'||L.lote_vence, l.lote_costo, l.lote_costoniif, LOTE_VENCE
                        FROM LOTES L WHERE ARTI_COD = :codigo AND BODE_COD = :codbod
                        INTO :LOTE, :NOMBOD, :costo_lote, :coston_lote, :lotev
                        DO
                        BEGIN
                        if (NIIF = 'S') then
                            costo_lote = coston_lote;
                        if (CONSUMO <> 0) then
                            EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                        execute procedure saldo_lote_fecha(:codigo, :codbod,  :lote,  :fecha-1) returning_values (:cant);
                        if (cant <> 0) then
                            begin
                            COSTOTOT = :CANT * :COSTO;
                            IVAMONTO = COSTOTOT /100 * IVA;
                            COSTOIVA = COSTOTOT;
                            if (MASIVA = 'S') then
                                BEGIN
                                COSTOIVA = COSTOTOT + IVAMONTO;
                                COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                                END
                            CONSUMO = CONSUMO * CANT;
                            COSTOIVA = COSTOIVA + CONSUMO;
                            if (ENPESO = 'S') then
                                BEGIN
                                if (pesounit IS NULL) then
                                    pesounit = 0;
                                if (PESOUNIT <> 0) then
                                    BEGIN
                                    pesototal = PESOUNIT * cant;
                                    SUSPEND;
                                    END
                                END
                            ELSE
                                SUSPEND;
                            end
                        END
                    END
                else
                    BEGIN
                    EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                    SERIALES = '';
                    FOR SELECT S.sear_cod FROM seriales_articulo S WHERE S.arti_cod = :codigo AND S.bode_cod = :codbod AND S.sear_existe = 'S'
                        ORDER BY SEAR_COD
                        INTO :SERIE
                        DO
                        BEGIN
                        SERIALES = SERIALES || SERIE || '-';
                        END
                    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 --select de articulos sin join listart
    end --listart = 0

  END --detalle por lote o bodega

if (DETALLE = 'N') then
  BEGIN
  if (listart <> 0) then
    begin
    FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,
    ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA, ESAR_COD, ARTI_MAX, ARTI_MIN, substring(arti_obs from 1 for 1024)
      FROM ARTICULO A, TARIFA_IVA T, LISTA_ARTICULOS L, LISTA_ARTICULOS_DET D
      WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.TAIV_COD = T.TAIV_COD
      AND L.liar_id = D.liar_id AND ((a.arti_cod = d.arti_cod) and (L.liar_id = :LISTART) OR (:LISTART = 0))
      INTO :CODIGO, :NOMBRE, :DESCORTA, UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC,
      :CONSUMO, :pesounit, :invima, :estado, :maximo, :minimo, :arti_obs
      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
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            fechacosto = null;
            fechavta = null;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_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);
                if (NIIF = 'S') then
                    EXECUTE PROCEDURE costo_niif_prom_y_ult_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                else
                    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 (ULTV = 'SI') then
                    SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'N' AND MVAR_FECHA <= :FECHA
                        AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32))  ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :fechavta;
                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;

                SERIALES = '';
                FOR SELECT S.sear_cod FROM seriales_articulo S WHERE S.arti_cod = :codigo AND S.sear_existe = 'S'
                    ORDER BY SEAR_COD
                    INTO :SERIE
                    DO
                    BEGIN
                    SERIALES = SERIALES || SERIE || '-';
                    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  --select sin detalle
    end --listart <> 0
  else
    begin
    FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,
    ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA, ESAR_COD, ARTI_MAX, ARTI_MIN, substring(arti_obs from 1 for 1024)
      FROM ARTICULO A, TARIFA_IVA T
      WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC,
      :CONSUMO, :pesounit, :invima, :estado, :maximo, :minimo, :arti_obs
      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
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            fechacosto = null;
            fechavta = null;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_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);
                if (NIIF = 'S') then
                    EXECUTE PROCEDURE costo_niif_prom_y_ult_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                else
                    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 (ULTV = 'SI') then
                    SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'N' AND MVAR_FECHA <= :FECHA
                        AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32))  ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :fechavta;
                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;

                SERIALES = '';
                FOR SELECT S.sear_cod FROM seriales_articulo S WHERE S.arti_cod = :codigo AND S.sear_existe = 'S'
                    ORDER BY SEAR_COD
                    INTO :SERIE
                    DO
                    BEGIN
                    SERIALES = SERIALES || SERIE || '-';
                    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  --select sin detalle
    end --listart = 0
  END  --sin detalle
END^


ALTER PROCEDURE EXISTENCIAS_MENOS_RESERVA (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    BODEGA VARCHAR(2),
    STAND VARCHAR(20),
    EXISTENCIA NUMERIC(18,4))
AS
declare variable RESERVADO NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable UND VARCHAR(8);
declare variable FACTOR2 NUMERIC(18,4);
declare variable ORDENC 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 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);
    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_VENCE >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;

    SUSPEND;
    end
END^


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^


ALTER PROCEDURE EXISTENCIAS_PROVEEDOR (
    FECFIN DATE,
    NIT VARCHAR(20))
RETURNS (
    INVFIN NUMERIC(18,2))
AS
declare variable codigo varchar(20);
declare variable cant numeric(18,4);
declare variable costo numeric(18,2);
begin
INVFIN = 0;
for select A.ARTI_COD from ARTICULO A, proveedor_articulo P
    where A.arti_cod = P.arti_cod AND P.terc_nit = :NIT
    into :CODIGO
    do
    begin
    execute procedure saldo_total_inventario(CODIGO, FECFIN) returning_values (CANT);
    execute procedure COSTO_PROMEDIO(CODIGO, FECFIN) returning_values (COSTO);
    INVFIN = INVFIN + :CANT * :COSTO;
    end
SUSPEND;
end^


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^


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

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


ALTER PROCEDURE EXISTENCIAS_TERCEROS (
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTINI NUMERIC(18,2),
    FECHA DATE,
    TIPODOC VARCHAR(8),
    NUMERO VARCHAR(12),
    REMISIONES NUMERIC(18,2),
    DEVOLUCIONES NUMERIC(18,2),
    CANTFIN NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    NITTERC VARCHAR(20),
    NOMTERC VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    COSTOTOT NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    IVA NUMERIC(9,2))
AS
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ok char(1);
declare variable TIPO 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_DESCORTA, ARTI_UNIDAD, 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
      A.TAIV_COD = T.TAIV_COD and exists (select exte_fecha from existencia_tercero where arti_cod = a.arti_cod AND TERC_NIT >= :terini AND TERC_NIT <= :TERFIN)
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :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;
            if (DETALLE = 'S') then
                BEGIN
                FOR SELECT distinct TERC_NIT, CLSU_COD FROM existencia_tercero WHERE ARTI_COD = :codigo AND TERC_NIT >= :terini AND TERC_NIT <= :TERFIN
                    INTO :nitterc, :sucursal
                    DO
                    BEGIN
                    nomterc = '';
                    NOMSUC = '';
                    EXECUTE PROCEDURE saldo_tercero_fecha (:CODIGO, :nitterc, :sucursal, :fecfin-1) returning_values (:cantfin);
                    SELECT TERC_NOM FROM TERCEROS WHERE terc_nit = :nitterc INTO :nomterc;
                    SELECT S.clsu_nombre FROM cliente_sucursales S WHERE S.terc_nit = :nitterc and s.clcu_cod = :sucursal INTO :nomsuc;
                    EXECUTE procedure costo_promedio_y_ultimo(:CODIGO, :fecfin) returning_values (:costo, :ultcosto);
                    costotot = COSTO * cantfin;
                    EXECUTE PROCEDURE saldo_tercero_fecha (:CODIGO, :nitterc, :sucursal, :fecini) returning_values (:cantini);
                    FOR SELECT MVAR_FECHA, MVAR_PREF || MVAR_NUMERO, MVAR_CANT, MVAR_TIPODOC FROM MOVIMIENTO_ARTICULO
                        WHERE ARTI_COD = :codigo AND TERC_NIT = :nitterc AND CLSU_COD = :sucursal
                        AND MVAR_FECHA >= :fecini AND MVAR_FECHA <= :fecfin
                        INTO :FECHA, :NUMERO, devoluciones, :TIPO
                        DO
                        BEGIN
                        SELECT T.tido_nomcorto FROM tipo_documento T WHERE T.tido_cod = :TIPO INTO :tipodoc;
                        if ((TIPO = 31) or (TIPO = 33))  then
                            remisiones = 0;
                        if (TIPO = 32) then
                            BEGIN
                            remisiones = devoluciones;
                            devoluciones = 0;
                            END
                        suspend;
                        END
                    END
                END
            ELSE
                FOR SELECT distinct TERC_NIT, CLSU_COD FROM existencia_tercero WHERE ARTI_COD = :codigo AND TERC_NIT >= :terini AND TERC_NIT <= :TERFIN
                    INTO :nitterc, :sucursal
                    DO
                    BEGIN
                    nomterc = '';
                    NOMSUC = '';
                    EXECUTE PROCEDURE saldo_tercero_fecha (:CODIGO, :nitterc, :sucursal, :fecini) returning_values (:cantini);
                    SELECT SUM(EXTE_ENTR), SUM(EXTE_SAL) FROM EXISTENCIA_TERCERO WHERE ARTI_COD = :CODIGO AND TERC_NIT = :nitterc AND CLSU_COD = :sucursal
                        INTO :devoluciones, :remisiones;
                    if (devoluciones IS NULL) then
                        devoluciones = 0;
                    if (remisiones IS NULL) then
                        remisiones = 0;
                    EXECUTE PROCEDURE saldo_tercero_fecha (:CODIGO, :nitterc, :sucursal, :fecfin) returning_values (:cantfin);
                    SELECT TERC_NOM FROM TERCEROS WHERE terc_nit = :nitterc INTO :nomterc;
                    SELECT S.clsu_nombre FROM cliente_sucursales S WHERE S.terc_nit = :nitterc and s.clcu_cod = :sucursal INTO :nomsuc;
                    EXECUTE procedure costo_promedio_y_ultimo(:CODIGO, :fecfin) returning_values (:costo, :ultcosto);
                    costotot = COSTO * cantfin;
                    suspend;
                    END
            END
        END
end^


ALTER PROCEDURE EXISTENCIAS_UNIDAD (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    STAND VARCHAR(20),
    NOMBOD VARCHAR(30))
AS
declare variable FACTOR numeric(15,4);
declare variable ORDENC numeric(18,4);
declare variable PEDIDO numeric(18,4);
declare variable ITEM integer;
declare variable ID integer;
declare variable UND varchar(8);
declare variable CANT numeric(18,4);
declare variable FACTOR2 numeric(18,4);
declare variable PEDAUTO char(2);
declare variable BODINA char(2);
BEGIN
EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR BODEGAS INACTIVAS EN CONSULTA DE EXISTENCIAS') returning_values (:BODINA);
for select bode_cod, BODE_NOM from bodega where ((bode_activa = 'S') or (:BODINA = 'SI')) order by bode_cod into :bodega, :nombod
    do
    begin
    STAND = '';
    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--, EVENTOS_VENTAS E
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA
        AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA --AND ((P.PEDI_EVENTO = E.EVVE_ID) or (P.PEDI_EVENTO IS NULL))
--        AND ((E.EVVE_EXIS = 'S') or (E.EVVE_EXIS IS NULL))
        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^


ALTER PROCEDURE EXISTENCIAS_UNIDAD_BOD (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8),
    BOD VARCHAR(2))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR numeric(18,6);
declare variable ORDENC numeric(18,4);
declare variable PEDIDO numeric(18,4);
declare variable PEDWEB 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,6);
declare variable PEDAUTO char(2);
declare variable RESWEB char(2);
declare variable VALIDEZ INTEGER;
declare variable EXRES char(10);
begin
BODEGA = BOD;
execute procedure FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
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;
execute procedure LEE_CONFIGURACION('INVENTARIO', 'EXISTENCIAS', 'ACCION A TOMAR SI LA EXISTENCIA ESTA RESERVADA') returning_values (EXRES);
execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'RESERVAR MERCANCIA CON PEDIDO WEB SIN CONFIRMAR') returning_values (:resweb);
if (EXRES <> 'IGNORAR') then
    BEGIN
    /* 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;
    execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
    execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'DIAS DE VALIDEZ') returning_values (VALIDEZ);
    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' and BODE_COD = :BODEGA and PEDI_VALIDEZ >= 0
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    if (RESWEB = 'SI') then
        BEGIN
        PEDWEB = 0;
        for select P.pewe_id, PD.pewd_item, PD.pewd_cant * PD.pewd_factor
            from PEDIDO_WEB P, pedido_web_detalle PD
            where P.pewe_id = PD.pewe_id and PD.arti_cod = :ARTICULO and P.pewe_fecha >= (:FECHA-:VALIDEZ) AND PEWE_FECHA <= :FECHA and PD.bode_cod = :BODEGA AND P.pewe_idped = 0
            into :ID, :ITEM, :CANT
            do
            begin
            PEDWEB = PEDWEB + CANT;
            end
        RESERVADO = RESERVADO + PEDWEB;
        END
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    END
ELSE
    RESERVADO = 0;
suspend;
end^


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


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


ALTER PROCEDURE EXPORTA_FACTURAS_ASOB (
    INI DATE,
    FIN DATE)
RETURNS (
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA VARCHAR(8),
    VENCE VARCHAR(8),
    NIT VARCHAR(20),
    CODCLI VARCHAR(15),
    NOMBRE VARCHAR(22),
    VENDEDOR INTEGER,
    BODEGA VARCHAR(2),
    ITEM INTEGER,
    MONTO NUMERIC(18,2))
AS
declare variable TOTAL NUMERIC(18,2);
declare variable CARTERA CHAR(1);
declare variable FECAUX DATE;
declare variable VENCEAUX DATE;
BEGIN
ITEM = 0;
/* 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, VEND_COD, BODE_COD, SUBSTRING(FACT_NOMCLIENTE FROM 1 FOR 22), FACT_TOTAL
    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, :VENDEDOR, :BODEGA, :NOMBRE, :MONTO
    DO
    BEGIN
    ITEM = ITEM + 1;
    SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :codcli;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    SUSPEND;
    END
END^


ALTER PROCEDURE EXPORTA_FACTURAS_DET (
    INI DATE,
    FIN DATE,
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4))
RETURNS (
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    NIT VARCHAR(20),
    CODCLI VARCHAR(15),
    NOMBRE VARCHAR(60),
    VENDEDOR INTEGER,
    BODEGA VARCHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    REFERENCIA VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    PRUNIT NUMERIC(18,2),
    MONTO NUMERIC(18,2))
AS
BEGIN
ITEM = 0;
/* FACTURAS DEL RANGO QUE NO SE HAN TRANSMITIDO */
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, TERC_NIT, VEND_COD, BODE_COD, FACT_NOMCLIENTE
    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_ANULADO = 'N'
    AND F.PREF_PRE >= :PREINI AND F.PREF_PRE <= :PREFIN
    INTO :IDDOC, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :VENDEDOR, :BODEGA, :NOMBRE
    DO
    BEGIN
    SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :codcli;
    ITEM = 0;
    FOR SELECT MAX(ARTI_COD), MAX(FADE_DESC), SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL), MAX(FADE_REFERENCIA) FROM FACTURAS_DETALLE
        WHERE FACT_ID = :IDDOC GROUP BY ARTI_COD
        INTO :ARTICULO, :descripcion, :cantidad, :monto, :referencia
        DO
        BEGIN
        ITEM = ITEM + 1;
        if (CANTIDAD <> 0) then
            PRUNIT = MONTO / CANTIDAD;
        ELSE
            PRUNIT = 0;
        SUSPEND;
        END
    END
END^


ALTER PROCEDURE EXPORTAR_RUTERO (
    FECHA DATE)
RETURNS (
    ID INTEGER,
    NUMERO VARCHAR(8),
    VEHICULO VARCHAR(15),
    CONDUCTOR VARCHAR(15),
    MONTO NUMERIC(18,2))
AS
begin
FOR SELECT RUTE_ID, RUTE_NUMERO, RUTE_VEHICULO, RUTE_CONDUCTOR FROM rutero WHERE RUTE_FECHA = :FECHA
    INTO :ID, :numero,  :vehiculo, :conductor
    DO
    BEGIN
    SELECT SUM(RUTD_VALOR) FROM RUTERO_DETALLE WHERE RUTE_ID = :ID INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    suspend;
    END
end^


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


ALTER PROCEDURE FACTCOMP_SIN_INVENTARIO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    IDF INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4))
AS
declare variable CONSOLIDA INTEGER;
begin
FOR select F.faco_id, F.PREF_PRE, FACO_NUMERO, FACO_FECHA, ARTI_COD, FCDE_DESC, FCDE_UNIDAD, FCDE_CANT, FACO_CONSOLIDA
    from facturas_compra f, facturas_compras_detalle d, PREFIJOS P
    where f.faco_fecha >= :FECINI and faco_fecha <= :FECFIN and f.faco_id = d.faco_id and f.faco_anulado = 'N' and
    P.tido_cod = 21 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    not exists (select mvar_cons from movimiento_articulo m where m.mvar_tipodoc = 21 and m.mvar_idref = d.faco_id and m.mvar_item = d.fcde_item)
    order by f.faco_fecha, f.faco_id
    INTO :IDF, :PREF, :NUMERO, :FECHA, :ARTICULO, :DESCRIPCION, :UNIDAD, :cant, :consolida
    DO
    BEGIN
    if (consolida IS NULL) then
      suspend;
    ELSE
        if (CONSOLIDA = 0) then
            suspend;
        ELSE
            BEGIN
            if (NOT EXISTS (SELECT COFA_ID FROM consolidado_faltantes C, MOVIMIENTO_ARTICULO M
                WHERE COFA_ID = :consolida AND C.ARTI_COD = :articulo AND COFA_CANTCR <> 0 AND COFA_TIPOORI = 22
                AND C.cofa_idori = M.mvar_idref AND M.mvar_tipodoc = 22 AND M.arti_cod = :ARTICULO)) then
                SUSPEND;
            END
    END
end^


ALTER PROCEDURE FACTOR_UNIDAD_CANT (
    ARTICULO VARCHAR(15),
    UNIDAD VARCHAR(8))
RETURNS (
    FACTOR NUMERIC(18,4))
AS
DECLARE VARIABLE PPAL VARCHAR(8);
BEGIN
  FACTOR = 0;
  SELECT ARTI_UNIDAD FROM ARTICULO WHERE (ARTI_COD = :ARTICULO) INTO :PPAL;
  IF (PPAL = UNIDAD) THEN
    FACTOR = 1;
  ELSE
    SELECT UNAR_FACCAN FROM UNIDAD_ARTICULO
    WHERE (ARTI_COD = :ARTICULO) AND (UNAR_UNIDAD = :UNIDAD) INTO :FACTOR;
  if (FACTOR = 0) then
    BEGIN
    FACTOR = 1;
    END
  SUSPEND;
END^


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


ALTER PROCEDURE FACTOR_UNIDAD_PRE (
    ARTICULO VARCHAR(15),
    UNIDAD VARCHAR(8))
RETURNS (
    FACTOR NUMERIC(18,4))
AS
DECLARE VARIABLE PPAL VARCHAR(8);
BEGIN
  FACTOR = 0;
  SELECT ARTI_UNIDAD FROM ARTICULO WHERE (ARTI_COD = :ARTICULO) INTO :PPAL;
  IF (PPAL = UNIDAD) THEN
    FACTOR = 1;
  ELSE
    SELECT UNAR_FACPRE FROM UNIDAD_ARTICULO
    WHERE (ARTI_COD = :ARTICULO) AND (UNAR_UNIDAD = :UNIDAD) INTO :FACTOR;
  if (FACTOR = 0) then
    BEGIN
    FACTOR = 1;
    END
  SUSPEND;
END^


ALTER PROCEDURE FACTURA_ALQUILER_Y_TRANSPORTE (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    VEND INTEGER,
    PTVT INTEGER,
    PREFIJO VARCHAR(4),
    FECHA DATE,
    DIAS INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF integer;
declare variable IDC integer;
declare variable VENDINI integer;
declare variable VENDFIN integer;
declare variable ZONINI char(4);
declare variable ZONFIN char(4);
declare variable GRPINI integer;
declare variable GRPFIN integer;
declare variable IVAINC char(1);
declare variable ITEM integer;
declare variable ARTICULO varchar(20);
declare variable DESCR varchar(60);
declare variable CANT numeric(18,2);
declare variable PRUNIT numeric(18,2);
declare variable IVAP numeric(18,2);
declare variable IVAM numeric(18,2);
declare variable BASE numeric(18,2);
declare variable RTFTE numeric(9,2);
declare variable RTIVA numeric(9,2);
declare variable RTICA numeric(9,2);
declare variable RTCREE numeric(9,2);
declare variable RTFTEM numeric(18,2);
declare variable RTIVAM numeric(18,2);
declare variable RTICAM numeric(18,2);
declare variable RTCREEM numeric(18,2);
declare variable UNIDAD varchar(8);
declare variable BOD varchar(2);
declare variable ERROR integer;
declare variable VER char(1);
declare variable REDONT integer;
declare variable CANTR numeric(18,2);
declare variable ENTR numeric(18,2);
declare variable SALI numeric(18,2);
declare variable LISTAP integer;
declare variable NUMREM integer;
declare variable NUMDEV integer;
declare variable CODALQ varchar(15);
declare variable REMISION varchar(12);
declare variable FECDOC date;
declare variable FECANT date;
declare variable PREFF VARCHAR(4);
declare variable IDFF INTEGER;
declare variable IDCF INTEGER;
declare variable DIASR INTEGER;
declare variable VRFLETER numeric(18,2);
declare variable VRFLETED numeric(18,2);
declare variable FLETER numeric(18,2);
declare variable FLETED numeric(18,2);
declare variable OBS VARCHAR(1024);
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', 'DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:redont);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'PREFIJO PARA FACTRAR FLETE DE ARTICULOS ALQUILADOS') returning_values (PREFF);
select BODE_COD from punto_venta where PTVT_ID = :PTVT into :BOD;
for select T.TERC_NIT, S.clcu_cod, S.clsu_nombre, S.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase, C.clie_rtcree, clie_rticabase, c.lipr_cod
    from TERCEROS T, CLIENTES C, CLIENTE_SUCURSALES S
    where T.terc_nit = C.terc_nit and T.TERC_NIT >= :NITINI and T.TERC_NIT <= :NITFIN and C.terc_nit = S.terc_nit and
        C.vend_cod >= :vendini and C.vend_cod <= :vendfin and ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini and C.grca_cod <= :grpfin)) and
        ((S.zona_cod is null and :zonini = '') or (S.zona_cod >= :zonini and S.zona_cod <= :zonfin))
        and exists (select arti_cod from existencia_tercero e where e.terc_nit = s.terc_nit and e.clsu_cod = s.clcu_cod)
        and not exists (select faal_cliente from factura_alquiler where faal_cliente = t.terc_nit and faal_sucursal = s.clcu_cod and faal_fecha >= :fecha)
    into :NIT, :sucursal, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM, :rtcree, :RTICAM, :listap
    do
    begin
    idf = 0;
    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;

    ITEM = 0;
    /* TRAIGA LOS SALDOS DE ESE TERCERO */
    for select distinct ARTI_COD from existencia_tercero where TERC_NIT = :NIT and CLSU_COD = :SUCURSAL
        into :articulo
        do
        begin
        execute procedure saldo_tercero_fecha(:ARTICULO, :nit,  :sucursal,  :fecini-1) returning_values (CANTR);
        select first 1 CAST(CAST(R.revt_numero AS INTEGER) AS VARCHAR(12))
            from remisiones_venta_detalle RD, remisiones_venta R
            where r.revt_anulado = 'N' and r.revt_id = rd.revt_id and r.terc_nit = :nit and r.revt_sucursal = :sucursal and
            r.revt_fecha <= :fecfin and ARTI_COD = :ARTICULO order by REVT_FECHA desc, R.REVT_ID desc
            into :REMISION;
        /* TRAIGA EL CODIGO DEL ALQUILER */
        CODALQ = null;
        select AREQ_EQUIVALE from articulo_equivalencia where ARTI_COD = :articulo into :CODALQ;
        if (CODALQ is null) then
            CODALQ = ARTICULO;
        select arti_des, arti_unidad, I.taiv_porc from ARTICULO A, TARIFA_IVA I where arti_cod = :codalq and A.taiv_cod = I.taiv_cod
            into :DESCR, :UNIDAD, :IVAP;
        /* busque el precio por cliente */
        select PRAR_FIJO from PRECIOS_ARTICULO where ARTI_COD = :codalq and LIPR_COD = :LISTAP into :prunit;

        FECANT = FECINI;
        for select exte_fecha, exte_entr, exte_sal from existencia_tercero where ARTI_COD = :ARTICULO and TERC_NIT = :NIT and CLSU_COD = :sucursal
            and EXTE_FECHA >= :FECINI and EXTE_FECHA <= :FECFIN AND ((EXTE_ENTR <> 0) or (EXTE_SAL <> 0))
            order by EXTE_FECHA
            into :FECDOC, :ENTR, :SALI
            do
            begin
            /* FACTURE LOS DIAS DESDE EL INICIO CON EL SALDO QUE TRAE */
            CANT = (FECDOC - FECANT) * CANTR;
            DIASR = (FECDOC - FECANT);
            if (SALI <> 0) then
                begin
                select first 1 CAST(CAST(max(R.revt_numero) AS INTEGER) AS VARCHAR(12))
                    from remisiones_venta R
                    where r.revt_anulado = 'N' and r.terc_nit = :nit and r.revt_sucursal = :sucursal and r.revt_fecha = :fecdoc
                    into :REMISION;
                end
            if (cant <> 0) then
                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
                if (item = 0) then
                    begin
                    IDF = gen_id(id_factura, 1);
                    insert into FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
                        FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
                        FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
                        FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
                        FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
                        FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
                        FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_FECINI, FACT_FECFIN, FACT_RTCREE, FACT_RTCREEM)
                        values (:IDF, :PTVT, :VEND, :NIT, null, :NUMERO, :FECHA, null, (:FECHA + :DIAS), :IVAINC,
                        0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, null,
                        :NOMBRE, null, null, null, 'N', 'S', :TOTAL, :BOD, null, null, null, 0, user, :sucursal, 'N', :VEND, 1, null,
                        null, null, null, null, 1, :fecini, :fecfin, :rtcree, :rtcreem);
                    end
                ITEM = ITEM + 1;
                insert into FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                    FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                    FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                    FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                    FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE)
                    values (:IDF, :ITEM, :BOD, :codalq, :CANT, :UNIDAD, null, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                    :descr, 'REMISION ' || :REMISION || ' UNIDADES:' || cast(cast(:cantr as integer) as varchar(15)) || ' DESDE ' || :fecant || ' HASTA ' || (:FECDOC-1),
                    :codalq, 0, 0, :BASE, 1, null, 'N', 'N', null, null, null, null, null, null, null, null, :cantr,  :diasr);
                end
            CANTR = CANTR - ENTR + SALI;
            FECANT = FECDOC;
            end
        /* FACTURE LOS DIAS FINALES */
        CANT = (FECFIN + 1 - FECANT) * CANTR;
        DIASR = FECFIN + 1 - FECANT;
        if (CANT <> 0) then
            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
            if (item = 0) then
                begin
                IDF = gen_id(id_factura, 1);
                insert into FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
                    FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
                    FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
                    FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
                    FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
                    FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
                    FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_FECINI, FACT_FECFIN, FACT_RTCREE, FACT_RTCREEM)
                    values (:IDF, :PTVT, :VEND, :NIT, null, :NUMERO, :FECHA, null, (:FECHA + :DIAS), :IVAINC,
                    0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, null,
                    :NOMBRE, null, null, null, 'N', 'S', :TOTAL, :BOD, null, null, null, 0, user, :sucursal, 'N', :VEND, 1, null,
                    null, null, null, null, 1, :fecini, :fecfin, :rtcree, :rtcreem);
                end
            ITEM = ITEM + 1;
            insert into FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE)
                values (:IDF, :ITEM, :BOD, :codalq, :CANT, :UNIDAD, null, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, 'REMISION ' || :REMISION || ' DESDE ' || :fecant || ' HASTA ' || :fecfin, :codalq, 0, 0, :BASE,
                1, null, 'N', 'N', null, null, null, null, null, null, null, null, :cantr, :diasr);
            end
        end

    if (idf <> 0) then
        begin
        /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
        select sum(FADE_TOTAL), sum(FADE_IVAMONTO) from facturas_detalle where FACT_ID = :idf
            into :TOTAL, :IVAM;
        BASE = TOTAL - IVAM;
        if (BASE >= RTFTEM) then
            begin
            RTFTEM = BASE * RTFTE / 100;
            RTIVAM = IVAM * RTIVA / 100;
            end
        else
            begin
            RTFTEM = 0;
            RTIVAM = 0;
            end
        RTCREEM = BASE * RTCREE / 100;
        if (BASE >= RTICAM) then
            RTICAM = BASE * RTICA / 1000;
        else
            RTICAM = 0;
        execute procedure redondee(TOTAL, REDONT) returning_values (TOTAL);
        execute procedure redondee(IVAM, REDONT) returning_values (IVAM);
        execute procedure redondee(RTFTEM, REDONT) returning_values (RTFTEM);
        execute procedure redondee(RTIVAM, REDONT) returning_values (RTIVAM);
        execute procedure redondee(RTICAM, REDONT) returning_values (RTICAM);
        update FACTURAS set FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam, FACT_TRANSMIT = 'N'
            where FACT_ID = :IDF;
    
        /* contabilice */
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        execute procedure contabiliza_pendiente (:IDC);

        /* marque el cliente com ofacturado a la fecha */
        update or insert into factura_alquiler (faal_cliente, FAAL_SUCURSAL, faal_fecha) values (:nit, :sucursal, :fecha);

        /* agregue los fletes */
        /* CUENTE REMISIONES Y DEVOLUCIONES DEL PERIODO */
        NUMREM = 0;
        VRFLETER = 0;
        OBS = 'REMISIONES:';
        for select CAST(CAST(REVT_NUMERO AS INTEGER) AS VARCHAR(12)), REVT_VRFLETE from remisiones_venta R where revt_anulado = 'N' and r.revt_flete = 'S' and
            r.terc_nit = :nit and r.revt_sucursal = :sucursal AND revt_fecha >= :fecini AND revt_fecha <= :fecfin
            into :REMISION, :FLETER
            DO
            BEGIN
            NUMREM = NUMREM + 1;
            OBS = OBS || :REMISION || ',';
            VRFLETER = VRFLETER + FLETER;
            END
        /* QUITE LA COMA FINAL */
        if (NUMREM > 0) then
            OBS = SUBSTRING(OBS FROM 1 FOR STRLEN(OBS)-1);
        ELSE
            OBS = '';
        NUMDEV = 0;
        VRFLETED = 0;
        OBS = OBS || ' DEVOLUCIONES:';
        FOR select CAST(CAST(DEVT_NUMERO AS INTEGER) AS VARCHAR(12)), DEVT_VRFLETE from devoluciones_ventas d where devt_anulado = 'N' and d.devt_flete = 'S' and
            D.terc_nit = :nit and D.devt_sucursal = :sucursal and devt_devrem = 'S' AND devt_fecha >= :fecini AND devt_fecha <= :fecfin
            into :REMISION, :FLETED
            DO
            BEGIN
            NUMDEV = NUMDEV + 1;
            OBS = OBS || :REMISION || ',';
            VRFLETED = VRFLETED + FLETED;
            END
        /* QUITE LA COMA FINAL O LA PALABRA DEVOLUCIONES SI NO HAY */
        if (NUMDEV > 0) then
            OBS = SUBSTRING(OBS FROM 1 FOR STRLEN(OBS)-1);
        ELSE
            OBS = SUBSTRING(OBS FROM 1 FOR STRLEN(OBS)-14);
        NUMREM = NUMREM + NUMDEV;
        VRFLETER = VRFLETER + VRFLETED;
        if (NUMREM <> 0) then
            begin
            IDFF = gen_id(id_factura, 1);
            select PREF_ACTUAL, PREF_IVAINC from PREFIJOS where TIDO_COD = 31 and PREF_PRE = :preff
                into :NUMERO, :IVAINC;
            select max(INVE_ID) from interfaz_ventas where PREF_PRE = :preff and TIDO_COD = 31 into :IDCF;
            execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO ARTICULO PARA FACTURA DE VENTA AUTOMATICA POR FLETE') returning_values (:articulo);
            select arti_des, arti_unidad, I.taiv_porc from ARTICULO A, TARIFA_IVA I where arti_cod = :articulo and A.taiv_cod = I.taiv_cod
                into :DESCR, :UNIDAD, :IVAP;
            prunit = VRFLETER / NUMREM;
            CANT = NUMREM;
            if (IVAINC = 'S') then
                begin
                IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                BASE = :CANT * :PRUNIT - IVAM;
                TOTAL = BASE;
                end
            else
                begin
                IVAM = :CANT * :PRUNIT * IVAP / 100;
                BASE = :CANT * :PRUNIT;
                TOTAL = BASE + IVAM;
                end
            if (BASE >= RTFTEM) then
                begin
                RTFTEM = BASE * RTFTE / 100;
                RTIVAM = IVAM * RTIVA / 100;
                end
            else
                begin
                RTFTEM = 0;
                RTIVAM = 0;
                end
            RTCREEM = BASE * RTCREE / 100;
            if (BASE >= RTICAM) then
                RTICAM = BASE * RTICA / 1000;
            else
                RTICAM = 0;
            execute procedure redondee(TOTAL, REDONT) returning_values (TOTAL);
            execute procedure redondee(IVAM, REDONT) returning_values (IVAM);
            execute procedure redondee(RTFTEM, REDONT) returning_values (RTFTEM);
            execute procedure redondee(RTIVAM, REDONT) returning_values (RTIVAM);
            execute procedure redondee(RTICAM, REDONT) returning_values (RTICAM);
            insert into FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
                FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
                FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
                FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
                FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
                FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
                FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_FECINI, FACT_FECFIN, FACT_RTCREE, FACT_RTCREEM)
                values (:IDFF, :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, :PREFF, null,
                :NOMBRE, null, null, null, 'N', 'N', :TOTAL, :BOD, null, null, null, 0, user, :sucursal, 'N', :VEND, 1, null,
                null, null, null, null, 1, :fecini, :fecfin, :rtcree, :rtcreem);
            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 (:IDFF, 1, :BOD, :articulo, :CANT, :UNIDAD, null, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, :OBS, :articulo, 0, 0, :BASE, 1, null, 'N', 'N', null, null, null, null, null, null, null, null);
            end
        execute procedure CONTABIL_FACTURA(:idff,  :IDCF) returning_values (:ERROR, :VER, :IDC);
        execute procedure contabiliza_pendiente (:IDC);
        suspend;
        end
    end
end^


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

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

    OK = 'S';
    if (FACTMES = 'SI') then
        begin
        if (EXISTS(SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_SUCURSAL = :sucursal AND FAME_ANO = EXTRACT(YEAR FROM :FECHA) AND FAME_MES = EXTRACT(MONTH FROM :FECHA))) then
            OK = 'N';
        end
    if (OK = 'S') then
        BEGIN
        if (EXISTS (SELECT CLFA_ID FROM clientes_facturacion_masiva WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL)) then
            BEGIN
            FOR SELECT CLFA_DETCLI, CLFA_DETCLINOM FROM clientes_facturacion_masiva WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL
                INTO :DETCLI, DETCLINOM
                DO
                BEGIN
                IDF = GEN_ID(id_factura, 1);
                INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
                    FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
                    FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
                    FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
                    FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
                    FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
                    FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_FECINI, FACT_FECFIN, FACT_RTCREE, FACT_RTCREEM)
                    VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
                    0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, :dtopp, 0, :fecdto, :PREFIJO, NULL,
                    :NOMBRE, NULL, NULL, NULL, 'N', 'S', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, :sucursal, 'N', :VEND, 1, :DETCLI,
                    :DETCLINOM, NULL, NULL, NULL, 1, :fecini, :fecfin, :rtcree, :rtcreem);
        
                FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
                    FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
                    WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
                    INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
                    DO
                    BEGIN
                    /* busque el precio por cliente */
                    if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                        SELECT CLSU_VALORMES FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :PRUNIT;
        
                    if (IVAINC = 'S') then
                        BEGIN
                        IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                        BASE = :CANT * :PRUNIT;
                        END
                    ELSE
                        BEGIN
                        IVAM = :CANT * :PRUNIT * IVAP / 100;
                        BASE = :CANT * :PRUNIT + IVAM;
                        END
                    EXECUTE PROCEDURE redondee(IVAM, REDON) returning_values (IVAM);
                    EXECUTE PROCEDURE redondee(BASE, REDON) returning_values (BASE);
                    INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                        FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                        FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                        FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                        FADE_DTOM3, FADE_CAJAS)
                        VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                        :descr, NULL, :articulo, 0, 0, :BASE, 1, :refer, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
                    END
        
                /* SI HAY TASA DE MORA AGREGUE EL ITEM */
                execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE ARTICULO PARA FACTURAR INTERESES DE MORA') returning_values (:articulo);
                if ((ARTICULO <> '') AND (MORA <> 0)) then
                    BEGIN
                    select sum(SALDO) from vencido_cliente (:nit, :fecini, '01', 'N') INTO :SALDO;
                    PRUNIT = SALDO * MORA / 100;
                    EXECUTE PROCEDURE redondee(PRUNIT, REDON) returning_values (PRUNIT);
                    if (PRUNIT > 0) then
                        BEGIN
                        ivap = 0;
                        IVAM = 0;
                        SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DESCR, :UNIDAD;
                        INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                            FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                            FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                            FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                            FADE_DTOM3, FADE_CAJAS)
                            VALUES (:IDF, :ITEM+1, :BOD, :articulo, 1, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                            :descr, NULL, :articulo, 0, 0, :PRUNIT, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
                        END
                    END
                /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
                SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
                    INTO :TOTAL, :IVAM;
                BASE = TOTAL - IVAM;
                if (BASE >= RTFTEM) then
                    BEGIN
                    RTFTEM = BASE * RTFTE / 100;
                    RTIVAM = IVAM * RTIVA / 100;
                    END
                ELSE
                    BEGIN
                    RTFTEM = 0;
                    RTIVAM = 0;
                    END
                RTCREEM = BASE * RTCREE / 100;
                if (BASE >= RTICAM) then
                    RTICAM = BASE * RTICA / 1000;
                else
                    RTICAM = 0;
                dtoppm = BASE * dtopp / 100;
                EXECUTE PROCEDURE redondee(TOTAL, REDONT) returning_values (TOTAL);
                EXECUTE PROCEDURE redondee(IVAM, REDONT) returning_values (IVAM);
                EXECUTE PROCEDURE redondee(RTFTEM, REDONT) returning_values (RTFTEM);
                EXECUTE PROCEDURE redondee(RTIVAM, REDONT) returning_values (RTIVAM);
                EXECUTE PROCEDURE redondee(RTICAM, REDONT) returning_values (RTICAM);
                EXECUTE PROCEDURE redondee(RTCREEM, REDONT) returning_values (RTCREEM);
                EXECUTE PROCEDURE redondee(dtoppm, REDONT) returning_values (dtoppm);
                UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
                    FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam, FACT_RTCREEM = :rtcreem, FACT_TRANSMIT = 'N', FACT_DTOFMONTO = :dtoppm
                    WHERE FACT_ID = :IDF;
        
                /* contabilice */
                execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
                EXECUTE procedure contabiliza_pendiente (:IDC);
                suspend;
                END
            END
        ELSE
            BEGIN
            IDF = GEN_ID(id_factura, 1);
            INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
                FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
                FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
                FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
                FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
                FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
                FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_FECINI, FACT_FECFIN, FACT_RTCREE, FACT_RTCREEM)
                VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
                0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
                :NOMBRE, NULL, NULL, NULL, 'N', 'S', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, :sucursal, 'N', :VEND, 1, NULL,
                NULL, NULL, NULL, NULL, 1, :fecini, :fecfin, :rtcree, :rtcreem);
        
            FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
                FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
                WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
                INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
                DO
                BEGIN
                /* busque el precio por cliente */
                if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                    SELECT CLSU_VALORMES FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :PRUNIT;
        
                if (IVAINC = 'S') then
                    BEGIN
                    IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                    BASE = :CANT * :PRUNIT;
                    END
                ELSE
                    BEGIN
                    IVAM = :CANT * :PRUNIT * IVAP / 100;
                    BASE = :CANT * :PRUNIT + IVAM;
                    END
                EXECUTE PROCEDURE redondee(IVAM, REDON) returning_values (IVAM);
                EXECUTE PROCEDURE redondee(BASE, REDON) returning_values (BASE);
                INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                    FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                    FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                    FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                    FADE_DTOM3, FADE_CAJAS)
                    VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                    :descr, NULL, :articulo, 0, 0, :BASE, 1, :refer, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
                END
        
            /* SI HAY TASA DE MORA AGREGUE EL ITEM */
            execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE ARTICULO PARA FACTURAR INTERESES DE MORA') returning_values (:articulo);
            if ((ARTICULO <> '') AND (MORA <> 0)) then
                BEGIN
                select sum(SALDO) from vencido_cliente (:nit, :fecini, '01', 'N') INTO :SALDO;
                PRUNIT = SALDO * MORA / 100;
                EXECUTE PROCEDURE redondee(PRUNIT, REDON) returning_values (PRUNIT);
                if (PRUNIT > 0) then
                    BEGIN
                    ivap = 0;
                    IVAM = 0;
                    SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DESCR, :UNIDAD;
                    INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                        FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                        FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                        FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                        FADE_DTOM3, FADE_CAJAS)
                        VALUES (:IDF, :ITEM+1, :BOD, :articulo, 1, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                        :descr, NULL, :articulo, 0, 0, :PRUNIT, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
                    END
                END
            /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
            SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
                INTO :TOTAL, :IVAM;
            BASE = TOTAL - IVAM;
            if (BASE >= RTFTEM) then
                BEGIN
                RTFTEM = BASE * RTFTE / 100;
                RTIVAM = IVAM * RTIVA / 100;
                END
            ELSE
                BEGIN
                RTFTEM = 0;
                RTIVAM = 0;
                END
            RTCREEM = BASE * RTCREE / 100;
            if (BASE >= RTICAM) then
                RTICAM = BASE * RTICA / 1000;
            else
                RTICAM = 0;
            dtoppm = BASE * dtopp / 100;
            EXECUTE PROCEDURE redondee(TOTAL, REDONT) returning_values (TOTAL);
            EXECUTE PROCEDURE redondee(IVAM, REDONT) returning_values (IVAM);
            EXECUTE PROCEDURE redondee(RTFTEM, REDONT) returning_values (RTFTEM);
            EXECUTE PROCEDURE redondee(RTIVAM, REDONT) returning_values (RTIVAM);
            EXECUTE PROCEDURE redondee(RTICAM, REDONT) returning_values (RTICAM);
            EXECUTE PROCEDURE redondee(RTCREEM, REDONT) returning_values (RTCREEM);
            EXECUTE PROCEDURE redondee(dtoppm, REDONT) returning_values (dtoppm);
            UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
                FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam, FACT_RTCREEM = :rtcreem, FACT_TRANSMIT = 'N', FACT_DTOFMONTO = :dtoppm
                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
end^


ALTER PROCEDURE FACTURAR_EVENTO (
    EVENTO INTEGER,
    FECHA DATE,
    PREFIJO VARCHAR(4),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3))
RETURNS (
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND_COD INTEGER;
declare variable PTVT_ID INTEGER;
declare variable PEDI_ID INTEGER;
declare variable NUMPED VARCHAR(12);
declare variable PEDI_DESPACHO VARCHAR(255);
declare variable PEDI_OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80;
declare variable PEDI_DTOPOR NUMERIC(9,2);
declare variable PEDI_DTOMONTO NUMERIC(18,2);
declare variable PEDI_ADICIONAL NUMERIC(18,2);
declare variable PEDI_IVAMONTO NUMERIC(18,2);
declare variable PEDI_EXTRA NUMERIC(18,2);
declare variable PEDI_TOTAL NUMERIC(18,2);
declare variable PEDI_RTFTEPORC NUMERIC(9,2);
declare variable PEDI_RTFTEMONTO NUMERIC(18,2);
declare variable PEDI_RTIVAPORC NUMERIC(9,2);
declare variable PEDI_RTIVAMONTO NUMERIC(18,2);
declare variable PEDI_RTICAPORC NUMERIC(9,2);
declare variable PEDI_RTICAMONTO NUMERIC(18,2);
declare variable PEDI_TRM NUMERIC(18,2);
declare variable PEDI_DTOIT1 NUMERIC(18,2);
declare variable PEDI_DTOIT2 NUMERIC(18,2);
declare variable PEDI_DTOIT3 NUMERIC(18,2);
declare variable PEDI_DIASCR INTEGER;
declare variable PEDI_ENTREGA DATE;
declare variable PEDI_RTCREE NUMERIC(9,2);
declare variable PEDI_RTCREEM NUMERIC(18,2);
declare variable PEDE_ITEM INTEGER;
declare variable ARTI_COD VARCHAR(20);
declare variable PEDE_CANT NUMERIC(18,4);
declare variable PEDE_UNIDAD VARCHAR(8);
declare variable PEDE_DTOPORC NUMERIC(9,2);
declare variable PEDE_DTOMONTO NUMERIC(18,2);
declare variable PEDE_IVAPORC NUMERIC(9,2);
declare variable PEDE_IVAMONTO NUMERIC(18,2);
declare variable PEDE_CONSUMO NUMERIC(18,2);
declare variable PEDE_FACTOR NUMERIC(18,4);
declare variable PEDE_DESC VARCHAR(60);
declare variable PEDE_OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80;
declare variable PEDE_CODBAR VARCHAR(20);
declare variable PEDE_TOTAL NUMERIC(18,2);
declare variable LIPR_COD INTEGER;
declare variable PEDE_REFERENCIA VARCHAR(60);
declare variable PEDE_PRUNIT NUMERIC(18,2);
declare variable BODE_COD VARCHAR(2);
declare variable PEDE_DTO1 NUMERIC(9,2);
declare variable PEDE_DTO2 NUMERIC(9,2);
declare variable PEDE_DTO3 NUMERIC(9,2);
declare variable PEDE_DTOM1 NUMERIC(18,2);
declare variable PEDE_DTOM2 NUMERIC(18,2);
declare variable PEDE_DTOM3 NUMERIC(18,2);
declare variable PEDE_TIVA SMALLINT;
declare variable IVAINC CHAR(1);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable SALDO NUMERIC(18,2);
declare variable REDONT INTEGER;
declare variable CANTOTAL NUMERIC(18,4);
declare variable PORC NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable RTCREE NUMERIC(18,2);
declare variable ITEM INTEGER;
declare variable IDEX INTEGER;
declare variable DOCUMENTO VARCHAR(8);
declare variable TIPO INTEGER;
begin
EXECUTE procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:redont);
EXECUTE procedure lee_configuracion ('FACTURACION', 'PEDIDOS', 'DOCUMENTO A GENERAR CON BASE EN LOS PEDIDOS POR EVENTO') returning_values (:documento);
if (DOCUMENTO = 'FACTURA') then
    TIPO = 31;
ELSE
    TIPO = 32;
IDEX = GEN_ID(ID_EVENEXIS, 1);
FOR SELECT PEDI_ID, PREF_PRE || PEDI_NUMERO, TERC_NIT, VEND_COD, PEDI_DESPACHO, PEDI_OBS, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO,
    PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PTVT_ID,  PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO,
    PEDI_SUCURSAL, PEDI_TRM, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3, PEDI_DIASCR,
    PEDI_ENTREGA, PEDI_RTCREE, PEDI_RTCREEM
    FROM PEDIDOS P WHERE PEDI_EVENTO = :EVENTO AND PEDI_ANULADO = 'N' AND
    EXISTS (select PEDE_ITEM FROM PEDIDOS_DETALLE PD, ARTICULO A WHERE PEDI_ID = P.pedi_id AND A.arti_cod = PD.arti_cod AND
        ((A.grup_cod = :GRUPO) ) AND ((A.subg_cod = :subgrupo) ))
    ORDER BY PEDI_ID
    INTO :PEDI_ID, :NUMPED, :NIT, :VEND_COD, :PEDI_DESPACHO, :PEDI_OBS, :nombre, :PEDI_DTOPOR, :PEDI_DTOMONTO,
    :PEDI_ADICIONAL, :PEDI_IVAMONTO, :PEDI_EXTRA, :PEDI_TOTAL, :PTVT_ID, :PEDI_RTFTEPORC, :PEDI_RTFTEMONTO, :PEDI_RTIVAPORC, :PEDI_RTIVAMONTO, :PEDI_RTICAPORC, :PEDI_RTICAMONTO,
    :SUCURSAL, :PEDI_TRM, :PEDI_DTOIT1, :PEDI_DTOIT2, :PEDI_DTOIT3, :PEDI_DIASCR,
    :PEDI_ENTREGA, :PEDI_RTCREE, :PEDI_RTCREEM
    DO
    BEGIN
    IDF = 0;
    ITEM = 0;
    /* SI NO SE HA FACTURADO ALGO DE ESE SUBGRUPO */
    SELECT first 1 C.cofa_item FROM CONSOLIDADO_FALTANTES C, ARTICULO A WHERE C.cofa_tipoori = 34 AND C.cofa_tipodes = :TIPO AND
        C.cofa_idori = :PEDI_ID AND C.arti_cod = A.arti_cod AND (A.grup_cod = :GRUPO) AND (A.subg_cod = :subgrupo) AND
        C.cofa_cantcr <> 0 INTO :ITEM;
    if ((ITEM = 0) OR (ITEM IS NULL)) then
        BEGIN
        FOR SELECT PEDE_ITEM, PD.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, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT,
            BODE_COD, PEDE_DTO1, PEDE_DTO2, PEDE_DTO3, PEDE_DTOM1, PEDE_DTOM2, PEDE_DTOM3, PEDE_TIVA
            FROM PEDIDOS_DETALLE PD, ARTICULO A where PEDI_ID = :PEDI_ID AND PD.arti_cod = A.arti_cod AND
            ((A.grup_cod = :GRUPO)) AND ((A.subg_cod = :subgrupo))
            INTO :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, :LIPR_COD, :PEDE_REFERENCIA, :PEDE_PRUNIT,
            :BODE_COD, :PEDE_DTO1, :PEDE_DTO2, :PEDE_DTO3, :PEDE_DTOM1, :PEDE_DTOM2, :PEDE_DTOM3, :PEDE_TIVA
            DO
            BEGIN
            /* SI ES LA PRIMERA OCURRENCIA DEL ARTICULO, GUARDE LA EXISTENCIA */
            if (NOT EXISTS (SELECT EVEX_ID FROM EVENTO_EXISTENCIAS WHERE EVEX_ID = :IDEX AND EVEN_ID = :evento AND ARTI_COD = :ARTI_COD)) then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario(:arti_cod, :FECHA) returning_values (:SALDO);
                /* TRAIGA EL TOTAL DEL ARTICULO DEL EVENTO Y AJUSTE LA PROPORCION REDONDEANDO HACIA ABAJO */
                SELECT SUM(PEDE_CANT*PEDE_FACTOR) FROM PEDIDOS_DETALLE PD, PEDIDOS P
                    WHERE P.pedi_id = PD.pedi_id AND PD.ARTI_COD = :ARTI_COD AND P.pedi_anulado = 'N' AND PEDI_EVENTO = :EVENTO
                    AND NOT EXISTS (SELECT C.cofa_item FROM CONSOLIDADO_FALTANTES C WHERE C.cofa_tipoori = 34 AND
                    C.cofa_tipodes = :TIPO AND C.cofa_idori = P.pedi_id AND C.arti_cod = :arti_cod AND C.cofa_cantcr <> 0)
                    INTO :CANTOTAL;
                if (CANTOTAL IS NULL) then
                    CANTOTAL = 0;
                INSERT INTO EVENTO_EXISTENCIAS (EVEX_ID, EVEN_ID, ARTI_COD, EVEX_EXIST, EVEX_PEDIDO)
                    VALUES (:IDEX, :evento, :arti_cod, :SALDO, :CANTOTAL);
                END
            ELSE
                SELECT EVEX_EXIST, EVEX_PEDIDO FROM EVENTO_EXISTENCIAS
                    WHERE EVEX_ID = :IDEX AND EVEN_ID = :evento AND ARTI_COD = :ARTI_COD
                    INTO :SALDO, :CANTOTAL;
            if (CANTOTAL <> 0) then
                BEGIN
                if (CANTOTAL > SALDO) then
                    BEGIN
                    PORC = SALDO / CANTOTAL;
                    END
                ELSE
                    PORC = 1;
        
                PEDE_CANT = PEDE_CANT * PEDE_FACTOR;
                PEDE_prunit = PEDE_prunit / PEDE_FACTOR;
                PEDE_FACTOR = 1;
                SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTI_COD INTO PEDE_UNIDAD;
                PEDE_CANT = ROUND(PEDE_CANT * PORC, 0);
                if (PEDE_CANT = 0) then
                    PEDE_CANT = 1;
                EXECUTE PROCEDURE saldo_total_inventario(:arti_cod, :FECHA) returning_values (:SALDO);
                if (PEDE_CANT <= :SALDO) THEN
                    BEGIN
                    if (IDF = 0) then
                        BEGIN
                        IDC = GEN_ID(id_cons, 1);
                        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                            VALUES (:IDC, 1, :TIPO, 34, :PEDI_ID);
                        EXECUTE PROCEDURE consolide_pendientes (:IDC);
                        SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS P WHERE TIDO_COD = :TIPO AND P.PREF_PRE = :prefijo INTO :NUMERO, :IVAINC;
                        if (DOCUMENTO = 'FACTURA') then
                            BEGIN
                            IDF = GEN_ID(id_factura, 1);
                            INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, 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_NOMCLIENTE, FACT_PEDIDO,
                                FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, FACT_CONSOLIDA,
                                FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR,
                                FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_RTCREE, FACT_RTCREEM, FACT_ENTREGA)
                                VALUES (:IDF, :PTVT_ID, :VEND_COD, :NIT, :NUMERO, :FECHA, :PEDI_DESPACHO,
                                (:FECHA + :PEDI_DIASCR), :IVAINC, 0, 0, :PEDI_DTOPOR, :PEDI_DTOMONTO, :PEDI_ADICIONAL,
                                :PEDI_IVAMONTO, :PEDI_RTFTEPORC, :PEDI_RTFTEMONTO, :PEDI_RTIVAPORC, :PEDI_RTIVAMONTO, :PEDI_RTICAPORC, :PEDI_RTICAMONTO,
                                :PEDI_EXTRA, 0, 0, :FECHA, :PREFIJO, :nombre, :NUMPED,
                                'N', 'S', :PEDI_TOTAL, :bode_cod, :PEDI_OBS, :IDC, 0, USER, :sucursal, 'N', :VEND_COD, 1,
                                :PEDI_DTOIT1, :PEDI_DTOIT2, :PEDI_DTOIT3, :pedi_trm, :PEDI_RTCREE, :PEDI_RTCREEM, :PEDI_ENTREGA);
                            END
                        else
                            BEGIN
                            IDF = GEN_ID(id_remiclie, 1);
                            insert into REMISIONES_VENTA (REVT_ID, TERC_NIT, VEND_COD, BODE_COD, TIDO_COD, PREF_PRE, REVT_NUMERO, REVT_FECHA,
                                REVT_CONC, REVT_OBS, REVT_DESPACHO, REVT_IVAINC, REVT_ANULADO, REVT_TRANSMIT,
                                REVT_NOMTERC, REVT_TOTAL, REVT_IVAMONTO, PTVT_ID, LIPR_COD, REVT_COTIZACI, REVT_PEDIDO,
                                REVT_FACTURA, REVT_NROCOPIA, REVT_TRANSP, REVT_CONSOLIDA, REVT_USUARIO, REVT_SUCURSAL,
                                NUMOK, REVT_TRM, REMI_PENDIENTE, REVT_FLETE, REVT_VEHICULO, REVT_VRFLETE)
                                VALUES (:IDF, :NIT, :VEND_COD, :bode_cod, 32, :PREFIJO, :NUMERO, :FECHA,
                                NULL, :PEDI_OBS, :PEDI_DESPACHO, :IVAINC, 'N', 'S', 
                                :nombre, 0, 0,  :ptvt_id, null, null, :NUMPED,
                                null, null, null, :IDC, USER, :sucursal, 'N', :pedi_trm, null, 'N', null, 0);
                            END
                        END
    
                    IVAP = PEDE_IVAPORC / 100;
                    if (IVAINC = 'S') then
                        BEGIN
                        IVAP = IVAP / (1 + IVAP);
                        PEDE_IVAMONTO = (PEDE_CANT * PEDE_PRUNIT) * IVAP;
                        PEDE_TOTAL = PEDE_CANT * PEDE_PRUNIT;
                        END
                    ELSE
                        BEGIN
                        PEDE_IVAMONTO = PEDE_CANT * PEDE_PRUNIT * IVAP;
                        PEDE_TOTAL = (PEDE_CANT * PEDE_PRUNIT) + PEDE_IVAMONTO;
                        END
                    EXECUTE PROCEDURE redondee(PEDE_IVAMONTO, redont) returning_values (PEDE_IVAMONTO);
                    EXECUTE PROCEDURE redondee(PEDE_TOTAL, redont) returning_values (PEDE_TOTAL);
                    if (DOCUMENTO = 'FACTURA') then
                        BEGIN
                        INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                            FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                            FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                            FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                            FADE_DTOM3, FADE_CAJAS, FADE_TIVA)
                            VALUES (:IDF, :PEDE_ITEM, :bode_cod, :arti_cod, :PEDE_CANT, :PEDE_UNIDAD, NULL,
                            :pede_prunit, :pede_dtoporc, :pede_dtomonto, :pede_ivaporc, :pede_ivamonto, :PEDE_CONSUMO, 1,
                            :pede_desc, :pede_obs, :pede_codbar, 0, 0, :pede_total, :lipr_cod, :pede_referencia,
                            'N', 'N', NULL, :pede_dto1, :pede_dto2, :pede_dto3, :pede_dtom1, :pede_dtom2, :pede_dtom3, NULL, :pede_tiva);
                        END
                    ELSE
                        BEGIN
                        insert into REMISIONES_VENTA_DETALLE (REVT_ID, RVDE_ITEM, BODE_COD, ARTI_COD, RVDE_CANT, RVDE_UNIDAD, RVDE_LOTE,
                            RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO,
                            RVDE_CONSUMO, RVDE_FACTOR, RVDE_DESC, RVDE_OBS, RVDE_CODBAR, RVDE_FACTURADO,
                            RVDE_TOTAL, RVDE_ANULADO, RVDE_TRANSMIT, RVDE_REFERENCIA, LIPR_COD, RVDE_DEVUELTO,
                            RVDE_CAJAS, RVDE_INALCP, RVDE_INALCM, RVDE_TIVA)
                            VALUES (:IDF, :PEDE_ITEM, :bode_cod, :arti_cod, :PEDE_CANT, :PEDE_UNIDAD, NULL,
                            :pede_prunit, :pede_dtoporc, :pede_dtomonto, :pede_ivaporc, :pede_ivamonto,
                            :PEDE_CONSUMO, 1, :pede_desc, :pede_obs, :pede_codbar, 0,
                            :pede_total, 'N', 'N', :pede_referencia, :lipr_cod, 0,
                            NULL, 0, 0, :pede_tiva);
                        END
                    END
                END
            END
        if (IDF <> 0) then
            BEGIN
            /* CALCULE EL TOTAL XA EFECTOS DE IMPUESTOS */
            if (DOCUMENTO = 'FACTURA') then
                SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
                    INTO :TOTAL, :IVAM;
            else
                SELECT SUM(RVDE_TOTAL), SUM(RVDE_IVAMONTO) FROM remisiones_venta_detalle WHERE REVT_ID = :idf
                    INTO :TOTAL, :IVAM;
            BASE = TOTAL - IVAM;
            SELECT CLIE_RTFTEBASE, CLIE_RTICABASE FROM CLIENTES WHERE TERC_NIT = :nit INTO :RTFTEM, :RTICAM;
            if (BASE >= RTFTEM) then
                BEGIN
                RTFTEM = BASE * :pedi_rtfteporc / 100;
                RTIVAM = IVAM * :pedi_rtivaporc / 100;
                END
            ELSE
                BEGIN
                RTFTEM = 0;
                RTIVAM = 0;
                END
            RTCREE = BASE * :pedi_rtcree / 100;
            if (BASE >= RTICAM) then
                RTICAM = BASE * :pedi_rticaporc / 1000;
            else
                RTICAM = 0;
            EXECUTE PROCEDURE redondee(TOTAL, REDONT) returning_values (TOTAL);
            EXECUTE PROCEDURE redondee(IVAM, REDONT) returning_values (IVAM);
            EXECUTE PROCEDURE redondee(RTFTEM, REDONT) returning_values (RTFTEM);
            EXECUTE PROCEDURE redondee(RTIVAM, REDONT) returning_values (RTIVAM);
            EXECUTE PROCEDURE redondee(RTICAM, REDONT) returning_values (RTICAM);
            EXECUTE PROCEDURE redondee(RTCREE, REDONT) returning_values (RTCREE);
            if (DOCUMENTO = 'FACTURA') then
                BEGIN
                UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
                    FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam, FACT_RTCREEM = :rtcree, FACT_TRANSMIT = 'N'
                    WHERE FACT_ID = :IDF;
                SELECT FACT_NUMERO FROM FACTURAS WHERE FACT_ID = :IDF INTO :NUMERO;
                END
            ELSE
                BEGIN
                UPDATE remisiones_venta SET REVT_TOTAL = :total,  REVT_IVAMONTO = :IVAM, REVT_TRANSMIT = 'N'
                    WHERE REVT_ID = :IDF;
                SELECT REVT_NUMERO FROM remisiones_venta WHERE REVT_ID = :IDF INTO :NUMERO;
                END
            /* contabilice */
            SELECT FIRST 1 INVE_ID FROM INTERFAZ_VENTAS WHERE TIDO_COD = :TIPO AND PREF_PRE = :prefijo INTO :IDC;
            if (DOCUMENTO = 'FACTURA') then
                execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
            ELSE
                execute procedure contabil_remiclie(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
            EXECUTE procedure contabiliza_pendiente (:IDC);
            suspend;
            END
        END
    END
end^


ALTER PROCEDURE FACTURAR_PEDIDOS (
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8))
RETURNS (
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF integer;
declare variable IDC integer;
declare variable VEND_COD integer;
declare variable PTVT_ID integer;
declare variable PEDI_ID integer;
declare variable NUMPED varchar(12);
declare variable PEDI_DESPACHO varchar(255);
declare variable PEDI_OBS blob sub_type 0 segment size 80;
declare variable PEDI_DTOPOR numeric(9,2);
declare variable PEDI_DTOMONTO numeric(18,2);
declare variable PEDI_ADICIONAL numeric(18,2);
declare variable PEDI_IVAMONTO numeric(18,2);
declare variable PEDI_FECHA date;
declare variable PEDI_EXTRA numeric(18,2);
declare variable PEDI_TOTAL numeric(18,2);
declare variable PEDI_RTFTEPORC numeric(9,2);
declare variable PEDI_RTFTEMONTO numeric(18,2);
declare variable PEDI_RTIVAPORC numeric(9,2);
declare variable PEDI_RTIVAMONTO numeric(18,2);
declare variable PEDI_RTICAPORC numeric(9,2);
declare variable PEDI_RTICAMONTO numeric(18,2);
declare variable PEDI_TRM numeric(18,2);
declare variable PEDI_DTOIT1 numeric(18,2);
declare variable PEDI_DTOIT2 numeric(18,2);
declare variable PEDI_DTOIT3 numeric(18,2);
declare variable PEDI_DIASCR integer;
declare variable PEDI_ENTREGA date;
declare variable PEDI_RTCREE numeric(9,2);
declare variable PEDI_RTCREEM numeric(18,2);
declare variable PEDE_ITEM integer;
declare variable ARTI_COD varchar(20);
declare variable PEDE_CANT numeric(18,4);
declare variable PEDE_UNIDAD varchar(8);
declare variable PEDE_DTOPORC numeric(9,2);
declare variable PEDE_DTOMONTO numeric(18,2);
declare variable PEDE_IVAPORC numeric(9,2);
declare variable PEDE_IVAMONTO numeric(18,2);
declare variable PEDE_CONSUMO numeric(18,2);
declare variable PEDE_FACTOR numeric(18,4);
declare variable PEDE_DESC varchar(60);
declare variable PEDE_OBS blob sub_type 0 segment size 80;
declare variable PEDE_CODBAR varchar(20);
declare variable PEDE_TOTAL numeric(18,2);
declare variable LIPR_COD integer;
declare variable PEDE_REFERENCIA varchar(60);
declare variable PEDE_PRUNIT numeric(18,2);
declare variable BODE_COD varchar(2);
declare variable PEDE_DTO1 numeric(9,2);
declare variable PEDE_DTO2 numeric(9,2);
declare variable PEDE_DTO3 numeric(9,2);
declare variable PEDE_DTOM1 numeric(18,2);
declare variable PEDE_DTOM2 numeric(18,2);
declare variable PEDE_DTOM3 numeric(18,2);
declare variable PEDE_TIVA smallint;
declare variable IVAINC char(1);
declare variable ERROR integer;
declare variable VER char(1);
declare variable SALDO numeric(18,2);
declare variable REDONT integer;
declare variable IVAP numeric(18,2);
declare variable IVAM numeric(18,2);
declare variable BASE numeric(18,2);
declare variable RTFTEM numeric(18,2);
declare variable RTIVAM numeric(18,2);
declare variable RTICAM numeric(18,2);
declare variable RTCREE numeric(18,2);
declare variable ITEM integer;
declare variable PREF_PRE varchar(4);
declare variable PEDI_NUMERO varchar(8);
declare variable CONTADO CHAR(1);
begin
EXECUTE procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:redont);
PEDI_FECHA = CAST ('NOW' AS DATE);
FOR SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, TERC_NIT, VEND_COD, PEDI_DESPACHO, PEDI_OBS, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO,
    PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PTVT_ID,  PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO,
    PEDI_SUCURSAL, PEDI_TRM, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3, PEDI_DIASCR,
    PEDI_ENTREGA, PEDI_RTCREE, PEDI_RTCREEM
    FROM PEDIDOS P WHERE PEDI_ANULADO = 'N' AND P.PEDI_FECHA >= :FECINI AND P.PEDI_FECHA <= :FECFIN AND P.PREF_PRE >= :PREFINI
    AND P.PREF_PRE <= :PREFFIN AND P.PEDI_NUMERO >= :NUMINI AND P.PEDI_NUMERO <= :NUMFIN
    ORDER BY PEDI_ID
    INTO :PEDI_ID, :PREF_PRE, PEDI_NUMERO, :NIT, :VEND_COD, :PEDI_DESPACHO, :PEDI_OBS, :nombre, :PEDI_DTOPOR, :PEDI_DTOMONTO,
    :PEDI_ADICIONAL, :PEDI_IVAMONTO, :PEDI_EXTRA, :PEDI_TOTAL, :PTVT_ID, :PEDI_RTFTEPORC, :PEDI_RTFTEMONTO, :PEDI_RTIVAPORC, :PEDI_RTIVAMONTO, :PEDI_RTICAPORC, :PEDI_RTICAMONTO,
    :SUCURSAL, :PEDI_TRM, :PEDI_DTOIT1, :PEDI_DTOIT2, :PEDI_DTOIT3, :PEDI_DIASCR,
    :PEDI_ENTREGA, :PEDI_RTCREE, :PEDI_RTCREEM
    DO
    BEGIN
    NUMPED = :PREF_PRE || PEDI_NUMERO;
    IDF = 0;
    ITEM = 0;
    /* SI NO SE HA FACTURADO ALGO DE ESE SUBGRUPO */
    SELECT first 1 C.cofa_item FROM CONSOLIDADO_FALTANTES C WHERE C.cofa_tipoori = 34 AND C.cofa_tipodes = 31 AND
        C.cofa_idori = :PEDI_ID AND C.cofa_cantcr <> 0 INTO :ITEM;
    if ((ITEM = 0) OR (ITEM IS NULL)) then
        BEGIN
        FOR SELECT PEDE_ITEM, PD.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, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT,
            BODE_COD, PEDE_DTO1, PEDE_DTO2, PEDE_DTO3, PEDE_DTOM1, PEDE_DTOM2, PEDE_DTOM3, PEDE_TIVA
            FROM PEDIDOS_DETALLE PD where PEDI_ID = :PEDI_ID
            INTO :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, :LIPR_COD, :PEDE_REFERENCIA, :PEDE_PRUNIT,
            :BODE_COD, :PEDE_DTO1, :PEDE_DTO2, :PEDE_DTO3, :PEDE_DTOM1, :PEDE_DTOM2, :PEDE_DTOM3, :PEDE_TIVA
            DO
            BEGIN
                PEDE_CANT = PEDE_CANT * PEDE_FACTOR;
                PEDE_prunit = PEDE_prunit / PEDE_FACTOR;
                PEDE_FACTOR = 1;
                SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTI_COD INTO PEDE_UNIDAD;
                if (PEDE_CANT = 0) then
                    PEDE_CANT = 1;
                EXECUTE PROCEDURE saldo_total_inventario(:arti_cod, :PEDI_FECHA) returning_values (:SALDO);
                if (PEDE_CANT <= :SALDO) THEN
                    BEGIN
                    if (IDF = 0) then
                        BEGIN
                        IDF = GEN_ID(id_factura, 1);
                        IDC = GEN_ID(id_cons, 1);
                        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                            VALUES (:IDC, 1, 31, 34, :PEDI_ID);
                        EXECUTE PROCEDURE consolide_pendientes (:IDC);
                        SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS P WHERE TIDO_COD = 31 AND P.PREF_PRE = :PREF_PRE INTO :NUMERO, :IVAINC;
                        INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, 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_NOMCLIENTE, FACT_PEDIDO,
                            FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, FACT_CONSOLIDA,
                            FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR,
                            FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_RTCREE, FACT_RTCREEM, FACT_ENTREGA)
                            VALUES (:IDF, :PTVT_ID, :VEND_COD, :NIT, :NUMERO, :PEDI_FECHA, :PEDI_DESPACHO,
                            (:PEDI_FECHA + :PEDI_DIASCR), :IVAINC, 0, 0, :PEDI_DTOPOR, :PEDI_DTOMONTO, :PEDI_ADICIONAL,
                            :PEDI_IVAMONTO, :PEDI_RTFTEPORC, :PEDI_RTFTEMONTO, :PEDI_RTIVAPORC, :PEDI_RTIVAMONTO, :PEDI_RTICAPORC, :PEDI_RTICAMONTO,
                            :PEDI_EXTRA, 0, 0, :PEDI_FECHA, :PREF_PRE, :nombre, :NUMPED,
                            'N', 'S', :PEDI_TOTAL, :bode_cod, :PEDI_OBS, :IDC, 0, USER, :sucursal, 'N', :VEND_COD, 1,
                            :PEDI_DTOIT1, :PEDI_DTOIT2, :PEDI_DTOIT3, :pedi_trm, :PEDI_RTCREE, :PEDI_RTCREEM, :PEDI_ENTREGA);
                        END
    
                    IVAP = PEDE_IVAPORC / 100;
                    if (IVAINC = 'S') then
                        BEGIN
                        IVAP = IVAP / (1 + IVAP);
                        PEDE_IVAMONTO = (PEDE_CANT * PEDE_PRUNIT) * IVAP;
                        PEDE_TOTAL = PEDE_CANT * PEDE_PRUNIT;
                        END
                    ELSE
                        BEGIN
                        PEDE_IVAMONTO = PEDE_CANT * PEDE_PRUNIT * IVAP;
                        PEDE_TOTAL = (PEDE_CANT * PEDE_PRUNIT) + PEDE_IVAMONTO;
                        END
                    EXECUTE PROCEDURE redondee(PEDE_IVAMONTO, redont) returning_values (PEDE_IVAMONTO);
                    EXECUTE PROCEDURE redondee(PEDE_TOTAL, redont) returning_values (PEDE_TOTAL);
                    INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                        FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                        FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                        FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                        FADE_DTOM3, FADE_CAJAS, FADE_TIVA)
                        VALUES (:IDF, :PEDE_ITEM, :bode_cod, :arti_cod, :PEDE_CANT, :PEDE_UNIDAD, NULL,
                        :pede_prunit, :pede_dtoporc, :pede_dtomonto, :pede_ivaporc, :pede_ivamonto, :PEDE_CONSUMO, 1,
                        :pede_desc, :pede_obs, :pede_codbar, 0, 0, :pede_total, :lipr_cod, :pede_referencia,
                        'N', 'N', NULL, :pede_dto1, :pede_dto2, :pede_dto3, :pede_dtom1, :pede_dtom2, :pede_dtom3, NULL, :pede_tiva);
                    END
                END
            END
        if (IDF <> 0) then
            BEGIN
            /* CALCULE EL TOTAL DE LA FACTURA X EFECTOS DE IMPUESTOS */
            SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
                INTO :TOTAL, :IVAM;
            BASE = TOTAL - IVAM;
            SELECT CLIE_RTFTEBASE, CLIE_RTICABASE FROM CLIENTES WHERE TERC_NIT = :nit INTO :RTFTEM, :RTICAM;
            if (BASE >= RTFTEM) then
                BEGIN
                RTFTEM = BASE * :pedi_rtfteporc / 100;
                RTIVAM = IVAM * :pedi_rtivaporc / 100;
                END
            ELSE
                BEGIN
                RTFTEM = 0;
                RTIVAM = 0;
                END
            RTCREE = BASE * :pedi_rtcree / 100;
            if (BASE >= RTICAM) then
                RTICAM = BASE * :pedi_rticaporc / 1000;
            else
                RTICAM = 0;
            EXECUTE PROCEDURE redondee(TOTAL, REDONT) returning_values (TOTAL);
            EXECUTE PROCEDURE redondee(IVAM, REDONT) returning_values (IVAM);
            EXECUTE PROCEDURE redondee(RTFTEM, REDONT) returning_values (RTFTEM);
            EXECUTE PROCEDURE redondee(RTIVAM, REDONT) returning_values (RTIVAM);
            EXECUTE PROCEDURE redondee(RTICAM, REDONT) returning_values (RTICAM);
            EXECUTE PROCEDURE redondee(RTCREE, REDONT) returning_values (RTCREE);
            UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
                FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam, FACT_RTCREEM = :rtcree, FACT_TRANSMIT = 'N'
                WHERE FACT_ID = :IDF;
            SELECT FACT_NUMERO, AUTO_CONTADO FROM FACTURAS F, autorizaciones A WHERE FACT_ID = :IDF
            AND F.auto_numero = A.auto_numero and f.pref_pre = a.pref_pre INTO :NUMERO, :CONTADO;
            if (CONTADO = 'S') THEN
                EXECUTE PROCEDURE REGISTRA_RECIBO_FACTURA(:IDF);
            /* contabilice */
            SELECT FIRST 1 INVE_ID FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF_PRE INTO :IDC;
            execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
            EXECUTE procedure contabiliza_pendiente (:IDC);
            suspend;
            END
    END
end^


ALTER PROCEDURE FACTURAR_REMISION (
    IDR INTEGER,
    PREF VARCHAR(4))
RETURNS (
    IDF INTEGER,
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDC integer;
declare variable VEND_COD integer;
declare variable PTVT_ID integer;
declare variable NUMREM varchar(12);
declare variable REVT_DESPACHO varchar(255);
declare variable REVT_OBS blob sub_type 0 segment size 80;
declare variable REVT_IVAMONTO numeric(18,2);
declare variable REVT_FECHA date;
declare variable REVT_TOTAL numeric(18,2);
declare variable REVT_TRM numeric(18,2);
declare variable REVT_TRANSP varchar(60);
declare variable DIASCR integer;
declare variable ARTI_COD varchar(20);
declare variable RVDE_CANT numeric(18,4);
declare variable RVDE_UNIDAD varchar(8);
declare variable RVDE_LOTE varchar(15);
declare variable RVDE_FACTOR numeric(18,4);
declare variable RVDE_DTOPORC numeric(9,2);
declare variable RVDE_DTOMONTO numeric(18,2);
declare variable RVDE_IVAPORC numeric(9,2);
declare variable RVDE_IVAMONTO numeric(18,2);
declare variable RVDE_CONSUMO numeric(18,2);
declare variable RVDE_INALCP numeric(9,2);
declare variable RVDE_INALCM numeric(18,2);
declare variable RVDE_DESC varchar(60);
declare variable RVDE_OBS blob sub_type 0 segment size 80;
declare variable RVDE_CODBAR varchar(20);
declare variable RVDE_TOTAL numeric(18,2);
declare variable LIPR_COD integer;
declare variable RVDE_REFERENCIA varchar(60);
declare variable RVDE_PRUNIT numeric(18,2);
declare variable BODE_COD varchar(2);
declare variable RVDE_TIVA smallint;
declare variable IVAINC char(1);
declare variable ERROR integer;
declare variable VER char(1);
declare variable REDONT integer;
declare variable IVAM numeric(18,2);
declare variable BASE numeric(18,2);
declare variable RTFTEM numeric(18,2);
declare variable RTFTEP numeric(9,4);
declare variable RTIVAM numeric(18,2);
declare variable RTIVAP numeric(9,4);
declare variable RTICAM numeric(18,2);
declare variable RTICAP numeric(9,4);
declare variable RTCREE numeric(18,2);
declare variable RTCREP numeric(9,4);
declare variable ITEM integer;
declare variable CONTADO CHAR(1);
declare variable SUMA numeric(18,2);
declare variable TOPEFAC numeric(18,2);
declare variable IVAINCR CHAR(1);
declare variable CANTMAX NUMERIC(18,4);
declare variable DTOMAX NUMERIC(18,2);
declare variable IVAMAX NUMERIC(18,2);
declare variable INALCMAX NUMERIC(18,2);
declare variable CONSUMOMAX NUMERIC(18,2);
declare variable TOTALMAX NUMERIC(18,2);
begin
if (not exists (select cofa_id from consolidado_faltantes c where c.cofa_tipoori = 32 and c.cofa_tipodes = 31 and c.cofa_idori = :idr and c.cofa_cantcr <> 0)) then
    begin
    EXECUTE procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:redont);
    EXECUTE procedure lee_configuracion ('FACTURACION', 'REMISIONES', 'VALOR MAXIMO POR FACTURA AL LLAMR UNA REMISION PREVIA') returning_values (:TOPEFAC);
    REVT_FECHA = CAST ('NOW' AS DATE);
    select TERC_NIT, VEND_COD, BODE_COD, PREF_PRE || REVT_NUMERO, REVT_FECHA, REVT_OBS, REVT_IVAINC,
           REVT_DESPACHO, REVT_NOMTERC, REVT_TOTAL, REVT_IVAMONTO, PTVT_ID, LIPR_COD, REVT_TRANSP,
           REVT_SUCURSAL, REVT_TRM
    from REMISIONES_VENTA WHERE REVT_ANULADO = 'N' AND REVT_ID = :IDR
    into :NIT, :VEND_COD, :BODE_COD, :numrem, :REVT_FECHA, :REVT_OBS, :ivaincr,
         :REVT_DESPACHO, :nombre, :REVT_TOTAL, :REVT_IVAMONTO, :PTVT_ID, :LIPR_COD, :REVT_TRANSP,
         :SUCURSAL, :REVT_TRM;
    IDF = 0;
    SUMA = 0;
    for select RVDE_ITEM, BODE_COD, ARTI_COD, RVDE_CANT, RVDE_UNIDAD, RVDE_LOTE, RVDE_PRUNIT, RVDE_DTOPORC,
               RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_FACTOR, RVDE_DESC, RVDE_OBS, RVDE_CODBAR,
               RVDE_TOTAL, RVDE_REFERENCIA, LIPR_COD, RVDE_INALCP, RVDE_INALCM, RVDE_TIVA
        from REMISIONES_VENTA_DETALLE where REVT_ID = :idr
        into :ITEM, :BODE_COD, :ARTI_COD, :RVDE_CANT, :RVDE_UNIDAD, :RVDE_LOTE, :RVDE_PRUNIT, :RVDE_DTOPORC,
             :RVDE_DTOMONTO, :RVDE_IVAPORC, :RVDE_IVAMONTO, :RVDE_CONSUMO, :RVDE_FACTOR, :RVDE_DESC, :RVDE_OBS,
             :RVDE_CODBAR, :RVDE_TOTAL, :RVDE_REFERENCIA, :LIPR_COD,
             :RVDE_INALCP, :RVDE_INALCM, :RVDE_TIVA
        DO
        BEGIN
        if ((rvde_prunit > TOPEFAC) AND TOPEFAC <> 0) then
            exception precio_mayor_tope 'El precio unitario del articulo ' || :arti_cod || ' es mayor de ' || :topefac;

        if (IDF = 0) then
            BEGIN
            IDF = GEN_ID(id_factura, 1);
            IDC = GEN_ID(id_cons, 1);
            ITEM = 0;
            SUMA = 0;
            INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                VALUES (:IDC, 1, 31, 32, :IDR);
            EXECUTE PROCEDURE consolide_pendientes (:IDC);
            SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS P WHERE TIDO_COD = 31 AND P.PREF_PRE = :PREF INTO :NUMERO, :IVAINC;
            SELECT CLIE_DIAS FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DIASCR;
            if (diascr is null) then
                diascr = 0;
            INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, 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_NOMCLIENTE, FACT_REMISION,
                FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, FACT_CONSOLIDA, FACT_TRANSP,
                FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR,
                FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_RTCREE, FACT_RTCREEM, FACT_ENTREGA)
                VALUES (:IDF, :PTVT_ID, :VEND_COD, :NIT, :NUMERO, :REVT_FECHA, :REVT_DESPACHO,
                (:REVT_FECHA + :DIASCR), :IVAINC, 0, 0, 0, 0, 0,
                :REVT_IVAMONTO, 0, 0, 0, 0, 0, 0,
                0, 0, 0, :REVT_FECHA, :PREF, :nombre, :NUMREM,
                'N', 'S', :REVT_TOTAL, :bode_cod, :REVT_OBS, :IDC, :revt_transp, 0, USER, :sucursal, 'N', :VEND_COD, 1,
                0, 0, 0, :revt_trm, 0, 0, NULL);
            END
        cantmax = 0;
        if (((SUMA + RVDE_TOTAL) > TOPEFAC) AND (TOPEFAC <> 0)) then
            BEGIN
            /* calcule la cantidad maxima del articulo */
            WHILE (RVDE_CANT > 0) DO
                BEGIN
                CANTMAX = FLOOR((TOPEFAC-SUMA)/RVDE_PRUNIT);
                if (CANTMAX > RVDE_CANT) then
                    CANTMAX = RVDE_CANT;
                DTOMAX = RVDE_PRUNIT * (RVDE_DTOPORC/100);
                if (IVAINCR = 'S') then
                    BEGIN
                    IVAMAX = (CANTMAX * (RVDE_PRUNIT-DTOMAX) / (1 + (RVDE_IVAPORC/100))) * (RVDE_IVAPORC/100);
                    INALCMAX = (CANTMAX * (RVDE_PRUNIT-DTOMAX) / (1 + (RVDE_INALCP/100))) * (RVDE_INALCP/100);
                    CONSUMOMAX = (RVDE_CONSUMO / RVDE_CANT) * CANTMAX;
                    TOTALMAX = CANTMAX * (RVDE_PRUNIT*(1-RVDE_DTOPORC/100));
                    END
                ELSE
                    BEGIN
                    IVAMAX = CANTMAX * (RVDE_PRUNIT-DTOMAX) * (RVDE_IVAPORC/100);
                    INALCMAX = CANTMAX * (RVDE_PRUNIT-DTOMAX) * (RVDE_INALCP/100);
                    CONSUMOMAX = (RVDE_CONSUMO / RVDE_CANT) * CANTMAX;
                    TOTALMAX = (CANTMAX * (RVDE_PRUNIT-DTOMAX)) + IVAMAX + CONSUMOMAX + INALCMAX;
                    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, FADE_TIVA, FADE_INALCP, FADE_INALCM)
                    VALUES (:IDF, :ITEM, :bode_cod, :arti_cod, :CANTMAX, :RVDE_UNIDAD, :RVDE_LOTE,
                    :rvde_prunit, :rvde_dtoporc, :dtomax, :rvde_ivaporc, :ivamax, :CONSUMOMAX, :RVDE_FACTOR,
                    :rvde_desc, :rvde_obs, :rvde_codbar, 0, 0, :TOTALMAX, :lipr_cod, :rvde_referencia,
                    'N', 'N', NULL, 0, 0, 0, 0, 0, 0, NULL, :rvde_tiva, :rvde_inalcp, :inalcmax);
                SUMA = SUMA + TOTALMAX;
                RVDE_CANT = RVDE_CANT - CANTMAX;
                if (rvde_cant > 0) then
                    BEGIN
                    /* SI TODAVIA QUEDA CANTIDAD CIERRE LA FACTURA, CALCULE EL TOTAL E IMPUESTOS */
                    SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
                        INTO :TOTAL, :IVAM;
                    BASE = TOTAL - IVAM;
                    SELECT CLIE_RTEFTE, CLIE_RTFTEBASE, CLIE_RTEIVA, CLIE_RTEICA, CLIE_RTICABASE, CLIE_RTCREE
                        FROM CLIENTES WHERE TERC_NIT = :nit
                        INTO :rtftep, RTFTEM, :rtivap, :rticap, rticam, :rtcrep;
                    if (BASE >= RTFTEM) then
                        BEGIN
                        RTFTEM = BASE * :rtftep / 100;
                        RTIVAM = IVAM * :rtivap / 100;
                        END
                    ELSE
                        BEGIN
                        RTFTEM = 0;
                        RTIVAM = 0;
                        END
                    RTCREE = BASE * :rtcrep / 100;
                    if (BASE >= RTICAM) then
                        RTICAM = BASE * :rticap / 1000;
                    else
                        RTICAM = 0;
                    EXECUTE PROCEDURE redondee(TOTAL, REDONT) returning_values (TOTAL);
                    EXECUTE PROCEDURE redondee(IVAM, REDONT) returning_values (IVAM);
                    EXECUTE PROCEDURE redondee(RTFTEM, REDONT) returning_values (RTFTEM);
                    EXECUTE PROCEDURE redondee(RTIVAM, REDONT) returning_values (RTIVAM);
                    EXECUTE PROCEDURE redondee(RTICAM, REDONT) returning_values (RTICAM);
                    EXECUTE PROCEDURE redondee(RTCREE, REDONT) returning_values (RTCREE);
                    UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEPOR = :rtftep, FACT_RTFTEMONTO = :rtftem,
                        FACT_RTIVAPOR = :rtivap, FACT_RTIVAMONTO = :rtivam, FACT_RTICAPOR = :rticap, FACT_RTICAMONTO = :rticam,
                        FACT_RTCREE = :rtcrep, FACT_RTCREEM = :rtcree, FACT_TRANSMIT = 'N'
                        WHERE FACT_ID = :IDF;
                    SELECT FACT_NUMERO, AUTO_CONTADO FROM FACTURAS F, autorizaciones A WHERE FACT_ID = :IDF
                        AND F.auto_numero = A.auto_numero and f.pref_pre = a.pref_pre INTO :NUMERO, :CONTADO;
                    if (CONTADO = 'S') THEN
                        EXECUTE PROCEDURE REGISTRA_RECIBO_FACTURA(:IDF);
                    /* contabilice */
                    SELECT FIRST 1 INVE_ID FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDC;
                    execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
                    EXECUTE procedure contabiliza_pendiente (:IDC);
                    suspend;
            
                    /* LA NUEVA FACTURA */
                    IDF = GEN_ID(id_factura, 1);
                    IDC = GEN_ID(id_cons, 1);
                    ITEM = 0;
                    SUMA = 0;
                    INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                        VALUES (:IDC, 1, 31, 32, :IDR);
                    EXECUTE PROCEDURE consolide_pendientes (:IDC);
                    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS P WHERE TIDO_COD = 31 AND P.PREF_PRE = :PREF INTO :NUMERO, :IVAINC;
                    SELECT CLIE_DIAS FROM CLIENTES WHERE TERC_NIT = :NIT INTO :DIASCR;
                    if (diascr is null) then
                        diascr = 0;
                    INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, 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_NOMCLIENTE, FACT_REMISION,
                        FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, FACT_CONSOLIDA, FACT_TRANSP,
                        FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR,
                        FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_RTCREE, FACT_RTCREEM, FACT_ENTREGA)
                        VALUES (:IDF, :PTVT_ID, :VEND_COD, :NIT, :NUMERO, :REVT_FECHA, :REVT_DESPACHO,
                        (:REVT_FECHA + :DIASCR), :IVAINC, 0, 0, 0, 0, 0,
                        :REVT_IVAMONTO, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, :REVT_FECHA, :PREF, :nombre, :NUMREM,
                        'N', 'S', :REVT_TOTAL, :bode_cod, :REVT_OBS, :IDC, :revt_transp, 0, USER, :sucursal, 'N', :VEND_COD, 1,
                        0, 0, 0, :revt_trm, 0, 0, NULL);
                    END
                END
            END
        ELSE
            BEGIN
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS, FADE_TIVA, FADE_INALCP, FADE_INALCM)
                VALUES (:IDF, :ITEM, :bode_cod, :arti_cod, :RVDE_CANT, :RVDE_UNIDAD, :RVDE_LOTE,
                :rvde_prunit, :rvde_dtoporc, :rvde_dtomonto, :rvde_ivaporc, :rvde_ivamonto, :RVDE_CONSUMO, :RVDE_FACTOR,
                :rvde_desc, :rvde_obs, :rvde_codbar, 0, 0, :rvde_total, :lipr_cod, :rvde_referencia,
                'N', 'N', NULL, 0, 0, 0, 0, 0, 0, NULL, :rvde_tiva, :rvde_inalcp, :rvde_inalcm);
            SUMA = SUMA + RVDE_TOTAL;
            END
        END
    if (IDF <> 0) then
        BEGIN
        /* CALCULE EL TOTAL DE LA FACTURA X EFECTOS DE IMPUESTOS */
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
            INTO :TOTAL, :IVAM;
        BASE = TOTAL - IVAM;
        SELECT CLIE_RTEFTE, CLIE_RTFTEBASE, CLIE_RTEIVA, CLIE_RTEICA, CLIE_RTICABASE, CLIE_RTCREE
            FROM CLIENTES WHERE TERC_NIT = :nit
            INTO :rtftep, RTFTEM, :rtivap, :rticap, rticam, :rtcrep;
        if (BASE >= RTFTEM) then
            BEGIN
            RTFTEM = BASE * :rtftep / 100;
            RTIVAM = IVAM * :rtivap / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTIVAM = 0;
            END
        RTCREE = BASE * :rtcrep / 100;
        if (BASE >= RTICAM) then
            RTICAM = BASE * :rticap / 1000;
        else
            RTICAM = 0;
        EXECUTE PROCEDURE redondee(TOTAL, REDONT) returning_values (TOTAL);
        EXECUTE PROCEDURE redondee(IVAM, REDONT) returning_values (IVAM);
        EXECUTE PROCEDURE redondee(RTFTEM, REDONT) returning_values (RTFTEM);
        EXECUTE PROCEDURE redondee(RTIVAM, REDONT) returning_values (RTIVAM);
        EXECUTE PROCEDURE redondee(RTICAM, REDONT) returning_values (RTICAM);
        EXECUTE PROCEDURE redondee(RTCREE, REDONT) returning_values (RTCREE);
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEPOR = :rtftep, FACT_RTFTEMONTO = :rtftem,
            FACT_RTIVAPOR = :rtivap, FACT_RTIVAMONTO = :rtivam, FACT_RTICAPOR = :rticap, FACT_RTICAMONTO = :rticam,
            FACT_RTCREE = :rtcrep, FACT_RTCREEM = :rtcree, FACT_TRANSMIT = 'N'
            WHERE FACT_ID = :IDF;
        SELECT FACT_NUMERO, AUTO_CONTADO FROM FACTURAS F, autorizaciones A WHERE FACT_ID = :IDF
        AND F.auto_numero = A.auto_numero and f.pref_pre = a.pref_pre INTO :NUMERO, :CONTADO;
        if (CONTADO = 'S') THEN
            EXECUTE PROCEDURE REGISTRA_RECIBO_FACTURA(:IDF);
        /* contabilice */
        SELECT FIRST 1 INVE_ID FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDC;
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        EXECUTE procedure contabiliza_pendiente (:IDC);
        suspend;
        END
    end
end^


ALTER PROCEDURE FACTURAR_REMISIONES (
    FECINI DATE,
    FECFIN DATE,
    PREFREM VARCHAR(4),
    PREFFAC VARCHAR(4))
RETURNS (
    IDR INTEGER,
    NUMREM VARCHAR(8),
    IDF INTEGER,
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
begin
FOR SELECT REVT_ID, REVT_NUMERO FROM remisiones_venta
    WHERE PREF_PRE = :prefrem AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
    and not exists (select cofa_id from consolidado_faltantes c where c.cofa_tipoori = 32 and c.cofa_tipodes = 31 and c.cofa_idori = revt_id and c.cofa_cantcr <> 0)
    INTO :IDR, :NUMREM
    DO
    BEGIN
    FOR SELECT IDF, NUMERO, NIT, sucursal,  NOMBRE, TOTAL FROM FACTURAR_REMISION(:IDR, :PREFFAC)
        INTO :IDF, :NUMERO, :NIT, :SUCURSAL, :NOMBRE, :TOTAL
        DO
        suspend;
    END
end^


ALTER PROCEDURE FACTURAS_MAL_TOTAL (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2),
    ITEMS NUMERIC(18,2),
    IVATOT NUMERIC(18,2),
    IVAIT NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable FACTOR DOUBLE PRECISION;
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_TOTAL, FACT_IVAMONTO, FACT_FACTOR
    FROM FACTURAS WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMBRE, :TOTAL, :IVATOT, :FACTOR
    DO
    BEGIN
    SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :ITEMS, :IVAIT;
    if (ABS(ITEMS * FACTOR - TOTAL) >= 1) then
      suspend;
    END
end^


ALTER PROCEDURE FACTURAS_MES_NIT (
    NIT VARCHAR(20),
    ANO INTEGER)
RETURNS (
    MES VARCHAR(15),
    FACTURA VARCHAR(12))
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^


ALTER PROCEDURE FACTURAS_POR_ENTREGAR (
    FECHA DATE,
    CONFIRMA CHAR(1))
RETURNS (
    IDDOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    CLIENTE VARCHAR(60),
    HORAREG TIME,
    HORAASI TIME,
    HORALIS TIME,
    HORAEMP TIME,
    HORAENT TIME,
    FECHACONF DATE,
    HORACONF TIME,
    ITEMS INTEGER,
    IDPED INTEGER,
    ENTREGA VARCHAR(60),
    EMBALAJE INTEGER,
    MONTO NUMERIC(18,2),
    ENCARGADO VARCHAR(60),
    EMPACADOR VARCHAR(60))
AS
declare variable diasf integer;
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
begin
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'MAXIMO NUMERO DE DIAS PARA ENTREGAR FACTURAS') returning_values (:diasf);
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_NOMCLIENTE, FACT_TOTAL, A.audi_hora, F.fact_consolida
    FROM FACTURAS F, AUDITORIA A
    WHERE A.tido_cod = 31 AND A.audi_iddoc = F.fact_id AND A.audi_oper = 'I' AND F.fact_anulado = 'N' AND F.fact_fecha >= :FECHA-:DIASF
    AND ((:CONFIRMA = 'S') or (NOT EXISTS (SELECT ENDO_IDDOC FROM entrega_documentos WHERE TIDO_COD = 31 AND ENDO_IDDOC = F.fact_id and ENDO_HORAC IS NOT NULL)))
    INTO :IDDOC, :PREF, :NUMERO, :CLIENTE, :MONTO, :HORAREG, :CONSOLIDA
    DO
    BEGIN
    ENCARGADO = '';
    empacador = '';
    identr = 0;
    horaemp = NULL;
    HORAASI = NULL;
    HORALIS = NULL;
    HORAENT = NULL;
    SELECT ENTG_NOMBRE, ENDO_HORAA, ENDO_HORAE, ENDO_HORAL, ENDO_FECHAC, ENDO_HORAC, ENDO_HORAQ, ENDO_EMPACADOR
        FROM entregadores E, entrega_documentos D
        WHERE D.endo_encargado = E.entg_id AND D.tido_cod = 31 AND D.endo_iddoc = :IDDOC
        INTO :ENCARGADO, :HORAASI, :HORAENT, :HORALIS, :FECHACONF, :HORACONF, :HORAEMP, :identr;
    SELECT ENTG_NOMBRE FROM ENTREGADORES WHERE ENTG_ID = :identr INTO :empacador;
    SELECT COUNT(FADE_ITEM) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC INTO :ITEMS;
    SELECT SUM(FE.faem_cant) FROM factura_embalaje FE WHERE FE.fact_id = :IDDOC INTO :embalaje;
    IDPED = 0;
    ENTREGA = '';
    select FIRST 1 C.cefa_idori FROM consolide_faltantes C WHERE C.cefa_id = :consolida AND C.cefa_tipoori = 34 INTO :IDPED;
    if (IDPED <> 0) then
        SELECT T.teen_nom FROM PEDIDOS P, terminos_entrega T WHERE T.teen_id = P.pedi_tipoentrega AND P.pedi_id = :IDPED INTO :ENTREGA;
    suspend;
    END
end^


ALTER PROCEDURE FACTURAS_RUTERO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    CIUD VARCHAR(5),
    NOMCIU VARCHAR(60),
    GRPCAR INTEGER,
    NOMGRUP VARCHAR(30),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4))
AS
declare variable TRAEREM CHAR(2);
declare variable SOLOCONF CHAR(2);
declare variable OK CHAR(1);
declare variable CONSOLIDA INTEGER;
declare variable ENTREGA INTEGER;
declare variable horaemp TIME;
begin
TIPO = 31;
execute procedure lee_configuracion('FACTURACION', 'RUTERO', 'SOLO TRAER FACTURAS CON CONFIRMACION DE EMPAQUE Y TIPO DE ENTREGA ENVIO AL RUTERO')
    returning_values (SOLOCONF);
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_SUCURSAL, FACT_NOMCLIENTE, VEND_COD, FACT_TOTAL, FACT_CONSOLIDA
    FROM FACTURAS F, PREFIJOS P WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND
    P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) 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, :CONSOLIDA
    DO
    BEGIN
    if (SOLOCONF = 'SI') then
        BEGIN
        OK = 'N';
        ENTREGA = 0;
        HORAEMP = NULL;
        SELECT P.pedi_tipoentrega FROM CONSOLIDADO_FALTANTES C, PEDIDOS P
            WHERE COFA_ID = :CONSOLIDA AND COFA_TIPOORI = 34 AND COFA_IDORI = PEDI_ID AND COFA_CANTCR <> 0 INTO :ENTREGA;
        if (ENTREGA = 3) then /* ENVIO TRANSPORTADORA */
            BEGIN
            /* VERIFIQUE QUE ESTE CONFIRMADA LA ENTREGA */
            SELECT E.endo_horaq FROM entrega_documentos E WHERE E.tido_cod = 31 AND E.endo_iddoc = :ID INTO :HORAEMP;
            if (HORAEMP IS NOT NULL) then
                OK = 'S';
            END
        END
    ELSE
        OK = 'S';
    if (OK = 'S') then
        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;
        EXECUTE PROCEDURE nombres_grupos_cliente(:cliente) returning_values (:ZONA, :grpcar, :ciud, :nomzona, :nomgrup, :nomciu);
        suspend;
        END
    END
execute procedure lee_configuracion('FACTURACION', 'RUTERO', 'PERMITIR TRAER REMISIONES PENDIENTES AL RUTERO') returning_values (:traerem);
if (TRAEREM = 'SI') then
    BEGIN
    TIPO = 32;
    for select REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, TERC_NIT, REVT_SUCURSAL, R.revt_nomterc, VEND_COD, REVT_TOTAL
        FROM remisiones_venta R, PREFIJOS P WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
          AND P.tido_cod = 32 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
          AND NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_REMID = R.revt_id AND RUTD_ANULADO = 'N' AND RUTD_ENTREGADO = 'S')
          AND NOT EXISTS (SELECT COFA_ID FROM consolidado_faltantes WHERE COFA_TIPOORI = 32 AND COFA_TIPODES = 31 AND COFA_IDORI = R.revt_id AND COFA_CANTCR <> 0)
        INTO :ID, :PREF, :NUMERO, :FECHA, :CLIENTE, :SUCURSAL, :NOMBRE, :VEND, :MONTO
        DO
        BEGIN
        SELECT SUM(RVDE_CAJAS) FROM remisiones_venta_detalle WHERE REVT_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;
        EXECUTE PROCEDURE nombres_grupos_cliente(:cliente) returning_values (:ZONA, :grpcar, :ciud, :nomzona, :nomgrup, :nomciu);
        suspend;
        END
    END
end^


ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT 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_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    ERROR = NULL;
    SUSPEND;
    SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
    if (CN <> 'N') then
        EXECUTE PROCEDURE CONTABIL_FACTURA (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
    else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
    if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_factura_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
    if ((ERROR = 0) or (error IS NULL)) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
    ELSE
        ESTADO = 'ERROR';
    suspend;
    end
  END
END^


ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
declare variable IDREF INTEGER;
BEGIN
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (PREF_PRE = :PREFIJO))
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idc = null;
  if (not exists (SELECT E.ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID AND E.enco_consec = D.enco_consec)) then
    BEGIN
    SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :ID into :idc;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= 100000;
    if (idc IS NOT NULL) then
        begin
        ESTADO = 'PROCESANDO';
        ERROR = NULL;
        SUSPEND;
        SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
        EXECUTE PROCEDURE contabil_factura_niif (:ID, :IDI, :idc) RETURNING_VALUES (:ERROR, VER);
        if ((ERROR = 0) or (error IS NULL)) then
            BEGIN
            SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDREF;
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
                SELECT :IDREF, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_CONC, CNDE_REF, CNDE_CONCOD, CNDE_BASE, CNDE_PORC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_DOCTIPON, CNDE_DOCNUMERO, CNDE_DOCTIPOA, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO
                FROM CONTABILIZACION_DET WHERE CNTB_ID = :idc AND CNDE_ITEM >= 100000;
            UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDREF;
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        end
    END
  END
END^


ALTER PROCEDURE FACTURAS_SIN_INVENTARIO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    IDF INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    BODEGA VARCHAR(2),
    LOTE VARCHAR(20),
    ITEM INTEGER,
    NIT VARCHAR(20),
    NOMCLI VARCHAR(60))
AS
declare variable CONSOLIDA INTEGER;
declare variable CONC VARCHAR(100);
begin
FOR select F.FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_DESC, FADE_UNIDAD, FADE_CANT, FADE_FACTOR, FACT_CONSOLIDA, D.BODE_COD, FADE_LOTE, FADE_ITEM, TERC_NIT, FACT_NOMCLIENTE
    from facturas f, facturas_detalle d, PREFIJOS P
    where f.fact_fecha >= :FECINI and fact_fecha <= :FECFIN and f.fact_id = d.fact_id and f.fact_anulado = 'N' and
    P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    not exists (select mvar_cons from movimiento_articulo m where m.mvar_tipodoc = 31 and m.mvar_idref = d.fact_id and m.mvar_item = d.fade_item)
    INTO :IDF, :PREF, :NUMERO, :FECHA, :ARTICULO, :DESCRIPCION, :UNIDAD, :cant, :FACTOR, :consolida, :BODEGA, :LOTE, :ITEM, :NIT, :NOMCLI
    DO
    BEGIN
    if (consolida IS NULL) then
      begin
        if (STRLEN(NOMCLI) > 40) then
            CONC = 'FV No.' || :pref || :numero || '-' || SUBSTR(NOMCLI, 1, 40);
        ELSE
            CONC = 'FV No.' || :pref || :numero || '-' || 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(:articulo, :bodega, :FECHA, 31, :idf, :CONC, :factor * :cant, 0, 'N', :lote, :Pref, :numero, :item, :Nit);
      suspend;
      end
    ELSE
        if (CONSOLIDA = 0) then
            BEGIN
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(:articulo, :bodega, :FECHA, 31, :idf, :CONC, :factor * :cant, 0, 'N', :lote, :Pref, :numero, :item, :Nit);
            suspend;
            END
        ELSE
            BEGIN
            if (NOT EXISTS (SELECT COFA_ID FROM consolidado_faltantes C, MOVIMIENTO_ARTICULO M
                WHERE COFA_ID = :consolida AND C.ARTI_COD = :articulo AND COFA_CANTCR <> 0 AND COFA_TIPOORI = 32
                AND C.cofa_idori = M.mvar_idref AND M.mvar_tipodoc = 32 AND M.arti_cod = :ARTICULO)) 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(:articulo, :bodega, :fecha, 31, :idf, :CONC, :factor * :cant, 0, 'N', :lote, :Pref, :numero, :item, :Nit);
                SUSPEND;
                END
            END
    END
end^


ALTER PROCEDURE FACTURAS_SIN_MOV
RETURNS (
    ID INTEGER,
    ITE INTEGER)
AS
declare variable EXISTE CHAR(1);
BEGIN
FOR SELECT FACT_ID, FADE_ITEM FROM FACTURAS_DETALLE INTO :ID, :ITE
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND MVAR_ITEM = :ITE INTO :EXISTE;
    if (EXISTE = 'N') then
        BEGIN
        UPDATE FACTURAS_DETALLE SET FADE_TRANSMIT = 'N' WHERE FACT_ID = :ID AND FADE_ITEM = :ITE;
        SUSPEND;
        END
    END
END^


ALTER PROCEDURE FACTURAS_TIEMPOS (
    FECHA DATE)
RETURNS (
    IDFACT INTEGER,
    NUMERO VARCHAR(12),
    TERC_NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    PEDOK CHAR(1),
    TIEMPOAPROX INTEGER,
    HORAC TIME)
AS
declare variable FECINI DATE;
declare variable TIEMPOAUX SMALLINT;
declare variable TIEMPOAUX1 INTEGER;
declare variable TIEMPOF smallint;
declare variable TIEMPOO smallint;
declare variable ENTREGADO char(1);
declare variable TIEMPOR smallint;
declare variable TIEMPOA time;
declare variable TIEMPOE time;
declare variable TIEMPOINI time;
begin
fecini = FECHA -1;
TIEMPOAPROX = 0;
FOR SELECT FACT_ID, TERC_NIT, FACT_NOMCLIENTE, PREF_PRE||FACT_NUMERO FROM facturas c where fact_fecha >= :FECINI AND fact_fecha <= :FECHA
    ORDER BY FACT_ID ASC INTO :IDFACT, :TERC_NIT, :NOMCLIENTE, :NUMERO
    DO
    BEGIN
    for select cocf_tiempof, cocf_tiempoo, cocf_entregado, cocf_tiemporeal, cocf_tiempoa, cocf_tiempoe, cocf_tiempoini,
        cocf_hora from facturas_detalle d, articulo a, grupo g, cocina_cola_funcion CF where d.arti_cod = a.arti_cod
        AND cocf_iddoc = d.fact_id and cocf_articulo = D.arti_cod and a.grup_cod = g.grup_cod and g.cofu_id is not null
        and cf.cocf_iddoc = :idfact into :tiempof, :tiempoo, :entregado, :tiempor, :tiempoa, :tiempoe, :tiempoini, :horac
        DO
        BEGIN
        TIEMPOAUX = 0;
        if (ENTREGADO <> 'S') then
            BEGIN
            if (TIEMPOINI IS NULL) then
                TIEMPOAUX = TIEMPOF + TIEMPOO;    
            if (TIEMPOINI IS NOT NULL) then
                TIEMPOAUX = TIEMPOF;
            TIEMPOAUX1 =  datediff (minute from TIEMPOINI to CAST ('NOW' AS TIME));
            if ((TIEMPOAUX1 <= 0) or (TIEMPOAUX1 is null)) then
                TIEMPOAUX1 = 0;
            else
                TIEMPOAUX = TIEMPOAUX - TIEMPOAUX1;
            PEDOK = 'N';
            END
        if (TIEMPOAUX > TIEMPOAPROX) then
            TIEMPOAPROX = TIEMPOAPROX + TIEMPOAUX;
        PEDOK = 'S';
        END
    SUSPEND;
    END
end^


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

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

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


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

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


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


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


ALTER PROCEDURE FALTANTES_COMPRAS_ARTICULOI (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(4),
    GRPFIN VARCHAR(4),
    SUBINI VARCHAR(4),
    SUBFIN VARCHAR(4),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(3),
    NOMGRUPO VARCHAR(60),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(60),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(60),
    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);
declare variable MARINI varchar(3);
declare variable MARFIN varchar(3);
begin
if (ORDEN = 'C') then
    begin
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    end
else
    begin
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    end

if (AGRUPA = 'G') then
    begin
    MARINI = '';
    MARFIN = 'zz';
    end
else
    begin
    MARINI = GRPINI;
    MARFIN = GRPFIN;
    GRPINI = '';
    GRPFIN = 'zz';
    SUBINI = '';
    SUBFIN = '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
    and (((:grpini = '') and (:grpfin = 'zz')) or ((A.grup_cod >= :grpini) and (A.grup_cod <= :grpfin)))
    and (((:SUBINI = '') and (:SUBFIN = 'zz')) or ((A.subg_cod >= :GRPINI) and (A.subg_cod <= :subfin)))
    and (((:MARINI = '') and (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) and (A.MARC_COD <= :MARFIN)))
    into :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  do
    begin
    execute procedure nombres_grupos_inventario(:CODGRUPO, :CODSUBG, :CODMARC)
        returning_values (NOMGRUPO, NOMSUBG, NOMMARC);

    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    if (DETALLE = 'N') then
        begin
        for select O.slim_id, d.slde_item, d.slde_cant * d.slde_factor, (d.slde_prunit-d.slde_dtomonto)
            from solicitud_importacion_det D, solicitud_importacion O, PREFIJOS P
            where O.slim_id = D.slim_id and ARTI_COD = :ARTICULO and SLIM_FECHA >= :FECINI and SLIM_FECHA < :FECFIN and SLIM_ANULADO = 'N' and P.PREF_PRE = O.PREF_PRE and ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
            order by O.slim_id, D.slde_item into :ID, :ITEM, :CANT, :MONTO
            do
            begin
            NROPROV = '';
            CANTIDAD = CANTIDAD + CANT;
            EXECUTE PROCEDURE FALTANTE_CORTE(139, 137, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
            FALTANTE = FALTANTE + CANT;
            BASE = BASE + MONTO * CANT;
            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
        for select O.slim_id, D.slde_item, O.PREF_PRE, SLIM_NUMERO, SLIM_FECHA, D.slde_cant * D.slde_factor, (D.slde_prunit-D.slde_dtomonto)
            from solicitud_importacion O, solicitud_importacion_det D, PREFIJOS P
            where O.slim_id = D.slim_id and ARTI_COD = :ARTICULO and P.tido_cod = 139 and P.PREF_PRE = O.PREF_PRE and
            SLIM_FECHA >= :FECINI and SLIM_FECHA < :FECFIN and SLIM_ANULADO = 'N' and ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
            into :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE
            do
            begin
            NROPROV = '';
            EXECUTE PROCEDURE FALTANTE_CORTE(139, 137, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CEROS = 'S') or (FALTANTE <> 0)) then
                suspend;
            end
        end
    end
end^


ALTER PROCEDURE FALTANTES_VENTAS_ARTICULO (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR1 NUMERIC(18,4),
    FACTOR2 NUMERIC(18,4),
    FACTOR3 NUMERIC(18,4),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    COSTOUN NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CIUDAD VARCHAR(60),
    OBS VARCHAR(255),
    BOD VARCHAR(2),
    PESOUNIT NUMERIC(18,2),
    PESOTOT NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable I INTEGER;
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;
    I = 0;
    FACTOR1 = 0;
    FACTOR2 = 0;
    FACTOR3 = 0;
    FOR SELECT UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo AND UNAR_ACTIVA = 'S' AND UNAR_FACCAN <> 1
        ORDER BY UNAR_FACCAN INTO :FACTOR
        DO
        BEGIN
        if (I = 0) then
            FACTOR1 = FACTOR;
        if (I = 1) then
            FACTOR2 = FACTOR;
        if (I = 2) then
            FACTOR3 = FACTOR;
        I = I + 1;
        END
    select arti_peso from articulo where arti_cod = :articulo into :pesounit;
    if (pesounit is null) then
        pesounit = 0;
    pesounit = pesounit / 1000;

    if (DETALLE = 'N') then
        BEGIN
        if (TIPO = 31) then
            BEGIN
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), D.BODE_COD, F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :BOD, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            pesotot = pesounit * cantidad;
            END
        if (TIPO = 32) then
            BEGIN
            FOR SELECT R.revt_id, rvde_item, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), D.bode_cod, R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :BOD, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            pesotot = pesounit * cantidad;
            END
        if (TIPO = 34) then
            BEGIN
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), D.bode_cod, P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_VALIDEZ >= 0
                AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :bod, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            pesotot = pesounit * cantidad;
            END
        if (TIPO = 35) then
            BEGIN
            FOR SELECT C.COTI_ID, CTDE_ITEM, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                BOD = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            pesotot = pesounit * cantidad;
            END
        if (TIPO = 40) then
            BEGIN
            FOR SELECT P.pend_id, D.pevd_item, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.bode_cod
                FROM pendiente_ventas_detalle D, pendiente_ventas P, PREFIJOS R
                WHERE P.pend_id = D.pend_id AND ARTI_COD = :ARTICULO AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND
                PEND_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 40  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.pend_id, D.pevd_item INTO :ID, :ITEM, :CANT, :MONTO, :bod
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            pesotot = pesounit * cantidad;
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), SUBSTRING(FACT_OBS FROM 1 FOR 255), D.bode_cod, F.ptvt_id, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        pesotot = pesounit * cantidad;
                        SUSPEND;
                        END
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), SUBSTRING(REVT_OBS FROM 1 FOR 255), D.bode_cod, R.ptvt_id, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        pesotot = pesounit * cantidad;
                        SUSPEND;
                        END
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), SUBSTRING(PEDI_OBS FROM 1 FOR 255), D.bode_cod, P.ptvt_id, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_VALIDEZ >= 0
                AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        pesotot = pesounit * cantidad;
                        SUSPEND;
                        END
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    BOD = '';
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        pesotot = pesounit * cantidad;
                        SUSPEND;
                        END
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, PEND_FECHA, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), SUBSTRING(P.pend_obs FROM 1 FOR 255), D.bode_cod
                FROM pendiente_ventas P, pendiente_ventas_detalle D, PREFIJOS R
                WHERE P.pend_id = D.pend_id AND ARTI_COD = :ARTICULO AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND PEND_ANULADO = 'N'
                AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 40 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        pesotot = pesounit * cantidad;
                        SUSPEND;
                        END
                    END
        END
    END
END^


ALTER PROCEDURE FECHA_A_CONTA (
    FECHAD DATE)
RETURNS (
    FECHAS CHAR(8))
AS
declare variable FECHAAUX VARCHAR(10);
BEGIN
  FECHAAUX = CAST (FECHAD AS VARCHAR(10));
  FECHAS = SUBSTR(FECHAAUX, 1, 4) || SUBSTR(FECHAAUX, 6, 7) || SUBSTR(FECHAAUX, 9, 10);
  SUSPEND;
END^


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^


ALTER PROCEDURE FECHA_DOCUMENTOS_PAGO
RETURNS (
    TIPO INTEGER,
    ID INTEGER,
    FECHA DATE)
AS
declare variable IDDOC INTEGER;
begin
FOR SELECT D.dpca_id, D.dpca_tiposal, D.dpca_idsal FROM DOCUMENTOS_PAGO_CAJA D WHERE D.dpca_tiposal <> 0 AND D.dpca_idsal <> 0
    INTO :IDDOC, :TIPO, :ID
    DO
    BEGIN
    SELECT M.moca_fecha FROM MOVIMIENTO_CAJA M WHERE M.moca_tiporef = :TIPO AND M.moca_idref = :ID INTO :FECHA;
    UPDATE documentos_pago_caja SET DPCA_FECSAL = :FECHA WHERE DPCA_ID = :IDDOC;
    suspend;
    END
end^


ALTER PROCEDURE FECHA_FINAL_PERIODO_PAGO (
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    FECHA DATE)
AS
declare variable MES INTEGER;
declare variable DIA INTEGER;
declare variable FECTXT VARCHAR(10);
begin
FECTXT = ANO || '/';
select ppag_mesfin, ppag_diafin from periodo_pago_nombre where ppag_cod = :periodicidad and ppag_periodo = :periodo
    into :MES, :DIA;
if ((MES <> 0) AND (MES is not null) AND (DIA <> 0) AND (DIA is not null)) then
    BEGIN
    if (MES < 10) then
        FECTXT = FECTXT || '0';
    FECTXT = FECTXT || CAST(MES AS VARCHAR(2)) || '/';
    if (DIA < 10) then
        FECTXT = FECTXT || '0';
    FECTXT = FECTXT || CAST(DIA AS VARCHAR(2));
    fecha = cast(fectxt as date);
    SUSPEND;
    END
ELSE
    BEGIN
    if (PERIODICIDAD = 1) then
        BEGIN
        /* MENSUAL */
        IF (PERIODO < 12) THEN
            BEGIN
            PERIODO = PERIODO + 1;
            if (PERIODO < 10) then
                FECTXT = FECTXT || '0';
            FECTXT = FECTXT || CAST(PERIODO AS VARCHAR(2)) || '/01';
            fecha = cast(fectxt as date) - 1;
            END
        else
            BEGIN
            FECTXT = FECTXT || '12/31';
            FECHA = CAST(FECTXT AS DATE);
            END
        END
    if (PERIODICIDAD = 2) then
        BEGIN
        /* QUINCENAL */
        if (MOD (PERIODO, 2) = 1) then
            BEGIN
            if ((PERIODO + 1)/2 < 10) then
                FECTXT = FECTXT || '0';
            FECTXT = FECTXT || CAST(((PERIODO + 1)/2) AS VARCHAR(2)) || '/15';
            fecha = cast(fectxt as date);
            END
        ELSE
            BEGIN
            IF (PERIODO < 24) THEN
                BEGIN
                if ((PERIODO + 2)/2 < 10) then
                    FECTXT = FECTXT || '0';
                FECTXT = FECTXT || CAST(((PERIODO + 2)/2) AS VARCHAR(2)) || '/01';
                fecha = cast(fectxt as date) - 1;
                END
            else
                BEGIN
                FECTXT = FECTXT || '12/31';
                FECHA = CAST(FECTXT AS DATE);
                END
            END
        END
    if (PERIODICIDAD = 3) then
        BEGIN
        /* SEMANAL */
        if (MOD (PERIODO, 4) = 1) then
            BEGIN
            if ((PERIODO + 3)/4 < 10) then
                FECTXT = FECTXT || '0';
            FECTXT = FECTXT || CAST(((PERIODO + 3)/4) AS VARCHAR(2)) || '/07';
            fecha = cast(fectxt as date);
            END
        ELSE
            BEGIN
            if (MOD (PERIODO, 4) = 2) then
                BEGIN
                if ((PERIODO + 3)/4 < 10) then
                    FECTXT = FECTXT || '0';
                FECTXT = FECTXT || CAST(((PERIODO + 3)/4) AS VARCHAR(2)) || '/15';
                fecha = cast(fectxt as date);
                END
            ELSE
                BEGIN
                if (MOD (PERIODO, 4) = 3) then
                    BEGIN
                    if ((PERIODO + 3)/4 < 10) then
                        FECTXT = FECTXT || '0';
                    FECTXT = FECTXT || CAST(((PERIODO + 3)/4) AS VARCHAR(2)) || '/21';
                    fecha = cast(fectxt as date);
                    END
                ELSE
                    BEGIN
                    IF (PERIODO < 52) THEN
                        BEGIN
                        if ((PERIODO + 4)/4 < 10) then
                            FECTXT = FECTXT || '0';
                        FECTXT = FECTXT || CAST(((PERIODO + 4)/4) AS VARCHAR(2)) || '/01';
                        fecha = cast(fectxt as date) - 1;
                        END
                    else
                        BEGIN
                        FECTXT = FECTXT || '12/31';
                        FECHA = CAST(FECTXT AS DATE);
                        END
                    END
                END
            END
        END
    suspend;
    end
end^


ALTER PROCEDURE FECHA_INICIAL_PERIODO_PAGO (
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    FECHA DATE)
AS
declare variable FECTXT VARCHAR(10);
declare variable MES INTEGER;
declare variable DIA INTEGER;
begin
FECTXT = ANO || '/';
select ppag_mesfin, ppag_diafin from periodo_pago_nombre where ppag_cod = :periodicidad and ppag_periodo = :periodo
    into :MES, :DIA;
if (PERIODICIDAD = 1) then
    BEGIN
    /* MENSUAL */
    if (PERIODO < 10) then
        FECTXT = FECTXT || '0';
    IF (PERIODO < 12) THEN
        FECTXT = FECTXT || CAST(PERIODO AS VARCHAR(2)) || '/01';
    ELSE
        FECTXT = FECTXT || '12/01';
    fecha = cast(fectxt as date);
    END
if (PERIODICIDAD = 2) then
    BEGIN
    /* QUINCENAL */
    IF (PERIODO < 24) THEN
        BEGIN
        if (MOD (PERIODO, 2) = 1) then
            BEGIN
            if ((PERIODO + 1)/2 < 10) then
                FECTXT = FECTXT || '0';
            FECTXT = FECTXT || CAST(((PERIODO + 1)/2) AS VARCHAR(2)) || '/01';
            END
        ELSE
            BEGIN
            if (PERIODO/2 < 10) then
                FECTXT = FECTXT || '0';
            FECTXT = FECTXT || CAST((PERIODO/2) AS VARCHAR(2)) || '/16';
            END
        END
    ELSE
        FECTXT = FECTXT || '12/16';
    fecha = cast(fectxt as date);
    END
if (PERIODICIDAD = 3) then
    BEGIN
    /* SEMANAL */
    IF (PERIODO < 52) THEN
        BEGIN
        if (MOD (PERIODO, 4) = 1) then
            BEGIN
            if ((PERIODO + 3)/4 < 10) then
                FECTXT = FECTXT || '0';
            FECTXT = FECTXT || CAST(((PERIODO + 3)/4) AS VARCHAR(2)) || '/01';
            fecha = cast(fectxt as date);
            END
        ELSE
            BEGIN
            if (MOD (PERIODO, 4) = 2) then
                BEGIN
                if ((PERIODO + 3)/4 < 10) then
                    FECTXT = FECTXT || '0';
                FECTXT = FECTXT || CAST(((PERIODO + 3)/4) AS VARCHAR(2)) || '/08';
                END
            ELSE
                BEGIN
                if (MOD (PERIODO, 4) = 3) then
                    BEGIN
                    if ((PERIODO + 3)/4 < 10) then
                        FECTXT = FECTXT || '0';
                    FECTXT = FECTXT || CAST(((PERIODO + 3)/4) AS VARCHAR(2)) || '/15';
                    END
                ELSE
                    BEGIN
                    if (PERIODO/4 < 10) then
                        FECTXT = FECTXT || '0';
                    FECTXT = FECTXT || CAST((PERIODO/4) AS VARCHAR(2)) || '/22';
                    END
                END
            END
        END
    ELSE
        FECTXT = FECTXT || '12/22';
    fecha = cast(fectxt as date);
    END
suspend;
end^


ALTER PROCEDURE FECHA_PERIODO_PAGO (
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    PERIODO INTEGER,
    DIA INTEGER)
RETURNS (
    FECHA DATE)
AS
declare variable FECTXT VARCHAR(10);
declare variable DIAMAX INTEGER;
begin
FECTXT = ANO || '/';
if (PERIODICIDAD = 1) then
    BEGIN
    /* MENSUAL */
    if (PERIODO < 10) then
        FECTXT = FECTXT || '0';
    FECTXT = FECTXT || PERIODO || '/';
    if (DIA < 10) then
        FECTXT = FECTXT || '0';
    SELECT P.ppag_diafin FROM periodo_pago_nombre P WHERE P.ppag_cod = :periodicidad AND P.ppag_periodo = :periodo INTO :DIAMAX;
    if (DIA > DIAMAX) then
        DIA = DIAMAX;
    FECTXT = FECTXT || DIA;
    END
if (PERIODICIDAD = 2) then
    BEGIN
    /* QUINCENAL */
    if (MOD (PERIODO, 2) = 1) then
        BEGIN
        if ((PERIODO + 1)/2 < 10) then
            FECTXT = FECTXT || '0';
        FECTXT = FECTXT || CAST((PERIODO + 1)/2 AS VARCHAR(2)) || '/';
        if (DIA < 10) then
            FECTXT = FECTXT || '0';
        FECTXT = FECTXT || DIA;
        END
    ELSE
        BEGIN
        if ((PERIODO + 1)/2 < 10) then
            FECTXT = FECTXT || '0';
        FECTXT = FECTXT || CAST((PERIODO + 1)/2 AS VARCHAR(2)) || '/';
        DIA = DIA + 15;
        SELECT P.ppag_diafin FROM periodo_pago_nombre P WHERE P.ppag_cod = :periodicidad AND P.ppag_periodo = :periodo INTO :DIAMAX;
        if (DIA > DIAMAX) then
            DIA = DIAMAX;
        FECTXT = FECTXT || DIA;
        END
    END
fecha = cast(fectxt as date);
suspend;
end^


ALTER PROCEDURE FECHA_Y_NUMERO_CONTA (
    FECHA CHAR(8),
    DIAS INTEGER)
RETURNS (
    VENCE CHAR(8))
AS
DECLARE VARIABLE ANOC CHAR(4);
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE MES INTEGER;
DECLARE VARIABLE DIA INTEGER;
DECLARE VARIABLE DIASMES INTEGER;
BEGIN
ANO = CAST(SUBSTR(FECHA, 1, 4) AS INTEGER);
MES = CAST(SUBSTR(FECHA, 5, 6) AS INTEGER);
DIA = CAST(SUBSTR(FECHA, 7, 8) AS INTEGER);
IF (DIAS > 0) THEN
  BEGIN
  ANO = ANO + DIV(DIAS, 360);
  MES = MES + (MOD(DIAS, 360) / 30);
  DIA = DIA + MOD(DIAS, 30);
  IF (MES > 14) THEN
    BEGIN
    ANO = ANO + 1;
    MES = MES - 14;
    END
      EXECUTE PROCEDURE DIAS_MES(MES, ANO) RETURNING_VALUES (DIASMES);
  IF (DIA > DIASMES) THEN
    BEGIN
    DIA = DIA - DIASMES;
    MES = MES + 1;
    IF (MES > 14) THEN
      BEGIN
      ANO = ANO + 1;
      MES = MES - 14;
      END
    END
  END
ELSE
  BEGIN
  DIAS = DIAS * (-1);
  ANO = ANO - DIV(DIAS, 360);
  MES = MES - (MOD(DIAS, 360) / 30);
  DIA = DIA - MOD(DIAS, 30);
  IF (MES < 1) THEN
    BEGIN
    ANO = ANO - 1;
    MES = 14 + MES;
    END
  IF (DIA < 1) THEN
    BEGIN
    MES = MES - 1;
    IF (MES < 1) THEN
      BEGIN
      ANO = ANO - 1;
      MES = 14 + MES;
      END
            EXECUTE PROCEDURE DIAS_MES(MES, ANO) RETURNING_VALUES (DIASMES);
    DIA = DIASMES + DIA;
    END
  END
ANOC = CAST(ANO AS CHAR(4));
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANOC, MES, DIA) RETURNING_VALUES :VENCE;
SUSPEND; 
END^


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 LOTE_NRO,LOTE_SALDO FROM LOTES
    WHERE (ARTI_COD = :ARTICULO) AND LOTE_VENCE = :FECHA INTO :LOTE, :SALDO;
  SUSPEND;
end^


ALTER PROCEDURE FIN_DE_MES (
    ANO CHAR(4),
    PERIODO INTEGER)
RETURNS (
    FECHA CHAR(8))
AS
declare variable DIAS INTEGER;
BEGIN
  EXECUTE PROCEDURE DIAS_MES (PERIODO, ANO) RETURNING_VALUES (DIAS);
  EXECUTE PROCEDURE compone_fecha_conta (ANO, PERIODO, DIAS) returning_values (FECHA);
  SUSPEND;
END^


ALTER PROCEDURE FORM_INTEGRADO_ELECTRONICO (
    IDDOC INTEGER,
    FECLIQ VARCHAR(10),
    CODOPER VARCHAR(2))
RETURNS (
    DATOS VARCHAR(686) CHARACTER SET ISO8859_1)
AS
declare variable DATOS1 varchar(686) CHARACTER SET ISO8859_1;
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(10);
declare variable NUMEMPL varchar(5);
declare variable NUMEMPLADM varchar(10);
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 FECVSP date;
declare variable FECNOV1 date;
declare variable FECNOV2 date;
declare variable FECINI date;
declare variable FECFIN date;
declare variable IDNOV integer;
declare variable TIPONOV integer;
declare variable PPAGO integer;
declare variable PERNOV char(2);
declare variable DIAINI char(2);
declare variable DURA integer;
declare variable DURA2 integer;
declare variable PRORROGA char(1);
declare variable COUNTNOV integer;
declare variable NOVEDAD varchar(1);
declare variable CODADMIN varchar(6);
declare variable DIASLAB varchar(3);
declare variable DIASLABP varchar(3);
declare variable DIASL integer;
declare variable SALBASIC varchar(22);
declare variable IBCEPS numeric(18,2);
declare variable IBCAFP numeric(18,2);
declare variable IBCARL numeric(18,2);
declare variable IBCCCF numeric(18,2);
declare variable VRFSP numeric(18,2);
declare variable POREPS numeric(18,4);
declare variable PORAFP numeric(18,4);
declare variable PORCCF numeric(18,4);
declare variable PORCOT numeric(18,4);
declare variable SMMLV numeric(18,2);
declare variable TARARL numeric(10,5);
declare variable CODTAR integer;
declare variable INCAP varchar(2);
declare variable CIUDAD varchar(5);
declare variable PORCAPOR varchar(9);
declare variable COTOBL varchar(22);
declare variable COTOBLADM varchar(15);
declare variable NITADMIN varchar(16);
declare variable ITEMADM integer;
declare variable NUMAUT integer;
declare variable NUMAUTO varchar(16);
declare variable DIASAU integer;
declare variable PRIVEZ char(1);
declare variable DIASMES integer;
declare variable APORINC numeric(18,2);
declare variable COUNTMOV integer;
declare variable INICIONOV CHAR(1);
declare variable ITEM INTEGER;
declare variable HORAS INTEGER;
begin
FECFIN = cast(:fecliq as date) - extract(day from cast(:FECLIQ as date)) + 32 - extract(day from (cast(:FECLIQ as date) - extract(day from cast(:FECLIQ as date)) + 32));
  TIPREG = '01'; -- encabezado
  DATOS = :TIPREG;
  /* 2-modalidad 1:electronica */
  DATOS = :DATOS || '1';
  /* 3-secuencia */
  SEC = '0001';
  DATOS = :DATOS || :SEC;
  /* 4-nombre compania */
  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;
  /* 5-tipo id */
  DATOS = :DATOS || 'NI';
  /* 6-NIT */
  execute procedure LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') returning_values (:NITCIA);
  execute procedure CEROS_ANCHO_FIJO(:NITCIA, 16, 'A') returning_values (:NITCIA);
  DATOS = :DATOS || :NITCIA;
  /* 7-DV */
  execute procedure DV(NITCIA) returning_values (DVCIA);
  DATOS = :DATOS || :DVCIA;
  /* 8-tipo planilla E */
  DATOS = :DATOS || 'E'; -- forma presentacion
  /* 9-planilla asociada */
  DATOS = :DATOS || '          ';
  /* 10-fecha planilla asociada */
  DATOS = :DATOS || '          ';
  /* 11-forma presentacion */
  DATOS = :DATOS || 'U';
  /* 12-codigo sucursal */
  CODSUCUR = '';
  execute procedure CEROS_ANCHO_FIJO(:CODSUCUR, 10, 'A') returning_values (:CODSUCUR);
  DATOS = :DATOS || :CODSUCUR;
  /* 13-nombre sucursal */
  NOMSUCUR = '';
  execute procedure CEROS_ANCHO_FIJO(:NOMSUCUR, 40, 'A') returning_values (:NOMSUCUR);
  DATOS = :DATOS || :NOMSUCUR;
  /* 14-cod ARL */
  select ADMI_CODARP, P.paan_salminimo from ADMINISTRADORA A, PARAMETROS_ANO P where P.PAAN_NITARP = A.TERC_NIT and P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
      into :CODARP, :SMMLV;
  execute procedure CEROS_ANCHO_FIJO(:CODARP, 6, 'A') returning_values (:CODARP);
  DATOS = :DATOS || :CODARP;
  /* 15-PERIODO DE PENSIONES aaaa-mm */
  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;
  /* 16-PERIODO DE SALUD = aaaa-mm */
  select substring(DATEADD(1 MONTH TO P.PGAP_FECHA) from 1 for 7) from PAGO_APORTES P
      where P.PGAP_ID = :IDDOC and P.PGAP_ITEM = 1
      into :PERLIQSALUD;
  PERLIQSALUD = SUBSTR(PERLIQSALUD, 1, 4) || '-' || SUBSTR(PERLIQSALUD, 6, 8);
  DATOS = :DATOS || :PERLIQSALUD;
  /* 17-numero formulario */
  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;
  /* 18-fecha pago, la asigna el operador */
  DATOS = :DATOS || '          ';
  /* 19-NUMERO EMPLEADOS */
  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;
  /* 20-VALOR NOMINA */
  select cast(sum(PADE_IBC) as integer) from PAGO_APORTES_DETALLE where PGAP_ID = :IDDOC and PADE_TIPAP = 'CCF' into :VLORNOMIINT;
  VLORNOMI = cast(VLORNOMIINT as varchar(20));
  execute procedure CEROS_ANCHO_FIJO(:VLORNOMI, 12, 'N') returning_values (:VLORNOMI);
  DATOS = :DATOS || :VLORNOMI;
  /* 21-TIPO APORTANTE */
  DATOS = :DATOS || '01';
  /* OPERADOR */
  CODOPER = '0';
  execute procedure CEROS_ANCHO_FIJO(:CODOPER, 2, 'N')
      returning_values (:CODOPER);
  DATOS = :DATOS || :CODOPER;
  suspend;

  /* REGISTROS TIPO 2 */
  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, EMPL_HORAS
      from EMPLEADOS E, TERCEROS T
      where 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)
      ORDER BY E.TERC_NIT
      into :NITEMPL, :TIPOID, :CIUDAD, :TIPOCOT, :STIPOCOT, :NOM1, :NOM2, :APE1, :APE2, :FECING, :FECRET, :HORAS
  do
    begin
    FECINI = cast(:fecliq as date) - extract(day from cast(:FECLIQ as date)) + 1;
    FECFIN = cast(:fecliq as date) - extract(day from cast(:FECLIQ as date)) + 32 - extract(day from (cast(:FECLIQ as date) - extract(day from cast(:FECLIQ as date)) + 32));
    TIPREG = '02';
    DATOS = TIPREG;
    /* 2-secuencia */
    SECINT = SECINT + 1;
    execute procedure CAF(cast(SECINT as varchar(5)), 5, 'N') returning_values (:SEC);
    DATOS = DATOS || :SEC;
    /* 3 tipo ID empelado */
    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;
    /* 4-id empelado */
    execute procedure CAF(:NITEMPL, 16, 'A') returning_values (:NITEMPL);
    DATOS = DATOS || :NITEMPL;
    /* 5-TIPO COTIZANTE */
    execute procedure CAF(:TIPOCOT, 2, 'N') returning_values (:TIPOCOT);
    DATOS = DATOS || :TIPOCOT;
    /* 6-SUBTIPO COTIZANTE */
    execute procedure CAF(:STIPOCOT, 2, 'N') returning_values (:STIPOCOT);
    DATOS = DATOS || :STIPOCOT;

    DATOS = DATOS || ' '; -- 7-EXTRANJERO
    DATOS = DATOS || ' '; -- 8-COLOMBIANO EN EXTERIOR
    /* 9-DPTO-10-MUNICIPIO */
    DATOS = DATOS || SUBSTR(:CIUDAD, 1, 2);
    DATOS = DATOS || SUBSTR(:CIUDAD, 3, 6);
    /* 11-PRIMER APELLIDO */
    execute procedure CAF(:APE1, 20, 'A') returning_values (:APE1);
    if (APE1 is null) then
      APE1 = '';
    DATOS = DATOS || :APE1;
    /* 12-SEGUNDO APELLIDO */
    execute procedure CAF(:APE2, 30, 'A') returning_values (:APE2);
    if (APE2 is null) then
      APE2 = '';
    DATOS = DATOS || :APE2;
    /* 13-NOMBRE1 */
    execute procedure CAF(:NOM1, 20, 'A') returning_values (:NOM1);
    if (NOM1 is null) then
      NOM1 = '';
    DATOS = DATOS || :NOM1;
    /* 14-NOMBRE2 */
    if (NOM2 is null) then
      NOM2 = '';
    execute procedure CAF(:NOM2, 30, 'A') returning_values (:NOM2);
    DATOS = DATOS || :NOM2;
    /* 15-NOVEDAD INGRESO */
    NOVEDAD = null;
    if ((SUBSTR(:FECING, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
        (SUBSTR(:FECING, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
      BEGIN
      NOVEDAD = 'X';
      FECINI = FECING;
      END
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 16-NOVEDAD RETIRO */
    NOVEDAD = null;
    if (:FECRET is not null and
        (SUBSTR(:FECRET, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
        (SUBSTR(:FECRET, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
      BEGIN
      NOVEDAD = 'X';
      FECFIN = FECRET;
      END
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 17-NOVEDAD CAMBIO DESDE EPS */
    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;
    /* 18-NOVEDAD CAMBIO A EPS */
    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;
    /* 19-CAMBIO AFP DESDE */
    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;
    /* 20-TRASLADO AFP NUEVA */
    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;
    DATOS1 = DATOS;
    /* SUME DIAS DE NOVEDADES DE AUSENTISMO DEL MES */
    DIASAU = 0;
    SELECT SUM(ND.nnde_duracion) from NOMINA_NOVEDADES NN,  nomina_novedades_detalle ND
        where NN.nono_id = ND.nono_id AND NN.TERC_NIT = :NITEMPL AND (ND.nnde_ano = SUBSTR(:FECLIQ, 1, 4)) and
          (((NN.nono_ppago = 1) AND (ND.nnde_periodo = SUBSTR(:FECLIQ, 6, 7))) or ((NN.nono_ppago = 2) AND ((ND.nnde_periodo = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)
            or (ND.nnde_periodo+1 = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2))))
          and ((NN.TNOV_COD = 2) OR (NN.TNOV_COD = 3) OR (NN.TNOV_COD = 4) OR (NN.TNOV_COD = 6) or (NN.TNOV_COD = 9) OR (NN.TNOV_COD = 12) OR (NN.TNOV_COD = 13))
          INTO :DIASAU;
    if (DIASAU IS NULL) then
        DIASAU = 0;
    if (DIASAU <> 0) then
        BEGIN
        /* HAY NOVEDADES DE AUSENTISMO */
        EXECUTE PROCEDURE DIAS_MES(EXTRACT(MONTH FROM cast(:FECLIQ as date)), EXTRACT(YEAR FROM cast(:FECLIQ as date))) returning_values (diasmes);
        if (diasau >= DIASMES) then
            PRIVEZ = 'S'; -- INCLUYA DE UNA VEZ LOS DATOS COMO APORTES VOLUNTARIOS Y DEMAS QUE NO DEPENDEN DE LAS NOVEDADES
        ELSE
            PRIVEZ = 'N';
        /* POR CADA NOVEDAD QUE AFECTE LOS DIAS LABORADOS HAGA UN REGISTRO */
        NOVEDAD = null;
        fecnov1 = NULL;
        for select NN.nono_id, NN.nono_ppago, ND.nnde_periodo, NN.tnov_cod, ND.nnde_diaini, ND.nnde_duracion, ND.nnde_prorroga, ND.nnde_item
            from NOMINA_NOVEDADES NN,  nomina_novedades_detalle ND
            where NN.nono_id = ND.nono_id AND NN.TERC_NIT = :NITEMPL AND (ND.nnde_ano = SUBSTR(:FECLIQ, 1, 4)) and
              (((NN.nono_ppago = 1) AND (ND.nnde_periodo = SUBSTR(:FECLIQ, 6, 7))) or ((NN.nono_ppago = 2) AND ((ND.nnde_periodo = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)
              or (ND.nnde_periodo+1 = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2))))
              AND ((ND.nnde_prorroga = 'N') or ((ND.nnde_diaini = 1) AND ((NN.nono_ppago = 1) or (MOD(ND.nnde_periodo, 2) = 1))))
              and ((NN.TNOV_COD = 2) OR (NN.TNOV_COD = 3) OR (NN.TNOV_COD = 4) OR (NN.TNOV_COD = 6) or (NN.TNOV_COD = 9) OR (NN.TNOV_COD = 12) OR (NN.TNOV_COD = 13))
              ORDER BY ND.nnde_ano, ND.nnde_periodo,  ND.nnde_diaini
            into :idnov, :ppago, :pernov, :tiponov, :diaini, :dura, :prorroga, :ITEM
            DO
            BEGIN
            FOR SELECT DATOS, PRIVEZN, SECINTN FROM RENGLON_NOVEDAD_APORTES(:IDDOC, :SECINT, :FECLIQ, :DATOS1, :nitempl, :PRIVEZ, :idnov, :ITEM, :ppago, :pernov, :tiponov, :diaini, :dura, :prorroga)
                INTO :DATOS, :PRIVEZ, :SECINT
                DO
                SUSPEND;
            END
        END
    /* VERIFIQUE SI HAY VST O VSP */
    DATOS = DATOS1;
    COUNTMOV = 0;
    SELECT COUNT(ND.nono_id) from NOMINA_NOVEDADES NN,  nomina_novedades_detalle ND
        where NN.nono_id = ND.nono_id AND NN.TERC_NIT = :NITEMPL AND (ND.nnde_ano = SUBSTR(:FECLIQ, 1, 4)) and
          (((NN.nono_ppago = 1) AND (ND.nnde_periodo = SUBSTR(:FECLIQ, 6, 7))) or ((NN.nono_ppago = 2) AND ((ND.nnde_periodo = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)
            or (ND.nnde_periodo+1 = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2))))
          and ((NN.TNOV_COD = 8) OR (NN.TNOV_COD = 11) OR (NN.TNOV_COD = 7) OR (NN.TNOV_COD = 10))
          INTO :countnov;
    if (countmov is null) then
        countmov = 0;
    if (COUNTMOV <> 0) then
        BEGIN
        fecnov1 = NULL;
        for select NN.nono_id, NN.nono_ppago, ND.nnde_periodo, NN.tnov_cod, ND.nnde_diaini, ND.nnde_duracion, ND.nnde_prorroga
            from NOMINA_NOVEDADES NN,  nomina_novedades_detalle ND
            where NN.nono_id = ND.nono_id AND NN.TERC_NIT = :NITEMPL AND (ND.nnde_ano = SUBSTR(:FECLIQ, 1, 4)) and
              (((NN.nono_ppago = 1) AND (ND.nnde_periodo = SUBSTR(:FECLIQ, 6, 7))) or ((NN.nono_ppago = 2) AND ((ND.nnde_periodo = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)
                or (ND.nnde_periodo+1 = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2))))
              and ((NN.TNOV_COD = 8) OR (NN.TNOV_COD = 11) OR (NN.TNOV_COD = 7) OR (NN.TNOV_COD = 10))
              ORDER BY ND.nnde_ano, ND.nnde_periodo,  ND.nnde_diaini
            into :idnov, ppago, :pernov, :tiponov, :diaini, :dura, :prorroga
            DO
            BEGIN
            FOR SELECT DATOS, PRIVEZN FROM RENGLON_VS_APORTES(:IDDOC, :FECLIQ, :DATOS1, :nitempl, :PRIVEZ, :FECINI, :FECFIN, :ppago, :pernov, :tiponov, :diaini)
                INTO :DATOS, :PRIVEZ
                DO
                SUSPEND;
            END
        END
    ELSE
        BEGIN
        DATOS = DATOS1;
        DIASAU = 0;
        SELECT SUM(ND.nnde_duracion) from NOMINA_NOVEDADES NN,  nomina_novedades_detalle ND
            where NN.nono_id = ND.nono_id AND NN.TERC_NIT = :NITEMPL AND (ND.nnde_ano = SUBSTR(:FECLIQ, 1, 4)) and
              (((NN.nono_ppago = 1) AND (ND.nnde_periodo = SUBSTR(:FECLIQ, 6, 7))) or ((NN.nono_ppago = 2) AND ((ND.nnde_periodo = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)
                or (ND.nnde_periodo+1 = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2))))
              and ((NN.TNOV_COD = 2) OR (NN.TNOV_COD = 3) OR (NN.TNOV_COD = 4) OR (NN.TNOV_COD = 6) or (NN.TNOV_COD = 9) OR (NN.TNOV_COD = 12) OR (NN.TNOV_COD = 13))
              INTO :DIASAU;
        if (DIASAU IS NULL) then
            DIASAU = 0;
        if (DIASAU < 30) then
            BEGIN
            /* 21-VARIACION PERMANENTE SALARIO */
            NOVEDAD = ' ';
            DATOS = :DATOS || :NOVEDAD;
            /* 22-CAMBIO TARIFA ESPECIAL*/
            NOVEDAD = ' ';
            DATOS = :DATOS || :NOVEDAD;
            /* 23-VARIACION TRANSITORIA */
            NOVEDAD = ' ';
            DATOS = :DATOS || :NOVEDAD;
            /* 24-SUSPENCION O LNR */
            NOVEDAD = ' ';
            DATOS = :DATOS || :NOVEDAD;
            /* 25-INCAPACIDAD POR EG */
            NOVEDAD = ' ';
            DATOS = :DATOS || :NOVEDAD;
            /* 26-LICENCIA MATERNIDAD */
            NOVEDAD = ' ';
            DATOS = :DATOS || :NOVEDAD;
            /* 27-VACACIONES */
            NOVEDAD = ' ';
            DATOS = :DATOS || :NOVEDAD;
            /* 28-APORTE VOLUNTARIO */
            NOVEDAD = ' ';
            DATOS = :DATOS || :NOVEDAD;
            /* 29-VARIACION CENTROS TRABAJO */
            NOVEDAD = ' ';
            DATOS = :DATOS || :NOVEDAD;
            /* 30-DIAS INCAPACIDAD PROFESIONAL */
            INCAP = '  ';
            DATOS = :DATOS || :INCAP;
            /* 31-CODIGO AFP */
            CODADMIN = ' ';
            if ((STIPOCOT = '00') AND (TIPOCOT <> '12') AND (TIPOCOT <> '19')) then
                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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
            DATOS = :DATOS || :CODADMIN;
            /* 32-CODIGO NUEVA AFP */
            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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
            DATOS = :DATOS || :CODADMIN;
            /* 33-CODIGO EPS */
            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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
            DATOS = :DATOS || :CODADMIN;
            /* 34-CODIGO NUEVA EPS */
            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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
            DATOS = :DATOS || :CODADMIN;
            /* 35-CODIGO CCF */
            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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
            DATOS = :DATOS || :CODADMIN;
            /* 36-DIAS PENSION */
            execute procedure DIAS_ENTRE_NOMINA(FECINI, FECFIN) returning_values(DIASLAB);
            DIASLAB = CAST(DIASLAB AS INTEGER) - DIASAU;
            if (:DIASLAB is null) then
              DIASLAB = '00';
            execute procedure CAF(:DIASLAB, 2, 'N') returning_values (:DIASLAB);
            if ((STIPOCOT = '00') AND (TIPOCOT <> '12') AND (TIPOCOT <> '19')) then
              DIASLABP = DIASLAB;
            else
              DIASLABP = '00';
            DATOS = :DATOS || :DIASLABP;
            /* 37-DIAS EPS */
            DATOS = :DATOS || :DIASLAB;
            /* 38-DIAS ARP */
            DATOS = :DATOS || :DIASLAB;
            /* 39-DIAS CCF */
            DATOS = :DATOS || :DIASLAB;
            /* 40-SALARIO BASE */
            select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITEMPL and
                M.MVSE_FECHA <= :FECINI order by M.MVSE_FECHA desc
                into :SALBASIC;
            if (:SALBASIC is null) then
              SALBASIC = '0';
            else
                SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
            execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
            DATOS = :DATOS || :SALBASIC;
            /* 41-SALARIO INTEGRAL */
            if (exists (select TERC_NIT from EMPLEADOS where TERC_NIT = :nitempl and EMPL_SALINTEG = 'S')) then
                DATOS = :DATOS || 'X';
            else
                DATOS = :DATOS || ' ';
            /* 42-IBC PENSION */
            /* SE CALCULA CON LA EPS PARA QUE SEA GENERAL A TODOS */
            execute procedure ibc_aporte(:nitempl, :iddoc, 'EPS') returning_values (:IBCAFP);
            execute procedure DIAS_ENTRE_NOMINA(FECINI, FECFIN) returning_values(DIASL);
            DIASL = CAST(DIASL AS INTEGER) - DIASAU;
            IBCAFP = IBCAFP * DIASL / 30;
            SALBASIC = IBCAFP;
            SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
            execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
            DATOS = :DATOS || :SALBASIC;
            /* 43-IBC EPS */
--            execute procedure ibc_aporte(:nitempl, :iddoc, 'EPS') returning_values (:ibceps);
--            IBCEPS = IBCEPS * DIASL / 30;
--            SALBASIC = IBCEPS;
            IBCEPS = IBCAFP;
            SALBASIC = IBCAFP;
            SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
            execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
            DATOS = :DATOS || :SALBASIC;
            /* 44-IBC ARL */
--            execute procedure ibc_aporte(:nitempl, :iddoc, 'ARL') returning_values (:IBCARL);
--            IBCARL = IBCARL * DIASL / 30;
--            SALBASIC = IBCARL;
            IBCARL = IBCAFP;
            SALBASIC = IBCAFP;
            SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
            execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
            DATOS = :DATOS || :SALBASIC;
            /* 45-IBC CCF */
--            execute procedure ibc_aporte(:nitempl, :iddoc, 'CCF') returning_values (:IBCCCF);
--            IBCCCF = IBCCCF * DIASL / 30;
--            SALBASIC = IBCCCF;
            IBCCCF = IBCAFP;
            SALBASIC = IBCCCF;
            SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
            execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
            DATOS = :DATOS || :SALBASIC;
            /* 46-TARIFA AFP  */
            if ((STIPOCOT = '00') AND (TIPOCOT <> '12') AND (TIPOCOT <> '19')) then
                select (P.PAAN_AFPTR + P.PAAN_AFPEM)/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
                    into :PORAFP;
            else
                PORAFP = 0;
            execute procedure CAF(:PORAFP, 7, 'P') returning_values (:PORCAPOR);
            DATOS = :DATOS || :PORCAPOR;
            /* 47-COTIZACION PENSIONES */
            COTOBL = (IBCAFP * PORAFP);
            if (:COTOBL is null) then
              COTOBL = '0';
            execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            /* 48-APORTE VOLUNTARIO EMPLEADO */
            COTOBL = '0';
            if (PRIVEZ = 'S') then
                BEGIN
                select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
                    and (NC.conc_cod = 965) and NC.terc_nit = :nitempl
                    into :COTOBL;
                if (:COTOBL is null) then
                  COTOBL = '0';
                execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
                END
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            /* 49-APORTE VOLUNTARIO EMPLEADOR */
            COTOBL = '0';
            if (PRIVEZ = 'S') then
                BEGIN
                select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
                    and (NC.conc_cod = 964) and NC.terc_nit = :nitempl
                    into :COTOBL;
                if (:COTOBL is null) then
                  COTOBL = '0';
                execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
                END
            PRIVEZ = 'N';
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            /* 50-TOTAL APORTE LO CALCULA EL SISTEMA*/
            DATOS = :DATOS || '000000000';
            /* 51-APORTE FSP-SOLIDARIDAD 50% */
            COTOBL = '0';
            select sum(NC.noco_valor/-2) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
                and (NC.conc_cod = 921) and NC.terc_nit = :nitempl
                into :VRFSP;
            if (:VRFSP is null) then
              VRFSP = 0;
            COTOBL = VRFSP * DIASL / 30;
            execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            /* 52-APORTE FSP-SUBSISTENCIA 50% */
            DATOS = :DATOS || :COTOBL;
            /* 53-VALOR NO RET. X APORTE VOLUNTARIO */
            DATOS = :DATOS || '000000000';
            /* 54-TARIFA SALUD */
            if (EXISTS (select NOMI_ID from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
                and ((NC.conc_cod = 914) or (NC.conc_cod = 915) or (conc_cod = 938) or (CONC_COD = 1016)) and NC.terc_nit = :nitempl)) then
                select (P.PAAN_EPSTR + P.PAAN_EPSEM)/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :POREPS;
            else
                select (P.PAAN_EPSTR)/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :POREPS;
            execute procedure CAF(:POREPS, 7, 'P') returning_values (:PORCAPOR);
            DATOS = :DATOS || :PORCAPOR;
            /* 55-VR COTIZADO SALUD */
            COTOBL = IBCEPS * POREPS;
            execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            /* 56-UPC ADICIONAL */
            DATOS = :DATOS || '000000000';
            /* 57-NRO AUTORIZACION IEG */
            DATOS = :DATOS || '               ';
            /* 58-VR INCAPACIDAD AUTORIZADA */
            DATOS = :DATOS || '000000000';
            /* 59-NRO AUTORIZACION LIC.MAT. */
            DATOS = :DATOS || '               ';
            /* 60-VALOR LIC. MATERNIDAD */
            DATOS = :DATOS || '000000000';
            /* 61-TARIFA RIESGOS */
            TARARL = null;
            select first 1 cast(dpto_tararp as double precision)/100 from empleado_conceptos C, departamento D, empleados E
                where d.dpto_cod = e.empl_dpto and E.terc_nit = :nitempl and E.terc_nit = C.terc_nit and
            ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) into :TARARL;
            execute procedure CAF(:TARARL, 9, 'P') returning_values (:PORCAPOR);
            DATOS = :DATOS || :PORCAPOR;
            /* 62-CODIGO CENTRO TRABAJO */
            DATOS = :DATOS || '000000000';
            /* 63-APORTE ARL */
            COTOBL = IBCARL * TARARL;
            execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            /* 64-TARIFA CCF */
            if (IBCCCF <> 0) then
                select P.PAAN_CCF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCCF;
            else
                PORCCF = 0;
            PORCAPOR = SUBSTR(PORCCF, 1, STRLEN(PORCCF) - 2);
            execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
            DATOS = :DATOS || :PORCAPOR;
            /* 65-APORTE CCF */
            COTOBL = IBCCCF * PORCCF;
            execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N')
                returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            /* 66-TARIFA SENA */
            COTOBL = '0';
            APORINC = NULL;
            select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
                and ((NC.conc_cod = 918) or (NC.conc_cod = 919) or (NC.conc_cod = 940) or (NC.conc_cod = 1018)) and NC.terc_nit = :nitempl
                into :aporinc;
            if (aporinc IS NULL) then
                aporinc = 0;
            if (aporinc <> 0) then
                select P.PAAN_SENA/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCAPOR;
            else
                PORCAPOR = '0';
            PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
            execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
            DATOS = :DATOS || :PORCAPOR;
            /* 67-APORTE SENA */
            if (aporinc IS NULL) then
                select P.PAAN_SENA/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCOT;
            ELSE
                PORCOT = 0;
            COTOBL = IBCCCF * PORCOT;
            execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            /* 68-TARIFA ICBF */
            COTOBL = '0';
            APORINC = NULL;
            select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
                and ((NC.conc_cod = 916) or (NC.conc_cod = 917) or (NC.conc_cod = 939) or (NC.conc_cod = 1017)) and NC.terc_nit = :nitempl
                into :aporinc;
            if (aporinc IS NULL) then
                aporinc = 0;
            if (aporinc <> 0) then
                select P.PAAN_ICBF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCAPOR;
            else
                PORCAPOR = '0';
            PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
            execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
            DATOS = :DATOS || :PORCAPOR;
            /* 69-APORTE ICBF */
            if (aporinc IS NULL) then
                select P.PAAN_ICBF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCOT;
            ELSE
                PORCOT = 0;
            COTOBL = IBCCCF * PORCOT;
            execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            /* 70-TARIFA ESAP */
            select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
                and (NC.conc_cod = 947) and NC.terc_nit = :nitempl
                into :aporinc;
            if (aporinc IS NULL) then
                aporinc = 0;
            if (aporinc <> 0) then
                BEGIN
                select conc_porc from conceptos_nomina P where CONC_COD = 947 into :PORCAPOR;
                PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
                END
            else
                PORCAPOR = '0';
            execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
            DATOS = :DATOS || :PORCAPOR;
            /* 71-APORTE ESAP */
            COTOBL = APORINC;
            execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            /* 72-TARIFA MEN */
            select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
                and (NC.conc_cod = 946) and NC.terc_nit = :nitempl
                into :aporinc;
            if (aporinc IS NULL) then
                aporinc = 0;
            if (aporinc <> 0) then
                BEGIN
                select conc_porc from conceptos_nomina P where CONC_COD = 946 into :PORCAPOR;
                PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
                END
            else
                PORCAPOR = '0';
            execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
            DATOS = :DATOS || :PORCAPOR;
            /* 73-APORTE MEN */
            COTOBL = APORINC;
            execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
            COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
            execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
            DATOS = :DATOS || :COTOBL;
            COTOBL = 0;
            /* 74-TIPO ID COTIZANTE PRINCIPAL SI ES UPC ADICIONAL */
            DATOS = :DATOS || '  ';
            /* 75-ID COTIZANTE PRINCIPAL SI ES UPC ADICIONAL */
            DATOS = :DATOS || '                ';
            /* 76-EXONERADO PAGO SALUD */
            if (DIASL = 0) then
                DIASL = 30;
            if (IBCEPS > (SMMLV * 10)) then
                DATOS = :DATOS || 'N';
            else
                DATOS = :DATOS || 'S';
            /* 77-CODIGO ARL */
            CODADMIN = '';
            if ((STIPOCOT = '00') AND (TIPOCOT <> '12')) then
                select A.admi_codarp from ADMINISTRADORA A, EMPLEADOS E where E.EMPL_ARP = A.TERC_NIT and E.TERC_NIT = :NITEMPL
                    into :CODADMIN;
            if (:CODADMIN is null) then
              CODADMIN = ' ';
            execute procedure CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
            DATOS = :DATOS || :CODADMIN;
            /* 78-RIESGO LABORAL */
            CODTAR = '1';
            tararl = tararl * 100;
            SELECT TARL_ID FROM TARIFAS_ARL WHERE TARL_TARIFA = :TARARL INTO :CODTAR;
            DATOS = :DATOS || :CODTAR;
            /* 79-ALTO RIESGO */
            if (EXISTS(SELECT E.terc_nit FROM EMPLEADOS E WHERE E.terc_nit = :nitempl AND E.empl_altoriesgo = 'S')) then
                DATOS = :DATOS || '1';
            else
                DATOS = :DATOS || ' ';
            /* 80-fecha ingreso */
            if ((SUBSTR(:FECING, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
                (SUBSTR(:FECING, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
              DATOS = :DATOS || substring(fecing from 1 for 4) || '-' || substring(fecing from 6 for 2) || '-' || substring(fecing from 9 for 2);
            ELSE
              DATOS = :DATOS || '          ';
            /* 81-fecha retiro */
            if ((SUBSTR(:fecret, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
                (SUBSTR(:fecret, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
              DATOS = :DATOS || substring(fecret from 1 for 4) || '-' || substring(fecret from 6 for 2) || '-' || substring(fecret from 9 for 2);
            ELSE
              DATOS = :DATOS || '          ';
            /* 82-fecha variacion salario */
            DATOS = :DATOS || '          ';
            /* 83-fecha INICIO SLN */
            DATOS = :DATOS || '          ';
            /* 84-fecha FIN SLN */
            DATOS = :DATOS || '          ';
            /* 85-fecha ini IEG */
            DATOS = :DATOS || '          ';
            /* 86-fecha fin IEG */
            DATOS = :DATOS || '          ';
            /* 87-fecha ini LMA */
            DATOS = :DATOS || '          ';
            /* 88-fecha fin LMA */
            DATOS = :DATOS || '          ';
            /* 89-fecha ini VAC-LR */
            DATOS = :DATOS || '          ';
            /* 90-fecha fin VAC-LR */
            DATOS = :DATOS || '          ';
            /* 91-fecha ini VCT */
            DATOS = :DATOS || '          ';
            /* 92-fecha fin VCT */
            DATOS = :DATOS || '          ';
            /* 93-fecha ini IRL */
            DATOS = :DATOS || '          ';
            /* 94-fecha fin IRL */
            DATOS = :DATOS || '          ';
            /* 95-IBC otros parafiscales */
            SALBASIC = IBCCCF;
            SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
            execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
            DATOS = :DATOS || :SALBASIC;
            /* 96-Horas laboradas: reporta 0 en novedades */
            HORAS = HORAS * diasl / 30;
            execute procedure CAF(:HORAS, 3, 'N') returning_values (:CODADMIN);
            DATOS = :DATOS || :CODADMIN;
            /* 97-Fecha radicacion en el exterior */
            DATOS = :DATOS || '          ';
            SUSPEND;
            END
        END
  end

end^


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^


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^


ALTER PROCEDURE GER_CARTERA_CLIENTES (
    FECHA DATE,
    TIPOREP CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    CUPO NUMERIC(18,2),
    DIASMAX INTEGER,
    SALDOCLI NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable TIPO INTEGER;
declare variable FECDOC DATE;
declare variable VENCE DATE;
declare variable DB CHAR(1);
declare variable SALDO NUMERIC(18,2);
declare variable FOV VARCHAR(10);
declare variable DIAS INTEGER;
declare variable DESC_RTES CHAR(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE 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);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA') RETURNING_VALUES (FOV);
FOR select C.TERC_NIT, TERC_NOM, T.terc_contacto, C.clie_cupo
    from terceros T, CLIENTES C
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND EXISTS (SELECT MVCL_ID FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = T.terc_nit)
    AND not EXISTS (SELECT PTVT_ID FROM PUNTO_VENTA WHERE TERC_NIT = T.terc_nit)
    INTO :NIT, :NOMBRE, :CONTACTO, :CUPO
    DO  
    BEGIN
    SALDOCLI = 0;
    DIASMAX = 0;
    FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE
        FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :FECHA AND
        MVCL_ABONO = 'N' AND ((SUCU_ID = :agencia) or (:agencia = 0))
        INTO :TIPO, :ID, :FECDOC, :VENCE
        DO
        BEGIN
        if (FAUTORET <= FECDOC) then
            if (FAUTORCREE <= 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_RTIVA-SDCA_RTICA-SDCA_RCREE) 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-SDCA_ABRCREE) FROM saldos_doc_cartera
                        WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
        ELSE
            if (FAUTORCREE <= FECDOC) then
                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;
            else
                if (DESC_RTES = 'SI') then
                    SELECT sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA-SDCA_RCREE) 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-SDCA_ABRCREE) FROM saldos_doc_cartera
                        WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
        if (SALDO <> 0) then
            BEGIN
            if (FOV = 'FECHA') then
                DIAS = FECHA - FECDOC;
            ELSE
                DIAS = FECHA - VENCE;
            SALDOCLI = SALDOCLI + SALDO;
            if (DIAS > DIASMAX) then
                DIASMAX = DIAS;
            END  /* SALDO <> 0 */
        END /* FOR MOVIMIENTOS */
    if (SALDOCLI <> 0) then
        SUSPEND;
    END  /* FOR NIT */
END^


ALTER PROCEDURE GER_COMPRAS_GRUPO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBGRUPO VARCHAR(30),
    CANTC NUMERIC(18,2),
    COMPRAS NUMERIC(18,2),
    CANTV NUMERIC(18,2),
    VENTAS NUMERIC(18,2))
AS
declare variable DEV NUMERIC(18,2);
declare variable CANTD NUMERIC(18,2);
begin
FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO INTO :grupo, :nomgrupo
    DO
    BEGIN
    if (EXISTS (SELECT SUBG_COD FROM SUBGRUPO WHERE GRUP_COD = :grupo)) then
        BEGIN
        FOR SELECT SUBG_COD, SUBG_NOM FROM SUBGRUPO INTO :subgrupo, :nomsubgrupo
            DO
            BEGIN
            SELECT SUM(FCDE_CANT*FCDE_FACTOR), SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compra F, facturas_compras_detalle FD, PREFIJOS P, ARTICULO A
                WHERE F.faco_id = FD.faco_id AND FACO_ANULADO = 'N' AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN
                    AND P.tido_cod = 21 AND P.pref_pre = F.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                    AND A.ARTI_COD = FD.arti_cod AND A.grup_cod = :grupo AND A.subg_cod = :subgrupo
                INTO CANTC, COMPRAS;
            if (COMPRAS IS NULL) then
                COMPRAS = 0;
            if (CANTC IS NULL) then
                CANTC = 0;
            SELECT SUM(DVCD_CANT*DVCD_FACTOR), SUM(DVCD_TOTAL-DVCD_IVAMONTO) FROM devoluciones_compras D, devoluciones_compras_det DD, PREFIJOS P, ARTICULO  A
                WHERE D.DVCO_id = DD.DVCO_id AND DVCO_ANULADO = 'N' AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
                    AND P.tido_cod = 24 AND P.pref_pre = D.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                    AND A.ARTI_COD = DD.arti_cod AND A.grup_cod = :grupo AND A.subg_cod = :subgrupo
                INTO CANTD, DEV;
            if (DEV IS NULL) then
                DEV = 0;
            if (CANTD IS NULL) then
                CANTD = 0;
            COMPRAS = COMPRAS - DEV;
            CANTC = CANTC - CANTD;

            SELECT SUM(FADE_CANT*FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO) FROM FACTURAS F, FACTURAS_DETALLE FD, PREFIJOS P, ARTICULO A
                WHERE F.fact_id = FD.fact_id AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
                    AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                    AND A.ARTI_COD = FD.arti_cod AND A.grup_cod = :grupo AND A.subg_cod = :subgrupo
                INTO CANTV, VENTAS;
            if (VENTAS IS NULL) then
                VENTAS = 0;
            if (CANTV IS NULL) then
                CANTV = 0;
            SELECT SUM(DVDE_CANT*DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO) FROM devoluciones_ventas D, devoluciones_ventas_detalle DD, PREFIJOS P, ARTICULO  A
                WHERE D.devt_id = DD.devt_id AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
                    AND P.tido_cod = 33 AND P.pref_pre = D.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                    AND A.ARTI_COD = DD.arti_cod AND A.grup_cod = :grupo AND A.subg_cod = :subgrupo
                INTO CANTD, DEV;
            if (DEV IS NULL) then
                DEV = 0;
            if (CANTD IS NULL) then
                CANTD = 0;
            VENTAS = VENTAS - DEV;
            CANTV = CANTV - CANTD;

            if ((COMPRAS <> 0) or (CANTV <> 0) or (VENTAS <> 0) or (CANTC <> 0) )  then
                suspend;
            END
        END
    ELSE
        BEGIN
        SELECT SUM(FCDE_CANT*FCDE_FACTOR), SUM(FCDE_TOTAL-FCDE_IVAMONTO) FROM facturas_compra F, facturas_compras_detalle FD, PREFIJOS P, ARTICULO A
            WHERE F.FACO_id = FD.FACO_id AND FACO_ANULADO = 'N' AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN
                AND P.tido_cod = 21 AND P.pref_pre = F.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                AND A.ARTI_COD = FD.arti_cod AND A.grup_cod = :grupo
            INTO CANTC, COMPRAS;
        if (COMPRAS IS NULL) then
            COMPRAS = 0;
        if (CANTC IS NULL) then
            CANTC = 0;
        SELECT SUM(DVCD_CANT*DVCD_FACTOR), SUM(DVCD_TOTAL-DVCD_IVAMONTO) FROM devoluciones_compras D, devoluciones_compras_det DD, PREFIJOS P, ARTICULO  A
            WHERE D.DVCO_id = DD.DVCO_id AND DVCO_ANULADO = 'N' AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
                AND P.tido_cod = 24 AND P.pref_pre = D.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                AND A.ARTI_COD = DD.arti_cod AND A.grup_cod = :grupo
            INTO CANTD, DEV;
        if (DEV IS NULL) then
            DEV = 0;
        if (CANTD IS NULL) then
            CANTD = 0;
        COMPRAS = COMPRAS - DEV;
        CANTC = CANTC - CANTD;
        SELECT SUM(FADE_CANT*FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO) FROM FACTURAS F, FACTURAS_DETALLE FD, PREFIJOS P, ARTICULO A
            WHERE F.fact_id = FD.fact_id AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
                AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                AND A.ARTI_COD = FD.arti_cod AND A.grup_cod = :grupo
            INTO CANTV, VENTAS;
        if (VENTAS IS NULL) then
            VENTAS = 0;
        if (CANTV IS NULL) then
            CANTV = 0;
        SELECT SUM(DVDE_CANT*DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO) FROM devoluciones_ventas D, devoluciones_ventas_detalle DD, PREFIJOS P, ARTICULO  A
            WHERE D.devt_id = DD.devt_id AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
                AND P.tido_cod = 33 AND P.pref_pre = D.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                AND A.ARTI_COD = DD.arti_cod AND A.grup_cod = :grupo
            INTO CANTD, DEV;
        if (DEV IS NULL) then
            DEV = 0;
        if (CANTD IS NULL) then
            CANTD = 0;
        VENTAS = VENTAS - DEV;
        CANTV = CANTV - CANTD;
        if ((COMPRAS <> 0) or (CANTV <> 0) or (VENTAS <> 0) or (CANTC <> 0) )  then
            suspend;
        END
    END
end^


ALTER PROCEDURE GER_COMPRAS_PROVEEDOR (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    PROVEEDOR VARCHAR(20),
    NOMPROVEEDOR VARCHAR(60),
    CANTC NUMERIC(18,2),
    COMPRAS NUMERIC(18,2),
    CANTV NUMERIC(18,2),
    VENTAS NUMERIC(18,2))
AS
declare variable DEV NUMERIC(18,2);
declare variable CANTD NUMERIC(18,2);
begin
FOR SELECT T.TERC_NIT, TERC_NOM FROM TERCEROS T, PROVEEDORES P
    WHERE T.terc_nit = P.terc_nit AND TERC_PROV = 'S'
    INTO :proveedor, :nomproveedor
    DO
    BEGIN
    SELECT SUM(FCDE_CANT*FCDE_FACTOR), SUM(FCDE_TOTAL-FCDE_IVAMONTO)
        FROM facturas_compra F, facturas_compras_detalle FD, PREFIJOS P
        WHERE F.faco_id = FD.faco_id AND FACO_ANULADO = 'N' AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN
            AND P.tido_cod = 21 AND P.pref_pre = F.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
            AND F.terc_nit = :proveedor
        INTO CANTC, COMPRAS;
    if (COMPRAS IS NULL) then
        COMPRAS = 0;
    if (CANTC IS NULL) then
        CANTC = 0;
    SELECT SUM(DVCD_CANT*DVCD_FACTOR), SUM(DVCD_TOTAL-DVCD_IVAMONTO) FROM devoluciones_compras D, devoluciones_compras_det DD, PREFIJOS P
        WHERE D.DVCO_id = DD.DVCO_id AND DVCO_ANULADO = 'N' AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
            AND P.tido_cod = 24 AND P.pref_pre = D.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
            AND D.terc_nit = :proveedor
        INTO CANTD, DEV;
    if (DEV IS NULL) then
        DEV = 0;
    if (CANTD IS NULL) then
        CANTD = 0;
    COMPRAS = COMPRAS - DEV;
    CANTC = CANTC - CANTD;
    if ((COMPRAS <> 0) or (CANTC <> 0) )  then
        begin
        SELECT SUM(FADE_CANT*FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO) FROM FACTURAS F, FACTURAS_DETALLE FD, PREFIJOS P, PROVEEDOR_ARTICULO A
            WHERE F.fact_id = FD.fact_id AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
                AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                AND A.ARTI_COD = FD.arti_cod AND A.terc_nit = :proveedor
            INTO CANTV, VENTAS;
        if (VENTAS IS NULL) then
            VENTAS = 0;
        if (CANTV IS NULL) then
            CANTV = 0;
        SELECT SUM(DVDE_CANT*DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO) FROM devoluciones_ventas D, devoluciones_ventas_detalle DD, PREFIJOS P, PROVEEDOR_ARTICULO A
            WHERE D.devt_id = DD.devt_id AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
                AND P.tido_cod = 33 AND P.pref_pre = D.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                AND A.ARTI_COD = DD.arti_cod AND A.terc_nit = :proveedor
            INTO CANTD, DEV;
        if (DEV IS NULL) then
            DEV = 0;
        if (CANTD IS NULL) then
            CANTD = 0;
        VENTAS = VENTAS - DEV;
        CANTV = CANTV - CANTD;
        suspend;
        end
    END
end^


ALTER PROCEDURE GER_CXPAGAR (
    FECHA DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIASMAX INTEGER,
    SALDOPRV NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable TIPO INTEGER;
declare variable FECDOC DATE;
declare variable VENCE DATE;
declare variable SALDO NUMERIC(18,2);
declare variable FOV VARCHAR(10);
declare variable DIAS INTEGER;
declare variable DESC_RTES CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
execute procedure LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (FOV);
FOR select T.TERC_NIT, TERC_NOM
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' AND EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE TERC_NIT = T.terc_nit)
    AND not EXISTS (SELECT PTVT_ID FROM PUNTO_VENTA WHERE TERC_NIT = T.terc_nit)
    INTO :NIT, :NOMBRE
    DO  
    BEGIN
    SALDOPRV = 0;
    DIASMAX = 0;
    FOR SELECT MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE
        FROM MOVIMIENTO_PROVEEDOR WHERE TERC_NIT = :NIT AND MVPR_FECHA <= :FECHA AND
        MVPR_ABONO = 'N'
        INTO :TIPO, :ID, :FECDOC, :VENCE
        DO
        BEGIN
        if (DESC_RTES = 'SI') then
            SELECT SUM(SDCP_MONTO-SDCP_ABONO-SDCP_RTEFTE-SDCP_RTIVA-SDCP_RTICA-SDCP_RCREE) 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_ABRCREE) FROM saldos_doc_cxpagar
                WHERE (SDCP_TIPOREF = :TIPO) AND (SDCP_IDREF = :ID) AND (SDCP_FECHA <= :FECHA) INTO :SALDO;
        if (SALDO <> 0) then
            BEGIN
            if (FOV = 'FECHA') then
                DIAS = FECHA - FECDOC;
            ELSE
                DIAS = FECHA - VENCE;
            SALDOPRV = SALDOPRV + SALDO;
            if (DIAS > DIASMAX) then
                DIASMAX = DIAS;
            END  /* SALDO <> 0 */
        END /* FOR MOVIMIENTOS */
    if (SALDOPRV <> 0) then
        SUSPEND;
    END  /* FOR NIT */
END^


ALTER PROCEDURE GER_DISMINUCION_VENTAS_CLI (
    FEC1INI DATE,
    FEC1FIN DATE,
    FEC2INI DATE,
    FEC2FIN DATE,
    TIPO CHAR(1))
RETURNS (
    CLIENTE VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    VENTA1 NUMERIC(18,2),
    VENTA2 NUMERIC(18,2),
    CANT1 NUMERIC(18,2),
    CANT2 NUMERIC(18,2),
    DIFCANT NUMERIC(18,2),
    DIFMONTO NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable SUMA1 NUMERIC(18,2);
declare variable SUMA2 NUMERIC(18,2);
declare variable ID INTEGER;
begin
ID = GEN_ID(id_reputilidad, 1);
FOR SELECT MAX(TERC_NIT), SUM(FACT_TOTAL - FACT_IVAMONTO), COUNT(FACT_ID)
    FROM FACTURAS F
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FEC1INI AND FACT_FECHA <= :FEC1FIN
    GROUP BY TERC_NIT
    INTO :CLIENTE, :venta1,  :CANT1
    DO
    BEGIN
    insert into REP_UTILIDAD (ID, CODIGO, BASE, CANT, COSTO, CONSUMO, IVA, TIPO)
        values (:ID, :cliente, :VENTA1, :CANT1, 0, 0, 0, 31);
    END
FOR SELECT MAX(TERC_NIT), SUM(FACT_TOTAL - FACT_IVAMONTO), COUNT(FACT_ID)
    FROM FACTURAS F
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FEC2INI AND FACT_FECHA <= :FEC2FIN
    GROUP BY TERC_NIT
    INTO :CLIENTE, :venta2,  :CANT2
    DO
    BEGIN
    if (EXISTS (SELECT ID FROM REP_UTILIDAD WHERE ID = :ID AND CODIGO = :CLIENTE)) then
        UPDATE REP_UTILIDAD SET COSTO = :VENTA2, CONSUMO = :cant2, IVA = CANT - :CANT2
            WHERE ID = :ID AND CODIGO = :CLIENTE;
    ELSE
        insert into REP_UTILIDAD (ID, CODIGO, COSTO, CONSUMO, BASE, CANT, IVA, TIPO)
            values (:ID, :cliente, :VENTA2, :CANT2, 0, 0, :CANT2*-1, 31);
    END
/* DIFERENCIA MONTO EN UTILIDAD Y EN CANT EN IVA */
if (TIPO = 'M') then
    BEGIN
    SELECT SUM(BASE), SUM(COSTO) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMA1, SUMA2;
    for SELECT FIRST 20 ID, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT, UTILIDAD
        from REP_UTILIDAD
        WHERE ID = :ID AND BASE > COSTO ORDER BY utilidad DESC
        into :ID, :cliente, :venta1, :difcant, :cant2, :venta2, :cant1, :difmonto
        DO
        BEGIN
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :cliente INTO :nomcliente;
        if (VENTA1 <> 0) then
            PORC = (1 - (VENTA2 / VENTA1)) * 100;
        ELSE
            PORC = 100;
        SUMA1 = SUMA1 - VENTA1;
        SUMA2 = SUMA2 - VENTA2;
        suspend;
        END
    if (SUMA1 <> 0) then
        PORC = (1 - (SUMA2 / SUMA1)) * 100;
    ELSE
        PORC = 100;
    CLIENTE = '';
    NOMCLIENTE = 'OTROS CLIENTES';
    VENTA1 = SUMA1;
    VENTA2 = SUMA2;
    if (SUMA1 <> 0) then
    PORC = (1 - (SUMA2 / SUMA1)) * 100;
    SUSPEND;
    END
if (TIPO = 'C') then
    BEGIN
    SELECT SUM(CANT), SUM(CONSUMO) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMA1, SUMA2;
    for SELECT FIRST 20 ID, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT, UTILIDAD
        from REP_UTILIDAD
        WHERE ID = :ID AND CANT > CONSUMO ORDER BY IVA DESC
        into :ID, :cliente, :venta1, :difcant, :cant2, :venta2, :cant1, :difmonto
        DO
        BEGIN
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :cliente INTO :nomcliente;
        if (CANT1 <> 0) then
            PORC = (1 - (CANT2 / CANT1)) * 100;
        ELSE
            PORC = 100;
        SUMA1 = SUMA1 - CANT1;
        SUMA2 = SUMA2 - CANT2;
        suspend;
        END
    CLIENTE = '';
    NOMCLIENTE = 'OTROS CLIENTES';
    CANT1 = SUMA1;
    CANT2 = SUMA2;
    if (SUMA1 <> 0) then
        PORC = (1 - (SUMA2 / SUMA1)) * 100;
    ELSE
        PORC = 100;
    SUSPEND;
    END
end^


ALTER PROCEDURE GER_DISMINUCION_VENTAS_PROD (
    FEC1INI DATE,
    FEC1FIN DATE,
    FEC2INI DATE,
    FEC2FIN DATE,
    TIPO CHAR(1))
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    VENTA1 NUMERIC(18,2),
    VENTA2 NUMERIC(18,2),
    CANT1 NUMERIC(18,2),
    CANT2 NUMERIC(18,2),
    DIFCANT NUMERIC(18,2),
    DIFMONTO NUMERIC(18,2),
    PORC NUMERIC(9,2))
AS
declare variable SUMA1 NUMERIC(18,2);
declare variable SUMA2 NUMERIC(18,2);
declare variable ID INTEGER;
begin
ID = GEN_ID(id_reputilidad, 1);
FOR SELECT MAX(ARTI_COD), SUM(FADE_TOTAL - FADE_IVAMONTO), SUM(FADE_CANT*FADE_FACTOR)
    FROM FACTURAS F, FACTURAS_DETALLE FD
    WHERE F.fact_id = FD.fact_id AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FEC1INI AND FACT_FECHA <= :FEC1FIN
    GROUP BY ARTI_COD
    INTO :ARTICULO, :venta1,  :CANT1
    DO
    BEGIN
    insert into REP_UTILIDAD (ID, CODIGO, BASE, CANT, COSTO, CONSUMO, IVA, TIPO)
        values (:ID, :articulo, :VENTA1, :CANT1, 0, 0, 0, 31);
    END
FOR SELECT MAX(ARTI_COD), SUM(FADE_TOTAL - FADE_IVAMONTO), SUM(FADE_CANT*FADE_FACTOR)
    FROM FACTURAS F, FACTURAS_DETALLE FD
    WHERE F.fact_id = FD.fact_id AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FEC2INI AND FACT_FECHA <= :FEC2FIN
    GROUP BY ARTI_COD
    INTO :ARTICULO, :venta2,  :CANT2
    DO
    BEGIN
    if (EXISTS (SELECT ID FROM REP_UTILIDAD WHERE ID = :ID AND CODIGO = :ARTICULO)) then
        UPDATE REP_UTILIDAD SET COSTO = :VENTA2, CONSUMO = :cant2, IVA = CANT - :CANT2
            WHERE ID = :ID AND CODIGO = :ARTICULO;
    ELSE
        insert into REP_UTILIDAD (ID, CODIGO, COSTO, CONSUMO, BASE, CANT, IVA, TIPO)
            values (:ID, :articulo, :VENTA2, :CANT2, 0, 0, :CANT2*-1, 31);
    END
/* DIFERENCIA MONTO EN UTILIDAD Y EN CANT EN IVA */
if (TIPO = 'M') then
    BEGIN
    SELECT SUM(BASE), SUM(COSTO) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMA1, SUMA2;
    for SELECT FIRST 20 ID, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT, UTILIDAD
        from REP_UTILIDAD
        WHERE ID = :ID AND BASE > COSTO ORDER BY utilidad DESC
        into :ID, :articulo, :venta1, :difcant, :cant2, :venta2, :cant1, :difmonto
        DO
        BEGIN
        SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :articulo INTO :descripcion;
        if (VENTA1 <> 0) then
            PORC = (1 - (VENTA2 / VENTA1)) * 100;
        ELSE
            PORC = 100;
        SUMA1 = SUMA1 - VENTA1;
        SUMA2 = SUMA2 - VENTA2;
        suspend;
        END
    ARTICULO = '';
    DESCRIPCION = 'OTROS PRODUCTOS';
    VENTA1 = SUMA1;
    VENTA2 = SUMA2;
    if (SUMA1 <> 0) then
        PORC = (1 - (SUMA2 / SUMA1)) * 100;
    ELSE
        PORC = 100;
    SUSPEND;
    END
if (TIPO = 'C') then
    BEGIN
    SELECT SUM(CANT), SUM(CONSUMO) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMA1, SUMA2;
    for SELECT FIRST 20 ID, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT, UTILIDAD
        from REP_UTILIDAD
        WHERE ID = :ID AND CANT > CONSUMO ORDER BY IVA DESC
        into :ID, :articulo, :venta1, :difcant, :cant2, :venta2, :cant1, :difmonto
        DO
        BEGIN
        SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :articulo INTO :descripcion;
        if (CANT1 <> 0) then
            PORC = (1 - (CANT2 / CANT1)) * 100;
        ELSE
            PORC = 100;
        SUMA1 = SUMA1 - CANT1;
        SUMA2 = SUMA2 - CANT2;
        suspend;
        END
    ARTICULO = '';
    DESCRIPCION = 'OTROS PRODUCTOS';
    CANT1 = SUMA1;
    CANT2 = SUMA2;
    if (SUMA1 <> 0) then
        PORC = (1 - (SUMA2 / SUMA1)) * 100;
    ELSE
        PORC = 100;
    SUSPEND;
    END
end^


ALTER PROCEDURE GER_INVENTARIO_AGOTADOS (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    PORC NUMERIC(18,2))
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    EXISTENCIA NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    PORCENTAJE NUMERIC(18,2))
AS
declare variable BODEGA VARCHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable DEV NUMERIC(18,2);
begin
FOR SELECT A.ARTI_COD FROM ARTICULO A WHERE ESAR_COD <> 'I'
    INTO :ARTICULO
    DO
    BEGIN
    SELECT SUM(FADE_CANT*FADE_FACTOR) FROM FACTURAS F, FACTURAS_DETALLE FD, PREFIJOS P
        WHERE F.fact_id = FD.fact_id AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
            AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
            AND ARTI_COD = :ARTICULO
        INTO VENTAS;
    SELECT SUM(DVDE_CANT*DVDE_FACTOR) FROM devoluciones_ventas D, devoluciones_ventas_detalle DD, PREFIJOS P
        WHERE D.devt_id = DD.devt_id AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
            AND P.tido_cod = 33 AND P.pref_pre = D.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
            AND ARTI_COD = :ARTICULO
        INTO DEV;
    if (DEV IS NULL) then
        DEV = 0;
    VENTAS = VENTAS - DEV;
    if (VENTAS <> 0) then
        BEGIN
        EXISTENCIA = 0;
        FOR SELECT BODE_COD FROM BODEGA WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) INTO :BODEGA
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_inventario(:ARTICULO, :bodega,  :FECFIN) returning_values (SALDO);
            EXISTENCIA = EXISTENCIA + SALDO;
            END
        if ((PORC/100) > (EXISTENCIA / VENTAS)) then
            BEGIN
            PORCENTAJE = (EXISTENCIA / VENTAS) * 100;
            SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :articulo INTO :descripcion;
            SUSPEND;
            END
        END
    END
end^


ALTER PROCEDURE GER_INVENTARIO_BAJAROT (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    PORC NUMERIC(18,2))
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    EXISTENCIA NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    PORCENTAJE NUMERIC(18,2))
AS
declare variable BODEGA VARCHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable DEV NUMERIC(18,2);
begin
FOR SELECT A.ARTI_COD FROM ARTICULO A WHERE ESAR_COD <> 'I'
    INTO :ARTICULO
    DO
    BEGIN
    EXISTENCIA = 0;
    VENTAS = 0;
    DEV = 0;
    FOR SELECT BODE_COD FROM BODEGA WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) INTO :BODEGA
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_inventario(:ARTICULO, :bodega,  :FECINI) returning_values (SALDO);
        EXISTENCIA = EXISTENCIA + SALDO;
        END
    if (EXISTENCIA <> 0) then
        BEGIN
        SELECT SUM(FADE_CANT*FADE_FACTOR) FROM FACTURAS F, FACTURAS_DETALLE FD, PREFIJOS P
            WHERE F.fact_id = FD.fact_id AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
                AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                AND ARTI_COD = :ARTICULO
            INTO VENTAS;
        if (VENTAS IS NULL) then
            VENTAS = 0;
        SELECT SUM(DVDE_CANT*DVDE_FACTOR) FROM devoluciones_ventas D, devoluciones_ventas_detalle DD, PREFIJOS P
            WHERE D.devt_id = DD.devt_id AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
                AND P.tido_cod = 33 AND P.pref_pre = D.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                AND ARTI_COD = :ARTICULO
            INTO DEV;
        if (DEV IS NULL) then
            DEV = 0;
        VENTAS = VENTAS - DEV;
        if ((PORC/100) > (VENTAS / EXISTENCIA)) then
            BEGIN
            PORCENTAJE = (VENTAS / EXISTENCIA) * 100;
            SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :articulo INTO :descripcion;
            SUSPEND;
            END
        END
    END
end^


ALTER PROCEDURE GER_INVENTARIO_GRUPO (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBGRUPO VARCHAR(30),
    EXISTENCIA NUMERIC(18,2),
    COSTO NUMERIC(18,2))
AS
declare variable ARTICULO VARCHAR(20);
declare variable BODEGA VARCHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COSTOU NUMERIC(18,2);
begin
FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO INTO :grupo, :nomgrupo
    DO
    BEGIN
    if (EXISTS (SELECT SUBG_COD FROM SUBGRUPO WHERE GRUP_COD = :grupo)) then
        BEGIN
        FOR SELECT SUBG_COD, SUBG_NOM FROM SUBGRUPO INTO :subgrupo, :nomsubgrupo
            DO
            BEGIN
            EXISTENCIA = 0;
            COSTO = 0;
            FOR SELECT ARTI_COD FROM ARTICULO A WHERE ESAR_COD <> 'I' AND
                A.grup_cod = :grupO AND A.subg_cod = :subgrupo
                INTO :ARTICULO
                DO
                BEGIN
                FOR SELECT BODE_COD FROM BODEGA WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) INTO :BODEGA
                    DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_inventario(:ARTICULO, :bodega,  :FECHA) returning_values (SALDO);
                    EXISTENCIA = EXISTENCIA + SALDO;
                    EXECUTE PROCEDURE costo_promedio(:ARTICULO, :FECHA) returning_values (COSTOU);
                    COSTO = COSTO + (COSTOU * SALDO);
                    END
                END
            suspend;
            END
        END
    ELSE
        BEGIN
        EXISTENCIA = 0;
        COSTO = 0;
        SUBGRUPO = '';
        NOMSUBGRUPO = '';
        FOR SELECT ARTI_COD FROM ARTICULO A WHERE ESAR_COD <> 'I' AND A.grup_cod = :grupo
            INTO :ARTICULO
            DO
            BEGIN
            FOR SELECT BODE_COD FROM BODEGA WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) INTO :BODEGA
                DO
                BEGIN
                EXECUTE PROCEDURE saldo_inventario(:ARTICULO, :bodega,  :FECHA) returning_values (SALDO);
                EXISTENCIA = EXISTENCIA + SALDO;
                EXECUTE PROCEDURE costo_promedio(:ARTICULO, :FECHA) returning_values (COSTOU);
                COSTO = COSTO + (COSTOU * SALDO);
                END
            END
        if ((EXISTENCIA <> 0) or (COSTO <> 0)) then
            suspend;
        END
    END
end^


ALTER PROCEDURE GER_INVENTARIO_MARCA (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    EXISTENCIA NUMERIC(18,2),
    COSTO NUMERIC(18,2))
AS
declare variable ARTICULO VARCHAR(20);
declare variable BODEGA VARCHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COSTOU NUMERIC(18,2);
begin
FOR SELECT MARC_COD, MARC_NOM FROM MARCAS INTO :marca, :nommarca
    DO
    BEGIN
    EXISTENCIA = 0;
    COSTO = 0;
    FOR SELECT ARTI_COD FROM ARTICULO A WHERE ESAR_COD <> 'I' AND A.marc_cod = :marca
        INTO :ARTICULO
        DO
        BEGIN
        FOR SELECT BODE_COD FROM BODEGA WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) INTO :BODEGA
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_inventario(:ARTICULO, :bodega,  :FECHA) returning_values (SALDO);
            EXISTENCIA = EXISTENCIA + SALDO;
            EXECUTE PROCEDURE costo_promedio(:ARTICULO, :FECHA) returning_values (COSTOU);
            COSTO = COSTO + (COSTOU * SALDO);
            END
        END
    if ((EXISTENCIA <> 0) or (COSTO <> 0)) then
        suspend;
    END
end^


ALTER PROCEDURE GER_INVENTARIO_PROV (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    PROVEEDOR VARCHAR(15),
    NOMPROVEEDOR VARCHAR(60),
    EXISTENCIA NUMERIC(18,2),
    COSTO NUMERIC(18,2))
AS
declare variable ARTICULO VARCHAR(20);
declare variable BODEGA VARCHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COSTOU NUMERIC(18,2);
begin
FOR SELECT T.TERC_NIT, TERC_NOM FROM TERCEROS T, PROVEEDORES P
    WHERE T.terc_nit = P.terc_nit AND TERC_PROV = 'S'
    INTO :proveedor, :nomproveedor
    DO
    BEGIN
    EXISTENCIA = 0;
    COSTO = 0;
    FOR SELECT A.ARTI_COD FROM ARTICULO A, proveedor_articulo P WHERE A.arti_cod = P.arti_cod AND P.terc_nit = :proveedor
        AND ESAR_COD <> 'I'
        INTO :ARTICULO
        DO
        BEGIN
        FOR SELECT BODE_COD FROM BODEGA WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) INTO :BODEGA
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_inventario(:ARTICULO, :bodega,  :FECHA) returning_values (SALDO);
            EXISTENCIA = EXISTENCIA + SALDO;
            EXECUTE PROCEDURE costo_promedio(:ARTICULO, :FECHA) returning_values (COSTOU);
            COSTO = COSTO + (COSTOU * SALDO);
            END
        END
    if ((EXISTENCIA <> 0) or (COSTO <> 0)) then
        suspend;
    END
end^


ALTER PROCEDURE GER_MOVIMIENTO_CLIENTES (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS NUMERIC(18,2),
    DEVOLUCIONES NUMERIC(18,2),
    NOTAS NUMERIC(18,2),
    ABONOS NUMERIC(18,2))
AS
declare variable TIPO INTEGER;
declare variable MONTO NUMERIC(18,2);
BEGIN
FOR select T.TERC_NIT, TERC_NOM from terceros T, CLIENTES C
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S'
    AND EXISTS (SELECT MVCL_ID FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = T.terc_nit AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN)
    AND not EXISTS (SELECT PTVT_ID FROM PUNTO_VENTA WHERE TERC_NIT = T.terc_nit)
    INTO :NIT, :NOMBRE
    DO  
    BEGIN
    FACTURAS = 0;
    DEVOLUCIONES = 0;
    NOTAS = 0;
    ABONOS = 0;
    FOR SELECT MAX(MVCL_TIPOREF), SUM(MVCL_MONTO)
        FROM MOVIMIENTO_CLIENTES WHERE MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND
        TERC_NIT = :NIT AND ((SUCU_ID = :agencia) or (:agencia = 0))
        AND MVCL_TIPOREF <> 45
        GROUP BY MVCL_TIPOREF
        INTO :TIPO, :MONTO
        DO
        BEGIN
        if (TIPO = 31) then
            FACTURAS = MONTO;
        if (TIPO = 33) then
            DEVOLUCIONES = MONTO;
        if (TIPO = 61) then
            ABONOS = MONTO;
        if (TIPO = 41) then
            NOTAS = MONTO;
        if (TIPO = 42) then
            NOTAS = NOTAS - MONTO;
        END
    if ((FACTURAS <> 0) or (DEVOLUCIONES <> 0) or (NOTAS <> 0) or (ABONOS <> 0))  then
        SUSPEND;
    END  /* FOR NIT */
END^


ALTER PROCEDURE GER_MOVIMIENTO_PROVEEDOR (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FACTURAS NUMERIC(18,2),
    DEVOLUCIONES NUMERIC(18,2),
    NOTAS NUMERIC(18,2),
    ABONOS NUMERIC(18,2))
AS
declare variable TIPO INTEGER;
declare variable MONTO NUMERIC(18,2);
BEGIN
FOR select T.TERC_NIT, TERC_NOM from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S'
    AND EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE TERC_NIT = T.terc_nit AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN)
    INTO :NIT, :NOMBRE
    DO  
    BEGIN
    FACTURAS = 0;
    DEVOLUCIONES = 0;
    NOTAS = 0;
    ABONOS = 0;
    FOR SELECT MAX(MVPR_TIPOREF), SUM(MVPR_MONTO)
        FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND
        TERC_NIT = :NIT
        AND MVPR_TIPOREF <> 55
        GROUP BY MVPR_TIPOREF
        INTO :TIPO, :MONTO
        DO
        BEGIN
        if (TIPO = 21) then
            FACTURAS = MONTO;
        if (TIPO = 24) then
            DEVOLUCIONES = MONTO;
        if (TIPO = 62) then
            ABONOS = MONTO;
        if (TIPO = 51) then
            NOTAS = MONTO;
        if (TIPO = 52) then
            NOTAS = NOTAS - MONTO;
        END
    if ((FACTURAS <> 0) or (DEVOLUCIONES <> 0) or (NOTAS <> 0) or (ABONOS <> 0))  then
        SUSPEND;
    END  /* FOR NIT */
END^


ALTER PROCEDURE GER_RESUMEN_BANCOS (
    FECHA DATE)
RETURNS (
    NOMCTA VARCHAR(60),
    SALDOINI NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    RETIROS NUMERIC(18,2),
    NOTAS NUMERIC(18,2),
    TRASLADOS NUMERIC(18,2),
    SALDOFINAL NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable TIPO INTEGER;
declare variable MONTO NUMERIC(18,2);
begin
FOR SELECT CUBA_COD, CUBA_TITULAR FROM CUENTAS_BANCO
    WHERE CUBA_ESTADO = 'N' INTO :ID, :nomcta
    DO
    BEGIN
    CONSIGNA = 0;
    RETIROS = 0;
    NOTAS = 0;
    TRASLADOS = 0;
    EXECUTE PROCEDURE SALDO_CUENTA_BANCO (:ID, :FECHA) RETURNING_VALUES (:SALDOINI);
    FOR SELECT MAX(MOBA_TIPODOC), SUM(MOBA_TOTAL) FROM MOVIMIENTO_BANCO WHERE CUBA_COD = :ID AND MOBA_FECHA = :FECHA
        INTO :TIPO, :monto
        DO
        BEGIN
        if (TIPO = 71) then
            CONSIGNA = MONTO;
        if (TIPO = 72) then
            RETIROS = MONTO;
        if (TIPO = 73) then
            RETIROS = RETIROS + MONTO;
        if (TIPO = 74) then
            NOTAS = MONTO;
        if (TIPO = 75) then
            NOTAS = NOTAS + MONTO;
        if (TIPO = 77) then
            NOTAS = NOTAS + MONTO;
        if (TIPO = 76) then
            TRASLADOS = MONTO;
        END
    SALDOFINAL = SALDOINI + CONSIGNA + RETIROS + NOTAS + TRASLADOS;
    if ((SALDOINI <> 0) or (CONSIGNA <> 0) or (RETIROS <> 0) or (NOTAS <> 0) or (TRASLADOS <> 0) or (SALDOFINAL <> 0) )  then
        SUSPEND;
    END
end^


ALTER PROCEDURE GER_RESUMEN_CAJA (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    NOMCAJACTA VARCHAR(60),
    SALDOINI NUMERIC(18,2),
    RECIBOS NUMERIC(18,2),
    EGRESOS NUMERIC(18,2),
    TRASLADOS NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    SALDOFINAL NUMERIC(18,2))
AS
declare variable ID integer;
declare variable TIPO integer;
declare variable MONTO numeric(18,2);
begin
FOR SELECT CAJA_ID, CAJA_NOMBRE FROM CAJAS WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) AND CAJA_ACTIVA = 'S'
    INTO :ID, :NOMCAJACTA
    do
    begin
    RECIBOS = 0;
    EGRESOS = 0;
    TRASLADOS = 0;
    CONSIGNA = 0;
    EXECUTE PROCEDURE SALDO_EN_CAJA (:ID, :FECHA) RETURNING_VALUES (:SALDOINI);
    FOR SELECT MAX(MOCA_TIPOREF), SUM(MOCA_DEBITOS - MOCA_CREDITOS) FROM MOVIMIENTO_CAJA
        WHERE CAJA_ID = :ID AND MOCA_FECHA = :FECHA
        group by MOCA_TIPOREF
        INTO :TIPO, :MONTO
        DO
        BEGIN
        if (TIPO = 61) then
            RECIBOS = MONTO;
        if (TIPO = 62) then
            EGRESOS = MONTO;
        if (TIPO = 64) then
            CONSIGNA = MONTO;
        if (TIPO = 71) then
            CONSIGNA = CONSIGNA + MONTO;
        if (TIPO = 66) then
            TRASLADOS = MONTO;
        END
    SALDOFINAL = SALDOINI + RECIBOS + EGRESOS + CONSIGNA + TRASLADOS;
    if ((SALDOINI <> 0) or (RECIBOS <> 0) or (EGRESOS <> 0) or (TRASLADOS <> 0) or (SALDOFINAL <> 0) )  then
        SUSPEND;
    end
end^


ALTER PROCEDURE GER_RESUMEN_SALDOS (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    NOMCAJACTA VARCHAR(60),
    SALDOINI NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    SALDOFINAL NUMERIC(18,2))
AS
declare variable ID INTEGER;
begin
FOR SELECT CAJA_ID, 'CAJA: ' || CAJA_NOMBRE FROM CAJAS WHERE ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) AND CAJA_ACTIVA = 'S'
    INTO :ID, :NOMCAJACTA
    do
    begin
    EXECUTE PROCEDURE SALDO_EN_CAJA (:ID, :FECHA) RETURNING_VALUES (:SALDOINI);
    SELECT SUM(MOCA_DEBITOS), SUM(MOCA_CREDITOS) FROM MOVIMIENTO_CAJA
        WHERE CAJA_ID = :ID AND MOCA_FECHA = :FECHA INTO :DEBITOS, :CREDITOS;
    IF (DEBITOS IS NULL) THEN
      DEBITOS = 0;
    IF (CREDITOS IS NULL) THEN
      CREDITOS = 0;
    SALDOFINAL = SALDOINI + DEBITOS - CREDITOS;
    if ((SALDOINI <> 0) or (DEBITOS <> 0) or (CREDITOS <> 0) or (SALDOFINAL <> 0) )  then
        SUSPEND;
    end
FOR SELECT CUBA_COD, 'BANCO: ' || CUBA_TITULAR FROM CUENTAS_BANCO
    WHERE CUBA_ESTADO = 'N' INTO :ID, :nomcajacta
    DO
    BEGIN
    EXECUTE PROCEDURE SALDO_CUENTA_BANCO (:ID, :FECHA) RETURNING_VALUES (:SALDOINI);
    SELECT SUM(MOBA_TOTAL) FROM MOVIMIENTO_BANCO WHERE CUBA_COD = :ID AND MOBA_FECHA = :FECHA AND MOBA_DB = 'S'
        INTO :debitos;
    SELECT SUM(MOBA_TOTAL) FROM MOVIMIENTO_BANCO WHERE CUBA_COD = :ID AND MOBA_FECHA = :FECHA AND MOBA_DB = 'N'
        INTO :creditos;
    IF (DEBITOS IS NULL) THEN
      DEBITOS = 0;
    IF (CREDITOS IS NULL) THEN
      CREDITOS = 0;
    SALDOFINAL = SALDOINI + DEBITOS - CREDITOS;
    if ((SALDOINI <> 0) or (DEBITOS <> 0) or (CREDITOS <> 0) or (SALDOFINAL <> 0) )  then
        SUSPEND;
    END
end^


ALTER PROCEDURE GER_VENTAS_ARTICULO (
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable SUMAC NUMERIC(18,2);
declare variable SUMAM NUMERIC(18,2);
declare variable SUMAU NUMERIC(18,2);
declare variable SUMAO NUMERIC(18,2);
declare variable DEVC NUMERIC(18,2);
declare variable DEVM NUMERIC(18,2);
begin
COSTO = 0;
UTILIDAD = 0;
ID = GEN_ID(id_reputilidad, 1);
FOR SELECT MAX(ARTI_COD), SUM(FADE_CANT*FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO) FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
    WHERE F.FACT_ID = D.FACT_ID AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
    F.pref_pre = P.pref_pre AND P.TIDO_COD = 31 AND ((P.sucu_id = :AGENCIA) or (:AGENCIA = 0))
    GROUP BY ARTI_COD
    INTO :ARTICULO, :CANT, :MONTO
    DO
    BEGIN
    DEVC = 0;
    DEVM = 0;
    SELECT SUM(DVDE_CANT*DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO) FROM devoluciones_ventas V, devoluciones_ventas_detalle VD, PREFIJOS P
        WHERE V.devt_id = VD.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND
        VD.arti_cod = :ARTICULO AND V.pref_pre = P.pref_pre AND P.TIDO_COD = 33 AND ((P.sucu_id = :AGENCIA) or (:AGENCIA = 0))
        INTO :DEVC, :DEVM;
    if (DEVC IS NULL) then
        DEVC = 0;
    if (DEVM IS NULL) then
        DEVM = 0;
    CANT = CANT - DEVC;
    MONTO = MONTO - DEVM;
    if (TIPO = 'U') then
        EXECUTE PROCEDURE costo_ventas_articulo(:ARTICULO, :FECINI, :FECFIN, :AGENCIA) returning_values (:COSTO);
    insert into REP_UTILIDAD (ID, CODIGO, BASE, IVA, CONSUMO, COSTO, TIPO, CANT)
    values (:ID, :ARTICULO, :MONTO, 0, 0, :COSTO, 31, :CANT);
    END
if (TIPO = 'V') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SELECT SUM(BASE), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAM, SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY BASE DESC
        INTO :ARTICULO, :MONTO, :cant
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DESCRIPCION, :UNIDAD;
        SUSPEND;
        END
    ARTICULO = 'OTROS';
    DESCRIPCION = 'OTROS ARTICULOS';
    UNIDAD = 'UNIDAD';
    MONTO = SUMAM;
    CANT = SUMAC;
    SUSPEND;
    END
if (TIPO = 'C') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SELECT SUM(BASE), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAM, SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY CANT DESC
        INTO :ARTICULO, :MONTO, :cant
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DESCRIPCION, :UNIDAD;
        SUSPEND;
        END
    ARTICULO = 'OTROS';
    DESCRIPCION = 'OTROS ARTICULOS';
    UNIDAD = 'UNIDAD';
    MONTO = SUMAM;
    CANT = SUMAC;
    SUSPEND;
    END
if (TIPO = 'U') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SUMAU = 0;
    SUMAO = 0;
    SELECT SUM(UTILIDAD), SUM(BASE), SUM(COSTO), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAU, :SUMAM, :SUMAO, :SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT, UTILIDAD, COSTO FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY UTILIDAD DESC
        INTO :ARTICULO, :MONTO, :cant, :UTILIDAD, :COSTO
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SUMAU = SUMAU - UTILIDAD;
        SUMAO = SUMAO - COSTO;
        SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DESCRIPCION, :UNIDAD;
        SUSPEND;
        END
    ARTICULO = 'OTROS';
    DESCRIPCION = 'OTROS ARTICULOS';
    UNIDAD = 'UNIDAD';
    MONTO = SUMAM;
    CANT = SUMAC;
    COSTO = SUMAO;
    UTILIDAD = SUMAU;
    SUSPEND;
    END
end^


ALTER PROCEDURE GER_VENTAS_CLIENTE (
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    CLIENTE VARCHAR(20),
    NOMBRE VARCHAR(60),
    CONTACTO VARCHAR(60),
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable SUMAC NUMERIC(18,2);
declare variable SUMAM NUMERIC(18,2);
declare variable SUMAU NUMERIC(18,2);
declare variable SUMAO NUMERIC(18,2);
declare variable DEVC NUMERIC(18,2);
declare variable DEVM NUMERIC(18,2);
begin
COSTO = 0;
UTILIDAD = 0;
ID = GEN_ID(id_reputilidad, 1);
FOR SELECT MAX(TERC_NIT), COUNT(FACT_ID), SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
    F.pref_pre = P.pref_pre AND P.TIDO_COD = 31 AND ((P.sucu_id = :AGENCIA) or (:AGENCIA = 0))
    GROUP BY TERC_NIT
    INTO :CLIENTE, :CANT, :MONTO
    DO
    BEGIN
    DEVC = 0;
    DEVM = 0;
    SELECT COUNT(DEVT_ID), SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas V, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND
        V.terc_nit = :CLIENTE AND V.pref_pre = P.pref_pre AND P.TIDO_COD = 33 AND ((P.sucu_id = :AGENCIA) or (:AGENCIA = 0))
        INTO :DEVC, :DEVM;
    if (DEVC IS NULL) then
        DEVC = 0;
    if (DEVM IS NULL) then
        DEVM = 0;
    CANT = CANT - DEVC;
    MONTO = MONTO - DEVM;
    if (TIPO = 'U') then
        EXECUTE PROCEDURE costo_ventas_cliente(:CLIENTE, :FECINI, :FECFIN, :AGENCIA) returning_values (:COSTO);
    insert into REP_UTILIDAD (ID, CODIGO, BASE, IVA, CONSUMO, COSTO, TIPO, CANT)
    values (:ID, :CLIENTE, :MONTO, 0, 0, :COSTO, 31, :CANT);
    END
if (TIPO = 'V') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SELECT SUM(BASE), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAM, SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY BASE DESC
        INTO :CLIENTE, :MONTO, :cant
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SELECT TERC_NOM, TERC_CONTACTO FROM TERCEROS WHERE TERC_NIT = :CLIENTE INTO :NOMBRE, :CONTACTO;
        SUSPEND;
        END
    CLIENTE = 'OTROS';
    NOMBRE = 'OTROS CLIENTES';
    CONTACTO = '';
    MONTO = SUMAM;
    CANT = SUMAC;
    SUSPEND;
    END
if (TIPO = 'C') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SELECT SUM(BASE), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAM, SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY CANT DESC
        INTO :CLIENTE, :MONTO, :cant
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SELECT TERC_NOM, TERC_CONTACTO FROM TERCEROS WHERE TERC_NIT = :CLIENTE INTO :NOMBRE, :CONTACTO;
        SUSPEND;
        END
    CLIENTE = 'OTROS';
    NOMBRE = 'OTROS CLIENTES';
    CONTACTO = '';
    MONTO = SUMAM;
    CANT = SUMAC;
    SUSPEND;
    END
if (TIPO = 'U') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SUMAU = 0;
    SUMAO = 0;
    SELECT SUM(UTILIDAD), SUM(BASE), SUM(COSTO), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAU, :SUMAM, :SUMAO, :SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT, UTILIDAD, COSTO FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY UTILIDAD DESC
        INTO :CLIENTE, :MONTO, :cant, :UTILIDAD, :COSTO
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SUMAU = SUMAU - UTILIDAD;
        SUMAO = SUMAO - COSTO;
        SELECT TERC_NOM, TERC_CONTACTO FROM TERCEROS WHERE TERC_NIT = :CLIENTE INTO :NOMBRE, :CONTACTO;
        SUSPEND;
        END
    CLIENTE = 'OTROS';
    NOMBRE = 'OTROS CLIENTES';
    CONTACTO = '';
    MONTO = SUMAM;
    CANT = SUMAC;
    COSTO = SUMAO;
    UTILIDAD = SUMAU;
    SUSPEND;
    END
end^


ALTER PROCEDURE GER_VENTAS_FECHA (
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    FECHA DATE,
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
declare variable DEVC NUMERIC(18,2);
declare variable DEVM NUMERIC(18,2);
begin
COSTO = 0;
UTILIDAD = 0;
FOR SELECT MAX(FACT_FECHA), COUNT(FACT_ID), SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
    F.pref_pre = P.pref_pre AND P.TIDO_COD = 31 AND ((P.sucu_id = :AGENCIA) or (:AGENCIA = 0))
    GROUP BY FACT_FECHA
    INTO :FECHA, :CANT, :MONTO
    DO
    BEGIN
    DEVC = 0;
    DEVM = 0;
    SELECT COUNT(DEVT_ID), SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas V, PREFIJOS P
        WHERE DEVT_FECHA = :FECHA AND DEVT_ANULADO = 'N' AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND
        V.pref_pre = P.pref_pre AND P.TIDO_COD = 33 AND ((P.sucu_id = :AGENCIA) or (:AGENCIA = 0))
        INTO :DEVC, :DEVM;
    if (DEVC IS NULL) then
        DEVC = 0;
    if (DEVM IS NULL) then
        DEVM = 0;
    CANT = CANT - DEVC;
    MONTO = MONTO - DEVM;
    if (TIPO = 'U') then
        BEGIN
        EXECUTE PROCEDURE costo_ventas_fecha(:FECHA, :AGENCIA) returning_values (:COSTO);
        UTILIDAD = MONTO - COSTO;
        END
    suspend;
    END
end^


ALTER PROCEDURE GER_VENTAS_GRUPO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBGRUPO VARCHAR(30),
    CANT NUMERIC(18,2),
    VENTAS NUMERIC(18,2))
AS
declare variable DEV NUMERIC(18,2);
declare variable CANTD NUMERIC(18,2);
begin
FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO INTO :grupo, :nomgrupo
    DO
    BEGIN
    if (EXISTS (SELECT SUBG_COD FROM SUBGRUPO WHERE GRUP_COD = :grupo)) then
        BEGIN
        FOR SELECT SUBG_COD, SUBG_NOM FROM SUBGRUPO INTO :subgrupo, :nomsubgrupo
            DO
            BEGIN
            SELECT SUM(FADE_CANT*FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO) FROM FACTURAS F, FACTURAS_DETALLE FD, PREFIJOS P, ARTICULO A
                WHERE F.fact_id = FD.fact_id AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
                    AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                    AND A.ARTI_COD = FD.arti_cod AND A.grup_cod = :grupo AND A.subg_cod = :subgrupo
                INTO CANT, VENTAS;
            if (VENTAS IS NULL) then
                VENTAS = 0;
            if (CANT IS NULL) then
                CANT = 0;
            SELECT SUM(DVDE_CANT*DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO) FROM devoluciones_ventas D, devoluciones_ventas_detalle DD, PREFIJOS P, ARTICULO  A
                WHERE D.devt_id = DD.devt_id AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
                    AND P.tido_cod = 33 AND P.pref_pre = D.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                    AND A.ARTI_COD = DD.arti_cod AND A.grup_cod = :grupo AND A.subg_cod = :subgrupo
                INTO CANTD, DEV;
            if (DEV IS NULL) then
                DEV = 0;
            if (CANTD IS NULL) then
                CANTD = 0;
            VENTAS = VENTAS - DEV;
            CANT = CANT - CANTD;
            if ((VENTAS <> 0) or (CANT <> 0))  then
                suspend;
            END
        END
    ELSE
        BEGIN
        SELECT SUM(FADE_CANT*FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO) FROM FACTURAS F, FACTURAS_DETALLE FD, PREFIJOS P, ARTICULO A
            WHERE F.fact_id = FD.fact_id AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
                AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                AND A.ARTI_COD = FD.arti_cod AND A.grup_cod = :grupo
            INTO CANT, VENTAS;
        if (VENTAS IS NULL) then
            VENTAS = 0;
        if (CANT IS NULL) then
            CANT = 0;
        SELECT SUM(DVDE_CANT*DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO) FROM devoluciones_ventas D, devoluciones_ventas_detalle DD, PREFIJOS P, ARTICULO  A
            WHERE D.devt_id = DD.devt_id AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
                AND P.tido_cod = 33 AND P.pref_pre = D.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
                AND A.ARTI_COD = DD.arti_cod AND A.grup_cod = :grupo
            INTO CANTD, DEV;
        if (DEV IS NULL) then
            DEV = 0;
        if (CANTD IS NULL) then
            CANTD = 0;
        VENTAS = VENTAS - DEV;
        CANT = CANT - CANTD;
        if ((VENTAS <> 0) or (CANT <> 0))  then
            suspend;
        END
    END
end^


ALTER PROCEDURE GER_VENTAS_PUNTO (
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    PUNTO INTEGER,
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable SUMAC NUMERIC(18,2);
declare variable SUMAM NUMERIC(18,2);
declare variable SUMAU NUMERIC(18,2);
declare variable SUMAO NUMERIC(18,2);
declare variable DEVC NUMERIC(18,2);
declare variable DEVM NUMERIC(18,2);
begin
COSTO = 0;
UTILIDAD = 0;
ID = GEN_ID(id_reputilidad, 1);
FOR SELECT MAX(PTVT_ID), COUNT(FACT_ID), SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
    F.pref_pre = P.pref_pre AND P.TIDO_COD = 31 AND ((P.sucu_id = :AGENCIA) or (:AGENCIA = 0))
    GROUP BY PTVT_ID
    INTO :PUNTO, :CANT, :MONTO
    DO
    BEGIN
    DEVC = 0;
    DEVM = 0;
    SELECT COUNT(DEVT_ID), SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas V, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND
        V.ptvt_id = :punto AND V.pref_pre = P.pref_pre AND P.TIDO_COD = 33 AND ((P.sucu_id = :AGENCIA) or (:AGENCIA = 0))
        INTO :DEVC, :DEVM;
    if (DEVC IS NULL) then
        DEVC = 0;
    if (DEVM IS NULL) then
        DEVM = 0;
    CANT = CANT - DEVC;
    MONTO = MONTO - DEVM;
    if (TIPO = 'U') then
        EXECUTE PROCEDURE costo_ventas_PUNTO(:punto, :FECINI, :FECFIN, :AGENCIA) returning_values (:COSTO);
    insert into REP_UTILIDAD (ID, CODIGO, BASE, IVA, CONSUMO, COSTO, TIPO, CANT)
    values (:ID, :punto, :MONTO, 0, 0, :COSTO, 31, :CANT);
    END
if (TIPO = 'V') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SELECT SUM(BASE), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAM, SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY BASE DESC
        INTO :PUNTO, :MONTO, :cant
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :NOMBRE;
        SUSPEND;
        END
    PUNTO = 0;
    NOMBRE = 'OTROS PUNTOS';
    MONTO = SUMAM;
    CANT = SUMAC;
    SUSPEND;
    END
if (TIPO = 'C') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SELECT SUM(BASE), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAM, SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY CANT DESC
        INTO :punto, :MONTO, :cant
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :NOMBRE;
        SUSPEND;
        END
    PUNTO = 0;
    NOMBRE = 'OTROS PUNTOS';
    MONTO = SUMAM;
    CANT = SUMAC;
    SUSPEND;
    END
if (TIPO = 'U') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SUMAU = 0;
    SUMAO = 0;
    SELECT SUM(UTILIDAD), SUM(BASE), SUM(COSTO), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAU, :SUMAM, :SUMAO, :SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT, UTILIDAD, COSTO FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY UTILIDAD DESC
        INTO :punto, :MONTO, :cant, :UTILIDAD, :COSTO
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SUMAU = SUMAU - UTILIDAD;
        SUMAO = SUMAO - COSTO;
        SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :NOMBRE;
        SUSPEND;
        END
    PUNTO = 0;
    NOMBRE = 'OTROS PUNTOS';
    MONTO = SUMAM;
    CANT = SUMAC;
    COSTO = SUMAO;
    UTILIDAD = SUMAU;
    SUSPEND;
    END
end^


ALTER PROCEDURE GER_VENTAS_VENDEDOR (
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1),
    AGENCIA INTEGER)
RETURNS (
    VENDEDOR INTEGER,
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable SUMAC NUMERIC(18,2);
declare variable SUMAM NUMERIC(18,2);
declare variable SUMAU NUMERIC(18,2);
declare variable SUMAO NUMERIC(18,2);
declare variable DEVC NUMERIC(18,2);
declare variable DEVM NUMERIC(18,2);
begin
COSTO = 0;
UTILIDAD = 0;
ID = GEN_ID(id_reputilidad, 1);
FOR SELECT MAX(VEND_COD), COUNT(FACT_ID), SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS F, PREFIJOS P
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
    F.pref_pre = P.pref_pre AND P.TIDO_COD = 31 AND ((P.sucu_id = :AGENCIA) or (:AGENCIA = 0))
    GROUP BY VEND_COD
    INTO :VENDEDOR, :CANT, :MONTO
    DO
    BEGIN
    DEVC = 0;
    DEVM = 0;
    SELECT COUNT(DEVT_ID), SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas V, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND
        V.vend_cod = :vendedor AND V.pref_pre = P.pref_pre AND P.TIDO_COD = 33 AND ((P.sucu_id = :AGENCIA) or (:AGENCIA = 0))
        INTO :DEVC, :DEVM;
    if (DEVC IS NULL) then
        DEVC = 0;
    if (DEVM IS NULL) then
        DEVM = 0;
    CANT = CANT - DEVC;
    MONTO = MONTO - DEVM;
    if (TIPO = 'U') then
        EXECUTE PROCEDURE costo_ventas_vendedor(:vendedor, :FECINI, :FECFIN, :AGENCIA) returning_values (:COSTO);
    insert into REP_UTILIDAD (ID, CODIGO, BASE, IVA, CONSUMO, COSTO, TIPO, CANT)
    values (:ID, :vendedor, :MONTO, 0, 0, :COSTO, 31, :CANT);
    END
if (TIPO = 'V') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SELECT SUM(BASE), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAM, SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY BASE DESC
        INTO :vendedor, :MONTO, :cant
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :vendedor INTO :NOMBRE;
        SUSPEND;
        END
    VENDEDOR = 0;
    NOMBRE = 'OTROS VENDEDORES';
    MONTO = SUMAM;
    CANT = SUMAC;
    SUSPEND;
    END
if (TIPO = 'C') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SELECT SUM(BASE), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAM, SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY CANT DESC
        INTO :vendedor, :MONTO, :cant
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :vendedor INTO :NOMBRE;
        SUSPEND;
        END
    VENDEDOR = 0;
    NOMBRE = 'OTROS VENDEDORES';
    MONTO = SUMAM;
    CANT = SUMAC;
    SUSPEND;
    END
if (TIPO = 'U') then
    BEGIN
    SUMAC = 0;
    SUMAM = 0;
    SUMAU = 0;
    SUMAO = 0;
    SELECT SUM(UTILIDAD), SUM(BASE), SUM(COSTO), SUM(CANT) FROM REP_UTILIDAD WHERE ID = :ID INTO :SUMAU, :SUMAM, :SUMAO, :SUMAC;
    FOR SELECT FIRST 20 CODIGO, BASE, CANT, UTILIDAD, COSTO FROM REP_UTILIDAD WHERE ID = :ID
        ORDER BY UTILIDAD DESC
        INTO :vendedor, :MONTO, :cant, :UTILIDAD, :COSTO
        DO
        BEGIN
        SUMAC = SUMAC - CANT;
        SUMAM = SUMAM - MONTO;
        SUMAU = SUMAU - UTILIDAD;
        SUMAO = SUMAO - COSTO;
        SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :vendedor INTO :NOMBRE;
        SUSPEND;
        END
    VENDEDOR = 0;
    NOMBRE = 'OTROS VENDEDORES';
    MONTO = SUMAM;
    CANT = SUMAC;
    COSTO = SUMAO;
    UTILIDAD = SUMAU;
    SUSPEND;
    END
end^


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


ALTER PROCEDURE GRABE_FACTURA_WEB (
    ID INTEGER)
RETURNS (
    IDFAC INTEGER)
AS
declare variable IVAINC CHAR(1);
declare variable PUNTO INTEGER;
declare variable BOD VARCHAR(2);
begin
select facw_idfac from factura_web where facw_id = :id into :idfac;
if ((idfac = 0) or (idfac is null))  then
    begin
    IDFAC = gen_id(id_factura, 1);
    SELECT PREF_IVAINC FROM PREFIJOS P, FACTURA_WEB F
        WHERE TIDO_COD = 31 AND PREF_PRE = F.facw_pref AND F.facw_id = :ID INTO :IVAINC;
    SELECT PTVT_ID FROM VENDEDORES V, FACTURA_WEB F WHERE F.facw_id = :ID AND V.vend_cod = F.vend_cod INTO :PUNTO;
    SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PUNTO INTO :BOD;
    /* EL ENCABEZADO */
    
    INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO, FACT_VENCE,
        FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR,
        FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO,
        FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT,
        FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA, FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD,
        FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_ANTICIPO, FACT_DEC2799,
        FACT_RTCREE, FACT_RTCREEM, FACT_ENTREGA)
        SELECT :idfac, :PUNTO, VEND_COD, TERC_NIT, '000001', FACW_FECHA , '', FACW_FECHA,
        :IVAINC, 0, 0, FACW_DTOPORC, FACW_DTOMONTO, FACW_ADICIONAL, FACW_IVAMONTO, FACW_RTFTEPORC,
        FACW_RTFTEMONTO, FACW_RTIVAPORC, FACW_RTIVAMONTO, FACW_RTICAPORC, FACW_RTICAMONTO, FACW_EXTRA, 0, 0,
        FACW_FECHA, FACW_PREF, NULL, FACW_NOMBRE, NULL, NULL, NULL, 'N', 'N',
        FACW_TOTAL, :BOD, FACW_OBS, NULL, 0, 0, USER, FACW_SUCURSAL, 'N', VEND_COD,
        1, NULL, NULL, 0, 0, 0, 1, 0, 0,
        0, 0, FACW_ENTREGA
        FROM FACTURA_WEB WHERE FACW_ID = :ID;
    /* LOS ITEMS */
    
    INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE, FADE_PRUNIT, FADE_DTOPORC,
        FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR, FADE_DESC, FADE_OBS, FADE_CODBAR,
        FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA, FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA,
        FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE, FADE_INALCP,
        FADE_INALCM)
        SELECT :idfac, FAWD_ITEM, BODE_COD, ARTI_COD, FAWD_CANT, FAWD_UNIDAD, null, FAWD_PRUNIT, FAWD_DTOP,
        FAWD_DTOM, FAWD_IVAP, FAWD_IVAMONTO, FAWD_CONSUMO, NULL, FAWD_DESC, FAWD_OBS, FAWD_CODBAR,
        0, 0, FAWD_TOTAL, LIPR_COD, FAWD_REFERENCIA, 'N', 'N', 1,
        FAWD_DTO1, FAWD_DTO2, FAWD_DTO3, FAWD_DTO1M, FAWD_DTO2M, FAWD_DTO3M, 0, 0, 0, FAWD_INALCP, FAWD_INALCM
        FROM FACTURA_WEB_DETALLE WHERE FACW_ID = :ID;
    update factura_web set facw_idfac = :idfac where facw_id = :id;
    suspend;
    end
else
    begin
    idfac = 0;
    suspend;
    end
end^


ALTER PROCEDURE GRABE_PEDIDO_WEB (
    ID INTEGER)
RETURNS (
    IDPED INTEGER)
AS
declare variable PREF varchar(4);
declare variable IVAINC char(1);
declare variable NIT varchar(20);
declare variable NOMCLI varchar(60);
declare variable VEN integer;
declare variable PUNTO integer;
begin
IDPED = gen_id(id_pedido, 1);
SELECT PEWE_PREF, TERC_NIT, VEND_COD FROM PEDIDO_WEB WHERE PEWE_ID = :ID INTO :PREF, :NIT, :VEN;
SELECT PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = :PREF INTO :IVAINC;
SELECT PTVT_ID FROM VENDEDORES WHERE VEND_cOD = :VEN INTO :PUNTO;
/* EL ENCABEZADO */
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_NROCOPIA, PEDI_CONSOLIDA, PEDI_USUARIO,
    PEDI_SUCURSAL, NUMOK, PEDI_FACTOR, PEDI_TRM, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3, PEDI_VENCE, PEDI_DIASCR,
    PEDI_IDENTR, PEDI_PENDIENTE, PEDI_CANAL, PEDI_PEDWEB, PEDI_TIPOENTREGA, PEDI_HORAENTREGA)
    SELECT :IDPED, TERC_NIT, VEND_COD, 34, PEWE_PREF, '000001', PEWE_FECHA, (PEWE_ENTREGA-PEWE_FECHA),
    '', PEWE_OBS, :IVAINC, PEWE_NOMCLI, PEWE_DTOPORC, PEWE_DTOMONTO, PEWE_ADICIONAL, PEWE_IVAMONTO,
    PEWE_EXTRA, PEWE_TOTAL, 'N', 'N', :PUNTO, '', PEWE_RTFTEPORC, 0, PEWE_RTIVAPORC, 0, PEWE_RTICAPORC, 0, 0, 0, user,
    PEWE_SUCURSAL, 'N', 1, 1, 0, 0, 0, PEWE_ENTREGA, PEWE_DIASCR, 0, 'N', 0, PEWE_ID, PEWE_TIPOENTREGA, PEWE_HORAENTREGA
    FROM PEDIDO_WEB WHERE PEWE_ID = :ID;
/* LOS ITEMS */
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, PEDE_DTO1, PEDE_DTO2, PEDE_DTO3, PEDE_DTOM1, PEDE_DTOM2, PEDE_DTOM3, PEDE_DEVUELTO)
    SELECT :IDPED, PEWD_ITEM, ARTI_COD, PEWD_CANT, PEWD_UNIDAD, PEWD_DTOP, PEWD_DTOM, 
    PEWD_IVAP, PEWD_IVAMONTO, PEWD_CONSUMO, PEWD_FACTOR, NULL, NULL, PEWD_CODBAR, PEWD_TOTAL, 
    'N', 'N', LIPR_COD, PEWD_REFERENCIA, PEWD_PRUNIT, 0, 0,
    0, BODE_COD, PEWD_DTO1, PEWD_DTO2, PEWD_DTO3, PEWD_DTO1M, PEWD_DTO2M, PEWD_DTO3M, 0
    FROM PEDIDO_WEB_DETALLE WHERE PEWE_ID = :ID;
UPDATE PEDIDO_WEB SET PEWE_IDPED = :IDPED WHERE PEWE_ID = :ID;
suspend;
end^


ALTER PROCEDURE HISTORIA_MENSAJES (
    USUARIO VARCHAR(10))
RETURNS (
    ID INTEGER,
    EOS CHAR(1),
    FECHA DATE,
    HORA TIME,
    REMITE VARCHAR(10),
    MENSAJE VARCHAR(255),
    LEIDO CHAR(1))
AS
begin
FOR SELECT MENS_ID, 'E', MENS_FECHA, MENS_HORA, MENS_AUTOR, MENS_MENSAJE, MENS_LEIDO
    FROM MENSAJERIA WHERE MENS_DESTINO = :usuario
    INTO :ID, :EOS, :FECHA, :HORA, :REMITE, :MENSAJE, :LEIDO
    DO
    suspend;
FOR SELECT MENS_ID, 'S', MENS_FECHA, MENS_HORA, MENS_DESTINO, MENS_MENSAJE, MENS_LEIDO
    FROM MENSAJERIA WHERE MENS_AUTOR = :usuario
    INTO :ID, :EOS, :FECHA, :HORA, :REMITE, :MENSAJE, :LEIDO
    DO
    suspend;
end^


ALTER PROCEDURE HISTORICO_CARTERA_CLIENTE (
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    SUCURSAL VARCHAR(10),
    AGENCIA INTEGER)
RETURNS (
    FECDOC DATE,
    SALDO NUMERIC(18,2))
AS
BEGIN
FOR SELECT DISTINCT M.mvcl_fecha FROM movimiento_clientes M
    WHERE TERC_NIT = :nit AND M.mvcl_sucursal = :sucursal AND M.mvcl_fecha >= :fecini AND M.mvcl_fecha <= :fecfin AND ((M.sucu_id = :agencia) or (:agencia = 0))
    ORDER BY MVCL_FECHA INTO :fecdoc
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_cliente_sucursal(:NIT, :sucursal, :fecdoc,  0) returning_values (:saldo);
    SUSPEND;
    END
END^


ALTER PROCEDURE HISTORICO_EMPLEADO (
    FEC DATE,
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    EMPLDESDE VARCHAR(20),
    EMPLHASTA VARCHAR(20))
RETURNS (
    FECNOM DATE,
    CONCNOM VARCHAR(60),
    COD INTEGER,
    NIT VARCHAR(20),
    VALOR NUMERIC(18,2),
    ENTIDAD VARCHAR(20),
    DEDUC CHAR(1),
    PROV CHAR(1),
    APORTE CHAR(1),
    PAGOOK CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    APLICAPROM CHAR(1),
    SALARIO CHAR(1),
    GTOEMPR CHAR(1),
    NOMCORTO VARCHAR(60),
    NOMPER VARCHAR(60),
    NOMEMPL VARCHAR(60),
    FECRET DATE)
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) or (O.nomi_periodocidad = 4) or (O.nomi_periodocidad = 5))
  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
  FECRET = NULL;
  SELECT EMPL_FECRET FROM EMPLEADOS WHERE TERC_NIT = :NIT INTO :fecret;
  SUSPEND;
  END
END^


ALTER PROCEDURE IBC_APORTE (
    NITE VARCHAR(20),
    IDPAGO INTEGER,
    TIPOAPORTE CHAR(3))
RETURNS (
    VALOR NUMERIC(18,2))
AS
declare variable ANO varchar(4);
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable PERIODICIDAD integer;
begin
SELECT MAX(N.nomi_periodo), MIN(N.nomi_periodo), MIN(N.nomi_periodocidad), MAX(N.nomi_ano)
    FROM pago_aportes_nom P, nomina N WHERE P.pgap_id = :idpago AND P.pgap_idnom = N.nomi_id
    INTO :perfinal, :perinicial, :periodicidad, :ANO;
valor = 0;
if (TIPOAPORTE = 'AFP') then
    select SUM(nc.noco_base) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
        where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and ((NC.CONC_COD = 905) or (NC.CONC_COD = 906) or (NC.CONC_COD = 934) or (NC.CONC_COD = 1012))
        AND NC.TERC_NIT = :NITE AND NC.conc_cod = C.conc_cod into :valor;
if (TIPOAPORTE = 'EPS') then
    begin
    select SUM(nc.noco_base) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
        where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and ((NC.CONC_COD = 914) or (NC.CONC_COD = 915) or (NC.conc_cod = 938) or (NC.CONC_COD = 1016) or (NC.conc_cod = 976))
        AND NC.TERC_NIT = :NITE AND NC.conc_cod = C.conc_cod into :valor;
    if (valor is null) then
        valor = 0;
    if (valor = 0) then
        select SUM(nc.noco_base) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
            where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
            N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and (NC.CONC_COD = 907)
            AND NC.TERC_NIT = :NITE AND NC.conc_cod = C.conc_cod into :valor;
    end
if (TIPOAPORTE = 'ARL') then
    select SUM(nc.noco_base) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
        where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and ((NC.CONC_COD = 908) or (NC.CONC_COD = 909) or (NC.CONC_COD = 935) or (NC.CONC_COD = 1013))
        AND NC.TERC_NIT = :NITE AND NC.conc_cod = C.conc_cod into :valor;
if (TIPOAPORTE = 'CCF') then
    select SUM(nc.noco_base) from nomina_conceptos NC, conceptos_nomina C, NOMINA N
        where N.nomi_id = NC.nomi_id AND ((N.nomi_periodocidad = :PERIODICIDAD) or (N.nomi_periodocidad = 5)) and N.nomi_periodo >= :perinicial and
        N.nomi_periodo <= :perfinal and N.nomi_ano = :ANO and ((NC.CONC_COD = 910) or (NC.CONC_COD = 911) or (NC.CONC_COD = 936) or (NC.CONC_COD = 1014))
        AND NC.TERC_NIT = :NITE AND NC.conc_cod = C.conc_cod into :valor;
if (:valor is null) then
  valor = 0;
execute procedure REDONDEE(VALOR, 0) returning_values (VALOR);
suspend;
end^


ALTER PROCEDURE IBC_APORTES (
    NITE VARCHAR(20),
    IDPAGO INTEGER)
RETURNS (
    VALOR NUMERIC(18,2))
AS
declare variable ANO varchar(4);
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable PERIODICIDAD integer;
declare variable smlv numeric(18,2);
declare variable basico numeric(18,2);
declare variable basicoemp numeric(18,2);
declare variable cambsaltrans numeric(18,2);
declare variable comision numeric(18,2);
declare variable retroact numeric(18,2);
declare variable reembolso numeric(18,2);
declare variable incap numeric(18,2);
declare variable HORASEX numeric(18,2);
declare variable recargo numeric(18,2);
declare variable diaslab integer;
declare variable diasnov integer;
declare variable duranov integer;
declare variable tar_salinteg numeric(9,4);
declare variable salinteg char(1);
declare variable CONC_COD INTEGER;
begin
SELECT MAX(N.nomi_periodo), MIN(N.nomi_periodo), MAX(N.nomi_periodocidad), MAX(N.nomi_ano)
    FROM pago_aportes_nom P, nomina N WHERE P.pgap_id = :idpago AND P.pgap_idnom = N.nomi_id AND nomi_periodocidad < 4
    INTO :perfinal, :perinicial, :periodicidad, :ANO;
select P.paan_salinteg, P.PAAN_SALMINIMO from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
    into :TAR_SALINTEG, SMLV;
select empl_salinteg from EMPLEADOS WHERE TERC_NIT = :NITE INTO :SALINTEG;
SELECT FIRST 1 CONC_COD FROM empleado_conceptos WHERE ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903)
     or (CONC_COD = 1011) or (CONC_COD = 971) or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 974)
      or (CONC_COD = 980) or (CONC_COD = 981) or (CONC_COD = 1023)) INTO :CONC_COD;
execute procedure ibc_empleado (:NITE, :ANO, :perfinal, :conc_cod) returning_values (:BASICOEMP);
diaslab = 30;
/* 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 >= :perinicial AND ND.nnde_periodo <= :perfinal
    into :CAMBSALTRANS, :DURANOV;
if (CAMBSALTRANS is null) then
    CAMBSALTRANS = 0;
if (DURANOV is null) then
    DURANOV = 0;
DIASLAB = :DIASLAB - :DURANOV;
BASICO = ((:BASICOEMP/30)*:DIASLAB) + :CAMBSALTRANS;
/* 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;
/* INCAPACIDAD */
select sum(ND.nnde_duracion), sum(ND.nnde_valor) 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) or (N.TNOV_COD = 12))
    into :diasnov, :incap;
if (:diasnov is null) then
    diasnov = 0;
if (:incap is null) then
    INCAP = 0;
/*SALARIO INTEGRAL */
if (SALINTEG = 'S') then
    BASICO = BASICO * (tar_salinteg / 100);

/*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*/
select sum(C.noex_montorec) 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 :recargo;
if (RECARGO is null) then
    RECARGO = 0;
/*BASE*/
VALOR = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO;
if (VALOR < 0) then
    VALOR = 0;
/* si es menor a un minimo aporte sobre el minimo */
if (VALOR < :SMLV) then
    VALOR = :SMLV;
suspend;
end^


ALTER PROCEDURE IBC_EMPLEADO (
    NITE VARCHAR(20),
    ANO CHAR(4),
    PERIODO INTEGER,
    CONC_COD INTEGER)
RETURNS (
    BASICO NUMERIC(18,2))
AS
declare variable PERIODICIDAD INTEGER;
declare variable FECHAF DATE;
declare variable FECHAI DATE;
declare variable FECHA2 DATE;
declare variable FECING DATE;
declare variable BASICO2 NUMERIC(18,2);
declare variable MENSUAL CHAR(1);
declare variable DIASPER INTEGER;
begin
SELECT EMPL_PPAGO, empl_fecing FROM empleados WHERE TERC_NIT = :NITE INTO :periodicidad, :fecing;
SELECT EC.emco_mensual FROM empleado_conceptos EC WHERE TERC_NIT = :nite AND CONC_COD = :conc_cod INTO :MENSUAL;
if (MENSUAL = 'S') then
    periodicidad = 1;
SELECT P.ppag_dias FROM periodo_pago P WHERE P.ppag_cod = :periodicidad INTO :diasper;
EXECUTE PROCEDURE fecha_final_periodo_pago(:periodicidad, :ANO, :PERIODO) returning_values (:FECHAF);
EXECUTE PROCEDURE fecha_inicial_periodo_pago(:periodicidad, :ANO, :PERIODO) returning_values (:fechai);
select first 1 MVSE_SALARIO, MVSE_FECHA from MOVIMIENTO_SALARIO_EMPLEADO M
    where TERC_NIT = :NITE and MVSE_FECHA <= :FECHAF order by MVSE_FECHA desc
    into :BASICO, :FECHA2;
if ((FECHA2 > FECHAI) AND (FECHA2 <> FECING)) then
    BEGIN
    /* EL CAMBIO OCURRIO EN MEDIO DEL PERIODO */
    select FIRST 1 MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M
        where TERC_NIT = :NITE and MVSE_FECHA < :FECHA2 order by MVSE_FECHA desc INTO :BASICO2;
    if (BASICO2 IS NOT NULL) then
        BASICO = (BASICO * (FECHAF - FECHA2 + 1)/:diasper) + (BASICO2 * (:diasper - (FECHAF - FECHA2 + 1))/:diasper);
    END
suspend;
end^


ALTER PROCEDURE IDS_CORTE (
    FECHA DATE,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    OPER INTEGER,
    FECHAREC DATE,
    PREFREC VARCHAR(4),
    NUMREC VARCHAR(8),
    ID INTEGER,
    ITEM INTEGER,
    TIPO INTEGER,
    DOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 RECA_ANULADO = 'N' 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 APCL_ANULADO = 'N' 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 EGRE_ANULADO = 'N' 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 APPR_ANULADO = 'N'  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^


ALTER PROCEDURE IMPR_AJUSTE (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
DECLARE VARIABLE ITEMFOR INTEGER;
declare variable ORDENCOD CHAR(15);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO','DOCUMENTOS','ORDENAR ITEMS AL IMPRIMIR DOCUMENTOS') returning_values (:ORDENCOD);
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';

SELECT COUNT(AJUS_ITEM) from ajustes_detalle WHERE AJUS_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 14 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
if (ORDENCOD = 'NO') then
  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 AND BODE_COD = :boditem INTO :lotevence;
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
if (ORDENCOD = 'CODIGO') then
  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 D.arti_cod, 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 AND BODE_COD = :boditem INTO :lotevence;
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
if (ORDENCOD = 'DESCRIPCION') then
  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 d.ajde_desc, 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 AND BODE_COD = :boditem INTO :lotevence;
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
if (ORDENCOD = 'UNIDAD') then
  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 D.ajus_unidad, D.ajde_desc, 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 AND BODE_COD = :boditem INTO :lotevence;
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
if (ORDENCOD = 'GRUPO') then
  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 A.grup_cod, A.subg_cod, D.ajde_desc, 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 AND BODE_COD = :boditem INTO :lotevence;
      CANT = EXNUE - EXANT;
      TOTAL = CANT * COSTO;
      SUSPEND;
      END
END^


ALTER PROCEDURE IMPR_ANTICLIE (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    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),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    CLIE_COD VARCHAR(15),
    ZONA_COD VARCHAR(60),
    COBR_COD INTEGER,
    COBR_NOM VARCHAR(60))
AS
BEGIN
  SELECT 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_RTCREE, ANCL_RTCREEM, ANCL_DTOFECHA, ANCL_DTOFPORC, ANCL_DTOFMONTO, CLIE_COD, A.COBR_COD, COBR_NOM, C.ZONA_COD
    FROM ANTICIPOS_CLIENTE A, TERCEROS T, CLIENTES C, COBRADORES CO
    WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = C.TERC_NIT AND ANCL_ID = :ID AND A.COBR_COD = CO.COBR_COD
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :RTCREE, :RTCREEM, :DTOFECHA, :DTOPORC, :DTOMONTO, :CLIE_COD, :COBR_COD, :COBR_NOM, :ZONA_COD;
  SUSPEND;
END^


ALTER PROCEDURE IMPR_ANTIPROV (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    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),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15))
AS
BEGIN
  SELECT PREF_PRE, ANPR_NUMERO, ANPR_FECHA, ANPR_CONC, A.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, ANPR_BASE,
    ANPR_IVAPORC, ANPR_IVAMONTO, ANPR_RTFTEPORC, ANPR_RTFTEMONTO, ANPR_RTIVAPORC, ANPR_RTIVAMONTO, ANPR_RTICAPORC, ANPR_RTICAMONTO, ANPR_RTCREE, ANPR_RTCREEM, ANPR_DTOFECHA, ANPR_DTOFPORC, ANPR_DTOFMONTO, ANPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT
    FROM ANTICIPOS_PROVEEDOR A, TERCEROS T, PROVEEDORES P WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND ANPR_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, :RTCREE, :RTCREEM, :DTOFECHA, :DTOPORC, :DTOMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT;
  SUSPEND;
END^


ALTER PROCEDURE IMPR_APLICLIE (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    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(20),
    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^


ALTER PROCEDURE IMPR_APLIPROV (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    ITEM INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    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^


ALTER PROCEDURE IMPR_APORTES (
    IDDOC INTEGER,
    DETALLE CHAR(1))
RETURNS (
    ITEM INTEGER,
    TIPOAP CHAR(1),
    CONPAGO CHAR(1),
    ADMINI VARCHAR(20),
    NOMADMIN VARCHAR(60),
    NROEMPL INTEGER,
    MONTO NUMERIC(18,2),
    INTMORA NUMERIC(18,2),
    FECHA DATE,
    FORMULARIO VARCHAR(10),
    ITEMDET INTEGER,
    NITEMPL VARCHAR(20),
    NOMEMPL VARCHAR(60),
    IBC NUMERIC(18,2),
    COTOBL NUMERIC(18,2),
    VALORNORET NUMERIC(18,2),
    TIPAP CHAR(3))
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
  if (DETALLE = 'S') then
      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
        BEGIN
        SUSPEND;
        END
  else
      BEGIN
      SELECT COUNT(PADE_ITEMDET), SUM(PADE_IBC), SUM(PADE_COTOBL) FROM pago_aportes_detalle WHERE pgap_id = :iddoc AND PGAP_ITEM = :ITEM
        INTO :nroempl, :ibc, :cotobl;
      SUSPEND;
      END
  END
END^


ALTER PROCEDURE IMPR_ARQUEO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    ITEM INTEGER,
    DENOMINACION VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    TOTALIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
BEGIN
SELECT PREF_PRE, ARQC_NUMERO, ARQC_FECHA, ARQC_OBS
    FROM arqueo_caja WHERE ARQC_ID = :ID
    into  :PREF, :NUMERO, :FECHA, :CONCEPTO;
TOTAL = 0;
FOR SELECT ARQD_ITEM, DENO_NOMBRE, ARQD_CANT, DENO_MONTO, ARQD_TOTAL
    FROM arqueo_caja_det D, denominaciones F
    WHERE D.deno_id = F.deno_id AND D.arqc_id = :ID
    ORDER BY ARQD_ITEM
    INTO :ITEM, :denominacion, :cantidad, :monto, :totalit
    DO
    BEGIN
    TOTAL = TOTAL + TOTALIT;
    SUSPEND;
    END
END^


ALTER PROCEDURE IMPR_ARTICULO (
    CANT INTEGER,
    PREF VARCHAR(4),
    LISTA 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),
    PORIVA NUMERIC(9,2),
    PESO NUMERIC(18,4),
    PUM NUMERIC(18,2),
    COSTOP NUMERIC(18,2),
    COSTOPMASIVA NUMERIC(18,2),
    UCOSTO NUMERIC(18,2),
    UCOSTOMASIVA NUMERIC(18,2),
    LISTAP INTEGER,
    NOMLISTA VARCHAR(30),
    PRECIO1 NUMERIC(18,2),
    CANTMIN1 NUMERIC(18,4),
    PRECIO2 NUMERIC(18,2),
    CANTMIN2 NUMERIC(18,4),
    PRECIO3 NUMERIC(18,2),
    CANTMIN3 NUMERIC(18,4),
    PRECIO4 NUMERIC(18,2),
    CANTMIN4 NUMERIC(18,4),
    FECHA DATE)
AS
declare variable I INTEGER;
declare variable ESCALAS CHAR(2);
declare variable PRECIOAUX NUMERIC(18,2);
declare variable CANTMINAUX NUMERIC(18,4);
declare variable CODLN INTEGER;
declare variable AGENCIA INTEGER;
declare variable DIG INTEGER;
declare variable TIVA INTEGER;
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'IMPRIMIR ESCALAS DE PRECIOS EN ROTULOS DE MERCANCIA') returning_values (:ESCALAS);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'DOCUMENTOS', 'LISTA DE PRECIOS FIJOS SIN TENER EN CUENTA LA CANTIDAD') returning_values (:CODLN);
SELECT SUCU_ID FROM PREFIJOS WHERE TIDO_COD = 36 AND PREF_PRE = :PREF INTO :AGENCIA;
if (AGENCIA IS NULL) then
    AGENCIA = 0;
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, TAIV_COD
    from articulo a, precios_articulo p, grupo g, lista_precios l, articulos_reporte r
    where a.arti_cod = p.arti_cod and a.grup_cod = g.grup_cod and l.lipr_cod = p.lipr_cod AND P.lipr_cod = :LISTA and a.arti_cod = r.arti_cod
    into :articulo, :descripcion, :codgrp, :cosubg, :codmarc, :peso, :listap, :precio, :nomgrp, :nomlista, :desccorta, :tiva
    do
    begin
    PORIVA = 0;
    SELECT TAIV_PORC FROM TARIFA_IVA WHERE TAIV_COD = :TIVA INTO :PORIVA;
    EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, CAST('NOW' AS DATE)) returning_values (:COSTOP, :UCOSTO);
    COSTOPMASIVA = COSTOP * ((100 + PORIVA) / 100);
    UCOSTOMASIVA = UCOSTO * ((100 + PORIVA) / 100);
    if (ESCALAS = 'SI') then
        BEGIN
        I = 0;
        FOR SELECT PRAR_FIJO, PRAR_CANTMIN FROM precios_articulo P, lista_precios L
            WHERE ARTI_COD = :articulo AND P.lipr_cod = L.lipr_cod AND ((L.SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
            AND PRAR_CANTMIN <> 0 AND P.LIPR_COD <> :CODLN
            ORDER BY PRAR_CANTMIN INTO :PRECIOAUX, :cantminaux
            DO
            BEGIN
            EXECUTE PROCEDURE redondee(PRECIOAUX, DIG) returning_values (PRECIOAUX);
            I = I + 1;
            if (I = 1) then
                BEGIN
                PRECIO = PRECIOAUX;
                PRECIO1 = PRECIO;
                CANTMIN1 = CANTMINAUX;
                END
            if (I = 2) then
                BEGIN
                PRECIO2 = PRECIOAUX;
                CANTMIN2 = CANTMINAUX;
                END
            if (I = 3) then
                BEGIN
                PRECIO3 = PRECIOAUX;
                CANTMIN3 = CANTMINAUX;
                END
            if (I = 4) then
                BEGIN
                PRECIO4 = PRECIOAUX;
                CANTMIN4 = CANTMINAUX;
                END
            END
        PUM = 0;
        END
    ELSE
        if ((PESO <> 0) AND (PESO IS NOT NULL)) then
            PUM = PRECIO / PESO;
        ELSE
            PUM = 0;

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


ALTER PROCEDURE IMPR_CAMBCOSTO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ARTICULO VARCHAR(15),
    ARTIDES VARCHAR(60),
    UNIDAD VARCHAR(8),
    COSANT NUMERIC(18,4),
    COSNUE NUMERIC(18,4),
    CANT NUMERIC(18,4),
    TOTAL NUMERIC(18,2))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, CACO_NUMERO, CACO_FECHA, CACO_CONCEPTO, CACO_OBS, C.ARTI_COD, ARTI_DES, ARTI_UNIDAD, CACO_NVOCOSTO, CACO_ANTCOSTO
    FROM cambio_costo C, ARTICULO A WHERE A.arti_cod = C.arti_cod AND C.CACO_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :OBS, :articulo, :artides, :unidad, :cosnue, :cosant;
  EXECUTE PROCEDURE saldo_total_inventario (:ARTICULO, :FECHA) returning_values (CANT);
  TOTAL = CANT * (COSNUE - COSANT);
  SUSPEND;
END^


ALTER PROCEDURE IMPR_CAMBDOCU (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE IMPR_CERTRETE (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE IMPR_COMPROBANTE (
    ID INTEGER)
RETURNS (
    TIPO VARCHAR(3),
    FTO CHAR(1),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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(10),
    NUMAPLICA VARCHAR(10),
    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^


ALTER PROCEDURE IMPR_COMPROBANTE_NIIF (
    ID INTEGER)
RETURNS (
    TIPO VARCHAR(3),
    FTO CHAR(1),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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(140),
    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(10),
    NUMAPLICA VARCHAR(10),
    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_NIIF D, CUENTAS_NIIF 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_NIIF 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_NIIF 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^


ALTER PROCEDURE IMPR_CONCILIACIONB (
    ID INTEGER,
    CRUZADOS CHAR(1))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE IMPR_CONSIGNA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODCUENTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    SUCURSAL VARCHAR(60),
    CTACONTA VARCHAR(20),
    CODBANCO INTEGER,
    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),
    DET_RDC VARCHAR(10),
    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;
  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
        det_rdc = '';
        /* BUSQUE EL RECIBO POR SI FUE GRABADO CON LA CONSIGNACION */
        SELECT PREF_PRE || RECA_NUMERO FROM RECIBOS_CAJA R, recibos_caja_pago P
            WHERE R.reca_id = P.reca_id AND R.CONS_ID = :ID AND P.fopa_id = :IDFORMA AND P.rcpa_banco = :det_codbco
            AND P.rcpa_cuenta = :det_cuenta AND P.rcpa_numero = :det_numero AND P.rcpa_monto = :det_monto INTO :det_rdc;

        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^


ALTER PROCEDURE IMPR_CONSIGNATAR (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NOMCAJA VARCHAR(60),
    CODCUENTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    SUCURSAL VARCHAR(60),
    CTACONTA VARCHAR(20),
    CODBANCO VARCHAR(2),
    NOMBANCO VARCHAR(60),
    TOTMONTO NUMERIC(18,2),
    TOTRTFTE NUMERIC(18,2),
    TOTRTIVA NUMERIC(18,2),
    TOTCOMIS NUMERIC(18,2),
    OBSERVAC BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    FORPAGO VARCHAR(27),
    DET_CODTAR VARCHAR(2),
    DET_COMTAR VARCHAR(20),
    DET_NROTAR VARCHAR(20),
    DET_BASE NUMERIC(18,2),
    DET_IVA NUMERIC(18,2),
    DET_COMIPOR NUMERIC(9,2),
    DET_COMIMON NUMERIC(18,2),
    DET_RTFTEPOR NUMERIC(9,2),
    DET_RTFTEMON NUMERIC(9,2),
    DET_RTIVAPOR NUMERIC(9,2),
    DET_RTIVAMON NUMERIC(9,2))
AS
declare variable IDCAJA INTEGER;
declare variable CTABCO INTEGER;
BEGIN
  SELECT PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, CAJA_ID, CUBA_COD,
    COTJ_MONTO, COTJ_RTFTE, COTJ_RTIVA, COTJ_COMISION, COTJ_OBS
    FROM CONSIGNA_TARJETAS WHERE COTJ_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CONCEPTO, :IDCAJA, :CTABCO,
    :totmonto, :totrtfte,  :totrtiva, :totcomis, :observac;
  SELECT CAJA_NOMBRE FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO :nomcaja;
  SELECT CUBA_CODCTA, CUBA_NUMERO, CUBA_TITULAR, CUBA_SUCURSAL, CUBA_CTACONTA, CB.BANC_COD, BANC_NOMBRE
    FROM CUENTAS_BANCO CB, BANCOS B WHERE CUBA_COD = :CTABCO AND CB.BANC_COD = B.BANC_COD
    INTO :CODCUENTA, :NROCUENTA, TITULAR, SUCURSAL, CTACONTA, CODBANCO, NOMBANCO;
  FOR SELECT CTJD_ITEM, FOPA_NOM, TARJ_COD, CTJD_COMPROB, CTJD_NROTJ, CTJD_BASE, CTJD_IVA, CTJD_COMIPORC, CTJD_COMIMONTO, CTJD_RTFTEPORC, CTJD_RTFTEMONTO, CTJD_RTIVAPOC, CTJD_RTIVAMONTO
    FROM consigna_TARJETAS_det D, FORMAS_PAGO F
    WHERE D.FOPA_ID = F.FOPA_ID AND D.COTJ_ID = :ID ORDER BY CTJD_ITEM
    INTO :ITEM, :FORPAGO, :DET_CODTAR, :DET_COMTAR, :DET_NROTAR, :DET_BASE, :det_iva, :det_comipor, :det_comimon, :det_rtftepor, :det_rtftemon, :det_rtivapor, :det_rtivamon
    DO
      SUSPEND;
END^


ALTER PROCEDURE IMPR_CONTABILIZACION (
    TIPODOC INTEGER,
    IDDOC INTEGER,
    CON CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(140),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    CONCEPTO VARCHAR(60),
    REF VARCHAR(10),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,4),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
declare variable IDC INTEGER;
BEGIN
SELECT MAX(ENCO_CONSEC) FROM COMPROBANTE_ENCABEZADO
    WHERE ENCO_TIPOREF = :TIPODOC AND ENCO_IDREF = :IDDOC INTO :IDC;
if (CON = 'C') then
  BEGIN
  FOR SELECT D.CUEN_COD, D.TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CUEN_NOM, TERC_NOM
    FROM COMPROBANTE_DETALLE D, TERCEROS T, CUENTAS C WHERE ENCO_CONSEC = :IDC AND D.cuen_cod = C.cuen_cod AND D.terc_nit = T.terc_nit
    order BY CODE_ITEM
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :CONCEPTO, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :nomcuenta, :nomterc
    DO
        BEGIN
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        SUSPEND;
        END
  END
ELSE
  BEGIN
  FOR SELECT D.CUEN_COD, D.TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CUEN_NOM, TERC_NOM
    FROM comprobante_detalle_niif D, TERCEROS T, cuentas_niif C WHERE ENCO_CONSEC = :IDC AND D.cuen_cod = C.cuen_cod AND D.terc_nit = T.terc_nit
    order BY CODE_ITEM
    INTO :CUENTA, :NIT, :PROY, :CENTRO, :CONCEPTO, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :nomcuenta, :nomterc
    DO
        BEGIN
        if (DEBITO IS NULL) then
            DEBITO = 0;
        if (CREDITO IS NULL) then
            CREDITO = 0;
        SUSPEND;
        END
  END
END^


ALTER PROCEDURE IMPR_COTIPROV (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
DECLARE VARIABLE ITEMFOR INTEGER;
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;

SELECT COUNT(CPRD_ITEM) from cotizaciones_proveedor_det WHERE COPR_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 25 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT D.ARTI_COD, 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^


ALTER PROCEDURE IMPR_COTIZACION (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER,
    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),
    SUMA4 NUMERIC(18,2),
    SUMA5 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    ORDENCLI VARCHAR(20),
    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(15);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
DECLARE VARIABLE ITEMFOR INTEGER;
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, COTI_ORDENC,
    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, :ordencli,
    :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;
SELECT COUNT(CTDE_ITEM) from cotizaciones_detalle WHERE COTI_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 35 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
SUMA4 = 0;
SUMA5 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
IVA4 = 0;
IVA5 = 0;
ITEM = 0;
PESOTOT = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','COTIZACIONES','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, CTDE_TIVA, 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 ((TARIFA = 0) AND (ivaporc = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
/*        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 = 'DESCRIPCION') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, CTDE_TIVA, 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_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 ((TARIFA = 0) AND (ivaporc = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
/*        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;*/
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, CTDE_TIVA, 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 ((TARIFA = 0) AND (ivaporc = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
/*        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO; */
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, CTDE_TIVA, 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 ((TARIFA = 0) AND (ivaporc = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
/*        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^


ALTER PROCEDURE IMPR_CRUCES (
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    IDDOC INTEGER,
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    NUMPRV VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    RTCREEDOC 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_RCREE, RCCR_DTOF, RCCR_NUMPROV
        FROM recibos_caja_crucec WHERE RECA_ID = :id
        INTO :itemdoc, :tipodoc, :iddoc, :prefdoc, :numdoc, :abonodoc, :rtftedoc, :rtivadoc, :rticadoc, :rtcreedoc, :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 + rtcreedoc + 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_RCREE, EGCC_DTOF, EGCC_SUCURSAL
        FROM egresos_crucec WHERE EGRE_ID = :id
        INTO :itemdoc, :tipodoc, :iddoc, :prefdoc, :numdoc, :abonodoc, :rtftedoc, :rtivadoc, :rticadoc, :rtcreedoc, :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 + rtcreedoc + ABONODOC + DSCTODOC;
        SUSPEND;
        END
    END
END^


ALTER PROCEDURE IMPR_DESENSAMBLE (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    OBS BLOB SUB_TYPE 0 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),
    TOTAL NUMERIC(18,2),
    SERIALES VARCHAR(4096),
    LOTE VARCHAR(15))
AS
declare variable IMPTOS CHAR(1);
BEGIN
  /*  */
  SELECT 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
    FROM DESENSAMBLES E, BODEGA B WHERE E.BODE_COD = B.BODE_COD AND E.DESE_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :PRODCODBAR, PRODDES, PRODCANT, PRODUNIDAD, PRODLOTE, :OBS;
  SELECT SUM(DEDE_TOTAL) FROM desensambles_detalle WHERE DESE_ID = :ID INTO :TOTENSAMBLE;
  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
    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
    DO
      BEGIN
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAMONTO - CONSUMO;
      EXECUTE PROCEDURE seriales_item_documento(16, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
END^


ALTER PROCEDURE IMPR_DEVOLPROV (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    NUMPROV VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREE NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    LOTE VARCHAR(15),
    SERIALES VARCHAR(4096),
    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(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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
declare variable IDFACT INTEGER;
DECLARE VARIABLE ITEMFOR INTEGER;
BEGIN
  SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.BODE_COD, BODE_NOM, D.TERC_NIT, TERC_NOM, DVCO_FACTURA, DVCO_IMPTOS,
    DVCO_DTOPORC, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
    DVCO_EXTRA, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO, DVCO_RTCREE, DVCO_RTCREEM,
    DVCO_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, DVCO_OBS, DVCO_FACTID
    FROM DEVOLUCIONES_COMPRAS D, BODEGA B, TERCEROS T
    WHERE D.BODE_COD = B.BODE_COD AND D.TERC_NIT = T.TERC_NIT AND D.DVCO_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :FACTURA, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO,
    :EXTRA, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :RTECREE, :RTECREEM,
    :TOTALFAC, :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :IDFACT;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
  SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :idfact INTO :numprov;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - RTECREEM;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  ITEM = 0;

SELECT COUNT(DVCD_ITEM) from devoluciones_compras_det WHERE DVCO_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 24 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT D.ARTI_COD, DVCD_CODBAR, SUBSTRING(DVCD_DESC FROM 1 FOR 60), DVCD_CANT, DVCD_UNIDAD, BODE_COD, DVCD_PRUNIT,
    DVCD_DTOPORC, DVCD_DTOMONTO, DVCD_IVAPORC, DVCD_IVAMONTO, DVCD_CONSUMO, DVCD_TOTAL, DVCD_OBS, DVCD_LOTE,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD
    FROM DEVOLUCIONES_COMPRAS_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.DVCO_ID = :ID
    ORDER BY DVCD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA
    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;
      EXECUTE PROCEDURE seriales_item_documento(24, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT D.ARTI_COD, DVCD_CODBAR, SUBSTRING(DVCD_DESC FROM 1 FOR 60), DVCD_CANT, DVCD_UNIDAD, BODE_COD, DVCD_PRUNIT,
    DVCD_DTOPORC, DVCD_DTOMONTO, DVCD_IVAPORC, DVCD_IVAMONTO, DVCD_CONSUMO, DVCD_TOTAL, DVCD_OBS, DVCD_LOTE,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD
    FROM DEVOLUCIONES_COMPRAS_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.DVCO_ID = :ID
    ORDER BY D.bode_cod, DVCD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM, :lote,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA
    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;
      EXECUTE PROCEDURE seriales_item_documento(24, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
  END
END^


ALTER PROCEDURE IMPR_DEVOLUCION (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    REMISION VARCHAR(12),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    DEC2799 NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREEP NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    SERIALES VARCHAR(4096),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    INALC NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    SUMA4 NUMERIC(18,2),
    SUMA5 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    TOTINALC NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    SUMAINALC NUMERIC(18,2),
    VRFLETE NUMERIC(18,2),
    VEHICULO VARCHAR(15),
    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(15);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
DECLARE VARIABLE ITEMFOR INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC, DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_DEC2799,
    DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_RTCREE, DEVT_RTCREEM, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO, DEVT_VRFLETE, DEVT_VEHICULO
    FROM DEVOLUCIONES_VENTAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :dec2799,
    :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :rtecreep, :rtecreem, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO, :vrflete, :vehiculo;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO + dec2799;
if (fautorcree < FECHA) then
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
else
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - rtecreem;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
SELECT COUNT(DVDE_ITEM) from devoluciones_ventas_detalle WHERE DEVT_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 33 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
    
SUMAINALC = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
SUMA4 = 0;
SUMA5 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
IVA4 = 0;
IVA5 = 0;
TOTCONSUMO = 0;
TOTINALC = 0;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, dvde_tiva, DVDE_OBS, DVDE_FACTOR, DVDE_INACM
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR, :INALC
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO+INALC) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        TOTINALC = TOTINALC + INALC;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if ((TARIFA = 0) AND (IVAPORC = 0)) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA3 = IVA3 + IVAITMONTO;
                END
            if (TARIFA = 4) then
                BEGIN
                SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA4 = IVA4 + IVAITMONTO;
                END
            if (TARIFA = 5) then
                BEGIN
                SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA5 = IVA5 + IVAITMONTO;
                END
            if (INALC <> 0) then
                SUMAINALC = SUMAINALC + (TOTAL - IVAITMONTO - CONSUMO - INALC);
            SUMAGR = 0;
            if (IVA1 <> 0) then
                SUMAGR = SUMAGR + SUMA1;
            if (IVA2 <> 0) then
                SUMAGR = SUMAGR + SUMA2;
            if (IVA3 <> 0) then
                SUMAGR = SUMAGR + SUMA3;
            if (IVA4 <> 0) then
                SUMAGR = SUMAGR + SUMA4;
            if (IVA5 <> 0) then
                SUMAGR = SUMAGR + SUMA5;
            END
        if (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
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        EXECUTE PROCEDURE seriales_item_documento(33, :ID, :ITEM) returning_values (:SERIALES);
        SUSPEND;
        END
    END
ELSE if (ORDENCOD = 'DESCRIPCION') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, dvde_tiva, DVDE_OBS, DVDE_FACTOR, DVDE_INACM
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_DESC
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR, :INALC
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO+INALC) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        TOTINALC = TOTINALC + INALC;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if ((TARIFA = 0) AND (IVAPORC = 0)) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA3 = IVA3 + IVAITMONTO;
                END
            if (TARIFA = 4) then
                BEGIN
                SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA4 = IVA4 + IVAITMONTO;
                END
            if (TARIFA = 5) then
                BEGIN
                SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA5 = IVA5 + IVAITMONTO;
                END
            if (INALC <> 0) then
                SUMAINALC = SUMAINALC + (TOTAL - IVAITMONTO - CONSUMO - INALC);
            SUMAGR = 0;
            if (IVA1 <> 0) then
                SUMAGR = SUMAGR + SUMA1;
            if (IVA2 <> 0) then
                SUMAGR = SUMAGR + SUMA2;
            if (IVA3 <> 0) then
                SUMAGR = SUMAGR + SUMA3;
            if (IVA4 <> 0) then
                SUMAGR = SUMAGR + SUMA4;
            if (IVA5 <> 0) then
                SUMAGR = SUMAGR + SUMA5;
            END
        if (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
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        EXECUTE PROCEDURE seriales_item_documento(33, :ID, :ITEM) returning_values (:SERIALES);
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, dvde_tiva, DVDE_OBS, DVDE_FACTOR, DVDE_INACM
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY D.dvde_unidad, D.dvde_desc
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR, :INALC
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO+INALC) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        TOTINALC = TOTINALC + INALC;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if ((TARIFA = 0) AND (IVAPORC = 0)) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA3 = IVA3 + IVAITMONTO;
                END
            if (TARIFA = 4) then
                BEGIN
                SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA4 = IVA4 + IVAITMONTO;
                END
            if (TARIFA = 5) then
                BEGIN
                SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA5 = IVA5 + IVAITMONTO;
                END
            if (INALC <> 0) then
                SUMAINALC = SUMAINALC + (TOTAL - IVAITMONTO - CONSUMO - INALC);
            SUMAGR = 0;
            if (IVA1 <> 0) then
                SUMAGR = SUMAGR + SUMA1;
            if (IVA2 <> 0) then
                SUMAGR = SUMAGR + SUMA2;
            if (IVA3 <> 0) then
                SUMAGR = SUMAGR + SUMA3;
            if (IVA4 <> 0) then
                SUMAGR = SUMAGR + SUMA4;
            if (IVA5 <> 0) then
                SUMAGR = SUMAGR + SUMA5;
            END
        if (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
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        EXECUTE PROCEDURE seriales_item_documento(33, :ID, :ITEM) returning_values (:SERIALES);
        SUSPEND;
        END
    END
  ELSE
      if (ORDENCOD = 'STAND') then
        BEGIN
        FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
            GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, dvde_tiva, DVDE_OBS, DVDE_FACTOR, DVDE_INACM, S.stand_cod
            FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A, stands S
            WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID AND S.arti_cod = D.arti_cod AND S.stand_bodega = D.bode_cod
            ORDER BY D.dvde_unidad, D.dvde_desc
            INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR, :INALC, :STAND
            DO
            BEGIN
            if (ARTICULO = CODBAR) then
                SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
            ITEM = ITEM + 1;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
            PRNETO = PRUNIT - DTOITMONTO;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO / 1000 * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO+INALC) / CANT);
                else
                    prnetosiniva = PRUNIT - DTOITMONTO;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTINALC = TOTINALC + INALC;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if ((TARIFA = 0) AND (IVAPORC = 0)) then
                    SUMAEX = SUMAEX + TOTAL;
                if (TARIFA = 1) then
                    BEGIN
                    SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                    IVA1 = IVA1 + IVAITMONTO;
                    END
                if (TARIFA = 2) then
                    BEGIN
                    SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                    IVA2 = IVA2 + IVAITMONTO;
                    END
                if (TARIFA = 3) then
                    BEGIN
                    SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                    IVA3 = IVA3 + IVAITMONTO;
                    END
                if (TARIFA = 4) then
                    BEGIN
                    SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                    IVA4 = IVA4 + IVAITMONTO;
                    END
                if (TARIFA = 5) then
                    BEGIN
                    SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                    IVA5 = IVA5 + IVAITMONTO;
                    END
                if (INALC <> 0) then
                    SUMAINALC = SUMAINALC + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                SUMAGR = 0;
                if (IVA1 <> 0) then
                    SUMAGR = SUMAGR + SUMA1;
                if (IVA2 <> 0) then
                    SUMAGR = SUMAGR + SUMA2;
                if (IVA3 <> 0) then
                    SUMAGR = SUMAGR + SUMA3;
                if (IVA4 <> 0) then
                    SUMAGR = SUMAGR + SUMA4;
                if (IVA5 <> 0) then
                    SUMAGR = SUMAGR + SUMA5;
                END
            if (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
            EXECUTE PROCEDURE seriales_item_documento(33, :ID, :ITEM) returning_values (:SERIALES);
            SUSPEND;
            END
        END
      ELSE
        BEGIN
        FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
            GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, dvde_tiva, DVDE_OBS, DVDE_FACTOR, DVDE_INACM
            FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
            WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
            ORDER BY DVDE_ITEM
            INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR, :INALC
            DO
            BEGIN
            if (ARTICULO = CODBAR) then
                SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
            ITEM = ITEM + 1;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
            PRNETO = PRUNIT - DTOITMONTO;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = PESO / 1000 * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO+INALC) / CANT);
                else
                    prnetosiniva = PRUNIT - DTOITMONTO;
            ELSE
                prnetosiniva = PRUNIT - DTOITMONTO;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTINALC = TOTINALC + INALC;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if ((TARIFA = 0) AND (IVAPORC = 0)) then
                    SUMAEX = SUMAEX + TOTAL;
                if (TARIFA = 1) then
                    BEGIN
                    SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                    IVA1 = IVA1 + IVAITMONTO;
                    END
                if (TARIFA = 2) then
                    BEGIN
                    SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                    IVA2 = IVA2 + IVAITMONTO;
                    END
                if (TARIFA = 3) then
                    BEGIN
                    SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                    IVA3 = IVA3 + IVAITMONTO;
                    END
                if (TARIFA = 4) then
                    BEGIN
                    SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                    IVA4 = IVA4 + IVAITMONTO;
                    END
                if (TARIFA = 5) then
                    BEGIN
                    SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                    IVA5 = IVA5 + IVAITMONTO;
                    END
                if (INALC <> 0) then
                    SUMAINALC = SUMAINALC + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                SUMAGR = 0;
                if (IVA1 <> 0) then
                    SUMAGR = SUMAGR + SUMA1;
                if (IVA2 <> 0) then
                    SUMAGR = SUMAGR + SUMA2;
                if (IVA3 <> 0) then
                    SUMAGR = SUMAGR + SUMA3;
                if (IVA4 <> 0) then
                    SUMAGR = SUMAGR + SUMA4;
                if (IVA5 <> 0) then
                    SUMAGR = SUMAGR + SUMA5;
                END
            if (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
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            EXECUTE PROCEDURE seriales_item_documento(33, :ID, :ITEM) returning_values (:SERIALES);
            SUSPEND;
            END
    END
END^


ALTER PROCEDURE IMPR_DIFERENCIAS_CONTEO (
    FECHA DATE,
    BODEGA VARCHAR(2),
    STAND VARCHAR(20))
RETURNS (
    ID1 INTEGER,
    ID2 INTEGER,
    PREF1 VARCHAR(4),
    NUM1 VARCHAR(8),
    PREF2 VARCHAR(4),
    NUM2 VARCHAR(8),
    CONC1 VARCHAR(60),
    CONC2 VARCHAR(60),
    NOMBOD VARCHAR(60),
    ITEM INTEGER,
    ARTICULO VARCHAR(20),
    DESCRIP VARCHAR(60),
    LOTE VARCHAR(20),
    CANT1 NUMERIC(18,4),
    UNIDAD1 VARCHAR(8),
    CANT2 NUMERIC(18,4),
    UNIDAD2 VARCHAR(8),
    DIF NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    OBS1 BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    OBS2 BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
declare variable EXIST CHAR(1);
begin
SELECT AJUS_ID, PREF_PRE, AJUS_NUMERO, AJUS_CONC, AJUS_OBS FROM AJUSTES WHERE BODE_COD = :bodega AND AJUS_STAND = :STAND AND AJUS_FECHA = :FECHA AND AJUS_ANULADO = 'N' AND AJUS_PASADA = 0
    INTO :ID1, :PREF1, :NUM1, :CONC1, :OBS1;
SELECT AJUS_ID, PREF_PRE, AJUS_NUMERO, AJUS_CONC, AJUS_OBS FROM AJUSTES WHERE BODE_COD = :bodega AND AJUS_STAND = :STAND AND AJUS_FECHA = :FECHA AND AJUS_ANULADO = 'N' AND AJUS_PASADA = 1
    INTO :ID2, :PREF2, NUM2, :CONC2, :OBS2;
SELECT BODE_NOM FROM BODEGA WHERE BODE_COD = :bodega INTO :nombod;
FOR SELECT AJUS_ITEM, D.ARTI_COD, AJUS_EXNUE * AJUS_FACTOR, A.arti_exist, D.ajus_lote, D.ajus_unidad
    FROM ajustes_detalle D, ARTICULO A
    WHERE D.arti_cod = A.arti_cod AND AJUS_ID = :ID1
    ORDER BY D.ARTI_COD, d.ajus_lote
    INTO :ITEM , :ARTICULO, :CANT1, :exist, :lote, :unidad1
    DO
    BEGIN
    SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :descrip;
    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
    CANT2 = 0;
    unidad2 = '';
    if (exist = 'L') then
        SELECT SUM(AJUS_EXNUE*AJUS_FACTOR), MAX(AJUS_UNIDAD) FROM ajustes_detalle WHERE AJUS_ID = :ID2 AND ARTI_COD = :articulo and AJUS_LOTE = :LOTE
            INTO :CANT2, :UNIDAD2;
    else
        SELECT SUM(AJUS_EXNUE*AJUS_FACTOR), MAX(AJUS_UNIDAD) FROM ajustes_detalle WHERE AJUS_ID = :ID2 AND ARTI_COD = :articulo
            INTO :CANT2, :unidad2;
    if (CANT2 IS NULL) then
        CANT2 = 0;
    if (CANT1 <> CANT2) then
        BEGIN
        DIF = CANT1 - CANT2;
        SUSPEND;
        END
    END
/* AGREGUE LOS QUE SOLO ESTAN EN LA SEGUNDA PASADA */
FOR SELECT AJUS_ITEM, D.ARTI_COD, AJUS_EXNUE * AJUS_FACTOR, A.arti_exist, D.ajus_lote, D.ajus_unidad
    FROM ajustes_detalle D, ARTICULO A
    WHERE D.arti_cod = A.arti_cod AND AJUS_ID = :ID2
    ORDER BY AJUS_ITEM
    INTO :ITEM , :ARTICULO, :CANT2, :exist, :lote, :unidad2
    DO
    BEGIN
    if (exist = 'L') then
        begin
        if (NOT EXISTS (SELECT AJUS_EXNUE FROM ajustes_detalle WHERE AJUS_ID = :ID1 AND ARTI_COD = :articulo and AJUS_LOTE = :LOTE)) then
            BEGIN
            SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :descrip;
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
            CANT1 = 0;
            unidad1= '';
            DIF = CANT2;
            SUSPEND;
            END
        end
    else
        begin
        if (NOT EXISTS (SELECT AJUS_EXNUE FROM ajustes_detalle WHERE AJUS_ID = :ID1 AND ARTI_COD = :articulo)) then
            BEGIN
            SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :descrip;
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
            CANT1 = 0;
            unidad1= '';
            DIF = CANT2;
            SUSPEND;
            END
        end
    END
end^


ALTER PROCEDURE IMPR_EGRESO (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    CONCEPTO VARCHAR(70),
    MONTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RTCREE NUMERIC(18,2),
    DSCTO NUMERIC(18,2),
    EXCEDENTE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    FECDOC DATE,
    NUMDOC VARCHAR(8),
    NUMPRV VARCHAR(15),
    CONCDOC VARCHAR(60),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    RTCREEDOC 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_RTCREE, EGRE_DTOF, EGRE_EXCEDENTE, 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, :rtcree, :DSCTO, :excedente, :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_RCREE, 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, :RTCREEDOC, :DSCTODOC
        DO
            BEGIN
            SELECT M.mvpr_fecha, M.mvpr_conc FROM movimiento_proveedor M WHERE M.mvpr_tiporef = :TIPO AND M.mvpr_idref = :iddoc INTO :fecdoc, :concdoc;
            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;
    RTCREEDOC = 0;
    ABONODOC = 0;
    DSCTODOC = 0;
    numprv = '';
    SUSPEND;
    END
END^


ALTER PROCEDURE IMPR_EMPAQUE (
    TIPO INTEGER,
    IDFAC INTEGER,
    CANT INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHAENT DATE,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(60),
    TELEFONO VARCHAR(40),
    CELULAR VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMBALAJE SMALLINT,
    NOMEMBALAJE VARCHAR(60),
    TOTALEMB SMALLINT)
AS
declare variable I INTEGER;
begin
if (TIPO = 31) then
    BEGIN
    SELECT PREF_PRE, FACT_NUMERO, FACT_ENTREGA, F.TERC_NIT, F.fact_sucursal, FACT_NOMCLIENTE, S.clsu_dir, S.clsu_ciudad, S.clsu_tel, T.terc_contacto, T.terc_cel
        FROM FACTURAS F, TERCEROS T, cliente_sucursales S
        WHERE FACT_ID = :IDFAC AND F.terc_nit = S.terc_nit AND F.fact_sucursal = S.clcu_cod AND F.terc_nit = T.terc_nit
        INTO :prefijo, :numero, :fechaent, :cliente, :sucursal, :nombre, :direccion, :ciudad, :telefono, :contacto, :celular;
    EMBALAJE = 0;
    SELECT sum(FAEM_CANT) FROM factura_embalaje WHERE FACT_ID = :idfac INTO :totalemb;
    FOR SELECT TIEM_NOMBRE, FAEM_CANT FROM factura_embalaje FE, tipo_embalaje TE
        WHERE FE.tiem_cod = TE.tiem_cod AND FACT_ID = :IDFAC
        INTO :nomembalaje, :cant
        DO
        BEGIN
        I = 0;
        WHILE (i < :cant) do
            begin
            i = i + 1;
            EMBALAJE = embalaje + 1;
            suspend;
            end
        END
    END
if (TIPO = 34) then
    BEGIN
    SELECT PREF_PRE, PEDI_NUMERO, PEDI_ENTREGA, P.TERC_NIT, P.pedi_sucursal, PEDI_NOMTERC, S.clsu_dir, S.clsu_ciudad, S.clsu_tel, T.terc_contacto, T.terc_cel
        FROM PEDIDOS P, TERCEROS T, cliente_sucursales S
        WHERE PEDI_ID = :IDFAC AND P.terc_nit = S.terc_nit AND P.pedi_sucursal = S.clcu_cod AND P.terc_nit = T.terc_nit
        INTO :prefijo, :numero, :fechaent, :cliente, :sucursal, :nombre, :direccion, :ciudad, :telefono, :contacto, :celular;
    EMBALAJE = 0;
    I = 0;
    totalemb = CANT;
    WHILE (i < :cant) do
        begin
        i = i + 1;
        EMBALAJE = embalaje + 1;
        suspend;
        end
    END
end^


ALTER PROCEDURE IMPR_ENSAMBLE (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    PRODARTI VARCHAR(15),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    TURNO VARCHAR(60),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    CODRETAL VARCHAR(20),
    DESCRETAL VARCHAR(60),
    CANTRETAL NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    TOTENSAMBLE NUMERIC(18,2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PESO NUMERIC(18,4),
    TOTAL NUMERIC(18,2),
    SERIALES VARCHAR(4096),
    LOTE VARCHAR(15))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ARTI_COD,
    ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_PESO, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_TURNO, ENSA_OPER, ENSA_MAQUINA
    FROM ENSAMBLES E, BODEGA B WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :PRODCODBAR, :PRODARTI,
    PRODDES, PRODCANT, PRODUNIDAD, PRODLOTE, :OBS, :PESOTOTAL, :CODRETAL, :CANTRETAL, :turno, :operario,  :MAQUINA;
  SELECT SUM(ESDE_TOTAL) FROM ensambles_detalle WHERE ENSA_ID = :ID INTO :TOTENSAMBLE;
  SELECT ENSA_NOMBRE FROM ENSAMBLE_TURNO WHERE ENSA_TURNO = :turno INTO :turno;
  SELECT ENOP_NOMBRE FROM ENSAMBLE_OPERARIO WHERE ENOP_ID = :OPERARIO INTO :OPERARIO;
  SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :MAQUINA INTO :MAQUINA;
  SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :codretal INTO :descretal;
  FOR SELECT ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_PESO
    FROM ensambles_detalle D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
    ORDER BY ESDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      /*TOTAL = TOTAL - IVAMONTO - CONSUMO;*/
      EXECUTE PROCEDURE seriales_item_documento(15, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
END^


ALTER PROCEDURE IMPR_ENTRADA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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,
    SERIALES VARCHAR(4096),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
DECLARE VARIABLE ITEMFOR INTEGER;
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);
declare variable ORDENCOD CHAR(15);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO','DOCUMENTOS','ORDENAR ITEMS AL IMPRIMIR DOCUMENTOS') returning_values (:ORDENCOD);
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;
SELECT COUNT(ENDE_ITEM) from entradas_detalle WHERE ENTR_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 11 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
if (ORDENCOD = 'NO') then
  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 (:PRECIO is null) then
        PRECIO = 0;
      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;
      EXECUTE PROCEDURE seriales_item_documento(11, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'CODIGO') then
  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 D.ARTI_COD, 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 (:PRECIO is null) then
        PRECIO = 0;
      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;
      EXECUTE PROCEDURE seriales_item_documento(11, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'DESCRIPCION') then
  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_DESC, 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 (:PRECIO is null) then
        PRECIO = 0;
      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;
      EXECUTE PROCEDURE seriales_item_documento(11, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'UNIDAD') then
  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_UNIDAD, ENDE_DESC, 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 (:PRECIO is null) then
        PRECIO = 0;
      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;
      EXECUTE PROCEDURE seriales_item_documento(11, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'GRUPO') then
  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 A.grup_cod, A.subg_cod, ENDE_DESC
    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 (:PRECIO is null) then
        PRECIO = 0;
      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;
      EXECUTE PROCEDURE seriales_item_documento(11, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
END^


ALTER PROCEDURE IMPR_FACTCOMP (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SIMPLIFICADO VARCHAR(15),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NUMPROV VARCHAR(15),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREE NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    STAND VARCHAR(20),
    SERIALES VARCHAR(4096),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    DTOIT1 NUMERIC(18,2),
    DTOIT2 NUMERIC(18,2),
    DTOIT3 NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    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),
    DTOITEM1 NUMERIC(18,2),
    DTOITEM2 NUMERIC(18,2),
    DTOITEM3 NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable SIMPLIFICA CHAR(1);
declare variable orden char(2);
DECLARE VARIABLE ITEMFOR INTEGER;
BEGIN
  SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, TERC_NOM, FACO_NUMPROV, FACO_COTIZACI, FACO_ORDEN, FACO_REMISION, FACO_IMPTOS,
    FACO_DTOPORC, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO,
    FACO_RTICAPOR, FACO_RTICAMONTO, FACO_RTCREE, FACO_RTCREEM, FACO_EXTRA, FACO_DTOFPOR, FACO_DTOFMONTO, FACO_DTOFFECHA,
    FACO_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACO_OBS, FACO_SIMPLIFICADO, FACO_DTO1IT, FACO_DTO2IT, FACO_DTO3IT
    FROM FACTURAS_COMPRA F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.FACO_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :NUMPROV, :COTIZACION, :PEDIDO, :REMISION, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO,
    :RTEICAPORC, :RTEICAMONTO, :RTECREE, :RTECREEM, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :SIMPLIFICA, :dtoitem1, :dtoitem2, :dtoitem3;
    
    if (SIMPLIFICA = 'N') then
         SIMPLIFICADO = 'COMUN';
    ELSE
        SIMPLIFICADO = 'SIMPLIFICADO';

  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;

  DIASVENCE = VENCE - FECHA;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - RTECREEM;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;

SELECT COUNT(FCDE_ITEM) from facturas_compras_detalle WHERE FACO_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 21 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
item = 0;
if (orden = 'NO') then
  BEGIN
  FOR SELECT D.ARTI_COD, FCDE_CODBAR, SUBSTRING(FCDE_DESC FROM 1 FOR 60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL, FCDE_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA,
    FCDE_DTO1, FCDE_DTO2, FCDE_DTO3, FCDE_DTOM1, FCDE_DTOM2, FCDE_DTOM3
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY FCDE_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM,
    :dtoit1, :dtoit2, :dtoit3, :dtoit1m, :dtoit2m, :dtoit3m
    DO
      BEGIN
      if (DTOIT1 IS NULL) then
        DTOIT1 = 0;
      if (DTOIT2 IS NULL) then
        DTOIT2 = 0;
      if (DTOIT3 IS NULL) then
        DTOIT3 = 0;
      if (DTOIT1M IS NULL) then
        DTOIT1M = 0;
      if (DTOIT2M IS NULL) then
        DTOIT2M = 0;
      if (DTOIT3M IS NULL) then
        DTOIT3M = 0;
      ITEM = ITEM +1;
      PRNETO = PRUNIT - DTOITMONTO - DTOIT1M - DTOIT2M - DTOIT3M - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO - CONSUMO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO - CONSUMO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO - CONSUMO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      EXECUTE PROCEDURE seriales_item_documento(21, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT D.ARTI_COD, FCDE_CODBAR, SUBSTRING(FCDE_DESC FROM 1 FOR 60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL, FCDE_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA,
    FCDE_DTO1, FCDE_DTO2, FCDE_DTO3, FCDE_DTOM1, FCDE_DTOM2, FCDE_DTOM3
    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 :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM,
    :dtoit1, :dtoit2, :dtoit3, :dtoit1m, :dtoit2m, :dtoit3m
    DO
      BEGIN
      if (DTOIT1 IS NULL) then
        DTOIT1 = 0;
      if (DTOIT2 IS NULL) then
        DTOIT2 = 0;
      if (DTOIT3 IS NULL) then
        DTOIT3 = 0;
      if (DTOIT1M IS NULL) then
        DTOIT1M = 0;
      if (DTOIT2M IS NULL) then
        DTOIT2M = 0;
      if (DTOIT3M IS NULL) then
        DTOIT3M = 0;
      ITEM = ITEM +1;
      PRNETO = PRUNIT - DTOITMONTO - DTOIT1M - DTOIT2M - DTOIT3M - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO - CONSUMO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO - CONSUMO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO - CONSUMO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      EXECUTE PROCEDURE seriales_item_documento(21, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
  END
END^


ALTER PROCEDURE IMPR_FACTPRO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    IMPORTA VARCHAR(12),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    MONEDA VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SIMPLIFICADO VARCHAR(15),
    CODBODEGA VARCHAR(2),
    NOMBODEGA 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),
    ARANCEL NUMERIC(18,2),
    GASTOSIT NUMERIC(18,2),
    GASTOS NUMERIC(18,2),
    FOB 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),
    ARTIDESCORTA VARCHAR(30),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    UNIDAD VARCHAR(8),
    PRUNITMON NUMERIC(18,2),
    ARANCMONTO NUMERIC(18,2),
    TRM DOUBLE PRECISION,
    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(30),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CODPROY VARCHAR(4),
    CODCENTRO VARCHAR(4),
    NOMPROY VARCHAR(60),
    NOMCENTRO VARCHAR(60),
    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),
    TOTGASTOS NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTALMONEDA NUMERIC(18,2),
    DESCADIC BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
declare variable imptos char(1);
declare variable tarifa integer;
declare variable simplifica char(1);
declare variable orden char(2);
BEGIN
SELECT PREF_PRE, FAPO_NUMERO, FAPO_FECHA, FAPO_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, TERC_NOM, FAPO_SOLIMP,
    FAPO_DTOPORC, FAPO_DTOMONTO, FAPO_ADICIONAL, FAPO_IVAMONTO,
    FAPO_EXTRA, F.fapo_dtoporc, F.fapo_dtomonto, FAPO_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    FAPO_OBS, F.fapo_totgtos, F.fapo_totmon, F.timo_cod, FAPO_PROY, FAPO_CENTRO, FAPO_IMPORTACION
    FROM FACTURA_PROFORMA F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.FAPO_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :PEDIDO,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :gastos, :TOTALMONEDA, :MONEDA, :CODPROY, :CODCENTRO, :IMPORTA;
    
if (SIMPLIFICA = 'N') then
     SIMPLIFICADO = 'COMUN';
ELSE
    SIMPLIFICADO = 'SIMPLIFICADO';

SELECT TIMO_NOMBRE FROM tipos_moneda WHERE TIMO_COD = :MONEDA INTO :MONEDA;
nomproy = '';
SELECT PROY_NOM FROM PROYECTOS WHERE PROY_COD = :codproy INTO :nomproy;
nomcentro = '';
SELECT CENT_NOM FROM CENTROS WHERE PROY_COD = :codproy AND CENT_COD = :codcentro INTO :nomcentro;
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 ;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
TOTCONSUMO = 0;
TOTGASTOS = 0;
SELECT SUM(fpde_totgtos) FROM FACTURA_PROFORMA_DET D WHERE FAPO_ID = :ID INTO totgastos;
if (totgastos IS NULL) then
    totgastos = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
    FOR SELECT
    FPDE_ITEM,D.FPDE_TRM,D.ARTI_COD,FPDE_CODBAR,SUBSTR(FPDE_DESC,1,60),FPDE_CANT,FPDE_UNIDAD,BODE_COD,
    FPDE_PRUNIT,FPDE_DTOPORC,FPDE_DTOMONTO,FPDE_IVAPORC,FPDE_IVAMONTO,FPDE_CONSUMO,FPDE_TOTAL,GRUP_COD,
    SUBG_COD,MARC_COD,D.fpde_peso,D.fpde_ancho,D.fpde_alto,D.fpde_largo,TAIV_COD,FPDE_CODPROV, 
    D.fpde_prunitmon,D.fpde_arancmonto,D.fpde_fob, d.fpde_arancmonto, d.fpde_totgtos, a.arti_obs, A.arti_descorta
    FROM FACTURA_PROFORMA_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FAPO_ID = :ID
    ORDER BY FPDE_ITEM
    INTO
    :ITEM,:TRM,:ARTICULO,:CODBAR,:ARTIDES,:CANT,:UNIDAD,:BODITEM,
    :PRUNIT,:DTOITPORC,:DTOITMONTO,:IVAPORC,:IVAITMONTO,:CONSUMO,:TOTAL,:GRUPO,
    :SUBGRUPO,:MARCA,:PESO,:ANCHO,:ALTO,:LARGO,:TARIFA,:ARTIPROV,
    :prunitmon,:arancmonto,:fob,:arancel,:gastosit, :descadic, :artidescorta
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTAL = TOTAL + gastosit;
      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
    FPDE_ITEM,D.FPDE_TRM,D.ARTI_COD,FPDE_CODBAR,SUBSTR(FPDE_DESC,1,60),FPDE_CANT,FPDE_UNIDAD,BODE_COD,
    FPDE_PRUNIT,FPDE_DTOPORC,FPDE_DTOMONTO,FPDE_IVAPORC,FPDE_IVAMONTO,FPDE_CONSUMO,FPDE_TOTAL,GRUP_COD,
    SUBG_COD,MARC_COD,D.fpde_peso,D.fpde_ancho,D.fpde_alto,D.fpde_largo,TAIV_COD,FPDE_CODPROV, 
    D.fpde_prunitmon,D.fpde_arancmonto,D.fpde_fob, d.fpde_arancmonto, d.fpde_totgtos, d.fpde_fob, a.arti_obs, A.arti_descorta
    FROM FACTURA_PROFORMA_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FAPO_ID = :ID
    ORDER BY FPDE_ITEM
    INTO
    :ITEM,:TRM,:ARTICULO,:CODBAR,:ARTIDES,:CANT,:UNIDAD,:BODITEM,
    :PRUNIT,:DTOITPORC,:DTOITMONTO,:IVAPORC,:IVAITMONTO,:CONSUMO,:TOTAL,:GRUPO,
    :SUBGRUPO,:MARCA,:PESO,:ANCHO,:ALTO,:LARGO,:TARIFA,:ARTIPROV,
    :prunitmon,:arancmonto,:fob,:arancel,:gastosit, :fob, :descadic, :artidescorta
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTAL = TOTAL + GASTOSIT;
      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^


ALTER PROCEDURE IMPR_FACTURA (
    ID INTEGER,
    MONEDAEX CHAR(1))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    DIASVENCE INTEGER,
    CONTCRED CHAR(17),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NOMCLIENTE VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    AUTORIZACION VARCHAR(20),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    REMISION VARCHAR(30),
    PACIENTE VARCHAR(20),
    NOMPACIENTE VARCHAR(60),
    DIRPACIENTE VARCHAR(100),
    CIUPACIENTE VARCHAR(60),
    TELPACIENTE VARCHAR(40),
    TRPACIENTE VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    INGTERCEROS NUMERIC(18,2),
    INGPROPIOS NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    DEC2799 NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREEP NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    DTOF1P NUMERIC(9,2),
    DTOF1M NUMERIC(18,2),
    DTOF1F DATE,
    DTOF2P NUMERIC(9,2),
    DTOF2M NUMERIC(18,2),
    DTOF2F DATE,
    DTOF3P NUMERIC(9,2),
    DTOF3M NUMERIC(18,2),
    DTOF3F DATE,
    ANTICIPO NUMERIC(18,2),
    RETGARANTIA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    ENTREGA DATE,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    SERIALES VARCHAR(4096),
    UNIDAD VARCHAR(8),
    CAJAS NUMERIC(18,4),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    BASE NUMERIC(18,2),
    PORCBASE NUMERIC(9,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    INALC NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(255),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(18,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    SUMA4 NUMERIC(18,2),
    SUMA5 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    SUMAINALC NUMERIC(18,2),
    TOTCONSUMO NUMERIC(18,2),
    TOTINALC NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    DTOITEM1 NUMERIC(18,2),
    DTOITEM2 NUMERIC(18,2),
    DTOITEM3 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),
    MONTOPAGOE1 NUMERIC(18,2),
    FORMAPAGO2 VARCHAR(30),
    MONTOPAGO2 NUMERIC(18,2),
    MONTOPAGOE2 NUMERIC(18,2),
    FORMAPAGO3 VARCHAR(30),
    MONTOPAGO3 NUMERIC(18,2),
    MONTOPAGOE3 NUMERIC(18,2),
    FORMAPAGO4 VARCHAR(30),
    MONTOPAGO4 NUMERIC(18,2),
    MONTOPAGOE4 NUMERIC(18,2),
    FORMAPAGO5 VARCHAR(30),
    MONTOPAGO5 NUMERIC(18,2),
    MONTOPAGOE5 NUMERIC(18,2),
    FORMAPAGO6 VARCHAR(30),
    MONTOPAGO6 NUMERIC(18,2),
    MONTOPAGOE6 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),
    UNIALTERNA VARCHAR(8),
    FECINI DATE,
    FECFIN DATE,
    CARTINI NUMERIC(18,2),
    CARTFIN NUMERIC(18,2),
    ABONOS NUMERIC(18,2),
    CARGOS NUMERIC(18,2),
    CODRECAUDO VARCHAR(65),
    CODRECAUDOR VARCHAR(65),
    VALE VARCHAR(60),
    FACMAR VARCHAR(60),
    TOTDESCITEM NUMERIC(18,2),
    SUMDTOS NUMERIC(18,2),
    LLEVAR VARCHAR(1))
AS
declare variable TRM DOUBLE PRECISION;
declare variable TRMRDC DOUBLE PRECISION;
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE ITEMFOR INTEGER;
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,4);
declare variable ORDENCOD CHAR(15);
declare variable IMPRDEV CHAR(2);
declare variable IMPRENS 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 DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
declare variable FACTENC double precision;
declare variable CODGS1 VARCHAR(13);
declare variable STRVALOR VARCHAR(11);
declare variable AUXVALOR VARCHAR(15);
declare variable NITCONTADO VARCHAR(20);
declare variable CEROSIZQ CHAR(2);
declare variable IDFMAR INTEGER;
declare variable NUMFAC VARCHAR(12);
declare variable CANTENS NUMERIC(18,4);
declare variable CANTOT CHAR(2);
declare variable OMITEREP CHAR(2);
declare variable CODANTERIOR VARCHAR(15);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'OMITIR CODIGO Y DESCRIPCION EN ITEMS CONSECUTIVOS CON EL MISMO ARTICULO') returning_values (OMITEREP);
execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'IMPRIMIR REPORTES DE COMPROBANTES Y CONSECUTIVOS CON CEROS A LA IZQUIERDA') returning_values (CEROSIZQ);
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);
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (:CANTOT);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO,
    FACT_RTICAPOR, FACT_RTICAMONTO, FACT_RTCREE, FACT_RTCREEM, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_DEC2799, FACT_ENTREGA, FACT_TRM,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO,
    FACT_GARANTIA, FACT_FACTOR, FACT_FECINI, FACT_FECFIN, p.terc_nit, FACT_DETCLIDIR, FACT_DETCLICIU, FACT_DETCLITEL, FACT_DETCLITR, FACT_VALE, FACT_IDFMAR,
    FACT_DTOF1, FACT_DTOF1M, FACT_DTOF1FEC, FACT_DTOF2, FACT_DTOF2M, FACT_DTOF2FEC, FACT_DTOF3, FACT_DTOF3M, FACT_DTOF3FEC, (FACT_DTOIT1+FACT_DTOIT2+FACT_DTOIT3)
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO,
    :RTEICAPORC, :RTEICAMONTO, :rtecreep, :rtecreem, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m, :dec2799, :ENTREGA, :TRM,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo,
    :retgarantia, :factenc, :FECINI, :FECFIN, :NITCONTADO, :DIRPACIENTE, :CIUPACIENTE, :TELPACIENTE, :TRPACIENTE, :VALE, :IDFMAR,
    :dtof1p, :dtof1m, :dtof1f, :dtof2p, :dtof2m, :dtof2f, :dtof3p, :dtof3m, :dtof3f, :sumdtos;

if (CEROSIZQ = 'NO') then
    NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
/* 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;
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','SEPARAR ARTICULOS SEGUN LA MARCA EN FACTURAS INDEPENDIENTES') RETURNING_VALUES (FACMAR);
if (FACMAR = 'SI') then
    BEGIN
    FACMAR = '';
    if ((idfmar IS NOT NULL) AND (IDFMAR <> 0)) then
        BEGIN
        SELECT PREF_PRE || FACT_NUMERO || '-' FROM FACTURAS WHERE FACT_ID = :IDFMAR INTO :FACMAR;
        END
    FOR SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS WHERE FACT_IDFMAR = :IDFMAR AND FACT_NUMERO <> :numero AND PREF_PRE <> :pref
        INTO :NUMFAC
        DO
        BEGIN
        FACMAR = FACMAR || :NUMFAC || '-';
        END
    END
ELSE
    FACMAR = '';
SELECT CLIE_COD, C.ZONA_COD FROM CLIENTES C
    WHERE TERC_NIT = :NIT INTO :CODIGOCL, :ZONACOD;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, ZONA_COD FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO, :ZONACOD;
ZONANOM = '';
SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :zonacod INTO :ZONANOM;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO + dec2799;
SELECT SUM(FADE_DTOMONTO*FADE_CANT) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
if (DTOITE3 = 'SI') then
    BEGIN
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
if (FECHA > fautoret) then
    if (FECHA >= fautorcree) then
        TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
    else
        TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - rtecreem - ANTICIPO - RETGARANTIA;
ELSE
    if (FECHA >= fautorcree) then
        TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
    else
        TOTALPAGAR = TOTALFAC - RTEFTEMONTO - rtecreem - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
TOTALNETO = TOTALFAC - ANTICIPO - RETGARANTIA;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
/* si no hay cotizacion pero hay pedido llame la cotizacion del pedido */
if ((cotizacion is null) or (cotizacion = '')) then
    if ((pedido <> '') AND (STRLEN(:PEDIDO) > 6)) then
        select pedi_cotizaci from pedidos p where pedi_numero = right(:pedido, 6) and pref_pre = left(:pedido,  strlen(:pedido)-6) into :cotizacion;
/* CARTERA Y ABONOS */
if (NIT <> NITCONTADO) then
    BEGIN
    if (fecini is null) then
        fecini = fecha;
    if (fecfin is null) then
        fecfin = fecha;
    SELECT SUM(SALDO) FROM cartera_cliente(:nit, :fecini-1, :sucur, 0, 'N', 0) INTO :cartini;
    SELECT SUM(SALDO) FROM cartera_cliente(:nit, :fecfin, :sucur, 0, 'N', 0) INTO :cartfin;
    SELECT SUM(M.mvcl_monto) FROM movimiento_clientes M WHERE TERC_NIT = :NIT AND M.mvcl_sucursal = :sucur AND
        M.mvcl_abono = 'S' AND M.mvcl_fecha >= :fecini AND M.mvcl_fecha <= :fecfin INTO :abonos;
    SELECT SUM(M.mvcl_monto) FROM movimiento_clientes M WHERE TERC_NIT = :NIT AND M.mvcl_sucursal = :sucur AND
        M.mvcl_abono = 'N' AND M.mvcl_fecha >= :fecini AND M.mvcl_fecha <= :fecfin INTO :cargos;
    END
if (cartini IS NULL) then
    CARTINI = 0;
if (cartfin IS NULL) then
    cartfin = 0;
if (abonos IS NULL) then
    abonos = 0;
if (cargos IS NULL) then
    cargos = 0;
SUMAINALC = 0;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
SUMA4 = 0;
SUMA5 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
IVA4 = 0;
IVA5 = 0;
TOTCONSUMO = 0;
TOTINALC = 0;
MONTOPAGO1 = 0;
MONTOPAGOE1 = 0;
PESOTOT = 0;
totcajas = 0;
totbase = 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;
MONTOPAGOE1 = 0;
MONTOPAGOE2 = 0;
MONTOPAGOE3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO, RECA_TRM 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, :TRMRDC
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        if (trmrdc <> 1) then
            MONTOPAGOE1 = MONTOP / TRMRDC;
        else
            MONTOPAGOE1 = 0;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        if (trmrdc <> 1) then
            MONTOPAGOE2 = MONTOP / TRMRDC;
        else
            MONTOPAGOE2 = 0;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        if (trmrdc <> 1) then
            MONTOPAGOE3 = MONTOP / TRMRDC;
        else
            MONTOPAGOE3 = 0;
        END
    if (ITEMFP = 4) then
        BEGIN
        FORMAPAGO4 = FORMAP;
        MONTOPAGO4 = MONTOP;
        if (trmrdc <> 1) then
            MONTOPAGOE4 = MONTOP / TRMRDC;
        else
            MONTOPAGOE4 = 0;
        END
    if (ITEMFP = 5) then
        BEGIN
        FORMAPAGO5 = FORMAP;
        MONTOPAGO5 = MONTOP;
        if (trmrdc <> 1) then
            MONTOPAGOE5 = MONTOP / TRMRDC;
        else
            MONTOPAGOE5 = 0;
        END
    if (ITEMFP = 6) then
        BEGIN
        FORMAPAGO6 = FORMAP;
        MONTOPAGO6 = MONTOP;
        if (trmrdc <> 1) then
            MONTOPAGOE6 = MONTOP / TRMRDC;
        else
            MONTOPAGOE6 = 0;
        END
    ITEMFP = ITEMFP + 1;
    END
/* TOTALES DEL DETALLE */
FOR SELECT FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
    fade_tiva, FADE_DEVUELTO, FADE_CAJAS, FADE_BASE, FADE_INALCM
    FROM FACTURAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
    ORDER BY :ORDENCOD
    INTO :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
    :TARIFA, :devuelto, :cajas, :base, :inalc
    DO
    BEGIN
    TOTCONSUMO = TOTCONSUMO + CONSUMO;
    TOTINALC = TOTINALC + INALC;
    TOTBASE = TOTBASE + BASE;
    if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
        BEGIN
        /* NO SUME LOS ENSAMBLES */
        if ((TARIFA = 0) and (IVAPORC = 0)) then
            SUMAEX = SUMAEX + (TOTAL - CONSUMO - INALC)*FACTENC;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
            IVA1 = IVA1 + IVAITMONTO*FACTENC;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
            IVA2 = IVA2 + IVAITMONTO*FACTENC;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
            IVA3 = IVA3 + IVAITMONTO*FACTENC;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
            IVA4 = IVA4 + IVAITMONTO*FACTENC;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
            IVA5 = IVA5 + IVAITMONTO*FACTENC;
            END
        if (INALC <> 0) then
            SUMAINALC = SUMAINALC + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
        END
    totcajas = totcajas + cajas;
    END
if ((MONEDAEX = 'S') AND (TRM <> 1)) then
    BEGIN
    SUBTOTAL = SUBTOTAL / TRM;
    INGTERCEROS = INGTERCEROS / TRM;
    INGPROPIOS = INGPROPIOS / TRM;
    DTOMONTO = DTOMONTO / TRM;
    ADICIONAL = ADICIONAL / TRM;
    IVAMONTO = IVAMONTO / TRM;
    RTEFTEMONTO = RTEFTEMONTO / TRM;
    RTEIVAMONTO = RTEIVAMONTO / TRM;
    RTEICAMONTO = RTEICAMONTO / TRM;
    RTECREEM = RTECREEM / TRM;
    EXTRA = EXTRA / TRM;
    DTOFMONTO = DTOFMONTO / TRM;
    ANTICIPO = ANTICIPO / TRM;
    RETGARANTIA = RETGARANTIA / TRM;
    TOTALFAC = TOTALFAC / TRM;
    TOTALPAGAR = TOTALPAGAR / TRM;
    TOTALNETO = TOTALNETO / TRM;
    SUMA1 = SUMA1 / TRM;
    SUMA2 = SUMA2 / TRM;
    SUMA3 = SUMA3 / TRM;
    SUMA4 = SUMA4 / TRM;
    SUMA5 = SUMA5 / TRM;
    IVA1 = IVA1 / TRM;
    IVA2 = IVA2 / TRM;
    IVA3 = IVA3 / TRM;
    IVA4 = IVA4 / TRM;
    IVA5 = IVA5 / TRM;
    SUMAEX = SUMAEX / TRM;
    SUMAGR = SUMAGR / TRM;
    SUMAINALC = SUMAINALC / TRM;
    TOTCONSUMO = TOTCONSUMO / TRM;
    TOTINALC = TOTINALC / TRM;
    DTOIT1M = DTOIT1M / TRM;
    DTOIT2M = DTOIT2M / TRM;
    DTOIT3M = DTOIT3M / TRM;
    END
SELECT COUNT(FADE_ITEM) from FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 31 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'IMPRIMIR DETALLE DE PRODUCTOS ENSAMBLADOS AUTOMATICAMENTE CON LA FACTURA') returning_values (:imprens);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, fade_tiva, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE, FADE_INALCM, FADE_LLEVAR
        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, :dtoitem1, :dtoitem2, :dtoitem3, :cajas, :base, :porcbase, :inalc, :LLEVAR
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (DTOIT1 IS NULL) then
            DTOIT1 = 0;
          if (DTOIT2 IS NULL) then
            DTOIT2 = 0;
          if (DTOIT3 IS NULL) then
            DTOIT3 = 0;
          if (DTOITEM1 IS NULL) then
            DTOITEM1 = 0;
          if (DTOITEM2 IS NULL) then
            DTOITEM2 = 0;
          if (DTOITEM3 IS NULL) then
            DTOITEM3 = 0;
          TOTDESCITEM = DTOITEM1 + DTOITEM2 + DTOITEM3;
          if (LLEVAR = 'S') then
            LLEVAR = '*';
          ELSE
            LLEVAR = '';
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO < CANT*FACTOR)) then
                IMPR = 'S';
            ELSE
                if ((DEVUELTO > 0) or (CANT < 0))  then
                    if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT = (:CANT*-1) AND FADE_UNIDAD = :UNIDAD 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 */
                ELSE
                    IMPR = 'S'; /* ITEM SIN DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
            if (CANT <> 0) then
                prneto = (PRUNIT - DTOITMONTO) * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
            ELSE
                prneto = PRUNIT - DTOITMONTO;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    begin
                    prnetosiniva = (PRUNIT - DTOITMONTO - ((IVAITMONTO + CONSUMO + INALC) / CANT));
                    prnetosiniva = prnetosiniva * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                    end
                else
                    prnetosiniva = PRUNIT - DTOITMONTO;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;

            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;
            if (LEFT(ARTICULO,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                ARTICULO = '';
                CODBAR = '';
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN, UNAR_UNIDAD FROM unidad_articulo WHERE ARTI_COD = :articulo and unar_activa = 'S' and unar_faccan <= (:CANT * :FACTOR) AND UNAR_FACCAN > 1
                order by unar_faccan desc
                INTO :factcant, :unialterna;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :unialterna;
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                if (ALTERNATIVAS = 0) then
                    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :unialterna;
                END
            if ((MONEDAEX = 'S') AND (TRM <> 1)) then
                BEGIN
                PRUNIT = PRUNIT / TRM;
                DTOITMONTO = DTOITMONTO / TRM;
                PRNETO = PRNETO / TRM;
                PRNETOSINIVA = PRNETOSINIVA / TRM;
                BASE = base / TRM;
                IVAITMONTO = IVAITMONTO / TRM;
                CONSUMO = consumo / TRM;
                INALC = INALC / TRM;
                SUBTOTIT = SUBTOTIT / TRM;
                TOTAL = TOTAL / TRM;
                END
            EXECUTE PROCEDURE seriales_item_documento(31, :ID, :ITEM) returning_values (:SERIALES);
            if (OMITEREP = 'SI') then
                if (ARTICULO = codanterior) then
                    BEGIN
                    codanterior = ARTICULO;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    DESCORTA = '';
                    END
                ELSE
                    codanterior = ARTICULO;
            SUSPEND;
            /* el detalle si hubo ensamble */
            if (IMPRENS = 'SI') then
              FOR SELECT '    ' || max(ed.arti_cod), SUM(ESDE_CANT*ESDE_FACTOR*ENSA_CANT), SUM(ESDE_CANT*ESDE_FACTOR), MAX(ESDE_LOTE), MAX(ARTI_UNIDAD), MAX(TAIV_PORC), '    ' || max(arti_des), MAX(ESDE_PRECIO)
                FROM ENSAMBLES_DETALLE ED, ENSAMBLES E, articulo a, TARIFA_IVA T
                WHERE E.ensa_tiporef = 31 AND E.ensa_idref = :id AND E.arti_cod = :articulo and a.arti_cod = ed.arti_cod
                AND A.taiv_cod = T.taiv_cod and e.ensa_id = ed.ensa_id and e.ensa_itemref = :item
                GROUP BY ED.ARTI_COD, ED.esde_lote
                into :articulo, :cant, :cantens, :lote, :unidad, :ivaporc, :artides, :prunit
                do
                begin
                if (cantot = 'SI') then
                    CANT = cantens;
                prnetosiniva = PRUNIT;
                DTOITPORC = 0;
                DTOITMONTO = 0;
                IVAITMONTO = 0;
                CONSUMO = 0;
                subtotit = 0;
                TOTAL = 0;
                SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
                SUSPEND;
                end
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, fade_tiva, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE, FADE_INALCM, FADE_LLEVAR
        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, :dtoitem1, :dtoitem2, :dtoitem3, :cajas, :base, :porcbase, :INALC, :LLEVAR
        DO
          BEGIN
          if (DTOIT1 IS NULL) then
            DTOIT1 = 0;
          if (DTOIT2 IS NULL) then
            DTOIT2 = 0;
          if (DTOIT3 IS NULL) then
            DTOIT3 = 0;
          if (DTOITEM1 IS NULL) then
            DTOITEM1 = 0;
          if (DTOITEM2 IS NULL) then
            DTOITEM2 = 0;
          if (DTOITEM3 IS NULL) then
            DTOITEM3 = 0;
          TOTDESCITEM = DTOITEM1 + DTOITEM2 + DTOITEM3;
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (LLEVAR = 'S') then
            LLEVAR = '*';
          ELSE
            LLEVAR = '';
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO < CANT*FACTOR)) then
                IMPR = 'S';
            ELSE
                if ((DEVUELTO > 0) or (CANT < 0))  then
                    if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT = (:CANT*-1) AND FADE_UNIDAD = :UNIDAD 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 */
                ELSE
                    IMPR = 'S'; /* ITEM SIN DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
            if (CANT <> 0) then
                prneto = (PRUNIT - DTOITMONTO) * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
            ELSE
                prneto = PRUNIT - DTOITMONTO;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    begin
                    prnetosiniva = (PRUNIT - DTOITMONTO - ((IVAITMONTO + CONSUMO + INALC) / CANT));
                    prnetosiniva = prnetosiniva * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                    end
                else
                    prnetosiniva = PRUNIT - DTOITMONTO;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (LEFT(ARTICULO,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                ARTICULO = '';
                CODBAR = '';
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN, UNAR_UNIDAD FROM unidad_articulo WHERE ARTI_COD = :articulo and unar_activa = 'S' and unar_faccan <= (:CANT * :FACTOR) AND UNAR_FACCAN > 1
                order by unar_faccan desc
                INTO :factcant, :unialterna;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :unialterna;
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                if (ALTERNATIVAS = 0) then
                    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :unialterna;
                END
            if ((MONEDAEX = 'S') AND (TRM <> 1)) then
                BEGIN
                PRUNIT = PRUNIT / TRM;
                DTOITMONTO = DTOITMONTO / TRM;
                PRNETO = PRNETO / TRM;
                PRNETOSINIVA = PRNETOSINIVA / TRM;
                BASE = base / TRM;
                IVAITMONTO = IVAITMONTO / TRM;
                CONSUMO = consumo / TRM;
                INALC = INALC / TRM;
                SUBTOTIT = SUBTOTIT / TRM;
                TOTAL = TOTAL / TRM;
                END
            EXECUTE PROCEDURE seriales_item_documento(31, :ID, :ITEM) returning_values (:SERIALES);
            if (OMITEREP = 'SI') then
                if (ARTICULO = codanterior) then
                    BEGIN
                    codanterior = ARTICULO;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    DESCORTA = '';
                    END
                ELSE
                    codanterior = ARTICULO;
            SUSPEND;
            /* el detalle si hubo ensamble */
            if (IMPRENS = 'SI') then
              FOR SELECT '    ' || max(ed.arti_cod), SUM(ESDE_CANT*ESDE_FACTOR*ENSA_CANT), SUM(ESDE_CANT*ESDE_FACTOR), MAX(ESDE_LOTE), MAX(ARTI_UNIDAD), MAX(TAIV_PORC), '    ' || max(arti_des), MAX(ESDE_PRECIO)
                FROM ENSAMBLES_DETALLE ED, ENSAMBLES E, articulo a, TARIFA_IVA T
                WHERE E.ensa_tiporef = 31 AND E.ensa_idref = :id AND E.arti_cod = :articulo and a.arti_cod = ed.arti_cod
                AND A.taiv_cod = T.taiv_cod and e.ensa_id = ed.ensa_id and e.ensa_itemref = :item
                GROUP BY ED.ARTI_COD, ED.esde_lote
                into :articulo, :cant, :cantens, :lote, :unidad, :ivaporc, :artides, :prunit
                do
                begin
                if (cantot = 'SI') then
                    CANT = cantens;
                prnetosiniva = PRUNIT;
                DTOITPORC = 0;
                DTOITMONTO = 0;
                IVAITMONTO = 0;
                CONSUMO = 0;
                subtotit = 0;
                TOTAL = 0;
                SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
                SUSPEND;
                end
            END
          END
    END
  ELSE if (ORDENCOD = 'MARCA') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, fade_tiva, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE, FADE_INALCM, FADE_LLEVAR
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY A.marc_cod, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitem1, :dtoitem2, :dtoitem3, :cajas, :base, :porcbase, :INALC, :LLEVAR
        DO
          BEGIN
          if (DTOIT1 IS NULL) then
            DTOIT1 = 0;
          if (DTOIT2 IS NULL) then
            DTOIT2 = 0;
          if (DTOIT3 IS NULL) then
            DTOIT3 = 0;
          if (DTOITEM1 IS NULL) then
            DTOITEM1 = 0;
          if (DTOITEM2 IS NULL) then
            DTOITEM2 = 0;
          if (DTOITEM3 IS NULL) then
            DTOITEM3 = 0;
          TOTDESCITEM = DTOITEM1 + DTOITEM2 + DTOITEM3;
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (LLEVAR = 'S') then
            LLEVAR = '*';
          ELSE
            LLEVAR = '';
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO < CANT*FACTOR)) then
                IMPR = 'S';
            ELSE
                if ((DEVUELTO > 0) or (CANT < 0))  then
                    if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT = (:CANT*-1) AND FADE_UNIDAD = :UNIDAD 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 */
                ELSE
                    IMPR = 'S'; /* ITEM SIN DEVOLUCION */
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
            if (CANT <> 0) then
                prneto = (PRUNIT - DTOITMONTO) * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
            ELSE
                prneto = PRUNIT - DTOITMONTO;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    begin
                    prnetosiniva = (PRUNIT - DTOITMONTO - ((IVAITMONTO + CONSUMO + INALC) / CANT));
                    prnetosiniva = prnetosiniva * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                    end
                else
                    prnetosiniva = PRUNIT - DTOITMONTO;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            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;
            if (LEFT(ARTICULO,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                ARTICULO = '';
                CODBAR = '';
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN, UNAR_UNIDAD FROM unidad_articulo WHERE ARTI_COD = :articulo and unar_activa = 'S' and unar_faccan <= (:CANT * :FACTOR) AND UNAR_FACCAN > 1
                order by unar_faccan desc
                INTO :factcant, :unialterna;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :unialterna;
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                if (ALTERNATIVAS = 0) then
                    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :unialterna;
                END
            if ((MONEDAEX = 'S') AND (TRM <> 1)) then
                BEGIN
                PRUNIT = PRUNIT / TRM;
                DTOITMONTO = DTOITMONTO / TRM;
                PRNETO = PRNETO / TRM;
                PRNETOSINIVA = PRNETOSINIVA / TRM;
                BASE = base / TRM;
                IVAITMONTO = IVAITMONTO / TRM;
                CONSUMO = consumo / TRM;
                INALC = INALC / TRM;
                SUBTOTIT = SUBTOTIT / TRM;
                TOTAL = TOTAL / TRM;
                END
            EXECUTE PROCEDURE seriales_item_documento(31, :ID, :ITEM) returning_values (:SERIALES);
            if (OMITEREP = 'SI') then
                if (ARTICULO = codanterior) then
                    BEGIN
                    codanterior = ARTICULO;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    DESCORTA = '';
                    END
                ELSE
                    codanterior = ARTICULO;
            SUSPEND;
            /* el detalle si hubo ensamble */
            if (IMPRENS = 'SI') then
              FOR SELECT '    ' || max(ed.arti_cod), SUM(ESDE_CANT*ESDE_FACTOR*ENSA_CANT), SUM(ESDE_CANT*ESDE_FACTOR), MAX(ESDE_LOTE), MAX(ARTI_UNIDAD), MAX(TAIV_PORC), '    ' || max(arti_des), MAX(ESDE_PRECIO)
                FROM ENSAMBLES_DETALLE ED, ENSAMBLES E, articulo a, TARIFA_IVA T
                WHERE E.ensa_tiporef = 31 AND E.ensa_idref = :id AND E.arti_cod = :articulo and a.arti_cod = ed.arti_cod
                AND A.taiv_cod = T.taiv_cod and e.ensa_id = ed.ensa_id and e.ensa_itemref = :item
                GROUP BY ED.ARTI_COD, ED.esde_lote
                into :articulo, :cant, :cantens, :lote, :unidad, :ivaporc, :artides, :prunit
                do
                begin
                if (cantot = 'SI') then
                    CANT = cantens;
                prnetosiniva = PRUNIT;
                DTOITPORC = 0;
                DTOITMONTO = 0;
                IVAITMONTO = 0;
                CONSUMO = 0;
                subtotit = 0;
                TOTAL = 0;
                SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
                SUSPEND;
                end
            END
          END
    END
  ELSE
    if (ORDENCOD = 'DESCRIPCION') then
      BEGIN
      FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
            GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, fade_tiva, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE, FADE_INALCM, FADE_LLEVAR
            FROM FACTURAS_DETALLE D, ARTICULO A
            WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
            ORDER BY 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, :dtoitem1, :dtoitem2, :dtoitem3, :cajas, :base, :porcbase, :INALC, :LLEVAR
            DO
              BEGIN
              if (DTOIT1 IS NULL) then
                DTOIT1 = 0;
              if (DTOIT2 IS NULL) then
                DTOIT2 = 0;
              if (DTOIT3 IS NULL) then
                DTOIT3 = 0;
              if (DTOITEM1 IS NULL) then
                DTOITEM1 = 0;
              if (DTOITEM2 IS NULL) then
                DTOITEM2 = 0;
              if (DTOITEM3 IS NULL) then
                DTOITEM3 = 0;
              TOTDESCITEM = DTOITEM1 + DTOITEM2 + DTOITEM3;
              if (ARTICULO = CODBAR) then
                SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
              SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
              if (LLEVAR = 'S') then
                LLEVAR = '*';
              ELSE
                LLEVAR = '';
              if (IMPRDEV <> 'SI') then
                BEGIN
                if ((CANT >= 0) AND (DEVUELTO < CANT*FACTOR)) then
                    IMPR = 'S';
                ELSE
                    if ((DEVUELTO > 0) or (CANT < 0))  then
                        if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT = (:CANT*-1) AND FADE_UNIDAD = :UNIDAD 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 */
                    ELSE
                        IMPR = 'S'; /* ITEM SIN DEVOLUCION */
                END
              ELSE
                IMPR = 'S';
              if (IMPR = 'S') then
                BEGIN
                EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
                    returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
                if (CANT <> 0) then
                    prneto = (PRUNIT - DTOITMONTO) * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                ELSE
                    prneto = PRUNIT - DTOITMONTO;
                if (IMPTOS = 'S') then
                    if (cant <> 0) then
                        begin
                        prnetosiniva = (PRUNIT - DTOITMONTO - ((IVAITMONTO + CONSUMO + INALC) / CANT));
                        prnetosiniva = prnetosiniva * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                        end
                    else
                        prnetosiniva = PRUNIT - DTOITMONTO;
                if (ICOINC = 'SI') then
                    SUBTOTIT = TOTAL - IVAITMONTO;
                else
                    SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
                SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
                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;
                if (LEFT(ARTICULO,2) = '.t') then
                    BEGIN
                    REFITEM = '';
                    TOTAL = 0;
                    SUBTOTIT = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    END
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
                factcant = NULL;
                SELECT FIRST 1 UNAR_FACCAN, UNAR_UNIDAD FROM unidad_articulo WHERE ARTI_COD = :articulo and unar_activa = 'S' and unar_faccan <= (:CANT * :FACTOR) AND UNAR_FACCAN > 1
                    order by unar_faccan desc
                    INTO :factcant, :unialterna;
                if ((factcant IS NULL) or (factcant = 0)) then
                    BEGIN
                    ALTERNATIVAS = 0;
                    PRINCIPALES = (CANT * FACTOR);
                    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :unialterna;
                    END
                ELSE
                    BEGIN
                    ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                    PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                    if (ALTERNATIVAS = 0) then
                        SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :unialterna;
                    END
                if ((MONEDAEX = 'S') AND (TRM <> 1)) then
                    BEGIN
                    PRUNIT = PRUNIT / TRM;
                    DTOITMONTO = DTOITMONTO / TRM;
                    PRNETO = PRNETO / TRM;
                    PRNETOSINIVA = PRNETOSINIVA / TRM;
                    BASE = base / TRM;
                    IVAITMONTO = IVAITMONTO / TRM;
                    CONSUMO = consumo / TRM;
                    INALC = INALC / TRM;
                    SUBTOTIT = SUBTOTIT / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                EXECUTE PROCEDURE seriales_item_documento(31, :ID, :ITEM) returning_values (:SERIALES);
                if (OMITEREP = 'SI') then
                    if (ARTICULO = codanterior) then
                        BEGIN
                        codanterior = ARTICULO;
                        ARTICULO = '';
                        CODBAR = '';
                        ARTIDES = '';
                        DESCORTA = '';
                        END
                    ELSE
                        codanterior = ARTICULO;
                SUSPEND;
                /* el detalle si hubo ensamble */
                if (IMPRENS = 'SI') then
                  FOR SELECT '    ' || max(ed.arti_cod), SUM(ESDE_CANT*ESDE_FACTOR*ENSA_CANT), SUM(ESDE_CANT*ESDE_FACTOR), MAX(ESDE_LOTE), MAX(ARTI_UNIDAD), MAX(TAIV_PORC), '    ' || max(arti_des), MAX(ESDE_PRECIO)
                    FROM ENSAMBLES_DETALLE ED, ENSAMBLES E, articulo a, TARIFA_IVA T
                    WHERE E.ensa_tiporef = 31 AND E.ensa_idref = :id AND E.arti_cod = :articulo and a.arti_cod = ed.arti_cod
                    AND A.taiv_cod = T.taiv_cod and e.ensa_id = ed.ensa_id and e.ensa_itemref = :item
                    GROUP BY ED.ARTI_COD, ED.esde_lote
                    into :articulo, :cant, :cantens, :lote, :unidad, :ivaporc, :artides, :prunit
                    do
                    begin
                    if (cantot = 'SI') then
                        CANT = cantens;
                    prnetosiniva = PRUNIT;
                    DTOITPORC = 0;
                    DTOITMONTO = 0;
                    IVAITMONTO = 0;
                    CONSUMO = 0;
                    subtotit = 0;
                    TOTAL = 0;
                    SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
                    SUSPEND;
                    end
                END
              END
      END
    ELSE
        BEGIN
        FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC from 1 FOR 60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
            GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, fade_tiva, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE, FADE_INALCM, FADE_LLEVAR
            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, :dtoitem1, :dtoitem2, :dtoitem3, :cajas, :base, :porcbase, :INALC, :LLEVAR
            DO
              BEGIN
              if (DTOIT1 IS NULL) then
                DTOIT1 = 0;
              if (DTOIT2 IS NULL) then
                DTOIT2 = 0;
              if (DTOIT3 IS NULL) then
                DTOIT3 = 0;
              if (DTOITEM1 IS NULL) then
                DTOITEM1 = 0;
              if (DTOITEM2 IS NULL) then
                DTOITEM2 = 0;
              if (DTOITEM3 IS NULL) then
                DTOITEM3 = 0;
              TOTDESCITEM = DTOITEM1 + DTOITEM2 + DTOITEM3;
              if (LLEVAR = 'S') then
                LLEVAR = '*';
              ELSE
                LLEVAR = '';
              if (IMPRDEV <> 'SI') then
                BEGIN
                if ((CANT >= 0) AND (DEVUELTO < CANT*FACTOR)) then
                    IMPR = 'S';
                ELSE
                    if ((DEVUELTO > 0) or (CANT < 0))  then
                        if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT = (:CANT*-1) AND FADE_UNIDAD = :UNIDAD 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 */
                    ELSE
                        IMPR = 'S'; /* ITEM SIN DEVOLUCION */
                END
              ELSE
                IMPR = 'S';
              if (IMPR = 'S') then
                BEGIN
                EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
                    returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
                if (CANT <> 0) then
                    prneto = (PRUNIT - DTOITMONTO) * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                ELSE
                    prneto = PRUNIT - DTOITMONTO;
                if (IMPTOS = 'S') then
                    if (cant <> 0) then
                        begin
                        prnetosiniva = (PRUNIT - DTOITMONTO - ((IVAITMONTO + CONSUMO + INALC) / CANT));
                        prnetosiniva = prnetosiniva * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                        end
                    else
                        prnetosiniva = PRUNIT - DTOITMONTO;
                if (ICOINC = 'SI') then
                    SUBTOTIT = TOTAL - IVAITMONTO;
                else
                    SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
                SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
                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;
                if (LEFT(ARTICULO,2) = '.t') then
                    BEGIN
                    REFITEM = '';
                    TOTAL = 0;
                    SUBTOTIT = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    END
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
                factcant = NULL;
                SELECT FIRST 1 UNAR_FACCAN, UNAR_UNIDAD FROM unidad_articulo WHERE ARTI_COD = :articulo and unar_activa = 'S' and unar_faccan <= (:CANT * :FACTOR) AND UNAR_FACCAN > 1
                    order by unar_faccan desc
                    INTO :factcant, :unialterna;
                if ((factcant IS NULL) or (factcant = 0)) then
                    BEGIN
                    ALTERNATIVAS = 0;
                    PRINCIPALES = (CANT * FACTOR);
                    SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :unialterna;
                    END
                ELSE
                    BEGIN
                    ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                    PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                    if (ALTERNATIVAS = 0) then
                        SELECT ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :unialterna;
                    END
                if ((MONEDAEX = 'S') AND (TRM <> 1)) then
                    BEGIN
                    PRUNIT = PRUNIT / TRM;
                    DTOITMONTO = DTOITMONTO / TRM;
                    PRNETO = PRNETO / TRM;
                    PRNETOSINIVA = PRNETOSINIVA / TRM;
                    BASE = base / TRM;
                    IVAITMONTO = IVAITMONTO / TRM;
                    CONSUMO = consumo / TRM;
                    INALC = INALC / TRM;
                    SUBTOTIT = SUBTOTIT / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                EXECUTE PROCEDURE seriales_item_documento(31, :ID, :ITEM) returning_values (:SERIALES);
                if (OMITEREP = 'SI') then
                    if (ARTICULO = codanterior) then
                        BEGIN
                        codanterior = ARTICULO;
                        ARTICULO = '';
                        CODBAR = '';
                        ARTIDES = '';
                        DESCORTA = '';
                        END
                    ELSE
                        codanterior = ARTICULO;
                SUSPEND;
                /* el detalle si hubo ensamble */
                if (IMPRENS = 'SI') then
                  FOR SELECT '    ' || max(ed.arti_cod), SUM(ESDE_CANT*ESDE_FACTOR*ENSA_CANT), SUM(ESDE_CANT*ESDE_FACTOR), MAX(ESDE_LOTE), MAX(ARTI_UNIDAD), MAX(TAIV_PORC), '    ' || max(arti_des), MAX(ESDE_PRECIO)
                    FROM ENSAMBLES_DETALLE ED, ENSAMBLES E, articulo a, TARIFA_IVA T
                    WHERE E.ensa_tiporef = 31 AND E.ensa_idref = :id AND E.arti_cod = :articulo and a.arti_cod = ed.arti_cod
                    AND A.taiv_cod = T.taiv_cod and e.ensa_id = ed.ensa_id and e.ensa_itemref = :item
                    GROUP BY ED.ARTI_COD, ED.esde_lote
                    into :articulo, :cant, :cantens, :lote, :unidad, :ivaporc, :artides, :prunit
                    do
                    begin
                    if (cantot = 'SI') then
                        CANT = cantens;
                    prnetosiniva = PRUNIT;
                    DTOITPORC = 0;
                    DTOITMONTO = 0;
                    IVAITMONTO = 0;
                    CONSUMO = 0;
                    subtotit = 0;
                    TOTAL = 0;
                    SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
                    SUSPEND;
                    end
                END
              END
        END
END^


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


ALTER PROCEDURE IMPR_LIQRUTAC (
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(60),
    TEL VARCHAR(40),
    RUTA VARCHAR(60),
    DIAS INTEGER,
    VRCONTRATOS NUMERIC(18,2),
    BECADOS VARCHAR(100),
    VRBECAS NUMERIC(18,2),
    VRDESCUENTO NUMERIC(18,2),
    VRPAGOS NUMERIC(18,2),
    COMIPOR NUMERIC(9,2),
    COMIMON NUMERIC(18,2),
    RETEPOR NUMERIC(9,2),
    RETEMON NUMERIC(18,2),
    RICAPOR NUMERIC(9,2),
    RICAMON NUMERIC(18,2),
    RELEVOSP NUMERIC(18,2),
    RELEVOSN NUMERIC(18,2),
    EFECTIVOS NUMERIC(18,2),
    ANTICIPOS NUMERIC(18,2),
    APAGAR NUMERIC(18,2),
    OBS VARCHAR(1024),
    NUMCON INTEGER,
    NUMEFE INTEGER,
    ITEMREC INTEGER,
    CONTREC VARCHAR(8),
    CONTEST VARCHAR(60),
    DIASREC INTEGER,
    VALORREC NUMERIC(18,2),
    CONTFECR DATE,
    OBSREC VARCHAR(1024))
AS
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable IDFAC INTEGER;
BEGIN
select LIQR_NUMERO, LIQR_CORTE, LIQR_RUTA, LIQR_CONDUCTOR, LIQR_DIAS, LIQR_VRCONTRATOS, LIQR_VRDESCUENTOS,
       LIQR_VRPAGOS, LIQR_VRANTICIPOS, LIQR_VREFECTIVOS, LIQR_VRRELEVOSP, LIQR_VRRELEVOSN, LIQR_RTFTEPOR,
       LIQR_RTFTEMONTO, LIQR_APAGAR, LIQR_COMIPORC, LIQR_COMIMONTO, LIQR_RTICAPOR,
       LIQR_RTICAMONTO, LIQR_OBS, LIQR_BECAS, LIQR_BECADOS
from LIQUIDACION_RUTA_COLEGIO WHERE LIQR_ID = :ID
into :NUMERO, :FECHA, :RUTA, :NIT, :DIAS, :VRCONTRATOS, :VRDESCUENTO,
     :VRPAGOS, :ANTICIPOS, :EFECTIVOS, :RELEVOSP, :RELEVOSN, :RETEPOR,
     :RETEMON, :APAGAR, :COMIPOR, :COMIMON, :RICAPOR, :RICAMON, :OBS, :vrbecas, :becados;
FECINI = FECHA - EXTRACT(DAY FROM FECHA) + 1;
FECFIN = dateadd(month,  1, FECINI) - 1;

SELECT RUTC_NOMBRE FROM RUTAS_COLEGIOS WHERE RUTC_ID = :ruta INTO :ruta;

SELECT TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE TERC_NIT = :nit
    INTO :nombre, :dir, :ciu, :tel;
SELECT COUNT(LIQD_ITEM), SUM(LIQD_VALOR) FROM LIQUIDACION_RUTA_DET WHERE LIQR_ID = :ID INTO :numcon, vrcontratos;
SELECT SUM(LIQC_VALOR) FROM LIQUIDACION_RUTA_CONC WHERE LIQR_ID = :ID AND LIQC_DB = 'S'INTO :vrpagos;
if (vrpagos is null) then
    vrpagos = 0;
vrpagos = vrpagos + relevosp;
SELECT SUM(LIQC_VALOR) FROM LIQUIDACION_RUTA_CONC WHERE LIQR_ID = :ID AND LIQC_DB = 'N'INTO :vrdescuento;
if (vrdescuento is null) then
    vrdescuento = 0;
vrdescuento = vrdescuento + relevosn;
SELECT COUNT(LIQE_ITEM), SUM(LIQE_VALOR) FROM LIQUIDACION_RUTA_EFE WHERE LIQR_ID = :ID INTO :numefe, :efectivos;
if (NUMCON > 0) then
    for select LIQD_ITEM, LIQD_CONTRATO, LIQD_DIAS, LIQD_VALOR, LIQD_OBS
        from LIQUIDACION_RUTA_DET LD WHERE LD.liqr_id = :ID and ((LD.liqd_valor <> 0) or (ld.liqd_contrato is not null))
        ORDER BY LIQD_ITEM
        INTO :itemrec, :contrec, :diasrec, :valorrec, :OBSREC
        DO
        BEGIN
        CONTEST = '';
        SELECT FIRST 1 CC.cncl_estudiante FROM contratos_colegios CC WHERE CC.cncl_id = :contrec INTO :contest;
        SELECT CNCL_NUMERO FROM contratos_colegios WHERE CNCL_ID = :contrec INTO :contrec;
        IDFAC = 0;
        SELECT MAX(F.fact_id) FROM FACTURAS F WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND FACT_SUCURSAL = :contrec INTO :IDFAC;
        if (IDFAC <> 0) then
            BEGIN
            CONTFECR = NULL;
            SELECT MAX(RECA_FECHA) FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
                WHERE RD.rcde_iddoc = :IDFAC AND RD.rcde_tipodoc = 31 AND R.reca_id = RD.reca_id AND RECA_ANULADO = 'N' AND
                RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN INTO :contfecr;
            if (CONTFECR IS NULL) then
                BEGIN
                SELECT MAX(A.apcl_fecha) FROM aplicacion_cliente A, aplicacion_cliente_detalle AD
                    WHERE AD.acde_iddoc = :IDFAC AND AD.acde_tipodoc = 31 AND A.apcl_id = AD.apcl_id AND
                    A.apcl_anulado = 'N' and APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN INTO :contfecr;
                END
            END
        SUSPEND;
        END
  ELSE
    SUSPEND;
END^


ALTER PROCEDURE IMPR_LIQRUTAC_CONC (
    ID INTEGER)
RETURNS (
    ITEMCON INTEGER,
    CONCEPTO VARCHAR(60),
    CONCPAGO CHAR(1),
    VALORCON NUMERIC(18,2),
    OBSCON VARCHAR(1024))
AS
BEGIN
for select LIQC_ITEM, LIQC_CONCEPTO, LIQC_DB, LIQC_VALOR, LIQC_OBS
    from LIQUIDACION_RUTA_CONC LD WHERE LD.liqr_id = :ID and ld.liqc_valor <> 0
    ORDER BY LIQC_ITEM
    INTO :itemcon, :concepto, :concpago, :valorcon, :obscon
    DO
    BEGIN
    SELECT COTR_NOM FROM conceptos_transporte WHERE COTR_ID = :concepto INTO :concepto;
    SUSPEND;
    END
END^


ALTER PROCEDURE IMPR_LIQRUTAC_EFE (
    ID INTEGER)
RETURNS (
    ITEMEFE INTEGER,
    CONTRATO VARCHAR(60),
    VALOREFE NUMERIC(18,2),
    OBSEFE VARCHAR(1024))
AS
BEGIN
for select LIQE_ITEM, LIQE_CONTRATO, LIQE_VALOR, LIQE_OBS
    from LIQUIDACION_RUTA_EFE LD WHERE LD.liqr_id = :ID
    ORDER BY LIQE_ITEM
    INTO :itemefe, :contrato, :valorefe, :obsefe
    DO
    BEGIN
    SELECT CNCL_NUMERO FROM contratos_colegios WHERE CNCL_ID = :contrato INTO :contrato;
    SUSPEND;
    END
END^


ALTER PROCEDURE IMPR_LIQUIDACION (
    ID INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FECHA DATE,
    FECING DATE,
    DIASTOT INTEGER,
    MOTIVO VARCHAR(60),
    CONTRATO VARCHAR(60),
    TIPOCOT VARCHAR(60),
    CARGO VARCHAR(60),
    DEPARTAMENTO VARCHAR(60),
    SALARIO NUMERIC(18,2),
    DIASLAB INTEGER,
    FECCES DATE,
    DIASCES INTEGER,
    FECPRI DATE,
    DIASPRI INTEGER,
    FECVAC DATE,
    DIASVAC INTEGER,
    CODCONC INTEGER,
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    TOTPAGOS NUMERIC(18,2),
    TOTDESC NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    BASEVAC NUMERIC(18,2),
    BASEPRI NUMERIC(18,2))
AS
BEGIN
FOR SELECT N.conc_cod, N.noco_valor, C.conc_nombre, L.liqd_fecha, L.liqd_motivo, L.liqd_salario, L.liqd_diaslab, L.liqd_fecces,
    L.liqd_fecpri, L.liqd_fecvac, L.liqd_totpagos, L.liqd_totdesc, L.liqd_total, L.liqd_basevac, L.liqd_salariop, L.terc_nit,
    T.terc_nom, E.empl_fecing, E.empl_dpto, E.empl_cargo, E.empl_tipocont, E.tcot_cod
    FROM nomina_conceptos N, LIQUIDACION L, CONCEPTOS_NOMINA C, TERCEROS T, EMPLEADOS E
    WHERE L.liqd_nomid = N.nomi_id AND N.conc_cod = C.conc_cod AND T.terc_nit = L.terc_nit AND L.liqd_id = :ID
    AND ((c.conc_aporte = 'N') OR (c.conc_gtoempr = 'N')) AND T.terc_nit = E.terc_nit
    ORDER BY C.conc_deduc DESC, C.conc_orden
    INTO :codconc, :monto, :concepto, :fecha, :motivo, :salario, :diaslab, :fecces,
    :fecpri, :fecvac, :totpagos, :totdesc, :total, :basevac, :basepri, :NIT,
    :nombre, :fecing, :departamento, :cargo, :contrato, :TIPOCOT
    DO
    BEGIN
    SELECT D.dpto_nombre FROM departamento D WHERE D.dpto_cod = :departamento INTO :departamento;
    SELECT TCOT_NOMBRE FROM tipo_cotizante D WHERE TCOT_COD = :tipocot INTO :tipocot;
    if (contrato = 'D') then
        CONTRATO = 'TÃ©rmino fijo';
    if (contrato = 'I') then
        CONTRATO = 'TÃ©rmino indefinido';
    if (contrato = 'O') then
        CONTRATO = 'Obra y labor';
    if (contrato = 'C') then
        CONTRATO = 'Convenio asociaciÃ³n';
    if (contrato = 'A') then
        CONTRATO = 'Aprendizaje';
    execute procedure dias_entre_nomina(:fecing, :fecha) returning_values (:diastot);
    execute procedure dias_entre_nomina(:fecces, :fecha) returning_values (:diasces);
    execute procedure dias_entre_nomina(:fecpri, :fecha) returning_values (:diaspri);
    execute procedure dias_entre_nomina(:fecvac, :fecha) returning_values (:diasvac);
    SUSPEND;
    END
END^


ALTER PROCEDURE IMPR_MANIFIESTO (
    ID INTEGER)
RETURNS (
    REGION VARCHAR(3),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CODORIGEN VARCHAR(5),
    NOMORIGEN VARCHAR(60),
    CODDESTINO VARCHAR(5),
    NOMDESTINO VARCHAR(60),
    VEHICULO VARCHAR(15),
    VEHITIPO VARCHAR(30),
    VEHICAPA INTEGER,
    VEHIMARCA VARCHAR(60),
    VEHILINEA VARCHAR(60),
    VEHINUMINT VARCHAR(15),
    VEHIMODELO VARCHAR(60),
    VEHISERIE VARCHAR(20),
    VEHIREPOT VARCHAR(4),
    VEHICOLOR VARCHAR(60),
    VEHICARROC VARCHAR(60),
    VEHIREGNAL VARCHAR(20),
    VEHIPESOV NUMERIC(18,2),
    VEHISOAT VARCHAR(20),
    VEHISOATASEG VARCHAR(60),
    VEHIFECSOAT DATE,
    PROPNIT VARCHAR(20),
    PROPNOM VARCHAR(60),
    PROPDIR VARCHAR(60),
    PROPCIU VARCHAR(60),
    PROPTEL VARCHAR(40),
    TENENIT VARCHAR(20),
    TENENOM VARCHAR(60),
    TENEDIR VARCHAR(60),
    TENECIU VARCHAR(60),
    TENETEL VARCHAR(40),
    CONDNIT VARCHAR(20),
    CONDNOM VARCHAR(60),
    CONDDIR VARCHAR(60),
    CONDCIU VARCHAR(60),
    CONDTEL VARCHAR(40),
    CONDCATEGORIA VARCHAR(20),
    SEGUROCIA VARCHAR(60),
    SEGUROPOL VARCHAR(20),
    SEGUROVIG DATE,
    PAGOLUGAR VARCHAR(60),
    PAGOFECHA DATE,
    PAGOCARGUE VARCHAR(60),
    PAGODESCAR VARCHAR(60),
    FLETE NUMERIC(18,2),
    RETENPOR NUMERIC(9,2),
    RETENMON NUMERIC(18,2),
    DESCUENTO NUMERIC(18,2),
    NETO NUMERIC(18,2),
    ANTICIPO NUMERIC(18,2),
    APAGAR NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMREM INTEGER,
    PREFREM VARCHAR(4),
    NUMREM VARCHAR(8),
    CANTREM NUMERIC(18,2),
    UNIDREM VARCHAR(10),
    NATUREM INTEGER,
    EMPQREM INTEGER,
    PESOREM NUMERIC(18,2),
    PRODREM VARCHAR(15),
    DESCREM VARCHAR(60),
    VALORREM NUMERIC(18,2),
    REMITEN VARCHAR(60),
    DESTINA VARCHAR(60),
    DESTINO VARCHAR(60))
AS
declare variable NUMROWS INTEGER;
declare variable OTROS NUMERIC(18,2);
BEGIN
SELECT MANC_PREF, MANC_NUMERO, MANC_FECHA, MANC_REGION, MANC_ORIGEN, MANC_DESTINO, MANC_SEGCIA, MANC_SEGPOLIZA, MANC_SEGVIG,
    MANC_VEHICULO, V.vehi_tipo, V.vehi_capacidad, V.vehi_numero, V.vehi_tenedor, V.vehi_linea, V.vehi_marca, v.vehi_serie,
    V.vehi_modelo, V.vehi_registronc, V.vehi_pesov, V.vehi_soataseg, V.vehi_soat, V.vehi_fecsoat,
    V.vehi_repotenciado, V.vehi_carroc, V.vehi_color, M.manc_asoc, M.manc_conductor, MANC_LUGARPAGO, MANC_CARGEPAGO, manc_pagofec,
    MANC_DESCARGE, MANC_OBS, MANC_TOTAL-MANC_INGRESO, MANC_RTFTEP, MANC_RTFTEM, MANC_DESCTO, MANC_FLETENETO-MANC_INGRESO, MANC_ANTICIPO, MANC_APAGAR
  FROM manifiesto_carga M, VEHICULOS V
  WHERE M.manc_vehiculo = V.vehi_cod AND M.manc_id = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :region, :codorigen, :coddestino, :segurocia, :seguropol, :segurovig,
    :vehiculo, :vehitipo, :vehicapa, :vehinumint, :tenenit, :vehilinea, :vehimarca, :vehiserie,
    :vehimodelo, :vehiregnal, :vehipesov, :vehisoataseg, :vehisoat, :vehifecsoat,
    :vehirepot, :vehicarroc, :vehicolor, :propnit, :condnit, :pagolugar, :pagocargue, :pagofecha,
    :pagodescar, :obs, :flete, :retenpor, :retenmon, :descuento, :neto, :anticipo, :apagar;

  SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :codorigen INTO :nomorigen;
  SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :coddestino INTO :nomdestino;
  SELECT VHLI_NOM FROM vehiculo_linea WHERE VHLI_COD = :vehilinea INTO :vehilinea;
  SELECT VHMA_NOM FROM vehiculo_marca WHERE VHMA_COD = :vehimarca INTO :vehimarca;
  SELECT VHCA_NOM FROM vehiculo_carroceria WHERE VHCA_ID = :vehicarroc INTO :vehicarroc;
  SELECT ASEG_NOMBRE FROM aseguradora WHERE ASEG_NIT = :vehisoataseg INTO :vehisoataseg;
  SELECT ASEG_NOMBRE FROM aseguradora WHERE ASEG_NIT = :segurocia INTO :segurocia;
  SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :pagolugar INTO :pagolugar;

  SELECT TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE TERC_NIT = :propnit
    INTO :propnom, :propdir, :propciu, :proptel;
  SELECT TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE TERC_NIT = :tenenit
    INTO :tenenom, :tenedir, :teneciu, :tenetel;
  SELECT TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, terc_categoria FROM TERCEROS WHERE TERC_NIT = :condnit
    INTO :condnom, :conddir, :condciu, :condtel, :condcategoria;
  OTROS = NULL;
  SELECT SUM(MNCC_VALOR) FROM manifiestos_carga_conc WHERE MANC_ID = :ID INTO :OTROS;
  if (OTROS IS NULL) then
    OTROS = 0;
  retenmon = retenmon + OTROS;
  SELECT COUNT(MNCD_ITEM) FROM manifiesto_carga_det
    WHERE MANC_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT MNCD_ITEM, MNCD_PREF, MNCD_NUMERO, MNCD_CONCEPTO, MNCD_VALOR,
        R.cgrm_cant, R.cgrm_peso, R.cgrm_prod, R.cgrm_remnom, R.cgrm_desnom, C.ciud_nom, R.cgrm_unidad, R.cgrm_empaque, R.cgrm_naturaleza
        FROM manifiesto_carga_det D, carga_remesa R, CIUDADES C
        WHERE D.manc_id = :ID AND D.mncd_remesa = R.cgrm_id AND R.cgrm_destino = C.ciud_cod
        ORDER BY MNCD_ITEM
        INTO :itemrem, :prefrem, :numrem, :descrem, :valorrem,
        :cantrem, :pesorem, :prodrem, :remiten, :destina, :destino, :unidrem, :empqrem, :naturem
        DO
        BEGIN
        SUSPEND;
        END
  ELSE
    SUSPEND;
END^


ALTER PROCEDURE IMPR_NOTACRCL (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    MONTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    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(23))
AS
declare variable tipoAPL INTEGER;
declare variable numAPL VARCHAR(12) CHARACTER SET NONE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
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_RTCREE, NCCL_RTCREEM,
    NCCL_OBS, CLIE_COD, N.COBR_COD,N.NCCL_TIPODOCAPL,N.NCCL_NUMDOCAPL, nccl_dtoporc, nccl_dtomonto, nccl_adicional, nccl_extra
    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, :RTCREE, :RTCREEM,
    :OBS, :CLIE_COD, :COBR_COD,:tipoapl ,:numapl, :dtoporc, :dtomonto, :adicional, :extra;
if (COBR_COD IS NOT NULL) then
    SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :COBR_COD INTO :COBR_NOM;
TOTAL = MONTO + IVAMONTO + EXTRA;
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
if (fautorcree <= FECHA) then
    TOTALPAGAR = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
else
    TOTALPAGAR = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEM;
if (tipoAPL IS NOT NULL) then
    BEGIN
     SELECT (T.TIDO_NOMCORTO||'-'||:numAPL) FROM TIPO_DOCUMENTO T WHERE T.TIDO_COD = :tipoAPL
       INTO :DOCAPLICADO;
    END
  SUSPEND;
END^


ALTER PROCEDURE IMPR_NOTACRPR (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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),
    MONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    PROV_COD VARCHAR(15),
    PROV_CARTERA VARCHAR(60),
    PROV_CODIGOINT VARCHAR(15),
    DOCAPLICADO VARCHAR(21))
AS
declare variable tipoAPL INTEGER;
declare variable numAPL VARCHAR(12) CHARACTER SET NONE;
BEGIN
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, NCPR_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NCPR_MONTO,
    NCPR_IVAPORC, NCPR_IVAMONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, NCPR_RTCREE, NCPR_RTCREEM,
    NCPR_DTOFECHA, NCPR_DTOFPORC, NCPR_DTOFMONTO, NCPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT,N.ncpr_tipodocapl,N.ncpr_numdocapl
    FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T, PROVEEDORES P WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND NCPR_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, RTCREE, :RTCREEM,
    :DTOFECHA, :DTOPORC, :DTOMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT,:tipoapl ,:numapl;
  TOTAL = MONTO + IVAMONTO;
  TOTALPAGAR = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEM;
  if (tipoAPL IS NOT NULL) then
    BEGIN
     SELECT (T.TIDO_NOMCORTO||'-'||:numAPL) FROM TIPO_DOCUMENTO T WHERE T.TIDO_COD = :tipoAPL
       INTO :DOCAPLICADO;
    END
  SUSPEND;
END^


ALTER PROCEDURE IMPR_NOTADBCL (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO 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,
    MONTO NUMERIC(18,2),
    DTOP NUMERIC(9,2),
    DTOM NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    EXTRA 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),
    RTCREE NUMERIC(9,2),
    RTCREEM 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;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
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_RTCREE, NDCL_RTCREEM, NDCL_FECHADTO,
    NDCL_DTOFPORC, NDCL_DTOFMONTO, NDCL_OBS, CLIE_COD, N.COBR_COD, N.ndcl_tipodocapl, N.ndcl_numdocapl, c.zona_cod,
    N.ndcl_dtoporc, NDCL_DTOMONTO, NDCL_ADICIONAL, NDCL_EXTRA
    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, :RTCREE, :RTCREEM, :DTOFECHA,
    :DTOPORC, :DTOMONTO, :OBS, :CLIE_COD, :COBR_COD, :tipoapl ,:numapl, :zona_cod,
    :DTOP, :DTOM, :ADICIONAL, :EXTRA;
if (COBR_COD IS NOT NULL) then
    SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :COBR_COD INTO :COBR_NOM;
TOTAL = MONTO + IVAMONTO + EXTRA;
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
if (fautorcree <= FECHA) then
    TOTALPAGAR = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
else
    TOTALPAGAR = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEM;
    
if (tipoAPL IS NOT NULL) then
    BEGIN
     SELECT (T.TIDO_NOMCORTO||' - '||:numAPL) FROM TIPO_DOCUMENTO T WHERE T.TIDO_COD = :tipoAPL
       INTO :DOCAPLICADO;
    END
  SUSPEND;
END^


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


ALTER PROCEDURE IMPR_ORDENCMP (
    ID INTEGER,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    DIASVENCE INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREE NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPORC NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    FECHADTO DATE,
    CONDENTREGA VARCHAR(255),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    BOD1 VARCHAR(2),
    BOD2 VARCHAR(2),
    BOD3 VARCHAR(2),
    BOD4 VARCHAR(2),
    BOD5 VARCHAR(2),
    BOD6 VARCHAR(2),
    BOD7 VARCHAR(2),
    BOD8 VARCHAR(2),
    BOD9 VARCHAR(2),
    BOD0 VARCHAR(2),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    DTOIT1 NUMERIC(18,2),
    DTOIT2 NUMERIC(18,2),
    DTOIT3 NUMERIC(18,2),
    DTOIT1M NUMERIC(18,2),
    DTOIT2M NUMERIC(18,2),
    DTOIT3M NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CODIGOPR VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    DIASPAGO INTEGER,
    FAX VARCHAR(25),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    DTOITEM1 NUMERIC(18,2),
    DTOITEM2 NUMERIC(18,2),
    DTOITEM3 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    CANTB1 NUMERIC(18,4),
    CANTB2 NUMERIC(18,4),
    CANTB3 NUMERIC(18,4),
    CANTB4 NUMERIC(18,4),
    CANTB5 NUMERIC(18,4),
    CANTB6 NUMERIC(18,4),
    CANTB7 NUMERIC(18,4),
    CANTB8 NUMERIC(18,4),
    CANTB9 NUMERIC(18,4),
    CANTB0 NUMERIC(18,4),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
declare variable imptos char(1);
declare variable tarifa integer;
declare variable orden char(2);
declare variable i integer;
declare variable totalitem numeric(18,2);
declare variable ivaitem numeric(18,2);
declare variable cantitem numeric(18,2);
DECLARE VARIABLE ITEMFOR INTEGER;
BEGIN
  SELECT PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, O.BODE_COD, BODE_NOM, O.TERC_NIT, TERC_NOM, ORDC_COTIZACION, ORDC_IMPTOS,
    ORDC_DTOPORC, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_IVAMONTO, 
    ORDC_EXTRA, ORDC_DTOFPORC, ORDC_DTOFMONTO, ORDC_DTOFECHA, ORDC_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    ORDC_OBS,ORDC_DIASPAGO, ORDC_CONDENTREGA, ORDC_RTFTEPORC, ORDC_RTFTEMONTO, ORDC_RTIVAPORC, ORDC_RTIVAMONTO,
    ORDC_RTICAPORC, ORDC_RTICAMONTO, ORDC_RTCREE, ORDC_RTCREEM, ORDC_DTO1IT, ORDC_DTO2IT, ORDC_DTO3IT
    FROM ORDENES_COMPRA O, BODEGA B, TERCEROS T
    WHERE O.BODE_COD = B.BODE_COD AND O.TERC_NIT = T.TERC_NIT AND O.ORDC_ID = :ID
    into :PREF, :NUMERO, :FECHA, :DIASVENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :COTIZACION, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :DIASPAGO, :condentrega, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO,
    :RTEICAPORC, :RTEICAMONTO, :RTECREE, :RTECREEM, :dtoitem1, :dtoitem2, :dtoitem3;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - RTECREEM;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  PESOTOT = 0;
  VOLUMTOT = 0;

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


ALTER PROCEDURE IMPR_ORDENINT (
    ID INTEGER,
    MONEDAEX CHAR(1))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DIASVENCE INTEGER,
    DIASPAGO INTEGER,
    VENCE DATE,
    MONEDA VARCHAR(60),
    TRM DOUBLE PRECISION,
    IMPORTACION VARCHAR(20),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    REFERENCIA VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TOTALMON NUMERIC(18,2),
    TERMINOSPAGO VARCHAR(1024),
    ENTREGA VARCHAR(1024),
    ENTRNOM VARCHAR(60),
    ENTRDIR VARCHAR(255),
    ENTRCIU VARCHAR(60),
    ENTRPAIS VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ORDENID INTEGER,
    ORDENNRO VARCHAR(12),
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    ARTIPROV VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    PRUNMON NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CODIGOPR VARCHAR(20),
    ZONACOD VARCHAR(3),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CODPROY VARCHAR(4),
    CODCENTRO VARCHAR(4),
    NOMPROY VARCHAR(60),
    NOMCENTRO VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    NOMGRUPO VARCHAR(60),
    NOMSUBG VARCHAR(60),
    NOMMARC VARCHAR(60),
    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 TARIFA integer;
declare variable IVAITEM numeric(18,2);
declare variable ORDENCOD char(15);
declare variable TIVA integer;
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO','DOCUMENTOS','ORDENAR ITEMS AL IMPRIMIR DOCUMENTOS') returning_values (:ORDENCOD);
SELECT PREF_PRE, SLIM_NUMERO, SLIM_FECHA, SLIM_VALIDEZ, O.TERC_NIT, TERC_NOM, SLIM_REFERENCIA, O.slim_vence,
    SLIM_DTOPORC, SLIM_DTOMONTO, SLIM_ADICIONAL, SLIM_EXTRA, SLIM_TOTAL, SLIM_TOTMON, TIMO_COD,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, SLIM_PROY, SLIM_CENTRO,
    SLIM_OBS,SLIM_DIASPAGO, SLIM_IMPORTACION, SLIM_TERMINOSPAGO, SLIM_ENTREGA,
    SLIM_ENTRNOMBRE, SLIM_ENTRDIR, SLIM_ENTRCIU, SLIM_ENTRPAIS, TACA_MONTO
    FROM solicitud_importacion O, TERCEROS T
    WHERE O.TERC_NIT = T.TERC_NIT AND O.slim_id = :ID
    into :PREF, :NUMERO, :FECHA, :DIASVENCE, :NIT, :NOMTERCERO, :REFERENCIA, :vence, 
    :DTOPORC, :DTOMONTO, :ADICIONAL, :EXTRA, :TOTALFAC, :TOTALMON, :MONEDA,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CODPROY, :CODCENTRO,
    :OBS, :DIASPAGO, :IMPORTACION, :TERMINOSPAGO, :ENTREGA, :ENTRNOM, ENTRDIR, ENTRCIU, ENTRPAIS, :TRM;
    
SELECT TIMO_NOMBRE FROM tipos_moneda WHERE TIMO_COD = :MONEDA INTO :MONEDA;
nomproy = '';
SELECT PROY_NOM FROM PROYECTOS WHERE PROY_COD = :codproy INTO :nomproy;
nomcentro = '';
SELECT CENT_NOM FROM CENTROS WHERE PROY_COD = :codproy AND CENT_COD = :codcentro INTO :nomcentro;
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 - ADICIONAL + DTOMONTO;
TOTALPAGAR = TOTALFAC;
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
if ((MONEDAEX = 'S') AND (TRM <> 1)) then
    BEGIN
    SUBTOTAL = SUBTOTAL / TRM;
    DTOMONTO = DTOMONTO / TRM;
    ADICIONAL = ADICIONAL / TRM;
    EXTRA = EXTRA / TRM;
    TOTALFAC = TOTALFAC / TRM;
    TOTALPAGAR = TOTALPAGAR / TRM;
    END
if (ORDENCOD = 'NO') then
    FOR SELECT SLDE_ITEM, D.ARTI_COD, D.slde_codbar, D.slde_desc, D.slde_cant, D.slde_unidad, D.slde_prunit, D.slde_prunitmon,
      D.slde_dtoporc, D.slde_dtomonto, D.slde_totmon, D.slde_total, D.slde_obs, D.slde_ordenid, A.taiv_cod,
      GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, D.slde_codprov
      FROM solicitud_importacion_det D, ARTICULO A
      WHERE D.ARTI_COD = A.ARTI_COD AND D.slim_id = :ID
      ORDER BY SLDE_ITEM
      INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PRUNIT, :PRUNMON,
      :DTOITPORC, :DTOITMONTO, :TOTALMON, :TOTAL, :OBSITEM, :ORDENID, :TIVA,
      :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
      DO
      BEGIN
      EXECUTE PROCEDURE nombres_grupos_inventario (:grupo, :subgrupo, :marca)
          returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
      SELECT PREF_PRE || PEDI_NUMERO FROM PEDIDOS WHERE PEDI_ID = :ordenid INTO :ordennro;
      SELECT TAIV_PORC FROM TARIFA_IVA WHERE TAIV_COD = :TIVA INTO :ivaporc;
      PRNETO = PRUNIT - DTOITMONTO;
      IVAITEM = IVAPORC / 100;
      if (IVAPORC = 0) then
        BEGIN
        SUMAEX = SUMAEX + TOTAL;
        IVAITMONTO = 0;
        END
      ELSE
        IVAITMONTO = TOTAL * IVAITEM;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = 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 ((MONEDAEX = 'S') AND (TRM <> 1)) then
        BEGIN
        PRUNIT = PRUNIT / TRM;
        DTOITMONTO = DTOITMONTO / TRM;
        PRNETO = PRNETO / TRM;
        IVAITMONTO = IVAITMONTO / TRM;
        TOTAL = TOTAL / TRM;
        END
      SUSPEND;
      END
  if (ORDENCOD = 'CODIGO') then
    FOR SELECT SLDE_ITEM, D.ARTI_COD, D.slde_codbar, D.slde_desc, D.slde_cant, D.slde_unidad, D.slde_prunit, D.slde_prunitmon,
      D.slde_dtoporc, D.slde_dtomonto, D.slde_totmon, D.slde_total, D.slde_obs, D.slde_ordenid, A.taiv_cod,
      GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, D.slde_codprov
      FROM solicitud_importacion_det D, ARTICULO A
      WHERE D.ARTI_COD = A.ARTI_COD AND D.slim_id = :ID
      ORDER BY D.arti_cod
      INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PRUNIT, :PRUNMON,
      :DTOITPORC, :DTOITMONTO, :TOTALMON, :TOTAL, :OBSITEM, :ORDENID, :TIVA,
      :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
      DO
      BEGIN
      EXECUTE PROCEDURE nombres_grupos_inventario (:grupo, :subgrupo, :marca)
          returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
      SELECT PREF_PRE || PEDI_NUMERO FROM PEDIDOS WHERE PEDI_ID = :ordenid INTO :ordennro;
      SELECT TAIV_PORC FROM TARIFA_IVA WHERE TAIV_COD = :TIVA INTO :ivaporc;
      PRNETO = PRUNIT - DTOITMONTO;
      IVAITEM = IVAPORC / 100;
      if (IVAPORC = 0) then
        BEGIN
        SUMAEX = SUMAEX + TOTAL;
        IVAITMONTO = 0;
        END
      ELSE
        IVAITMONTO = TOTAL * IVAITEM;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = 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 ((MONEDAEX = 'S') AND (TRM <> 1)) then
        BEGIN
        PRUNIT = PRUNIT / TRM;
        DTOITMONTO = DTOITMONTO / TRM;
        PRNETO = PRNETO / TRM;
        IVAITMONTO = IVAITMONTO / TRM;
        TOTAL = TOTAL / TRM;
        END
      SUSPEND;
      END
  if (ORDENCOD = 'DESCRIPCION') then
    FOR SELECT SLDE_ITEM, D.ARTI_COD, D.slde_codbar, D.slde_desc, D.slde_cant, D.slde_unidad, D.slde_prunit, D.slde_prunitmon,
      D.slde_dtoporc, D.slde_dtomonto, D.slde_totmon, D.slde_total, D.slde_obs, D.slde_ordenid, A.taiv_cod,
      GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, D.slde_codprov
      FROM solicitud_importacion_det D, ARTICULO A
      WHERE D.ARTI_COD = A.ARTI_COD AND D.slim_id = :ID
      ORDER BY D.slde_desc, D.slde_item
      INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PRUNIT, :PRUNMON,
      :DTOITPORC, :DTOITMONTO, :TOTALMON, :TOTAL, :OBSITEM, :ORDENID, :TIVA,
      :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
      DO
      BEGIN
      EXECUTE PROCEDURE nombres_grupos_inventario (:grupo, :subgrupo, :marca)
          returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
      SELECT PREF_PRE || PEDI_NUMERO FROM PEDIDOS WHERE PEDI_ID = :ordenid INTO :ordennro;
      SELECT TAIV_PORC FROM TARIFA_IVA WHERE TAIV_COD = :TIVA INTO :ivaporc;
      PRNETO = PRUNIT - DTOITMONTO;
      IVAITEM = IVAPORC / 100;
      if (IVAPORC = 0) then
        BEGIN
        SUMAEX = SUMAEX + TOTAL;
        IVAITMONTO = 0;
        END
      ELSE
        IVAITMONTO = TOTAL * IVAITEM;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = 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 ((MONEDAEX = 'S') AND (TRM <> 1)) then
        BEGIN
        PRUNIT = PRUNIT / TRM;
        DTOITMONTO = DTOITMONTO / TRM;
        PRNETO = PRNETO / TRM;
        IVAITMONTO = IVAITMONTO / TRM;
        TOTAL = TOTAL / TRM;
        END
      SUSPEND;
      END
  if (ORDENCOD = 'UNIDAD') then
    FOR SELECT SLDE_ITEM, D.ARTI_COD, D.slde_codbar, D.slde_desc, D.slde_cant, D.slde_unidad, D.slde_prunit, D.slde_prunitmon,
      D.slde_dtoporc, D.slde_dtomonto, D.slde_totmon, D.slde_total, D.slde_obs, D.slde_ordenid, A.taiv_cod,
      GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, D.slde_codprov
      FROM solicitud_importacion_det D, ARTICULO A
      WHERE D.ARTI_COD = A.ARTI_COD AND D.slim_id = :ID
      ORDER BY D.slde_unidad, D.slde_desc, D.slde_item
      INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PRUNIT, :PRUNMON,
      :DTOITPORC, :DTOITMONTO, :TOTALMON, :TOTAL, :OBSITEM, :ORDENID, :TIVA,
      :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
      DO
      BEGIN
      EXECUTE PROCEDURE nombres_grupos_inventario (:grupo, :subgrupo, :marca)
          returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
      SELECT PREF_PRE || PEDI_NUMERO FROM PEDIDOS WHERE PEDI_ID = :ordenid INTO :ordennro;
      SELECT TAIV_PORC FROM TARIFA_IVA WHERE TAIV_COD = :TIVA INTO :ivaporc;
      PRNETO = PRUNIT - DTOITMONTO;
      IVAITEM = IVAPORC / 100;
      if (IVAPORC = 0) then
        BEGIN
        SUMAEX = SUMAEX + TOTAL;
        IVAITMONTO = 0;
        END
      ELSE
        IVAITMONTO = TOTAL * IVAITEM;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = 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 ((MONEDAEX = 'S') AND (TRM <> 1)) then
        BEGIN
        PRUNIT = PRUNIT / TRM;
        DTOITMONTO = DTOITMONTO / TRM;
        PRNETO = PRNETO / TRM;
        IVAITMONTO = IVAITMONTO / TRM;
        TOTAL = TOTAL / TRM;
        END
      SUSPEND;
      END
  if (ORDENCOD = 'GRUPO') then
    FOR SELECT SLDE_ITEM, D.ARTI_COD, D.slde_codbar, D.slde_desc, D.slde_cant, D.slde_unidad, D.slde_prunit, D.slde_prunitmon,
      D.slde_dtoporc, D.slde_dtomonto, D.slde_totmon, D.slde_total, D.slde_obs, D.slde_ordenid, A.taiv_cod,
      GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, D.slde_codprov
      FROM solicitud_importacion_det D, ARTICULO A
      WHERE D.ARTI_COD = A.ARTI_COD AND D.slim_id = :ID
      ORDER BY A.grup_cod, D.slde_desc,  D.slde_item
      INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PRUNIT, :PRUNMON,
      :DTOITPORC, :DTOITMONTO, :TOTALMON, :TOTAL, :OBSITEM, :ORDENID, :TIVA,
      :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
      DO
      BEGIN
      EXECUTE PROCEDURE nombres_grupos_inventario (:grupo, :subgrupo, :marca)
          returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
      SELECT PREF_PRE || PEDI_NUMERO FROM PEDIDOS WHERE PEDI_ID = :ordenid INTO :ordennro;
      SELECT TAIV_PORC FROM TARIFA_IVA WHERE TAIV_COD = :TIVA INTO :ivaporc;
      PRNETO = PRUNIT - DTOITMONTO;
      IVAITEM = IVAPORC / 100;
      if (IVAPORC = 0) then
        BEGIN
        SUMAEX = SUMAEX + TOTAL;
        IVAITMONTO = 0;
        END
      ELSE
        IVAITMONTO = TOTAL * IVAITEM;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = 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 ((MONEDAEX = 'S') AND (TRM <> 1)) then
        BEGIN
        PRUNIT = PRUNIT / TRM;
        DTOITMONTO = DTOITMONTO / TRM;
        PRNETO = PRNETO / TRM;
        IVAITMONTO = IVAITMONTO / TRM;
        TOTAL = TOTAL / TRM;
        END
      SUSPEND;
      END
END^


ALTER PROCEDURE IMPR_ORDENINV (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    FECLLEGA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODITEM VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    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),
    PESOUNIT NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    VOLUMUNIT NUMERIC(18,4),
    VOLUMTOT NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    LOTE VARCHAR(15),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
DECLARE VARIABLE ITEMFOR INTEGER;
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
BEGIN
PESOTOT = 0;
VOLUMTOT = 0;
SELECT PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC, ORIN_OBS, BODE_COD
    FROM ORDENES_INVENTARIO O WHERE ORIN_ID = :ID into
    :PREF, :NUMERO, :FECHA, :FECLLEGA, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :codbodega;
SELECT BODE_NOM FROM BODEGA WHERE BODE_COD = :codbodega INTO :nombodega;
SELECT COUNT(ORID_ITEM) from ordeninventario_detalle WHERE ORIN_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 18 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;

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, BODE_COD,
    (ARTI_PESO / 1000 * ORID_CANT * ORID_FACTOR), (ARTI_LARGO / 100 * ORID_FACTOR), (ARTI_ANCHO / 100 * ORID_FACTOR), (ARTI_ALTO / 100 * ORID_FACTOR)
    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, :boditem,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      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^


ALTER PROCEDURE IMPR_PARQUEADERO (
    PLACA VARCHAR(8))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    MARCA VARCHAR(60),
    COLOR VARCHAR(60),
    LINEA VARCHAR(60),
    TIPO VARCHAR(60),
    TARIFA NUMERIC(18,2),
    MAXC INTEGER,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FIJO NUMERIC(18,2),
    HORAINI TIME)
AS
declare variable ID INTEGER;
BEGIN
SELECT PARQ_ID, PARQ_FECINI, PARQ_HORAINI, TIVH_MAX, TIVH_TARIFA, TIVH_FIJO, TICH_NOM, PARQ_PREF, PARQ_NUMERO
    FROM PARQUEADERO P, TIPO_VEHICULO T
    WHERE P.tivh_cod = t.tivh_cod AND PARQ_VEHICULO = :PLACA AND PARQ_FACTURA = 0 AND PARQ_ANULADO = 'N'
    INTO :ID, :fecha, :HORAINI, :maxc, :tarifa, :FIJO, :TIPO, :PREF, :NUMERO;
if (ID <> 0) then
    BEGIN
    select vehi_color, vehi_linea, vehi_marca, TERC_NIT from vehiculos where vehi_cod = :PLACA
        INTO :color, :linea, :marca, :nit;
    select vhma_nom from vehiculo_marca where vhma_cod = :marca INTO :marca;
    select vhli_nom from vehiculo_linea where vhli_cod = :linea INTO :linea;
    select terc_nom from terceros where terc_nit = :nit INTO :nombre;
    END
SUSPEND;
END^


ALTER PROCEDURE IMPR_PEDIDO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VALIDEZ INTEGER,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUCUR VARCHAR(10),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    COTIZACION VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    RTEFTEPORC NUMERIC(9,2),
    RTEFTEMONTO NUMERIC(18,2),
    RTEIVAPORC NUMERIC(9,2),
    RTEIVAMONTO NUMERIC(18,2),
    RTEICAPORC NUMERIC(9,2),
    RTEICAMONTO NUMERIC(18,2),
    RTECREEP NUMERIC(9,2),
    RTECREEM NUMERIC(18,2),
    TOTALPAGAR NUMERIC(18,2),
    ENTREGA DATE,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    BODEGA VARCHAR(2),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    LISTAPR INTEGER,
    REFITEM VARCHAR(60),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    DTOIT1 NUMERIC(9,2),
    DTOIT2 NUMERIC(9,2),
    DTOIT3 NUMERIC(9,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    INSTRUCCIONES VARCHAR(255),
    DESPACHO VARCHAR(255),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    ORDENCLI VARCHAR(20),
    NUMORI VARCHAR(60),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    SUMA1 NUMERIC(18,2),
    SUMA2 NUMERIC(18,2),
    SUMA3 NUMERIC(18,2),
    SUMA4 NUMERIC(18,2),
    SUMA5 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    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(15);
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);
declare variable AUTORET varchar(10);
declare variable FAUTORET date;
declare variable AUTORCREE varchar(10);
declare variable FAUTORCREE date;
declare variable ITEMFOR integer;
declare variable AUX numeric(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ENTREGA,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3, PEDI_DESPACHO, PEDI_ORDENC, PEDI_NROORI,
    PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_RTCREE, PEDI_RTCREEM
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC, :ENTREGA,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m, :despacho, :ordencli, :NUMORI,
    :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :rtecreep, :rtecreem;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
SELECT COUNT(PEDE_ITEM) from PEDIDOS_DETALLE WHERE PEDI_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 34 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;

SELECT CLIE_COD, S.ZONA_COD, ZONA_NOM, CLIE_PEDIDOS
    FROM CLIENTES C, ZONAS Z, cliente_sucursales S
    WHERE C.TERC_NIT = :NIT AND S.ZONA_COD = Z.ZONA_COD AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucur
    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;
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
if (FECHA > fautoret) then
    if (FECHA >= fautorcree) then
        TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO;
    else
        TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - rtecreem;
ELSE
    if (FECHA >= fautorcree) then
        TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
    else
        TOTALPAGAR = TOTALFAC - RTEFTEMONTO - rtecreem - RTEIVAMONTO - RTEICAMONTO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
SUMA4 = 0;
SUMA5 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
IVA4 = 0;
IVA5 = 0;
ITEM = 0;
PESOTOT = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','PEDIDOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, PEDE_TIVA, 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;
        EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
            returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
        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;
        if ((:CANT = 0) OR (:CANT IS NULL)) then
            PESO = 0;
        else
            begin
            AUX = :CANT * FACTOR;
            PESO = (PESO / 1000) * AUX;
            end
        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) AND (IVAPORC = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
        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 = 'DESCRIPCION') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, PEDE_TIVA, 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_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;
        EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
            returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
        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;
        if ((:CANT = 0) OR (:CANT IS NULL)) then
            PESO = 0;
        else
            begin
            AUX = :CANT * FACTOR;
            PESO = (PESO / 1000) * AUX;
            end
        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) AND (IVAPORC = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0))  then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, PEDE_TIVA, 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;
        EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
            returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
        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;
        if ((:CANT = 0) OR (:CANT IS NULL)) then
            PESO = 0;
        else
            begin
            AUX = :CANT * FACTOR;
            PESO = (PESO / 1000) * AUX;
            end
        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) AND (IVAPORC = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
        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 = 'MARCA') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, PEDE_TIVA, 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 A.marc_cod, 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;
        EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
            returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
        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;
        if ((:CANT = 0) OR (:CANT IS NULL)) then
            PESO = 0;
        else
            begin
            AUX = :CANT * FACTOR;
            PESO = (PESO / 1000) * AUX;
            end
        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) AND (IVAPORC = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
        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 = 'STAND') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, PEDE_TIVA, 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_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;
        EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
            returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
        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;
        if ((:CANT = 0) OR (:CANT IS NULL)) then
            PESO = 0;
        else
            begin
            AUX = :CANT * FACTOR;
            PESO = (PESO / 1000) * AUX;
            end
        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) AND (IVAPORC = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0))  then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT PEDE_ITEM, D.ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, PEDE_TIVA, 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
        EXECUTE procedure nombres_grupos_inventario (GRUPO, SUBGRUPO, MARCA)
            returning_values (NOMGRUPO, NOMSUBG, NOMMARCA);
        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;
        if ((:CANT = 0) OR (:CANT IS NULL)) then
            PESO = 0;
        else
            begin
            AUX = :CANT * FACTOR;
            PESO = (PESO / 1000) * AUX;
            end
        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) AND (IVAPORC = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;
        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^


ALTER PROCEDURE IMPR_PENDIENTE (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    LOTE VARCHAR(15),
    VLOTE DATE,
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    REFITEM VARCHAR(60),
    BODITEM VARCHAR(2),
    STAND VARCHAR(20),
    PRUNIT NUMERIC(18,2),
    DTOITPORC NUMERIC(9,2),
    DTOITMONTO NUMERIC(18,2),
    PRNETOSINIVA NUMERIC(18,2),
    PRNETO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAITMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PESOTOT NUMERIC(18,4),
    CODIGOCL VARCHAR(20),
    ZONACOD VARCHAR(2),
    ZONANOM VARCHAR(60),
    DV CHAR(1),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    CONTACTO VARCHAR(60),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(3),
    NOMSUBG VARCHAR(30),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30),
    PESO NUMERIC(9,4),
    ANCHO NUMERIC(18,4),
    ALTO NUMERIC(18,4),
    LARGO NUMERIC(18,4),
    OBSITEM BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, F.pend_numero, F.pend_fecha, F.bode_cod, BODE_NOM, F.terc_nit, F.pend_nomcli, F.VEND_COD, VEND_NOMBRE,
    F.pend_factura, F.pend_ivainc, F.pend_ivamonto, F.pend_total, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, F.pend_obs, F.pend_sucursal
    FROM pendiente_ventas F, BODEGA B, VENDEDORES V, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.TERC_NIT = T.TERC_NIT AND F.pend_id = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR,
    :FACTURA, :IMPTOS, :IVAMONTO, :TOTALFAC, :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;

PESOTOT = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.pevd_item, D.ARTI_COD, D.pevd_corbar, SUBSTRING(D.pevd_desc FROM 1 FOR 60), D.pevd_cant, D.pevd_unidad, BODE_COD, D.pevd_lote,
        D.pevd_prunit, D.pevd_dtoporc, D.pevd_dtomonto, D.pevd_ivaporc, D.pevd_ivamonto, D.pevd_consumo, D.pevd_total, D.pevd_referencia,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, D.pevd_obs, D.pevd_factor
        FROM pendiente_ventas_detalle D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.pend_id = :ID
        ORDER BY D.pevd_corbar
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE,
        :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.pevd_item, D.ARTI_COD, D.pevd_corbar, SUBSTRING(D.pevd_desc FROM 1 FOR 60), D.pevd_cant, D.pevd_unidad, BODE_COD, D.pevd_lote,
        D.pevd_prunit, D.pevd_dtoporc, D.pevd_dtomonto, D.pevd_ivaporc, D.pevd_ivamonto, D.pevd_consumo, D.pevd_total, D.pevd_referencia,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, D.pevd_obs, D.pevd_factor
        FROM pendiente_ventas_detalle D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.pend_id = :ID
        ORDER BY D.pevd_unidad, D.pevd_corbar
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE,
        :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT D.pevd_item, D.ARTI_COD, D.pevd_corbar, SUBSTRING(D.pevd_desc FROM 1 FOR 60), D.pevd_cant, D.pevd_unidad, BODE_COD, D.pevd_lote,
        D.pevd_prunit, D.pevd_dtoporc, D.pevd_dtomonto, D.pevd_ivaporc, D.pevd_ivamonto, D.pevd_consumo, D.pevd_total, D.pevd_referencia,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, D.pevd_obs, D.pevd_factor
        FROM pendiente_ventas_detalle D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.pend_id = :ID
        ORDER BY D.pevd_item
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE,
        :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :obsitem, :FACTOR
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
END^


ALTER PROCEDURE IMPR_PLANCONCEPTO (
    IDDOC INTEGER)
RETURNS (
    ITEM INTEGER,
    CONCEPTO VARCHAR(60),
    VALOR NUMERIC(18,2))
AS
begin
    FOR SELECT PLPC_ITEM, COPL_NOM, PLPC_VALOR
        FROM planilla_pasajeros_con P, conceptos_planilla C
        WHERE P.plpa_id = :iddoc AND P.plpc_conc = C.copl_id
        ORDER BY PLPC_ITEM
        INTO :item, :concepto, :valor
        DO
        BEGIN
        SUSPEND;
        END
end^


ALTER PROCEDURE IMPR_PLANILLA (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NOMRUTA VARCHAR(60),
    ASESOR INTEGER,
    NOMASESOR VARCHAR(60),
    NITASOC VARCHAR(20),
    NOMBREASOC VARCHAR(60),
    VEHICULO VARCHAR(15),
    TIPOVEHI VARCHAR(30),
    CAPAVEHI INTEGER,
    NUMINTERNO VARCHAR(15),
    HORA TIME,
    NITCOND VARCHAR(20),
    NOMBRECOND VARCHAR(60),
    PASAJES NUMERIC(18,2),
    REMESAS NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    CONTRAE NUMERIC(18,2),
    NETO NUMERIC(18,2),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ITEMTIQ INTEGER,
    PREFTIQ VARCHAR(4),
    NUMTIQ VARCHAR(8),
    PASAJERO VARCHAR(60),
    RUTATIQ VARCHAR(60),
    PUESTO VARCHAR(10),
    CONTADOTIQ NUMERIC(18,2),
    CONTRAETIQ NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
declare variable FORMAP CHAR(1);
declare variable RUTA INTEGER;
BEGIN
  SELECT PLPA_PREF, PLPA_NUMERO, PLPA_FECHA, CORU_NOMBRE, PLPA_VEHICULO, PLPA_DESPACHA, D.vend_nombre,
        V.terc_nit, T.terc_nom, TV.tich_nom, V.vehi_capacidad, V.vehi_numero, P.plpa_hora,
        P.plpa_conductor, TC.terc_nom, P.plpa_pasaje, P.plpa_remesa, P.plpa_otros, P.plpa_contrae, P.plpa_neto,
        P.plpa_obs
  FROM planilla_pasajeros P, vendedores D, VEHICULOS V, CORREDOR_RUTA R, TERCEROS T, TIPO_VEHICULO TV, TERCEROS TC
  WHERE P.plpa_vehiculo = V.vehi_cod AND P.plpa_despacha = D.vend_cod AND P.plpa_ruta = R.coru_id and V.terc_nit = T.terc_nit
    AND P.plpa_conductor = TC.terc_nit AND V.vehi_tipo = TV.tivh_cod AND P.plpa_id = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMRUTA, :vehiculo, :asesor, :nomasesor,
        :nitasoc, :nombreasoc, :tipovehi, :capavehi, :numinterno, :hora,
        :nitcond, :nombrecond, :pasajes, :remesas, :otros, :contrae, :neto, :obs;
  SELECT COUNT(PLPA_ITEM) FROM planilla_pasajeros_det
    WHERE PLPA_ID = :ID INTO :NUMROWS;
  if (NUMROWS > 0) then
    FOR SELECT PLPA_ITEM, TIQP_PREF, TIQP_NUMERO, TIQP_NOMBRE, TIQP_PUESTO, PLPA_VALOR, TIQP_FORMAP, TIQP_RUTA
        FROM planilla_pasajeros_det D, tiquete_pasajero T
        WHERE D.plpa_id = :ID AND D.plpa_tiquete = T.tiqp_id
        ORDER BY PLPA_ITEM
        INTO :itemtiq, :preftiq, :numtiq, :pasajero, :puesto, :contadotiq, :formap, :ruta
        DO
        BEGIN
        SELECT RUTA_NOMBRE FROM ruta_pasajeros WHERE RUTA_ID = :RUTA INTO :rutatiq;
        if (FORMAP = 'R') then
            BEGIN
            /* CREDITO */
            Contraetiq = contadotiq;
            contadotiq = 0;
            END
        ELSE
            contraetiq = 0;
        SUSPEND;
        END
  ELSE
    SUSPEND;
END^


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),
    GASTO CHAR(1),
    TIPOCONC CHAR(15),
    NUMEMPL INTEGER,
    CTAEMPL VARCHAR(25),
    TOTALCAJA NUMERIC(18,2),
    TOTALBANCO NUMERIC(18,2),
    TOTALNOMI NUMERIC(18,2),
    NOMPER VARCHAR(60),
    CARGOEMPL VARCHAR(60),
    DEPTOEMPL VARCHAR(60),
    SECCEMPL VARCHAR(60),
    AREAEMPL VARCHAR(60),
    PROYECTO VARCHAR(4),
    CENTRO VARCHAR(4),
    NUMCOP INTEGER,
    NOMBRE_COPIA VARCHAR(60),
    DIASLAB INTEGER,
    SALARIO NUMERIC(18,2),
    BENEFICIO CHAR(1),
    BENPAG CHAR(1),
    BASE NUMERIC(18,2),
    CODDPTOEMPL INTEGER,
    CODSECCEMPL INTEGER,
    CODAREAEMPL INTEGER,
    ORDEN INTEGER,
    CANT NUMERIC(18,2),
    HORDIU NUMERIC(18,2),
    HORNOC NUMERIC(18,2),
    HORFDI NUMERIC(18,2),
    HORFNO NUMERIC(18,2),
    HORREN NUMERIC(18,2),
    HORREF NUMERIC(18,2),
    HORDOM NUMERIC(18,2),
    HORRFN NUMERIC(18,2),
    MHORDIU NUMERIC(18,2),
    MHORNOC NUMERIC(18,2),
    MHORFDI NUMERIC(18,2),
    MHORFNO NUMERIC(18,2),
    MHORREN NUMERIC(18,2),
    MHORREF NUMERIC(18,2),
    MHORDOM NUMERIC(18,2),
    MHORRFN NUMERIC(18,2),
    FORMPAGO CHAR(1))
AS
declare variable CODPERIODIC INTEGER;
declare variable nitant varchar(20);
declare variable nitnue varchar(20);
declare variable CONCDIAS 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;
IF (PAGO = 'N') THEN
  BEGIN
  FOR SELECT N.nomi_feccausa, N.nomi_obs, N.nomi_pagoglobal, N.nomi_periodo, N.nomi_ano, N.nomi_periodocidad
    FROM NOMINA N
    WHERE N.nomi_id = :ID
    INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :CODPERIODIC
    DO
    BEGIN
    SELECT P.ppag_nombre, PN.pnom_nombre FROM periodo_pago P, periodo_pago_nombre PN
        WHERE P.ppag_cod = :codperiodic AND PN.ppag_cod = P.ppag_cod AND PN.ppag_periodo = :periodo
        INTO :periodicidad, :NOMPER;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, nomina_detalle d
        WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOCO_BENPAG = 'S' AND NC.NOMI_ID = :id AND d.node_formpago = 'B' AND NC.terc_nit = d.terc_nit and d.nomi_id = nc.nomi_id
        INTO :totalbanco;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, nomina_detalle d
        WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOCO_BENPAG = 'S' AND NC.NOMI_ID = :id AND ((d.node_formpago <> 'B') or (D.node_formpago IS NULL)) AND NC.terc_nit = d.terc_nit and d.nomi_id = nc.nomi_id
        INTO :totalcaja;
    SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
        WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOCO_BENPAG = 'S' AND NOMI_ID = :id
        INTO :totalnomi;

    /* 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 ORDER BY T.TERC_NOM
        INTO :diaslab, :nitempl, :nombreempl
        DO
        BEGIN
        SELECT FIRST 1 CONC_COD FROM empleado_conceptos WHERE TERC_NIT = :NITEMPL AND ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903)) INTO :concdias;
        if (CODPERIODIC <> 4) then
            EXECUTE PROCEDURE DIAS_LABORADOS(:nitempl,:periodo,:fecha,'N',:concdias)returning_values(:diaslab);
        cargoempl = '';
        select e.empl_cargo, e.empl_cuenta, D.dpto_nombre, d.dpto_cod, E.empl_formpago, E.empl_secc, E.empl_area, E.proy_cod, E.cent_cod
            from EMPLEADOS e, DEPARTAMENTO D
            where D.dpto_cod = E.empl_dpto AND e.terc_nit = :nitempl
            into :cargoempl,:ctaempl,:deptoempl,:coddptoempl, :formpago, :codseccempl, :codareaempl, :proyecto, :centro;
        SELECT secc_nom FROM seccion WHERE dpto_cod = :coddptoempl AND secc_cod = :codseccempl INTO :seccempl;
        SELECT area_nombre FROM area WHERE dpto_cod = :coddptoempl AND secc_cod = :codseccempl AND area_cod = :codareaempl INTO :areaempl;
        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;
        /* HORAS EXTRAS */
        TIPOCONC = '1. DEVENGOS';
        HORDIU = 0;
        HORNOC = 0;
        HORFDI = 0;
        HORFNO = 0;
        HORREN = 0;
        HORREF = 0;
        HORDOM = 0;
        HORRFN = 0;
        mhordiu = 0;
        mhornoc = 0;
        mhorfdi = 0;
        mhorfno = 0;
        mhorren = 0;
        mhorref = 0;
        mhordom = 0;
        mhorrfn = 0;
        SELECT NOEX_DIUR, NOEX_NOCT, NOEX_FDIUR, NOEX_FNOCT, NOEX_RECNOCT, NOEX_RECFEST, NOEX_DOMIN, NOEX_RECFNOC, 
            NOEX_MDIUR, NOEX_MNOCT, NOEX_MFDIUR, NOEX_MFNOCT, NOEX_MRECNOCT, NOEX_MRECFEST, NOEX_MDOMIN, NOEX_MRECFNOC
            FROM nomina_horasext WHERE TERC_NIT = :nitempl AND NOEX_ANO = :ANO AND NOEX_PERIODIO = :PERIODO AND NOEX_PERIODICIDAD = :CODPERIODIC
            INTO :hordiu, :hornoc, :horfdi, :horfno, :horren, :horref, hordom, horrfn,
            :mhordiu, :mhornoc, :mhorfdi, :mhorfno, :mhorren, :mhorref, mhordom, mhorrfn;
        nomcortconc = 'H.E. DIA';
        nombreconc = nomcortconc;
        codconc = 0;
        cant = :hordiu;
        valor = :mhordiu;
        ORDEN = 1;
        if (VALOR <> 0) then
            SUSPEND;
        nomcortconc = 'H.E. NOC';
        nombreconc = nomcortconc;
        codconc = 0;
        cant = :hornoc;
        valor = :mhornoc;
        ORDEN = 1;
        if (VALOR <> 0) then
            SUSPEND;
        nomcortconc = 'H.E. FEST.';
        nombreconc = nomcortconc;
        codconc = 0;
        cant = :horfdi;
        valor = :mhorfdi;
        ORDEN = 1;
        if (VALOR <> 0) then
            SUSPEND;
        nomcortconc = 'H.E. FNOC';
        nombreconc = nomcortconc;
        codconc = 0;
        cant = :horfno;
        valor = :mhorfno;
        ORDEN = 1;
        if (VALOR <> 0) then
            SUSPEND;
        nomcortconc = 'REC. NOC';
        nombreconc = nomcortconc;
        codconc = 0;
        cant = :horren;
        valor = :mhorren;
        ORDEN = 1;
        if (VALOR <> 0) then
            SUSPEND;
        nomcortconc = 'REC. FEST.';
        nombreconc = nomcortconc;
        codconc = 0;
        cant = :horref;
        valor = :mhorref;
        ORDEN = 1;
        if (VALOR <> 0) then
            SUSPEND;
        nomcortconc = 'DOMINICAL';
        nombreconc = nomcortconc;
        codconc = 0;
        cant = :hordom;
        valor = :mhordom;
        ORDEN = 1;
        if (VALOR <> 0) then
            SUSPEND;
        nomcortconc = 'REC. F. NOC.';
        nombreconc = nomcortconc;
        codconc = 0;
        cant = :horrfn;
        valor = :mhorrfn;
        ORDEN = 1;
        if (VALOR <> 0) then
            SUSPEND;
        CANT = 0;
        HORDIU = 0;
        HORNOC = 0;
        HORFDI = 0;
        HORFNO = 0;
        HORREN = 0;
        HORREF = 0;
        HORDOM = 0;
        HORRFN = 0;
        mhordiu = 0;
        mhornoc = 0;
        mhorfdi = 0;
        mhorfno = 0;
        mhorren = 0;
        mhorref = 0;
        mhordom = 0;
        mhorrfn = 0;
        FOR SELECT NC.noco_valor, NC.noco_deduc, C.conc_nomcorto, C.conc_nombre, NC.conc_cod, NC.noco_prov, NC.noco_gtoempr, C.conc_orden+1, NC.noco_cant, NC.noco_benpag
          FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA C
          WHERE NC.nomi_id = :ID AND C.conc_cod = NC.conc_cod AND nc.terc_nit = :nitempl
          ORDER BY NC.NOCO_DEDUC, NC.conc_cod
          INTO :valor, :deduc, :nomcortconc, :nombreconc, :codconc, :prov, :gasto, :orden, :cant, :benpag
          DO
          BEGIN
          TIPOCONC = '1. DEVENGOS';
          if (DEDUC = 'S') then
            TIPOCONC = '2. DEDUCCIONES';
          if (GASTO = 'S') then
            TIPOCONC = '3. APORTES';
          if (PROV = 'S') then
            TIPOCONC = '4. PROVISIONES';
          IF (valor IS NULL) THEN
            valor = 0;
          SUSPEND;
          END
        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, N.nomi_periodocidad
      FROM NOMINA N
      WHERE N.nomi_id = :ID
      INTO :fecha, :observaciones, :pagoglobal, :periodo, :ano, :CODPERIODIC
      DO
      BEGIN
      SELECT P.ppag_nombre, PN.pnom_nombre FROM periodo_pago P, periodo_pago_nombre PN
          WHERE P.ppag_cod = :codperiodic AND PN.ppag_cod = P.ppag_cod AND PN.ppag_periodo = :periodo
          INTO :periodicidad, :NOMPER;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, nomina_detalle d
        WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOCO_BENPAG = 'S' AND NC.NOMI_ID = :id AND d.node_formpago = 'B' AND NC.terc_nit = d.terc_nit and d.nomi_id = nc.nomi_id
        INTO :totalbanco;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, nomina_detalle d
        WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOCO_BENPAG = 'S' AND NC.NOMI_ID = :id AND ((d.node_formpago <> 'B') or (D.node_formpago IS NULL)) AND NC.terc_nit = d.terc_nit and d.nomi_id = nc.nomi_id
        INTO :totalcaja;
      SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC
        WHERE NC.noco_prov = 'N' AND NOCO_GTOEMPR = 'N' AND NOCO_BENPAG = 'S' AND NOMI_ID = :id
        INTO :totalnomi;

      -- conceptos por empleado
      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.noco_gtoempr, NC.terc_nit, c.conc_benefic, NC.noco_base, C.conc_orden+1, NC.noco_cant, NC.noco_benpag
        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' and ((c.conc_benefic = 'N') or (c.conc_benpag = 'S'))
        ORDER BY T.terc_nom
        INTO :nitempl, :valor, :deduc, :nombreempl, :nomcortconc, :nombreconc, :codconc,
        :prov, :gasto, :nitnue, :beneficio,:base, :orden, :cant, :benpag
        DO
        BEGIN
        SELECT ND.node_diaslab FROM NOMINA_DETALLE ND WHERE NOMI_ID = :id AND ND.terc_nit = :nitempl INTO :diaslab;
        TIPOCONC = '1. DEVENGOS';
        if (DEDUC = 'S') then
            TIPOCONC = '2. DEDUCCIONES';
        if (GASTO = 'S') then
            TIPOCONC = '3. APORTES';
        if (PROV = 'S') then
            TIPOCONC = '4. PROVISIONES';
        cargoempl = '';
        ctaempl = '';
        deptoempl = '';
        coddptoempl = 0;
        SELECT FIRST 1 CONC_COD FROM empleado_conceptos WHERE TERC_NIT = :NITEMPL AND ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903)) INTO :concdias;
        if (CODPERIODIC <> 4) then
            EXECUTE PROCEDURE DIAS_LABORADOS(:nitempl,:periodo,:fecha,'N',:concdias)returning_values(:diaslab);
        select e.empl_cargo, e.empl_cuenta, D.dpto_nombre, d.dpto_cod, E.empl_formpago
            from EMPLEADOS e, DEPARTAMENTO D
            where D.dpto_cod = E.empl_dpto AND e.terc_nit = :nitempl into :cargoempl,:ctaempl,:deptoempl,:coddptoempl, :formpago;
        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;
        /* HORAS EXTRAS */
        HORDIU = 0;
        HORNOC = 0;
        HORFDI = 0;
        HORFNO = 0;
        HORREN = 0;
        HORREF = 0;
        HORDOM = 0;
        HORRFN = 0;
        mhordiu = 0;
        mhornoc = 0;
        mhorfdi = 0;
        mhorfno = 0;
        mhorren = 0;
        mhorref = 0;
        mhordom = 0;
        mhorrfn = 0;
        SELECT NOEX_DIUR, NOEX_NOCT, NOEX_FDIUR, NOEX_FNOCT, NOEX_RECNOCT, NOEX_RECFEST, NOEX_DOMIN, NOEX_RECFNOC, 
            NOEX_MDIUR, NOEX_MNOCT, NOEX_MFDIUR, NOEX_MFNOCT, NOEX_MRECNOCT, NOEX_MRECFEST, NOEX_MDOMIN, NOEX_MRECFNOC
            FROM nomina_horasext WHERE TERC_NIT = :nitempl AND NOEX_ANO = :ANO AND NOEX_PERIODIO = :PERIODO AND NOEX_PERIODICIDAD = :CODPERIODIC
            INTO :hordiu, :hornoc, :horfdi, :horfno, :horren, :horref, hordom, horrfn,
            :mhordiu, :mhornoc, :mhorfdi, :mhorfno, :mhorren, :mhorref, mhordom, mhorrfn;
        IF ((nitnue <> nitant) AND (nitnue IS NOT NULL)) THEN
            numempl = :numempl + 1;
        IF (valor IS NULL) THEN
            valor = 0;
        SUSPEND;
        END
      numempl = :numempl + 1;
      END
    END
END^


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^


ALTER PROCEDURE IMPR_PLANPROD (
    ID INTEGER,
    ENSPREV CHAR(1))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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);
declare variable IMPCOMP CHAR(2);
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);
execute procedure lee_configuracion ('INVENTARIO', 'ENSAMBLES', 'IMPRIMIR COMPOSION DE PRODUCTOS SIN ENSAMBLE DIRECTO EN LA ORDEN DE PRODUCCION') returning_values (:IMPCOMP);
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;
      if ((IMPCOMP = 'SI') or (exists (SELECT ENSA_ID FROM ENSAMBLES
        WHERE ARTI_COD = :CODPROD AND ENSA_TIPOREF = 27 AND ENSA_IDREF = :ID))) then
        BEGIN
        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
      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^


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;
declare variable IMPCOMP CHAR(2);
BEGIN
execute procedure lee_configuracion ('INVENTARIO', 'ENSAMBLES', 'IMPRIMIR COMPOSION DE PRODUCTOS SIN ENSAMBLE DIRECTO EN LA ORDEN DE PRODUCCION') returning_values (:IMPCOMP);
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;
      if ((IMPCOMP = 'SI') or (exists (SELECT ENSA_ID FROM ENSAMBLES
        WHERE ARTI_COD = :CODPROD AND ENSA_TIPOREF = 27 AND ENSA_IDREF = :ID))) then
        BEGIN
        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
END^


ALTER PROCEDURE IMPR_PLANPROD_ENT (
    ID INTEGER,
    ENSPREV CHAR(1))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
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_CODBAR
    into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :PESO, :OBSITEM
    do
    begin
    suspend;
    END
end^


ALTER PROCEDURE IMPR_PLANREMESA (
    IDDOC INTEGER)
RETURNS (
    ITEM INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    DESTINO VARCHAR(60),
    VALOR NUMERIC(18,2),
    CONTADO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    CONTRAE NUMERIC(18,2))
AS
declare variable FORMAP CHAR(1);
begin
    FOR SELECT PLPA_ITEM, CGRM_PREF, CGRM_NUMERO, PLPR_VALOR, PLPR_CONTRAE, CIUD_NOM, CGRM_FPAGO
        FROM planilla_pasajeros_rem P, carga_remesa R, CIUDADES C
        WHERE P.plpa_id = :iddoc AND P.plpr_remesa = R.cgrm_id AND R.cgrm_destino = C.ciud_cod
        ORDER BY PLPA_ITEM
        INTO :item, :pref, :numero, :valor, :contrae, :destino, :formap
        DO
        BEGIN
        contado = 0;
        credito = 0;
        contrae = 0;
        if (FORMAP = 'E') then
            Contrae = valor;
        if (FORMAP = 'R') then
            credito = valor;
        if (FORMAP = 'C') then
            contado = valor;
        SUSPEND;
        END
end^


ALTER PROCEDURE IMPR_PRODUCCION (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE IMPR_PRODUCCION_ENT (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE IMPR_PRODUCCION_ENTRADA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


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^


ALTER PROCEDURE IMPR_RECICAJA (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    RTCREE 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(8),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    RTCREEDOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    SALDODOC NUMERIC(18,2),
    ANTERDOC NUMERIC(18,2),
    DV CHAR(1))
AS
declare variable NUMROWS INTEGER;
declare variable TIPO integer;
declare variable IDDOC INTEGER;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
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_RTCREEM, RECA_DTOF, RECA_EXEDENTE, RECA_OBS, TERC_DV
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, :RTCREE, DSCTO, :excede, :OBS, DV;
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_RCREE, 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, :rtcreedoc, :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;
            if (fautoret > fecha) then
                ANTERDOC = ANTERDOC + rtcreedoc;
            SUSPEND;
            END
  ELSE
    SUSPEND;
END^


ALTER PROCEDURE IMPR_RECICJPAGO (
    ID INTEGER)
RETURNS (
    ITEMPAGO INTEGER,
    FORPAGO VARCHAR(30),
    BCOPAGO VARCHAR(2),
    CTAPAGO VARCHAR(20),
    NUMPAGO VARCHAR(20),
    FECPAGO DATE,
    MONTOPAGO NUMERIC(18,2))
AS
declare variable NUMROWS INTEGER;
BEGIN
FOR SELECT RCPA_ITEM, FOPA_NOM, RCPA_BANCO, RCPA_CUENTA,
    RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
    FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F
    WHERE P.RECA_ID = :ID AND F.FOPA_ID = P.FOPA_ID
    ORDER BY RCPA_ITEM
    INTO :ITEMPAGO, :FORPAGO, :BCOPAGO, :CTAPAGO, :NUMPAGO, :FECPAGO, :MONTOPAGO
    DO
        SUSPEND;
END^


ALTER PROCEDURE IMPR_RECIPROV (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    RCREE 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(8),
    SUCURSAL VARCHAR(10),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    RCREEDOC 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_RCREE, 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, :RCREE, :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, RPDE_RCREE
        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, :rcreedoc
        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^


ALTER PROCEDURE IMPR_REDENCION (
    ID INTEGER)
RETURNS (
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE IMPR_REMESA (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ASESOR INTEGER,
    NOMASESOR VARCHAR(60),
    VEHICULO VARCHAR(15),
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    TIPOVEHI VARCHAR(30),
    NUMINTERNO VARCHAR(15),
    REMITENOM VARCHAR(60),
    REMITECIU VARCHAR(60),
    REMITEDIR VARCHAR(60),
    REMITETEL VARCHAR(40),
    DESTINONOM VARCHAR(60),
    DESTINOCIU VARCHAR(60),
    DESTINODIR VARCHAR(60),
    DESTINOTEL VARCHAR(40),
    PRODUCTO VARCHAR(15),
    NOMPRODUCTO VARCHAR(60),
    CONCEPTO VARCHAR(255),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CANTIDAD NUMERIC(18,2),
    PESO NUMERIC(18,2),
    UNIDAD VARCHAR(10),
    EMPAQUE VARCHAR(60),
    NATURALEZA VARCHAR(25),
    VALOR NUMERIC(18,2),
    FLETE NUMERIC(18,2),
    SEGURO NUMERIC(18,2),
    DOMICILIO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    FORMAP CHAR(15))
AS
declare variable idempaq integer;
declare variable idnatur integer;
BEGIN
  SELECT CGRM_PREF, CGRM_NUMERO, CGRM_FECHA, CGRM_VEHICULO, CGRM_VEND, CGRM_FPAGO, CGRM_PROD,
    CGRM_CONC, CGRM_OBS, CGRM_REMNOM, CGRM_REMDIR, CO.ciud_nom, CGRM_REMTEL,
    CGRM_DESNOM, CGRM_DESDIR, CD.ciud_nom, CGRM_DESTEL, CGRM_CANT, CGRM_PESO, CGRM_VALOR, CGRM_SEGURO,
    CGRM_FLETE, CGRM_DOMICILIO, CGRM_TOTAL, CGRM_NIT, cgrm_unidad, cgrm_empaque, cgrm_naturaleza
  FROM carga_remesa R, ciudades CO, ciudades CD
  WHERE CO.ciud_cod = R.cgrm_origen AND CD.ciud_cod = R.cgrm_destino AND R.cgrm_id = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :vehiculo, :asesor, :formap, :producto,
    :concepto, :obs, :remitenom, :remitedir, :remiteciu, :remitetel,
    :destinonom, :destinodir,  :destinociu, :destinotel, :cantidad, :peso, :valor, :seguro,
    :flete, :domicilio, :total, :nit, :unidad, :idempaq, :idnatur;
  SELECT TV.tich_nom, V.vehi_numero FROM VEHICULOS V, TIPO_VEHICULO TV
    WHERE V.vehi_cod = :vehiculo AND V.vehi_tipo = TV.tivh_cod INTO :tipovehi, :numinterno;
  SELECT vend_nombre FROM vendedores WHERE vend_cod = :asesor INTO :nomasesor;
  SELECT cgpr_nombre FROM carga_productos WHERE cgpr_cod = :producto INTO :nomproducto;
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nit INTO :nomcliente;
  select FPRM_NOM FROM forma_pago_remesa WHERE FPRM_COD = :formap INTO :formap;
  SELECT empq_nom FROM empaques WHERE empq_id = :idempaq INTO :empaque;
  if (idnatur = 1) then
    naturaleza = 'Carga Normal';
  if (idnatur = 2) then
    naturaleza = 'Carga Peligrosa';
  if (idnatur = 3) then
    naturaleza = 'Carga Extradimensionada';
  if (idnatur = 4) then
    naturaleza = 'Carga Extrapesada';
  SUSPEND;
END^


ALTER PROCEDURE IMPR_REMIPROV (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    NUMPROV VARCHAR(15),
    COTIZACION VARCHAR(30),
    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),
    SERIALES VARCHAR(4096),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
DECLARE VARIABLE ITEMFOR INTEGER;
BEGIN
  SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA, F.BODE_COD, BODE_NOM, REPR_NUMPROV, REPR_COTIZACI, REPR_ORDEN, REPR_IMPTOS, 
    REPR_DTOPORC, REPR_DTOMONTO, REPR_ADICIONAL, REPR_IVAMONTO, REPR_EXTRA, REPR_TOTAL,
    F.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    REPR_OBS
    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;

SELECT COUNT(RPVD_ITEM) from remision_proveedor_det WHERE REPR_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 22 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
ITEM = 0;
if (orden = 'NO') then
  BEGIN
  FOR SELECT D.ARTI_COD, RPVD_CODBAR, SUBSTRING(RPVD_DESC FROM 1 FOR 60), RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, RPVD_PRUNIT,
    RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL, RPVD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RPVD_CODPROV
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY RPVD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      ITEM = ITEM + 1;
      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;
      EXECUTE PROCEDURE seriales_item_documento(22, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT D.ARTI_COD, RPVD_CODBAR, SUBSTRING(RPVD_DESC FROM 1 FOR 60), RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, RPVD_PRUNIT,
    RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL, RPVD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RPVD_CODPROV
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY D.bode_cod, RPVD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      ITEM = ITEM + 1;
      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;
      EXECUTE PROCEDURE seriales_item_documento(22, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
  END
END^


ALTER PROCEDURE IMPR_REMISION (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    VENDEDOR INTEGER,
    NOMVENDEDOR VARCHAR(60),
    PUNTOVTA INTEGER,
    NOMPUNTOVTA VARCHAR(30),
    CODBODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(30),
    COTIZACION VARCHAR(30),
    PEDIDO VARCHAR(30),
    FACTURA VARCHAR(30),
    SUBTOTAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    DESPACHO VARCHAR(255),
    TRANSPORTADOR VARCHAR(60),
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER,
    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),
    SERIALES VARCHAR(4096),
    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),
    SUMA4 NUMERIC(18,2),
    SUMA5 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    SUMAEX NUMERIC(18,2),
    SUMAGR NUMERIC(18,2),
    TOTCAJAS NUMERIC(18,2),
    VRFLETE NUMERIC(18,2),
    VEHICULO VARCHAR(15),
    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(15);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
DECLARE VARIABLE ITEMFOR INTEGER;
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','REMISIONES','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, REVT_VRFLETE, REVT_VEHICULO,
    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, :vrflete, :vehiculo,
    :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;
SELECT COUNT(RVDE_ITEM) from remisiones_venta_detalle WHERE REVT_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 32 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
SUMA4 = 0;
SUMA5 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
IVA4 = 0;
IVA5 = 0;
ITEM = 0;
totcajas = 0;
PESOTOT = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, RVDE_TIVA, 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;
        VLOTE = NULL;
        if (LOTE <> '') then
            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 ((TARIFA = 0) AND (IVAPORC = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;

        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
        EXECUTE PROCEDURE seriales_item_documento(32, :ID, :ITEM) returning_values (:SERIALES);
        SUSPEND;
        END
    END
ELSE if (ORDENCOD = 'DESCRIPCION') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, RVDE_TIVA, 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_DESC
        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;
        VLOTE = NULL;
        if (LOTE <> '') then
            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 ((TARIFA = 0) AND (IVAPORC = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;

        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
        EXECUTE PROCEDURE seriales_item_documento(32, :ID, :ITEM) returning_values (:SERIALES);
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, RVDE_TIVA, 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;
        VLOTE = NULL;
        if (LOTE <> '') then
            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 ((TARIFA = 0) AND (IVAPORC = 0)) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        if (TARIFA = 4) then
            BEGIN
            SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
            IVA4 = IVA4 + IVAITMONTO;
            END
        if (TARIFA = 5) then
            BEGIN
            SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
            IVA5 = IVA5 + IVAITMONTO;
            END
        SUMAGR = 0;
        if (IVA1 <> 0) then
            SUMAGR = SUMAGR + SUMA1;
        if (IVA2 <> 0) then
            SUMAGR = SUMAGR + SUMA2;
        if (IVA3 <> 0) then
            SUMAGR = SUMAGR + SUMA3;
        if (IVA4 <> 0) then
            SUMAGR = SUMAGR + SUMA4;
        if (IVA5 <> 0) then
            SUMAGR = SUMAGR + SUMA5;

        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
        EXECUTE PROCEDURE seriales_item_documento(32, :ID, :ITEM) returning_values (:SERIALES);
        SUSPEND;
        END
    END
  ELSE
      if (ORDENCOD = 'STAND') then
        BEGIN
        FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
            GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, RVDE_TIVA, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR, STAND_COD
            FROM REMISIONES_VENTA_DETALLE D, ARTICULO A, STANDS S
            WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID AND A.arti_cod = S.arti_cod AND S.stand_bodega = D.bode_cod
            ORDER BY D.bode_cod, S.stand_cod, D.rvde_desc
            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, :stand
            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;
            VLOTE = NULL;
            if (LOTE <> '') then
                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 ((TARIFA = 0) AND (IVAPORC = 0)) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            if (TARIFA = 4) then
                BEGIN
                SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
                IVA4 = IVA4 + IVAITMONTO;
                END
            if (TARIFA = 5) then
                BEGIN
                SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
                IVA5 = IVA5 + IVAITMONTO;
                END
            SUMAGR = 0;
            if (IVA1 <> 0) then
                SUMAGR = SUMAGR + SUMA1;
            if (IVA2 <> 0) then
                SUMAGR = SUMAGR + SUMA2;
            if (IVA3 <> 0) then
                SUMAGR = SUMAGR + SUMA3;
            if (IVA4 <> 0) then
                SUMAGR = SUMAGR + SUMA4;
            if (IVA5 <> 0) then
                SUMAGR = SUMAGR + SUMA5;
    
            totcajas = totcajas + cajas;
            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
            EXECUTE PROCEDURE seriales_item_documento(32, :ID, :ITEM) returning_values (:SERIALES);
            SUSPEND;
            END
        END
      ELSE
        BEGIN
        FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
            GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, RVDE_TIVA, 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;
            VLOTE = NULL;
            if (LOTE <> '') then
                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 ((TARIFA = 0) AND (IVAPORC = 0)) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
                IVA3 = IVA3 + IVAITMONTO;
                END
            if (TARIFA = 4) then
                BEGIN
                SUMA4 = SUMA4 + TOTAL - IVAITMONTO;
                IVA4 = IVA4 + IVAITMONTO;
                END
            if (TARIFA = 5) then
                BEGIN
                SUMA5 = SUMA5 + TOTAL - IVAITMONTO;
                IVA5 = IVA5 + IVAITMONTO;
                END
            SUMAGR = 0;
            if (IVA1 <> 0) then
                SUMAGR = SUMAGR + SUMA1;
            if (IVA2 <> 0) then
                SUMAGR = SUMAGR + SUMA2;
            if (IVA3 <> 0) then
                SUMAGR = SUMAGR + SUMA3;
            if (IVA4 <> 0) then
                SUMAGR = SUMAGR + SUMA4;
            if (IVA5 <> 0) then
                SUMAGR = SUMAGR + SUMA5;
            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
            EXECUTE PROCEDURE seriales_item_documento(32, :ID, :ITEM) returning_values (:SERIALES);
            SUSPEND;
            END
        END
END^


ALTER PROCEDURE IMPR_RESERVA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE 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),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15))
AS
declare variable LISTA CHAR(3);
declare variable ORDENCOD CHAR(15);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO','DOCUMENTOS','ORDENAR ITEMS AL IMPRIMIR DOCUMENTOS') returning_values (:ORDENCOD);
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
SELECT PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_VENCE, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC, RESE_OBS
    FROM RESERVAS R, BODEGA B WHERE R.BODE_COD = B.BODE_COD AND R.RESE_ID = :ID into
    :PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :NOMTERCERO, :OBS;
ITEM = 0;
if (ORDENCOD = 'NO') then
  FOR SELECT 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 :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
    DO
      BEGIN
      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;
      SUSPEND;
      END
if (ORDENCOD = 'CODIGO') then
  FOR SELECT 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 D.arti_cod, RSDE_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
    DO
      BEGIN
      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;
      SUSPEND;
      END
if (ORDENCOD = 'DESCRIPCION') then
  FOR SELECT 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 D.rsde_desc, RSDE_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
    DO
      BEGIN
      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;
      SUSPEND;
      END
if (ORDENCOD = 'UNIDAD') then
  FOR SELECT 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 D.rsde_unidad, D.rsde_desc, RSDE_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
    DO
      BEGIN
      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;
      SUSPEND;
      END
if (ORDENCOD = 'GRUPO') then
  FOR SELECT 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 A.grup_cod, A.subg_cod, D.rsde_desc, RSDE_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
    DO
      BEGIN
      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;
      SUSPEND;
      END
END^


ALTER PROCEDURE IMPR_REVPRECIOS (
    ID INTEGER)
RETURNS (
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE IMPR_RUTERO (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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,
    TIPODOC INTEGER,
    NOMTIPO VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    FECDOC DATE,
    NITCLIEN VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMCLIEN VARCHAR(60),
    DIRCLIEN VARCHAR(60),
    TELCLIEN VARCHAR(40),
    URGENTE CHAR(1),
    VEND INTEGER,
    NOMVEND VARCHAR(60),
    ZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    MONTO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    NETO NUMERIC(18,2),
    PESOTOT NUMERIC(18,2),
    CAJAS NUMERIC(18,2))
AS
declare variable IDDOC INTEGER;
declare variable IDREM 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_TIPODOC, RUTD_FACTID, RUTD_REMID, RUTD_PREF, RUTD_NUMERO, RUTD_NIT, RUTD_NOMCLI,
    RUTD_VALOR, RUTD_CAJAS, RUTD_OBS, RUTD_URGENTE
    FROM rutero_detalle WHERE RUTE_ID = :ID ORDER BY RUTD_ITEM
    INTO :ITEMDOC, :tipodoc, :IDDOC, :IDREM, :PREFDOC, :NUMDOC, :nitclien, :nomclien, :monto, :cajas, :obs, :urgente
    DO
    BEGIN
    SELECT T.tido_nomcorto FROM tipo_documento T WHERE TIDO_COD = :tipodoc INTO :nomtipo;
    if (tipodoc = 31) then
        BEGIN
        SELECT FACT_SUCURSAL, VEND_COD, FACT_FECHA, FACT_TOTAL-FACT_IVAMONTO, FACT_TOTAL-fact_rtftemonto-F.fact_rtivamonto-F.fact_rticamonto
            FROM FACTURAS F
            WHERE FACT_ID = :iddoc INTO :sucursal, :vend, :FECDOC, :BASE, :NETO;
        SELECT SUM(FADE_CANT*FADE_FACTOR*ARTI_PESO) FROM FACTURAS_DETALLE D, ARTICULO A
            WHERE D.arti_cod = A.arti_cod AND D.fact_id = :iddoc INTO :PESOTOT;
        END
    else
        BEGIN
        SELECT REVT_SUCURSAL, VEND_COD, REVT_FECHA, REVT_TOTAL-REVT_IVAMONTO, REVT_TOTAL FROM remisiones_venta
            WHERE REVT_ID = :idrem INTO :sucursal, :vend, :FECDOC, :BASE, :NETO;
        SELECT SUM(RVDE_CANT*RVDE_FACTOR*ARTI_PESO) FROM remisiones_venta_detalle D, ARTICULO A
            WHERE D.arti_cod = A.arti_cod AND D.revt_id = :idrem INTO :PESOTOT;
        END
    if (PESOTOT IS NULL) then
        PESOTOT = 0;
    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^


ALTER PROCEDURE IMPR_SALIDA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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,
    SERIALES VARCHAR(4096),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
DECLARE VARIABLE ITEMFOR INTEGER;
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);
declare variable FACTOR NUMERIC(18,2);
declare variable ORDENCOD CHAR(15);
declare variable LISTAC INTEGER;
declare variable AUX NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO','DOCUMENTOS','ORDENAR ITEMS AL IMPRIMIR DOCUMENTOS') returning_values (:ORDENCOD);
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('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
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;
SELECT COUNT(SADE_ITEM) from salidas_detalle WHERE SALI_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 12 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
if (ORDENCOD = 'NO') 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_factor,
    (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, :FACTOR,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      execute procedure costo_promedio_unidad(:articulo, :fecha,  :unidad) returning_values (:costo);
      TOTAL = CANT * COSTO;
      if (IMPTOS = 'S') Then
        begin
        COSTO = COSTO * ( 1 + IVAPORC / 100);
        if (ICOINC = 'SI') Then
            BEGIN
            COSTO = COSTO + (CONSUMO * FACTOR);
            TOTAL = CANT * COSTO;
            TOTALITEM = TOTAL;
            AUX = CONSUMO * CANT * FACTOR;
            IVAMONTO = (TOTAL - (AUX)) / (100 + IVAPORC) * IVAPORC;
            END
        else
            begin
            AUX = CONSUMO * CANT * FACTOR;
            IVAMONTO = ((TOTAL - (AUX)) / 100) * IVAPORC;
            TOTALITEM = TOTAL + CONSUMO * CANT;
            end
        end
      ELSE
        BEGIN
        AUX = CONSUMO * CANT * FACTOR;
        IVAMONTO = (TOTAL - (AUX)) * IVAPORC / 100;
        TOTALITEM = TOTAL + IVAMONTO;
        END
      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;
      EXECUTE PROCEDURE seriales_item_documento(12, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'CODIGO') 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_factor,
    (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 D.ARTI_COD, SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :FACTOR,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      execute procedure costo_promedio_unidad(:articulo, :fecha,  :unidad) returning_values (:costo);
      TOTAL = CANT * COSTO;
      if (IMPTOS = 'S') Then
        begin
        COSTO = COSTO * ( 1 + IVAPORC / 100);
        if (ICOINC = 'SI') Then
            BEGIN
            COSTO = COSTO + (CONSUMO * FACTOR);
            TOTAL = CANT * COSTO;
            TOTALITEM = TOTAL;
            IVAMONTO = (TOTAL - (CONSUMO * CANT * FACTOR)) / (100 + IVAPORC) * IVAPORC;
            END
        else
            begin
            IVAMONTO = ((TOTAL - (CONSUMO * CANT * FACTOR)) / 100) * IVAPORC;
            TOTALITEM = TOTAL + CONSUMO * CANT;
            end
        end
      ELSE
        BEGIN
        IVAMONTO = (TOTAL - (CONSUMO * CANT * FACTOR)) * IVAPORC / 100;
        TOTALITEM = TOTAL + IVAMONTO;
        END
      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;
      EXECUTE PROCEDURE seriales_item_documento(12, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'DESCRIPCION') 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_factor,
    (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_DESC, SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :FACTOR,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      execute procedure costo_promedio_unidad(:articulo, :fecha,  :unidad) returning_values (:costo);
      TOTAL = CANT * COSTO;
      if (IMPTOS = 'S') Then
        begin
        COSTO = COSTO * ( 1 + IVAPORC / 100);
        if (ICOINC = 'SI') Then
            BEGIN
            COSTO = COSTO + (CONSUMO * FACTOR);
            TOTAL = CANT * COSTO;
            TOTALITEM = TOTAL;
            IVAMONTO = (TOTAL - (CONSUMO * CANT * FACTOR)) / (100 + IVAPORC) * IVAPORC;
            END
        else
            begin
            IVAMONTO = ((TOTAL - (CONSUMO * CANT * FACTOR)) / 100) * IVAPORC;
            TOTALITEM = TOTAL + CONSUMO * CANT;
            end
        end
      ELSE
        BEGIN
        IVAMONTO = (TOTAL - (CONSUMO * CANT * FACTOR)) * IVAPORC / 100;
        TOTALITEM = TOTAL + IVAMONTO;
        END
      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;
      EXECUTE PROCEDURE seriales_item_documento(12, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'UNIDAD') 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_factor,
    (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_UNIDAD, SADE_DESC, SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :FACTOR,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      execute procedure costo_promedio_unidad(:articulo, :fecha,  :unidad) returning_values (:costo);
      TOTAL = CANT * COSTO;
      if (IMPTOS = 'S') Then
        begin
        COSTO = COSTO * ( 1 + IVAPORC / 100);
        if (ICOINC = 'SI') Then
            BEGIN
            COSTO = COSTO + (CONSUMO * FACTOR);
            TOTAL = CANT * COSTO;
            TOTALITEM = TOTAL;
            IVAMONTO = (TOTAL - (CONSUMO * CANT * FACTOR)) / (100 + IVAPORC) * IVAPORC;
            END
        else
            begin
            IVAMONTO = ((TOTAL - (CONSUMO * CANT * FACTOR)) / 100) * IVAPORC;
            TOTALITEM = TOTAL + CONSUMO * CANT;
            end
        end
      ELSE
        BEGIN
        IVAMONTO = (TOTAL - (CONSUMO * CANT * FACTOR)) * IVAPORC / 100;
        TOTALITEM = TOTAL + IVAMONTO;
        END
      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;
      EXECUTE PROCEDURE seriales_item_documento(12, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'GRUPO') 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_factor,
    (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 a.grup_cod, a.subg_cod, d.sade_desc, SADE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :FACTOR,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      execute procedure costo_promedio_unidad(:articulo, :fecha,  :unidad) returning_values (:costo);
      TOTAL = CANT * COSTO;
      if (IMPTOS = 'S') Then
        begin
        COSTO = COSTO * ( 1 + IVAPORC / 100);
        if (ICOINC = 'SI') Then
            BEGIN
            COSTO = COSTO + (CONSUMO * FACTOR);
            TOTAL = CANT * COSTO;
            TOTALITEM = TOTAL;
            IVAMONTO = (TOTAL - (CONSUMO * CANT * FACTOR)) / (100 + IVAPORC) * IVAPORC;
            END
        else
            begin
            IVAMONTO = ((TOTAL - (CONSUMO * CANT * FACTOR)) / 100) * IVAPORC;
            TOTALITEM = TOTAL + CONSUMO * CANT;
            end
        end
      ELSE
        BEGIN
        IVAMONTO = (TOTAL - (CONSUMO * CANT * FACTOR)) * IVAPORC / 100;
        TOTALITEM = TOTAL + IVAMONTO;
        END
      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;
      EXECUTE PROCEDURE seriales_item_documento(12, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
END^


ALTER PROCEDURE IMPR_SORTEO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    PREMIO VARCHAR(60),
    TEXTO VARCHAR(255),
    MONTO NUMERIC(18,2),
    FECFAC DATE,
    HORAFAC TIME,
    NUMFAC VARCHAR(12))
AS
BEGIN
FOR SELECT SORT_PREF, SORT_NUMERO, SORC_FECHA, S.TERC_NIT, SORT_NOMBRE, SORT_MONTO, SORC_TEXTO, SORC_PREMIO,
    T.terc_dir, T.terc_ciu, T.terc_tel, F.fact_fecha, A.audi_hora, F.pref_pre || F.fact_numero
    FROM sorteo_factura S, TERCEROS T, sorteos_configuracion C, facturas F, AUDITORIA A
    WHERE SORT_IDFACT = :ID AND S.terc_nit = T.terc_nit AND S.sort_pref = C.sorc_pref AND
    S.sort_idfact = F.fact_id AND F.fact_id = A.audi_iddoc AND A.tido_cod = 31 AND A.audi_oper = 'I'
    into :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :MONTO, :TEXTO, :PREMIO,
    :DIRECCION, :CIUDAD, :TELEFONO, :FECFAC, :HORAFAC, :NUMFAC
    DO
    SUSPEND;
END^


ALTER PROCEDURE IMPR_TAXONOMIA (
    IDTAX INTEGER,
    IDENC INTEGER,
    FECHA CHAR(8))
RETURNS (
    TITULO VARCHAR(100),
    FECHAA CHAR(8),
    ITEM INTEGER,
    NIVEL INTEGER,
    NOMBRE2 VARCHAR(255),
    NOMBRE3 VARCHAR(255),
    NOMBRE4 VARCHAR(255),
    NOMBRE5 VARCHAR(255),
    NOMBRE VARCHAR(255),
    SALDO2 NUMERIC(18,2),
    SALDO3 NUMERIC(18,2),
    SALDO4 NUMERIC(18,2),
    SALDO5 NUMERIC(18,2),
    VALOR NUMERIC(18,2),
    SALDO2A NUMERIC(18,2),
    SALDO3A NUMERIC(18,2),
    SALDO4A NUMERIC(18,2),
    SALDO5A NUMERIC(18,2),
    VALORA NUMERIC(18,2))
AS
declare variable tipo integer;
declare variable saldo numeric(18,2);
declare variable saldoa numeric(18,2);
declare variable INST INTEGER;
declare variable ITE5 INTEGER;
declare variable ITE4 INTEGER;
declare variable ITE3 INTEGER;
declare variable ITE2 INTEGER;
declare variable CUENTA VARCHAR(20);
begin
INST = gen_id(id_taxinst, 1);
EXECUTE PROCEDURE fecha_y_numero_conta(FECHA, 1) returning_values (FECHA);
EXECUTE PROCEDURE fecha_y_numero_conta(FECHA, -360) returning_values (FECHAA);
SELECT TE.taxe_nombre FROM taxonomia_encabeza TE WHERE TAXO_ID = :idtax AND TAXE_ID = :idenc INTO :titulo;
/* LLENE EL NIVEL 4 */
for select d.taxd_item, d.taxd_nombre from taxonomia_detalle d
    where d.taxo_id = :idtax and d.taxe_id = :idenc and d.taxd_nivel >= 4 AND
    NOT EXISTS (SELECT D2.taxd_item FROM TAXONOMIA_DETALLE D2
        WHERE d2.taxo_id = :idtax and d2.taxe_id = :idenc and D2.taxd_padre = D.taxd_item)
    into :item, :nombre
    do
    begin
    VALOR = 0;
    VALORA = 0;
    for select cuen_cod, taxc_tipo from taxonomia_cuentas where taxo_id = :idtax and taxe_id = :idenc and taxd_id = :item
        into :cuenta, :tipo
        do
        begin
        if ((tipo = 1) or (tipo = 2))  then
            BEGIN
            execute procedure saldo_cuenta_niif(:cuenta, :fecha) returning_values (:saldo);
            execute procedure saldo_cuenta_niif(:cuenta, :fechaa) returning_values (:saldoa);
            if (tipo = 2) then
                begin
                saldo = saldo * -1;
                saldo = saldoa * -1;
                end
            END
        VALOR = VALOR + SALDO;
        VALORA = VALORA + SALDOA;
        end
    INSERT INTO taxonomia_instancia (TAIN_ID, TAXO_ID, TAXE_ID, TAXD_ID, MONTO, TAIN_MONTOA)
        VALUES (:inst, :idtax, :idenc, :item, :VALOR, :VALORA);
    END
FOR SELECT d.taxd_nombre, d.taxd_item from taxonomia_detalle d
    where d.taxo_id = :idtax and d.taxe_id = :idenc and d.taxd_nivel = 2
    ORDER BY D.taxd_item INTO :nombre2, :ite2
    DO
    BEGIN
    SALDO2 = 0;
    SALDO2A = 0;
    FOR SELECT d.taxd_nombre, d.taxd_item from taxonomia_detalle d
        where d.taxo_id = :idtax and d.taxe_id = :idenc and d.taxd_nivel = 3 AND D.taxd_padre = :ite2
        ORDER BY D.taxd_item INTO :nombre3, :ite3
        DO
        BEGIN
        SALDO3 = 0;
        SALDO3A = 0;
        FOR SELECT D.taxd_item, d.taxd_nombre from taxonomia_detalle d
            where d.taxo_id = :idtax and d.taxe_id = :idenc and d.taxd_nivel = 4 AND D.taxd_padre = :ite3
            ORDER BY D.taxd_item INTO :ite4, :nombre4
            DO
            BEGIN
            VALOR = 0;
            VALORA = 0;
            if (EXISTS (SELECT D2.taxd_item FROM TAXONOMIA_DETALLE D2
                WHERE taxo_id = :idtax and taxe_id = :idenc and D2.taxd_padre = :ite4)) then
                BEGIN
                SALDO4 = 0;
                SALDO4A = 0;
                FOR SELECT D.taxd_item, d.taxd_nombre from taxonomia_detalle d
                    where d.taxo_id = :idtax and d.taxe_id = :idenc and d.taxd_nivel = 5 AND D.taxd_padre = :ite4
                    ORDER BY D.taxd_item INTO :ite5, :nombre5
                    DO
                    BEGIN
                    VALOR = 0;
                    VALORA = 0;
                    if (EXISTS (SELECT D2.taxd_item FROM TAXONOMIA_DETALLE D2
                        WHERE taxo_id = :idtax and taxe_id = :idenc and D2.taxd_padre = :ite5)) then
                        BEGIN
                        SALDO5 = 0;
                        SALDO5A = 0;
                        FOR SELECT D.taxd_item, d.taxd_nombre from taxonomia_detalle d
                            where d.taxo_id = :idtax and d.taxe_id = :idenc and d.taxd_nivel = 6 AND D.taxd_padre = :ite5
                            ORDER BY D.taxd_item INTO :item, :nombre
                            DO
                            BEGIN
                            VALOR = 0;
                            VALORA = 0;
                            SELECT MONTO, TAIN_MONTOA FROM taxonomia_instancia WHERE TAIN_ID = :inst AND taxo_id = :idtax and taxe_id = :idenc AND TAXD_ID = :ITEM
                                INTO :valor, :valora;
                            SALDO5 = SALDO5 + VALOR;
                            SALDO5A = SALDO5A + VALORA;
                            NIVEL = 6;
                            SUSPEND;
                            END
                        END
                    ELSE
                        BEGIN
                        ITEM = ITE5;
                        NOMBRE = NOMBRE5;
                        NOMBRE5 = NULL;
                        SELECT MONTO, TAIN_MONTOA FROM taxonomia_instancia WHERE TAIN_ID = :inst AND taxo_id = :idtax and taxe_id = :idenc AND TAXD_ID = :ITEM
                            INTO :valor, :valora;
                        SALDO4 = SALDO4 + VALOR;
                        SALDO4A = SALDO4A + VALORA;
                        NIVEL = 5;
                        SUSPEND;
                        END
                    END
                END
            ELSE
                BEGIN
                ITEM = ITE4;
                NOMBRE = NOMBRE4;
                NOMBRE4 = NULL;
                SELECT MONTO, TAIN_MONTOA FROM taxonomia_instancia WHERE TAIN_ID = :inst AND taxo_id = :idtax and taxe_id = :idenc AND TAXD_ID = :ITEM
                    INTO :valor, :valora;
                SALDO3 = SALDO3 + VALOR;
                SALDO3A = SALDO3A + VALORA;
                NIVEL = 4;
                SUSPEND;
                END
            END
/*        NOMBRE = 'Total ' || NOMBRE3;
        VALOR = SALDO3;
        VALORA = SALDO3A;
        SALDO2 = SALDO2 + VALOR;
        SALDO2A = SALDO2A + VALORA;
        ITEM = ITE3;
        NIVEL = 3;
        SUSPEND;*/
        END
/*    NOMBRE = 'Total ' || NOMBRE2;
    VALOR = SALDO2;
    VALORA = SALDO2A;
    ITEM = ITE2;
    NIVEL = 2;
    SUSPEND;*/
    END
end^


ALTER PROCEDURE IMPR_TIQUETE (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NOMRUTA VARCHAR(60),
    ASESOR INTEGER,
    NOMASESOR VARCHAR(60),
    VEHICULO VARCHAR(15),
    TIPOVEHI VARCHAR(30),
    NUMINTERNO VARCHAR(15),
    HORA TIME,
    NITCLIENTE VARCHAR(20),
    NOMBRECLIENTE VARCHAR(60),
    PASAJERO VARCHAR(60),
    PUESTO VARCHAR(10),
    PASAJE NUMERIC(18,2),
    TOTPASAJE NUMERIC(18,2),
    SEGURO NUMERIC(18,2),
    TOTSEGURO NUMERIC(18,2),
    CANT INTEGER,
    TOTAL NUMERIC(18,2),
    FORMAP CHAR(1))
AS
BEGIN
  SELECT TIQP_PREF, TIQP_NUMERO, TIQP_FECHA, RUTA_NOMBRE, TIQP_VEHICULO, TIQP_VEND, D.vend_nombre, tiqp_formap, tiqp_puesto,
        TV.tich_nom, V.vehi_numero, TIQP_HORA, TIQP_NIT, TIQP_NOMBRE, TIQP_PASAJE, TIQP_SEGURO, TIQP_CANT, TIQP_TOTAL
  FROM tiquete_pasajero T, vendedores D, VEHICULOS V, ruta_pasajeros R, TIPO_VEHICULO TV
  WHERE T.tiqp_vehiculo = V.vehi_cod AND T.tiqp_vend = D.vend_cod AND T.tiqp_ruta = R.ruta_id and V.vehi_tipo = TV.tivh_cod AND T.tiqp_id = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMRUTA, :vehiculo, :asesor, :nomasesor, :formap, :puesto,
        :tipovehi, :numinterno, :hora, :nitcliente, :pasajero, :totpasaje, :totseguro, :cant, :total;
  SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nitcliente INTO :nombrecliente;
  if (CANT <> 0) then
    BEGIN
    PASAJE = totpasaje / CANT;
    SEGURO = totseguro / CANT;
    END
  SUSPEND;
END^


ALTER PROCEDURE IMPR_TRASFERENCIA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NIT VARCHAR(20),
    NOMTERC 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),
    PRECIO NUMERIC(18,2),
    LOTE VARCHAR(15),
    LOTEDES VARCHAR(15),
    LOTEVENCE DATE,
    SERIALES VARCHAR(4096),
    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),
    NUMITEMS INTEGER,
    PAGTOTAL INTEGER)
AS
DECLARE VARIABLE ITEMFOR INTEGER;
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 ORDENCOD CHAR(15);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO','DOCUMENTOS','ORDENAR ITEMS AL IMPRIMIR DOCUMENTOS') returning_values (:ORDENCOD);
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, TERC_NIT
    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, :NIT;
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;
SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nomterc;
PESOTOT = 0;
VOLUMTOT = 0;
SELECT COUNT(TRAS_ITEM) from trasferencias_detalle WHERE TRAN_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 13 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
if (ORDENCOD = 'NO') then
  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, TRAS_LOTEDES,
    (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, :LOTEDES,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      ITEM = ITEM + 1;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      TOTAL = TOTAL - IVAMONTO;
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE and BODE_COD = :boditem INTO :lotevence;
      EXECUTE PROCEDURE seriales_item_documento(13, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'CODIGO') then
  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, TRAS_LOTEDES,
    (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 D.ARTI_COD, TRAS_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :LOTEDES,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      ITEM = ITEM + 1;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      TOTAL = TOTAL - IVAMONTO;
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE and BODE_COD = :boditem INTO :lotevence;
      EXECUTE PROCEDURE seriales_item_documento(13, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'DESCRIPCION') then
  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, TRAS_LOTEDES,
    (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 D.tras_desc, TRAS_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :LOTEDES,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      ITEM = ITEM + 1;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      TOTAL = TOTAL - IVAMONTO;
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE and BODE_COD = :boditem INTO :lotevence;
      EXECUTE PROCEDURE seriales_item_documento(13, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'UNIDAD') then
  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, TRAS_LOTEDES,
    (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 d.tras_unidad, D.tras_desc, TRAS_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :LOTEDES,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      ITEM = ITEM + 1;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      TOTAL = TOTAL - IVAMONTO;
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE and BODE_COD = :boditem INTO :lotevence;
      EXECUTE PROCEDURE seriales_item_documento(13, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
if (ORDENCOD = 'GRUPO') then
  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, TRAS_LOTEDES,
    (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 a.grup_cod, a.subg_cod, D.tras_desc, TRAS_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :LOTEDES,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      ITEM = ITEM + 1;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      TOTAL = TOTAL - IVAMONTO;
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE and BODE_COD = :boditem INTO :lotevence;
      EXECUTE PROCEDURE seriales_item_documento(13, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
END^


ALTER PROCEDURE IMPR_TRASLACAJA (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NOMCAJAORI VARCHAR(60),
    NOMCAJADES VARCHAR(60),
    CONCEPTO VARCHAR(60),
    ITEM INTEGER,
    FORPAGO VARCHAR(30),
    BCOPAGO VARCHAR(2),
    CTAPAGO VARCHAR(20),
    NUMPAGO VARCHAR(20),
    FECPAGO DATE,
    MONTOPAGO NUMERIC(18,2))
AS
BEGIN
  SELECT PREF_PRE, TRCJ_NUMERO, TRCJ_FECHA, C.CAJA_NOMBRE, D.CAJA_NOMBRE, TRCJ_CONC
  FROM TRASLADOS_CAJA T, CAJAS C, CAJAS D
  WHERE T.CAJA_ID = C.CAJA_ID AND T.TRCJ_DESTINO = D.CAJA_ID AND T.TRCJ_ID = :ID
  INTO :PREFIJO, :NUMERO, :FECHA, :NOMCAJAORI, :NOMCAJADES, :CONCEPTO;
  for select
        TRCD_ITEM, FOPA_NOM, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO
    FROM TRASLADOS_CAJA_DET T, FORMAS_PAGO F
    WHERE T.FOPA_ID = F.FOPA_ID AND T.TRCJ_ID = :ID ORDER BY TRCD_ITEM
    INTO
        :ITEM, :FORPAGO, :BCOPAGO, :CTAPAGO, :NUMPAGO, :FECPAGO, :MONTOPAGO
    DO
        SUSPEND;
 END^


ALTER PROCEDURE IMPR_TRASLADOBCO (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODCUENTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    SUCURSAL VARCHAR(60),
    CTACONTA VARCHAR(20),
    CODBANCO INTEGER,
    NOMBANCO VARCHAR(60),
    CODCUENTAD VARCHAR(3),
    NROCUENTAD VARCHAR(20),
    TITULARD VARCHAR(60),
    SUCURSALD VARCHAR(60),
    CTACONTAD VARCHAR(20),
    CODBANCOD INTEGER,
    NOMBANCOD VARCHAR(60),
    NOTA VARCHAR(8),
    MONTO NUMERIC(18,2),
    NOTAMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    GMFPORC NUMERIC(9,2),
    GMFMONTO NUMERIC(18,2))
AS
BEGIN
  SELECT PRBA_PREF, TRAS_NUMERO, TRAS_FECHA, TRAS_CONCEPTO, C.CUBA_CODCTA, C.CUBA_NUMERO, C.CUBA_TITULAR, C.CUBA_SUCURSAL, C.CUBA_CTACONTA, C.BANC_COD, B.BANC_NOMBRE,
    D.CUBA_CODCTA, D.CUBA_NUMERO, D.CUBA_TITULAR, D.CUBA_SUCURSAL, D.CUBA_CTACONTA, D.BANC_COD, BD.BANC_NOMBRE, TRAS_NOTA, TRAS_MONTO, TRAS_NOTAMONTO, TRAS_IVAPORC2, TRAS_IVAMONTO2, TRAS_GMFPORC, TRAS_GMFMONTO
    FROM traslados T, CUENTAS_BANCO C, BANCOS B, CUENTAS_BANCO D, BANCOS BD
    WHERE T.CUBA_COD = C.CUBA_COD AND C.BANC_COD = B.BANC_COD AND TRAS_CTADEST = D.CUBA_COD AND D.BANC_COD = BD.BANC_COD AND TRAS_ID = :ID
    into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODCUENTA, :NROCUENTA, TITULAR, SUCURSAL, CTACONTA, CODBANCO, NOMBANCO,
    :CODCUENTAD, :NROCUENTAD, TITULARD, SUCURSALD, CTACONTAD, CODBANCOD, NOMBANCOD, NOTA, MONTO, NOTAMONTO, IVAPORC, IVAMONTO, GMFPORC, GMFMONTO;
  if (IVAPORC IS NULL) then
    IVAPORC = 0;
  if (IVAMONTO IS NULL) then
    IVAMONTO = 0;
  if (NOTAMONTO IS NULL) then
    NOTAMONTO = 0;
  if (MONTO IS NULL) then
    MONTO = 0;
  if (GMFMONTO IS NULL) then
    GMFMONTO = 0;
  SUSPEND;
END^


ALTER PROCEDURE IMPR_VACACIONES (
    ID INTEGER)
RETURNS (
    NITEMP VARCHAR(20),
    NOMEMP VARCHAR(60),
    DEPTO VARCHAR(60),
    CARGO VARCHAR(60),
    FECING DATE,
    FECINI DATE,
    FECFIN DATE,
    DIASACU INTEGER,
    DIASTOT INTEGER,
    DIASHAB INTEGER,
    DIASNOL INTEGER,
    DISFRUT VARCHAR(11),
    SALARIO NUMERIC(18,2),
    VALOR NUMERIC(18,2),
    ITEM INTEGER,
    CODCONC INTEGER,
    CONCNOM VARCHAR(60),
    CONCVALOR NUMERIC(18,2),
    CONCPOD CHAR(1))
AS
begin
SELECT V.terc_nit, T.terc_nom, E.empl_dpto, E.empl_cargo, E.empl_fecing, V.vaca_fecha, V.vaca_fecfin, V.vaca_diassol, V.vaca_dias, V.vaca_salario, V.vaca_monto, V.vaca_disfr, V.vaca_diasacu
    FROM VACACIONES V, TERCEROS T, EMPLEADOS E WHERE V.VACA_ID = :id AND V.terc_nit = T.terc_nit AND T.terc_nit = E.terc_nit
    INTO :nitemp, :nomemp, :depto, :cargo, :fecing, :fecini, :fecfin, :diashab, :diastot, :salario, :valor, :disfrut, :diasacu;
DIASNOL = DIASTOT - DIASHAB;
if (disfrut = 'S') then
    disfrut = 'DISFRUTADAS';
ELSE
    disfrut = 'PAGADAS';
if (EXISTS (SELECT VACA_ID FROM vacaciones_detalle D, nomina_conceptos NC
        WHERE VACA_ID = :ID AND D.vacd_nomid = NC.nomi_id)) then
    BEGIN
    FOR SELECT MAX(D.vacd_item), MAX(NC.conc_cod), SUM(NC.noco_valor), MAX(NC.noco_deduc)
        FROM vacaciones_detalle D, nomina_conceptos NC
        WHERE VACA_ID = :ID AND D.vacd_nomid = NC.nomi_id GROUP BY NC.CONC_COD
        INTO :ITEM, :codconc, :concvalor, :concpod
        DO
        BEGIN
        SELECT CONC_NOMBRE FROM conceptos_nomina WHERE CONC_COD = :codconc INTO :concnom;
        SUSPEND;
        END
    END
ELSE
    begin
    ITEM = 1;
    CONCNOM = 'VACACIONES';
    CONCVALOR = VALOR;
    suspend;
    end
end^


ALTER PROCEDURE IMPUESTOS_CLIENTE (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(5),
    TEL VARCHAR(40),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    IVAMONTO 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),
    SUBTOTALD NUMERIC(18,2),
    DTOMONTOD NUMERIC(18,2),
    IVAMONTOD NUMERIC(18,2),
    EXENTOSD NUMERIC(18,2),
    GRAVADOS1D NUMERIC(18,2),
    GRAVADOS2D NUMERIC(18,2),
    GRAVADOS3D NUMERIC(18,2),
    BASEDEC2799D NUMERIC(18,2),
    IVA1D NUMERIC(18,2),
    IVA2D NUMERIC(18,2),
    IVA3D NUMERIC(18,2),
    IVADEC2799D NUMERIC(18,2),
    EXTRAD NUMERIC(18,2),
    TOTALD NUMERIC(18,2),
    RTFTEMONTOD NUMERIC(18,2),
    RTIVAMONTOD NUMERIC(18,2),
    RTICAMONTOD NUMERIC(18,2),
    NETOD NUMERIC(18,2))
AS
BEGIN
/* FACTURA */
FOR SELECT MAX(TERC_NIT), SUM(FACT_ADICIONAL-FACT_DTOMONTO), SUM(FACT_IVAMONTO), SUM(FACT_RTFTEMONTO),
    SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL)
    FROM FACTURAS F WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
    GROUP BY TERC_NIT
    INTO :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL
    DO
    BEGIN
    SELECT TERC_NOM, TERC_DIR, CIUD_COD, TERC_TEL FROM TERCEROS WHERE TERC_NIT = :NIT
        INTO :NOMTERCERO, :DIR, :CIU, :TEL;
    SELECT SUM((FADE_TOTAL - FADE_IVAMONTO)*F.fact_factor)
        FROM FACTURAS_DETALLE D, FACTURAS F WHERE F.FACT_ID = D.fact_id AND F.terc_nit = :NIT AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        AND FADE_IVAPORC = 0 AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :EXENTOS;
    SELECT SUM((FADE_TOTAL - FADE_IVAMONTO)*F.fact_factor), SUM(FADE_IVAMONTO* F.fact_factor)
        FROM FACTURAS_DETALLE D, FACTURAS F, TARIFA_IVA T WHERE F.FACT_ID = D.fact_id AND F.terc_nit = :NIT AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 1 AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :GRAVADOS1, :IVA1;
    SELECT SUM((FADE_TOTAL - FADE_IVAMONTO)*F.fact_factor), SUM(FADE_IVAMONTO* F.fact_factor)
        FROM FACTURAS_DETALLE D, FACTURAS F, TARIFA_IVA T WHERE F.FACT_ID = D.fact_id AND F.terc_nit = :nit AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 2 AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :GRAVADOS2, :IVA2;
    SELECT SUM((FADE_TOTAL - FADE_IVAMONTO)*F.fact_factor), SUM(FADE_IVAMONTO* F.fact_factor)
        FROM FACTURAS_DETALLE D, FACTURAS F, TARIFA_IVA T WHERE F.FACT_ID = D.fact_id AND F.terc_nit = :NIT AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        AND FADE_IVAPORC = TAIV_PORC AND TAIV_COD = 3 AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :GRAVADOS3, :IVA3;
    SELECT SUM((FADE_TOTAL - FADE_IVAMONTO)*F.fact_factor), SUM(FADE_IVAMONTO*F.fact_factor)
        FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A WHERE F.FACT_ID = D.fact_id AND F.terc_nit = :NIT AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        AND D.arti_cod = A.arti_cod AND A.arti_dec2799 = 'S' AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :basedec2799, :ivadec2799;

    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;
    SUBTOTAL = TOTAL - EXTRA - IVAMONTO + IVADEC2799;
    NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;

    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;

    SUBTOTALD = 0;
    DTOMONTOD = 0;
    IVAMONTOD = 0;
    RTFTEMONTOD = 0;
    RTIVAMONTOD = 0;
    RTICAMONTOD = 0;
    EXTRAD = 0;
    TOTALD = 0;
    NETOD = 0;
    SELECT SUM(DEVT_ADICIONAL-DEVT_DTOMONTO), SUM(DEVT_IVAMONTO), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_TOTAL)
        FROM DEVOLUCIONES_VENTAS D WHERE DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
        AND TERC_NIT = :NIT  INTO :DTOMONTOD, :IVAMONTOD, :RTFTEMONTOD, :RTIVAMONTOD, :RTICAMONTOD, :EXTRAD, :TOTALD;

    if (dtomontod is null) then
        dtomontod = 0;
    if (ivamontod is null) then
        ivamontod = 0;
    if (rtftemontod is null) then
        rtftemontod = 0;
    if (rticamontod is null) then
        rticamontod = 0;
    if (rtivamontod is null) then
        rtivamontod = 0;
    if (extrad is null) then
        extrad = 0;
    if (totald is null) then
        totald = 0;
    SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO)* F.devt_factor)
        FROM DEVOLUCIONES_VENTAS_DETALLE D, devoluciones_ventas F WHERE F.DEVT_ID = D.devt_id AND F.terc_nit = :NIT AND
        ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = 0 AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN INTO :EXENTOSD;
    SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO)*F.devt_factor), SUM(DVDE_IVAMONTO*F.devt_factor)
        FROM DEVOLUCIONES_VENTAS_DETALLE D, devoluciones_ventas F, TARIFA_IVA T WHERE F.DEVT_ID = D.devt_id AND F.terc_nit = :NIT
        AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1
        AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
        INTO :GRAVADOS1D, :IVA1D;
    SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO)*F.devt_factor), SUM(DVDE_IVAMONTO*F.devt_factor)
        FROM DEVOLUCIONES_VENTAS_DETALLE D, devoluciones_ventas F, TARIFA_IVA T WHERE F.DEVT_ID = D.devt_id AND F.terc_nit = :NIT
        AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2
        AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN 
        INTO :GRAVADOS2D, :IVA2D;
    SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO)*F.devt_factor), SUM(DVDE_IVAMONTO*F.devt_factor)
        FROM DEVOLUCIONES_VENTAS_DETALLE D, devoluciones_ventas F, TARIFA_IVA T WHERE F.DEVT_ID = D.devt_id AND F.terc_nit = :NIT
        AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3
        AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN 
        INTO :GRAVADOS3D, :IVA3D;
    SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO)*F.devt_factor), SUM(DVDE_IVAMONTO*F.devt_factor)
        FROM DEVOLUCIONES_VENTAS_DETALLE D, devoluciones_ventas F, ARTICULO A WHERE F.DEVT_ID = D.devt_id AND F.terc_nit = :NIT
        AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND D.arti_cod = A.arti_cod AND A.arti_dec2799 = 'S'
        AND DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN 
        INTO :basedec2799D, :ivadec2799D;

    if (iva1D is null) then
        iva1D = 0;
    if (iva2D is null) then
        iva2D = 0;
    if (iva3D is null) then
        iva3D = 0;
    if (ivadec2799D is null) then
        ivadec2799D = 0;
    if (exentosD is null) then
        exentosD = 0;
    if (gravados1D is null) then
        gravados1D = 0;
    if (gravados2D is null) then
        gravados2D = 0;
    if (gravados3D is null) then
        gravados3D = 0;
    if (basedec2799D is null) then
        basedec2799D = 0;
    SUBTOTALD = TOTALD - EXTRAD - IVAMONTOD + IVADEC2799D;
    NETOD = TOTALD - RTFTEMONTOD - RTIVAMONTOD - RTICAMONTOD;
    SUSPEND;
    END
END^


ALTER PROCEDURE IMPUESTOS_COMPRAS (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1))
RETURNS (
    TIPO INTEGER,
    NOMTIPO VARCHAR(30),
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NUMPROV VARCHAR(15),
    NOMTERCERO VARCHAR(60),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    IVA6 NUMERIC(18,2),
    IVA7 NUMERIC(18,2),
    IVA8 NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    GRAVADOS3 NUMERIC(18,2),
    GRAVADOS4 NUMERIC(18,2),
    GRAVADOS5 NUMERIC(18,2),
    GRAVADOS6 NUMERIC(18,2),
    GRAVADOS7 NUMERIC(18,2),
    GRAVADOS8 NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREEMONTO NUMERIC(18,2),
    NETO NUMERIC(18,2),
    ANULADO CHAR(1))
AS
declare variable ID INTEGER;
declare variable TER_exento CHAR(1);
declare variable NOTAS CHAR(2);
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_RTCREEM, 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, :RTCREEMONTO, :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;
              GRAVADOS4 = 0;
              GRAVADOS5 = 0;
              GRAVADOS6 = 0;
              GRAVADOS7 = 0;
              GRAVADOS8 = 0;
              IVA1 = 0;
              IVA2 = 0;
              IVA3 = 0;
              IVA4 = 0;
              IVA5 = 0;
              IVA6 = 0;
              IVA7 = 0;
              IVA8 = 0;
              SUBTOTAL = 0;
              TOTAL = 0;
              EXTRA = 0;
              IVAMONTO = 0;
              DTOMONTO = 0;
              NETO = 0;
              RTFTEMONTO = 0;
              RTIVAMONTO = 0;
              RTICAMONTO = 0;
              RTCREEMONTO = 0;
              CONSUMO = 0;
              END
            ELSE
              BEGIN
              if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_IVAMONTO = 0 INTO :EXENTOS;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 1 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 2 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 3 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS3, :IVA3;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 4 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS4, :IVA4;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 5 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS5, :IVA5;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 6 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS6, :IVA6;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 7 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS7, :IVA7;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 8 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS8, :IVA8;
                end
              else
                begin
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 0 INTO :EXENTOS;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 3 INTO :GRAVADOS3, :IVA3;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 4 INTO :GRAVADOS4, :IVA4;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 5 INTO :GRAVADOS5, :IVA5;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 6 INTO :GRAVADOS5, :IVA6;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 7 INTO :GRAVADOS5, :IVA7;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO) FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 8 INTO :GRAVADOS5, :IVA8;
                end
              SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :CONSUMO;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEMONTO;
              END
            if (exentos is null) then
                exentos = 0;
            if (gravados1 is null) then
                gravados1 = 0;
            if (gravados2 is null) then
                gravados2 = 0;
            if (gravados3 is null) then
                gravados3 = 0;
            if (gravados4 is null) then
                gravados4 = 0;
            if (gravados5 is null) then
                gravados5 = 0;
            if (gravados6 is null) then
                gravados6 = 0;
            if (gravados7 is null) then
                gravados7 = 0;
            if (gravados8 is null) then
                gravados8 = 0;
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (iva4 is null) then
                iva4 = 0;
            if (iva5 is null) then
                iva5 = 0;
            if (iva6 is null) then
                iva6 = 0;
            if (iva7 is null) then
                iva7 = 0;
            if (iva8 is null) then
                iva8 = 0;
            if (consumo is null) then
                consumo = 0;
            EXECUTE PROCEDURE ORDENE_TARIFAS(gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8)
                returning_values (gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8);
            SUSPEND;
            END
    END
    
TIPO = 24;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 24 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.TERC_NIT, DVCO_ADICIONAL-DVCO_DTOMONTO, DVCO_IVAMONTO, DVCO_RTFTEMONTO,
    DVCO_RTIVAMONTO, DVCO_RTICAMONTO, DVCO_RTCREEM, DVCO_EXTRA, DVCO_TOTAL, DVCO_ANULADO, ''
    FROM DEVOLUCIONES_COMPRAS D, movimiento_proveedor M
    WHERE DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND M.mvpr_tiporef = 24 AND M.mvpr_idref = D.dvco_id
    ORDER BY DVCO_FECHA, PREF_PRE, DVCO_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO,
    :RTIVAMONTO, :RTICAMONTO, :RTCREEMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov
    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;
              GRAVADOS4 = 0;
              GRAVADOS5 = 0;
              GRAVADOS6 = 0;
              GRAVADOS7 = 0;
              GRAVADOS8 = 0;
              IVA1 = 0;
              IVA2 = 0;
              IVA3 = 0;
              IVA4 = 0;
              IVA5 = 0;
              IVA6 = 0;
              IVA7 = 0;
              IVA8 = 0;
              SUBTOTAL = 0;
              TOTAL = 0;
              EXTRA = 0;
              IVAMONTO = 0;
              DTOMONTO = 0;
              NETO = 0;
              RTFTEMONTO = 0;
              RTIVAMONTO = 0;
              RTICAMONTO = 0;
              RTCREEMONTO = 0;
             END
            ELSE
             BEGIN
              DTOMONTO = DTOMONTO * -1;
              ADICIONAL = ADICIONAL * -1;
              IVAMONTO = IVAMONTO * -1;
              EXTRA = EXTRA * -1;
              TOTAL = TOTAL * -1;
              RTFTEMONTO = RTFTEMONTO * -1;
              RTIVAMONTO = RTIVAMONTO * -1;
              RTICAMONTO = RTICAMONTO * -1;
              RTCREEMONTO = RTCREEMONTO * -1;
              /* CALCULE LAS DIFERENTES TARIFAS */
              if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_IVAMONTO = 0 INTO :EXENTOS;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 1 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 2 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 3 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS3, :IVA3;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 4 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS4, :IVA4;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 5 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS5, :IVA5;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 6 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS6, :IVA6;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 7 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS7, :IVA7;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 8 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS8, :IVA8;
                END
              ELSE
                BEGIN
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 0 INTO :EXENTOS;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 3 INTO :GRAVADOS3, :IVA3;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 4 INTO :GRAVADOS4, :IVA4;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 5 INTO :GRAVADOS5, :IVA5;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 6 INTO :GRAVADOS6, :IVA6;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 7 INTO :GRAVADOS7, :IVA7;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO) FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 8 INTO :GRAVADOS8, :IVA8;
                END
              SELECT SUM(DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :ID INTO :CONSUMO;
              CONSUMO = CONSUMO * -1;
              if (EXENTOS is NULL) then
                EXENTOS = 0;
              ELSE
                EXENTOS = EXENTOS * -1;
              if (GRAVADOS1 is NULL) then
                GRAVADOS1 = 0;
              ELSE
                GRAVADOS1 = GRAVADOS1 * -1;
              if (GRAVADOS2 is NULL) then
                GRAVADOS2 = 0;
              ELSE
                GRAVADOS2 = GRAVADOS2 * -1;
              if (GRAVADOS3 is NULL) then
                GRAVADOS3 = 0;
              ELSE
                GRAVADOS3 = GRAVADOS3 * -1;
              if (GRAVADOS4 is NULL) then
                GRAVADOS4 = 0;
              ELSE
                GRAVADOS4 = GRAVADOS4 * -1;
              if (GRAVADOS5 is NULL) then
                GRAVADOS5 = 0;
              ELSE
                GRAVADOS5 = GRAVADOS5 * -1;
              if (GRAVADOS6 is NULL) then
                GRAVADOS6 = 0;
              ELSE
                GRAVADOS6 = GRAVADOS6 * -1;
              if (GRAVADOS7 is NULL) then
                GRAVADOS7 = 0;
              ELSE
                GRAVADOS7 = GRAVADOS7 * -1;
              if (GRAVADOS8 is NULL) then
                GRAVADOS8 = 0;
              ELSE
                GRAVADOS8 = GRAVADOS8 * -1;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEMONTO;
             END
            if (iva1 is null) then
                iva1 = 0;
            else
                iva1 = iva1 * -1;
            if (iva2 is null) then
                iva2 = 0;
            else
                iva2 = iva2 * -1;
            if (iva3 is null) then
                iva3 = 0;
            else
                iva3 = iva3 * -1;
            if (iva4 is null) then
                iva4 = 0;
            else
                iva4 = iva4 * -1;
            if (iva5 is null) then
                iva5 = 0;
            else
                iva5 = iva5 * -1;
            if (iva6 is null) then
                iva6 = 0;
            else
                iva6 = iva6 * -1;
            if (iva7 is null) then
                iva7 = 0;
            else
                iva7 = iva7 * -1;
            if (iva8 is null) then
                iva8 = 0;
            else
                iva8 = iva8 * -1;
            if (consumo is null) then
                consumo = 0;
            else
                consumo = consumo * -1;
            EXECUTE PROCEDURE ORDENE_TARIFAS(gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8)
                returning_values (gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8);
            SUSPEND;
            END
    END

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

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


ALTER PROCEDURE IMPUESTOS_PROVEEDOR (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(5),
    TEL VARCHAR(40),
    SUBTOTAL NUMERIC(18,2),
    DTOMONTO NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    EXENTOS NUMERIC(18,2),
    GRAVADOS1 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    GRAVADOS2 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    GRAVADOS3 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),
    SUBTOTALD NUMERIC(18,2),
    DTOMONTOD NUMERIC(18,2),
    IVAMONTOD NUMERIC(18,2),
    EXENTOSD NUMERIC(18,2),
    GRAVADOS1D NUMERIC(18,2),
    IVA1D NUMERIC(18,2),
    GRAVADOS2D NUMERIC(18,2),
    IVA2D NUMERIC(18,2),
    GRAVADOS3D NUMERIC(18,2),
    IVA3D NUMERIC(18,2),
    EXTRAD NUMERIC(18,2),
    TOTALD NUMERIC(18,2),
    RTFTEMONTOD NUMERIC(18,2),
    RTIVAMONTOD NUMERIC(18,2),
    RTICAMONTOD NUMERIC(18,2),
    NETOD NUMERIC(18,2))
AS
BEGIN
FOR SELECT MAX(TERC_NIT), SUM(FACO_ADICIONAL-FACO_DTOMONTO), SUM(FACO_IVAMONTO), SUM(FACO_RTFTEMONTO), SUM(FACO_RTIVAMONTO),
    SUM(FACO_RTICAMONTO), SUM(FACO_EXTRA), SUM(FACO_TOTAL)
    FROM FACTURAS_COMPRA
    WHERE FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N' GROUP BY TERC_NIT
    INTO :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :EXTRA, :TOTAL
    DO
    BEGIN
    SELECT TERC_NOM, TERC_DIR, CIUD_COD, TERC_TEL FROM TERCEROS WHERE TERC_NIT = :NIT
        INTO :NOMTERCERO, :DIR, :CIU, :TEL;
    SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F
        WHERE F.FACO_ID = D.faco_id AND TERC_NIT = :NIT AND FACO_ANULADO = 'N' AND FCDE_IVAPORC = 0
        AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN INTO :EXENTOS;
    SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO)
        FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T, FACTURAS_COMPRA F
        WHERE F.FACO_ID = D.faco_id AND TERC_NIT = :NIT AND FACO_ANULADO = 'N' AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 1
        AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN INTO :GRAVADOS1, :IVA1;
    SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO)
        FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T, FACTURAS_COMPRA F
        WHERE F.FACO_ID = D.faco_id AND TERC_NIT = :NIT AND FACO_ANULADO = 'N' AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 2
        AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN INTO :GRAVADOS2, :IVA2;
    SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO), SUM(FCDE_IVAMONTO)
        FROM FACTURAS_COMPRAS_DETALLE D, TARIFA_IVA T, FACTURAS_COMPRA F
        WHERE F.FACO_ID = D.faco_id AND TERC_NIT = :NIT AND FACO_ANULADO = 'N' AND FCDE_IVAPORC = TAIV_PORC AND TAIV_COD = 3
        AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN INTO :GRAVADOS3, :IVA3;

    SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
    NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;

    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;

    SELECT SUM(DVCO_ADICIONAL-DVCO_DTOMONTO), SUM(DVCO_IVAMONTO), SUM(DVCO_RTFTEMONTO), SUM(DVCO_RTIVAMONTO), SUM(DVCO_RTICAMONTO), SUM(DVCO_EXTRA), SUM(DVCO_TOTAL)
        FROM DEVOLUCIONES_COMPRAS D WHERE DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N' AND TERC_NIT = :NIT
        INTO :DTOMONTOD, :IVAMONTOD, :RTFTEMONTOD, :RTIVAMONTOD, :RTICAMONTOD, :EXTRAD, :TOTALD;
    if (dtomontod is null) then
        dtomontod = 0;
    if (ivamontod is null) then
        ivamontod = 0;
    if (rtftemontod is null) then
        rtftemontod = 0;
    if (rticamontod is null) then
        rticamontod = 0;
    if (rtivamontod is null) then
        rtivamontod = 0;
    if (extrad is null) then
        extrad = 0;
    if (totald is null) then
        totald = 0;

    SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET D, DEVOLUCIONES_COMPRAS F
        WHERE F.DVCO_ID = D.dvco_id AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N' AND TERC_NIT = :NIT
        AND DVCD_IVAPORC = 0 INTO :EXENTOSD;
    SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO)
        FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T, DEVOLUCIONES_COMPRAS F
        WHERE F.DVCO_ID = D.dvco_id AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N' AND TERC_NIT = :NIT
        AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 1 INTO :GRAVADOS1D, :IVA1D;
    SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO)
        FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T , DEVOLUCIONES_COMPRAS F
        WHERE F.DVCO_ID = D.dvco_id AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N' AND TERC_NIT = :NIT
        AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 2 INTO :GRAVADOS2D, :IVA2D;
    SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO), SUM(DVCD_IVAMONTO)
        FROM DEVOLUCIONES_COMPRAS_DET D, TARIFA_IVA T , DEVOLUCIONES_COMPRAS F
        WHERE F.DVCO_ID = D.dvco_id AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND DVCO_ANULADO = 'N' AND TERC_NIT = :NIT
        AND DVCD_IVAPORC = TAIV_PORC AND TAIV_COD = 3 INTO :GRAVADOS3D, :IVA3D;
    SUBTOTALD = TOTALD - EXTRAD - IVAMONTOD - DTOMONTOD;
    NETOD = TOTALD - RTFTEMONTOD - RTIVAMONTOD - RTICAMONTOD;

    if (exentosD is null) then
        exentosD = 0;
    if (gravados1D is null) then
        gravados1D = 0;
    if (gravados2D is null) then
        gravados2D = 0;
    if (gravados3D is null) then
        gravados3D = 0;
    if (iva1D is null) then
        iva1D = 0;
    if (iva2D is null) then
        iva2D = 0;
    if (iva3D is null) then
        iva3D = 0;
    SUSPEND;
    END
END^


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

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


ALTER PROCEDURE INACTIVAR_ACTUALIZACION_BALANCE (
    FECINI DATE,
    FECFIN DATE,
    NULO CHAR(1))
RETURNS (
    OK CHAR(1))
AS
begin
EXECUTE STATEMENT 'ALTER TRIGGER COMPROBANTE_DETALLE_AI INACTIVE';
EXECUTE STATEMENT 'ALTER TRIGGER COMPROBANTE_DETALLE_AU INACTIVE';
EXECUTE STATEMENT 'ALTER TRIGGER COMPROBANTE_DETALLE_AD INACTIVE';
OK = 'S';
suspend;
end^


ALTER PROCEDURE INACTIVAR_PROVEEDORES (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SALDO NUMERIC(18,2),
    ITEMS INTEGER)
AS
begin
FOR SELECT T.TERC_NIT, TERC_NOM FROM TERCEROS T, PROVEEDORES P
    WHERE T.terc_nit = P.terc_nit AND TERC_PROV = 'S' AND TERC_ESTADO = 'S' AND TERC_CLIE = 'N'
    ORDER BY TERC_NIT
    INTO :NIT, :NOMBRE
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_proveedor (:NIT, :fecini,  0) returning_values (:SALDO);
    SELECT COUNT(MVPR_ID) FROM movimiento_proveedor WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI INTO :ITEMS;
    if ((SALDO = 0) AND (ITEMS = 0)) then
        BEGIN
        UPDATE TERCEROS SET TERC_ESTADO = 'N' WHERE TERC_NIT = :NIT;
        suspend;
        END
    END
end^


ALTER PROCEDURE INACTIVOS_EXISTENCIA (
    FECHA DATE,
    ACTIVAR CHAR(1))
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    BODEGA VARCHAR(2),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8))
AS
begin
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD FROM articulo WHERE ESAR_COD = 'I' ORDER BY ARTI_COD
    INTO :ARTICULO, :descripcion, :unidad
    DO
    BEGIN
    FOR SELECT BODE_COD FROM BODEGA WHERE BODE_ACTIVA = 'S' INTO :bodega
        DO
        BEGIN
        EXECUTE PROCEDURE saldo_inventario(:articulo, :bodega, :fecha) returning_values (cantidad);
        if (cantidad <> 0) then
            BEGIN
            if (ACTIVAR = 'S') then
                UPDATE ARTICULO SET ESAR_COD = 'N' WHERE ARTI_COD = :articulo;
            suspend;
            END
        END
    END
end^


ALTER PROCEDURE INCAPACIDAD_TOTAL (
    EMPL VARCHAR(20),
    FECHA DATE)
RETURNS (
    DURAC INTEGER)
AS
declare variable DURA INTEGER;
declare variable PRORROGA CHAR(1);
begin
DURAC = 0;
FOR SELECT D.nnde_duracion, D.nnde_prorroga from nomina_novedades n, nomina_novedades_detalle d
    where n.nono_id = d.nono_id and n.terc_nit = :EMPL AND N.tnov_cod = 2 AND N.nono_fecha < :FECHA
    ORDER BY N.nono_fecha DESC
    INTO :DURA, :PRORROGA
    DO
    BEGIN
    DURAC = DURAC + DURA;
    if (PRORROGA = 'N') then
        BREAK;
    END
suspend;
end^


ALTER PROCEDURE INCREMENTE_NROCOPIA (
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable NUMROWS INTEGER;
begin
SELECT COUNT(*) FROM NUMERO_COPIA WHERE TIDO_COD = :TIPO AND NUCO_ID = :id INTO :numrows;
if (NUMROWS = 0) then
    INSERT INTO NUMERO_COPIA (TIDO_COD, NUCO_ID, NUCO_COPIA)
        VALUES (:TIPO, :ID, 1);
ELSE
    UPDATE NUMERO_COPIA SET NUCO_COPIA = NUCO_COPIA + 1
        WHERE TIDO_COD = :TIPO AND NUCO_ID = :ID;
end^


ALTER PROCEDURE INF_CERTIFICADOS_RETENCION (
    ANO CHAR(4))
RETURNS (
    TIPOID VARCHAR(2),
    NIT VARCHAR(20),
    APELLIDO1 VARCHAR(60),
    APELLIDO2 VARCHAR(60),
    NOMBRE1 VARCHAR(60),
    NOMBRE2 VARCHAR(60),
    DIRECCION VARCHAR(60),
    DEPTOCIA VARCHAR(2),
    MUNICIA VARCHAR(3),
    PAIS VARCHAR(3),
    DEPTOEMPL VARCHAR(2),
    MUNIEMPL VARCHAR(3),
    EMAIL VARCHAR(100),
    FECINI DATE,
    FECFIN DATE,
    SALARIOS NUMERIC(18,2),
    GASTOS NUMERIC(18,2),
    PENSION NUMERIC(18,2),
    TOTALVACAC NUMERIC(18,2),
    CESANTIA NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    APSALUD NUMERIC(18,2),
    APPENSION NUMERIC(18,2),
    VOLUNTARIOS NUMERIC(18,2),
    RETENCION NUMERIC(18,2))
AS
declare variable SUMA numeric(18,2);
declare variable RESTA numeric(18,2);
declare variable CIUDAD varchar(5);
declare variable CIUEMPL varchar(5);
declare variable FECINIA DATE;
declare variable FECFINA DATE;
BEGIN
FECINIA = ANO || '/01/01';
FECFINA = ANO || '/12/31';
SELECT CONF_VALOR FROM CONFIGURACION WHERE CONF_MODULO = 'CONTABILIDAD' AND CONF_CATEGORIA = 'TERCEROS' AND CONF_PROPIEDAD = 'CODIGO DE CIUDAD A SUGERIR' INTO :CIUDAD;
deptocia = substr(:ciudad,1,2);
municia = substr(:ciudad,3,5);
FOR SELECT T.terc_nit, T.terc_apellido1,T.terc_apellido2,T.terc_nombre1,T.terc_nombre2, T.terc_tipoid, T.pais_id, T.terc_email, t.terc_dir, T.ciud_cod
  FROM TERCEROS T, empleados E WHERE T.terc_nit = E.terc_nit AND
  EXISTS (SELECT ND.nomi_id FROM NOMINA N, NOMINA_DETALLE ND WHERE N.nomi_id = ND.nomi_id AND ND.terc_nit = T.terc_nit AND N.nomi_ano = :ano)
  INTO :nit, :apellido1,:apellido2,:nombre1,:nombre2,:tipoid, :PAIS, :EMAIL, :direccion, :CIUEMPL
  DO
  BEGIN
  if (tipoid is not null) then
      select tiid_codigo from tipo_id where tiid_cod = :tipoid into :tipoid;
  deptoempl = substr(:ciuempl,1,2);
  muniempl = substr(:ciuempl,3,5);
  /* fechas de inicio y final */
  EXECUTE PROCEDURE empleado_activo (:nit, :FECFINA) returning_values (:fecini, :fecfin);
  if (:FECINI <= :FECINIA) then
    FECINI = FECINIA;
  if ((:fecfin is null) or (:fecfin >= :FECFINA)) then
    FECFIN = FECFINA;
  totalvacac = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 37 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 37 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  SALARIOS = SUMA - RESTA;

  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC WHERE terc_nit = :nit AND conc_cod = 950 AND noco_ano = :ano
    INTO :totalvacac;
  if (TOTALVACAC IS NULL) then
      TOTALVACAC = 0;
--  salarios = :salarios + :totalvacac;
  /* CESANTIAS */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 38 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 38 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  CESANTIA = SUMA - RESTA;
  /* GASTOS */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 39 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 39 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  GASTOS = SUMA - RESTA;
  /* PENSIONES */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 40 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 40 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  pension = SUMA - RESTA;
  /* OTROS */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 41 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 41 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  OTROS = SUMA - RESTA;
  total = salarios + cesantia + pension + otros;
  /* AP SALUD */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 43 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 43 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  APSALUD = SUMA - RESTA;
  if (apsalud < 0) then
    APSALUD = APSALUD * -1;
  /* AP PENSION */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 44 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 44 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  APPENSION = SUMA - RESTA;
  if (appension < 0) then
    appension = appension * -1;
  /* AP VOLUNTARIOS */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 45 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 45 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  voluntarios = SUMA - RESTA;
  /* RETENCION */
  SUMA = 0;
  RESTA = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 46 AND CF.ccrc_suma = 'S'
    AND NC.conc_cod = CF.ccrc_conc INTO :suma;
  if (suma IS NULL) then
      suma = 0;
  SELECT SUM(NC.noco_valor) FROM NOMINA_CONCEPTOS NC, configura_certretel_conc CF
    WHERE NC.terc_nit = :nit AND NC.noco_ano = :ano AND CF.cocr_renglon = 46 AND CF.ccrc_suma = 'N'
    AND NC.conc_cod = CF.ccrc_conc INTO :resta;
  if (resta IS NULL) then
      resta = 0;
  if (SUMA < RESTA) then
    RETENCION = 0;
  else
    retencion = SUMA - RESTA;
  SUSPEND;
  END
END^


ALTER PROCEDURE INFORME_DIARIO_VENTAS (
    FECHA DATE,
    PREFIJO VARCHAR(4),
    AGRUPA CHAR(1))
RETURNS (
    SERVIDOR VARCHAR(60),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    NROFAC INTEGER,
    NROFACAN INTEGER,
    HORAINI TIME,
    HORAFIN TIME,
    BASEFAC NUMERIC(18,2),
    IVAFAC NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    NROITE INTEGER,
    NRODEV INTEGER,
    BASEDEV NUMERIC(18,2),
    IVADEV NUMERIC(18,2),
    TOTALDEV NUMERIC(18,2),
    BASENETO NUMERIC(18,2),
    IVANETO NUMERIC(18,2),
    TOTALNETO NUMERIC(18,2),
    GRUPOFAC VARCHAR(20),
    GRUPONOM VARCHAR(60),
    GRUPOCANTF INTEGER,
    GRUPOBASEF NUMERIC(18,2),
    GRUPODSCTOF NUMERIC(18,2),
    GRUPOIVAP NUMERIC(9,2),
    GRUPOIVAMF NUMERIC(18,2),
    GRUPOTOTF NUMERIC(18,2))
AS
declare variable i integer;
declare variable tarifa integer;
declare variable ajuste integer;
declare variable factor numeric(18,4);
declare variable grupobased numeric(18,2);
declare variable grupoivamd numeric(18,2);
declare variable grupototd numeric(18,2);
declare variable ajbaseneto numeric(18,2);
declare variable ajivaneto numeric(18,2);
declare variable ajtotalneto numeric(18,2);
declare variable ajbasedev numeric(18,2);
declare variable ajivadev numeric(18,2);
declare variable ajtotaldev numeric(18,2);
begin
AJUSTE = 0;
SELECT FIRST 1 AUTO_MAQUINA FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO ORDER BY AUTO_FECHA DESC INTO :SERVIDOR;
/* LAS VENTAS */
SELECT COUNT(FACT_ID) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FACT_ANULADO = 'S' INTO :NROFACAN;
SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_ID)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
    INTO :NUMINI, :NUMFIN, :NROFAC;
NUMINI = CAST(NUMINI AS INTEGER);
NUMFIN = CAST(NUMFIN AS INTEGER);
SELECT SUM(FACT_TOTAL - FACT_IVAMONTO + FACT_DEC2799), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :BASENETO, :IVANETO, :TOTALNETO;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_COD = :PREFIJO || :NUMINI AND AUDI_OPER = 'I' INTO :HORAINI;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_COD = :PREFIJO || :NUMFIN AND AUDI_OPER = 'I' INTO :HORAFIN;
SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO + DEVT_DEC2799), SUM(DEVT_IVAMONTO), SUM(DEVT_TOTAL), COUNT(DEVT_ID)
    FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N'
    INTO :BASEDEV, :IVADEV, :TOTALDEV, :NRODEV;
if (basedev is null) then
    basedev = 0;
if (ivadev is null) then
    ivadev = 0;
if (totaldev is null) then
    totaldev = 0;
BASENETO = BASEFAC - BASEDEV;
ivaneto = IVAFAC - IVADEV;
TOTALNETO = TOTALFAC - TOTALDEV;
if (nrofac is null) then
    nrofac = 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;

ajbaseneto = 0;
ajivaneto = 0;
ajtotalneto = 0;
ajbasedev = 0;
ajivadev = 0;
ajtotaldev = 0;
/* POR TARIFA DE IVA */
FOR SELECT TAIV_PORC, TAIV_COD, TAIV_NOMBRE FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :GRUPOIVAP, :TARIFA, :GRUPONOM
    DO
    BEGIN
    GRUPOFAC = GRUPOIVAP;
    SELECT COUNT(D.fade_item), SUM((FADE_TOTAL-FADE_IVAMONTO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_TOTAL*(1-FACT_FACTOR))
        FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
        AND FADE_TIVA = :TARIFA and FACT_ANULADO = 'N'
        INTO :GRUPOCANTF, GRUPOBASEF, :GRUPOIVAMF, :GRUPOTOTF, :GRUPODSCTOF;
    if (grupocantf is null) then
        grupocantf = 0;
    if (grupobasef is null) then
        grupobasef = 0;
    if (grupoivamf is null) then
        grupoivamf = 0;
    if (grupototf is null) then
        grupototf = 0;
    if (grupodsctof is null) then
        grupodsctof = 0;
    SELECT SUM((DVDE_TOTAL-DVDE_IVAMONTO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_TOTAL*DEVT_FACTOR)
        FROM devoluciones_ventas_detalle DD, devoluciones_ventas DV
        WHERE DD.devt_id = DV.devt_id AND DEVT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
        AND DD.dvde_tiva = :TARIFA and DEVT_ANULADO = 'N'
        INTO :GRUPOBASED, :GRUPOIVAMD, :GRUPOTOTD;
    if (grupobased is null) then
        grupobased = 0;
    if (grupoivamd is null) then
        grupoivamd = 0;
    if (grupototd is null) then
        grupototd = 0;
    grupobasef = grupobasef - grupobased;
    grupoivamf = grupoivamf - grupoivamd;
    grupototf = grupototf - grupototd;
    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :grupoivap AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA
        INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    GRUPOBASEF = GRUPOBASEF * FACTOR;
    GRUPOIVAMF = GRUPOIVAMF * FACTOR;
    GRUPOTOTF = GRUPOTOTF * FACTOR;
    GRUPODSCTOF = GRUPODSCTOF * FACTOR;
    GRUPOBASED = GRUPOBASED * FACTOR;
    GRUPOIVAMD = GRUPOIVAMD * FACTOR;
    GRUPOTOTD = GRUPOTOTD * FACTOR;

    ajbaseneto = ajbaseneto + GRUPOBASEF;
    ajivaneto = ajivaneto + grupoivamf;
    ajtotalneto = ajtotalneto + grupototf;
    ajbasedev = ajbasedev + grupobased;
    ajivadev = ajivadev + grupoivamd;
    ajtotaldev = ajtotaldev + grupototd;
    END
if (AJUSTE = 1) then
    BEGIN
    baseneto = ajbaseneto;
    ivaneto = ajivaneto;
    totalneto = ajtotalneto;
    basedev = ajbasedev;
    ivadev = ajivadev;
    totaldev = ajtotaldev;
    basefac = baseneto + basedev;
    ivafac = ivaneto + ivadev;
    totalfac = totalneto + totaldev;
    END

if (AGRUPA = 'T') then
    BEGIN
    /* POR TARIFA DE IVA */
    FOR SELECT TAIV_COD, TAIV_NOMBRE, TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA, :GRUPONOM, :GRUPOIVAP
        DO
        BEGIN
        GRUPOFAC = GRUPOIVAP;
        SELECT COUNT(D.fade_item), SUM((FADE_TOTAL-FADE_IVAMONTO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_TOTAL*(1-FACT_FACTOR))
            FROM facturas_detalle D, FACTURAS F
            WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
            AND FADE_TIVA = :TARIFA and FACT_ANULADO = 'N'
            INTO :GRUPOCANTF, GRUPOBASEF, :GRUPOIVAMF, :GRUPOTOTF, :GRUPODSCTOF;
        if (grupocantf is null) then
            grupocantf = 0;
        if (grupobasef is null) then
            grupobasef = 0;
        if (grupoivamf is null) then
            grupoivamf = 0;
        if (grupototf is null) then
            grupototf = 0;
        if (grupodsctof is null) then
            grupodsctof = 0;
        SELECT SUM((DVDE_TOTAL-DVDE_IVAMONTO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_TOTAL*DEVT_FACTOR)
            FROM devoluciones_ventas_detalle DD, devoluciones_ventas DV
            WHERE DD.devt_id = DV.devt_id AND DEVT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
            AND DD.dvde_tiva = :TARIFA and DEVT_ANULADO = 'N'
            INTO :GRUPOBASED, :GRUPOIVAMD, :GRUPOTOTD;
        if (grupobased is null) then
            grupobased = 0;
        if (grupoivamd is null) then
            grupoivamd = 0;
        if (grupototd is null) then
            grupototd = 0;
        grupobasef = grupobasef - grupobased;
        grupoivamf = grupoivamf - grupoivamd;
        grupototf = grupototf - grupototd;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :grupoivap AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA
            INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (FACTOR <> 1) then
            AJUSTE = 1;
        GRUPOBASEF = GRUPOBASEF * FACTOR;
        GRUPOIVAMF = GRUPOIVAMF * FACTOR;
        GRUPOTOTF = GRUPOTOTF * FACTOR;
        GRUPODSCTOF = GRUPODSCTOF * FACTOR;
        GRUPOBASED = GRUPOBASED * FACTOR;
        GRUPOIVAMD = GRUPOIVAMD * FACTOR;
        GRUPOTOTD = GRUPOTOTD * FACTOR;
        SUSPEND;
        END
    END
if (AGRUPA = 'G') then
    BEGIN
    /* POR GRUPO DE INVENTARIO */
    FOR SELECT GRUP_COD, GRUP_NOM FROM grupo ORDER BY GRUP_COD INTO :GRUPOFAC, :GRUPONOM
        DO
        BEGIN
        FOR SELECT COUNT(D.fade_item), SUM((FADE_TOTAL-FADE_IVAMONTO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_TOTAL*(1-FACT_FACTOR)), MAX(A.taiv_cod)
            FROM facturas_detalle D, FACTURAS F, ARTICULO A
            WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
            AND FACT_ANULADO = 'N' AND A.arti_cod = D.arti_cod AND A.grup_cod = :GRUPOFAC
            GROUP BY A.taiv_cod
            INTO :GRUPOCANTF, GRUPOBASEF, :GRUPOIVAMF, :GRUPOTOTF, :GRUPODSCTOF, :TARIFA
            DO
            BEGIN
            if (grupocantf is null) then
                grupocantf = 0;
            if (grupobasef is null) then
                grupobasef = 0;
            if (grupoivamf is null) then
                grupoivamf = 0;
            if (grupototf is null) then
                grupototf = 0;
            if (grupodsctof is null) then
                grupodsctof = 0;
            SELECT TAIV_PORC FROM tarifa_iva WHERE TAIV_COD = :TARIFA INTO :GRUPOIVAP;
            SUSPEND;
            END
        END
    END
if (AGRUPA = 'A') then
    BEGIN
    FOR SELECT MAX(D.arti_cod), MAX(A.arti_des), COUNT(D.fade_item), SUM((FADE_TOTAL-FADE_IVAMONTO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_TOTAL*(1-FACT_FACTOR)), MAX(A.taiv_cod)
        FROM facturas_detalle D, FACTURAS F, ARTICULO A
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
        AND FACT_ANULADO = 'N' AND A.arti_cod = D.arti_cod
        GROUP BY A.arti_cod
        INTO :GRUPOFAC, :GRUPONOM, :GRUPOCANTF, GRUPOBASEF, :GRUPOIVAMF, :GRUPOTOTF, :GRUPODSCTOF, :TARIFA
        DO
        BEGIN
        if (grupocantf is null) then
            grupocantf = 0;
        if (grupobasef is null) then
            grupobasef = 0;
        if (grupoivamf is null) then
            grupoivamf = 0;
        if (grupototf is null) then
            grupototf = 0;
        if (grupodsctof is null) then
            grupodsctof = 0;
        SELECT TAIV_PORC FROM tarifa_iva WHERE TAIV_COD = :TARIFA INTO :GRUPOIVAP;
        SUSPEND;
        END
    END
end^


ALTER PROCEDURE INFORME_DIARIO_VENTAS_FP (
    FECHA DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    FORMAP INTEGER,
    NOMFORMA VARCHAR(30),
    CANTIDAD INTEGER,
    TOTAL NUMERIC(18,2))
AS
declare variable IDR INTEGER;
declare variable I INTEGER;
declare variable TOTALF NUMERIC(18,2);
declare variable TOTALR NUMERIC(18,2);
declare variable MONTO NUMERIC(18,2);
declare variable TOTALVTA NUMERIC(18,2);
declare variable CANTTOT INTEGER;
begin
/* si hubo ajuste, calcule el efectivo */
select MAX(NROFAC), MAX(TOTALNETO) from informe_diario_ventas(:fecha,  :PREFIJO, 'T') into :CANTTOT, TOTALVTA;
FOR SELECT FOPA_ID, FOPA_NOM FROM formas_pago WHERE FOPA_ID > 1
    INTO :FORMAP, :nomforma
    DO
    BEGIN
    CANTIDAD = 0;
    TOTAL = 0;
    FOR SELECT R.RECA_ID, F.FACT_TOTAL, R.reca_monto FROM FACTURAS F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
        WHERE FACT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' AND
        R.RECA_ID = D.RECA_ID AND RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' AND D.RCDE_TIPODOC = 31 AND D.RCDE_IDDOC = F.FACT_ID
        INTO :IDR, :TOTALF, :TOTALR
        DO
        BEGIN
        MONTO = 0;
        SELECT count(RCPA_ITEM), SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P
            WHERE RECA_ID = :IDR AND FOPA_ID = :FORMAP INTO :I, :MONTO;
        if (MONTO IS NULL) then
            MONTO = 0;
        CANTIDAD = CANTIDAD + I;
        TOTAL = TOTAL + (CAST(MONTO AS DOUBLE PRECISION) * (CAST(TOTALF AS DOUBLE PRECISION) / CAST(TOTALR AS DOUBLE PRECISION)));
        END
    TOTAL = ROUND(TOTAL, 2);
    if (TOTAL <> 0) then
        BEGIN
        canttot = canttot - CANTIDAD;
        totalvta = totalvta - TOTAL;
        suspend;
        END
    END

FORMAP = 0;
NOMFORMA = 'CARTERA';
CANTIDAD = 0;
TOTAL = 0;
for SELECT FACT_ID FROM FACTURAS WHERE FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    into :idr
    do
    begin
    EXECUTE procedure saldo_doc_cartera(31, :idr, :fecha,  0) returning_values (TOTALF);
    if (totalf <> 0) then
        cantidad = cantidad + 1;
    total = total + :TOTALF;
    end
if (TOTAL <> 0) then
    BEGIN
    canttot = canttot - CANTIDAD;
    totalvta = totalvta - TOTAL;
    SUSPEND;
    END
/* EL EFECTIVO */
FORMAP = 1;
NOMFORMA = 'EFECTIVO';
CANTIDAD = canttot;
TOTAL = totalvta;
SUSPEND;
end^


ALTER PROCEDURE INFORME_DIARIO_VENTAS_TERM (
    FECHA DATE,
    PREFIJO VARCHAR(4),
    AGRUPA CHAR(1))
RETURNS (
    TERMINAL VARCHAR(20),
    NOMTERM VARCHAR(60),
    CANTIDAD INTEGER,
    BASE NUMERIC(18,2),
    DESCTO NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
declare variable totalvta numeric(18,2);
declare variable DEVOL numeric(18,2);
declare variable IVAD numeric(18,2);
declare variable DTOD numeric(18,2);
declare variable factor double precision;
begin
FACTOR = 1;
select MAX(TOTALNETO) from informe_diario_ventas(:fecha,  :PREFIJO, 'T') into :TOTALVTA;
SELECT SUM(FACT_TOTAL) FROM FACTURAS F WHERE FACT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :TOTAL;
if (TOTAL IS NULL) then
    TOTAL = 0;
SELECT SUM(DEVT_TOTAL) FROM devoluciones_ventas V WHERE DEVT_FECHA = :FECHA AND ((V.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N'
    INTO :DEVOL;
if (DEVOL IS NULL) then
    DEVOL = 0;
TOTAL = TOTAL - DEVOL;
if (TOTAL <> 0) then
    FACTOR = CAST(TOTALVTA AS DOUBLE PRECISION) / CAST(TOTAL AS DOUBLE PRECISION);
if (AGRUPA = 'I') then
    FOR SELECT MAX(AUDI_IPCLIENTE), COUNT(FACT_ID), SUM(FACT_TOTAL), SUM(FACT_IVAMONTO), SUM(FACT_DTOMONTO)
        FROM FACTURAS F, AUDITORIA A
        WHERE FACT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' AND
        A.TIDO_COD = 31 AND AUDI_IDDOC = F.FACT_ID AND AUDI_OPER = 'I' GROUP BY AUDI_IPCLIENTE
        INTO :TERMINAL, :CANTIDAD, :TOTAL, :IVAMONTO, :DESCTO
        DO
        BEGIN
        SELECT SUM(DEVT_TOTAL), SUM(DEVT_IVAMONTO), SUM(DEVT_DTOMONTO)
            FROM devoluciones_ventas V, AUDITORIA A
            WHERE DEVT_FECHA = :FECHA AND A.TIDO_COD = 33 AND AUDI_IDDOC = V.devt_id AND AUDI_OPER = 'I'
             and ((V.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N' AND AUDI_IPCLIENTE = :TERMINAL
             INTO :DEVOL, IVAD, :DTOD;
        if (DEVOL IS NULL) then
            DEVOL = 0;
        if (IVAD IS NULL) then
            IVAD = 0;
        if (DTOD IS NULL) then
            DTOD = 0;
        TOTAL = TOTAL - DEVOL;
        IVAMONTO = IVAMONTO - IVAD;
        DESCTO = DESCTO - DTOD;
        SELECT TERM_NOMBRE FROM TERMINALES_NOMBRES WHERE TERM_IP = :TERMINAL INTO :NOMTERM;
        TOTAL = ROUND(TOTAL * FACTOR, 0);
        IVAMONTO = ROUND(IVAMONTO * FACTOR, 0);
        DESCTO = ROUND(DESCTO * FACTOR, 0);
        BASE = TOTAL - IVAMONTO;
        suspend;
        END
if (AGRUPA = 'U') then
    FOR SELECT MAX(AUDI_USUARIO), COUNT(FACT_ID), SUM(FACT_TOTAL), SUM(FACT_IVAMONTO), SUM(FACT_DTOMONTO)
        FROM FACTURAS F, AUDITORIA A
        WHERE FACT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' AND
        A.TIDO_COD = 31 AND AUDI_IDDOC = F.FACT_ID AND AUDI_OPER = 'I' GROUP BY AUDI_USUARIO
        INTO :TERMINAL, :CANTIDAD, :TOTAL, :IVAMONTO, :DESCTO
        DO
        BEGIN
        SELECT SUM(DEVT_TOTAL), SUM(DEVT_IVAMONTO), SUM(DEVT_DTOMONTO)
            FROM devoluciones_ventas V, AUDITORIA A
            WHERE DEVT_FECHA = :FECHA AND A.TIDO_COD = 33 AND AUDI_IDDOC = V.devt_id AND AUDI_OPER = 'I'
             and ((V.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N' AND AUDI_USUARIO = :TERMINAL
             INTO :DEVOL, IVAD, :DTOD;
        if (DEVOL IS NULL) then
            DEVOL = 0;
        if (IVAD IS NULL) then
            IVAD = 0;
        if (DTOD IS NULL) then
            DTOD = 0;
        TOTAL = TOTAL - DEVOL;
        IVAMONTO = IVAMONTO - IVAD;
        DESCTO = DESCTO - DTOD;
        NOMTERM = TERMINAL;
        TOTAL = ROUND(TOTAL * FACTOR, 0);
        IVAMONTO = ROUND(IVAMONTO * FACTOR, 0);
        DESCTO = ROUND(DESCTO * FACTOR, 0);
        BASE = TOTAL - IVAMONTO;
        suspend;
        END
if (AGRUPA = 'P') then
    FOR SELECT MAX(PTVT_ID), COUNT(FACT_ID), SUM(FACT_TOTAL), SUM(FACT_IVAMONTO), SUM(FACT_DTOMONTO)
        FROM FACTURAS F
        WHERE FACT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
        GROUP BY PTVT_ID
        INTO :TERMINAL, :CANTIDAD, :TOTAL, :IVAMONTO, :DESCTO
        DO
        BEGIN
        SELECT SUM(DEVT_TOTAL), SUM(DEVT_IVAMONTO), SUM(DEVT_DTOMONTO) FROM devoluciones_ventas V WHERE DEVT_FECHA = :FECHA AND
             ((V.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N' AND PTVT_ID = :TERMINAL
             INTO :DEVOL, IVAD, :DTOD;
        if (DEVOL IS NULL) then
            DEVOL = 0;
        if (IVAD IS NULL) then
            IVAD = 0;
        if (DTOD IS NULL) then
            DTOD = 0;
        TOTAL = TOTAL - DEVOL;
        IVAMONTO = IVAMONTO - IVAD;
        DESCTO = DESCTO - DTOD;
        SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :TERMINAL INTO :NOMTERM;
        TOTAL = ROUND(CAST(TOTAL AS DOUBLE PRECISION) * FACTOR, 0);
        IVAMONTO = ROUND(CAST(IVAMONTO AS DOUBLE PRECISION) * FACTOR, 0);
        DESCTO = ROUND(DESCTO * FACTOR, 0);
        BASE = TOTAL - IVAMONTO;
        suspend;
        END
end^


ALTER PROCEDURE INSERTE_SALDO_INICIAL (
    ITEM INTEGER,
    CUEN_COD VARCHAR(20),
    TERC_NIT VARCHAR(20),
    PROY_COD VARCHAR(4),
    CENT_COD VARCHAR(4),
    ARTI_COD VARCHAR(15),
    DOCO_NUMERO VARCHAR(8),
    TIPODOC INTEGER,
    DOCO_VENCE CHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2))
AS
BEGIN
  INSERT INTO SALDOS_INICIALES (SAIN_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, DOCO_NUMERO, SAIN_TIPODOC, DOCO_VENCE, SAIN_DEBITO, SAIN_CREDITO)
    VALUES (:ITEM, :CUEN_COD, :TERC_NIT, :PROY_COD, :CENT_COD, :ARTI_COD, :DOCO_NUMERO, :TIPODOC, :DOCO_VENCE, :DEBITO, :CREDITO);
END^


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(8),
    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
        ELSE
            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^


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^


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^


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
declare variable CAMBCOSTO NUMERIC(18,2);
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;
  SELECT SUM((C.caco_antcosto-C.caco_nvocosto) * M.mvar_cant)
    FROM MOVIMIENTO_ARTICULO M, cambio_costo C WHERE M.mvar_tipodoc = 10 AND M.mvar_idref = C.caco_id
    AND M.mvar_fecha >= :fecini AND M.mvar_fecha <= :fecfin AND M.arti_cod = :articulo and c.caco_clase <= 2
    INTO :CAMBCOSTO;
  if (cambcosto IS NULL) then
    cambcosto = 0;
  if (cambcosto > 0) then
    SALIDA = SALIDA + CAMBCOSTO;
  ELSE
    ENTRADA = ENTRADA - CAMBCOSTO; -- ES NEGATIVO
  SUSPEND;
END^


ALTER PROCEDURE KARDEX_ARTICULO_MES_N (
    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_n(ARTICULO, FECINI) returning_values (INICIAL);
  SELECT SUM(COST_ENTP) FROM costos_niif
    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_niif
    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND
          (ARTI_COD = :ARTICULO) INTO :SALIDA;
  if (SALIDA IS NULL) then
    SALIDA = 0;
  SUSPEND;
END^


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^


ALTER PROCEDURE KARDEX_DESDE_HASTA_N (
    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_n(ARTICULO, FECINI) returning_values (INICIAL_PESOS);
  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM costos_niif
    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^


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^


ALTER PROCEDURE KARDEX_INVENTARIO_MES_N (
    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_n(CODIGO, FECINI, FECFIN) returning_values (:INICIAL, :ENTRADA, :SALIDA);
    FINAL = INICIAL + ENTRADA - SALIDA;
    SUSPEND;
    END
END^


ALTER PROCEDURE LEE_CONFIGURACION (
    MODULO VARCHAR(50),
    CATEGORIA VARCHAR(50),
    PROPIEDAD VARCHAR(255))
RETURNS (
    VALOR VARCHAR(255))
AS
BEGIN
SELECT CONF_VALOR FROM CONFIGURACION WHERE CONF_MODULO = :MODULO AND CONF_CATEGORIA = :CATEGORIA AND
    CONF_PROPIEDAD = :PROPIEDAD INTO :VALOR;
if (VALOR IS NULL) then
    exception configuracion_no_encontrada 'configuracion ' || :modulo || '-' || :categoria || '-' || :propiedad;
SUSPEND;
END^


ALTER PROCEDURE LIBRO_DIARIO (
    ANO CHAR(4),
    MES INTEGER,
    NIVEL INTEGER,
    FECHAS CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    TIPOCOMP VARCHAR(3),
    NOMCOMP VARCHAR(60),
    FECHA CHAR(8),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    NOMCUENTA VARCHAR(60),
    MAYOR VARCHAR(20),
    CLASE VARCHAR(20),
    SUBCLASE VARCHAR(20),
    GRUPO VARCHAR(20),
    SUBGRUPO VARCHAR(20))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable DIG INTEGER;
BEGIN
EXECUTE PROCEDURE COMPONE_FECHA_CONTA (ANO, MES, 1) RETURNING_VALUES (FECINI);
EXECUTE PROCEDURE FIN_DE_MES (ANO, MES) RETURNING_VALUES (FECFIN);
EXECUTE PROCEDURE digitos_nivel(NIVEL) returning_values (DIG);
if (FECHAS = 'S') then
    FOR SELECT max(SUBSTR(CUEN_COD,1,:DIG)), MAX(ENCO_FECHA), MAX(E.TICO_COD), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(TICO_NOM)
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, TIPO_COMPROBANTE T
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND T.TICO_COD = E.TICO_COD AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
        GROUP BY SUBSTR(CUEN_COD,1,:DIG),ENCO_FECHA
        INTO :CUENTA, :FECHA, :TIPOCOMP, :DEBITOS, :CREDITOS, :NOMCOMP
        DO
        BEGIN
        MAYOR = '';
        CLASE = '';
        SUBCLASE = '';
        GRUPO = '';
        SUBGRUPO = '';
        EXECUTE PROCEDURE digitos_nivel(1) returning_values (DIG);
        MAYOR = SUBSTR(CUENTA,1,DIG);
        if (NIVEL >= 2) then
            BEGIN
            EXECUTE PROCEDURE digitos_nivel(2) returning_values (DIG);
            CLASE = SUBSTR(CUENTA,1,DIG);
            END
        ELSE
            CLASE = CUENTA;
        if (NIVEL >= 3) then
            BEGIN
            EXECUTE PROCEDURE digitos_nivel(3) returning_values (DIG);
            SUBCLASE = SUBSTR(CUENTA,1,DIG);
            END
        ELSE
            SUBCLASE = CUENTA;
        if (NIVEL >= 4) then
            BEGIN
            EXECUTE PROCEDURE digitos_nivel(4) returning_values (DIG);
            GRUPO = SUBSTR(CUENTA,1,DIG);
            END
        ELSE
            GRUPO = CUENTA;
        if (NIVEL >= 5) then
            BEGIN
            EXECUTE PROCEDURE digitos_nivel(5) returning_values (DIG);
            SUBGRUPO = SUBSTR(CUENTA,1,DIG);
            END
        else
            SUBGRUPO = CUENTA;
        SELECT CUEN_NOM FROM CUENTAS WHERE CUEN_COD = :CUENTA INTO :NOMCUENTA;
        SUSPEND;
        END
ELSE
    FOR SELECT max(SUBSTR(CUEN_COD,1,:DIG)), MAX(ENCO_FECHA), MAX(E.TICO_COD), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(TICO_NOM)
        FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, TIPO_COMPROBANTE T
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND T.TICO_COD = E.TICO_COD AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
        GROUP BY SUBSTR(CUEN_COD,1,:DIG),E.TICO_COD
        INTO :CUENTA, :FECHA, :TIPOCOMP, :DEBITOS, :CREDITOS, :NOMCOMP
        DO
        BEGIN
        MAYOR = '';
        CLASE = '';
        SUBCLASE = '';
        GRUPO = '';
        SUBGRUPO = '';
        EXECUTE PROCEDURE digitos_nivel(1) returning_values (DIG);
        MAYOR = SUBSTR(CUENTA,1,DIG);
        if (NIVEL >= 2) then
            BEGIN
            EXECUTE PROCEDURE digitos_nivel(2) returning_values (DIG);
            CLASE = SUBSTR(CUENTA,1,DIG);
            END
        ELSE
            CLASE = CUENTA;
        if (NIVEL >= 3) then
            BEGIN
            EXECUTE PROCEDURE digitos_nivel(3) returning_values (DIG);
            SUBCLASE = SUBSTR(CUENTA,1,DIG);
            END
        ELSE
            SUBCLASE = CUENTA;
        if (NIVEL >= 4) then
            BEGIN
            EXECUTE PROCEDURE digitos_nivel(4) returning_values (DIG);
            GRUPO = SUBSTR(CUENTA,1,DIG);
            END
        ELSE
            GRUPO = CUENTA;
        if (NIVEL >= 5) then
            BEGIN
            EXECUTE PROCEDURE digitos_nivel(5) returning_values (DIG);
            SUBGRUPO = SUBSTR(CUENTA,1,DIG);
            END
        else
            SUBGRUPO = CUENTA;
        SELECT CUEN_NOM FROM CUENTAS WHERE CUEN_COD = :CUENTA INTO :NOMCUENTA;
        SUSPEND;
        END
END^


ALTER PROCEDURE LIBRO_DIARIO_CUENTA (
    ANO CHAR(4),
    MES INTEGER,
    RESUMIDO CHAR(1),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TIPOINI VARCHAR(3),
    TIPOFIN VARCHAR(3))
RETURNS (
    CUENTA VARCHAR(20),
    TIPOCOMP VARCHAR(3),
    NOMCOMP VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    NOMCUENTA VARCHAR(60),
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(8))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
BEGIN
  if ((CTAFIN IS NULL) or (CTAFIN = '')) then
    CTAFIN = '999999';
  if (TIPOINI IS NULL) then
    TIPOINI = '';
  if ((TIPOFIN IS NULL) or (TIPOFIN = '')) then
    TIPOFIN = 'zzz';
  EXECUTE PROCEDURE COMPONE_FECHA_CONTA (ANO, MES, 1) RETURNING_VALUES (FECINI);
  EXECUTE PROCEDURE FIN_DE_MES (ANO, MES) RETURNING_VALUES (FECFIN);
  /* PARA CADA CUENTA BUSQUE LOS MOVIMIENTOS AGRUPADOS POR TIPO DE COMPROBANTE */
  FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN ORDER BY CUEN_COD INTO :CUENTA, :NOMCUENTA
    DO
    BEGIN
    if (RESUMIDO = 'S') then
        BEGIN
        FOR SELECT MAX(ENCO_FECHA), MAX(E.TICO_COD), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(TICO_NOM)
            FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, TIPO_COMPROBANTE T
            WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND T.TICO_COD = E.TICO_COD AND CUEN_COD = :CUENTA AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND E.tico_cod >= :tipoini AND E.TICO_COD <= :tipofin
            GROUP BY E.TICO_COD, ENCO_FECHA
            ORDER BY E.TICO_COD, ENCO_FECHA
            INTO :FECHA, :TIPOCOMP, :DEBITOS, :CREDITOS, :NOMCOMP
            DO
              SUSPEND;
        END
    ELSE
        BEGIN
        FOR SELECT E.TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, CODE_DEBITO, CODE_CREDITO, TICO_NOM, CODE_REFER
            FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, TIPO_COMPROBANTE T
            WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND T.TICO_COD = E.TICO_COD AND CUEN_COD = :CUENTA AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND E.tico_cod >= :tipoini AND E.TICO_COD <= :tipofin
            ORDER BY E.TICO_COD, ENCO_FECHA, E.PRCO_PREF, E.ENCO_NUMERO, CODE_ITEM
            INTO :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITOS, :CREDITOS, :NOMCOMP, :REFER
            DO
              SUSPEND;
        END
    END
END^


ALTER PROCEDURE LIBRO_DIARIO_CUENTA_N (
    ANO CHAR(4),
    MES INTEGER,
    RESUMIDO CHAR(1),
    CTAINI VARCHAR(20),
    CTAFIN VARCHAR(20),
    TIPOINI VARCHAR(3),
    TIPOFIN VARCHAR(3))
RETURNS (
    CUENTA VARCHAR(20),
    TIPOCOMP VARCHAR(3),
    NOMCOMP VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA CHAR(8),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    NOMCUENTA VARCHAR(140),
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(8))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
BEGIN
  if ((CTAFIN IS NULL) or (CTAFIN = '')) then
    CTAFIN = '999999';
  if (TIPOINI IS NULL) then
    TIPOINI = '';
  if ((TIPOFIN IS NULL) or (TIPOFIN = '')) then
    TIPOFIN = 'zzz';
  EXECUTE PROCEDURE COMPONE_FECHA_CONTA (ANO, MES, 1) RETURNING_VALUES (FECINI);
  EXECUTE PROCEDURE FIN_DE_MES (ANO, MES) RETURNING_VALUES (FECFIN);
  /* PARA CADA CUENTA BUSQUE LOS MOVIMIENTOS AGRUPADOS POR TIPO DE COMPROBANTE */
  FOR SELECT CUEN_COD, CUEN_NOM FROM cuentas_niif WHERE CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN ORDER BY CUEN_COD INTO :CUENTA, :NOMCUENTA
    DO
    BEGIN
    if (RESUMIDO = 'S') then
        BEGIN
        FOR SELECT MAX(ENCO_FECHA), MAX(E.TICO_COD), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(TICO_NOM)
            FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D, TIPO_COMPROBANTE T
            WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND T.TICO_COD = E.TICO_COD AND CUEN_COD = :CUENTA AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND E.tico_cod >= :tipoini AND E.TICO_COD <= :tipofin
            GROUP BY E.TICO_COD, ENCO_FECHA
            ORDER BY E.TICO_COD, ENCO_FECHA
            INTO :FECHA, :TIPOCOMP, :DEBITOS, :CREDITOS, :NOMCOMP
            DO
              SUSPEND;
        END
    ELSE
        BEGIN
        FOR SELECT E.TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, CODE_DEBITO, CODE_CREDITO, TICO_NOM, CODE_REFER
            FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D, TIPO_COMPROBANTE T
            WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND T.TICO_COD = E.TICO_COD AND CUEN_COD = :CUENTA AND ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND E.tico_cod >= :tipoini AND E.TICO_COD <= :tipofin
            ORDER BY E.TICO_COD, ENCO_FECHA, E.PRCO_PREF, E.ENCO_NUMERO, CODE_ITEM
            INTO :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITOS, :CREDITOS, :NOMCOMP, :REFER
            DO
              SUSPEND;
        END
    END
END^


ALTER PROCEDURE LIQ_PARQUEADERO (
    PLACA VARCHAR(8))
RETURNS (
    ID INTEGER,
    FECINI DATE,
    FECFIN DATE,
    HORAINI TIME,
    HORAFIN TIME,
    CANT INTEGER,
    PRUNIT NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
declare variable tarifa varchar(10);
declare variable maxc integer;
declare variable fijo numeric(18,2);
declare variable minc integer;
declare variable fijomin numeric(18,2);
begin
/* BUSQUE LA PLACA SIN CERRAR */
ID = 0;
SELECT PARQ_ID, PARQ_FECINI, PARQ_HORAINI, TIVH_MAX, TIVH_TARIFA, TIVH_FIJO, TIVH_MODO, TIVH_MIN, TIVH_FIJOMIN
    FROM PARQUEADERO P, TIPO_VEHICULO T
    WHERE P.tivh_cod = t.tivh_cod AND PARQ_VEHICULO = :PLACA AND PARQ_FACTURA = 0 AND PARQ_ANULADO = 'N'
    INTO :ID, :FECINI, :HORAINI, :maxc, :prunit, :FIJO, :TARIFA, :MINC, :FIJOMIN;
if (MINC IS NULL) then
    MINC = 0;
if (FIJOMIN IS NULL) then
    FIJOMIN = 0;
if (ID <> 0) then
    BEGIN
    FECFIN = cast('now' as DATE);
    HORAFIN = cast('now' as TIME);
    if (fecfin > fecini) then
        BEGIN
        if (TARIFA = 'MINUTO') then
            BEGIN
            CANT = 1440 * (fecfin - FECINI);
            if (horafin < horaini) then
                CANT = CANT - CEIL((horaini - horafin) / 60);
            END
        if (TARIFA = 'CUARTO') then
            BEGIN
            CANT = 96 * (fecfin - FECINI);
            if (horafin < horaini) then
                CANT = CANT - CEIL((horaini - horafin) / 900);
            END
        if (TARIFA = 'MEDIA') then
            BEGIN
            CANT = 48 * (fecfin - FECINI);
            if (horafin < horaini) then
                CANT = CANT - CEIL((horaini - horafin) / 1800);
            END
        if (TARIFA = 'HORA') then
            BEGIN
            CANT = 24 * (fecfin - FECINI);
            if (horafin < horaini) then
                CANT = CANT - CEIL((horaini - horafin) / 3600);
            END
        if (TARIFA = 'DIA') then
            CANT = (fecfin - FECINI);
        if (TARIFA = 'MES') then
            CANT = 1;
        END
    else
        BEGIN
        if (TARIFA = 'MINUTO') then
            BEGIN
            CANT = CEIL((horafin - horaini) / 60);
            END
        if (TARIFA = 'CUARTO') then
            BEGIN
            CANT = CEIL((horafin - horaini) / 900);
/*            CANT = (horafin - horaini);*/
            END
        if (TARIFA = 'MEDI') then
            BEGIN
            CANT = CEIL((horafin - horaini) / 1800);
            END
        if (TARIFA = 'HORA') then
            BEGIN
            CANT = CEIL((horafin - horaini) / 3600);
            END
        if (TARIFA = 'DIA') then
            CANT = 1;
        if (TARIFA = 'MES') then
            CANT = 1;
        END

    if (CANT < MINC) then
        BEGIN
        total = FIJOMIN;
        PRUNIT = TOTAL / CANT;
        END
    ELSE
        if (CANT > MAXC) then
            BEGIN
            total = FIJO;
            PRUNIT = TOTAL / CANT;
            END
        ELSE
            TOTAL = CANT * PRUNIT;
    END
suspend;
end^


ALTER PROCEDURE LIQUIDA_VACACIONES (
    NITEMPL VARCHAR(20),
    FECHA DATE)
RETURNS (
    IDVACAC INTEGER,
    FECING DATE,
    DIASLAB INTEGER,
    DIASDIS INTEGER)
AS
declare variable ANOI INTEGER;
declare variable MESI INTEGER;
declare variable DIAI INTEGER;
declare variable ANOH INTEGER;
declare variable MESH INTEGER;
declare variable DIAH INTEGER;
declare variable DIASDISFRU INTEGER;
BEGIN
select nosi_fecvac from nomina_saldini e where terc_nit = :nitempl into :fecing;
if (fecing IS NULL) then
    SELECT E.empl_fecing FROM EMPLEADOS E WHERE E.terc_nit = :nitempl INTO :fecing;
/* DIAS LABORADOS */
DIAI = extract (DAY FROM FECING);
DIAH = extract (DAY FROM FECHA);
MESI = extract (MONTH FROM FECING);
MESH = extract (MONTH FROM FECHA);
ANOI = extract (YEAR FROM FECING);
ANOH = extract (YEAR FROM FECHA);
DIASLAB = (anoh-anoi)*360;
DIASLAB = DIASLAB + (MESH - MESI) * 30;
DIASLAB = DIASLAB + (DIAH - DIAI) + 1;
/* DIAS DISFRUTADOS */
SELECT SUM(VACA_DIASSOL) FROM VACACIONES WHERE TERC_NIT = :nitempl AND VACA_FECHA >= :fecing
    INTO :diasdis;
if (diasdis is null) then
    diasdis = 0;
diasdis = diaslab * 15 / 360 - diasdis;
/* MENOS DIAS INGRESADOS MANUALMENTE */
SELECT SUM(vd.vadi_dias) FROM vacaciones_disfrut v, vacaciones_disfrut_det vd
    WHERE v.vadi_id = vd.vadi_id and v.TERC_NIT = :nitempl into :DIASDISFRU;
if (DIASDISFRU is null) then
    DIASDISFRU = 0;
diasdis = diasdis - DIASDISFRU;
idvacac = GEN_ID(ID_VACACIONES,1);
SUSPEND;
END^


ALTER PROCEDURE LIQUIDACION_APORTES (
    ANO VARCHAR(4),
    MES INTEGER,
    MORA NUMERIC(18,4),
    DIASMORA INTEGER,
    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 totadmin numeric(18,2);
declare variable totadminneg numeric(18,2);
declare variable tipoaport char(1);
declare variable nitempl varchar(20);
declare variable totdetvalor numeric(18,2);
declare variable totdetvalorneg numeric(18,2);
declare variable totibc integer;
declare variable INTMORA NUMERIC(18,2);
declare variable CTAPAGAR VARCHAR(20);
begin
itemaportadmi = 1;
itemdetaport = 1;
idaporte = gen_id(id_pgaport,1);
select PAAN_TIPOAPORT from parametros_ano where PAAN_ANO = :ANO into :tipoaport;
INSERT INTO pago_aportes_nom (PGAP_ID, PGAP_IDNOM)
    SELECT :IDAPORTE, NOMI_ID FROM NOMINA WHERE NOMI_ANO = :ANO AND EXTRACT(MONTH FROM NOMI_FECCAUSA) = :MES;

INSERT INTO PAGO_APORTES_EMPLEADOS (PGAP_ID, TERC_NIT)
    select DISTINCT :idaporte, TERC_NIT FROM nomina_detalle ND, PAGO_APORTES_NOM PA
    WHERE PA.pgap_idnom = ND.nomi_id AND PA.pgap_id = :idaporte;

for select A.TERC_NIT, A.ADMI_EPS, A.ADMI_AFP, A.ADMI_CCF, A.ADMI_AFC, A.ADMI_ARP
    from ADMINISTRADORA A, TERCEROS t
    where T.TERC_NIT = A.TERC_NIT and t.terc_admini = 'S' Into :nit, :eps, :afp, :CCF, :afc, :arp
  do
  begin
  FOR select max(c.conc_ctacxp) from nomina_conceptos N, conceptos_nomina C, pago_aportes_nom PA
      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.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte)
      GROUP BY C.conc_ctacxp
      into :ctapagar
      DO
      BEGIN
      select sum (noco_valor) from nomina_conceptos N, conceptos_nomina C, pago_aportes_nom PA
          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 C.conc_ctacxp = :ctapagar and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte 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, pago_aportes_nom PA
          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 C.conc_ctacxp = :ctapagar and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte 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
        intmora = totadmin * ((:MORA * :DIASMORA) /365) / 100;
        execute procedure redondee(:intmora, 2) returning_values (intmora);
        insert into pago_aportes (pgap_id, pgap_item, pgap_tipoap, pgap_conpago, pgap_admin, pgap_monto, pgap_intmora, pgap_fecha, pgap_formulario, pgap_ano, pgap_mes, pgap_ctaconta)
            values (:idaporte, :itemaportadmi, :tipoaport, '', :nit, :totadmin, :intmora, :fecha, :formulario, :ano, :mes, :ctapagar);
        if (CCF = 'S') then
            begin
            for select DISTINCT E.TERC_NIT from EMPLEADOS E, nomina_detalle NC, pago_aportes_nom PA
                where EMPL_CCF = :NIT AND E.terc_nit = NC.terc_nit AND NC.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                into :nitempl
                do
                begin
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and n.conc_cod <> 955 and n.conc_cod <> 956 and n.conc_cod <> 957
                    AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte)
                    into :totibc;
                if (totibc is null) then
                    totibc = 0;
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S'
                    AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                    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) or (N.conc_cod = 10145)))
                    into :totdetvalor;
                if (totdetvalor is null) then
                    totdetvalor = 0;
                if ((:totdetvalor 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 DISTINCT E.TERC_NIT from EMPLEADOS E, nomina_detalle N, pago_aportes_nom PA
                where EMPL_EPS = :NIT AND E.terc_nit = N.terc_nit and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                into :nitempl
                do
                begin
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and n.conc_cod <> 955 and n.conc_cod <> 956 and n.conc_cod <> 957
                    AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte)
                    into :totibc;
                if (totibc is null) then
                    totibc = 0;
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S'
                    AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                    AND noco_valor > 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915) or (N.conc_cod = 938) or (N.conc_cod = 976) or (N.conc_cod = 1016)))
                    into :totdetvalor;
                if (totdetvalor is null) then
                    totdetvalor = 0;
                select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S'
                    AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                    AND noco_valor < 0 and (N.conc_cod = 907 or (N.conc_cod = 914) or (N.conc_cod = 915) or (N.conc_cod = 938) or (N.conc_cod = 976) or (N.conc_cod = 1016)))
                    into :totdetvalorneg;
                if (totdetvalorneg is null) then
                    totdetvalorneg = 0;
                totdetvalor = :totdetvalorneg + :totdetvalor;
                if ((:totdetvalor 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 DISTINCT E.TERC_NIT from EMPLEADOS E, nomina_detalle NC, pago_aportes_nom PA
                where EMPL_AFP = :NIT AND E.terc_nit = NC.terc_nit and NC.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                into :nitempl
                do
                begin
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and n.conc_cod <> 955 and n.conc_cod <> 956 and n.conc_cod <> 957
                    AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte)
                    into :totibc;
                if (totibc is null) then
                    totibc = 0;
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                    AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar AND noco_valor > 0
                    and ((N.conc_cod = 904) or (N.conc_cod = 905) or (N.conc_cod = 906) or (N.conc_cod = 934) or (N.conc_cod = 921) or (N.conc_cod = 102)))
                    into :totdetvalor;
                if (totdetvalor is null) then
                    totdetvalor = 0;
                select sum (NOCO_VALOR*(-1)) from NOMINA_CONCEPTOS N, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                    AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar AND noco_valor < 0
                    and (N.conc_cod = 904 or (N.conc_cod = 905) or (N.conc_cod = 906) or (N.conc_cod = 934) or (N.conc_cod = 921) or (N.conc_cod = 1012)))
                    into :totdetvalorneg;
                if (totdetvalorneg is null) then
                    totdetvalorneg = 0;
                totdetvalor = :totdetvalorneg + :totdetvalor;
                if ((:totdetvalor 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 DISTINCT E.TERC_NIT from EMPLEADOS E, NOMINA_CONCEPTOS NC, pago_aportes_nom PA
                where EMPL_AFC = :NIT AND E.terc_nit = NC.terc_nit
                and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte)
                into :nitempl
                do
                begin
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, pago_aportes_nom PA
                    where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and n.conc_cod <> 955 and n.conc_cod <> 956 and n.conc_cod <> 957
                        and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte)
                    into :totibc;
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, pago_aportes_nom PA
                    where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                    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, pago_aportes_nom PA
                    where (TERC_NIT = :nitempl and NOCO_ENTIDAD = :nit and NOCO_APORTE = 'S' and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                    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 DISTINCT E.TERC_NIT from EMPLEADOS E, nomina_detalle NC, pago_aportes_nom PA
                where EMPL_ARP = :NIT AND E.terc_nit = NC.terc_nit and NC.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                into :nitempl
                do
                begin
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_SALARIO = 'S' and n.conc_cod <> 955 and n.conc_cod <> 956 and n.conc_cod <> 957
                        AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte)
                    into :totibc;
                if (totibc is null) then
                    totibc = 0;
                select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_APORTE = 'S' and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                    AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar 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, pago_aportes_nom PA, CONCEPTOS_NOMINA CN
                    where (TERC_NIT = :nitempl and NOCO_APORTE = 'S' and N.nomi_id = PA.pgap_idnom AND PA.pgap_id = :idaporte
                    AND CN.conc_cod = N.conc_cod AND CN.conc_ctacxp = :ctapagar 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 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
        END
    if (totadmin IS NOT NULL) then
        itemaportadmi = :itemaportadmi + 1;
    itemdetaport = 1;
    END
  SUSPEND;
  end
UPDATE NOMINA N SET nomi_aporok = 'S' WHERE EXISTS (SELECT PGAP_IDNOM FROM pago_aportes_nom WHERE PGAP_IDNOM = N.nomi_id AND PGAP_ID = :idaporte);
end^


ALTER PROCEDURE LIQUIDACION_EMPLEADO (
    NITEMPL VARCHAR(20),
    FECLIQ DATE,
    DIASLAB INTEGER)
RETURNS (
    SALARIOP NUMERIC(18,2),
    PRIMA NUMERIC(18,2),
    FECPRIMA DATE,
    SALARIOC NUMERIC(18,2),
    FECCES DATE,
    CESANTIA NUMERIC(18,2),
    INTCESANT NUMERIC(18,2),
    BASEVAC NUMERIC(18,2),
    FECVAC DATE,
    DIASVAC NUMERIC(9,4),
    VACACION NUMERIC(18,2),
    DSPRESTAMO NUMERIC(18,2),
    DSCARTERA NUMERIC(18,2),
    TOTPAGOS NUMERIC(18,2),
    TOTDESC NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
declare variable SALINTEG CHAR(1);
declare variable FECING DATE;
declare variable TIPOCOT INTEGER;
declare variable FACSAL NUMERIC(9,2);
declare variable aprox integer;
BEGIN
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
select sum(VALOR) FROM causa_nomina_empleado(:fecliq, :nitempl, :diaslab, 'P', 'N') WHERE VALOR > 0 INTO :totpagos;
select sum(VALOR) FROM causa_nomina_empleado(:fecliq, :nitempl, :diaslab, 'B', 'N') WHERE VALOR > 0 INTO :total;
if (TOTPAGOS IS NULL) then
    TOTPAGOS = 0;
if (TOTAL IS NULL) then
    TOTAL = 0;
totpagos = total + totpagos;
TOTAL = NULL;
select sum(VALOR) FROM causa_nomina_empleado(:fecliq, :nitempl, :diaslab, 'P', 'N') WHERE VALOR < 0 INTO :totdesc;
select sum(VALOR) FROM causa_nomina_empleado(:fecliq, :nitempl, :diaslab, 'B', 'N') WHERE VALOR < 0 INTO :total;
if (TOTDESC IS NULL) then
    TOTDESC = 0;
if (TOTAL IS NULL) then
    TOTAL = 0;
totdesc = (total + totdesc) * -1;
TOTAL = totpagos - totdesc;
/* calcule el promedio de sueldo para cesantias */
select e.empl_salinteg, e.empl_fecing, e.tcot_cod from empleados e where terc_nit = :nitempl into :salinteg, :FECING, :TIPOCOT;
/* si es aprendiz no haga prima, cesantia, vacaciones */
if ((TIPOCOT <> 12) AND (TIPOCOT <> 19)) then
    BEGIN
    if (SALINTEG <> 'S') then
        BEGIN
        /* CESANTIA */
        EXECUTE PROCEDURE CALCULE_CESANTIA_LIQ(:nitempl, :fecliq) returning_values (:fecces, :salarioc, :cesantia, :intcesant);
        /* PRIMA */
        EXECUTE PROCEDURE SALARIO_PROMEDIO (:nitempl, :fecliq, 'P') returning_values (:salariop);
        execute procedure REDONDEE(:salariop, :APROX) returning_values (salariop);
        /* CALCULE FECHA DEL ULTIMO PAGO DE PRIMA */
        SELECT MAX(N.nomi_feccausa+1) 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 n.nomi_feccausa > :fecing and
            ((nc.conc_cod = 966) or (nc.conc_cod = 967)) AND NC.noco_deduc = 'N' AND NC.noco_aporte = 'N' AND NC.noco_prov = 'N'
            INTO :FECPRIMA;
        if (fecprima IS NULL) then
            begin
            select nosi_fecpri+1 from nomina_saldini e where terc_nit = :nitempl into :fecprima;
            if (fecprima IS NULL) then
                fecprima = fecing;
            end
        if (FECPRIMA < FECING) then
            FECPRIMA = FECING;
        EXECUTE PROCEDURE CALCULA_PRIMA(:nitempl, :salariop,  :fecliq, :fecprima) returning_values (:prima);
        END
    ELSE
        BEGIN
        SALARIOP = 0;
        FECPRIMA = FECING;
        PRIMA = 0;
        FECCES = FECING;
        SALARIOC = 0;
        CESANTIA = 0;
        INTCESANT = 0;
        END
    
    /* VACACIONES */
    EXECUTE PROCEDURE calcula_vacaciones(:nitempl, :fecliq) returning_values (:FECVAC, :diasvac, :BASEVAC, :vacacion);
    END
ELSE
    BEGIN
    FECPRIMA = FECING;
    PRIMA = 0;
    FECCES = FECING;
    CESANTIA = 0;
    INTCESANT = 0;
    FECVAC = FECING;
    DIASVAC = 0;
    BASEVAC = 0;
    VACACION = 0;
    END

/* PRESTAMOS */
SELECT SUM (PRCU_MONTO-PRCU_ABONO) FROM PRESTAMO_CUOTAS P, PRESTAMO_NOMINA PN
    WHERE PN.prno_id = P.prno_id AND PN.terc_nit = :nitempl INTO :dsprestamo;
IF (dsprestamo IS NULL) THEN
    dsprestamo = 0;

/* CARTERA */
SELECT SUM(SALDO) FROM cartera_cliente(:nitempl, :fecliq, '0', 0, 'N', 0) INTO :dscartera;
IF (dscartera IS NULL) THEN
    dscartera = 0;

totpagos = :PRIMA + :CESANTIA + :INTCESANT + :VACACION + :totpagos;
totdesc = totdesc + :DSPRESTAMO + dscartera;
total = :totpagos - :totdesc;
SUSPEND;
END^


ALTER PROCEDURE LIQUIDACION_IMPORTACION (
    ID INTEGER)
RETURNS (
    ITEM INTEGER,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    DESCADIC BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    PRUMON NUMERIC(18,2),
    TRMFAC NUMERIC(18,2),
    FLETES NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    IMPUESTOS NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    SUMAFLETES NUMERIC(18,2),
    SUMASEGUROS NUMERIC(18,2),
    SUMAIMPTOS NUMERIC(18,2),
    SUMAOTROS NUMERIC(18,2))
AS
declare variable tigi integer;
declare variable tipo char(1);
declare variable liquida char(1);
declare variable total double precision;
declare variable totitem double precision;
declare variable gasto double precision;
declare variable PESO double precision;
declare variable VOLUMEN double precision;
declare variable FOB NUMERIC(18,2);
declare variable CERRADA CHAR(1);
begin
DELETE FROM importacion_liquidacion WHERE IMPO_ID = :ID;
ITEM = 0;
FOR SELECT FD.arti_cod, FD.fpde_cant * fd.fpde_factor, FD.fpde_prunit*(1 - (fd.fpde_dtoporc/100)), FD.fpde_prunitmon*(1 - (fd.fpde_dtoporc/100)), FD.fpde_trm,
    FD.fpde_flete, FD.fpde_seguro, FD.fpde_ivamonto, FD.fpde_otrogto, FD.fpde_peso, FD.fpde_volumen, FD.fpde_fob
    FROM FACTURA_PROFORMA F, factura_proforma_det FD
    WHERE F.fapo_id = FD.fapo_id AND F.fapo_idimpor = :ID AND FD.fpde_anulado = 'N'
    INTO :articulo, :cant, :prunit, :prumon, :trmfac, :fletes, :seguros, :impuestos, :otros, :peso, :volumen, :fob
    DO
    BEGIN
    ITEM = ITEM + 1;
    INSERT INTO importacion_liquidacion (IMPO_ID, IMLI_ITEM, ARTI_COD, IMLI_CANT, IMLI_PRUNIT,
        IMLI_PRUMON, IMLI_FLETES, IMLI_SEGUROS, IMLI_IMPTOS, IMLI_OTROS, IMLI_PESO, IMLI_VOLUMEN, IMLI_FOB)
        VALUES (:ID, :ITEM, :articulo, :cant, :prunit,
        :prumon, :fletes, :seguros, :impuestos, :otros, :peso, :volumen, :fob);
    END
SELECT IMPO_CERRADA FROM IMPORTACION WHERE IMPO_ID = :ID INTO :CERRADA;
if (CERRADA = 'N') then
    BEGIN
    /* ASIGNE LOS GASTOS */
    FOR SELECT G.tigi_cod, G.gain_valor * G.gain_trm FROM gastos_importacion G WHERE G.gain_idimpor = :ID and g.gain_anulado = 'N'
        into :tigi, gasto
        DO
        BEGIN
        /* calcule la proporcion por item ya sea por peso, volumen, cantidad o valor */
        select t.tigi_tipo, t.tigi_liquidacion from tipo_gastos_importacion t where t.tigi_cod = :tigi
            into :tipo, :liquida;
        if (liquida = 'C') then
            begin
            /* cubicaje-volumen */
            select sum(imli_volumen) from importacion_liquidacion where impo_id = :id into :total;
            for select imli_item, imli_volumen from importacion_liquidacion where impo_id = :id
                into :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update importacion_liquidacion
                        set imli_fletes = imli_fletes + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'S') then
                    update importacion_liquidacion
                        set imli_seguros = imli_seguros + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'I') then
                    update importacion_liquidacion
                        set imli_imptos = imli_imptos + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'O') then
                    update importacion_liquidacion
                        set imli_otros = imli_otros + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                end
            end
        if (liquida = 'P') then
            begin
            /* peso */
            select sum(imli_peso) from importacion_liquidacion where impo_id = :id into :total;
            for select imli_item, imli_peso from importacion_liquidacion where impo_id = :id
                into :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update importacion_liquidacion
                        set imli_fletes = imli_fletes + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'S') then
                    update importacion_liquidacion
                        set imli_seguros = imli_seguros + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'I') then
                    update importacion_liquidacion
                        set imli_imptos = imli_imptos + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'O') then
                    update importacion_liquidacion
                        set imli_otros = imli_otros + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                end
            end
        if (liquida = 'T') then
            begin
            /* cantidad total */
            select sum(imli_cant) from importacion_liquidacion where impo_id = :id into :total;
            for select imli_item, imli_cant from importacion_liquidacion where impo_id = :id
                into :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update importacion_liquidacion
                        set imli_fletes = imli_fletes + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'S') then
                    update importacion_liquidacion
                        set imli_seguros = imli_seguros + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'I') then
                    update importacion_liquidacion
                        set imli_imptos = imli_imptos + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'O') then
                    update importacion_liquidacion
                        set imli_otros = imli_otros + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                end
            end
        if (liquida = 'V') then
            begin
            /* valor */
            select sum(imli_fob) from importacion_liquidacion where impo_id = :id into :total;
            for select imli_item, imli_fob from importacion_liquidacion where impo_id = :id
                into :item, :totitem
                do
                begin
                if (tipo = 'F') then
                    update importacion_liquidacion
                        set imli_fletes = imli_fletes + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'S') then
                    update importacion_liquidacion
                        set imli_seguros = imli_seguros + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'I') then
                    update importacion_liquidacion
                        set imli_imptos = imli_imptos + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                if (tipo = 'O') then
                    update importacion_liquidacion
                        set imli_otros = imli_otros + (:gasto * :totitem / :total)
                    where impo_id = :id and imli_item = :item;
                end
            end
        END
    END
SELECT SUM(IMLI_FLETES), SUM(IMLI_SEGUROS), SUM(IMLI_IMPTOS), SUM(IMLI_OTROS)
    FROM importacion_liquidacion WHERE IMPO_ID = :ID
    INTO :sumafletes, :sumaseguros, :sumaimptos, :sumaotros;
/* reporte los articulos */
for select IMLI_ITEM, ARTI_COD, IMLI_CANT, IMLI_PRUNIT, IMLI_PRUMON, IMLI_FLETES, IMLI_SEGUROS, IMLI_IMPTOS, IMLI_OTROS
    from importacion_liquidacion where impo_id = :id
    INTO :ITEM, :articulo, :cant, :prunit, :prumon, :fletes, :seguros, :impuestos, :otros
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD, ARTI_DESCORTA, ARTI_OBS FROM ARTICULO WHERE ARTI_COD = :articulo
        INTO :descripcion, :unidad, :descorta, :descadic;
    SUSPEND;
    END
    
end^


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
declare variable valcant VARCHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'EXISTENCIAS', 'SUGERIR EL LOTE MAS NUEVO O MAS VIEJO SIN IMPORTAR LA CANTIDAD A SALIR') returning_values (:valcant);
/* 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 > 0 AND ((:VALCANT = 'SI') or (lote_saldo >= :cant))
    ORDER BY LOTE_VENCE, LOTE_ID
    into :lote, :saldo, :vence
    do
      SUSPEND;
END^


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


ALTER PROCEDURE LISTA_PRECIOS_OFFLINE (
    VEND INTEGER)
RETURNS (
    LIPR_COD INTEGER,
    ARTI_COD VARCHAR(15),
    LIPR_NOM VARCHAR(30),
    PRAR_FIJO NUMERIC(18,2))
AS
begin
if (:VEND = 0) then
    BEGIN
    FOR select P.LIPR_COD, ARTI_COD, LIPR_NOM, PRAR_FIJO from PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE P.PRAR_FIJO > 0 AND P.LIPR_COD = L.LIPR_COD INTO :LIPR_COD, ARTI_COD, LIPR_NOM, PRAR_FIJO
      do
      begin
        EXECUTE PROCEDURE NOMBRE_ASCII(LIPR_NOM) returning_values (LIPR_NOM);
        suspend;
      END
    end
ELSE
    BEGIN
    FOR select P.LIPR_COD, ARTI_COD, LIPR_NOM, PRAR_FIJO from PRECIOS_ARTICULO P, LISTA_PRECIOS L, LISTAPREC_VENDEDOR V
    WHERE P.PRAR_FIJO > 0 AND P.LIPR_COD = L.LIPR_COD AND L.lipr_cod = V.lipr_cod AND V.vend_cod = :VEND
    INTO :LIPR_COD, ARTI_COD, LIPR_NOM, PRAR_FIJO
      do
      begin
        EXECUTE PROCEDURE NOMBRE_ASCII(LIPR_NOM) returning_values (LIPR_NOM);
        suspend;
      END
    END
end^


ALTER PROCEDURE LISTAS_ARTICULO (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    DIAS INTEGER,
    TODAS CHAR(1),
    HORA TIME,
    AGENCIA INTEGER)
RETURNS (
    NOMLISTA VARCHAR(30),
    CODLISTA INTEGER,
    IVAINC CHAR(1))
AS
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DIA smallint;
declare variable DIASEM smallint;
declare variable HORAINI time;
declare variable HORAFIN time;
declare variable SUCID INTEGER;
declare variable PORAGENCIA CHAR(2);
declare variable PORUSUARIO CHAR(2);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR AGENCIA') returning_values (:poragencia);
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR USUARIO') returning_values (:porusuario);
if (TODAS = 'N') then
    begin
    DIA = EXTRACT(weekday FROM FECHA) + 1;
    /* Busque las listas validas hoy */
    if (PORUSUARIO = 'NO') then
        begin
        FOR SELECT L.LIPR_COD, LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, LIPR_MODIF, LIPR_DIASEM, LIPR_HORAINI, LIPR_HORAFIN, SUCU_ID
            FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
            WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO AND
                ((LIPR_DIASMAX IS NULL) or (LIPR_DIASMAX >= :DIAS))
            INTO :CODLISTA, :NOMLISTA, :FECINI, :FECFIN, :IVAINC, :DIASEM, :HORAINI, :HORAFIN, :SUCID
            DO
            BEGIN
            if (FECINI is null) then
                begin
                if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:sucid = 0))) THEN
                  SUSPEND;
                end
            else
                begin
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA) AND (HORAINI <= HORA) AND (HORAFIN >= HORA) AND ((DIASEM = 0) or (DIA = DIASEM)))  Then
                    if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:SUCID = 0))) THEN
                        SUSPEND;
                end
            END
        end
    else
        begin
        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, listapre_usuarios LU
            WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO AND L.lipr_cod = LU.lipr_cod AND LU.user_cod = USER
                and ((LIPR_DIASMAX IS NULL) or (LIPR_DIASMAX >= :DIAS))
            INTO :CODLISTA, :NOMLISTA, :FECINI, :FECFIN, :IVAINC, :DIASEM, :HORAINI, :HORAFIN, :SUCID
            DO
            BEGIN
            if (FECINI is null) then
                begin
                if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:sucid = 0))) THEN
                  SUSPEND;
                end
            else
                begin
                if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA) AND (HORAINI <= HORA) AND (HORAFIN >= HORA) AND ((DIASEM = 0) or (DIA = DIASEM)))  Then
                    if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:SUCID = 0))) THEN
                        SUSPEND;
                end
            END
        end
    end
ELSE
    BEGIN
    if (PORUSUARIO = 'NO') then
        BEGIN
        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
            BEGIN
            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, listapre_usuarios LU
            WHERE L.LIPR_COD = P.LIPR_COD AND L.lipr_cod = LU.lipr_cod AND ARTI_COD = :ARTICULO AND LU.user_cod = USER
            INTO :CODLISTA, :NOMLISTA, :IVAINC, :SUCID
            DO
            SUSPEND;

    END
END^


ALTER PROCEDURE LISTAS_ARTICULO_WEB (
    ARTICULO VARCHAR(15),
    VENDEDOR INTEGER,
    CLIENTE VARCHAR(20))
RETURNS (
    NOMLISTA VARCHAR(30),
    CODLISTA INTEGER,
    OK CHAR(1))
AS
declare variable SUCID INTEGER;
declare variable PORAGENCIA CHAR(2);
declare variable AGENCIA INTEGER;
declare variable LISTA INTEGER;
declare variable PREDET CHAR(1);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR AGENCIA') returning_values (:poragencia);
SELECT LIPR_COD FROM CLIENTES WHERE TERC_NIT = :CLIENTE INTO :LISTA;
if (LISTA IS NULL) then
    LISTA = 0;
FOR SELECT L.LIPR_COD, LIPR_NOM, L.SUCU_ID, V.sucu_id, L.lipr_predet
    FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P, VENDEDORES V
    WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO AND V.vend_cod = :vendedor
    INTO :CODLISTA, :NOMLISTA, :SUCID, :AGENCIA, :PREDET
    DO
    BEGIN
    EXECUTE PROCEDURE NOMBRE_ASCII(NOMLISTA) returning_values (NOMLISTA);
    OK = 'N';
    if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:SUCID = 0))) THEN
        BEGIN
        if (LISTA <> 0) THEN
            BEGIN
            IF (CODLISTA = LISTA) THEN
                OK = 'S';
            END
        ELSE
            BEGIN
            if (PREDET = 'S') then
                OK = 'S';
            END
        SUSPEND;
        END
    END
END^


ALTER PROCEDURE MANIFIESTOS_CONDUCTOR (
    CONDUCTOR VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VEHICULO VARCHAR(20),
    DESTINO INTEGER,
    MONTO NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
begin
FOR SELECT MANC_ID, M.manc_pref, MANC_NUMERO, MANC_FECHA, m.manc_vehiculo,
    M.manc_destino, M.manc_fleteneto, M.manc_apagar, M.manc_total
    FROM manifiesto_carga M WHERE MANC_FECHA >= :FECINI AND MANC_FECHA <= :FECFIN
    AND M.manc_conductor = :conductor and m.manc_anulado = 'N'
    ORDER BY MANC_FECHA, MANC_ID
    INTO :ID, :prefijo, :NUMERO, :FECHA, :vehiculo, :destino, :monto, :seguros, :total
    DO
    BEGIN
    SUSPEND;
    END
end^


ALTER PROCEDURE MANIFIESTOS_VEHICULO (
    VEHICULO VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONDUCTOR VARCHAR(20),
    DESTINO INTEGER,
    MONTO NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
begin
FOR SELECT MANC_ID, M.manc_pref, MANC_NUMERO, MANC_FECHA, m.manc_conductor,
    M.manc_destino, M.manc_fleteneto, M.manc_apagar, M.manc_total
    FROM manifiesto_carga M WHERE MANC_FECHA >= :FECINI AND MANC_FECHA <= :FECFIN
    AND M.manc_vehiculo = :vehiculo and m.manc_anulado = 'N'
    ORDER BY MANC_FECHA, MANC_ID
    INTO :ID, :prefijo, :NUMERO, :FECHA, :conductor, :destino, :monto, :seguros, :total
    DO
    BEGIN
    SUSPEND;
    END
end^


ALTER PROCEDURE MAX_NIVEL
RETURNS (
    MAXNIVEL SMALLINT)
AS
BEGIN
  /* Retorna el mÃ¡ximo nivel definido en la estructura */
  SELECT MAX(ESTR_NIVEL) FROM ESTRUCTURA INTO :MAXNIVEL;
  IF (MAXNIVEL IS NULL) THEN
     MAXNIVEL = 0;
END^


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);
declare variable PORART VARCHAR(8);
BEGIN
  execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
  /* 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
    if (PORART = 'STAND') then
        BEGIN
        maximo = 0;
        SELECT STAND_MAX FROM STANDS WHERE ARTI_COD = :articulo AND STAND_BODEGA = :bodega INTO :maximo;
        END
    ELSE
        SELECT ARTI_MAX FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MAXIMO;
    END
  if (MAXIMO IS NULL) then
    MAXIMO = 0;
  if (maximo <> 0) then
      begin
      EXECUTE PROCEDURE SALDO_INVENTARIO(:ARTICULO, :BODEGA, :FECHA) returning_values (SALDO);
      if (SALDO+CANT > maximo) then
        EXCESO = (SALDO+CANT) - MAXIMO;
      ELSE
        EXCESO = 0;
      end
  ELSE
      EXCESO = 0;
  SUSPEND;
END^


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 FIRST 1 LOTE_NRO FROM LOTES
    WHERE (ARTI_COD = :ARTICULO) AND BODE_COD = :bodega AND LOTE_SALDO = :SALDO INTO :LOTE;
  SUSPEND;
END^


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^


ALTER PROCEDURE MEDIOS_MAGNETICOS (
    ANO CHAR(4))
RETURNS (
    TIPO CHAR(1),
    CODIGO CHAR(2),
    SUBCODIGO CHAR(2),
    NIT CHAR(20),
    DV CHAR(1),
    CLASE CHAR(1),
    NOMBRE VARCHAR(60),
    VALOR1 NUMERIC(18,2),
    VALOR2 NUMERIC(18,2),
    VALOR3 NUMERIC(18,2),
    DESCRIPCION VARCHAR(60),
    DIRECCION VARCHAR(60),
    DEPTOYMUN CHAR(5))
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^


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^


ALTER PROCEDURE MEDIOS_MAGNETICOS2 (
    ANO CHAR(4))
RETURNS (
    TIPO CHAR(1),
    CODIGO CHAR(2),
    SUBCODIGO CHAR(2),
    NIT CHAR(14),
    DV CHAR(1),
    CLASE CHAR(1),
    NOMBRE VARCHAR(60),
    VALOR1 NUMERIC(18,2),
    VALOR2 NUMERIC(18,2),
    VALOR3 NUMERIC(18,2),
    DESCRIPCION VARCHAR(20),
    DIRECCION VARCHAR(40),
    DEPTOYMUN CHAR(5))
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 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;

  /* LITERAL I: DEUDORES - OTROS */
  BASEMIN = 5000000;
  ACUMULADO = 0;
  FOR SELECT CUEN_COD FROM CUENTAS
  WHERE ((CUEN_COD > '131016') AND (CUEN_COD < '14')) AND
  ((CUEN_COD < '1320') AND (CUEN_COD > '1326'))
  ORDER BY CUEN_COD INTO :CTAAUX
      do
        BEGIN
        FOR SELECT '2', '90', '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;
                SUSPEND;
                END
            ELSE
               BEGIN
               ACUMULADO = ACUMULADO + VALOR1;
               END
            END
        END

    /* EL RESTANTE CON NIT 222222222 */
    TIPO = '2';
    CODIGO = '90';
    SUBCODIGO = '03';
    NIT = '222222222';
    NOMBRE = 'SALDO DEUDORES DE MENOR CUANTIA';
    VALOR1 = ACUMULADO;
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* PROVISION DE CARTERA */
    TIPO = '2';
    CODIGO = '90';
    SUBCODIGO = '01';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
     EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    EXECUTE PROCEDURE SALDO_CUENTA_MES('1399', :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* SALDO EN CAJA */
    TIPO = '2';
    CODIGO = '11';
    SUBCODIGO = '05';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
     EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    EXECUTE PROCEDURE SALDO_CUENTA_MES('1105', :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* SALDO EN BANCOS NACIONALES */
    TIPO = '2';
    CODIGO = '11';
    SUBCODIGO = '10';
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS
      WHERE ((CUEN_COD > '111005' AND CUEN_COD < '111006') OR
       (CUEN_COD > '1120' AND CUEN_COD < '1121')) ORDER BY CUEN_COD INTO :CTAAUX, :NOMBRE
      DO
      BEGIN
      EXECUTE PROCEDURE ES_AFECTABLE(CTAAUX) RETURNING_VALUES (CONF);
      IF (CONF = 'S') THEN
         BEGIN
         NIT = '';
         EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
         VALOR2 = 0;
         VALOR3 = 0;
         DESCRIPCION = '';
         DIRECCION = '';
         DEPTOYMUN = '11001';
         SUSPEND;
         END
      END

    /* SALDO EN BANCOS EXTERIOR */
    TIPO = '2';
    CODIGO = '11';
    SUBCODIGO = '10';
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD > '111010' AND CUEN_COD < '111011' ORDER BY CUEN_COD INTO :CTAAUX, :NOMBRE
      DO
      BEGIN
      EXECUTE PROCEDURE ES_AFECTABLE(CTAAUX) RETURNING_VALUES (CONF);
      IF (CONF = 'S') THEN
         BEGIN
         NIT = '';
         EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
         VALOR2 = 0;
         VALOR3 = 0;
         DESCRIPCION = '';
         DIRECCION = '';
         DEPTOYMUN = '11001';
         SUSPEND;
         END
      END

    /* SALDO EN BONOS */
    TIPO = '2';
    CODIGO = '12';
    SUBCODIGO = '00';
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD > '1215' AND CUEN_COD < '1216' ORDER BY CUEN_COD INTO :CTAAUX, :NOMBRE
      DO
      BEGIN
      EXECUTE PROCEDURE ES_AFECTABLE(CTAAUX) RETURNING_VALUES (CONF);
      IF (CONF = 'S') THEN
         BEGIN
         NIT = '';
         EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
         VALOR2 = 0;
         VALOR3 = 0;
         DESCRIPCION = '';
         DIRECCION = '';
         DEPTOYMUN = '11001';
         SUSPEND;
         END
      END

    /* SALDO EN CEDULAS */
    TIPO = '2';
    CODIGO = '12';
    SUBCODIGO = '01';
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD > '1220' AND CUEN_COD < '1221' ORDER BY CUEN_COD INTO :CTAAUX, :NOMBRE
      DO
      BEGIN
      EXECUTE PROCEDURE ES_AFECTABLE(CTAAUX) RETURNING_VALUES (CONF);
      IF (CONF = 'S') THEN
         BEGIN
         NIT = '';
         EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
         VALOR2 = 0;
         VALOR3 = 0;
         DESCRIPCION = '';
         DIRECCION = '';
         DEPTOYMUN = '11001';
         SUSPEND;
         END
      END

    /* SALDO EN CERTIFICADOS */
    TIPO = '2';
    CODIGO = '12';
    SUBCODIGO = '02';
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD > '1225' AND CUEN_COD < '1226' ORDER BY CUEN_COD INTO :CTAAUX, :NOMBRE
      DO
      BEGIN
      EXECUTE PROCEDURE ES_AFECTABLE(CTAAUX) RETURNING_VALUES (CONF);
      IF (CONF = 'S') THEN
         BEGIN
         NIT = '';
         EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
         VALOR2 = 0;
         VALOR3 = 0;
         DESCRIPCION = '';
         DIRECCION = '';
         DEPTOYMUN = '11001';
         SUSPEND;
         END
      END

    /* SALDO EN TITULOS */
    TIPO = '2';
    CODIGO = '12';
    SUBCODIGO = '03';
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD > '1235' AND CUEN_COD < '1236' ORDER BY CUEN_COD INTO :CTAAUX, :NOMBRE
      DO
      BEGIN
      EXECUTE PROCEDURE ES_AFECTABLE(CTAAUX) RETURNING_VALUES (CONF);
      IF (CONF = 'S') THEN
         BEGIN
         NIT = '';
         EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
         VALOR2 = 0;
         VALOR3 = 0;
         DESCRIPCION = '';
         DIRECCION = '';
         DEPTOYMUN = '11001';
         SUSPEND;
         END
      END

    /* SALDO EN DERECHOS */
    TIPO = '2';
    CODIGO = '12';
    SUBCODIGO = '04';
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD > '1245' AND CUEN_COD < '1246' ORDER BY CUEN_COD INTO :CTAAUX, :NOMBRE
      DO
      BEGIN
      EXECUTE PROCEDURE ES_AFECTABLE(CTAAUX) RETURNING_VALUES (CONF);
      IF (CONF = 'S') THEN
         BEGIN
         NIT = '';
         EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
         VALOR2 = 0;
         VALOR3 = 0;
         DESCRIPCION = '';
         DIRECCION = '';
         DEPTOYMUN = '11001';
         SUSPEND;
         END
      END

    /* SALDO EN OTRAS INVERSIONES */
    TIPO = '2';
    CODIGO = '12';
    SUBCODIGO = '05';
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS
      WHERE ((CUEN_COD > '1226' AND CUEN_COD < '1235') OR
        (CUEN_COD > '1240' AND CUEN_COD > '1245') OR
        (CUEN_COD > '1250' AND CUEN_COD < '13'))
        ORDER BY CUEN_COD INTO :CTAAUX, :NOMBRE
      DO
      BEGIN
      EXECUTE PROCEDURE ES_AFECTABLE(CTAAUX) RETURNING_VALUES (CONF);
      IF (CONF = 'S') THEN
         BEGIN
         NIT = '';
         EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
         VALOR2 = 0;
         VALOR3 = 0;
         DESCRIPCION = '';
         DIRECCION = '';
         DEPTOYMUN = '11001';
         SUSPEND;
         END
      end

    /* SALDO EN ACCIONES */
    TIPO = '2';
    CODIGO = '12';
    SUBCODIGO = '06';
    FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD > '12' AND CUEN_COD < '1215' ORDER BY CUEN_COD INTO :CTAAUX, :NOMBRE
      DO
      BEGIN
      EXECUTE PROCEDURE ES_AFECTABLE(CTAAUX) RETURNING_VALUES (CONF);
      IF (CONF = 'S') THEN
         BEGIN
         NIT = '';
         EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
         VALOR2 = 0;
         VALOR3 = 0;
         DESCRIPCION = '';
         DIRECCION = '';
         DEPTOYMUN = '11001';
         SUSPEND;
         END
      END

    /* SALDO INVENTARIO */
    TIPO = '2';
    CODIGO = '14';
    SUBCODIGO = '01';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
     EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    EXECUTE PROCEDURE SALDO_CUENTA_MES('14', :ANO, 1, 'S') RETURNING_VALUES (VALOR1);
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* COMPRAS DEL AÃ‘O */
    TIPO = '2';
    CODIGO = '14';
    SUBCODIGO = '02';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
    EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA('14', ANO, 1, 12, 'S') RETURNING_VALUES(VALOR1);
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* COSTOS MANO DE OBRA */
    ACUMULADO = 0;
    TIPO = '2';
    CODIGO = '14';
    SUBCODIGO = '03';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
    EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA('72', ANO, 1, 12, 'S') RETURNING_VALUES(VALOR1);
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    ACUMULADO = VALOR1;
    SUSPEND;

    /* COSTOS INDIRECTOS */
    TIPO = '2';
    CODIGO = '14';
    SUBCODIGO = '04';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
    EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA('73', ANO, 1, 12, 'S') RETURNING_VALUES(VALOR1);
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    ACUMULADO = ACUMULADO + VALOR1;
    SUSPEND;

    /* OTROS COSTOS */
    TIPO = '2';
    CODIGO = '14';
    SUBCODIGO = '05';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
    EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA('7', ANO, 1, 12, 'S') RETURNING_VALUES(VALOR1);
    VALOR1 = VALOR1 - ACUMULADO;
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* COSTO EN VENTAS */
    TIPO = '2';
    CODIGO = '14';
    SUBCODIGO = '06';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
    EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA('14', ANO, 1, 12, 'N') RETURNING_VALUES(VALOR1);
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* SALDO INVENTARIO FINAL */
    TIPO = '2';
    CODIGO = '14';
    SUBCODIGO = '01';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
     EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    EXECUTE PROCEDURE SALDO_CUENTA_MES('14', :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
    VALOR2 = 0;
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* ACTIVOS FIJOS */
    ACUMULADO = 0;
    TIPO = '2';
    CODIGO = '15';
    SUBCODIGO = '01';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
    EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD > '15' AND CUEN_COD < '1520' INTO :CTAAUX
    DO
        BEGIN
        EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
        ACUMULADO = ACUMULADO + VALOR1;
        END
    VALOR1 = ACUMULADO;
    EXECUTE PROCEDURE SALDO_CUENTA_MES('159205', :ANO, 13, 'S') RETURNING_VALUES (VALOR2);
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* MAQUINARIA Y EQUIPO */
    ACUMULADO = 0;
    TIPO = '2';
    CODIGO = '15';
    SUBCODIGO = '02';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
    EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD > '1520' AND CUEN_COD < '1524' INTO :CTAAUX
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
        ACUMULADO = ACUMULADO + VALOR1;
        END
    VALOR1 = ACUMULADO;
    EXECUTE PROCEDURE SALDO_CUENTA_MES('159210', :ANO, 13, 'S') RETURNING_VALUES (VALOR2);
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* EQUIPO DE OFICINA */
    ACUMULADO = 0;
    TIPO = '2';
    CODIGO = '15';
    SUBCODIGO = '03';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
    EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD > '1524' AND CUEN_COD <= '152499' INTO :CTAAUX
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
        ACUMULADO = ACUMULADO + VALOR1;
        END
    VALOR1 = ACUMULADO;
    EXECUTE PROCEDURE SALDO_CUENTA_MES('159215', :ANO, 13, 'S') RETURNING_VALUES (VALOR2);
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* EQUIPO DE COMPUTO */
    ACUMULADO = 0;
    TIPO = '2';
    CODIGO = '15';
    SUBCODIGO = '05';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
    EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD > '1528' AND CUEN_COD <= '152899' INTO :CTAAUX
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
        ACUMULADO = ACUMULADO + VALOR1;
        END
    VALOR1 = ACUMULADO;
    EXECUTE PROCEDURE SALDO_CUENTA_MES('159220', :ANO, 13, 'S') RETURNING_VALUES (VALOR2);
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;

    /* EQUIPO DE TRASPORTE */
    ACUMULADO = 0;
    TIPO = '2';
    CODIGO = '15';
    SUBCODIGO = '04';
     EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
    EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'NOMBRE COMPAÃ‘IA') RETURNING_VALUES (NOMBRE);
    FOR SELECT CUEN_COD FROM CUENTAS WHERE CUEN_COD > '1540' AND CUEN_COD <= '154099' INTO :CTAAUX
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTAAUX, :ANO, 13, 'S') RETURNING_VALUES (VALOR1);
        ACUMULADO = ACUMULADO + VALOR1;
        END
    VALOR1 = ACUMULADO;
    EXECUTE PROCEDURE SALDO_CUENTA_MES('159235', :ANO, 13, 'S') RETURNING_VALUES (VALOR2);
    VALOR3 = 0;
    DESCRIPCION = '';
    DIRECCION = '';
    DEPTOYMUN = '11001';
    SUSPEND;
END^


ALTER PROCEDURE MERCANCIA_EN_TRANSITO (
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,4),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
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
      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;
        if (DETALLE = 'N') then
            BEGIN
            SELECT SUM(TRAS_CANT), SUM(TRAS_CANT * TRAS_COSTO)
                FROM TRASFERENCIAS T, TRASFERENCIAS_DETALLE TD
                WHERE T.TRAN_ID = TD.TRAN_ID AND TRAN_FECHA <= :FECHA AND TRAN_CONFIRMA = 'N' AND ARTI_COD = :CODIGO AND TRAN_BODDES = :CODBOD AND TRAN_ANULADO = 'N'
                INTO :CANT, :COSTOTOT;
            if (CANT IS NULL) then
                CANT = 0;
            if (COSTOTOT IS NULL) then
                COSTOTOT = 0;
            if (CANT > 0) then
                COSTO = COSTO / CANT;
            ELSE
                COSTO = 0;
            if (CANT <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT TRAN_FECHA, PREF_PRE, TRAN_NUMERO, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO
                FROM TRASFERENCIAS T, trasferencias_detalle TD
                WHERE T.TRAN_ID = TD.TRAN_ID AND TD.ARTI_COD = :CODIGO AND TRAN_FECHA <= :FECHA AND TRAN_CONFIRMA = 'N'  AND TRAN_ANULADO = 'N'
                INTO :FECHADOC, :PREFIJO, :NUMERO, :CANT, :UNIDAD, :COSTO
                DO
                BEGIN
                COSTOTOT = COSTO * CANT;
                SUSPEND;
                END
            END
        END
END^


ALTER PROCEDURE MES_FECHA (
    FECHA CHAR(8))
RETURNS (
    MESF CHAR(2))
AS
BEGIN
MESF = SUBSTR(FECHA, 5, 6);
SUSPEND;
END^


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);
declare variable PORART VARCHAR(8);
BEGIN
  /* CUANDO CONFIGURACION MINIMO EN DIAS */
  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 (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
    if (PORART = 'STAND') then
        BEGIN
        minimo = 0;
        SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :articulo AND STAND_BODEGA = :bodega INTO :minimo;
        END
    ELSE
        SELECT ARTI_MIN FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :MINIMO;
    END
  if (MINIMO IS NULL) then
    MINIMO = 0;
  SUSPEND;
END^


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(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable 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, :natur) returning_values (:TOTALTERC);
        if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :NIT, :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS;
            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^


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

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

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

end^


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

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

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

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

end^


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


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


ALTER PROCEDURE MM_1005 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable DEBITOS NUMERIC(18,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, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago)
            values (1005, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :iva);
        END
    END
end^


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


ALTER PROCEDURE MM_1006 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable 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_NITCONTA, 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 :NIT, :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^


ALTER PROCEDURE MM_10067 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIADV NUMERIC(18,2);
declare variable DEBITOS NUMERIC(18,2);
declare variable 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 = 100671 INTO :MINIMO, :NATUR;

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


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

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


ALTER PROCEDURE MM_1007 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable PAIS VARCHAR(3) CHARACTER SET NONE;
declare variable INGRESO NUMERIC(18,0);
declare variable DEVOLUCION NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIAI NUMERIC(18,2);
declare variable MENORCUANTIAD NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
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 D WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE
        ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND ENCO_CONSEC = D.enco_consec)
        INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    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 D WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE
        ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND ENCO_CONSEC = D.enco_consec)
        INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    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 D WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE
        ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND ENCO_CONSEC = D.enco_consec)
        INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    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^


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


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


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(20);
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);
declare variable TIPOID char(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
ANO = SUBSTR(INICIO,1,4);
FOR SELECT COME_ITEM, COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag
    WHERE COME_FORMATO = 10097 INTO :idconc, :CONCEPTO, :MINIMO
    DO
    BEGIN
    MENORCUANTIA = 0;
    FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS S, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND CUEN_COD >= M.mmcu_cuenta AND CUEN_COD <= M.mmcu_cuenta || '999999'
        ORDER BY TERC_NIT INTO :NIT
        do
        BEGIN
        SALDO = 0;
        FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS S, mediosmag_cuentas M
            WHERE TERC_NIT = :NIT AND M.mmcu_item = :IDCONC AND CUEN_COD >= M.mmcu_cuenta AND CUEN_COD <= M.mmcu_cuenta || '999999'
            INTO :CUENTA
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
            SALDO = SALDO + SALDOAUX;
            END
        SALDO = SALDO * -1;
        if (SALDO >= :MINIMO) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID, IT.tiid_cod
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :NIT, :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS, :TIPOID;
            if (:TIPOID <> 'J') then
                RAZONSOCIAL = '';
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
                values (10097, :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 (10097, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
                '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor);
        END
    END
end^


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 = 10116
    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_cuentaf (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 (10116, :ANO, :item,  :concepto, ABS(:SALDO));
        ITEM = ITEM + 1;
        end
    END
end^


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


ALTER PROCEDURE MM_22761 (
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(5) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGOSEMP NUMERIC(18,0);
declare variable CESEINT NUMERIC(18,0);
declare variable GASTOSREP NUMERIC(18,0);
declare variable PENSIONES NUMERIC(18,0);
declare variable OTROSING NUMERIC(18,0);
declare variable APORTESAL NUMERIC(18,0);
declare variable APORTEPENO NUMERIC(18,0);
declare variable APORTEPENV NUMERIC(18,0);
declare variable RETENCION NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable ITEM integer;
declare variable NATUR CHAR(1);
declare variable AUXDEB NUMERIC(18,2);
declare variable AUXCRED NUMERIC(18,2);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
ITEM = 0;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(M.mmcu_natur)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 2276101 AND CUEN_COD >= M.mmcu_cuenta and cuen_cod <= M.mmcu_cuenta || '999999' AND
    m.mmcu_cuenta <> '' AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGOSEMP, :debitos, :creditos, :NATUR
    DO
    BEGIN
    if (DEBITOS is null) then
        DEBITOS = 0;
    if (CREDITOS is null) then
        CREDITOS = 0;
    if (NATUR = 'D') then
        pagosemp = debitos;
    if (NATUR = 'C') then
        pagosemp = creditos;
    SELECT TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, TERC_DIR, CIUD_COD, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :direccion, :municipio, :pais;
    DEPARTAMENTO = left(MUNICIPIO, 2);
    MUNICIPIO = right(municipio,  3);
    /* CESANTIAS */
    SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(M.mmcu_natur)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = 2276102 AND CUEN_COD >= M.mmcu_cuenta and cuen_cod <= M.mmcu_cuenta || '999999' AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
        D.TERC_NIT = :NIT INTO :CESEINT, :AUXDEB, :AUXCRED, :NATUR;
    if (CESEINT is null) then
        CESEINT = 0;
    if (AUXDEB is null) then
        AUXDEB = 0;
    if (AUXCRED is null) then
        AUXCRED = 0;
    if (NATUR = 'D') then
        CESEINT = AUXDEB;
    if (NATUR = 'C') then
        CESEINT = AUXCRED;
    /* GASTOS REPRESENTACION */
    SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(M.mmcu_natur)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = 2276103 AND CUEN_COD >= M.mmcu_cuenta and cuen_cod <= M.mmcu_cuenta || '999999' AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
        D.TERC_NIT = :NIT INTO :GASTOSREP, :AUXDEB, :AUXCRED, :NATUR;
    if (GASTOSREP is null) then
        GASTOSREP = 0;
    if (AUXDEB is null) then
        AUXDEB = 0;
    if (AUXCRED is null) then
        AUXCRED = 0;
    if (NATUR = 'D') then
        GASTOSREP = AUXDEB;
    if (NATUR = 'C') then
        GASTOSREP = AUXCRED;
    /* PENSIONES */
    SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(C.come_natur)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M, configura_mediosmag C
        WHERE C.come_formato = 2276104 AND C.come_item = M.mmcu_item AND CUEN_COD >= M.mmcu_cuenta and cuen_cod <= M.mmcu_cuenta || '999999' AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
        D.TERC_NIT = :NIT INTO :PENSIONES, :AUXDEB, :AUXCRED, :NATUR;
    if (PENSIONES is null) then
        PENSIONES = 0;
    if (AUXDEB is null) then
        AUXDEB = 0;
    if (AUXCRED is null) then
        AUXCRED = 0;
    if (NATUR = 'D') then
        PENSIONES = AUXDEB;
    if (NATUR = 'C') then
        PENSIONES = AUXCRED;
    /* OTROS INGRESOS */
    SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(M.mmcu_natur)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = 2276105 AND CUEN_COD >= M.mmcu_cuenta and cuen_cod <= M.mmcu_cuenta || '999999' AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
        D.TERC_NIT = :NIT INTO :OTROSING, :AUXDEB, :AUXCRED, :NATUR;
    if (OTROSING is null) then
        OTROSING = 0;
    if (AUXDEB is null) then
        AUXDEB = 0;
    if (AUXCRED is null) then
        AUXCRED = 0;
    if (NATUR = 'D') then
        OTROSING = AUXDEB;
    if (NATUR = 'C') then
        OTROSING = AUXCRED;
    /* APORTES SALUD */
    SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(M.mmcu_natur)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = 2276106 AND CUEN_COD >= M.mmcu_cuenta and cuen_cod <= M.mmcu_cuenta || '999999' AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
        D.TERC_NIT = :NIT INTO :APORTESAL, :AUXDEB, :AUXCRED, :NATUR;
    if (APORTESAL is null) then
        APORTESAL = 0;
    if (AUXDEB is null) then
        AUXDEB = 0;
    if (AUXCRED is null) then
        AUXCRED = 0;
    if (NATUR = 'D') then
        APORTESAL = AUXDEB;
    if (NATUR = 'C') then
        APORTESAL = AUXCRED;
    /* APORTES PENSION OBLIGATORIA */
    SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(M.mmcu_natur)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = 2276107 AND CUEN_COD >= M.mmcu_cuenta and cuen_cod <= M.mmcu_cuenta || '999999' AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
        D.TERC_NIT = :NIT INTO :APORTEPENO, :AUXDEB, :AUXCRED, :NATUR;
    if (APORTEPENO is null) then
        APORTEPENO = 0;
    if (AUXDEB is null) then
        AUXDEB = 0;
    if (AUXCRED is null) then
        AUXCRED = 0;
    if (NATUR = 'D') then
        APORTEPENO = AUXDEB;
    if (NATUR = 'C') then
        APORTEPENO = AUXCRED;
    /* APORTES PENSION VOL */
    SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(M.mmcu_natur)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = 2276108 AND CUEN_COD >= M.mmcu_cuenta and cuen_cod <= M.mmcu_cuenta || '999999' AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
        D.TERC_NIT = :NIT INTO :APORTEPENV, :AUXDEB, :AUXCRED, :NATUR;
    if (APORTEPENV is null) then
        APORTEPENV = 0;
    if (AUXDEB is null) then
        AUXDEB = 0;
    if (AUXCRED is null) then
        AUXCRED = 0;
    if (NATUR = 'D') then
        APORTEPENV = AUXDEB;
    if (NATUR = 'C') then
        APORTEPENV = AUXCRED;
    /* RETENCION */
    SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO), MAX(M.mmcu_natur)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = 2276109 AND CUEN_COD >= M.mmcu_cuenta and cuen_cod <= M.mmcu_cuenta || '999999' AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
        D.TERC_NIT = :NIT INTO :RETENCION, :AUXDEB, :AUXCRED, :NATUR;
    if (RETENCION is null) then
        RETENCION = 0;
    if (AUXDEB is null) then
        AUXDEB = 0;
    if (AUXCRED is null) then
        AUXCRED = 0;
    if (NATUR = 'D') then
        RETENCION = AUXDEB;
    if (NATUR = 'C') then
        RETENCION = AUXCRED;

    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
        memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
        values (22761, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, '', :direccion, :departamento, :municipio, :pagosemp, :pais, :ceseint,
        :gastosrep, :pensiones, :otrosing, 0, :aportesal, :aportepeno, :aportepenv, :retencion, 0);
    item = item + 1;
    END

end^


ALTER PROCEDURE MM14_EMPLEADOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPOID INTEGER,
    NIT VARCHAR(20),
    VINCU INTEGER,
    CONDI INTEGER)
AS
declare variable TIPO INTEGER;
declare variable STIPO INTEGER;
begin
FOR SELECT E.TERC_NIT, I.tiid_codigo, E.tcot_cod, E.stco_cod FROM EMPLEADOS E, tipo_id I, TERCEROS T WHERE T.terc_nit = E.terc_nit AND T.terc_tipoid = I.tiid_cod
    AND E.empl_fecing <= :fecini AND ((E.empl_fecret IS NULL) OR (E.empl_fecret >= :FECFIN))
    INTO :NIT, :tipoid, :tipo, :stipo
    DO
    BEGIN
    SELECT TC.tcot_tipodian FROM tipo_cotizante TC WHERE TC.tcot_cod = :tipo INTO :vincu;
    if (STIPO IS NULL) then
        CONDI = TIPO;
    else
        SELECT ST.stco_coddian FROM subtipo_cotizante ST WHERE ST.tcot_cod = :vincu AND ST.stco_cod = :stipo INTO :condi;
    suspend;
    END
end^


ALTER PROCEDURE MM14_FACTURACIONPAPEL (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(10),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    INGRESOS NUMERIC(18,2),
    DESCTOSCOND NUMERIC(18,2),
    DESCTOSNOCOND NUMERIC(18,2),
    ANULADAS NUMERIC(18,2),
    IVAANUL NUMERIC(18,2))
AS
declare variable CONSUMO NUMERIC(18,2);
BEGIN
FOR SELECT PREF_PRE FROM PREFIJOS WHERE PREF_ACTIVO = 'S' AND TIDO_COD = 31 INTO :PREF
    DO
    BEGIN
    SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO)
        FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECFIN <= :FECFIN AND PREF_PRE = :PREF and FACT_ANULADO = 'N'
        INTO :NUMINI, :NUMFIN, :INGRESOS;
    SELECT SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO)
        FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECFIN <= :FECFIN AND PREF_PRE = :PREF and FACT_ANULADO = 'S'
        INTO :anuladas, :ivaanul;
    select sum(fade_consumo+fade_inalcm) from facturas_detalle d, facturas f
        where f.fact_id = d.fact_id and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and f.fact_anulado = 'N'
        into :consumo;
    if (CONSUMO IS NULL) then
        CONSUMO = 0;
    INGRESOS = INGRESOS - CONSUMO;
    select sum(rd.rcde_dtof) from recibos_caja_detalle rd, facturas f where f.fact_id = rd.rcde_iddoc and rd.rcde_tipodoc = 31
        and f.fact_dtofmonto <> 0 and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and rd.rcde_anulado = 'N'
        into :desctoscond;
    select sum(rd.rcde_dtof) from recibos_caja_detalle rd, facturas f where f.fact_id = rd.rcde_iddoc and rd.rcde_tipodoc = 31
        and f.fact_dtofmonto = 0 and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and rd.rcde_anulado = 'N'
        into :desctosnocond;
    END
END^


ALTER PROCEDURE MM14_FACTURACIONPOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PUNTOPOS VARCHAR(20),
    PREF VARCHAR(10),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    EXENTOS NUMERIC(18,2),
    BASE16 NUMERIC(18,2),
    BASE5 NUMERIC(18,2),
    CONSUMO16 NUMERIC(18,2),
    CONSUMO8 NUMERIC(18,2),
    CONSUMO4 NUMERIC(18,2),
    DESCTOS NUMERIC(18,2),
    FORMAP INTEGER,
    FACTURAS INTEGER,
    TOTAL NUMERIC(18,2))
AS
BEGIN
FOR SELECT PREF_PRE FROM PREFIJOS WHERE PREF_ACTIVO = 'S' AND TIDO_COD = 31 INTO :PREF
    DO
    BEGIN
    select first 1 ptvt_iddian from punto_venta where pref_pre = :pref order by ptvt_iddian into :puntopos;
    
    SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), SUM(FACT_TOTAL), COUNT(FACT_ID)
        FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECFIN <= :FECFIN AND PREF_PRE = :PREF and FACT_ANULADO = 'N'
        INTO :NUMINI, :NUMFIN, :TOTAL, :FACTURAS;

    SELECT SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_IVAMONTO = 0
        and FADE_INALCM = 0 and FACT_ANULADO = 'N'
        INTO :exentos;
    if (exentos is null) then
        exentos = 0;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_IVAPORC = 16 and FACT_ANULADO = 'N'
        INTO :base16;
    if (base16 is null) then
        base16 = 0;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_IVAPORC = 5 and FACT_ANULADO = 'N'
        INTO :base5;
    if (base5 is null) then
        base5 = 0;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_INALCP = 16 and FACT_ANULADO = 'N'
        INTO :CONSUMO16;
    if (CONSUMO16 is null) then
        CONSUMO16 = 0;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_INALCP = 8 and FACT_ANULADO = 'N'
        INTO :CONSUMO8;
    if (CONSUMO8 is null) then
        CONSUMO8 = 0;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_INALCP = 4 and FACT_ANULADO = 'N'
        INTO :CONSUMO4;
    if (CONSUMO4 is null) then
        CONSUMO4 = 0;
    FORMAP = 1;
    select sum(rd.rcde_dtof) from recibos_caja_detalle rd, facturas f where f.fact_id = rd.rcde_iddoc and rd.rcde_tipodoc = 31
        and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and rd.rcde_anulado = 'N'
        into :desctos;
    END
END^


ALTER PROCEDURE MM14_MOVTERCEROS (
    FECINI CHAR(8),
    FECFIN CHAR(8))
RETURNS (
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(100),
    TIPOID INTEGER,
    NIT VARCHAR(20),
    SALDOINI NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    SALDOFIN NUMERIC(18,2))
AS
declare variable cta varchar(20);
declare variable VALOR NUMERIC(18,2);
declare variable fecaux char(8);
begin
execute procedure fecha_y_numero_conta (:fecini, -1) returning_values (:fecaux);
for select cuen_cod, cuen_nom from cuentas where strlen(cuen_cod) = 6 order by cuen_cod into :cuenta, :nomcuenta
    do
    begin
    for select terc_nit from terceros t where exists (select enco_consec from comprobante_detalle d where terc_nit = t.terc_nit
        and substring(cuen_cod from 1 for 6) = :cuenta) or exists (select sain_item from saldos_iniciales where terc_nit = t.terc_nit
        and substring(cuen_cod from 1 for 6) = :cuenta) into :nit
        do
        begin
        /* ojo nit de bancos, inventario si con la empresa etc. */
        select sum(code_debito), sum(code_credito)
            from comprobante_detalle d, comprobante_encabezado e
            where e.enco_consec = d.enco_consec and e.enco_fecha >= :fecini and e.enco_fecha <= :fecfin
            and substring(d.cuen_cod from 1 for 6) = :cuenta and d.terc_nit = :nit
            into :debitos, :creditos;
        select ti.tiid_codigo from terceros te, tipo_id ti where te.terc_tipoid = ti.tiid_cod AND TE.terc_nit = :NIT into :tipoid;
        SALDOINI = 0;
        for select cuen_cod from cuentas where substring(cuen_cod from 1 for 6) = :cuenta into :cta
            DO
            begin
            execute procedure saldo_tercero(:cta, :nit, :fecaux) returning_values (:valor);
            saldoini = SALDOINI + VALOR;
            end
        SALDOFIN = SALDOINI + DEBITOS - CREDITOS;
        if ((SALDOINI <> 0) OR (debitos <> 0) OR (creditos <> 0) OR (SALDOFIN <> 0)) then
            SUSPEND;
        end
    end
end^


ALTER PROCEDURE MM14_PAGOS_SALARIALES (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPOID INTEGER,
    NIT VARCHAR(20),
    DIASL INTEGER,
    SALINT INTEGER,
    BASICO NUMERIC(18,2),
    SUELDO NUMERIC(18,2),
    HORASE NUMERIC(18,2),
    COMIS NUMERIC(18,2),
    VIATICO NUMERIC(18,2),
    ESPECIE NUMERIC(18,2),
    BONIFICA NUMERIC(18,2),
    AUXILIO NUMERIC(18,2),
    PRIMAS NUMERIC(18,2),
    OTROSAL NUMERIC(18,2),
    DESOTROS VARCHAR(500),
    INCAPEMP NUMERIC(18,2),
    DIASINCEMP INTEGER,
    INCAPEPS NUMERIC(18,2),
    DIASINCEPS INTEGER,
    LICNOREM NUMERIC(18,2),
    DIASLNR INTEGER,
    LICREM NUMERIC(18,2),
    DIASLR INTEGER,
    VACAC NUMERIC(18,2),
    DIASVAC INTEGER,
    FECVINI DATE,
    FECVFIN DATE,
    VACACOMP NUMERIC(18,2),
    VACALIQ NUMERIC(18,2),
    VRNOSALPRIM NUMERIC(18,2),
    VRNOSALPUBL NUMERIC(18,2),
    VRNOSALPREM NUMERIC(18,2),
    VRNOSALOTRO NUMERIC(18,2),
    DESOTRONS VARCHAR(500),
    PORCARL NUMERIC(9,2),
    NOVEDAD CHAR(1))
AS
declare variable CONC INTEGER;
declare variable VALOR NUMERIC(18,2);
begin
FOR SELECT MAX(NC.TERC_NIT), MAX(NC.CONC_COD), SUM(NC.noco_valor) FROM nomina N, nomina_conceptos NC
    WHERE N.nomi_id = NC.nomi_id AND N.nomi_feccausa >= :fecini AND N.nomi_feccausa <= :fecfin
    GROUP BY NC.terc_nit, NC.conc_cod
    INTO :nit, :conc, :valor
    DO
    BEGIN
    suspend;
    END
end^


ALTER PROCEDURE MM14_TERCEROS (
    FECINI CHAR(8),
    FECFIN CHAR(8))
RETURNS (
    TIPOID INTEGER,
    NIT VARCHAR(20),
    DV CHAR(1),
    NATUR CHAR(1),
    APE1 VARCHAR(60),
    APE2 VARCHAR(60),
    NOM1 VARCHAR(60),
    NOM2 VARCHAR(60),
    RAZON VARCHAR(60),
    DIREC VARCHAR(100),
    ACTIV CHAR(4),
    PAIS CHAR(3),
    DPTO CHAR(2),
    MPIO CHAR(3),
    CORREO VARCHAR(100),
    TELEF VARCHAR(40),
    CELUL VARCHAR(40))
AS
begin
FOR SELECT TERC_NIT, TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TERC_ACTIVIDAD,
    TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID, I.tiid_codigo, I.tiid_natur, T.terc_email, T.terc_tel, T.terc_cel
    FROM TERCEROS T, tipo_id I WHERE T.TERC_TIPOID = I.tiid_cod AND
    EXISTS (SELECT D.ENCO_CONSEC FROM comprobante_detalle D, COMPROBANTE_ENCABEZADO E WHERE E.enco_consec = D.enco_consec
    AND D.TERC_NIT = T.TERC_NIT AND E.enco_fecha >= :FECINI  AND E.enco_fecha <= :FECFIN AND ((CODE_DEBITO <> 0) OR (CODE_CREDITO <> 0)))
    INTO :NIT, :RAZON, :NOM1, :NOM2, :APE1, :APE2, :DV, :ACTIV,
    :DIREC, :DPTO, :MPIO, :PAIS, :TIPOID, :NATUR, :CORREO, :TELEF, :CELUL
    DO
    BEGIN
    suspend;
    END
end^


ALTER PROCEDURE MMDIST_2 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable TIPODOC VARCHAR(3);
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(60) CHARACTER SET NONE;
declare variable TELEFONO VARCHAR(40) CHARACTER SET NONE;
declare variable EMAIL VARCHAR(100) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(5) CHARACTER SET NONE;
declare variable NOMMUN varchar(60) CHARACTER SET NONE;
declare variable NOMDEP varchar(60) 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 SALDO NUMERIC(18,2);
declare variable SALDOAUX NUMERIC(18,2);
declare variable ITEM integer;
declare variable NATUR CHAR(1);
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable LONMUN INTEGER;
declare variable LONCIU INTEGER;
declare variable CUENTA VARCHAR(20);
declare variable INCSALDO CHAR(1);
begin
ITEM = 0;
SELECT mmdi_tope, mmdi_proy, mmdi_centro, mmdi_natur, M.mmdi_incsaldo
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND M.mmdi_articulo = 2
    INTO :minimo, :proy, :cent, :natur, :incsaldo;

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_distr_cuentas M
    WHERE M.mmdi_articulo = 2 AND M.mmdi_ano = :ano AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND D.TERC_NIT <> :NITSHD AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND D.proy_cod = :proy AND D.cent_cod = :cent
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        /* EL SALDO A LA FECHA FINAL */
        SALDO = 0;
        FOR SELECT CUEN_COD FROM CUENTAS C, mediosmag_distr_cuentas M
            WHERE SUBSTRING(C.CUEN_COD FROM 1 FOR STRLEN(M.mmdc_ctasaldo)) = M.mmdc_ctasaldo AND M.mmdi_articulo = 2 AND M.mmdi_ano = :ano
            INTO :cuenta
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_tercero (:CUENTA, :NIT, :FINAL) returning_values (:saldoaux);
            SALDO = SALDO + SALDOAUX;
            END
        SALDO = SALDO * -1;
        if ((PAGO >= :MINIMO) OR ((SALDO <> 0) AND (INCSALDO = 'S'))) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL
                FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
                INTO :NIT, :DV, :RAZONSOCIAL, :TIPODOC, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL;
            ITEM = ITEM + 1;

            SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :MUNICIPIO INTO :nommun;
            lonciu = STRLEN(nommun);
            EXECUTE PROCEDURE POS(' - ', nommun) returning_values (LONMUN);
            nomdep = SUBSTR(nommun, LONMUN+3, LONCIU);
            nommun = SUBSTR(nommun, 1, LONMUN);

            insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
                mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio, mmdd_nommunicipio, mmdd_nomdepto,
                mmdd_base, mmdd_tarifa, mmdd_monto, mmdd_devol, mmdd_saldo)
                values (2, :ano, :item,  :tipodoc, :nit, :dv, :razonsocial, :direccion, :telefono, :email, :municipio,
                :nommun, :nomdep, 0, 0, :pago, 0, :SALDO);
            END
        END
end^


ALTER PROCEDURE MMDIST_22 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable TIPODOC VARCHAR(3);
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(60) CHARACTER SET NONE;
declare variable TELEFONO VARCHAR(40) CHARACTER SET NONE;
declare variable EMAIL VARCHAR(100) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(5) CHARACTER SET NONE;
declare variable NOMMUN varchar(60) CHARACTER SET NONE;
declare variable NOMDEP varchar(60) 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 ITEM integer;
declare variable NATUR CHAR(1);
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable LONMUN INTEGER;
declare variable LONCIU INTEGER;
begin
ITEM = 0;
SELECT mmdi_tope, mmdi_proy, mmdi_centro, mmdi_natur
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND M.mmdi_articulo = 22
    INTO :minimo, :proy, :cent, :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_distr_cuentas M
    WHERE M.mmdi_articulo = 22 AND M.mmdi_ano = :ano AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND D.TERC_NIT <> :NITSHD AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND ((D.proy_cod = :proy) or (:PROY = ''))
    AND ((D.cent_cod = :cent) or (:CENT = ''))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        if (PAGO >= :MINIMO) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL
                FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
                INTO :NIT, :DV, :RAZONSOCIAL, :TIPODOC, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL;
            ITEM = ITEM + 1;

            SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :MUNICIPIO INTO :nommun;
            lonciu = STRLEN(nommun);
            EXECUTE PROCEDURE POS(' - ', nommun) returning_values (LONMUN);
            nomdep = SUBSTR(nommun, LONMUN+3, LONCIU);
            nommun = SUBSTR(nommun, 1, LONMUN);

            insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
                mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio, mmdd_nommunicipio, mmdd_nomdepto,
                mmdd_base, mmdd_tarifa, mmdd_monto)
                values (22, :ano, :item,  :tipodoc, :nit, :dv, :razonsocial, :direccion, :telefono, :email, :municipio,
                :nommun, :nomdep, 0, 0, :pago);
            END
        END
end^


ALTER PROCEDURE MMDIST_23 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable TIPODOC VARCHAR(3);
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(60) CHARACTER SET NONE;
declare variable TELEFONO VARCHAR(40) CHARACTER SET NONE;
declare variable EMAIL VARCHAR(100) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(5) 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 ITEM integer;
declare variable NATUR CHAR(1);
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable LONMUN INTEGER;
declare variable LONCIU INTEGER;
begin
ITEM = 0;
SELECT mmdi_tope, mmdi_proy, mmdi_centro, mmdi_natur
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND M.mmdi_articulo = 23
    INTO :minimo, :proy, :cent, :natur;

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_distr_cuentas M
    WHERE M.mmdi_articulo = 23 AND M.mmdi_ano = :ano AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND D.TERC_NIT <> :NITSHD AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND ((D.proy_cod = :proy) or (:PROY = ''))
    AND ((D.cent_cod = :cent) or (:CENT = ''))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        if (PAGO >= :MINIMO) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL
                FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
                INTO :NIT, :DV, :RAZONSOCIAL, :TIPODOC, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL;
            ITEM = ITEM + 1;

            insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
                mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio,
                mmdd_base, mmdd_tarifa, mmdd_monto)
                values (23, :ano, :item,  :tipodoc, :nit, :dv, :razonsocial, :direccion, :telefono, :email, :municipio,
                0, 0, :pago);
            END
        END
end^


ALTER PROCEDURE MMDIST_24 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable ITEM INTEGER;
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable TIPOID char(3);
declare variable NIT varchar(20);
declare variable DV char(1);
declare variable NOMBRE varchar(60);
declare variable DIRECCION varchar(60);
declare variable TELEFONO varchar(40);
declare variable EMAIL varchar(100);
declare variable MUNICIPIO varchar(5);
declare variable BASERET numeric(18,2);
declare variable PORCRET numeric(9,2);
declare variable RETENCION numeric(18,2);
begin
ITEM = 0;
SELECT mmdi_proy, mmdi_centro
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND M.mmdi_articulo = 24
    INTO :proy, :cent;

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, mediosmag_distr_cuentas M
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT <> :NITSHD
        AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        AND M.mmdi_ano = :ano AND M.mmdi_articulo = 24 AND ((D.proy_cod = :proy) or (:proy = '')) AND ((D.cent_cod = :cent) or (:cent = ''))
        GROUP BY D.TERC_NIT, CODE_PORC
        INTO :NIT, :RETENCION, :baseret, :porcret
        DO
        BEGIN
        SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL
            FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
            INTO :NIT, :DV, :nombre, :tipoid, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL;
        ITEM = ITEM + 1;

        insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
            mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio,
            mmdd_base, mmdd_tarifa, mmdd_monto)
            values (24, :ano, :item,  :tipoid, :nit, :dv, :nombre, :direccion, :telefono, :email, :municipio,
            :baseret, :porcret, :retencion);
        END
end^


ALTER PROCEDURE MMDIST_26 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable ITEM INTEGER;
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable TIPOID char(3);
declare variable NIT varchar(20);
declare variable DV char(1);
declare variable NOMBRE varchar(60);
declare variable DIRECCION varchar(60);
declare variable TELEFONO varchar(40);
declare variable EMAIL varchar(100);
declare variable MUNICIPIO varchar(5);
declare variable BASERET numeric(18,2);
declare variable PORCRET numeric(9,2);
declare variable RETENCION numeric(18,2);
begin
ITEM = 0;
SELECT mmdi_proy, mmdi_centro
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND M.mmdi_articulo = 26
    INTO :proy, :cent;

FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_BASE), MAX(CODE_PORC)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_distr_cuentas M
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT <> :NITSHD
        AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        AND M.mmdi_ano = :ano AND M.mmdi_articulo = 26 AND ((D.proy_cod = :proy) or (:proy = ''))  AND
        ((D.cent_cod = :cent) or (:cent = '')) GROUP BY D.TERC_NIT, CODE_PORC
        INTO :NIT, :RETENCION, :baseret, :porcret
        DO
        BEGIN
        SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL
            FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
            INTO :NIT, :DV, :nombre, :tipoid, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL;
        ITEM = ITEM + 1;

        insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
            mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio,
            mmdd_base, mmdd_tarifa, mmdd_monto, mmdd_devol, mmdd_saldo)
            values (26, :ano, :item,  :tipoid, :nit, :dv, :nombre, :direccion, :telefono, :email, :municipio,
            :baseret, :porcret, :retencion, 0, 0);
        END
end^


ALTER PROCEDURE MMDIST_31 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable artic INTEGER;
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 ITEM integer;
declare variable NATUR CHAR(1);
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
begin
ITEM = 0;
SELECT MMDI_ARTICULO, mmdi_tope, mmdi_proy, mmdi_centro, mmdi_natur
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND MMDI_PROCEDIMIENTO = 'MMDIST_31'
    INTO :ARTIC, :minimo, :proy, :cent, :natur;

FOR SELECT MAX(M.mmdc_item), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_distr_cuentas M
    WHERE M.mmdi_articulo = :ARTIC AND M.mmdi_ano = :ano AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND D.TERC_NIT <> :NITSHD AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND ((D.proy_cod = :proy) or (:PROY = ''))
    AND ((D.cent_cod = :cent) or (:CENT = ''))
    GROUP BY M.mmdc_item
    INTO :ITEM, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        if (PAGO >= :MINIMO) then
            BEGIN
            insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
                mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio, mmdd_nommunicipio, mmdd_nomdepto,
                mmdd_base, mmdd_tarifa, mmdd_monto, mmdd_devol, mmdd_concsh)
                values (:ARTIC, :ano, :item,  0, '', '', '', '', '', '', '',
                '', '', 0, 0, :pago, 0, 0);
            END
        END
end^


ALTER PROCEDURE MMDIST_310 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable TIPODOC VARCHAR(3);
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(60) CHARACTER SET NONE;
declare variable TELEFONO VARCHAR(40) CHARACTER SET NONE;
declare variable EMAIL VARCHAR(100) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(5) 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 ITEM integer;
declare variable NATUR CHAR(1);
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable CONCSH INTEGER;
declare variable PAIS CHAR(3);
begin
ITEM = 0;
SELECT mmdi_tope, mmdi_proy, mmdi_centro, mmdi_natur
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND M.mmdi_articulo = 310
    INTO :minimo, :proy, :cent, :natur;

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_distr_cuentas M
    WHERE M.mmdi_articulo = 310 AND M.mmdi_ano = :ano AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND D.TERC_NIT <> :NITSHD AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND ((D.proy_cod = :proy) or (:PROY = ''))
    AND ((D.cent_cod = :cent) or (:CENT = ''))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        if (PAGO >= :MINIMO) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL, TERC_CONCSH, PAIS_ID
                FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
                INTO :NIT, :DV, :RAZONSOCIAL, :TIPODOC, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL, :CONCSH, :PAIS;
            ITEM = ITEM + 1;

            insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
            mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio,
            mmdd_base, mmdd_tarifa, mmdd_monto, mmdd_concsh, mmdd_pais)
            values (310, :ano, :item,  :tipodoc, :nit, :dv, :razonsocial, :direccion, :telefono, :email, :municipio,
            0, 0, :pago, :concsh, :pais);
            END
        END
end^


ALTER PROCEDURE MMDIST_32 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable artic INTEGER;
declare variable TIPODOC VARCHAR(3);
declare variable NIT VARCHAR(30) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(60) CHARACTER SET NONE;
declare variable TELEFONO VARCHAR(40) CHARACTER SET NONE;
declare variable EMAIL VARCHAR(100) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(5) CHARACTER SET NONE;
declare variable NOMMUN varchar(60) CHARACTER SET NONE;
declare variable NOMDEP varchar(60) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable DEVOL NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable ITEM integer;
declare variable NATUR CHAR(1);
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable LONMUN INTEGER;
declare variable LONCIU INTEGER;
declare variable CONCSH INTEGER;
begin
ITEM = 0;
SELECT MMDI_ARTICULO, mmdi_tope, mmdi_proy, mmdi_centro, mmdi_natur
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND MMDI_PROCEDIMIENTO = 'MMDIST_32'
    INTO :ARTIC, :minimo, :proy, :cent, :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_distr_cuentas M
    WHERE M.mmdi_articulo = :ARTIC AND M.mmdi_ano = :ano AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND D.TERC_NIT <> :NITSHD AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND ((D.proy_cod = :proy) or (:PROY = ''))
    AND ((D.cent_cod = :cent) or (:CENT = ''))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        if (PAGO >= :MINIMO) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL, TERC_CONCSH
                FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
                INTO :NIT, :DV, :RAZONSOCIAL, :TIPODOC, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL, :CONCSH;
            ITEM = ITEM + 1;

            SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :MUNICIPIO INTO :nommun;
            lonciu = STRLEN(nommun);
            EXECUTE PROCEDURE POS(' - ', nommun) returning_values (LONMUN);
            nomdep = SUBSTR(nommun, LONMUN+3, LONCIU);
            nommun = SUBSTR(nommun, 1, LONMUN);

            /* LAS DEVOLUCIONES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
                FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_distr_cuentas M
                WHERE M.mmdi_articulo = :ARTIC AND M.mmdi_ano = :ano AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_ctadev)) = M.mmdc_ctadev AND
                E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND ((D.proy_cod = :proy) or (:PROY = ''))
                AND ((D.cent_cod = :cent) or (:CENT = '')) and D.terc_nit = :NIT
                INTO :DEVOL, :debitos, :creditos;
            if (NATUR = 'D') then
                DEVOL = creditos;
            if (NATUR = 'C') then
                DEVOL = debitos;
            if (DEVOL IS NULL) then
                DEVOL = 0;
            insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
                mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio, mmdd_nommunicipio, mmdd_nomdepto,
                mmdd_base, mmdd_tarifa, mmdd_monto, mmdd_devol, mmdd_concsh)
                values (:ARTIC, :ano, :item,  :tipodoc, :nit, :dv, :razonsocial, :direccion, :telefono, :email, :municipio,
                :nommun, :nomdep, 0, 0, :pago, :devol, :concsh);
            END
        END
end^


ALTER PROCEDURE MMDIST_33 (
    ANO CHAR(4),
    INICIO CHAR(8),
    FINAL CHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable artic INTEGER;
declare variable TIPODOC VARCHAR(3);
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(60) CHARACTER SET NONE;
declare variable TELEFONO VARCHAR(40) CHARACTER SET NONE;
declare variable EMAIL VARCHAR(100) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(5) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable DEVOL NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable ITEM integer;
declare variable NATUR CHAR(1);
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable CONCSH INTEGER;
begin
ITEM = 0;
SELECT MMDI_ARTICULO, mmdi_tope, mmdi_proy, mmdi_centro, mmdi_natur
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND MMDI_PROCEDIMIENTO = 'MMDIST_33'
    INTO :ARTIC, :minimo, :proy, :cent, :natur;

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_distr_cuentas M
    WHERE M.mmdi_articulo = :ARTIC AND M.mmdi_ano = :ano AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND D.TERC_NIT <> :NITSHD AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND ((D.proy_cod = :proy) or (:PROY = ''))
    AND ((D.cent_cod = :cent) or (:CENT = ''))
    GROUP BY D.TERC_NIT
    INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        if (NATUR = 'D') then
            pago = debitos;
        if (NATUR = 'C') then
            pago = creditos;
        if (PAGO >= :MINIMO) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL, TERC_CONCSH
                FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
                INTO :NIT, :DV, :RAZONSOCIAL, :TIPODOC, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL, :CONCSH;
            ITEM = ITEM + 1;

            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
                FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_distr_cuentas M
                WHERE M.mmdi_articulo = :ARTIC AND M.mmdi_ano = :ano AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_ctadev)) = M.mmdc_ctadev AND
                E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND ((D.proy_cod = :proy) or (:PROY = ''))
                AND ((D.cent_cod = :cent) or (:CENT = '')) AND D.TERC_NIT = :NIT
                INTO :DEVOL, :debitos, :creditos;
            if (NATUR = 'D') then
                DEVOL = creditos;
            if (NATUR = 'C') then
                DEVOL = debitos;
            if (DEVOL IS NULL) then
                DEVOL = 0;
            insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
            mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio,
            mmdd_base, mmdd_tarifa, mmdd_monto, mmdd_devol, mmdd_concsh)
            values (:ARTIC, :ano, :item,  :tipodoc, :nit, :dv, :razonsocial, :direccion, :telefono, :email, :municipio,
            0, 0, :pago, :devol, :concsh);
            END
        END
end^


ALTER PROCEDURE MMDIST_34 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable artic INTEGER;
declare variable ITEM INTEGER;
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable TIPOID char(3);
declare variable NIT varchar(20);
declare variable DV char(1);
declare variable NOMBRE varchar(60);
declare variable DIRECCION varchar(60);
declare variable TELEFONO varchar(40);
declare variable EMAIL varchar(100);
declare variable MUNICIPIO varchar(5);
declare variable BASERET numeric(18,2);
declare variable PORCRET numeric(9,2);
declare variable RETENCION numeric(18,2);
begin
ITEM = 0;
SELECT MMDI_ARTICULO, mmdi_proy, mmdi_centro FROM mediosmag_distritales WHERE MMDI_ANO = :ANO AND MMDI_PROCEDIMIENTO = 'MMDIST_34'
    INTO :ARTIC, :proy, :cent;

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, mediosmag_distr_cuentas M
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT <> :NITSHD
        AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        AND M.mmdi_ano = :ano AND M.mmdi_articulo = :artic AND ((D.proy_cod = :proy) or (:proy = '')) AND ((D.cent_cod = :cent) or (:cent = ''))
        GROUP BY D.TERC_NIT, CODE_PORC
        INTO :NIT, :RETENCION, :baseret, :porcret
        DO
        BEGIN
        SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL
            FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
            INTO :NIT, :DV, :nombre, :tipoid, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL;
        ITEM = ITEM + 1;

        insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
            mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio,
            mmdd_base, mmdd_tarifa, mmdd_monto)
            values (:artic, :ano, :item,  :tipoid, :nit, :dv, :nombre, :direccion, :telefono, :email, :municipio,
            :baseret, :porcret, :retencion);
        END
end^


ALTER PROCEDURE MMDIST_36 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable artic INTEGER;
declare variable ITEM INTEGER;
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable TIPOID char(3);
declare variable NIT varchar(20);
declare variable DV char(1);
declare variable NOMBRE varchar(60);
declare variable DIRECCION varchar(60);
declare variable TELEFONO varchar(40);
declare variable EMAIL varchar(100);
declare variable MUNICIPIO varchar(5);
declare variable BASERET numeric(18,2);
declare variable PORCRET numeric(9,2);
declare variable RETENCION numeric(18,2);
begin
ITEM = 0;
SELECT MMDI_ARTICULO, mmdi_proy, mmdi_centro FROM mediosmag_distritales WHERE MMDI_ANO = :ANO AND MMDI_PROCEDIMIENTO = 'MMDIST_36'
    INTO :ARTIC, :proy, :cent;

FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_BASE), MAX(CODE_PORC)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_distr_cuentas M
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT <> :NITSHD
        AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        AND M.mmdi_ano = :ano AND M.mmdi_articulo = :ARTIC AND ((D.proy_cod = :proy) or (:proy = ''))  AND
        ((D.cent_cod = :cent) or (:cent = '')) GROUP BY D.TERC_NIT, CODE_PORC
        INTO :NIT, :RETENCION, :baseret, :porcret
        DO
        BEGIN
        SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL
            FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
            INTO :NIT, :DV, :nombre, :tipoid, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL;
        ITEM = ITEM + 1;

        insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
            mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio,
            mmdd_base, mmdd_tarifa, mmdd_monto, mmdd_devol, mmdd_saldo)
            values (:ARTIC, :ano, :item,  :tipoid, :nit, :dv, :nombre, :direccion, :telefono, :email, :municipio,
            :baseret, :porcret, :retencion, 0, 0);
        END
end^


ALTER PROCEDURE MMDIST_4 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable LONMUN INTEGER;
declare variable LONCIU INTEGER;
declare variable ITEM INTEGER;
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable TIPOID char(3);
declare variable NIT varchar(20);
declare variable DV char(1);
declare variable NOMBRE varchar(60);
declare variable DIRECCION varchar(60);
declare variable TELEFONO varchar(40);
declare variable EMAIL varchar(100);
declare variable MUNICIPIO varchar(5);
declare variable NOMMUNICIPIO varchar(40);
declare variable DEPARTAMENTO varchar(40);
declare variable BASERET numeric(18,2);
declare variable PORCRET numeric(9,2);
declare variable RETENCION numeric(18,2);
declare variable DEVRET numeric(18,2);
begin
ITEM = 0;
SELECT mmdi_proy, mmdi_centro
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND M.mmdi_articulo = 4
    INTO :proy, :cent;

FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_BASE*-1), MAX(CODE_PORC)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_distr_cuentas M
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT <> :NITSHD
        AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        AND M.mmdi_ano = :ano AND M.mmdi_articulo = 4 AND D.proy_cod = :proy AND D.cent_cod = :cent GROUP BY D.TERC_NIT, CODE_PORC
        INTO :NIT, :RETENCION, :DEVRET, :baseret, :porcret
        DO
        BEGIN
        SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL
            FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
            INTO :NIT, :DV, :nombre, :tipoid, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL;
        ITEM = ITEM + 1;

        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :MUNICIPIO INTO :nommunicipio;
        lonciu = STRLEN(nommunicipio);
        EXECUTE PROCEDURE POS(' - ', nommunicipio) returning_values (LONMUN);
        departamento = SUBSTR(nommunicipio, LONMUN+3, LONCIU);
        nommunicipio = SUBSTR(nommunicipio, 1, LONMUN);

        insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
            mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio, mmdd_nommunicipio, mmdd_nomdepto,
            mmdd_base, mmdd_tarifa, mmdd_monto, mmdd_devol, mmdd_saldo)
            values (4, :ano, :item,  :tipoid, :nit, :dv, :nombre, :direccion, :telefono, :email, :municipio,
            :nommunicipio, :departamento, :baseret, :porcret, :retencion, :devret, 0);
        END
end^


ALTER PROCEDURE MMDIST_6 (
    ANO CHAR(4),
    INICIO VARCHAR(8),
    FINAL VARCHAR(8),
    NITSHD VARCHAR(20))
AS
declare variable LONMUN INTEGER;
declare variable LONCIU INTEGER;
declare variable ITEM INTEGER;
declare variable PROY CHAR(4);
declare variable CENT CHAR(4);
declare variable TIPOID char(3);
declare variable NIT varchar(20);
declare variable DV char(1);
declare variable NOMBRE varchar(60);
declare variable DIRECCION varchar(60);
declare variable TELEFONO varchar(40);
declare variable EMAIL varchar(100);
declare variable MUNICIPIO varchar(5);
declare variable NOMMUNICIPIO varchar(40);
declare variable DEPARTAMENTO varchar(40);
declare variable BASERET numeric(18,2);
declare variable PORCRET numeric(9,2);
declare variable RETENCION numeric(18,2);
begin
ITEM = 0;
SELECT mmdi_proy, mmdi_centro
    FROM mediosmag_distritales M WHERE M.mmdi_ano = :ano AND M.mmdi_articulo = 6
    INTO :proy, :cent;

FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_BASE), MAX(CODE_PORC)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_distr_cuentas M
        WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT <> :NITSHD
        AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmdc_cuenta)) = M.mmdc_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        AND M.mmdi_ano = :ano AND M.mmdi_articulo = 6 AND D.proy_cod = :proy AND D.cent_cod = :cent GROUP BY D.TERC_NIT, CODE_PORC
        INTO :NIT, :RETENCION, :baseret, :porcret
        DO
        BEGIN
        SELECT TERC_NITCONTA, TERC_DV, TERC_NOM, IT.tiid_codshd, TERC_DIR, CIUD_COD, TERC_TEL, TERC_EMAIL
            FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
            INTO :NIT, :DV, :nombre, :tipoid, :DIRECCION, :MUNICIPIO, :telefono, :EMAIL;
        ITEM = ITEM + 1;

        SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :MUNICIPIO INTO :nommunicipio;
        lonciu = STRLEN(nommunicipio);
        EXECUTE PROCEDURE POS(' - ', nommunicipio) returning_values (LONMUN);
        departamento = SUBSTR(nommunicipio, LONMUN+3, LONCIU);
        nommunicipio = SUBSTR(nommunicipio, 1, LONMUN);

        insert into mediosmag_distr_datos (mmdi_articulo, mmdi_ano, mmdd_item, mmdd_tipodoc, mmdd_nit, mmdd_dv,
            mmdd_nombre, mmdd_direccion, mmdd_tel, mmdd_email, mmdd_codmunicipio, mmdd_nommunicipio, mmdd_nomdepto,
            mmdd_base, mmdd_tarifa, mmdd_monto, mmdd_devol, mmdd_saldo)
            values (6, :ano, :item,  :tipoid, :nit, :dv, :nombre, :direccion, :telefono, :email, :municipio,
            :nommunicipio, :departamento, :baseret, :porcret, :retencion, 0, 0);
        END
end^


ALTER PROCEDURE MOV_DETALLE_BANCOS (
    FECINI DATE,
    FECFIN DATE,
    CTAINI VARCHAR(3),
    CTAFIN VARCHAR(3),
    DETALLE CHAR(1))
RETURNS (
    FECHA DATE,
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    CONCEPTO VARCHAR(60),
    BENEFICIARIO VARCHAR(60),
    NUMEROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    EGRESO VARCHAR(10),
    COD_CUENTA VARCHAR(3),
    SALDOINICIAL NUMERIC(18,2),
    CODIGO INTEGER)
AS
declare variable DB CHAR(1);
declare variable ID INTEGER;
declare variable NUMROWS INTEGER;
declare variable TOTAL NUMERIC(18,2);
BEGIN
FOR SELECT CUBA_COD,CUBA_CODCTA,CUBA_TITULAR,CUBA_NUMERO
  FROM cuentas_banco
  WHERE CUBA_CODCTA >= :CTAINI AND CUBA_CODCTA <= :CTAFIN
  ORDER BY CUBA_CODCTA
  INTO :CODIGO,:COD_CUENTA,:TITULAR,:NUMEROCUENTA
  DO
  begin
  if (DETALLE = 'S') then
    BEGIN
    EXECUTE PROCEDURE SALDO_CUENTA_BANCO(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
    SALDO =SALDOINICIAL;
    SELECT COUNT(MOBA_ID) FROM MOVIMIENTO_BANCO
        WHERE CUBA_COD = :CODIGO AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN INTO :NUMROWS;
    if (NUMROWS = 0) then
        BEGIN
        TIPO = '';
        PREFIJO = '';
        NUMERO = '';
        CONCEPTO = '';
        EGRESO = '';
        BENEFICIARIO = '';
        DEBITO = 0;
        CREDITO = 0;
        EGRESO = '';
        SUSPEND;
        END
    ELSE
    FOR SELECT MOBA_IDREF, MOBA_FECHA, TIDO_NOMCORTO, MOBA_PREF, MOBA_NUMERO, MOBA_CONCEPTO, MOBA_DB, MOBA_TOTAL
        FROM MOVIMIENTO_BANCO M, TIPO_DOCUMENTO T
        WHERE M.MOBA_TIPODOC = T.TIDO_COD AND M.CUBA_COD =:CODIGO AND M.MOBA_FECHA >=:FECINI AND M.MOBA_FECHA <=:FECFIN
        ORDER BY MOBA_FECHA, MOBA_TIPODOC, MOBA_ID
        INTO :ID, :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO, :DB, :TOTAL
        DO
        BEGIN
        EGRESO = '';
        BENEFICIARIO = '';
        if (TIPO = 'CHEQUES') then
            SELECT CHEQ_EGRESO, CHEQ_BENEF FROM CHEQUES WHERE CHEQ_ID = :ID INTO :EGRESO, :BENEFICIARIO;
        IF (TIPO = 'RETIROS') THEN
            SELECT RETI_EGRESO, RETI_BENEF FROM RETIROS WHERE RETI_ID = :ID INTO :EGRESO, :BENEFICIARIO;
        if (DB = 'S') then
            BEGIN
            DEBITO = TOTAL;
            CREDITO = 0;
            SALDO = SALDO + DEBITO;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = TOTAL;
            SALDO = SALDO - CREDITO;
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    EGRESO = '';
    SELECT COUNT(SABA_FECHA) FROM SALDO_BANCOS
        WHERE CUBA_COD = :CODIGO AND SABA_FECHA >= :FECINI AND SABA_FECHA <= :FECFIN INTO :NUMROWS;
    if (NUMROWS = 0) then
        BEGIN
        EXECUTE PROCEDURE SALDO_CUENTA_BANCO(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
        SALDO =SALDOINICIAL;
        TIPO = '';
        PREFIJO = '';
        NUMERO = '';
        CONCEPTO = '';
        EGRESO = '';
        BENEFICIARIO = '';
        DEBITO = 0;
        CREDITO = 0;
        SUSPEND;
        END
    ELSE
        FOR SELECT SABA_FECHA, SABA_SALDO, SABA_DEBITOS, SABA_CREDITOS
            FROM SALDO_BANCOS
            WHERE CUBA_COD = :CODIGO AND SABA_FECHA >= :FECINI AND SABA_FECHA <= :FECFIN
            ORDER BY SABA_FECHA
            INTO :fecha, :SALDOINICIAL, :DEBITO, :CREDITO
            DO
                BEGIN
                SALDO = SALDOINICIAL + DEBITO - CREDITO;
                SUSPEND;
                END
    END
  end
END^


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(8),
    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 R.reca_nomterc from RECIBOS_CAJA R WHERE 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
            if ((TIPOCOD >= 85) AND (tipocod <= 89)) then
                BEGIN
                dbefectivo = :debito;
                if (TIPOCOD = 85) then
                    SELECT CGRM_NOMCLIENTE FROM CARGA_REMESA WHERE CGRM_ID = :ID INTO :TERCERO;
                if (TIPOCOD = 86) then
                    SELECT TIQP_NOMBRE FROM tiquete_pasajero WHERE TIQP_ID = :ID INTO :TERCERO;
                if (TIPOCOD = 87) then
                    SELECT CGRM_NOMCLIENTE FROM CARGA_REMESA WHERE CGRM_ID = :ID INTO :TERCERO;
                if (TIPOCOD = 88) then
                    SELECT TERC_NOM FROM planilla_pasajeros P, vehiculos V, TERCEROS T WHERE P.plpa_id = :ID AND P.plpa_vehiculo = V.vehi_cod AND V.terc_nit = T.terc_nit INTO :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
            if ((TIPOCOD >= 85) AND (tipocod <= 89)) then
                BEGIN
                crefectivo = :credito;
                if (TIPOCOD = 85) then
                    SELECT CGRM_NOMCLIENTE FROM CARGA_REMESA WHERE CGRM_ID = :ID INTO :TERCERO;
                if (TIPOCOD = 86) then
                    SELECT TIQP_NOMBRE FROM tiquete_pasajero WHERE TIQP_ID = :ID INTO :TERCERO;
                if (TIPOCOD = 87) then
                    SELECT CGRM_NOMCLIENTE FROM CARGA_REMESA WHERE CGRM_ID = :ID INTO :TERCERO;
                if (TIPOCOD = 88) then
                    SELECT TERC_NOM FROM planilla_pasajeros P, vehiculos V, TERCEROS T WHERE P.plpa_id = :ID AND P.plpa_vehiculo = V.vehi_cod AND V.terc_nit = T.terc_nit INTO :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^


ALTER PROCEDURE MOVARTI_CANTIDADES (
    ARTICULO VARCHAR(15),
    DESDE DATE,
    HASTA DATE,
    AGENCIA INTEGER)
RETURNS (
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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 (mvar_tipodoc <> 10) and ((:agencia = 0) or (p.sucu_id = :agencia))
    and m.mvar_tipodoc <> 10
    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^


ALTER PROCEDURE MOVBANCO_NO_CONCILIADOS (
    FECINI DATE,
    FECFIN DATE,
    CUENTA VARCHAR(3))
RETURNS (
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    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^


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^


ALTER PROCEDURE MOVIMIENTO_ACUM_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
execute procedure COMPONE_FECHA_CONTA(ANO, 1, 1) returning_values(FECINI);
MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECFIN);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECFIN, -1) RETURNING_VALUES (FECFIN);

IF (DEBITO = 'S') THEN
  begin
  SELECT SUM(SACU_DEBITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :MOVIMIENTO;
  end
ELSE
  begin
  SELECT SUM(SACU_CREDITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :MOVIMIENTO;
  end
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTO_ARTICULO_ANULADO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    NULO1 CHAR(1),
    NULO2 CHAR(1))
RETURNS (
    TIPO VARCHAR(8),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    CANT NUMERIC(18,4))
AS
begin
TIPO = 'FACTVENT';
FOR select M.mvar_idref, M.mvar_pref, M.mvar_numero, M.mvar_fecha, M.arti_cod, M.mvar_cant
    from movimiento_articulo m where m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin
        and mvar_tipodoc = 31 and not exists (select fact_id from facturas_detalle d
        where fade_anulado = 'N' and d.fact_id = m.mvar_idref and d.fade_item = m.mvar_item)
        order by m.mvar_fecha, m.mvar_cons
    INTO :ID, :PREF, :NUMERO, :FECHA, :ARTICULO, :cant
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :articulo INTO :DESCRIPCION, :UNIDAD;
    SUSPEND;
    END
TIPO = 'REMICLIE';
FOR select M.mvar_idref, M.mvar_pref, M.mvar_numero, M.mvar_fecha, M.arti_cod, M.mvar_cant
    from movimiento_articulo m where m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin
        and mvar_tipodoc = 32 and not exists (select revt_id from remisiones_venta_detalle d
        where rvde_anulado = 'N' and d.revt_id = m.mvar_idref and d.rvde_item = m.mvar_item)
        order by m.mvar_fecha, m.mvar_cons
    INTO :ID, :PREF, :NUMERO, :FECHA, :ARTICULO, :cant
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :articulo INTO :DESCRIPCION, :UNIDAD;
    SUSPEND;
    END
TIPO = 'DEVOLCLI';
FOR select M.mvar_idref, M.mvar_pref, M.mvar_numero, M.mvar_fecha, M.arti_cod, M.mvar_cant
    from movimiento_articulo m where m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin
        and mvar_tipodoc = 33 and not exists (select devt_id from devoluciones_ventas_detalle d
        where d.dvde_anulado = 'N' and d.devt_id = m.mvar_idref and d.dvde_item = m.mvar_item)
        order by m.mvar_fecha, m.mvar_cons
    INTO :ID, :PREF, :NUMERO, :FECHA, :ARTICULO, :cant
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :articulo INTO :DESCRIPCION, :UNIDAD;
    SUSPEND;
    END
TIPO = 'FACTCOMP';
FOR select M.mvar_idref, M.mvar_pref, M.mvar_numero, M.mvar_fecha, M.arti_cod, M.mvar_cant
    from movimiento_articulo m where m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin
        and mvar_tipodoc = 21 and not exists (select faco_id from facturas_compras_detalle d
        where fcde_anulado = 'N' and d.faco_id = m.mvar_idref and d.fcde_item = m.mvar_item)
        order by m.mvar_fecha, m.mvar_cons
    INTO :ID, :PREF, :NUMERO, :FECHA, :ARTICULO, :cant
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :articulo INTO :DESCRIPCION, :UNIDAD;
    SUSPEND;
    END
TIPO = 'REMIPROV';
FOR select M.mvar_idref, M.mvar_pref, M.mvar_numero, M.mvar_fecha, M.arti_cod, M.mvar_cant
    from movimiento_articulo m where m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin
        and mvar_tipodoc = 22 and not exists (select d.repr_id from remision_proveedor_det d
        where d.rpvd_anulado = 'N' and d.repr_id = m.mvar_idref and d.rpvd_item = m.mvar_item)
        order by m.mvar_fecha, m.mvar_cons
    INTO :ID, :PREF, :NUMERO, :FECHA, :ARTICULO, :cant
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :articulo INTO :DESCRIPCION, :UNIDAD;
    SUSPEND;
    END
TIPO = 'DEVOLPRV';
FOR select M.mvar_idref, M.mvar_pref, M.mvar_numero, M.mvar_fecha, M.arti_cod, M.mvar_cant
    from movimiento_articulo m where m.mvar_fecha >= :fecini and m.mvar_fecha <= :fecfin
        and mvar_tipodoc = 24 and not exists (select d.dvco_id from devoluciones_compras_det d
        where d.dvcd_anulado = 'N' and d.dvco_id = m.mvar_idref and d.dvcd_item = m.mvar_item)
        order by m.mvar_fecha, m.mvar_cons
    INTO :ID, :PREF, :NUMERO, :FECHA, :ARTICULO, :cant
    DO
    BEGIN
    SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :articulo INTO :DESCRIPCION, :UNIDAD;
    SUSPEND;
    END
end^


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^


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 MVAR_TIPODOC <> 10 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 MVAR_TIPODOC <> 10 AND
          (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (MVAR_ENTRADA = 'N') INTO :SALC;
  if (SALC IS NULL) then
    SALC = 0;
  SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTO_ARTICULOC_MES (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
DECLARE VARIABLE MESAUX INTEGER;
BEGIN
IF (DEBITO = 'S') THEN
  SELECT SUM(SAAR_DEBITOS) FROM SALDOS_ARTICULO WHERE CUEN_COD = :CUENTA AND ARTI_COD = :ARTICULO AND :MES = SUBSTR(SAAR_FECHA, 5, 6) AND :ANO = SUBSTR(SAAR_FECHA, 1, 4) INTO :MOVIMIENTO;
ELSE
  SELECT SUM(SAAR_CREDITOS) FROM SALDOS_ARTICULO WHERE CUEN_COD = :CUENTA AND ARTI_COD = :ARTICULO AND :MES = SUBSTR(SAAR_FECHA, 5, 6) AND :ANO = SUBSTR(SAAR_FECHA, 1, 4) INTO :MOVIMIENTO;
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTO_BANCO_MES (
    CUENTA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    CONCEPTO VARCHAR(60),
    TIPOID INTEGER,
    ID INTEGER)
AS
declare variable DB CHAR(1);
declare variable TOTAL NUMERIC(18,2);
BEGIN
  EXECUTE PROCEDURE SALDO_CUENTA_BANCO(:CUENTA, :FECINI) returning_values(:SALDO);
  FOR SELECT MOBA_FECHA, TIDO_NOMCORTO, MOBA_PREF, MOBA_NUMERO, MOBA_CONCEPTO, MOBA_DB, MOBA_TOTAL, MOBA_TIPODOC, MOBA_IDREF
    FROM MOVIMIENTO_BANCO M, TIPO_DOCUMENTO T
    WHERE M.MOBA_TIPODOC = T.TIDO_COD AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN AND CUBA_COD = :CUENTA
    ORDER BY MOBA_FECHA, MOBA_ID
    INTO :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO, :DB, :TOTAL, :TIPOID, :ID
  DO
    BEGIN
    if (DB = 'S') then
        BEGIN
        DEBITO = TOTAL;
        CREDITO = 0;
        SALDO = SALDO + DEBITO;
        END
    ELSE
        BEGIN
        DEBITO = 0;
        CREDITO = TOTAL;
        SALDO = SALDO - CREDITO;
        END
    SUSPEND;
    END
END^


ALTER PROCEDURE MOVIMIENTO_CAJA_MES (
    CAJA INTEGER,
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    TIPO VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    TERCERO VARCHAR(60),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    CONCEPTO VARCHAR(60),
    TIPOID INTEGER,
    ID INTEGER)
AS
declare variable DB CHAR(1);
BEGIN
  EXECUTE PROCEDURE SALDO_EN_CAJA(:CAJA, :FECINI) returning_values(:SALDO);
  FOR SELECT MOCA_FECHA, TIDO_NOMCORTO, MOCA_PREFREF, MOCA_NUMREF, MOCA_CONC, MOCA_DB, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_TIPOREF, MOCA_IDREF
    FROM MOVIMIENTO_CAJA M, TIPO_DOCUMENTO T
    WHERE M.MOCA_TIPOREF = T.TIDO_COD AND MOCA_FECHA >= :FECINI AND MOCA_FECHA <= :FECFIN AND CAJA_ID = :CAJA
    ORDER BY MOCA_FECHA, MOCA_ID
    INTO :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO, :DB, :DEBITO, :CREDITO, :TIPOID, :ID
  DO
    BEGIN
    TERCERO = '';
    if (TIPOID = 61) then
        SELECT RECA_NOMTERC FROM RECIBOS_CAJA WHERE RECA_ID = :ID INTO :TERCERO;
    if (TIPOID = 62) then
        SELECT EGRE_NOMTERC FROM EGRESOS WHERE EGRE_ID = :ID INTO :TERCERO;
    if (TIPOID = 85) then
        SELECT CGRM_NOMCLIENTE FROM CARGA_REMESA WHERE CGRM_ID = :ID INTO :TERCERO;
    if (TIPOID = 86) then
        SELECT TIQP_NOMBRE FROM tiquete_pasajero WHERE TIQP_ID = :ID INTO :TERCERO;
    if (TIPOID = 87) then
        SELECT CGRM_NOMCLIENTE FROM CARGA_REMESA WHERE CGRM_ID = :ID INTO :TERCERO;
    if (TIPOID = 88) then
        SELECT TERC_NOM FROM planilla_pasajeros P, vehiculos V, TERCEROS T WHERE P.plpa_id = :ID AND P.plpa_vehiculo = V.vehi_cod AND V.terc_nit = T.terc_nit INTO :TERCERO;
    if (TIPOID <> 63) then
        if (DB = 'S') then
            SALDO = SALDO + DEBITO;
        ELSE
            SALDO = SALDO - CREDITO;
    SUSPEND;
    END
END^


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


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


ALTER PROCEDURE MOVIMIENTO_CENTRO_MES (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
DECLARE VARIABLE MESAUX CHAR(2);
declare variable LG INTEGER;
BEGIN
LG = STRLEN(CUENTA);
EXECUTE PROCEDURE CADENA_MES(MES) RETURNING_VALUES (MESAUX);
IF (DEBITO = 'S') THEN
  SELECT SUM(SACE_DEBITO) FROM SALDOS_CENTROS WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
ELSE IF (DEBITO = 'N') THEN
  SELECT SUM(SACE_CREDITO) FROM SALDOS_CENTROS WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
ELSE
  SELECT SUM(SACE_DEBITO-SACE_CREDITO) FROM SALDOS_CENTROS WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTO_CENTRO_MES_NIIF (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
DECLARE VARIABLE MESAUX CHAR(2);
declare variable LG INTEGER;
BEGIN
LG = STRLEN(CUENTA);
EXECUTE PROCEDURE CADENA_MES(MES) RETURNING_VALUES (MESAUX);
IF (DEBITO = 'S') THEN
  SELECT SUM(SACE_DEBITO) FROM saldos_centros_niif WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
ELSE
  SELECT SUM(SACE_CREDITO) FROM saldos_centros_niif WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTO_CENTROS_MES (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
DECLARE VARIABLE MESAUX CHAR(2);
declare variable LG INTEGER;
BEGIN
LG = STRLEN(CUENTA);
EXECUTE PROCEDURE CADENA_MES(MES) RETURNING_VALUES (MESAUX);
SELECT SUM(SACE_DEBITO) FROM SALDOS_CENTROS WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :DEBITOS;
SELECT SUM(SACE_CREDITO) FROM SALDOS_CENTROS WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
declare variable DIAS INTEGER;
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MESINI, 1) RETURNING_VALUES (FECINI);
EXECUTE PROCEDURE DIAS_MES(MESFIN, ANO) RETURNING_VALUES (DIAS);
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MESFIN, DIAS) RETURNING_VALUES (FECFIN);
IF (DEBITO = 'S') THEN
  SELECT SUM(SACU_DEBITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :MOVIMIENTO;
ELSE
  SELECT SUM(SACU_CREDITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :MOVIMIENTO;
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTO_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECINI);
MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECFIN);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECFIN, -1) RETURNING_VALUES (FECFIN);

IF (DEBITO = 'S') THEN
  begin
  SELECT SUM(SACU_DEBITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :MOVIMIENTO;
  end
ELSE
  begin
  SELECT SUM(SACU_CREDITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :MOVIMIENTO;
  end
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTO_CUENTA_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECINI);
MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECFIN);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECFIN, -1) RETURNING_VALUES (FECFIN);

IF (DEBITO = 'S') THEN
  begin
  SELECT SUM(SACU_DEBITO) FROM saldos_cuentas_niif WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :MOVIMIENTO;
  end
ELSE
  begin
  SELECT SUM(SACU_CREDITO) FROM saldos_cuentas_niif WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :MOVIMIENTO;
  end
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


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


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


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^


ALTER PROCEDURE MOVIMIENTO_NETO_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
DECLARE VARIABLE MESAUX CHAR(2);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
EXECUTE PROCEDURE CADENA_MES(MES) RETURNING_VALUES(MESAUX);
SELECT SUM(SACU_DEBITO-SACU_CREDITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTO_NETO_CUENTA_MES_N (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
DECLARE VARIABLE MESAUX CHAR(2);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
EXECUTE PROCEDURE CADENA_MES(MES) RETURNING_VALUES(MESAUX);
SELECT SUM(SACU_DEBITO-SACU_CREDITO) FROM saldos_cuentas_niif WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


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^


ALTER PROCEDURE MOVIMIENTO_TERCERO_MES (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
DECLARE VARIABLE MESAUX INTEGER;
BEGIN
IF (DEBITO = 'S') THEN
  SELECT SUM(SATE_DEBITO) FROM SALDOS_TERCEROS WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND :MES = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
ELSE
  SELECT SUM(SATE_CREDITO) FROM SALDOS_TERCEROS WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND :MES = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTO_TERCERO_MES_NIIF (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    DEBITO CHAR(1))
RETURNS (
    MOVIMIENTO NUMERIC(18,2))
AS
DECLARE VARIABLE MESAUX INTEGER;
BEGIN
IF (DEBITO = 'S') THEN
  SELECT SUM(SATE_DEBITO) FROM saldos_terceros_niif WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND :MES = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
ELSE
  SELECT SUM(SATE_CREDITO) FROM saldos_terceros_niif WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND :MES = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :MOVIMIENTO;
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^


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^


ALTER PROCEDURE MOVIMIENTOS_ARTICULOC_MES (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
SELECT SUM(SAAR_DEBITOS), SUM(SAAR_CREDITOS) FROM SALDOS_ARTICULO WHERE CUEN_COD = :CUENTA AND ARTI_COD = :ARTICULO AND :MES = SUBSTR(SAAR_FECHA, 5, 6) AND :ANO = SUBSTR(SAAR_FECHA, 1, 4) INTO :DEBITOS, :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTOS_CENTRO_MES (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
DECLARE VARIABLE MESAUX CHAR(2);
declare variable LG INTEGER;
BEGIN
LG = STRLEN(CUENTA);
EXECUTE PROCEDURE CADENA_MES(MES) RETURNING_VALUES (MESAUX);
SELECT SUM(SACE_DEBITO) FROM SALDOS_CENTROS WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :DEBITOS;
SELECT SUM(SACE_CREDITO) FROM SALDOS_CENTROS WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTOS_CENTRO_MES_N (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
DECLARE VARIABLE MESAUX CHAR(2);
declare variable LG INTEGER;
BEGIN
LG = STRLEN(CUENTA);
EXECUTE PROCEDURE CADENA_MES(MES) RETURNING_VALUES (MESAUX);
SELECT SUM(SACE_DEBITO) FROM saldos_centros_niif WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :DEBITOS;
SELECT SUM(SACE_CREDITO) FROM saldos_centros_niif WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND :MESAUX = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTOS_CENTRO_TERCERO_MES (
    CUENTA VARCHAR(20),
    PROY CHAR(4),
    CENT CHAR(4),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
SELECT SUM(SACT_DEBITO), SUM(SACT_CREDITO) FROM saldos_centros_tercero
    WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND :MES = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    AND PROY_COD = :PROY AND CENT_COD = :CENT
    INTO :debitos,  :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTOS_CUENTA_DE_HASTA_N (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
declare variable DIAS INTEGER;
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MESINI, 1) RETURNING_VALUES (FECINI);
EXECUTE PROCEDURE DIAS_MES(MESFIN, ANO) RETURNING_VALUES (DIAS);
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MESFIN, DIAS) RETURNING_VALUES (FECFIN);
SELECT SUM(SACU_DEBITO), SUM(SACU_CREDITO) FROM saldos_cuentas_niif WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN
    INTO :DEBITOS, :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTOS_CUENTA_DESDE_HASTA (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
declare variable DIAS INTEGER;
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MESINI, 1) RETURNING_VALUES (FECINI);
EXECUTE PROCEDURE DIAS_MES(MESFIN, ANO) RETURNING_VALUES (DIAS);
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MESFIN, DIAS) RETURNING_VALUES (FECFIN);
SELECT SUM(SACU_DEBITO), SUM(SACU_CREDITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN
    INTO :DEBITOS, :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTOS_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECINI);
MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECFIN);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECFIN, -1) RETURNING_VALUES (FECFIN);

SELECT SUM(SACU_DEBITO), SUM(SACU_CREDITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :debitos, :creditos;
IF (debitos IS NULL) THEN
  debitos = 0;
IF (creditos IS NULL) THEN
  creditos = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTOS_CUENTA_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECINI);
MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECFIN);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECFIN, -1) RETURNING_VALUES (FECFIN);

SELECT SUM(SACU_DEBITO), SUM(SACU_CREDITO) FROM saldos_cuentas_niif WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :debitos, :creditos;
IF (debitos IS NULL) THEN
  debitos = 0;
IF (creditos IS NULL) THEN
  creditos = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTOS_TERCERO_DESDE_HASTA (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
declare variable DIAS INTEGER;
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MESINI, 1) RETURNING_VALUES (FECINI);
EXECUTE PROCEDURE DIAS_MES(MESFIN, ANO) RETURNING_VALUES (DIAS);
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MESFIN, DIAS) RETURNING_VALUES (FECFIN);
SELECT SUM(SATE_DEBITO), SUM(SATE_CREDITO) FROM SALDOS_TERCEROS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    TERC_NIT = :NIT AND SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN
    INTO :DEBITOS, :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTOS_TERCERO_MES (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
SELECT SUM(SATE_DEBITO), SUM(SATE_CREDITO) FROM SALDOS_TERCEROS WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND :MES = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :debitos,  :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


ALTER PROCEDURE MOVIMIENTOS_TERCERO_MES_NIIF (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
SELECT SUM(SATE_DEBITO), SUM(SATE_CREDITO) FROM saldos_terceros_niif WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND :MES = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :debitos,  :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


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(8),
    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 M.mvar_tipodoc <> 10 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^


ALTER PROCEDURE MOVTOS_CENTRO_TERCERO_MES_N (
    CUENTA VARCHAR(20),
    PROY CHAR(4),
    CENT CHAR(4),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2))
AS
BEGIN
SELECT SUM(SACT_DEBITO), SUM(SACT_CREDITO) FROM saldos_centros_tercero_niif
    WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND :MES = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4)
    AND PROY_COD = :PROY AND CENT_COD = :CENT
    INTO :debitos,  :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^


ALTER PROCEDURE NOMBRE_ASCII (
    CADENA VARCHAR(60))
RETURNS (
    CADENAASCII VARCHAR(60))
AS
begin
CADENAASCII = REPLACE(CADENA, 'Ñ', 'N');
CADENAASCII = REPLACE(CADENAASCII, '¥', 'N');
CADENAASCII = REPLACE(CADENAASCII, 'ñ', 'n');
CADENAASCII = REPLACE(CADENAASCII, 'Á', 'A');
CADENAASCII = REPLACE(CADENAASCII, 'À', 'A');
CADENAASCII = REPLACE(CADENAASCII, 'á', 'a');
CADENAASCII = REPLACE(CADENAASCII, 'à', 'a');
CADENAASCII = REPLACE(CADENAASCII, 'É', 'E');
CADENAASCII = REPLACE(CADENAASCII, 'È', 'E');
CADENAASCII = REPLACE(CADENAASCII, '´', '''');
CADENAASCII = REPLACE(CADENAASCII, 'é', 'e');
CADENAASCII = REPLACE(CADENAASCII, 'è', 'e');
CADENAASCII = REPLACE(CADENAASCII, 'Í', 'I');
CADENAASCII = REPLACE(CADENAASCII, 'Ì', 'I');
CADENAASCII = REPLACE(CADENAASCII, 'í', 'i');
CADENAASCII = REPLACE(CADENAASCII, 'ì', 'i');
CADENAASCII = REPLACE(CADENAASCII, 'Ó', 'O');
CADENAASCII = REPLACE(CADENAASCII, 'Ò', 'O');
CADENAASCII = REPLACE(CADENAASCII, 'ó', 'o');
CADENAASCII = REPLACE(CADENAASCII, 'ò', 'o');
CADENAASCII = REPLACE(CADENAASCII, 'Ú', 'U');
CADENAASCII = REPLACE(CADENAASCII, 'Ù', 'U');
CADENAASCII = REPLACE(CADENAASCII, 'Ü', 'U');
CADENAASCII = REPLACE(CADENAASCII, 'ú', 'u');
CADENAASCII = REPLACE(CADENAASCII, 'ù', 'u');
CADENAASCII = REPLACE(CADENAASCII, 'ü', 'u');
CADENAASCII = REPLACE(CADENAASCII, '§', 'o');
CADENAASCII = REPLACE(CADENAASCII, 'ø', 'o');
CADENAASCII = REPLACE(CADENAASCII, '°', 'o');
CADENAASCII = REPLACE(CADENAASCII, 'º', 'o');
CADENAASCII = REPLACE(CADENAASCII, 'ª', 'a');
CADENAASCII = REPLACE(CADENAASCII, '¥', 'Y');
CADENAASCII = REPLACE(CADENAASCII, '·', '-');
suspend;
end^


ALTER PROCEDURE NOMBRE_COMPANIA
RETURNS (
    NOMBRE VARCHAR(80))
AS
BEGIN
  SELECT CONF_VALOR FROM CONFIGURACION WHERE CONF_MODULO = 'GENERAL' AND CONF_CATEGORIA = 'GENERAL' AND
CONF_PROPIEDAD = 'NOMBRE COMPAÃ‘IA' INTO :NOMBRE;
  if (NOMBRE IS NULL) then
    exception configuracion_no_encontrada;
  SUSPEND;
END^


ALTER PROCEDURE NOMBRES_GRUPOS_CLIENTE (
    NIT VARCHAR(20))
RETURNS (
    CODZONA VARCHAR(2),
    CODGRUPO INTEGER,
    CODCIU VARCHAR(5),
    NOMZONA VARCHAR(60),
    NOMGRUPO VARCHAR(60),
    NOMCIU VARCHAR(60))
AS
begin
nomZONA = '';
NOMGRUPO = '';
NOMCIU = '';
SELECT C.ZONA_COD, ZONA_NOM, GRCA_COD FROM CLIENTES C, ZONAS Z WHERE C.zona_cod = Z.zona_cod AND C.terc_nit = :nit INTO :codzona, :nomzona, :codgrupo;
SELECT CIUD_COD, TERC_CIU FROM TERCEROS WHERE terc_nit = :nit INTO :codciu, :nomciu;
SELECT GRCA_NOMBRE FROM grupo_cartera WHERE GRCA_COD = :codgrupo INTO :nomgrupo;
suspend;
end^


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^


ALTER PROCEDURE NOMINA_SALARIOS_UGPP (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    TIPOCONT VARCHAR(60),
    CONCSAL INTEGER,
    ALTORIES CHAR(1),
    TIPODOC CHAR(3),
    NITEMPL VARCHAR(20),
    TIPODOCAP CHAR(3),
    NITEMPLAP VARCHAR(20),
    NOMEMPL VARCHAR(60),
    CARGO VARCHAR(60),
    BENEFICIO VARCHAR(60),
    FECING DATE,
    FECRET DATE,
    SALINT CHAR(1),
    ANO CHAR(4),
    MES INTEGER,
    DIASLAB INTEGER,
    DIASINC INTEGER,
    DIASLICR INTEGER,
    DIASLICNR INTEGER,
    DIASVACD INTEGER,
    DIASTOT INTEGER,
    NOVINGRET VARCHAR(16),
    CONC INTEGER,
    BASEAP CHAR(1),
    BENEF CHAR(1),
    CONCCTA VARCHAR(20),
    CONCNOM VARCHAR(60),
    CONCCTANOM VARCHAR(60),
    CONCIBCVR NUMERIC(18,2),
    CONCNIBCVR NUMERIC(18,2),
    CONCBENEF NUMERIC(18,2),
    INCAPVR NUMERIC(18,2),
    LICRVR NUMERIC(18,2),
    LICNRVR NUMERIC(18,2),
    VACDVR NUMERIC(18,2),
    VACCVR NUMERIC(18,2),
    VACFVR NUMERIC(18,2),
    PAGCES NUMERIC(18,2),
    PAGINT NUMERIC(18,2),
    PAGPRI NUMERIC(18,2),
    PAGIND NUMERIC(18,2),
    AUXTRA NUMERIC(18,2),
    PAGDOT NUMERIC(18,2))
AS
declare variable fecnom date;
declare variable inimes date;
declare variable finmes date;
declare variable periodic integer;
declare variable perini integer;
declare variable perfin integer;
declare variable fecretaux date;
declare variable fecvinc date;
declare variable tipocontv varchar(60);
declare variable fecaux date;
declare variable concsalaux integer;
declare variable concsal1 integer;
declare variable i integer;
declare variable salintaux char(1);
declare variable altoriesaux char(1);
begin
ANO = EXTRACT(YEAR FROM :FECINI);
ALTORIES = ' ';
delete from conceptos_nomina_reporte;
INSERT INTO conceptos_nomina_reporte (CONC_COD)
    select cn.conc_cod from conceptos_nomina CN where CN.conc_aporte = 'N' AND CN.conc_prov = 'N' and cn.conc_deduc = 'N' and
    (CN.CONC_COD <> 932) and (CN.CONC_COD <> 997) and (CN.CONC_COD <> 1000) and (CN.CONC_COD <> 1003) and
    (CN.CONC_COD <> 1026) and (CN.CONC_COD <> 1033) and (CN.CONC_COD <> 1034) and (CN.CONC_COD <> 1035) and
    (CN.CONC_COD <> 978) and (CN.CONC_COD <> 998) and (CN.CONC_COD <> 1001) and (CN.CONC_COD <> 1004) and
    (CN.CONC_COD <> 975) and (CN.CONC_COD <> 999) and (CN.CONC_COD <> 1002) and (CN.CONC_COD <> 1005) and
    (CN.CONC_COD <> 1006) and (CN.CONC_COD <> 1007) and (CN.CONC_COD <> 1008) and (CN.CONC_COD <> 1036) and
    (CN.CONC_COD <> 958) and (CN.CONC_COD <> 959) and (CN.CONC_COD <> 960) and (CN.CONC_COD <> 1025) and
    (CN.CONC_COD <> 49) AND (CN.CONC_COD <> 50) AND (CN.CONC_COD <> 51) AND (CN.CONC_COD <> 52) AND
    (CN.CONC_COD <> 56) AND (CN.CONC_COD <> 57) AND (CN.CONC_COD <> 58) AND (CN.CONC_COD <> 59) AND
    (CN.CONC_COD <> 1055) AND (CN.CONC_COD <> 1056) AND (CN.CONC_COD <> 969) AND
    (CN.CONC_COD <> 949) AND (CN.CONC_COD <> 950) AND (CN.CONC_COD <> 968) AND (CN.CONC_COD <> 961) AND (CN.CONC_COD <> 966) AND (CN.CONC_COD <> 967) and
    (CN.CONC_COD <> 951) AND (CN.CONC_COD <> 969) AND
    (CN.CONC_COD <> 955) AND (CN.CONC_COD <> 956) AND (CN.CONC_COD <> 957) AND (CN.CONC_COD <> 1024) AND
    (CN.CONC_COD <> 963) AND (CN.CONC_COD <> 986) AND (CN.CONC_COD <> 987) AND (CN.CONC_COD <> 1029) AND
    (CN.CONC_COD <> 1040) AND (CN.CONC_COD <> 1041) AND (CN.CONC_COD <> 1042) AND (CN.CONC_COD <> 1043) AND
    exists (select n.nomi_id from nomina_conceptos NC, NOMINA N
    where CN.conc_cod = NC.conc_cod AND NC.nomi_id = N.nomi_id AND N.nomi_ano = EXTRACT(YEAR FROM :fecini))
    order by cn.conc_orden, cn.conc_cod;
DELETE FROM nomina_ugpp_meses;
INSERT INTO nomina_ugpp_meses(NUGM_ID, NUGM_FECHA)
    SELECT MAX(extract(MONTH FROM nomi_feccausa)), max(nomi_feccausa) FROM NOMINA
        WHERE nomi_feccausa >= :fecini AND nomi_feccausa <= :fecfin
        GROUP BY extract(MONTH FROM nomi_feccausa);
/* para cada empleado */
FOR SELECT E.tcot_cod, TIID_CODSHD, E.terc_nit, T.TERC_NOM, E.empl_salinteg, e.empl_ppago, E.empl_idpila, E.empl_tipoidpila, E.empl_altoriesgo, E.empl_beneficio
    FROM EMPLEADOS E, TIPO_ID TI, TERCEROS T
    WHERE T.terc_nit = E.terc_nit AND T.terc_tipoid = TI.tiid_cod AND
    exists (select n.nomi_id from NOMINA_DETALLE ND, NOMINA N where ND.nomi_id = N.nomi_id AND ND.terc_nit = T.terc_nit
        AND N.nomi_feccausa >= :fecini AND N.nomi_feccausa <= :fecfin)
    order by t.terc_nit
    INTO :TIPOCONT, :tipodoc, :NITEMPL, :NOMEMPL, :salintaux, :periodic, :nitemplap, :tipodocap, :altoriesaux, :BENEFICIO
    DO
    BEGIN
    concsal1 = 0;
    concsalaux = 0;
    /* para cada mes */
    FOR SELECT NUGM_ID, NUGM_FECHA FROM nomina_ugpp_meses
        INTO :MES, :fecnom
        DO
        BEGIN
        if (PERIODIC = 1) then
            BEGIN
            PERINI = MES;
            PERFIN = MES;
            END
        else if (periodic = 2) then
            BEGIN
            PERINI = ((MES-1) * 2) + 1;
            PERFIN = (MES * 2);
            END
        else if (periodic = 3) then
            BEGIN
            PERINI = ((MES-1) * 4) + 1;
            PERFIN = (MES * 4);
            END
        INIMES = DATEADD (-EXTRACT(DAY FROM :FECNOM)+1 DAY TO :FECNOM);
        FINMES = DATEADD (-EXTRACT(DAY FROM (DATEADD (32 DAY TO :INIMES))) DAY TO (DATEADD (32 DAY TO :INIMES)));
        EXECUTE PROCEDURE empleado_activo (:nitempl, :finmes) returning_values (:fecing, :fecretaux);
        if ((:FECING <= :FINMES) AND ((:fecretaux is null) or (:fecretaux >= :inimes))) then
            BEGIN
            SELECT FIRST 1 MVCE_CARGO FROM movimiento_cargo_empleado WHERE TERC_NIT = :NITEMPL AND MVCE_FECHA <= :FINMES
                ORDER BY MVCE_FECHA DESC INTO :cargo;
            FECVINC = NULL;
            SELECT FIRST 1 MVVE_FECHA, TIUV_NOMBRE FROM movimiento_vincul_empleado MV, tipo_vinculo_ugpp V
                WHERE TERC_NIT = :NITEMPL AND MV.tivu_cod = V.tivu_cod AND MVVE_FECHA <= :FINMES ORDER BY MVVE_FECHA DESC
                INTO :fecvinc, :tipocont;
            I = 0;
            FOR SELECT CONC_COD FROM nomina_conceptos NC, NOMINA N WHERE N.nomi_id = NC.nomi_id AND NC.TERC_NIT = :nitempl and
                N.nomi_feccausa >= :inimes AND N.nomi_feccausa <= :finmes AND
                ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903) or (CONC_COD = 1011) OR
                (CONC_COD = 970) or (CONC_COD = 1009) or (CONC_COD = 1010) or (CONC_COD = 1037) OR
                (CONC_COD = 971) or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 974) OR
                (CONC_COD = 980) or (CONC_COD = 981) or (CONC_COD = 1023))
                order by N.nomi_feccausa INTO :concsalaux
                DO
                BEGIN
                I = I + 1;
                if (I = 1) then
                    CONCSAL1 = CONCSALAUX;
                else
                    CONCSAL = CONCSALAUX;
                END

            if (EXISTS (SELECT I1.INEM_FECHA FROM ingresos_empleado I1, ingresos_empleado I2
                WHERE I1.TERC_NIT = :NITEMPL AND I1.INEM_INGRESO = 'N' AND EXTRACT(MONTH FROM I1.INEM_FECHA) = :mes
                AND I2.TERC_NIT = :NITEMPL AND I2.INEM_INGRESO = 'S' AND EXTRACT(MONTH FROM I2.INEM_FECHA) = :mes AND I2.inem_fecha > I1.inem_fecha)) then
                BEGIN
                /* HAY UN REINGRESO EN EL MISMO MES */
                SELECT INEM_FECHA FROM ingresos_empleado WHERE TERC_NIT = :NITEMPL AND INEM_INGRESO = 'N'
                    AND EXTRACT(MONTH FROM INEM_FECHA) = :mes INTO :FECRET;
                SELECT FIRST 1 TIUV_NOMBRE FROM movimiento_vincul_empleado MV, tipo_vinculo_ugpp V
                    WHERE TERC_NIT = :NITEMPL AND MV.tivu_cod = V.tivu_cod AND MVVE_FECHA < :fecret ORDER BY MVVE_FECHA DESC
                    INTO :tipocontv;
                SELECT FIRST 1 MVCE_CARGO FROM movimiento_cargo_empleado WHERE TERC_NIT = :NITEMPL AND MVCE_FECHA <= :inimes
                    ORDER BY MVCE_FECHA DESC INTO :cargo;
                if ((TIPOCONT <> TIPOCONTV) or (CONCSAL1 <> CONCSALAUX)) then
                    BEGIN
                    TIPOCONT = TIPOCONTV;
                    CONCSAL = CONCSAL1;
                    if ((SALINTAUX = 'S') AND ((CONCSAL = 970) or (CONCSAL = 1037) or (CONCSAL = 1009) or (CONCSAL = 1010))) then
                        SALINT = 'X';
                    else
                        SALINT = ' ';
                    if ((altoriesaux = 'S') AND (CONCSAL <> 971) AND (CONCSAL <> 1023)) then
                        altories = 'X';
                    else
                        altories = ' ';
                    /* ES DE ESTE MES, REPORTE HASTA LA FECHA DEL CAMBIO APARTE */
                    SELECT SUM(NNDE_DURACION) FROM nomina_novedades NN, nomina_novedades_detalle NND
                        WHERE NN.nono_id = NND.nono_id AND ((NN.tnov_cod = 2) or (NN.tnov_cod = 3) or (NN.tnov_cod = 4)) AND
                        TERC_NIT =:nitempl AND NN.nono_ano = :ano and nn.nono_periodo >= :perini and nn.nono_periodo <= :perfin
                        AND NN.nono_fecha <= :fecret AND NN.nono_fecha >= :INIMES into :DIASINC;
                    if (DIASINC IS NULL) then
                        DIASINC = 0;
                    SELECT SUM(NNDE_DURACION) FROM nomina_novedades NN, nomina_novedades_detalle NND
                        WHERE NN.nono_id = NND.nono_id AND (NN.tnov_cod = 12) AND
                        TERC_NIT =:nitempl AND NN.nono_ano = :ano and nn.nono_periodo >= :perini and nn.nono_periodo <= :perfin
                        AND NN.nono_fecha <= :fecret AND NN.nono_fecha >= :INIMES into :DIASLICR;
                    if (DIASLICR IS NULL) then
                        DIASLICR = 0;
                    SELECT SUM(NNDE_DURACION) FROM nomina_novedades NN, nomina_novedades_detalle NND
                        WHERE NN.nono_id = NND.nono_id AND ((NN.tnov_cod = 13) or (NN.tnov_cod = 9)) AND
                        TERC_NIT =:nitempl AND NN.nono_ano = :ano and nn.nono_periodo >= :perini and nn.nono_periodo <= :perfin
                        AND NN.nono_fecha <= :fecret AND NN.nono_fecha >= :INIMES into :DIASLICNR;
                    if (DIASLICNR IS NULL) then
                        DIASLICNR = 0;
                    SELECT SUM(NNDE_DURACION) FROM nomina_novedades NN, nomina_novedades_detalle NND
                        WHERE NN.nono_id = NND.nono_id AND ((NN.tnov_cod = 6) or (NN.tnov_cod = 14)) AND
                        TERC_NIT =:nitempl AND NN.nono_ano = :ano and nn.nono_periodo >= :perini and nn.nono_periodo <= :perfin
                        AND NN.nono_fecha <= :fecret AND NN.nono_fecha >= :INIMES into :DIASVACD;

                    if (DIASVACD IS NULL) then
                        DIASVACD = 0;
                    /* dias laborados */
                    DIASLAB = 0;
                    select FIRST 1 noco_cant from nomina_conceptos where
                        noco_ano = :ano and noco_periodo >= :perini and noco_periodo <= :perfin and terc_nit = :nitempl
                        and conc_cod = :concsal1
                        ORDER BY noco_item into :diaslab;
                    if (DIASLAB IS NULL) then
                        DIASLAB = 0;
                    DIASTOT = DIASLAB + DIASINC + DIASLICR + DIASLICNR + DIASVACD;
                    if (diastot > 30) then
                        DIASTOT = 30;
                    NOVINGRET = '';
                    if (DIASTOT < 30) then
                        BEGIN
                        if ((:fecing >= :INIMES) AND (FECING <= :fecret)) then
                            NOVINGRET = 'INGRESO';
                        if ((:fecret >= :INIMES) AND (fecret <= :finmes)) then
                            BEGIN
                            if (novingret <> '') then
                                NOVINGRET = NOVINGRET || ' Y ';
                            NOVINGRET = NOVINGRET || 'RETIRO';
                            END
                        END
                    incapvr = 0;
                    licrvr = 0;
                    licnrvr = 0;
                    vacdvr = 0;
                    vaccvr = 0;
                    pagces = 0;
                    pagint = 0;
                    pagpri = 0;
                    pagind = 0;
                    pagdot = 0;
                    auxtra = 0;
                    /* incapacidades */
                    select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                        AND extract(MONTH FROM N.nomi_feccausa) = :MES and
                        ((CONC_COD = 932) or (CONC_COD = 997) or (CONC_COD = 1000) or (CONC_COD = 1003) or
                        (CONC_COD = 1026) or (CONC_COD = 1033) or (CONC_COD = 1034) or (CONC_COD = 1035) or
                        (CONC_COD = 998) or (CONC_COD = 1001) or (CONC_COD = 1004) or (CONC_COD = 978) or 
                        (CONC_COD = 975) or (CONC_COD = 999) or (CONC_COD = 1002) or (CONC_COD = 1005) or
                        (CONC_COD = 49) or (CONC_COD = 50) or (CONC_COD = 51) OR (CONC_COD = 52) OR
                        (CONC_COD = 56) OR (CONC_COD = 57) OR (CONC_COD = 58) OR (CONC_COD = 59) OR
                        (CONC_COD = 1055) OR (CONC_COD = 1056) OR
                        (CONC_COD = 1006) or (CONC_COD = 1007) or (CONC_COD = 1008) or (CONC_COD = 1036))
                        into :incapvr;
                    if (:incapvr IS NULL) then
                        incapvr = 0;
                    /* licencia remunerada */
                    select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                        AND extract(MONTH FROM N.nomi_feccausa) = :MES and
                        ((CONC_COD = 958) or (CONC_COD = 959) or (CONC_COD = 960) or (CONC_COD = 1025))
                        into LICRVR;
                    if (:licrvr IS NULL) then
                        licrvr = 0;
                    /* licencia no remunerada */
                    SELECT SUM(NNDE_VALOR) FROM nomina_novedades NN, nomina_novedades_detalle NND
                        WHERE NN.nono_id = NND.nono_id AND ((NN.tnov_cod = 13) or (NN.tnov_cod = 9)) AND NN.nono_fecha <= :fecret AND
                        TERC_NIT =:nitempl AND NN.nono_ano = :ano and nn.nono_periodo >= :perini and nn.nono_periodo <= :perfin
                        into :LICNRVR;
                    if (LICNRVR IS NULL) then
                        LICNRVR = 0;
                    /* vacaciones disfrutadas */
                    select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                        AND extract(MONTH FROM N.nomi_feccausa) = :MES and (CONC_COD = 949)
                        into :VACDVR;
                    if (vacdvr IS NULL) then
                        vacdvr = 0;
                    /* vacaciones compensadas */
                    select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                        AND extract(MONTH FROM N.nomi_feccausa) = :MES and (CONC_COD = 950)
                        into :vaccvr;
                    if (vaccvr IS NULL) then
                        vaccvr = 0;
                    /* pago cesantias */
                    select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                        AND extract(MONTH FROM N.nomi_feccausa) = :MES and ((CONC_COD = 951) or (CONC_COD = 969))
                        into :PAGCES;
                    if (PAGCES IS NULL) then
                        PAGCES = 0;
                    /* pago intereses cesantias */
                    select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                        AND extract(MONTH FROM N.nomi_feccausa) = :MES and (CONC_COD = 968)
                        into :PAGINT;
                    if (PAGINT IS NULL) then
                        PAGINT = 0;
                    /* pago prima */
                    select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                        AND extract(MONTH FROM N.nomi_feccausa) = :MES and ((CONC_COD = 966) or (CONC_COD = 967))
                        into :PAGPRI;
                    if (PAGPRI IS NULL) then
                        PAGPRI = 0;
                    /* pago auxilio transporte */
                    select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                        AND extract(MONTH FROM N.nomi_feccausa) = :MES and ((CONC_COD = 955) or (CONC_COD = 956) or (CONC_COD = 957) or (CONC_COD = 1024))
                        into :AUXTRA;
                    if (AUXTRA IS NULL) then
                        AUXTRA = 0;
                    /* pago indemnizaciones */
                    select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                        AND extract(MONTH FROM N.nomi_feccausa) = :MES and ((CONC_COD = 963) or (CONC_COD = 986) or (CONC_COD = 987) or (CONC_COD = 1029))
                        into :PAGIND;
                    if (PAGIND IS NULL) then
                        PAGIND = 0;
                    /* pago dotaciones */
                    select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                        where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                        AND extract(MONTH FROM N.nomi_feccausa) = :MES and ((CONC_COD = 1040) or (CONC_COD = 1041) or (CONC_COD = 1042) or (CONC_COD = 1043))
                        into :PAGDOT;
                    if (PAGDOT IS NULL) then
                        PAGDOT = 0;
                    if ((FECRET >= :INIMES) AND (FECRET <= :FINMES)) then
                        BEGIN
                        VACFVR = vaccvr;
                        vaccvr = 0;
                        END
                    else
                        vacfvr = 0;
            
                    for select conc_cod from conceptos_nomina_reporte into :conc
                        do
                        BEGIN
                        select CN.conc_ctagast, CN.conc_nombre, CN.conc_baseap, CN.conc_benefic from conceptos_nomina CN
                            WHERE CONC_COD = :conc INTO :CONCCTA, :CONCNOM, :baseap, :benef;
                        CONCCTANOM = '';
                        SELECT CUEN_NOM FROM CUENTAS WHERE CUEN_COD = :CONCCTA INTO :CONCCTANOM;
                        concibcvr = NULL;
                        select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                            where NC.nomi_id = N.nomi_id AND NC.conc_cod = :conc AND NC.terc_nit = :nitempl AND N.nomi_feccausa <= :fecret
                            AND extract(MONTH FROM N.nomi_feccausa) = :MES
                            into :concibcvr;
                        if (concibcvr IS NULL) then
                            concibcvr = 0;
                        if (BENEF IS NULL) then
                            BENEF = 'N';
                        if (BASEAP IS NULL) then
                            BASEAP = 'N';
                        if (BENEF = 'S') then
                            BEGIN
                            CONCBENEF = CONCIBCVR;
                            CONCNIBCVR = 0;
                            CONCIBCVR = 0;
                            END
                        ELSE
                            BEGIN
                            CONCBENEF = 0;
                            if (BASEAP = 'N') then
                                BEGIN
                                CONCNIBCVR = CONCIBCVR;
                                CONCIBCVR = 0;
                                END
                            else
                                CONCNIBCVR = 0;
                            END
                        suspend;
                        END
                    if (fecvinc > fecing) then
                        FECING = FECVINC;
                    ELSE
                        SELECT INEM_FECHA FROM ingresos_empleado WHERE TERC_NIT = :NITEMPL AND INEM_INGRESO = 'S'
                            AND EXTRACT(MONTH FROM INEM_FECHA) = :mes AND INEM_FECHA > :FECRET INTO :FECING;

                    SELECT FIRST 1 TIUV_NOMBRE FROM movimiento_vincul_empleado MV, tipo_vinculo_ugpp V
                        WHERE TERC_NIT = :NITEMPL AND MV.tivu_cod = V.tivu_cod AND MVVE_FECHA <= :FINMES ORDER BY MVVE_FECHA DESC
                        INTO :tipocont;
                    SELECT FIRST 1 MVCE_CARGO FROM movimiento_cargo_empleado WHERE TERC_NIT = :NITEMPL AND MVCE_FECHA <= :FINMES
                        ORDER BY MVCE_FECHA DESC INTO :cargo;
                    if (EXTRACT(MONTH FROM FECRETAUX )= MES) then
                        FECRET = FECRETAUX;
                    ELSE
                        FECRET = NULL;
                    if (FECING > INIMES) then
                        fecaux = FECING;
                    else
                        FECAUX = INIMES;
                    END
                ELSE
                    begin
                    FECRETAUX = FECRET;
                    FECAUX = INIMES;
                    end
                END
            ELSE
                BEGIN
                if (EXTRACT(MONTH FROM FECRETAUX )= MES) then
                    FECRET = FECRETAUX;
                ELSE
                    FECRET = NULL;
                if (FECING > INIMES) then
                    fecaux = FECING;
                else
                    FECAUX = INIMES;
                END
            CONCSAL = CONCSALAUX;
            if ((SALINTAUX = 'S') AND ((CONCSAL = 970) or (CONCSAL = 1037) or (CONCSAL = 1009) or (CONCSAL = 1010))) then
                SALINT = 'X';
            else
                SALINT = ' ';
            if ((altoriesaux = 'S') AND (CONCSAL <> 971) AND (CONCSAL <> 1023)) then
                altories = 'X';
            else
                altories = ' ';
            SELECT SUM(NNDE_DURACION) FROM nomina_novedades NN, nomina_novedades_detalle NND
                WHERE NN.nono_id = NND.nono_id AND ((NN.tnov_cod = 2) or (NN.tnov_cod = 3) or (NN.tnov_cod = 4)) AND
                TERC_NIT =:nitempl AND NN.nono_ano = :ano and nn.nono_periodo >= :perini and nn.nono_periodo <= :perfin
                AND NN.nono_fecha <= :FINMES AND NN.nono_fecha >= :FECAUX into :DIASINC;
            if (DIASINC IS NULL) then
                DIASINC = 0;
            SELECT SUM(NNDE_DURACION) FROM nomina_novedades NN, nomina_novedades_detalle NND
                WHERE NN.nono_id = NND.nono_id AND (NN.tnov_cod = 12) AND
                TERC_NIT =:nitempl AND NN.nono_ano = :ano and nn.nono_periodo >= :perini and nn.nono_periodo <= :perfin
                AND NN.nono_fecha <= :FINMES AND NN.nono_fecha >= :FECAUX into :DIASLICR;
            if (DIASLICR IS NULL) then
                DIASLICR = 0;
            SELECT SUM(NNDE_DURACION) FROM nomina_novedades NN, nomina_novedades_detalle NND
                WHERE NN.nono_id = NND.nono_id AND ((NN.tnov_cod = 13) or (NN.tnov_cod = 9)) AND
                TERC_NIT =:nitempl AND NN.nono_ano = :ano and nn.nono_periodo >= :perini and nn.nono_periodo <= :perfin
                AND NN.nono_fecha <= :FINMES AND NN.nono_fecha >= :FECAUX into :DIASLICNR;
            if (DIASLICNR IS NULL) then
                DIASLICNR = 0;
            SELECT SUM(NNDE_DURACION) FROM nomina_novedades NN, nomina_novedades_detalle NND
                WHERE NN.nono_id = NND.nono_id AND ((NN.tnov_cod = 6) or (NN.tnov_cod = 14)) AND
                TERC_NIT =:nitempl AND NN.nono_ano = :ano and nn.nono_periodo >= :perini and nn.nono_periodo <= :perfin
                AND NN.nono_fecha <= :FINMES AND NN.nono_fecha >= :FECAUX into :DIASVACD;
            if (DIASVACD IS NULL) then
                DIASVACD = 0;
            /* dias laborados */
            DIASLAB = 0;
            select FIRST 1 noco_cant from nomina_conceptos where
                noco_ano = :ano and noco_periodo >= :perini and noco_periodo <= :perfin and terc_nit = :nitempl
                and conc_cod = :concsal
                ORDER BY noco_item into :diaslab;
            if (DIASLAB IS NULL) then
                DIASLAB = 0;
            DIASTOT = DIASLAB + DIASINC + DIASLICR + DIASLICNR + DIASVACD;
            if (diastot > 30) then
                DIASTOT = 30;
            NOVINGRET = '';
            if (DIASTOT < 30) then
                BEGIN
                if ((:fecing > :INIMES) AND (FECING < :FINMES)) then
                    NOVINGRET = 'INGRESO';
                if ((:fecret > :INIMES) AND (fecret < :FINMES)) then
                    BEGIN
                    if (novingret <> '') then
                        NOVINGRET = NOVINGRET || ' Y ';
                    NOVINGRET = NOVINGRET || 'RETIRO';
                    END
                END
            incapvr = 0;
            licrvr = 0;
            licnrvr = 0;
            vacdvr = 0;
            vaccvr = 0;
            pagces = 0;
            pagint = 0;
            pagpri = 0;
            pagind = 0;
            pagdot = 0;
            auxtra = 0;
            /* incapacidades */
            select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl
                AND N.nomi_feccausa >= :FECAUX and N.nomi_feccausa <= :finmes AND
                ((CONC_COD = 932) or (CONC_COD = 997) or (CONC_COD = 1000) or (CONC_COD = 1003) or
                (CONC_COD = 1026) or (CONC_COD = 1033) or (CONC_COD = 1034) or (CONC_COD = 1035) or
                (CONC_COD = 998) or (CONC_COD = 1001) or (CONC_COD = 1004) or (CONC_COD = 978) or
                (CONC_COD = 975) or (CONC_COD = 999) or (CONC_COD = 1002) or (CONC_COD = 1005) or
                (CONC_COD = 49) or (CONC_COD = 50) or (CONC_COD = 51) OR (CONC_COD = 52) OR
                (CONC_COD = 56) OR (CONC_COD = 57) OR (CONC_COD = 58) OR (CONC_COD = 59) OR
                (CONC_COD = 1055) OR (CONC_COD = 1056) OR
                (CONC_COD = 1006) or (CONC_COD = 1007) or (CONC_COD = 1008) or (CONC_COD = 1036))
                into :incapvr;
            if (:incapvr IS NULL) then
                incapvr = 0;
            /* licencia remunerada */
            select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl
                AND N.nomi_feccausa >= :fecaux and N.nomi_feccausa <= :finmes AND
                ((CONC_COD = 958) or (CONC_COD = 959) or (CONC_COD = 960) or (CONC_COD = 1025))
                into LICRVR;
            if (:licrvr IS NULL) then
                licrvr = 0;
            /* licencia no remunerada */
            SELECT SUM(NNDE_VALOR) FROM nomina_novedades NN, nomina_novedades_detalle NND
                WHERE NN.nono_id = NND.nono_id AND ((NN.tnov_cod = 13) or (NN.tnov_cod = 9)) AND
                TERC_NIT =:nitempl AND NN.nono_ano = :ano and nn.nono_periodo >= :perini and nn.nono_periodo <= :perfin
                AND NN.nono_fecha >= :fecaux and NN.nono_fecha <= :finmes
                into :LICNRVR;
            if (LICNRVR IS NULL) then
                LICNRVR = 0;
            /* vacaciones disfrutadas */
            select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl
                AND N.nomi_feccausa >= :fecaux and N.nomi_feccausa <= :finmes and (CONC_COD = 949)
                into :VACDVR;
            if (vacdvr IS NULL) then
                vacdvr = 0;
            /* vacaciones compensadas */
            select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl
                AND N.nomi_feccausa >= :fecaux and N.nomi_feccausa <= :finmes and (CONC_COD = 950)
                into :vaccvr;
            if (vaccvr IS NULL) then
                vaccvr = 0;
            /* pago cesantias */
            select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl
                AND N.nomi_feccausa >= :fecaux and N.nomi_feccausa <= :finmes and ((CONC_COD = 951) or (CONC_COD = 969))
                into :PAGCES;
            if (PAGCES IS NULL) then
                PAGCES = 0;
            /* pago intereses cesantias */
            select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl
                AND N.nomi_feccausa >= :fecaux and N.nomi_feccausa <= :finmes and (CONC_COD = 968)
                into :PAGINT;
            if (PAGINT IS NULL) then
                PAGINT = 0;
            /* pago prima */
            select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl
                AND N.nomi_feccausa >= :fecaux and N.nomi_feccausa <= :finmes and ((CONC_COD = 966) or (CONC_COD = 967))
                into :PAGPRI;
            if (PAGPRI IS NULL) then
                PAGPRI = 0;
            /* pago auxilio transporte */
            select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl
                AND N.nomi_feccausa >= :fecaux and N.nomi_feccausa <= :finmes and ((CONC_COD = 955) or (CONC_COD = 956) or (CONC_COD = 957) or (CONC_COD = 1024))
                into :AUXTRA;
            if (AUXTRA IS NULL) then
                AUXTRA = 0;
            /* pago indemnizaciones */
            select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl
                AND N.nomi_feccausa >= :fecaux and N.nomi_feccausa <= :finmes and ((CONC_COD = 963) or (CONC_COD = 986) or (CONC_COD = 987) or (CONC_COD = 1029))
                into :PAGIND;
            if (PAGIND IS NULL) then
                PAGIND = 0;
            /* pago dotaciones */
            select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                where NC.nomi_id = N.nomi_id AND NC.terc_nit = :nitempl
                AND N.nomi_feccausa >= :fecaux and N.nomi_feccausa <= :finmes and ((CONC_COD = 1040) or (CONC_COD = 1041) or (CONC_COD = 1042) or (CONC_COD = 1043))
                into :PAGDOT;
            if (PAGDOT IS NULL) then
                PAGDOT = 0;
            if ((FECRET >= :INIMES) AND (FECRET <= :FINMES)) then
                BEGIN
                VACFVR = vaccvr;
                vaccvr = 0;
                END
            else
                vacfvr = 0;
    
            for select conc_cod from conceptos_nomina_reporte into :conc
                do
                BEGIN
                select CN.conc_ctagast, CN.conc_nombre, CN.conc_baseap, CN.conc_benefic from conceptos_nomina CN
                    WHERE CONC_COD = :conc INTO :CONCCTA, :CONCNOM, :baseap, :benef;
                CONCCTANOM = '';
                SELECT CUEN_NOM FROM CUENTAS WHERE CUEN_COD = :CONCCTA INTO :CONCCTANOM;
                concibcvr = NULL;
                select sum(nc.noco_valor) from nomina_conceptos NC, NOMINA N
                    where NC.nomi_id = N.nomi_id AND NC.conc_cod = :conc AND NC.terc_nit = :nitempl AND
                    N.nomi_feccausa >= :fecaux and n.nomi_feccausa <= :finmes
                    into :concibcvr;
                if (concibcvr IS NULL) then
                    concibcvr = 0;
    
                if (BASEAP IS NULL) then
                    BASEAP = 'N';
                if (BENEF IS NULL) then
                    BENEF = 'N';
                if (BENEF = 'S') then
                    BEGIN
                    CONCBENEF = CONCIBCVR;
                    CONCNIBCVR = 0;
                    CONCIBCVR = 0;
                    END
                ELSE
                    BEGIN
                    CONCBENEF = 0;
                    if (BASEAP = 'N') then
                        BEGIN
                        CONCNIBCVR = CONCIBCVR;
                        CONCIBCVR = 0;
                        END
                    else
                        CONCNIBCVR = 0;
                    END
                suspend;
                END
            END /* TRABAJO ESTE MES */
        END
    END
end^


ALTER PROCEDURE NOTACRCL_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCCL_ID, PREF_PRE, NCCL_NUMERO FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ANULADO = 'N' AND
    NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN
    ORDER BY NCCL_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 42 INTO :IDI;
    if (IDI IS NOT NULL) then
        BEGIN
        if (CN <> 'N') then
            EXECUTE PROCEDURE CONTABIL_NOTACRCL (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
        else
            BEGIN
            ERROR = 0;
            IDC = IDREF;
            END
        if (ERROR = 0) then
            if (CN <> 'C') then
                EXECUTE PROCEDURE contabil_notacrcl_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
        if (ERROR = 0) then
            BEGIN
            EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        END
    end
  END
END^


ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) 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
        if (CN <> 'N') then
            EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
        else
            BEGIN
            ERROR = 0;
            IDC = IDREF;
            END
        if (ERROR = 0) then
            if (CN <> 'C') then
                EXECUTE PROCEDURE contabil_notacrpr_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
        if (ERROR = 0) then
            BEGIN
            EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        END
    end
  END
END^


ALTER PROCEDURE NOTADBCL_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDCL_ID, PREF_PRE, NDCL_NUMERO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ANULADO = 'N' AND
    NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN
    ORDER BY NDCL_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 41 INTO :IDI;
    if (IDI IS NOT NULL) then
      BEGIN
      if (CN <> 'N') then
        EXECUTE PROCEDURE CONTABIL_NOTADBCL (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
      else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
      if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_notadbcl_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
      if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
      ELSE
        ESTADO = 'ERROR';
      suspend;
      END
    end
  END
END^


ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) 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
        if (CN <> 'N') then
            EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
        else
            BEGIN
            ERROR = 0;
            IDC = IDREF;
            END
        if (ERROR = 0) then
            if (CN <> 'C') then
                EXECUTE PROCEDURE contabil_notadbpr_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
        if (ERROR = 0) then
            BEGIN
            EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        END
    end
  END
END^


ALTER PROCEDURE NOTASCRBC_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCBC_ID, CUBA_COD, PRBA_PREF, NCBC_NUMERO FROM NOTAS_CREDITO
    WHERE NCBC_ANULADO = 'N' AND NCBC_FECHA >= :FECINI AND NCBC_FECHA <= :FECFIN
    ORDER BY NCBC_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 75 AND CUBA_COD = :CTA INTO :IDI;
    if (IDI is NOT NULL) then
      BEGIN
      if (CN <> 'N') then
        EXECUTE PROCEDURE CONTABIL_NOTACRBC (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
      else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
      if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_notacrbc_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
      if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
      ELSE
        ESTADO = 'ERROR';
      suspend;
      END
    end
  END
END^


ALTER PROCEDURE NOTASDBBC_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDBC_ID, CUBA_COD, PRBA_PREF, NDBC_NUMERO FROM NOTAS_DEBITO
    WHERE NDBC_ANULADO = 'N' AND NDBC_FECHA >= :FECINI AND NDBC_FECHA <= :FECFIN
    ORDER BY NDBC_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 74 AND CUBA_COD = :CTA INTO :IDI;
    if (IDI is NOT NULL) then
      BEGIN
      if (CN <> 'N') then
          EXECUTE PROCEDURE CONTABIL_NOTADBBC (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
      else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
      if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_notadbbc_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
      if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
      ELSE
        ESTADO = 'ERROR';
      suspend;
      END
    end
  END
END^


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),
    NOMIID INTEGER,
    MOTIVO VARCHAR(255))
AS
DECLARE VARIABLE CODNOVE CHAR(3);
BEGIN
    FOR SELECT N.NONO_ID, terc_nit, tnov_cod, ND.nnde_periodo, ND.nnde_diaini, ND.nnde_duracion, nono_fecha, ND.nnde_valor, ND.nomi_id, N.nono_motivo
    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, :nomiid, :motivo
    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^


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^


ALTER PROCEDURE NROBANCO_REF_EGRESOS (
    CTABANCO VARCHAR(20))
AS
declare variable ID INTEGER;
declare variable NUMCHEQ VARCHAR(20);
begin
FOR SELECT EGRE_ID, EGBC_NUMERO FROM egresos_banco
    ORDER BY EGRE_ID
    INTO :ID, :NUMCHEQ
    DO
    BEGIN
    UPDATE COMPROBANTE_DETALLE SET CODE_REFER = :NUMCHEQ WHERE CUEN_COD = :CTABANCO AND ENCO_CONSEC in (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_IDREF = :ID);
    END
end^


ALTER PROCEDURE NUM_ENT
AS
declare variable pref varchar(4);
declare variable Num varchar(8);
declare variable Id Integer;
begin
for select entr_id, pref_pre, entr_numero from entradas into :id, :pref, :Num
do
    BEGIN
    update movimiento_articulo
    set mvar_pref = :pref, mvar_numero = :Num
    where mvar_tipodoc = 11 and mvar_idref = :id;
    END
END^


ALTER PROCEDURE NUMERO_CONCILIACION (
    ID INTEGER)
RETURNS (
    ITEM INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
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^


ALTER PROCEDURE NUMERO_DOCUMENTO (
    TIPO INTEGER,
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
AS
begin
if (TIPO = 11) then
    select pref_pre, entr_numero from entradas where entr_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 12) then
    select pref_pre, sali_numero from salidas where sali_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 13) then
    select pref_pre, tran_numero from trasferencias where tran_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 14) then
    select pref_pre, ajus_numero from ajustes where ajus_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 15) then
    select pref_pre, ensa_numero from ensambles where ensa_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 16) then
    select pref_pre, dese_numero from desensambles where dese_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 21) then
    select pref_pre, faco_numero from facturas_compra where faco_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 22) then
    select pref_pre, repr_numero from remision_proveedor where repr_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 24) then
    select pref_pre, dvco_numero from devoluciones_compras where dvco_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 23) then
    select pref_pre, ordc_numero from ordenes_compra where ordc_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 25) then
    select pref_pre, copr_numero from cotizacion_proveedor where copr_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 30) then
    select pref_pre, fact_numero from facturas f, entrega_documentos e where tido_cod = 31 and endo_iddoc = fact_id and endo_iddoc = :ID INTO :PREF, :NUMERO;
if (TIPO = 31) then
    select pref_pre, fact_numero from facturas where fact_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 32) then
    select pref_pre, revt_numero from remisiones_venta where revt_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 33) then
    select pref_pre, devt_numero from devoluciones_ventas where devt_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 34) then
    select pref_pre, pedi_numero from pedidos where pedi_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 35) then
    select pref_pre, coti_numero from cotizaciones where coti_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 40) then
    select pref_pre, pend_numero from pendiente_ventas where pend_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 41) then
    select pref_pre, ndcl_numero from notas_debito_clientes where ndcl_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 42) then
    select pref_pre, nccl_numero from notas_credito_clientes where nccl_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 43) then
    select pref_pre, apcl_numero from aplicacion_cliente where apcl_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 45) then
    select pref_pre, ancl_numero from anticipos_cliente where ancl_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 51) then
    select pref_pre, ndpr_numero from notas_debito_proveedor where ndpr_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 52) then
    select pref_pre, ncpr_numero from notas_credito_proveedor where ncpr_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 53) then
    select pref_pre, appr_numero from aplicacion_provedor where appr_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 55) then
    select pref_pre, anpr_numero from anticipos_proveedor where anpr_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 61) then
    select pref_pre, reca_numero from recibos_caja where reca_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 62) then
    select pref_pre, egre_numero from egresos where egre_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 64) then
    select pref_pre, cotj_numero from consigna_tarjetas where cotj_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 65) then
    select pref_pre, rcpr_numero from recibo_provisional where rcpr_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 66) then
    select pref_pre, trcj_numero from traslados_caja where trcj_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 71) then
    select prba_pref, cons_numero from consigna where cons_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 74) then
    select prba_pref, ndbc_numero from notas_debito where ndbc_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 75) then
    select prba_pref, ncbc_numero from notas_credito where ncbc_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 76) then
    select prba_pref, tras_numero from traslados where tras_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 77) then
    select prba_pref, dvch_numdoc from devolucion_cheques where dvch_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 85) then
    select cgrm_pref, cgrm_numero from carga_remesa where tido_cod = 85 and cgrm_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 86) then
    select tiqp_pref, tiqp_numero from tiquete_pasajero where tiqp_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 87) then
    select cgrm_pref, cgrm_numero from carga_remesa where tido_cod = 87 and cgrm_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 89) then
    select manc_pref, manc_numero from manifiesto_carga where manc_id = :ID INTO :PREF, :NUMERO;
if (TIPO = 88) then
    select plpa_pref, plpa_numero from planilla_pasajeros where plpa_id = :ID INTO :PREF, :NUMERO;
suspend;
end^


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_VENCE >= :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^


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^


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;
if (:proveedor <> '') then
  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 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;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    end
else
  FOR SELECT a.ARTI_COD, ARTI_UNIDAD, ARTI_DIAS
    FROM articulo a WHERE esar_cod <> 'I'
    INTO :articulo, :unidad, :DIAS
    DO
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    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;
    CANT = PROMEDIO - EXISTENCIA;
    if (CANT > 0) then
        begin
        execute procedure ultimo_costo(:articulo, :fecha, :unidad) returning_values (:costo);
        SUSPEND;
        end
    end

END^


ALTER PROCEDURE ORDEN_SUGERIDA_TOTAL (
    PROVEEDOR VARCHAR(20),
    CODBOD VARCHAR(2),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    BODEGA VARCHAR(2),
    UNIDAD VARCHAR(8),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    SUGERIDO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    DIAS INTEGER)
AS
declare variable PEDAUTO char(2);
declare variable FACTOR NUMERIC(15,4);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
declare variable MARCA VARCHAR(10);
declare variable ORDENC numeric(18,4);
declare variable PEDIDO numeric(18,4);
declare variable ITEM integer;
declare variable ID integer;
declare variable UND varchar(8);
declare variable CANT numeric(18,4);
declare variable FACTOR2 numeric(18,4);
declare variable fecini date;
declare variable FECHAAUX varchar(10);
declare variable DEVMES numeric(18,2);
declare variable MFAC integer;
declare variable MDEV integer;
declare variable IVAF numeric(18,2);
declare variable IVAD numeric(18,2);
declare variable UNABOD VARCHAR(7);
declare variable SUGMIN VARCHAR(6);
declare variable MINIMO numeric(18,4);
BEGIN
execute procedure lee_configuracion('COMPRAS', 'ORDENES', 'ORDEN SUGERIDA POR BODEGA O GENERAL') returning_values (:UNABOD);
execute procedure lee_configuracion('COMPRAS', 'ORDENES', 'SUGERIDO CON MINIMO O CON DIAS DE DISPONIBILIDAD') returning_values (:sugmin);
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, ARTI_DES, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS, ARTI_MIN FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor and esar_cod <> 'I' order by a.arti_des
    INTO :articulo, :DESCRIPCION, :costo, :unidad, :DIAS, :MINIMO
  DO BEGIN
  for select bode_cod from bodega where BODE_ACTIVA = 'S' AND ((:UNABOD = 'GENERAL') or (BODE_COD = :CODBOD)) into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (SUGMIN = 'DIAS') then
        BEGIN
        if (DIA_ART = 'NO') then
            DIAS = CAST(DIASC AS INTEGER);
        if (DIAS is null) then
            DIAS = 0;
        PROMEDIO = DIAS * PROMEDIO;
        if (FACTOR <> 0) then
            PROMEDIO = PROMEDIO / FACTOR;
        SUGERIDO = PROMEDIO - EXISTENCIA;
        END
    ELSE
        SUGERIDO = MINIMO - 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_VENCE >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = cast (FECHA as varchar(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = cast (FECHAAUX as date);
    execute procedure ventas_articulo (:ARTICULO, :FECINI, :FECHA, 0, :bodega) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        where F.FACO_ID = D.faco_id and D.ARTI_COD = :articulo and FACO_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by FACO_FECHA desc, F.FACO_ID desc
        into :fechacmp, :cantcmp;
    if (sugerido > 0) then
        SUSPEND;
    end
  END
END^


ALTER PROCEDURE ORDENE_TARIFAS (
    ABASE1 NUMERIC(18,2),
    ABASE2 NUMERIC(18,2),
    ABASE3 NUMERIC(18,2),
    ABASE4 NUMERIC(18,2),
    ABASE5 NUMERIC(18,2),
    ABASE6 NUMERIC(18,2),
    ABASE7 NUMERIC(18,2),
    ABASE8 NUMERIC(18,2),
    AIVA1 NUMERIC(18,2),
    AIVA2 NUMERIC(18,2),
    AIVA3 NUMERIC(18,2),
    AIVA4 NUMERIC(18,2),
    AIVA5 NUMERIC(18,2),
    AIVA6 NUMERIC(18,2),
    AIVA7 NUMERIC(18,2),
    AIVA8 NUMERIC(18,2))
RETURNS (
    BASE1 NUMERIC(18,2),
    BASE2 NUMERIC(18,2),
    BASE3 NUMERIC(18,2),
    BASE4 NUMERIC(18,2),
    BASE5 NUMERIC(18,2),
    BASE6 NUMERIC(18,2),
    BASE7 NUMERIC(18,2),
    BASE8 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    IVA4 NUMERIC(18,2),
    IVA5 NUMERIC(18,2),
    IVA6 NUMERIC(18,2),
    IVA7 NUMERIC(18,2),
    IVA8 NUMERIC(18,2))
AS
declare variable ORDEN integer;
declare variable TARIFA integer;
begin
FOR SELECT TAIV_ORDIMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD > 0 AND TAIV_COD < 8 ORDER BY TAIV_COD
    INTO :ORDEN, :TARIFA
    DO
    BEGIN
    if (orden = 1) then
        BEGIN
        if (TARIFA = 1) then
            BEGIN
            BASE1 = ABASE1;
            IVA1 = AIVA1;
            END
        if (TARIFA = 2) then
            BEGIN
            BASE1 = ABASE2;
            IVA1 = AIVA2;
            END
        if (TARIFA = 3) then
            BEGIN
            BASE1 = ABASE3;
            IVA1 = AIVA3;
            END
        if (TARIFA = 4) then
            BEGIN
            BASE1 = ABASE4;
            IVA1 = AIVA4;
            END
        if (TARIFA = 5) then
            BEGIN
            BASE1 = ABASE5;
            IVA1 = AIVA5;
            END
        if (TARIFA = 6) then
            BEGIN
            BASE1 = ABASE6;
            IVA1 = AIVA6;
            END
        if (TARIFA = 7) then
            BEGIN
            BASE1 = ABASE7;
            IVA1 = AIVA7;
            END
        if (TARIFA = 8) then
            BEGIN
            BASE1 = ABASE8;
            IVA1 = AIVA8;
            END
        END
    if (orden = 2) then
        BEGIN
        if (TARIFA = 1) then
            BEGIN
            BASE2 = ABASE1;
            IVA2 = AIVA1;
            END
        if (TARIFA = 2) then
            BEGIN
            BASE2 = ABASE2;
            IVA2 = AIVA2;
            END
        if (TARIFA = 3) then
            BEGIN
            BASE2 = ABASE3;
            IVA2 = AIVA3;
            END
        if (TARIFA = 4) then
            BEGIN
            BASE2 = ABASE4;
            IVA2 = AIVA4;
            END
        if (TARIFA = 5) then
            BEGIN
            BASE2 = ABASE5;
            IVA2 = AIVA5;
            END
        if (TARIFA = 6) then
            BEGIN
            BASE2 = ABASE6;
            IVA2 = AIVA6;
            END
        if (TARIFA = 7) then
            BEGIN
            BASE2 = ABASE7;
            IVA2 = AIVA7;
            END
        if (TARIFA = 8) then
            BEGIN
            BASE2 = ABASE8;
            IVA2 = AIVA8;
            END
        END
    if (orden = 3) then
        BEGIN
        if (TARIFA = 1) then
            BEGIN
            BASE3 = ABASE1;
            IVA3 = AIVA1;
            END
        if (TARIFA = 2) then
            BEGIN
            BASE3 = ABASE2;
            IVA3 = AIVA2;
            END
        if (TARIFA = 3) then
            BEGIN
            BASE3 = ABASE3;
            IVA3 = AIVA3;
            END
        if (TARIFA = 4) then
            BEGIN
            BASE3 = ABASE4;
            IVA3 = AIVA4;
            END
        if (TARIFA = 5) then
            BEGIN
            BASE3 = ABASE5;
            IVA3 = AIVA5;
            END
        if (TARIFA = 6) then
            BEGIN
            BASE3 = ABASE6;
            IVA3 = AIVA6;
            END
        if (TARIFA = 7) then
            BEGIN
            BASE3 = ABASE7;
            IVA3 = AIVA7;
            END
        if (TARIFA = 8) then
            BEGIN
            BASE3 = ABASE8;
            IVA3 = AIVA8;
            END
        END
    if (orden = 4) then
        BEGIN
        if (TARIFA = 1) then
            BEGIN
            BASE4 = ABASE1;
            IVA4 = AIVA1;
            END
        if (TARIFA = 2) then
            BEGIN
            BASE4 = ABASE2;
            IVA4 = AIVA2;
            END
        if (TARIFA = 3) then
            BEGIN
            BASE4 = ABASE3;
            IVA4 = AIVA3;
            END
        if (TARIFA = 4) then
            BEGIN
            BASE4 = ABASE4;
            IVA4 = AIVA4;
            END
        if (TARIFA = 5) then
            BEGIN
            BASE4 = ABASE5;
            IVA4 = AIVA5;
            END
        if (TARIFA = 6) then
            BEGIN
            BASE4 = ABASE6;
            IVA4 = AIVA6;
            END
        if (TARIFA = 7) then
            BEGIN
            BASE4 = ABASE7;
            IVA4 = AIVA7;
            END
        if (TARIFA = 8) then
            BEGIN
            BASE4 = ABASE8;
            IVA4 = AIVA8;
            END
        END
    if (orden = 5) then
        BEGIN
        if (TARIFA = 1) then
            BEGIN
            BASE5 = ABASE1;
            IVA5 = AIVA1;
            END
        if (TARIFA = 2) then
            BEGIN
            BASE5 = ABASE2;
            IVA5 = AIVA2;
            END
        if (TARIFA = 3) then
            BEGIN
            BASE5 = ABASE3;
            IVA5 = AIVA3;
            END
        if (TARIFA = 4) then
            BEGIN
            BASE5 = ABASE4;
            IVA5 = AIVA4;
            END
        if (TARIFA = 5) then
            BEGIN
            BASE5 = ABASE5;
            IVA5 = AIVA5;
            END
        if (TARIFA = 6) then
            BEGIN
            BASE5 = ABASE6;
            IVA5 = AIVA6;
            END
        if (TARIFA = 7) then
            BEGIN
            BASE5 = ABASE7;
            IVA5 = AIVA7;
            END
        if (TARIFA = 8) then
            BEGIN
            BASE5 = ABASE8;
            IVA5 = AIVA8;
            END
        END
    if (orden = 6) then
        BEGIN
        if (TARIFA = 1) then
            BEGIN
            BASE6 = ABASE1;
            IVA6 = AIVA1;
            END
        if (TARIFA = 2) then
            BEGIN
            BASE6 = ABASE2;
            IVA6 = AIVA2;
            END
        if (TARIFA = 3) then
            BEGIN
            BASE6 = ABASE3;
            IVA6 = AIVA3;
            END
        if (TARIFA = 4) then
            BEGIN
            BASE6 = ABASE4;
            IVA6 = AIVA4;
            END
        if (TARIFA = 5) then
            BEGIN
            BASE6 = ABASE5;
            IVA6 = AIVA5;
            END
        if (TARIFA = 6) then
            BEGIN
            BASE6 = ABASE6;
            IVA6 = AIVA6;
            END
        if (TARIFA = 7) then
            BEGIN
            BASE6 = ABASE7;
            IVA6 = AIVA7;
            END
        if (TARIFA = 8) then
            BEGIN
            BASE6 = ABASE8;
            IVA6 = AIVA8;
            END
        END
    if (orden = 7) then
        BEGIN
        if (TARIFA = 1) then
            BEGIN
            BASE7 = ABASE1;
            IVA7 = AIVA1;
            END
        if (TARIFA = 2) then
            BEGIN
            BASE7 = ABASE2;
            IVA7 = AIVA2;
            END
        if (TARIFA = 3) then
            BEGIN
            BASE7 = ABASE3;
            IVA7 = AIVA3;
            END
        if (TARIFA = 4) then
            BEGIN
            BASE7 = ABASE4;
            IVA7 = AIVA4;
            END
        if (TARIFA = 5) then
            BEGIN
            BASE7 = ABASE5;
            IVA7 = AIVA5;
            END
        if (TARIFA = 6) then
            BEGIN
            BASE7 = ABASE6;
            IVA7 = AIVA6;
            END
        if (TARIFA = 7) then
            BEGIN
            BASE7 = ABASE7;
            IVA7 = AIVA7;
            END
        if (TARIFA = 8) then
            BEGIN
            BASE7 = ABASE8;
            IVA7 = AIVA8;
            END
        END
    if (orden = 8) then
        BEGIN
        if (TARIFA = 1) then
            BEGIN
            BASE8 = ABASE1;
            IVA8 = AIVA1;
            END
        if (TARIFA = 2) then
            BEGIN
            BASE8 = ABASE2;
            IVA8 = AIVA2;
            END
        if (TARIFA = 3) then
            BEGIN
            BASE8 = ABASE3;
            IVA8 = AIVA3;
            END
        if (TARIFA = 4) then
            BEGIN
            BASE8 = ABASE4;
            IVA8 = AIVA4;
            END
        if (TARIFA = 5) then
            BEGIN
            BASE8 = ABASE5;
            IVA8 = AIVA5;
            END
        if (TARIFA = 6) then
            BEGIN
            BASE8 = ABASE6;
            IVA8 = AIVA6;
            END
        if (TARIFA = 7) then
            BEGIN
            BASE8 = ABASE7;
            IVA8 = AIVA7;
            END
        if (TARIFA = 8) then
            BEGIN
            BASE8 = ABASE8;
            IVA8 = AIVA8;
            END
        END
    END
suspend;
end^


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


ALTER PROCEDURE ORDENES_ARTICULO_FECHA (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECORD DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECLLEGA DATE,
    PROVEEDOR VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
declare variable FACT NUMERIC(18,4);
declare variable ORDENC NUMERIC(18,4);
BEGIN
TIPO = 13;
  /* MUESTRA LOS TRASLADOS POR CONFIRMAR */
  FOR SELECT T.tran_id, T.tran_fecha, PREF_PRE, T.tran_numero, T.tran_fecha, T.terc_nit, TD.tras_cant, TD.tras_unidad
    FROM trasferencias T, trasferencias_detalle TD
    WHERE T.tran_id = TD.tran_id AND TD.ARTI_COD = :ARTICULO AND TD.TRAS_ANULADO = 'N' AND TD.tras_confirma = 'N'
    INTO :ID, :FECORD, :PREFIJO, :NUMERO, :FECLLEGA, :PROVEEDOR, :CANTIDAD, :UNIDAD
    DO
    BEGIN
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :proveedor INTO :proveedor;
    SUSPEND;
    END
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^


ALTER PROCEDURE ORDENES_COMPRA_ARTICULO (
    CODIGO VARCHAR(20),
    FECHA DATE)
RETURNS (
    ORDENADO NUMERIC(18,2))
AS
declare variable PEDIDO numeric(18,4);
declare variable ITEM integer;
declare variable ID integer;
declare variable UND varchar(8);
declare variable CANT numeric(18,4);
declare variable FACTOR2 numeric(18,4);
begin
ORDENADO = 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, :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;
    ORDENADO = ORDENADO + PEDIDO * FACTOR2;
    end
suspend;
end^


ALTER PROCEDURE PADRE (
    CUENTA VARCHAR(20))
RETURNS (
    PADRE VARCHAR(20))
AS
DECLARE VARIABLE NIVEL SMALLINT;
DECLARE VARIABLE DIGITOS SMALLINT;
BEGIN
  PADRE = '';
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
  IF (NIVEL > 1) THEN
    BEGIN
    NIVEL = NIVEL - 1;
    EXECUTE PROCEDURE DIGITOS_NIVEL (NIVEL) RETURNING_VALUES (:DIGITOS);
    PADRE = SUBSTR (CUENTA, 1, DIGITOS);
    END
  SUSPEND;
END^


ALTER PROCEDURE PAGO_NOMINA_XEMPL (
    ID INTEGER)
RETURNS (
    NITEMPL VARCHAR(20),
    NOMBREEMPL VARCHAR(60),
    DEVENGOS NUMERIC(18,2),
    DEDUCIBLES NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    TIPOPAGO CHAR(1))
AS
declare variable idnom integer;
begin
/*SUMA DEDUCIBLES*/
for SELECT max(nc.terc_nit), SUM(nc.noco_valor) FROM nomina_conceptos nc, consolide_nominas c
    WHERE nc.noco_deduc = 'N' AND nc.noco_pagook = 'N' and c.conn_nomid = nc.nomi_id and c.conn_id = :id
    AND NC.noco_prov = 'N' AND ((NC.noco_aporte = 'N') or ((NC.noco_aporte = 'S') AND (NC.noco_gtoempr = 'N')))
    group by nc.TERC_NIT
    INTO :nitempl, :devengos
    do
    begin
    SELECT TERC_NOM FROM TERCEROS WHERE terc_nit = :nitempl INTO :nombreempl;
    SELECT EMPL_FORMPAGO FROM EMPLEADOS WHERE TERC_NIT = :nitempl INTO :TIPOPAGO;
    if (devengos is null) then
        devengos = 0;
    /*SUMA DEVENGOS*/
    SELECT SUM(nc.noco_valor) FROM nomina_conceptos nc, consolide_nominas c
        WHERE nc.noco_deduc = 'S' AND nc.noco_pagook = 'N' and c.conn_nomid = nc.nomi_id and c.conn_id = :id
        AND NC.noco_prov = 'N' AND ((NC.noco_aporte = 'N') or ((NC.noco_aporte = 'S') AND (NC.noco_gtoempr = 'N')))
        AND TERC_NIT = :nitempl
        INTO :deducibles;
    if (deducibles is null) then
        deducibles = 0;
    total = :devengos + :deducibles;
    if (TOTAL <> 0) then
        SUSPEND;
    end
end^


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^


ALTER PROCEDURE PEDIDOS_POR_ENTREGAR (
    FECHA DATE,
    AGENCIA INTEGER)
RETURNS (
    IDDOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    CLIENTE VARCHAR(60),
    HORAREG TIME,
    ITEMS INTEGER,
    MONTO NUMERIC(18,2),
    VENDEDOR VARCHAR(60))
AS
begin
FOR SELECT PEDI_ID, F.PREF_PRE, PEDI_NUMERO, F.pedi_nomterc, PEDI_TOTAL, A.audi_hora, vend_nombre
    FROM PEDIDOS F, AUDITORIA A, VENDEDORES V, PREFIJOS P
    WHERE A.tido_cod = 34 AND A.audi_iddoc = F.pedi_id AND A.audi_oper = 'I' AND F.pedi_anulado = 'N' AND F.pedi_fecha = :FECHA
    AND P.tido_cod = 34 AND P.pref_pre = F.pref_pre AND ((P.SUCU_ID = :AGENCIA) or (:AGENCIA = 0))
    AND (NOT EXISTS (SELECT COFA_ID FROM consolidado_faltantes WHERE COFA_TIPOORI = 34 AND COFA_IDORI = F.pedi_id and COFA_CANTCR <> 0))
    AND F.vend_cod = V.vend_cod
    INTO :IDDOC, :PREF, :NUMERO, :CLIENTE, :MONTO, :HORAREG, :vendedor
    DO
    BEGIN
    SELECT COUNT(PEDE_ITEM) FROM PEDIDOS_DETALLE WHERE PEDI_ID = :IDDOC INTO :ITEMS;
    suspend;
    END
end^


ALTER PROCEDURE PEDIDOS_WEB_POR_CONFIRMAR (
    FECHA DATE)
RETURNS (
    IDDOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    CLIENTE VARCHAR(60),
    FECHAREG DATE,
    HORAREG TIME,
    ITEMS INTEGER,
    MONTO NUMERIC(18,2),
    VENDEDOR VARCHAR(60))
AS
declare variable VALIDEZ INTEGER;
begin
execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'DIAS DE VALIDEZ') returning_values (VALIDEZ);
FOR SELECT PEWE_ID, P.pewe_pref, P.pewe_id, P.terc_nit, P.pewe_total, vend_nombre
    FROM PEDIDO_WEB P, VENDEDORES V
    WHERE P.pewe_fecha <= :FECHA AND P.pewe_idped = 0 AND P.vend_cod = V.vend_cod
    AND P.pewe_total <> 0 AND P.pewe_total IS NOT NULL AND P.pewe_fecha >= (:FECHA-:VALIDEZ)
    INTO :IDDOC, :PREF, :NUMERO, :CLIENTE, :MONTO, :vendedor
    DO
    BEGIN
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :CLIENTE INTO :CLIENTE;
    SELECT FIRST 1 A.audi_fecha, A.audi_hora FROM AUDITORIA A WHERE A.tido_cod = 234 AND A.audi_iddoc = :IDDOC
        AND ((A.audi_oper = 'I') or (A.audi_oper = 'U')) INTO :FECHAREG, :HORAREG;
    SELECT COUNT(PEWD_ITEM) FROM pedido_web_detalle WHERE PEWE_ID = :IDDOC INTO :ITEMS;
    suspend;
    END
end^


ALTER PROCEDURE PEDIDOS_X_ORDENAR (
    FECHA DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VALIDEZ INTEGER,
    VEND INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    SUCUR VARCHAR(10))
AS
declare variable VENCE date;
declare variable ITEM integer;
declare variable FALTA numeric(18,4);
declare variable FALTAT numeric(18,4);
declare variable UNIDAD varchar(8);
declare variable FACTOR numeric(18,4);
declare variable DIAS integer;
declare variable usado char(2);
declare variable NUMROWS integer;
declare variable TRAERCONTADO char(2);
declare variable CONSOL integer;
declare variable TIPOORI integer;
declare variable OK char(1);
declare variable ITECAN numeric(18,2);
declare variable ITESUB numeric(18,2);
declare variable ITEIVA numeric(18,2);
declare variable ITECON numeric(18,2);
begin
execute procedure lee_configuracion('FACTURACION','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'TRAER DOCUMENTOS PENDIENTES DEL CLIENTE DE CONTADO EN DOCUMENTOS DE OTROS CLIENTES') returning_values (TRAERCONTADO);

    begin
    for select PEDI_ID, F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_SUCURSAL, VEND_COD
        from PEDIDOS F, PREFIJOS P
        where PEDI_FECHA <= :FECHA and PEDI_VENCE >= :FECHA and PEDI_ANULADO = 'N'
        AND F.pref_pre = P.pref_pre AND P.tido_cod = 34 AND ((:SUBEMPRESA = 0) or (P.sucu_id = :subempresa))
        into :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND do
        begin
        execute procedure TOTAL_DOC_VENTAS(34, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        /* 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 <> 23 into :NUMROWS;
        else
            NUMROWS = 0;
        if (NUMROWS = 0) then
            begin
            SUBTOTAL = 0;
            IVA = 0;
            CONSUMO = 0;
            for select PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, PEDE_TOTAL, PEDE_IVAMONTO, PEDE_CONSUMO
                from PEDIDOS_DETALLE where PEDI_ID = :ID order by PEDE_ITEM into :ITEM, :ITECAN, :ITESUB, :ITEIVA, :ITECON
                do
                begin
                execute procedure FALTANTE(34, 23, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                FALTAT = FALTAT + FALTA;
                if (ITECAN <> 0) then
                    begin
                    SUBTOTAL = SUBTOTAL + cast(cast((ITESUB/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                    IVA = IVA + ((ITEIVA/ITECAN) * (FALTA * FACTOR));
                    CONSUMO = CONSUMO + ((ITECON/ITECAN) * (FALTA * FACTOR));
                    end
                end
            end
        if (FALTAT <> 0) then
            suspend;
        end
    end
end^


ALTER PROCEDURE PENDIENTES_X_CLIENTE (
    NIT VARCHAR(20),
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECDOC DATE,
    ITEM INTEGER,
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8))
AS
BEGIN
FOR SELECT P.PEND_ID, PREF_PRE, PEND_NUMERO, PEND_FECHA, d.pevd_item, d.arti_cod, d.pevd_desc, d.pevd_cant, d.pevd_unidad
    FROM pendiente_ventas P, pendiente_ventas_detalle D
        WHERE (TERC_NIT = :NIT) AND PEND_FECHA <= :FECHA AND PEND_ANULADO = 'N' AND PEND_SUCURSAL = :SUCURSAL
        AND ((D.pevd_idfact = 0) or (d.pevd_idfact is null)) and p.pend_id = d.pend_id
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :item, :articulo, :descripcion, :cant, :unidad
        DO
        BEGIN
        SUSPEND;
        END
END^


ALTER PROCEDURE PERFILES_EMPLEADO
RETURNS (
    PERFIL INTEGER,
    NOMBRE VARCHAR(60),
    CODCONC INTEGER,
    NOMCONC VARCHAR(60))
AS
begin
FOR SELECT P.peem_id, P.peem_nombre, D.conc_cod FROM PERFIL_EMPLEADO P, PERFIL_EMPLEADO_DETALLE D
    WHERE P.peem_id = D.peem_id INTO :PERFIL, :NOMBRE, :codconc
    DO
    BEGIN
    SELECT CONC_NOMBRE FROM CONCEPTOS_NOMINA WHERE CONC_COD = :codconc INTO :nomconc;
    suspend;
    END
end^


ALTER 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 (PERIODO = 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^


ALTER PROCEDURE PERIODO_NOM_FECHAF (
    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;
    suspend;
    END
ELSE
    if (PERIODICIDAD = 2) then
        BEGIN
        PERIODO = MES * 2;
        if (DIA <= 15) then
            PERIODO = PERIODO - 1;
        suspend;
        END
    ELSE
        if (PERIODICIDAD = 3) then
            BEGIN
            PERIODO = MES * 4;
            if (DIA <= 7) then
                PERIODO = PERIODO - 3;
            if (DIA <= 15) then
                PERIODO = PERIODO - 2;
            if (DIA <= 21) then
                PERIODO = PERIODO - 1;
            suspend;
            END
end^


ALTER PROCEDURE PLANILLA_NOMINA_HORAS (
    ID INTEGER)
RETURNS (
    NITDETALLE VARCHAR(20),
    NOMEMPL VARCHAR(60),
    DPTO INTEGER,
    SALARIO NUMERIC(18,2),
    HORAS NUMERIC(18,2),
    TIPOHORA VARCHAR(60),
    VALOR NUMERIC(18,2))
AS
declare variable periodo integer;
declare variable ano char(4) character set none;
declare variable DIUR NUMERIC(18,2);
declare variable FDIA NUMERIC(18,2);
declare variable NOCT NUMERIC(18,2);
declare variable FNOC NUMERIC(18,2);
declare variable RNOC NUMERIC(18,2);
declare variable RFES NUMERIC(18,2);
declare variable RFNOC NUMERIC(18,2);
declare variable DOMIN NUMERIC(18,2);
declare variable MDIUR NUMERIC(18,2);
declare variable MFDIA NUMERIC(18,2);
declare variable MNOCT NUMERIC(18,2);
declare variable MFNOC NUMERIC(18,2);
declare variable MRNOC NUMERIC(18,2);
declare variable MRFES NUMERIC(18,2);
declare variable MRFNOC NUMERIC(18,2);
declare variable MDOMI NUMERIC(18,2);
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, e.empl_dpto from terceros t, empleados e where t.terc_nit = e.terc_nit and t.terc_nit = :nitdetalle into :nomempl, :dpto;
    select max(V.noex_salbase), sum(V.noex_diur), sum(V.noex_fdiur), sum(V.noex_noct), sum(V.noex_fnoct), sum(V.noex_recnoct), sum(V.noex_recfest), sum(V.noex_recfnoc), sum(V.noex_domin),
        sum(v.noex_mdiur), sum(v.noex_mfdiur), sum(v.noex_mnoct), sum(v.noex_mfnoct), sum(v.noex_mrecnoct), sum(v.noex_mrecfest), sum(V.noex_mrecfnoc), sum(V.noex_mdomin)
        from nomina_horasext V WHERE V.noex_periodio = :periodo AND V.noex_ano = :ano and V.terc_nit = :nitdetalle
        INTO :salario, :diur, :fdia, :noct, :fnoc, :rnoc, :rfes, :rfnoc, :domin,
        :mdiur, :mfdia, :mnoct, :mfnoc, :mrnoc, :mrfes, :mrfnoc, :mdomi;
    if (noct <> 0) then
        BEGIN
        TIPOHORA = 'H.E. Nocturnas';
        HORAS = noct;
        VALOR = mnoct;
        SUSPEND;
        END
    if (diur <> 0) then
        BEGIN
        TIPOHORA = 'H.E. Diurnas';
        HORAS = DIUR;
        VALOR = mdiur;
        SUSPEND;
        END
    if (fdia <> 0) then
        BEGIN
        TIPOHORA = 'H.E. Festivas diurnas';
        HORAS = fdia;
        VALOR = mfdia;
        SUSPEND;
        END
    if (fnoc <> 0) then
        BEGIN
        TIPOHORA = 'H.E. Festivas nocturnas';
        HORAS = fnoc;
        VALOR = mfnoc;
        SUSPEND;
        END
    if (rnoc <> 0) then
        BEGIN
        TIPOHORA = 'Recargo Nocturno';
        HORAS = rnoc;
        VALOR = mrnoc;
        SUSPEND;
        END
    if (rfes <> 0) then
        BEGIN
        TIPOHORA = 'Recargo festivo';
        HORAS = rfes;
        VALOR = mrfes;
        SUSPEND;
        END
    if (rfnoc <> 0) then
        BEGIN
        TIPOHORA = 'Recargo festivo noct.';
        HORAS = rfnoc;
        VALOR = mrfnoc;
        SUSPEND;
        END
    if (domin <> 0) then
        BEGIN
        TIPOHORA = 'Dominical';
        HORAS = domin;
        VALOR = mdomi;
        SUSPEND;
        END
    END
end^


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),
    NOVFECHA DATE,
    DPTO INTEGER,
    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, e.empl_dpto from terceros t, empleados e where t.terc_nit = e.terc_nit and t.terc_nit = :nitdetalle into :nomempl, :dpto;
    FOR select V.nono_diaini, V.nono_dura, V.nono_valor, V.nono_tipoadm, V.nono_nvaadm, TN.tnov_nombre, v.nono_fecha
        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, :novfecha
        DO
        SUSPEND;
    END
end^


ALTER PROCEDURE PORCENTAJE (
    UTILIDAD NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    CERO CHAR(1))
RETURNS (
    PORC NUMERIC(9,2))
AS
declare variable PORCAUX NUMERIC(18,2);
begin
if (PRECIO <> 0) then
    BEGIN
    PORCAUX = UTILIDAD * 100 / PRECIO;
    if (ABS(PORCAUX) > 9999) then
        if (PORCAUX > 0) then
            PORC = 9999.99;
        else
            PORC = -9999.99;
    else
        PORC = PORCAUX;
    END
ELSE
    if (CERO = 'S') then
        PORC = 0;
    ELSE
        PORC = 100;
suspend;
end^


ALTER PROCEDURE POS (
    SUBSTR1 VARCHAR(100),
    STR VARCHAR(100))
RETURNS (
    POS INTEGER)
AS
DECLARE VARIABLE SUBSTR2 VARCHAR(201); /* 1 + SubStr-lenght + Str-length */
DECLARE VARIABLE TMP VARCHAR(100);
BEGIN
IF (SUBSTR1 IS NULL OR STR IS NULL) THEN
    BEGIN
    POS = NULL;
    EXIT;
    END

SUBSTR2 = SUBSTR1 || '%';
TMP = '';
POS = 1;
WHILE (STR NOT LIKE SUBSTR2 AND STR NOT LIKE TMP) DO
    BEGIN
    SUBSTR2 = '_' || SUBSTR2;
    TMP = TMP || '_';
    POS = POS + 1;
    END

IF (STR LIKE TMP) THEN POS = 0;
SUSPEND;
END^


ALTER PROCEDURE PRECIO_CANTIDAD (
    ARTICULO VARCHAR(20),
    LISTA INTEGER,
    VEND INTEGER,
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8))
RETURNS (
    FIJO NUMERIC(18,2),
    CANTMIN NUMERIC(18,4))
AS
declare variable factor numeric(18,2);
declare variable escalas varchar(2);
declare variable lf integer;
declare variable AGENCIA INTEGER;
declare variable VALCANT CHAR(2);
begin
SELECT SUCU_ID FROM VENDEDORES WHERE VEND_COD = :vend INTO :agencia;
execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'TRAER PRECIO MINIMO SEGUN CANTIDAD') returning_values (:escalas);
execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'LISTA DE PRECIOS FIJOS SIN TENER EN CUENTA LA CANTIDAD') returning_values (:lf);
if ((escalas = 'SI') and (LF <> LISTA)) then
    BEGIN
    EXECUTE procedure factor_unidad_cant (:articulo,  :UNIDAD) returning_values (FACTOR);
    select min(prar_fijo) PRAR_FIJO, MIN(PRAR_CANTMIN) PRAR_CANTMIN from precios_articulo p, lista_precios l
        where l.lipr_cod = p.lipr_cod and arti_cod = :articulo and prar_fijo <> 0 and prar_cantmin >= 0.01 and
        prar_cantmin <= (:CANT * :FACTOR) and ((l.sucu_id = :AGENCIA) or (l.sucu_id = 0)) and p.lipr_cod <> :LF
        INTO :FIJO, :CANTMIN;
    END
ELSE
    BEGIN
    SELECT PRAR_FIJO, PRAR_CANTMIN FROM PRECIOS_ARTICULO P WHERE P.ARTI_COD = :articulo and lipr_cod = :lista
        into :fijo, :CANTMIN;
    execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'VERIFICAR CANTIDAD MINIMA EN PRECIOS SIN TRAER PRECIO MINIMO') returning_values (VALCANT);
    if ((VALCANT = 'SI') AND (CANTMIN > CANT)) then
        FIJO = 0;
    END
EXECUTE procedure FACTOR_UNIDAD_PRE (:articulo,  :UNIDAD) returning_values (FACTOR);
FIJO = FIJO * FACTOR;
SUSPEND;
end^


ALTER PROCEDURE PRECIO_UNIDAD (
    ARTICULO VARCHAR(20),
    LISTA INTEGER,
    UNIDAD VARCHAR(8))
RETURNS (
    FIJO NUMERIC(18,2))
AS
declare variable factor numeric(18,2);
begin
EXECUTE procedure FACTOR_UNIDAD_PRE (:articulo,  :UNIDAD) returning_values (FACTOR);
SELECT PRAR_FIJO FROM PRECIOS_ARTICULO P WHERE P.ARTI_COD = :articulo and lipr_cod = :lista into :fijo;
FIJO = FIJO * FACTOR;
SUSPEND;
end^


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),
    DIG INTEGER,
    COMIPORC NUMERIC(9,2),
    CANTMIN NUMERIC(18,4),
    SUBEMPRESA INTEGER)
AS
DECLARE VARIABLE FACTOR NUMERIC(18,4);
declare variable IVAINC CHAR(1);
declare variable AGENCIA INTEGER;
declare variable PORAG CHAR(2);
declare variable PORUS CHAR(2);
declare variable consumo numeric(18,2);
declare variable consumop numeric(18,2);
BEGIN
SELECT SUCU_ID FROM usuario WHERE USER_COD = USER INTO :AGENCIA;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR USUARIO') returning_values (:PORUS);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR AGENCIA') returning_values (:PORAG);
FOR SELECT P.LIPR_COD, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, PRAR_AUTO, PRAR_COMI, PRAR_CANTMIN, sucu_id, LIPR_MODIF, TAIV_PORC,
    PRAR_REDON, A.arti_consumo, P.prar_consumo
    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)
    AND ((:PORAG = 'NO') or (L.sucu_id = :AGENCIA) or (L.sucu_id = 0) or (:AGENCIA = 0))
    INTO :LISTA, :PRECIOT, :RENTA, :UTIL, :AUTOM, :COMIPORC, :CANTMIN, :SUBEMPRESA, :IVAINC, :IVAPORC,
    :DIG, :CONSUMO, :CONSUMOP
    DO
    BEGIN
    EXECUTE PROCEDURE FACTOR_UNIDAD_PRE (:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    PRECIOT = PRECIOT * FACTOR;
    if (CONSUMO IS NULL) then
        CONSUMO = 0;
    if (CONSUMOP IS NULL) then
        CONSUMOP = 0;
    if (CONSUMO <> 0) then
        if (CONSUMOP = 0) then
            CONSUMOP = CONSUMO;
    if (IVAINC = 'S') then
        BEGIN
        IVAMONTO = (PRECIOT - CONSUMOP) / (100 + IVAPORC) * IVAPORC;
        preciob = PRECIOT - IVAMONTO;
        END
    ELSE
        BEGIN
        PRECIOB = PRECIOT;
        IVAMONTO = (PRECIOB-CONSUMOP) * IVAPORC / 100;
        PRECIOT = PRECIOB + IVAMONTO;
        END
    if ((PORUS = 'NO') or (EXISTS (SELECT LIPR_COD FROM listapre_usuarios WHERE LIPR_COD = :LISTA AND USER_COD = USER))) then
        SUSPEND;
    END
END^


ALTER PROCEDURE PRECIOS_WEB (
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    LISTA INTEGER,
    PRECIO NUMERIC(18,2),
    AGENCIA INTEGER,
    CANTMIN NUMERIC(18,2))
AS
declare variable FECAUD DATE;
declare variable HORAUD TIME;
begin
FOR SELECT P.lipr_cod, P.arti_cod, P.prar_fijo, P.prar_cantmin, L.sucu_id FROM PRECIOS_ARTICULO P, LISTA_PRECIOS L
    WHERE L.lipr_cod = P.lipr_cod ORDER BY ARTI_COD, P.LIPR_COD
    INTO :LISTA, :articulo,  :precio,  :CANTMIN, :AGENCIA
    DO
    BEGIN
    SELECT FIRST 1 AUDI_FECHA, AUDI_HORA FROM AUDITORIA
        WHERE AUDI_COD = :articulo AND (TIDO_COD = 126) and audi_iddoc = :lista
        ORDER BY AUDI_ID DESC
        INTO :FECAUD, :HORAUD;
    if ((FECAUD >= fecha) or (FECHA < '2016/01/01'))  then
        suspend;
    END
end^


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^


ALTER PROCEDURE PRESTAMOS_EMPLEADO (
    TERC_NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    PRNO_ID INTEGER,
    PRNO_FECHA DATE,
    PRNO_CONC VARCHAR(60),
    PRNO_MONTO NUMERIC(18,2),
    PRNO_CUOTAS INTEGER,
    SALDO NUMERIC(18,2))
AS
begin
FOR SELECT P.prno_id, P.prno_fecha, p.prno_conc, P.prno_monto, P.prno_cuotas
    FROM PRESTAMO_NOMINA P
    WHERE P.terc_nit = :terc_nit AND P.prno_fecha <= :FECHA
    ORDER BY PRNO_FECHA DESC, PRNO_ID DESC
    INTO prno_id, :prno_fecha, :PRNO_CONC, :prno_monto, :prno_cuotas
    DO
    BEGIN
    execute procedure saldo_prestamo(:prno_id) returning_values (:SALDO);
    suspend;
    END
end^


ALTER PROCEDURE PRESTAMOS_NOMINA
RETURNS (
    PRNO_ID INTEGER,
    TERC_NIT VARCHAR(20),
    PRNO_FECHA DATE,
    PRNO_CONC VARCHAR(60),
    PRNO_PAGOID INTEGER,
    PRNO_MONTO NUMERIC(18,2),
    PRNO_CUOTAS INTEGER,
    PRNO_INTCES NUMERIC(9,4),
    TERC_NOM VARCHAR(60),
    EGRESO VARCHAR(10),
    SALDO NUMERIC(18,2))
AS
declare variable CONCE VARCHAR(60);
begin
FOR SELECT P.prno_id, P.terc_nit, P.prno_fecha, P.prno_pagoid, p.prno_conc, P.prno_monto, P.prno_cuotas, P.prno_intces, T.terc_nom
    FROM PRESTAMO_NOMINA P, TERCEROS T
    WHERE P.terc_nit = T.terc_nit ORDER BY PRNO_FECHA DESC, PRNO_ID DESC
    INTO prno_id, :terc_nit, :prno_fecha, :prno_pagoid, :PRNO_CONC, :prno_monto, :prno_cuotas, :prno_intces, :terc_nom
    DO
    BEGIN
    if (PRNO_PAGOID <> 0) then
        SELECT PREF_PRE || EGRE_NUMERO, EGRE_CONC FROM EGRESOS WHERE EGRE_ID = :PRNO_PAGOID INTO :EGRESO, :CONCE;
    ELSE
        EGRESO = '';
    if ((PRNO_CONC = '') or (prno_conc is null)) then
        PRNO_CONC = CONCE;
    execute procedure saldo_prestamo(:prno_id) returning_values (:SALDO);
    suspend;
    END
end^


ALTER PROCEDURE PRESTAMOS_PENDIENTES (
    EMPLEADO VARCHAR(20),
    FECHA DATE)
RETURNS (
    ID INTEGER,
    CONCEPTO VARCHAR(60),
    FECPRES DATE,
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2))
AS
begin
FOR SELECT N.prno_id, N.prno_conc, N.prno_fecha, N.prno_monto FROM prestamo_cuotas C, prestamo_nomina N
    WHERE N.prno_id = C.prno_id AND N.terc_nit = :EMPLEADO AND C.prcu_ok = 'N' AND (C.prcu_monto-C.prcu_abono) > 0
    AND N.prno_fecha <= :FECHA
    order by N.prno_fecha, N.prno_id
    INTO :ID, :CONCEPTO, :FECPRES, :MONTO
    DO
    BEGIN
    execute procedure saldo_prestamo(:id) returning_values (:SALDO);
    if (SALDO <> 0) then
        suspend;
    END
end^


ALTER PROCEDURE PRESUPUESTO_MES (
    PERIODO INTEGER,
    ANO CHAR(4),
    CUENINI VARCHAR(20),
    CUENFIN VARCHAR(20))
RETURNS (
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60),
    PRDEBITO NUMERIC(18,2),
    PRCREDITO NUMERIC(18,2),
    APDEBITO NUMERIC(18,2),
    APCREDITO NUMERIC(18,2),
    MVDEBITO NUMERIC(18,2),
    MVCREDITO NUMERIC(18,2),
    AMDEBITO NUMERIC(18,2),
    AMCREDITO NUMERIC(18,2),
    DIFERENCIAM NUMERIC(18,2),
    DIFERENCIAA NUMERIC(18,2),
    PORCENTAJEM NUMERIC(9,2),
    PORCENTAJEA NUMERIC(9,2))
AS
BEGIN
  /* POR CADA CUENTA AFECTABLE CALCULE PRESUP Y MOV. */
  FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD >= :CUENINI AND CUEN_COD <= :CUENFIN
      order by cuen_cod INTO :CUENTA, :NOMCUENTA
    DO
    BEGIN
    /* CALCULE EL PRESUPUESTO */
    PRDEBITO = 0;
    PRCREDITO = 0;
    SELECT PRES_DEBITO, PRES_CREDITO FROM PRESUPUESTO
        WHERE CUEN_COD = :CUENTA AND PRES_PERIODO = :PERIODO AND PRES_ANO = :ANO
        INTO :PRDEBITO, :PRCREDITO;
    SELECT SUM(PRES_DEBITO), SUM(PRES_CREDITO) FROM PRESUPUESTO
        WHERE CUEN_COD = :CUENTA AND PRES_PERIODO <= :PERIODO AND PRES_ANO = :ANO
        INTO :APDEBITO, :APCREDITO;
    if (PRDEBITO IS NULL) then
        PRDEBITO = 0;
    if (PRCREDITO IS NULL) then
        PRCREDITO = 0;
    if (APDEBITO IS NULL) then
        APDEBITO = 0;
    if (APCREDITO IS NULL) then
        APCREDITO = 0;
    /* CALCULE EL MOVIMIENTO */
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(:CUENTA, :ANO, :PERIODO, 'S') returning_values (:MVDEBITO);
    EXECUTE PROCEDURE movimiento_acum_cuenta_mes(:CUENTA, :ANO, :PERIODO, 'S') returning_values (:AMDEBITO);
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(:CUENTA, :ANO, :PERIODO, 'N') returning_values (:MVCREDITO);
    EXECUTE PROCEDURE movimiento_acum_cuenta_mes(:CUENTA, :ANO, :PERIODO, 'N') returning_values (:AMCREDITO);

    DIFERENCIAM = (PRDEBITO - MVDEBITO) - (PRCREDITO - MVCREDITO);
    if ((PRDEBITO - PRCREDITO) <> 0) then
        PORCENTAJEM = 100 - (DIFERENCIAM * 100 / (PRDEBITO - PRCREDITO));
    ELSE
        PORCENTAJEM = 0;
    DIFERENCIAA = (APDEBITO - AMDEBITO) - (APCREDITO - AMCREDITO);
    if ((APDEBITO - APCREDITO) <> 0) then
        PORCENTAJEA = 100 - (DIFERENCIAA * 100 / (APDEBITO - APCREDITO));
    ELSE
        PORCENTAJEA = 0;
    if ((PRDEBITO <> 0) or (PRCREDITO <> 0) or (MVDEBITO <> 0) or (MVCREDITO <> 0) OR
        (APDEBITO <> 0) or (APCREDITO <> 0) or (AMDEBITO <> 0) or (AMCREDITO <> 0))  then
        SUSPEND;
    END
END^


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

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

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


ALTER PROCEDURE PROMEDIO_PRODUCCION_ARTICULO (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    PROMEDIO NUMERIC(18,4),
    SALIDAS NUMERIC(18,4))
AS
declare variable FECINI DATE;
declare variable DIASC VARCHAR(255);
declare variable DIASEMANA VARCHAR(2);
declare variable DIASEM INTEGER;
declare variable DIAS INTEGER;
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable INCSALI VARCHAR(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', 'ENSAMBLES', 'PRODUCCION SUGERIDA POR PROMEDIO POR DIA DE LA SEMANA') returning_values (DIASEMANA);
  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 (diasemana = 'SI') then
    begin
    DIASEM = EXTRACT(DAY FROM FECHA);
    DIAS = DIAS / 7;
    end
  if (INCSALI = 'SI') then
      BEGIN
      if (diasemana = 'SI') then
          SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
            WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13
            AND EXTRACT(DAY FROM MVAR_FECHA) = :DIASEM INTO :SALIDAS;
      else
          SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
            WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND MVAR_ENTRADA = 'N' AND MVAR_TIPODOC <> 13 INTO :SALIDAS;
      END
  else
      BEGIN
      if (diasemana = 'SI') then
          SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
            WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32) or (MVAR_TIPODOC = 15))
            AND EXTRACT(DAY FROM MVAR_FECHA) = :DIASEM INTO :SALIDAS;
      else
          SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
            WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32) or (MVAR_TIPODOC = 15)) INTO :SALIDAS;
      END
  if (SALIDAS IS NULL) then
    SALIDAS = 0;
  PROMEDIO = SALIDAS / DIAS;
  SUSPEND;
END^


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);
declare variable DIASPROM integer;
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);
  EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS QUE SE MANTIENE EL PROMEDIO DE VENTAS POR ARTICULO PARA SUGERIDO REPOSICION') returning_values (:DIASPROM);
  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;
if (diasprom <> 0) then
    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) > :DIASPROM) or (FECINI IS NULL) or (PROMEDIO IS NULL) or (:DIASPROM = 0) ) 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
  if (:DIASPROM <> 0) then
    BEGIN
    DELETE FROM PROMEDIO_SALIDAS WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND PRSA_FECHA = :FECHA;
    INSERT INTO promedio_salidas (ARTI_COD, BODE_COD, PRSA_FECHA, PRSA_PROMEDIO)
      VALUES (:articulo, :bodega, :fecha, :promedio);
    END
  END
else
    SALIDAS = PROMEDIO * DIAS;
SUSPEND;
END^


ALTER PROCEDURE PROMEDIO_TOTAL_ARTICULO (
    ARTICULO VARCHAR(15),
    FECHA DATE)
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);
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);
  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 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 MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECHA AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32)) INTO :SALIDAS;
  if (SALIDAS IS NULL) then
    SALIDAS = 0;
  PROMEDIO = SALIDAS / DIAS;
  SUSPEND;
END^


ALTER PROCEDURE PROVEEDORES_SIN_REGISTRO (
    ZONA VARCHAR(2))
RETURNS (
    NIT VARCHAR(20))
AS
DECLARE VARIABLE CTAP VARCHAR(20);
DECLARE VARIABLE CTARF VARCHAR(20);
DECLARE VARIABLE CTARV VARCHAR(20);
DECLARE VARIABLE CTARC VARCHAR(20);
begin
FOR SELECT TERC_NIT, TERC_CTAPROV, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA FROM TERCEROS 
  WHERE TERC_PROV = 'S' AND TERC_NIT NOT IN (SELECT TERC_NIT FROM PROVEEDORES) INTO :NIT, :CTAP, :CTARF, :CTARV, :CTARC
    DO
    BEGIN
    INSERT INTO PROVEEDORES (TERC_NIT, PROV_COD, GRPR_COD, PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_SIMPLIFICADO)
        VALUES (:NIT, :NIT, :ZONA, :CTAP, :CTARF, :CTARV, :CTARC, 'N');
    suspend;
    END
end^


ALTER PROCEDURE PUNTOS_DOCUMENTO (
    TIPO INTEGER,
    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;
begin
if (IDDOC <> 0) then
    begin
    select count(ptcl_id) from puntos_cliente where ptcl_nit = :cliente and ptcl_tipodoc = :tipo 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 = :tipo and ptcl_iddoc = :iddoc into :ptdoc;
        end
    else
        ptdoc = 0;
    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
    begin
    select ptcl_saldo + ptcl_db - ptcl_cr from puntos_cliente where ptcl_nit = :cliente 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 = :cliente 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 = :cliente and ptcl_fecha = :fecaux into :ptvencer;
    end
else
    ptvencer = 0;
suspend;
end^


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(12),
    MONDOC NUMERIC(18,2),
    FECREC DATE,
    NUMREC VARCHAR(10),
    MONREC NUMERIC(18,2),
    BASE NUMERIC(18,2),
    COMI CHAR(2),
    PORC NUMERIC(18,2),
    DB NUMERIC(18,2),
    CR NUMERIC(18,2))
AS
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable FACTORD NUMERIC(18,4);
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;
    if (:tipo = 31) then
        select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = :id and fact_total <> 0
            into :factord;
    if (:tipo = 41) then
        select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = :id and ndcl_monto <> 0
            into :factord;
    if (:tipo = 33) then
        select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = :id and devt_total <> 0
            into :factord;
    if (:tipo = 42) then
        select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = :id and nccl_monto <> 0
            into :factord;
    BASE = MONREC * FACTORD;
    SELECT COPU_FACTOR FROM comisiones_puntos WHERE COPU_COD = :comi into :PORC;
    suspend;
    END
end^


ALTER PROCEDURE RANGO_CLIENTES (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    NOMINI VARCHAR(60),
    NOMFIN VARCHAR(60),
    VENINI INTEGER,
    VENFIN INTEGER,
    COBINI INTEGER,
    COBFIN INTEGER,
    ZONINI VARCHAR(2),
    ZONFIN VARCHAR(2),
    CIUINI VARCHAR(5),
    CIUFIN VARCHAR(5),
    CLAINI INTEGER,
    CLAFIN INTEGER,
    AGRINI INTEGER,
    AGRFIN INTEGER,
    TIPINI INTEGER,
    TIPFIN INTEGER,
    ULTVNT DATE,
    ULTCON DATE,
    CHECK1 CHAR(1),
    CHECK2 CHAR(1),
    CHECK3 CHAR(1),
    CHECK4 CHAR(1),
    CHECK5 CHAR(1),
    CHECK6 CHAR(1))
RETURNS (
    NIT VARCHAR(20))
AS
declare variable OK CHAR(1);
begin
FOR SELECT CRCL_NIT from crm_clientes WHERE CRCL_NIT >= :nitini AND CRCL_NIT <= :nitfin AND
    CRCL_NOM >= :nomini AND CRCL_NOM <= :nomfin AND
    (((:CIUINI = '') AND (:CIUFIN = 'zz')) or ((CIUD_COD >= :CIUINI) AND (CIUD_COD <= :CIUFIN))) AND
    (((:ZONINI = '') AND (:ZONFIN = 'zz')) or ((ZONA_COD >= :ZONINI) AND (ZONA_COD <= :CIUFIN))) AND
    (((:VENINI = '') AND (:VENFIN = '99999')) or ((VEND_COD >= :VENINI) AND (VEND_COD <= :VENFIN))) AND
    (((:COBINI = '') AND (:COBFIN = '99999')) or ((COBR_COD >= :COBINI) AND (COBR_COD <= :COBFIN))) AND
    (((:TIPINI = '') AND (:TIPFIN = '99999')) or ((CRCL_TIPORELA >= :TIPINI) AND (CRCL_TIPORELA <= :TIPFIN))) AND
    (((:CLAINI = '') AND (:CLAFIN = '99999')) or ((CRCL_CLASE >= :CLAINI) AND (CRCL_CLASE <= :CLAFIN))) AND
    (((:AGRINI = '') AND (:AGRFIN = '99999')) or ((CRCL_AGRUPA >= :AGRINI) AND (CRCL_AGRUPA <= :AGRFIN))) AND
    ((:CHECK1 = 'N') or (CRCL_CHECK1 = 'S')) AND ((:CHECK2 = 'N') or (CRCL_CHECK2 = 'S')) AND
    ((:CHECK3 = 'N') or (CRCL_CHECK3 = 'S')) AND ((:CHECK4 = 'N') or (CRCL_CHECK4 = 'S')) AND
    ((:CHECK5 = 'N') or (CRCL_CHECK5 = 'S')) AND ((:CHECK6 = 'N') or (CRCL_CHECK6 = 'S'))
    INTO :NIT
    DO
    begin
    OK = 'S';
    if (ultvnt <> '9999/12/31') then
        BEGIN
        if (EXISTS (SELECT FACT_ID FROM FACTURAS WHERE TERC_NIT = :NIT AND FACT_FECHA >= :ultvnt)) then
            OK = 'N';
        END
    if (ultcon <> '9999/12/31') then
        BEGIN
        if (EXISTS (SELECT CREV_ID FROM crm_eventos WHERE CRCL_NIT = :NIT AND CREV_FECHA >= :ultcon)) then
            OK = 'N';
        END
    if (OK = 'S') then
        suspend;
    end
end^


ALTER PROCEDURE RECALCULA_APERTURA_NIIF
AS
declare variable apnd_ctaniif varchar(20);
declare variable terc_nit varchar(20);
declare variable proy_cod varchar(4);
declare variable cent_cod varchar(4);
declare variable acti_cod varchar(20);
declare variable apnd_debito numeric(18,2);
declare variable apnd_credito numeric(18,2);
declare variable apnd_recldb numeric(18,2);
declare variable apnd_reclcr numeric(18,2);
declare variable TIPO CHAR(1);
declare variable TERC CHAR(1);
declare variable CENT CHAR(1);
begin
DELETE FROM saldos_iniciales_niif;
FOR SELECT apnd_ctaniif, terc_nit, proy_cod, cent_cod, acti_cod, apnd_debito, apnd_credito, apnd_recldb, apnd_reclcr
    FROM apertura_niif_det
    into :apnd_ctaniif, :terc_nit, :proy_cod, :cent_cod, :acti_cod, :apnd_debito, :apnd_credito, :apnd_recldb, :apnd_reclcr
    DO
    BEGIN
    if ((:apnd_ctaniif IS NOT NULL) AND (:apnd_ctaniif <> '')) then
        begin
        select cuen_tercero, cuen_centro from cuentas_niif where cuen_cod = :apnd_ctaniif
            INTO :terc, :cent;
        if (TERC = 'N') then
            EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (:TERC_NIT);
        if (CENT = 'N') then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (:PROY_COD);
            EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (:CENT_COD);
            END
        if ((:terc_nit IS NOT NULL) AND (:terc_nit <> '')) then
            BEGIN
            if ((:proy_cod IS NOT NULL) AND (:proy_cod <> '') AND (:cent_cod IS NOT NULL) AND (:cent_cod <> '')) then
                BEGIN
                select cuen_tipo from cuentas where cuen_cod = :apnd_ctaniif into :tipo;
                if (tipo = 'A') then
                    begin
                    if ((:acti_cod is not null) AND (:acti_cod <> '')) then
                        begin
                        if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = :apnd_ctaniif AND TERC_NIT = :terc_nit AND
                            PROY_COD = :proy_cod AND CENT_COD = :cent_cod AND ARTI_COD = :acti_cod)) Then
                            begin
                            update saldos_iniciales_niif s set s.sain_debito = s.sain_debito + :apnd_debito + :apnd_recldb,
                                s.sain_credito = s.sain_credito + :apnd_credito + :apnd_reclcr
                                where s.cuen_cod = :apnd_ctaniif AND TERC_NIT = :terc_nit AND
                                PROY_COD = :proy_cod AND CENT_COD = :cent_cod AND ARTI_COD = :acti_cod;
                            end
                        else
                            INSERT INTO SALDOS_INICIALES_NIIF (CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, DOCO_NUMERO, DOCO_VENCE, SAIN_DEBITO, SAIN_CREDITO, SAIN_TIPODOC)
                                VALUES (:apnd_ctaniif, :terc_nit, :proy_cod, :cent_cod, :acti_cod, NULL, NULL, :apnd_debito+:apnd_recldb, :apnd_credito+:apnd_reclcr, NULL);
                        end
                    else
                        exception articulo_no_existe 'No se indico el codigo del activo pata la cuenta NIIF ' || :apnd_ctaniif;
                    end
                else
                    begin
                    if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = :apnd_ctaniif AND TERC_NIT = :terc_nit AND
                        PROY_COD = :proy_cod AND CENT_COD = :cent_cod)) Then
                        begin
                        update saldos_iniciales_niif s set s.sain_debito = s.sain_debito + :apnd_debito + :apnd_recldb,
                            s.sain_credito = s.sain_credito + :apnd_credito + :apnd_reclcr
                            where s.cuen_cod = :apnd_ctaniif AND TERC_NIT = :terc_nit AND
                            PROY_COD = :proy_cod AND CENT_COD = :cent_cod;
                        end
                    else
                        INSERT INTO SALDOS_INICIALES_NIIF (CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, DOCO_NUMERO, DOCO_VENCE, SAIN_DEBITO, SAIN_CREDITO, SAIN_TIPODOC)
                            VALUES (:apnd_ctaniif, :terc_nit, :proy_cod, :cent_cod, null, NULL, NULL, :apnd_debito+:apnd_recldb, :apnd_credito+:apnd_reclcr, NULL);
                    end
                END
            ELSE
                exception centro_no_existe 'No se indico el centro de costos pata la cuenta NIIF ' || :apnd_ctaniif;
            END
        ELSE
            exception tercero_no_existe 'No se indico el NIT para la cuenta NIIF ' || :apnd_ctaniif;
        END
    END
end^


ALTER PROCEDURE RECALCULA_COSTO_PROV (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    ARTICULO VARCHAR(20),
    FECHA DATE,
    TRM NUMERIC(18,2))
AS
begin
FOR SELECT S.terc_nit, S.slim_fecha, S.taca_monto, SD.arti_cod FROM solicitud_importacion S, solicitud_importacion_det SD
    WHERE S.slim_id = SD.slim_id AND SLIM_FECHA >= :FECINI AND SLIM_FECHA <= :FECFIN AND S.slim_anulado = 'N'
    INTO :NIT, :FECHA, :TRM, :articulo
    DO
    BEGIN
    UPDATE proveedor_articulo P SET P.pvar_trm = :TRM
        WHERE P.terc_nit = :NIT AND P.arti_cod = :articulo AND P.pvar_fecha = :FECHA;
    suspend;
    END
FOR SELECT F.terc_nit, F.fapo_fecha, F.taca_monto, FD.arti_cod FROM factura_proforma F, factura_proforma_det FD
    WHERE F.fapo_id = FD.fapo_id AND FAPO_FECHA >= :FECINI AND FAPO_FECHA <= :FECFIN AND F.fapo_anulado = 'N'
    INTO :NIT, :FECHA, :TRM, :articulo
    DO
    BEGIN
    UPDATE proveedor_articulo P SET P.pvar_trm = :TRM
        WHERE P.terc_nit = :NIT AND P.arti_cod = :articulo AND P.pvar_fecha = :FECHA;
    suspend;
    END
end^


ALTER PROCEDURE RECALCULA_COSTOS_NIIF (
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
RETURNS (
    ARTICULO VARCHAR(20))
AS
begin
for select arti_cod from articulo where arti_cod >= :artini and arti_cod <= :artfin
    order by arti_cod into :ARTICULO
  DO
  BEGIN
  EXECUTE PROCEDURE chequeo_costos_niif(:articulo, :fecini);
  SUSPEND;
  END
end^


ALTER PROCEDURE RECALCULA_FACTURAS_FECHA (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    IVATOTAL NUMERIC(18,2),
    TOTALF NUMERIC(18,2),
    ITEM INTEGER,
    CANT NUMERIC(18,4),
    PRUNIT NUMERIC(18,2),
    DTOIT NUMERIC(18,2),
    IVAITEM NUMERIC(18,2),
    TOTALI NUMERIC(18,2))
AS
begin
FOR SELECT FACT_ID FROM FACTURAS F WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    AND EXISTS (SELECT FACT_ID FROM FACTURAS_DETALLE D WHERE FACT_ID = F.fact_id AND ((FADE_IVAPORC = 16) or (FADE_IVAPORC = 19)))
    INTO :ID
    DO
    BEGIN
    for select PREF,
    NUMERO,
    FECHA,
    IVATOTAL,
    TOTALF,
    ITEM,
    CANT,
    PRUNIT,
    DTOIT,
    IVAITEM,
    TOTALI from recalcula_iva_factura (:ID) into PREF,
    NUMERO,
    FECHA,
    IVATOTAL,
    TOTALF,
    ITEM,
    CANT,
    PRUNIT,
    DTOIT,
    IVAITEM,
    TOTALI
    do
    suspend;
    END
end^


ALTER PROCEDURE RECALCULA_FALTANTES_REMISIONES (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    IDF INTEGER,
    IDC INTEGER,
    ARTICULO VARCHAR(20),
    CANT NUMERIC(18,4),
    CANTREL NUMERIC(18,4),
    FACTOR NUMERIC(18,4))
AS
declare variable NUMROWS INTEGER;
declare variable ITEM INTEGER;
declare variable ANULADO CHAR(1);
begin
/* RECALCULE LAS EXISTENTES */
FOR SELECT REVT_ID, REVT_CONSOLIDA, REVT_ANULADO FROM remisiones_venta WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :fecfin
    INTO :IDF, :idc, :ANULADO
    DO
    BEGIN
    if (ANULADO = 'S') then
        DELETE FROM CONSOLIDADO_FALTANTES WHERE COFA_ID = :IDC;
    ELSE
        UPDATE CONSOLIDADO_FALTANTES SET COFA_CANTCR = 0 where COFA_ID = :IDC;

    FOR SELECT ARTI_COD, RVDE_CANT, RVDE_FACTOR FROM remisiones_venta_detalle WHERE REVT_ID = :IDF and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY RVDE_ITEM
        INTO :ARTICULO, :CANT, :FACTOR
        DO
        BEGIN
        SELECT COUNT(*) FROM CONSOLIDADO_FALTANTES WHERE COFA_ID = :IDC AND ARTI_COD = :articulo AND COFA_CANTCR = 0 INTO :NUMROWS;
        if (NUMROWS <> 0) then
            BEGIN
            FOR select COFA_CANT * COFA_FACTOR, COFA_ITEM FROM consolidado_faltantes WHERE COFA_ID = :IDC AND ARTI_COD = :articulo AND COFA_CANTCR = 0
                INTO :CANTREL, :ITEM
                DO
                BEGIN
                if (CANTREL <= (CANT * FACTOR)) then
                    UPDATE consolidado_faltantes SET COFA_CANTCR = COFA_CANT * COFA_FACTOR
                        WHERE COFA_ID = :IDC AND COFA_ITEM = :ITEM;
                else
                    UPDATE consolidado_faltantes SET COFA_CANT = :CANT, COFA_FACTOR = :FACTOR, COFA_CANTCR = COFA_CANT * COFA_FACTOR
                        WHERE COFA_ID = :IDC AND COFA_ITEM = :ITEM;
                suspend;
                END
            END
        END
    END
/* AGREGUE LAS QUE NO EXISTEN */
FOR SELECT REVT_ID, REVT_CONSOLIDA FROM remisiones_venta WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :fecfin
    INTO :IDF, :idc
    DO
    BEGIN
    FOR SELECT ARTI_COD, RVDE_CANT, RVDE_FACTOR FROM remisiones_venta_detalle WHERE REVT_ID = :IDF and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY RVDE_ITEM
        INTO :ARTICULO, :CANT, :FACTOR
        DO
        BEGIN
        SELECT COUNT(*) FROM CONSOLIDADO_FALTANTES WHERE COFA_ID = :IDC AND ARTI_COD = :articulo AND COFA_CANTCR = 0 INTO :NUMROWS;
        if (NUMROWS <> 0) then
            BEGIN
            FOR select COFA_CANT * COFA_FACTOR, COFA_ITEM FROM consolidado_faltantes WHERE COFA_ID = :IDC AND ARTI_COD = :articulo AND COFA_CANTCR = 0
                INTO :CANTREL, :ITEM
                DO
                BEGIN
                if (CANTREL <= (CANT * FACTOR)) then
                    UPDATE consolidado_faltantes SET COFA_CANTCR = COFA_CANT * COFA_FACTOR
                        WHERE COFA_ID = :IDC AND COFA_ITEM = :ITEM;
                else
                    UPDATE consolidado_faltantes SET COFA_CANT = :CANT, COFA_FACTOR = :FACTOR, COFA_CANTCR = COFA_CANT * COFA_FACTOR
                        WHERE COFA_ID = :IDC AND COFA_ITEM = :ITEM;
                suspend;
                END
            END
        END
    END
end^


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

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


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


ALTER PROCEDURE RECALCULA_GASTOS_IMPORTACION (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FAPO_ID INTEGER,
    FPGA_ITEM INTEGER,
    TIGI_COD INTEGER,
    TIPO CHAR(1),
    LIQUIDA CHAR(1),
    FPGA_TRM NUMERIC(18,4),
    FPGA_VALOR NUMERIC(18,4))
AS
declare variable GASTO NUMERIC(18,4);
declare variable TOTAL NUMERIC(18,4);
declare variable TOTITEM NUMERIC(18,4);
declare variable FACTOR DOUBLE PRECISION;
declare variable ITEM INTEGER;
declare variable CONTIT INTEGER;
begin
FOR SELECT FP.FAPO_ID
    FROM factura_proforma FP
    WHERE FP.fapo_fecha >= :FECINI AND FP.fapo_fecha <= :FECFIN AND FP.fapo_anulado = 'N'
    INTO :FAPO_ID
    DO
    BEGIN
    /* DESHAGALO LOS GASTOS */
    update factura_proforma_det fd
        set fd.fpde_total = (fd.fpde_cant * (fd.fpde_prunit / 100)) * (100 - fd.fpde_dtoporc),
            fd.fpde_flete = 0,
            fd.fpde_seguro = 0,
            fd.fpde_ivamonto = 0,
            fd.fpde_otrogto = 0
            where fd.fapo_id = :fapo_id;
    END
FOR SELECT FP.FAPO_ID, FPGA_ITEM, FPGA_TRM, FPGA_VALOR, tigi_cod
    FROM factura_proforma FP, factura_proforma_gastos FG
    WHERE FP.fapo_id = FG.fapo_id AND FP.fapo_fecha >= :FECINI AND FP.fapo_fecha <= :FECFIN AND FG.fpga_anulado = 'N'
    INTO :FAPO_ID, :FPGA_ITEM, :FPGA_TRM, :FPGA_VALOR, :tigi_cod
    DO
    BEGIN
    if (:fpga_trm <> 0) then
        gasto = :fpga_valor * :fpga_trm;
    /* calcule la proporcion por item ya sea por peso, volumen, cantidad o valor */
    select t.tigi_tipo, t.tigi_liquidacion from tipo_gastos_importacion t where t.tigi_cod = :tigi_cod
        into :tipo, :liquida;
    contit = 0;
    select count(fd.fpde_item) from factura_proforma_det fd where fd.fapo_id = :fapo_id into :contit;
    /* HAGALO POR EL TIPO INDICADO */
    if (liquida = 'C') then
        begin
        /* cubicaje-volumen */
        select sum(fd.fpde_volumen) from factura_proforma_det fd where fd.fapo_id = :fapo_id into :total;
        for select fd.fpde_item, fd.fpde_volumen from factura_proforma_det fd where fd.fapo_id = :fapo_id
            into :item, :totitem
            do
            begin
            if (total = 0) then
                if (contit <> 0) then
                    begin
                    total = contit;
                    totitem = 1;
                    end
            FACTOR = :totitem / :total;
            if (tipo = 'F') then
                update factura_proforma_det fd
                    set fd.fpde_flete = fpde_flete + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + (:gasto * :FACTOR) + fpde_seguro + fpde_otrogto + fpde_ivamonto
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'S') then
                update factura_proforma_det fd
                    set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + (:gasto * :FACTOR) + fpde_otrogto + fpde_ivamonto
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'I') then
                update factura_proforma_det fd
                    set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'O') then
                update factura_proforma_det fd
                    set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + (:gasto * :FACTOR) + fpde_ivamonto
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            end
        end
    if (liquida = 'P') then
        begin
        /* peso */
        select sum(fd.fpde_peso) from factura_proforma_det fd where fd.fapo_id = :fapo_id into :total;
        for select fd.fpde_item, fd.fpde_peso from factura_proforma_det fd where fd.fapo_id = :fapo_id
            into :item, :totitem
            do
            begin
            if (total = 0) then
                if (contit <> 0) then
                    begin
                    total = contit;
                    totitem = 1;
                    end
            FACTOR = :totitem / :total;
            if (tipo = 'F') then
                update factura_proforma_det fd
                    set fd.fpde_flete = fd.fpde_flete + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'S') then
                update factura_proforma_det fd
                    set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'I') then
                update factura_proforma_det fd
                    set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'O') then
                update factura_proforma_det fd
                    set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            end
        end
    if (liquida = 'T') then
        begin
        /* cantidad total */
        select sum(fd.fpde_cant * fd.fpde_factor) from factura_proforma_det fd where fd.fapo_id = :fapo_id into :total;
        for select fd.fpde_item, fd.fpde_cant * fd.fpde_factor from factura_proforma_det fd where fd.fapo_id = :fapo_id
            into :item, :totitem
            do
            begin
            if (total = 0) then
                if (contit <> 0) then
                    begin
                    total = contit;
                    totitem = 1;
                    end
            FACTOR = :totitem / :total;
            if (tipo = 'F') then
                update factura_proforma_det fd
                    set fd.fpde_flete = fd.fpde_flete + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'S') then
                update factura_proforma_det fd
                    set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'I') then
                update factura_proforma_det fd
                    set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'O') then
                update factura_proforma_det fd
                    set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            end
        end
    if (liquida = 'V') then
        begin
        /* valor */
        select sum(fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc)) from factura_proforma_det fd
            where fd.fapo_id = :fapo_id into :total;
        for select fd.fpde_item, fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc)
            from factura_proforma_det fd where fd.fapo_id = :fapo_id
            into :item, :totitem
            do
            begin
            if (total = 0) then
                if (contit <> 0) then
                    begin
                    total = contit;
                    totitem = 1;
                    end
            FACTOR = :totitem / :total;
            if (tipo = 'F') then
                update factura_proforma_det
                    set fpde_flete = fpde_flete + (:gasto * :FACTOR),
                        fpde_total = fpde_cant * (fpde_prunit / 100) * (100 - fpde_dtoporc) + fpde_flete + (:gasto * :FACTOR) + fpde_seguro + fpde_otrogto + fpde_ivamonto
                where fapo_id = :fapo_id and fpde_item = :item;
            if (tipo = 'S') then
                update factura_proforma_det fd
                    set fd.fpde_seguro = fd.fpde_seguro + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'I') then
                update factura_proforma_det fd
                    set fd.fpde_ivamonto = fd.fpde_ivamonto + (:gasto * :FACTOR),
                        fd.fpde_total = fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            if (tipo = 'O') then
                update factura_proforma_det fd
                    set fd.fpde_otrogto = fd.fpde_otrogto + (:gasto * :FACTOR),
                        fd.fpde_total = (fd.fpde_cant * (fd.fpde_prunit / 100) * (100 - fd.fpde_dtoporc)) + fpde_flete + fpde_seguro + fpde_otrogto + fpde_ivamonto + (:gasto * :FACTOR)
                where fd.fapo_id = :fapo_id and fd.fpde_item = :item;
            end
        end

    suspend;
    END
FOR SELECT FP.FAPO_ID
    FROM factura_proforma FP
    WHERE FP.fapo_fecha >= :FECINI AND FP.fapo_fecha <= :FECFIN AND FP.fapo_anulado = 'N'
    INTO :FAPO_ID
    DO
    BEGIN
    SELECT SUM(FPDE_TOTAL-FPDE_FLETE-FPDE_OTROGTO-FPDE_SEGURO-FPDE_IVAMONTO) FROM factura_proforma_det WHERE FAPO_ID = :FAPO_ID
        INTO :TOTAL;
    /* DESHAGALO LOS GASTOS */
    update factura_proforma
        set fapo_total = :total,
            fapo_totmon = :total / taca_monto
            where fapo_id = :fapo_id;
    END
end^


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


ALTER PROCEDURE RECALCULA_IVA_COMPRA (
    ID INTEGER,
    PORANT NUMERIC(18,2),
    PORNUE NUMERIC(18,2))
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    IVATOTAL NUMERIC(18,2),
    TOTALF NUMERIC(18,2),
    ITEM INTEGER,
    CANT NUMERIC(18,4),
    PRUNIT NUMERIC(18,2),
    DTOIT NUMERIC(18,2),
    IVAITEM NUMERIC(18,2),
    TOTALI NUMERIC(18,2))
AS
declare variable IVAINC CHAR(1);
declare variable TOTAL numeric(18,2);
declare variable DTOPORC NUMERIC(18,2);
declare variable DTOMONTO NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable IVAMONTO numeric(18,2);
declare variable IVANETO double precision;
declare variable SUBTOTAL numeric(18,2);
declare variable CONSUMO numeric(18,2);
declare variable DTOSUMA VARCHAR(2);
declare variable DIGITOS INTEGER;
declare variable TIVA INTEGER;
begin
SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_IVAMONTO, FACO_TOTAL, FACO_IMPTOS
    FROM facturas_compra WHERE FACO_ID = :ID AND FACO_ANULADO = 'N'
    INTO PREF, NUMERO, FECHA, IVATOTAL, TOTALF, IVAINC;

EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:digitos);
DIGITOS = DIGITOS * -1;
FOR SELECT FCDE_ITEM, FCDE_CANT, FCDE_PRUNIT, FCDE_DTOPORC, fCde_tiva
    FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID AND FCDE_IVAPORC = :PORANT
    INTO ITEM, :CANT, :PRUNIT, DTOIT, :TIVA
    DO
    BEGIN
    SELECT TAIV_COD FROM tarifa_iva T WHERE TAIV_PORC = :PORNUE INTO :tiva;
    if (IVAINC = 'S') then
        BEGIN
        SUBTOTAL = ((CANT * PRUNIT) / 100) * (100 - DTOIT);
        IVAITEM = (SUBTOTAL / (100 + PORNUE)) * PORNUE;
        EXECUTE PROCEDURE redondee(ivaitem, :digitos) returning_values (:ivaitem);
        UPDATE FACTURAS_COMPRAS_DETALLE SET FCDE_IVAPORC = :PORNUE, FCDE_IVAMONTO = :ivaitem, FCDE_TIVA = :TIVA
            WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
        END
    ELSE
        BEGIN
        SUBTOTAL = ((CANT * PRUNIT) / 100) * (100 - DTOIT);
        IVAITEM = SUBTOTAL * PORNUE / 100;
        totali = SUBTOTAL + IVAITEM;
        EXECUTE PROCEDURE redondee(ivaitem, :digitos) returning_values (:ivaitem);
        EXECUTE PROCEDURE redondee(totali, :digitos) returning_values (:totali);
        UPDATE FACTURAS_COMPRAS_DETALLE SET FCDE_IVAPORC = :PORNUE, FCDE_IVAMONTO = :ivaitem,
            FCDE_TOTAL = :TOTALI
            WHERE FACO_ID = :ID AND FCDE_ITEM = :ITEM;
        END
    suspend;
    END
if (IVAINC = 'S') then
    BEGIN
    SELECT SUM(FCDE_IVAMONTO), SUM(FCDE_TOTAL) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :IVATOTAL, :TOTALF;
    UPDATE FACTURAS_COMPRA
        SET FACO_IVAMONTO = :ivatotal, FACO_TOTAL = :totalf
        WHERE FACO_ID = :ID;
    END
ELSE
    BEGIN
    SELECT SUM(FCDE_IVAMONTO), SUM(FCDE_TOTAL) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :IVATOTAL, :subtotal;
    UPDATE FACTURAS_COMPRA
        SET FACO_IVAMONTO = :ivatotal, FACO_TOTAL = :subtotal + :ivatotal
        WHERE FACO_ID = :ID;
    END
SELECT FACO_DTOPORC, FACO_DTOMONTO, FACO_ADICIONAL FROM FACTURAS_COMPRA WHERE FACO_ID = :ID
    INTO :dtoporc, :dtomonto, adicional;
SELECT SUM(fcde_total), SUM(fcde_IVAMONTO), SUM(fcde_consumo) FROM facturas_COMPRAS_detalle FD
    WHERE FACO_ID = :id INTO :TOTAL, :IVAMONTO, :consumo;
SUBTOTAL = TOTAL - IVAMONTO;
EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (DTOSUMA);
if (DTOSUMA = 'SI') then
    BEGIN
    IVANETO = (:subtotal - :consumo + :ADICIONAL) / (:subtotal-:Consumo);
    IVANETO = Round(:ivamonto * IVANETO, :Digitos);
    UPDATE FACTURAS_COMPRA
        SET FACO_IVAMONTO = :IVANETO,
            FACO_TOTAL = :SUBTOTAL - FACO_DTOMONTO + :IVANETO + FACO_ADICIONAL + FACO_EXTRA,
            faco_rtftemonto = CASE
                        WHEN FACO_RTFTEMONTO <> 0 THEN Round(((:SUBTOTAL - FACO_DTOMONTO + FACO_ADICIONAL + FACO_EXTRA)-:CONSUMO) * FACO_RTFTEPORC / 100, :DIGITOS)
                        ELSE 0 END,
            faco_rtivamonto = CASE
                        WHEN FACO_RTIVAMONTO <> 0 THEN Round(:IVANETO * faco_rtivapor / 100, :DIGITOS)
                        ELSE 0 end, 
            faco_rticamonto = CASE
                        WHEN FACO_RTICAMONTO <> 0 THEN Round(((:SUBTOTAL - FACO_DTOMONTO + FACO_ADICIONAL + FACO_EXTRA)-:CONSUMO) * FACO_RTICAPOR / 1000, :DIGITOS)
                        ELSE 0 END,
            faco_rtcreem = CASE
                        WHEN FACO_RTCREEM <> 0 THEN Round(((:SUBTOTAL - FACO_DTOMONTO + FACO_ADICIONAL + FACO_EXTRA)-:CONSUMO) * FACO_RTCREE / 100, :DIGITOS)
                        ELSE 0 END,
            FACO_TRANSMIT = 'N'
        WHERE FACO_ID = :id;
    END
ELSE
    BEGIN
    DTOMONTO = (:TOTAL - :IVAMONTO) * :DTOPORC / 100;
    IVANETO = (:subtotal - :consumo - :DTOMONTO + :ADICIONAL) / (:subtotal-:Consumo);
    IVANETO = Round(:ivamonto * IVANETO, :Digitos);
    UPDATE FACTURAS_COMPRA
        SET FACO_DTOMONTO = :DTOMONTO,
            FACO_IVAMONTO = :IVANETO,
            FACO_TOTAL = :SUBTOTAL - :DTOMONTO + :IVANETO + FACO_ADICIONAL + FACO_EXTRA,
            faco_rtftemonto = CASE
                        WHEN FACO_RTFTEMONTO <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + FACO_ADICIONAL + FACO_EXTRA)-:CONSUMO) * FACO_RTFTEPORC / 100, :DIGITOS)
                        ELSE 0 end, 
            faco_rtivamonto = CASE
                        WHEN FACO_RTIVAMONTO <> 0 THEN Round(:IVANETO * faco_rtivapor / 100, :DIGITOS)
                        ELSE 0 END,
            faco_rticamonto = CASE
                        WHEN FACO_RTICAMONTO <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + FACO_ADICIONAL + FACO_EXTRA)-:CONSUMO) * FACO_RTICAPOR / 1000, :DIGITOS)
                        ELSE 0 END,
            faco_rtcreem = CASE
                        WHEN FACO_RTCREEM <> 0 THEN Round(((:SUBTOTAL - :DTOMONTO + FACO_ADICIONAL + FACO_EXTRA)-:CONSUMO) * FACO_RTCREE / 100, :DIGITOS)
                        ELSE 0 END,
            FACO_TRANSMIT = 'N'
        WHERE FACO_ID = :id;
    END
end^


ALTER PROCEDURE RECALCULA_IVA_FACTURA (
    ID INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    IVATOTAL NUMERIC(18,2),
    TOTALF NUMERIC(18,2),
    ITEM INTEGER,
    CANT NUMERIC(18,4),
    PRUNIT NUMERIC(18,2),
    DTOIT NUMERIC(18,2),
    IVAITEM NUMERIC(18,2),
    TOTALI NUMERIC(18,2))
AS
declare variable IVAINC CHAR(1);
declare variable SUBTOTAL NUMERIC(18,2);
declare variable DIGITOS INTEGER;
declare variable TIVA INTEGER;
declare variable IVAP NUMERIC(18,2);
begin
SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_IVAMONTO, FACT_TOTAL, FACT_IVAINC FROM FACTURAS WHERE FACT_ID = :ID AND FACT_ANULADO = 'N'
    INTO PREF, NUMERO, FECHA, IVATOTAL, TOTALF, IVAINC;

EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:digitos);
DIGITOS = DIGITOS * -1;
FOR SELECT FADE_ITEM, FADE_CANT, FADE_PRUNIT, FADE_DTOPORC, fade_tiva
    FROM FACTURAS_DETALLE WHERE FACT_ID = :ID
    INTO ITEM, :CANT, :PRUNIT, DTOIT, :TIVA
    DO
    BEGIN
    SELECT TAIV_PORC FROM tarifa_iva T WHERE TAIV_COD = :TIVA INTO :ivap;
    if (IVAINC = 'S') then
        BEGIN
        SUBTOTAL = ((CANT * PRUNIT) / 100) * (100 - DTOIT);
        IVAITEM = (SUBTOTAL / (100 + IVAP)) * IVAP;
        EXECUTE PROCEDURE redondee(ivaitem, :digitos) returning_values (:ivaitem);
        UPDATE FACTURAS_DETALLE SET FADE_IVAPORC = :IVAP, FADE_IVAMONTO = :ivaitem
            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM;
        END
    ELSE
        BEGIN
        SUBTOTAL = ((CANT * PRUNIT) / 100) * (100 - DTOIT);
        IVAITEM = SUBTOTAL * IVAP / 100;
        totali = SUBTOTAL + IVAITEM;
        EXECUTE PROCEDURE redondee(ivaitem, :digitos) returning_values (:ivaitem);
        EXECUTE PROCEDURE redondee(totali, :digitos) returning_values (:totali);
        UPDATE FACTURAS_DETALLE SET FADE_IVAPORC = :IVAP, FADE_IVAMONTO = :ivaitem,
            FADE_TOTAL = :TOTALI
            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM;
        END
    suspend;
    END
if (IVAINC = 'S') then
    BEGIN
    SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :IVATOTAL, :TOTALF;
    UPDATE FACTURAS
        SET FACT_IVAMONTO = :ivatotal, FACT_TOTAL = :totalf
        WHERE FACT_ID = :ID;
    END
ELSE
    BEGIN
    SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID INTO :IVATOTAL, :subtotal;
    UPDATE FACTURAS
        SET FACT_IVAMONTO = :ivatotal, FACT_TOTAL = :subtotal + :ivatotal
        WHERE FACT_ID = :ID;
    END
EXECUTE PROCEDURE actualice_total_docventa(31, :ID);
end^


ALTER PROCEDURE RECALCULA_MOVBANCO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    MONTO NUMERIC(18,2))
AS
declare variable IDB INTEGER;
declare variable TOTAL NUMERIC(18,2);
begin
FOR SELECT MAX(C.CONS_ID), SUM(CODE_MONTO) from CONSIGNA C, consigna_detalle D
    WHERE C.cons_id = D.cons_id AND CONS_FECHA >= :FECINI AND CONS_FECHA <= :FECFIN AND CONS_ANULADO = 'N'
    GROUP BY C.CONS_ID
    INTO :ID, :MONTO
    DO
    BEGIN
    SELECT MOBA_ID, MOBA_TOTAL FROM movimiento_banco WHERE MOBA_TIPODOC = 71 AND MOBA_IDREF = :ID INTO :idb, :TOTAL;
    if (TOTAL <> MONTO) then
        begin
        update movimiento_banco set moba_total = :monto where moba_id = :idb;
        suspend;
        end
    END
end^


ALTER PROCEDURE RECALCULA_PUNTOS_CLIENTE (
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20))
RETURNS (
    NIT VARCHAR(20),
    ID INTEGER,
    FECHA DATE,
    PUNTOS NUMERIC(18,2))
AS
declare variable FECMIN DATE;
declare variable FECMINS VARCHAR(10);
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
declare variable COMIP VARCHAR(2);
declare variable FACTOR NUMERIC(9,4);
declare variable FACTORD NUMERIC(9,4);
declare variable ACUMULA VARCHAR(10);
begin
DELETE FROM PUNTOS_CLIENTE WHERE PTCL_NIT >= :NITINI AND PTCL_NIT <= :NITFIN;
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 = 'VENTA') then
    begin
    /* LAS FACTURAS */
    FOR SELECT FACT_ID, TERC_NIT, FACT_FECHA FROM FACTURAS
        WHERE TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN AND FACT_ANULADO = 'N' AND FACT_FECHA >= :FECMIN
        ORDER BY FACT_FECHA, FACT_ID
        INTO :ID, :nit, :fecha
      DO
      BEGIN
      EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
      SUSPEND;
      END
    /* LAS DEVOLUCIONES */
    FOR SELECT DEVT_ID, TERC_NIT, DEVT_FECHA FROM devoluciones_ventas
        WHERE TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN AND DEVT_ANULADO = 'N'
        ORDER BY DEVT_FECHA, DEVT_ID
        INTO :ID, :nit, :fecha
      DO
      BEGIN
      EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
      SUSPEND;
      END
    end
else
    if (acumula = 'RECAUDO') then
        begin
        FOR SELECT R.RECA_ID, R.RECA_FECHA, R.terc_nit, D.rcde_tipodoc, D.rcde_iddoc, D.rcde_abono, D.rcde_comip
            FROM recibos_caja R, recibos_caja_detalle D WHERE R.reca_id = D.reca_id AND
            R.terc_nit >= :nitini AND R.terc_nit <= :nitfin AND R.reca_anulado = 'N' AND R.RECA_FECHA >= :FECMIN
            INTO :id, :fecha, :nit, :tipo, :iddoc, :puntos, :comip
            DO
            BEGIN
            SELECT COPU_FACTORCL FROM comisiones_puntos WHERE COPU_COD = :comip INTO :FACTOR;
            if ((:tipo = 31) or (:tipo = 41)) then
                begin
                /* recorra la factura acumulando los puntos */
                if (:tipo = 31) then
                    select (fact_total-fact_ivamonto)/fact_total from facturas where fact_id = :iddoc into :factord;
                if (:tipo = 41) then
                    select ndcl_monto/(ndcl_monto+ndcl_ivamonto) from notas_debito_clientes where ndcl_id = :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, :fecha, :tipo, :iddoc, (:puntos*:factord*:factor/1000), 0);
                end
            if ((:tipo = 33) or (:tipo = 42)) then
                begin
                if (:tipo = 33) then
                    select (devt_total-devt_ivamonto)/devt_total from devoluciones_ventas where devt_id = :iddoc into :factord;
                if (:tipo = 42) then
                    select nccl_monto/(nccl_monto+nccl_ivamonto) from notas_credito_clientes where nccl_id = :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, :fecha, :tipo, :iddoc, 0, (:puntos*:factord*:factor/1000));
                end
            SUSPEND;
            END
        end
/* LAS REDENCIONES */
FOR SELECT PTRE_ID, PTRE_FECHA, PTRE_NIT, PTRE_PUNTOS
    FROM puntos_redencion WHERE PTRE_NIT >= :NITINI AND PTRE_NIT <= :NITFIN
    INTO :ID, :FECHA, :NIT, :PUNTOS
    DO
    BEGIN
    insert into puntos_cliente (ptcl_nit, ptcl_fecha, ptcl_tipodoc, ptcl_iddoc, ptcl_db, ptcl_cr)
        values (:nit, :fecha,  81, :id, 0, :puntos);
    SUSPEND;
    END
end^


ALTER PROCEDURE RECALCULE_FACTURAS_MAL_TOTAL (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    TOTAL NUMERIC(18,2),
    TOTITEMS NUMERIC(18,2),
    IVATOT NUMERIC(18,2),
    IVAIT NUMERIC(18,2),
    IDFACT INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60))
AS
declare variable FACTOR DOUBLE PRECISION;
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_TOTAL, FACT_IVAMONTO, FACT_FACTOR FROM FACTURAS WHERE FACT_ANULADO = 'N'
    AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
    INTO :IDFACT, :PREF, :NUMERO, :FECHA, :NIT, :NOMBRE, :TOTAL, :IVATOT, :FACTOR
    DO
    BEGIN
    SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDFACT INTO :TOTITEMS, :IVAIT;
    if (ABS(TOTITEMS * FACTOR - TOTAL) >= 1) then
      begin
      UPDATE FACTURAS SET FACT_TOTAL = :TOTITEMS, FACT_IVAMONTO = :IVAIT WHERE FACT_ID = :IDFACT;
      suspend;
      end
    END
end^


ALTER PROCEDURE RECALCULO_COMISIONES_VENTAS (
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE)
AS
declare variable SITOT CHAR(2);
declare variable ID INTEGER;
declare variable TOTAL NUMERIC(18,2);
declare variable IVA NUMERIC(18,2);
declare variable COMIPORC NUMERIC(9,2);
begin
FOR SELECT FACT_ID, FACT_TOTAL, FACT_IVAMONTO FROM FACTURAS WHERE VEND_COD = :VEND AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :fecfin INTO :ID, :TOTAL, :IVA
  DO
  BEGIN
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if (SITOT = 'SI') then
    SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = :vend AND
        COMI_INICIAL <= :total AND COMI_FINAL >= :total
        INTO :comiporc;
  ELSE
    SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = :vend AND
        COMI_INICIAL <= (:total - :iva) AND COMI_FINAL >= (:total - :iva)
        INTO :comiporc;
  if (:comiporc IS NULL) then
    comiporc = 0;
  if (SITOT = 'SI') then
    UPDATE FACTURAS SET FACT_COMIPORC = :COMIPORC, fact_comimonto = fact_total * :comiporc / 100 WHERE FACT_ID = :ID;
  ELSE
    UPDATE FACTURAS SET FACT_COMIPORC = :COMIPORC, fact_comimonto = (fact_total - fact_ivamonto) * :comiporc / 100  WHERE FACT_ID = :ID;
  END
end^


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


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


ALTER PROCEDURE RECIBO_RECAUDO (
    CAJA INTEGER,
    PREFIJO VARCHAR(4),
    FORMAP INTEGER)
AS
declare variable NIT varchar(20);
declare variable FECHA date;
declare variable REFERENCIA varchar(20);
declare variable MONTO numeric(18,2);
declare variable NOMBRE varchar(60);
declare variable COBR integer;
declare variable TIPOD integer;
declare variable IDD integer;
declare variable PREFD varchar(4);
declare variable NUMD varchar(8);
declare variable ABONO numeric(18,2);
declare variable ID integer;
declare variable ITEM integer;
declare variable IDR integer;
declare variable IDA integer;
begin
/* CON LA REFERENCIA UBIQUE EL CLIENTE, SUCURSAL */
FOR SELECT RECR_ID, RECR_FECHA, RECR_REFERENCIA, RECR_MONTO FROM RECAUDO
    INTO :ID, :FECHA, :REFERENCIA, :MONTO
    DO
    BEGIN
    NIT = NULL;
    item = 0;
    SELECT TERC_NIT FROM CLIENTE_SUCURSALES WHERE CLCU_COD = :referencia INTO :NIT;
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMBRE;
    SELECT COBR_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :COBR;
    if (NIT IS NOT NULL) then
        BEGIN
        IDR = GEN_ID(id_recicaja, 1);
        SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 61 AND PREF_PRE = :PREFIJO INTO :numd;
        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,
            TERC_NIT, RECA_NOMTERC, RECA_ANULADO, RECA_TRANSMIT, COBR_COD, NUMOK, RECA_TRM, RECA_EXEDENTE, RECA_PAGANOM, RECA_RTCREEM)
        values (:IDR, :CAJA, 61, :prefijo, :numd, :FECHA, 'RECUADO ' || :FECHA || ' CONTRATO ' || :REFERENCIA, :MONTO, 0, 0, 0, 0,
                :NIT, :nombre, 'N', 'N', :cobr, 'N', 1, 0, 'N', 0);
        insert into RECIBOS_CAJA_PAGO (RECA_ID, RCPA_ITEM, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA,
            RCPA_MONTO, RCPA_ANULADO, RCPA_TRANSMIT, RCPA_IVAMONTO, RCPA_CONC, RCPA_TRM)
            values (:IDR, 1, :formap, NULL, NULL, NULL, :FECHA, :MONTO, 'N', 'N', 0, 'RECAUDO ' || :FECHA, 1);
        /* BUSQUE LA CARTERA DEL CLIENTE */
        FOR SELECT TIPO, ID, PREFIJO, NUMERO, SALDO FROM cartera_cliente(:NIT, :fecha,  :referencia, 0, 'N', 0)
            WHERE SALDO > 0  ORDER BY VENCE, FECDOC, TIPO, ID
            INTO :TIPOD, :IDD, :PREFD, :NUMD, :ABONO
            DO
            BEGIN
            IF (MONTO > 0) tHEN
                BEGIN
                ITEM = ITEM + 1;
                if (MONTO < ABONO) then
                    ABONO = MONTO;
                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_SUCURSAL, RCDE_DIFCAMBIO, RCDE_COBR, RCDE_RCREE)
                    values (:IDR, :ITEM, :TIPOD, :IDD, :prefd, :numd, :ABONO, 0, 0, 0, 0, 'N', 'N', :referencia, 0, :COBR, 0);
                MONTO = MONTO - ABONO;
                END
            END
        if (MONTO > 0) then
            BEGIN
            /* REGISTRE UN ANTICIPO */
            IDA = GEN_ID(id_anticlie, 1);
            ITEM = ITEM + 1;
            insert into ANTICIPOS_CLIENTE (ANCL_ID, TIDO_COD, PREF_PRE, TERC_NIT, ANCL_FECHA, ANCL_NUMERO, ANCL_CONC, ANCL_BASE,
                                           ANCL_IVAPORC, ANCL_IVAMONTO, ANCL_RTFTEPORC, ANCL_RTFTEMONTO, ANCL_RTIVAPORC,
                                           ANCL_RTIVAMONTO, ANCL_RTICAPORC, ANCL_RTICAMONTO, ANCL_DTOFECHA, ANCL_DTOFPORC,
                                           ANCL_DTOFMONTO, ANCL_ANULADO, ANCL_TRANSMIT, COBR_COD, ANCL_OBS, RECA_ID, ANCL_USUARIO,
                                           ANCL_SUCURSAL, NUMOK, VEND_COD, ANCL_TRM, ANCL_RTCREE, ANCL_RTCREEM)
            values (:IDA, 45, :prefijo, :NIT, :FECHA, '000001', 'RECUADO ' || :FECHA || ' CONTRATO ' || :REFERENCIA, :MONTO, 0,
                    0, 0, 0, 0, 0, 0, 0, :FECHA, 0, 0, 'N', 'N', :cobr,
                    NULL, 0, USER, :referencia, 'N', :cobr, 1, 0, 0);
            select ancl_numero from anticipos_cliente where ancl_id = :ida into :numd;
            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_SUCURSAL, RCDE_DIFCAMBIO, RCDE_COBR, RCDE_RCREE)
                values (:IDR, :ITEM, 45, :IDA, :prefijo, :numd, :MONTO*-1, 0, 0, 0, 0, 'N', 'N', :referencia, 0, :COBR, 0);
            END
        END
    END
end^


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^


ALTER PROCEDURE RECLASIFICA_DEVDEC1818 (
    FECINI DATE,
    FECFIN DATE,
    PREFI VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ITEM INTEGER,
    CODIGO VARCHAR(20))
AS
declare variable TDEC INTEGER;
declare variable GDEC CHAR(1);
declare variable TIVA INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'TARIFA DE IVA PARA PRODUCTOS EXENTOS DECRETO 1818 DE 2015')
    returning_values (:TDEC);
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas V
    WHERE DEVT_ANULADO = 'N' AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((PREF_PRE = :PREFI) or (:PREFI = ''))
    INTO :ID, :PREF, :NUMERO
    DO
    BEGIN
    FOR SELECT DVDE_ITEM, ARTI_COD, DVDE_TIVA FROM devoluciones_ventas_detalle D
        WHERE DEVT_ID = :ID INTO :ITEM, :CODIGO, :TIVA
        DO
        BEGIN
        SELECT G.grup_dec1818 FROM ARTICULO A, GRUPO G WHERE ARTI_COD = :CODIGO AND A.grup_cod = G.grup_cod INTO :GDEC;
        if ((GDEC = 'S') AND (TIVA <> TDEC)) then
            BEGIN
            UPDATE devoluciones_ventas_detalle SET DVDE_TIVA = :TDEC
                WHERE DEVT_ID = :ID AND DVDE_ITEM = :ITEM;
            suspend;
            END
        END
    END
end^


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


ALTER PROCEDURE RECONTABILICE_NIIF (
    FECINI DATE,
    FECFIN DATE,
    TIPO VARCHAR(3),
    PREF VARCHAR(4),
    BORRAR CHAR(1),
    INCAJUS CHAR(1))
RETURNS (
    ID INTEGER,
    PRCO VARCHAR(4),
    NUMERO VARCHAR(8),
    CUENTA VARCHAR(20),
    ESTADO VARCHAR(20))
AS
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
if ((SUBSTRING(FECFCNT FROM 5 FOR 2) = '12') AND (INCAJUS = 'S')) then
    FECFCNT = SUBSTRING(FECFCNT FROM 1 FOR 4) || '1331';
FOR SELECT ENCO_CONSEC, PRCO_PREF, ENCO_NUMERO FROM comprobante_encabezado
    WHERE ((TICO_COD = :TIPO) or (:tipo = '')) AND ((PRCO_PREF = :PREF) OR (:PREF = '')) AND ENCO_FECHA >= :fecicnt AND ENCO_FECHA <= :fecfcnt
    INTO :ID, :PRCO, :NUMERO
    DO
    BEGIN
    EXECUTE PROCEDURE contabilice_equivalencia_niif (:ID, :borrar) returning_values (:CUENTA, :ESTADO);
    SUSPEND;
    END
END^


ALTER PROCEDURE RECUPERA_FACTURAS_VEND (
    VEND INTEGER,
    FECHA DATE)
RETURNS (
    ID VARCHAR(12),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    ITEMS INTEGER,
    TOTAL NUMERIC(18,2))
AS
begin
FOR select FACW_ID, P.TERC_NIT, FACW_SUCURSAL, TERC_NOM, FACW_TOTAL
    from FACTURA_WEB P, TERCEROS T WHERE P.terc_nit = T.terc_nit AND FACW_FECHA = :FECHA AND VEND_COD = :VEND
    AND FACW_IDFAC = 0 AND P.facw_total <> 0
    INTO :ID, :NIT, :SUCURSAL, :NOMBRE, :TOTAL
    DO
    BEGIN
    EXECUTE PROCEDURE NOMBRE_ASCII(:NOMBRE) returning_values (:NOMBRE);
    SELECT COUNT(PD.fawd_item) FROM factura_web_detalle PD WHERE FACW_ID = :ID INTO :ITEMS;
    suspend;
    END
end^


ALTER PROCEDURE RECUPERA_NUMERO_CHEQUE
AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE NUMERO VARCHAR(8);
BEGIN
FOR SELECT MOBA_IDREF, MOBA_NUMERO
    FROM MOVIMIENTO_BANCO
    WHERE MOBA_TIPODOC = 72
    INTO :ID, :NUMERO
DO
    UPDATE CHEQUES SET CHEQ_NUMERO = :NUMERO WHERE CHEQ_ID = :ID;
end^


ALTER PROCEDURE RECUPERA_PEDIDOS_VEND (
    VEND INTEGER,
    FECHA DATE)
RETURNS (
    ID VARCHAR(12),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    ITEMS INTEGER,
    TOTAL NUMERIC(18,2))
AS
begin
FOR select PEWE_ID, P.TERC_NIT, PEWE_SUCURSAL, TERC_NOM, PEWE_TOTAL
    from PEDIDO_WEB P, TERCEROS T WHERE P.terc_nit = T.terc_nit AND PEWE_FECHA = :FECHA AND VEND_COD = :VEND
    AND PEWE_IDPED = 0 AND P.pewe_total <> 0
    INTO :ID, :NIT, :SUCURSAL, :NOMBRE, :TOTAL
    DO
    BEGIN
    EXECUTE PROCEDURE NOMBRE_ASCII(:NOMBRE) returning_values (:NOMBRE);
    SELECT COUNT(PD.pewd_item) FROM pedido_web_detalle PD WHERE PEWE_ID = :ID INTO :ITEMS;
    suspend;
    END
end^


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^


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^


ALTER PROCEDURE REDONDEE_NOTAS_PROVEEDOR (
    FECFIN DATE)
AS
declare variable id INTEGER;
declare variable BASE NUMERIC(18,2);
declare variable IVA NUMERIC(18,2);
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable DIG INTEGER;
begin
FOR SELECT NCPR_ID, NCPR_MONTO, NCPR_IVAMONTO, NCPR_RTFTEMONTO, NCPR_RTIVAMONTO, NCPR_RTICAMONTO
    FROM NOTAS_CREDITO_PROVEEDOR
    WHERE NCPR_FECHA <= :fecfin INTO :ID, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    if ((BASE - FLOOR(BASE)) > 0) then
        begin
        execute PROCEDURE lee_configuracion('CXPAGAR', 'GENERAL', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:DIG);
        execute procedure redondee(BASE, DIG) returning_values (BASE);
        execute procedure redondee(IVA, DIG) returning_values (IVA);
        execute procedure redondee(RTFTE, DIG) returning_values (RTFTE);
        execute procedure redondee(RTIVA, DIG) returning_values (RTIVA);
        execute procedure redondee(RTICA, DIG) returning_values (RTICA);
        update NOTAS_CREDITO_PROVEEDOR
            SET NCPR_MONTO = :BASE,
            NCPR_IVAMONTO = :IVA,
            NCPR_RTFTEMONTO = :RTFTE,
            NCPR_RTIVAMONTO = :RTIVA,
            NCPR_RTICAMONTO = :RTICA
            WHERE NCPR_ID = :ID;
        update movimiento_proveedor
            set mvpr_monto = :base + :iva,
            mvpr_rtfte = :rtfte,
            mvpr_rtiva = :rtiva,
            mvpr_rtica = :rtica
            where mvpr_tiporef = 52 and mvpr_idref = :id;
        end
    END
FOR SELECT NDPR_ID, NDPR_MONTO, NDPR_IVAMONTO, NDPR_RTFTEMONTO, NDPR_RTIVAMONTO, NDPR_RTICAMONTO
    FROM NOTAS_DEBITO_PROVEEDOR
    WHERE NDPR_FECHA <= :fecfin INTO :ID, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA
    DO
    BEGIN
    if ((BASE - FLOOR(BASE)) > 0) then
        begin
        execute PROCEDURE lee_configuracion('CXPAGAR', 'GENERAL', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:DIG);
        execute procedure redondee(BASE, DIG) returning_values (BASE);
        execute procedure redondee(IVA, DIG) returning_values (IVA);
        execute procedure redondee(RTFTE, DIG) returning_values (RTFTE);
        execute procedure redondee(RTIVA, DIG) returning_values (RTIVA);
        execute procedure redondee(RTICA, DIG) returning_values (RTICA);
        update NOTAS_DEBITO_PROVEEDOR
            SET NDPR_MONTO = :BASE,
            NDPR_IVAMONTO = :IVA,
            NDPR_RTFTEMONTO = :RTFTE,
            NDPR_RTIVAMONTO = :RTIVA,
            NDPR_RTICAMONTO = :RTICA
            WHERE NDPR_ID = :ID;
        update movimiento_proveedor
            set mvpr_monto = :base + :iva,
            mvpr_rtfte = :rtfte,
            mvpr_rtiva = :rtiva,
            mvpr_rtica = :rtica
            where mvpr_tiporef = 51 and mvpr_idref = :id;
        end
    END
end^


ALTER PROCEDURE REDONDEE_PRECIO_LISTA (
    CODLISTA INTEGER)
RETURNS (
    PRECIO NUMERIC(18,2))
AS
declare variable ARTICOD varchar(60);
declare variable PRECIOANT numeric(18,2);
declare variable REDON smallint;
BEGIN
FOR SELECT ARTI_COD, PRAR_FIJO, PRAR_REDON FROM PRECIOS_ARTICULO WHERE LIPR_COD = :CODLISTA
    INTO :ARTICOD, :PRECIOANT, :REDON
    DO
    BEGIN
    EXECUTE PROCEDURE redondee(:PRECIOANT, :REDON) returning_values(:PRECIO);
    UPDATE PRECIOS_ARTICULO SET PRAR_FIJO = :PRECIO WHERE ARTI_COD = :ARTICOD AND LIPR_COD = :CODLISTA;
    SUSPEND;
    END
END^


ALTER PROCEDURE REGISTRA_PROVISION (
    FECHA DATE,
    TIPOCOMP VARCHAR(3),
    PREFCNT VARCHAR(4),
    CTAGASTO VARCHAR(20),
    CTACART VARCHAR(20))
RETURNS (
    DIASI INTEGER,
    TOTAL NUMERIC(18,2),
    PROVISION NUMERIC(18,2),
    IDCNT INTEGER)
AS
declare variable DIASF INTEGER;
declare variable PORC NUMERIC(18,2);
declare variable NUMERO VARCHAR(8);
declare variable TIPO INTEGER;
declare variable ID INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable PROY VARCHAR(4);
declare variable CENT VARCHAR(4);
declare variable NUMAGE INTEGER;
declare variable SUBEMPRESA INTEGER;
declare variable INCLANTI CHAR(2);
declare variable FECCONTA CHAR(8);
declare variable ITEM INTEGER;
declare variable NIT VARCHAR(20);
declare variable SUMA NUMERIC(18,2);
begin
EXECUTE PROCEDURE fecha_a_conta (fecha) returning_values (:FECCONTA);
execute procedure cambie_id_comproba returning_values(:IDCNT);
SELECT PREF_NUMERO FROM PREFIJOS_CONTA WHERE TICO_COD = :tipocomp AND PRCO_PREF = :prefcnt INTO :NUMERO;

insert into comprobante_encabezado (tico_cod, prco_pref, enco_consec, enco_numero, enco_fecha, enco_concepto, enco_refer, enco_tiporef, enco_idref, ENCO_DESCONTABLE)
    values (:TIPOCOMP, :prefcnt, :idcnt, :numero, :fecconta, 'PROVISION DE CARTERA ' || :FECHA, NULL, 0, 0, 'S');
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (PROY);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (CENT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÃ‘IA') RETURNING_VALUES (NIT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
SUMA = 0;
ITEM = 1;
SELECT COUNT(SUCU_ID) FROM SUCURSALES INTO :NUMAGE;
if (NUMAGE > 1) then
  BEGIN
  FOR SELECT SUCU_ID, SUCU_PROY, SUCU_CENT FROM SUCURSALES ORDER BY SUCU_ID INTO :SUBEMPRESA, :PROY, :CENT
    DO
    BEGIN
    FOR SELECT PRCA_DIASINI, PRCA_PORC FROM provision_cartera P1 ORDER BY PRCA_DIASINI
        INTO :DIASI, :PORC
        DO
        BEGIN
        TOTAL = 0;
        DIASF = 0;
        SELECT FIRST 1 PRCA_DIASINI FROM provision_cartera WHERE PRCA_DIASINI > :DIASI ORDER BY PRCA_DIASINI INTO :DIASF;
        if ((DIASF = 0) or (DIASF IS NULL)) then
            DIASF = 9999;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
            FROM MOVIMIENTO_CLIENTES WHERE MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' AND
            (SUCU_ID = :SUBEMPRESA) AND (:FECHA-MVCL_VENCE) >= :DIASI AND
            (:FECHA-MVCL_VENCE) < :DIASF
            INTO :TIPO, :ID
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, 0) returning_values (SALDO);
                if (SALDO <> 0) then
                    TOTAL = TOTAL + SALDO;
                END
            END
        PROVISION = TOTAL * PORC / 100;
        if (PROVISION > 0) then
            BEGIN
            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
              VALUES (:idcnt, :item, :ctagasto, :NIT, :PROY, :CENT, 'PROVISION CARTERA ' || :diasi || ' DIAS', NULL, :TOTAL, :PORC, :PROVISION, 0, 'S');
            SUMA = SUMA + PROVISION;
            ITEM = ITEM + 1;
            END
        suspend;
        end
    end /* AGENCIAS */
  END
ELSE
    FOR SELECT PRCA_DIASINI, PRCA_PORC FROM provision_cartera P1 ORDER BY PRCA_DIASINI
        INTO :DIASI, :PORC
        DO
        BEGIN
        TOTAL = 0;
        DIASF = 0;
        SELECT FIRST 1 PRCA_DIASINI FROM provision_cartera WHERE PRCA_DIASINI > :DIASI ORDER BY PRCA_DIASINI INTO :DIASF;
        if ((DIASF = 0) or (DIASF IS NULL)) then
            DIASF = 9999;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF
            FROM MOVIMIENTO_CLIENTES WHERE MVCL_FECHA <= :FECHA AND MVCL_ABONO = 'N' AND
            (:FECHA-MVCL_VENCE) >= :DIASI AND (:FECHA-MVCL_VENCE) <= :DIASF
            INTO :TIPO, :ID
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, 0) returning_values (SALDO);
                if (SALDO <> 0) then
                    TOTAL = TOTAL + SALDO;
                END
            END
        PROVISION = TOTAL * PORC / 100;
        if (PROVISION > 0) then
            BEGIN
            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
              VALUES (:idcnt, :item, :ctagasto, :NIT, :PROY, :CENT, 'PROVISION CARTERA ' || :diasi || ' DIAS', NULL, :TOTAL, :PORC, :PROVISION, 0, 'S');
            SUMA = SUMA + PROVISION;
            ITEM = ITEM + 1;
            END
        suspend;
        end
if (SUMA <> 0) then
    BEGIN
    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
      VALUES (:idcnt, :item, :ctacart, :NIT, :PROY, :CENT, 'PROVISION CARTERA A ' || :FECHA, NULL, 0, 0, 0, :SUMA, 'S');
    SUMA = SUMA + PROVISION;
    END
end^


ALTER PROCEDURE REGISTRA_RECIBO_FACTURA (
    FACTURA INTEGER)
AS
declare variable PREF varchar(4);
declare variable NUMERO varchar(8);
declare variable FECHA date;
declare variable PREFAC varchar(4);
declare variable MONTO numeric(18,2);
declare variable idr integer;
declare variable NIT VARCHAR(20);
declare variable punto integer;
declare variable caja integer;
declare variable vend integer;
declare variable nomcli varchar(60);
begin
select f.pref_pre, fact_numero, fact_fecha, vend_cod, terc_nit, a.auto_prefrdc, ptvt_id, fact_nomcliente
    from facturas f, autorizaciones a where f.pref_pre = a.pref_pre AND A.auto_fecha <= F.fact_fecha
    AND A.auto_vence >= F.fact_fecha and f.fact_id = :factura
    into :prefac, :numero, :fecha, :vend, :NIT, :PREF, :punto, :nomcli;
select caja_id from punto_venta where ptvt_id = :punto into :caja;
execute procedure saldo_doc_cartera(31, :factura, :fecha, 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 No. ' || :prefac || :numero,  :MONTO,
        0, 0, 0, 0, NULL, :NIT, :nomcli, '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, :factura, :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);
    end
end^


ALTER PROCEDURE REGISTRA_RECIBOS_CONTADO (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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
end^


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(8),
    PREFD VARCHAR(4),
    NUMD VARCHAR(8),
    PREFF VARCHAR(4),
    NUMF VARCHAR(8),
    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^


ALTER PROCEDURE REGISTRE_CLIENTE (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONOS VARCHAR(40),
    MOVIL VARCHAR(40),
    EMAIL VARCHAR(100),
    CONTACTO VARCHAR(60))
RETURNS (
    OK CHAR(1))
AS
begin
OK = 'N';
if ((nit <> '') and (nombre <> '')) then
    begin
    OK = 'S';
    select 'N' from clientes where terc_nit = :nit into :OK;
    if (OK = 'S') then
        begin
        UPDATE OR INSERT INTO terceros (TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CEL, TERC_EMAIL, TERC_CONTACTO, TERC_CLIE)
                VALUES (:NIT, :NOMBRE, :DIRECCION, :CIUDAD, :TELEFONOS, :MOVIL, :EMAIL, :CONTACTO, 'S');
        UPDATE or INSERT INTO CLIENTES (TERC_NIT, CLIE_COD, CLIE_ESTADO, VEND_COD, ZONA_COD) VALUES (:NIT, :NIT, 'A', 1, '4');
        end
    end
suspend;
end^


ALTER PROCEDURE REGISTRE_COINCIDENCIAS_CONTEO (
    FECHA DATE,
    BODEGA VARCHAR(2),
    STAND VARCHAR(20),
    IDAJUS INTEGER)
AS
declare variable ID1 integer;
declare variable ID2 integer;
declare variable ITEM integer;
declare variable ARTICULO varchar(20);
declare variable LOTE varchar(20);
declare variable CANT1 numeric(18,2);
declare variable CANT2 NUMERIC(18, 2);
declare variable EXIST CHAR(1);
declare variable EXANT NUMERIC(18, 2);
declare variable UNIDAD VARCHAR(8);
declare variable DESCRIP VARCHAR(60);
declare variable COSTO NUMERIC(18, 2);
begin
SELECT AJUS_ID FROM AJUSTES WHERE BODE_COD = :bodega AND AJUS_STAND = :STAND AND AJUS_FECHA = :FECHA AND AJUS_ANULADO = 'N' AND AJUS_PASADA = 0
    INTO :ID1;
SELECT AJUS_ID FROM AJUSTES WHERE BODE_COD = :bodega AND AJUS_STAND = :STAND AND AJUS_FECHA = :FECHA AND AJUS_ANULADO = 'N' AND AJUS_PASADA = 1
    INTO :ID2;
SELECT MAX(AJUS_ITEM) FROM ajustes_detalle WHERE AJUS_ID = :idajus INTO :item;
if (item is null) then
    item = 0;
FOR SELECT max(D.ARTI_COD), max(AJUS_EXNUE * AJUS_FACTOR), max(A.arti_exist), max(D.ajus_lote), max(D.ajus_exant), max(A.arti_unidad), max(A.arti_des)
    FROM ajustes_detalle D, ARTICULO A
    WHERE D.arti_cod = A.arti_cod AND AJUS_ID = :ID1
    group BY d.arti_cod,  d.ajus_lote
    INTO :ARTICULO, :CANT1, :exist, :lote, :exant, :UNIDAD, :DESCRIP
    DO
    BEGIN
    CANT2 = 0;
    if (exist = 'L') then
        SELECT sum(AJUS_EXNUE) FROM ajustes_detalle WHERE AJUS_ID = :ID2 AND ARTI_COD = :articulo and AJUS_LOTE = :LOTE INTO :CANT2;
    else
        SELECT sum(AJUS_EXNUE) FROM ajustes_detalle WHERE AJUS_ID = :ID2 AND ARTI_COD = :articulo INTO :CANT2;
    if (CANT1 = CANT2) then
        BEGIN
        ITEM = ITEM + 1;
        EXECUTE PROCEDURE costo_promedio(:ARTICULO, :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 (:idajus, :item, :ARTICULO, :bodega, :exant, :CANT1, :unidad, :lote, 1, :articulo, 'N', :descrip, NULL, 'N', :costo);
        END
    END
end^


ALTER PROCEDURE REGISTRE_FACTURA_WEB (
    AGENCIA INTEGER,
    CLIENTE VARCHAR(20),
    OBSERV VARCHAR(1024))
RETURNS (
    ID INTEGER)
AS
declare variable FECHA DATE;
declare variable PREF VARCHAR(4);
declare variable VEND INTEGER;
declare variable NOMBRE VARCHAR(60);
begin
ID = GEN_ID(id_facweb,1);
FECHA = CAST('NOW' AS DATE);
SELECT FIRST 1 VEND_COD FROM VENDEDORES WHERE SUCU_ID = :AGENCIA INTO :VEND;
SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :CLIENTE INTO :NOMBRE;
SELECT first 1 P.PREF_PRE FROM PREFIJOS P, AUTORIZACIONES A
    WHERE P.tido_cod = 31 AND P.pref_pre = A.pref_pre AND A.tido_cod = 31 AND P.pref_actual >= A.auto_inicial AND P.pref_actual <= A.auto_final
    AND P.pref_activo = 'S' AND SUCU_ID = :AGENCIA INTO :PREF;
insert into FACTURA_WEB (FACW_ID, FACW_PREF, FACW_FECHA, VEND_COD, TERC_NIT, FACW_SUCURSAL, FACW_NOMBRE, FACW_ENTREGA,
     FACW_DIASCR, FACW_DTOPORC, FACW_DTOMONTO, FACW_ADICIONAL, FACW_IVAMONTO, FACW_EXTRA, FACW_TOTAL, FACW_RTFTEPORC, FACW_RTIVAPORC, FACW_RTICAPORC,
     FACW_OBS, FACW_RTFTEMONTO, FACW_RTIVAMONTO, FACW_RTICAMONTO, FACW_IDFAC)
values (:ID, :PREF, :FECHA, :VEND, :CLIENTE, '01', :NOMBRE, :FECHA,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, :observ, 0, 0, 0, 0);
suspend;
end^


ALTER PROCEDURE REGISTRE_ITEM_FACTURA_WEB (
    ID INTEGER,
    ARTICULO VARCHAR(20),
    BARRAS VARCHAR(20),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    DTOP NUMERIC(9,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    REFER VARCHAR(60))
RETURNS (
    ITEM INTEGER,
    TOTALF NUMERIC(18,2))
AS
declare variable DESCRIP VARCHAR(60);
declare variable BOD VARCHAR(2);
declare variable AGENCIA INTEGER;
declare variable LISTA INTEGER;
declare variable IVAP NUMERIC(9,2);
begin
SELECT ARTI_DES, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
    WHERE ARTI_COD = :articulo AND A.taiv_cod = T.taiv_cod
    INTO :descrip, :IVAP;
SELECT FIRST 1 BODE_COD, P.sucu_id FROM BODEGA B, PREFIJOS P, factura_web F
    WHERE F.facw_pref = P.pref_pre AND F.facw_id = :ID AND ((P.sucu_id = B.sucu_id) or (B.sucu_id = 0)) AND P.tido_cod = 31
    INTO :BOD, :agencia;
SELECT FIRST 1 LIPR_COD FROM lista_precios L WHERE SUCU_ID = :agencia AND L.lipr_predet = 'S' INTO :LISTA;
insert into FACTURA_WEB_DETALLE (FACW_ID, FAWD_ITEM, ARTI_COD, FAWD_CODBAR, BODE_COD, FAWD_REFERENCIA, FAWD_CANT,
                                 FAWD_UNIDAD, FAWD_FACTOR, LIPR_COD, FAWD_PRUNIT, FAWD_DTOP, FAWD_DTOM, FAWD_DTO1,
                                 FAWD_DTO1M, FAWD_DTO2, FAWD_DTO2M, FAWD_DTO3, FAWD_DTO3M, FAWD_IVAP, FAWD_IVAMONTO,
                                 FAWD_CONSUMO, FAWD_TOTAL, FAWD_DESC, FAWD_OBS, FAWD_INALCP, FAWD_INALCM)
values (:ID, NULL, :articulo, :BARRAS, :BOD, :refer, :CANT, :UNIDAD,
        1, :lista, :PRUNIT, :DTOP, 0, 0, 0, 0, 0, 0, 0, :IVAP, :IVA, :CONSUMO, :TOTAL, :DESCRIP, NULL, 0, 0);
/* DEVUELVA EL TOTAL */

SELECT SUM(fawd_total) FROM factura_web_DETALLE WHERE FACW_ID = :id INTO :TOTALF;
SELECT MAX(FAWD_ITEM) FROM factura_web_detalle WHERE FACW_ID = :ID INTO :ITEM;
suspend;
end^


ALTER PROCEDURE REGISTRE_REGIAUTO (
    CODIGO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER,
    DIA INTEGER,
    NUMERO VARCHAR(8),
    PORC NUMERIC(9,4),
    CONC VARCHAR(60),
    REF VARCHAR(8))
RETURNS (
    ID INTEGER)
AS
declare variable TIPO CHAR(3);
declare variable PREF VARCHAR(4);
declare variable CONCEPTO VARCHAR(4);
declare variable CUENTA VARCHAR(20);
declare variable CTABASE VARCHAR(20);
declare variable BASE CHAR(3);
declare variable PORCITEM NUMERIC(9,4);
declare variable MONTO NUMERIC(18,2);
declare variable AUX NUMERIC(18,2);
declare variable DB CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable FECHA CHAR(8);
declare variable I INTEGER;
declare variable CTACIERRE VARCHAR(20);
declare variable SUMA NUMERIC(18,2);
declare variable ANOINI CHAR(4);
declare variable MESINI INTEGER;
declare variable ANOFIN CHAR(4);
declare variable MESFIN INTEGER;
declare variable OK CHAR(1);
declare variable VENCE CHAR(1);
begin
EXECUTE PROCEDURE compone_fecha_conta (ANO, MES, DIA) returning_values (FECHA);
execute procedure cambie_id_comproba returning_values(:ID);
SELECT TICO_COD, PRCO_PREF FROM registro_automatico WHERE REAU_COD = :CODIGO INTO :TIPO, :PREF;
insert into comprobante_encabezado (tico_cod, prco_pref, enco_consec, enco_numero, enco_fecha, enco_concepto, enco_refer, enco_tiporef, enco_idref)
    values (:TIPO, :PREF, :ID, :NUMERO, :FECHA, :CONC, :REF, 0, 0);
I = 1;
SUMA = 0;
FOR SELECT CONC_COD FROM REGISTRO_CONCEPTOS WHERE REAU_COD = :CODIGO ORDER BY RECO_ITEM INTO :CONCEPTO
    DO
    BEGIN
    SELECT CONC_CTACIERRE, CONC_ANOINI, CONC_MESINI, CONC_ANOFIN, CONC_MESFIN, CONC_VENCE FROM CONCEPTOS WHERE CONC_COD = :CONCEPTO
        INTO :CTACIERRE, :ANOINI, :MESINI, :ANOFIN, :MESFIN, :VENCE;
    if (VENCE = 'S') then
        BEGIN
        OK = 'N';
        if (ANOINI = ANO) then
            BEGIN
            if (MESINI <= MES) then
                OK = 'S';
            END
        ELSE
            if (anoini < ANO) then
                OK = 'S';
        if (OK = 'S') then
            BEGIN
            OK= 'N';
            if (ANOFIN = ANO) then
                BEGIN
                if (MESFIN >= MES) then
                    OK = 'S';
                end
            ELSE
                if (ANOFIN > ANO) then
                    OK = 'S';
            END
        END
    ELSE
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        FOR SELECT CUEN_COD, COCU_CUENTABASE, COCU_BASE, COCU_PORC, COCU_MONTO, COCU_DEBITO, TERC_NIT, PROY_COD, CENT_COD
            FROM CONCEPTOS_CUENTAS WHERE CONC_COD = :CONCEPTO ORDER BY COCU_ITEM INTO
            :CUENTA, :CTABASE, :BASE, :PORCITEM, :MONTO, :DB, :NIT, :PROY, :CENTRO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                if (DB = 'S') then
                    BEGIN
                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
                      VALUES (:ID, :I, :CUENTA, :NIT, :PROY, :CENTRO, :conc, :REF, :MONTO, 100, :MONTO, 0);
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
                      VALUES (:ID, :I, :CUENTA, :NIT, :PROY, :CENTRO, :conc, :REF, :MONTO*-1, 100, 0, :MONTO);
                    SUMA = SUMA - MONTO;
                    END
                I = I + 1;
                END
            ELSE
                BEGIN
                if (BASE = 'INI') then
                    EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTABASE, :ANO, :MES, 'S') returning_values (:MONTO);
                if (BASE = 'FIN') then
                    EXECUTE PROCEDURE SALDO_CUENTA_MES(:CTABASE, :ANO, :MES, 'N') returning_values (:MONTO);
                if (BASE = 'DEB') then
                    EXECUTE PROCEDURE movimiento_cuenta_mes(:CTABASE, :ANO, :MES, 'S') returning_values (:MONTO);
                if (BASE = 'CRE') then
                    EXECUTE PROCEDURE movimiento_cuenta_mes(:CTABASE, :ANO, :MES, 'N') returning_values (:MONTO);
                if (BASE = 'NET') then
                    BEGIN
                    EXECUTE PROCEDURE movimiento_cuenta_mes(:CTABASE, :ANO, :MES, 'S') returning_values (:MONTO);
                    EXECUTE PROCEDURE movimiento_cuenta_mes(:CTABASE, :ANO, :MES, 'N') returning_values (:AUX);
                    MONTO = MONTO - AUX;
                    END
                if (monto <> 0) then
                    BEGIN
                    if (PORC <> 0) then
                        PORCITEM = PORC;
                    AUX = MONTO * PORCITEM / 100;
                    if (AUX IS NULL) then
                        AUX = 0;
                    if (AUX <> 0) then
                        BEGIN
                        if (DB = 'S') then
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
                              VALUES (:ID, :I, :CUENTA, :NIT, :PROY, :CENTRO, :conc, :REF, :MONTO, :PORCITEM, ABS(:AUX), 0);
                            SUMA = SUMA + ABS(AUX);
                            END
                        ELSE
                            BEGIN
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
                              VALUES (:ID, :I, :CUENTA, :NIT, :PROY, :CENTRO, :conc, :REF, :MONTO, :PORCITEM, 0, ABS(:AUX));
                            SUMA = SUMA - ABS(AUX);
                            END
                        I = I + 1;
                        END
                    END
                END
            END
        END
    END
if (SUMA <> 0) then
    if (SUMA > 0) then
        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
            VALUES (:ID, :I, :CTACIERRE, :NIT, :PROY, :CENTRO, :conc, :REF, 0, 0, 0, ABS(:SUMA));
    ELSE
        INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO)
            VALUES (:ID, :I, :CTACIERRE, :NIT, :PROY, :CENTRO, :conc, :REF, 0, 0, ABS(:SUMA), 0);
suspend;
end^


ALTER PROCEDURE REMISIONES_COSTO_CERO
RETURNS (
    ID INTEGER,
    ITEM INTEGER,
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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^


ALTER PROCEDURE RENGLON_NOVEDAD_APORTES (
    IDDOC INTEGER,
    SECINT INTEGER,
    FECLIQ DATE,
    DATOS1 VARCHAR(685) CHARACTER SET ISO8859_1,
    NITEMPL VARCHAR(20),
    PRIVEZ CHAR(1),
    IDNOV INTEGER,
    ITEM INTEGER,
    PPAGO INTEGER,
    PERNOV INTEGER,
    TIPONOV INTEGER,
    DIAINI INTEGER,
    DURA INTEGER,
    PRORROGA CHAR(1))
RETURNS (
    DATOS VARCHAR(686) CHARACTER SET ISO8859_1,
    PRIVEZN CHAR(1),
    SECINTN INTEGER)
AS
declare variable TIPOCOT varchar(2);
declare variable STIPOCOT varchar(2);
declare variable FECING date;
declare variable FECRET date;
declare variable FECNOV1 date;
declare variable DURA2 integer;
declare variable NOVEDAD varchar(1);
declare variable CODADMIN varchar(6);
declare variable DIASLAB varchar(3);
declare variable SALBASIC varchar(22);
declare variable IBCEPS numeric(18,2);
declare variable IBCAFP numeric(18,2);
declare variable IBCARL numeric(18,2);
declare variable IBCCCF numeric(18,2);
declare variable VRFSP numeric(18,2);
declare variable POREPS numeric(18,2);
declare variable PORAFP numeric(18,2);
declare variable PORCCF numeric(18,2);
declare variable PORCOT numeric(18,2);
declare variable SMMLV numeric(18,2);
declare variable TARARL numeric(10,5);
declare variable CODTAR integer;
declare variable INCAP varchar(2);
declare variable PORCAPOR varchar(9);
declare variable COTOBL varchar(14);
declare variable APORINC numeric(18,2);
declare variable SEC VARCHAR(5);
declare variable FECFIN DATE;
declare variable FECFINN DATE;
begin
FECFIN = cast(:fecliq as date) - extract(day from cast(:FECLIQ as date)) + 32 - extract(day from (cast(:FECLIQ as date) - extract(day from cast(:FECLIQ as date)) + 32));
    select P.paan_salminimo from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :smmlv;
    SECINTN = SECINT + 1;
    execute procedure CAF(cast(SECINTN as varchar(5)), 5, 'N') returning_values (:SEC);
    DATOS = '02' || :SEC;
    DATOS = DATOS || right(DATOS1, STRLEN(DATOS1) - 7);
    PRIVEZN = PRIVEZ;
    select E.STCO_COD, E.tcot_cod, E.EMPL_FECING, E.EMPL_FECRET
          from EMPLEADOS E where E.TERC_NIT = :nitempl
          into :STIPOCOT, :TIPOCOT, FECING, :FECRET;
    execute procedure CAF(:STIPOCOT, 2, 'N') returning_values (:STIPOCOT);
    EXECUTE PROCEDURE fecha_periodo_pago (:ppago, SUBSTR(:FECLIQ, 1, 4), :pernov, :diaini) returning_values (fecnov1);
    /* 21-VARIACION PERMANENTE SALARIO */
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 22-CAMBIO TARIFA ESPECIAL*/
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 23-VARIACION TRANSITORIA */
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* BUSQUE LA SIGUIENTE NOVEDAD SI ES PROROGA, SUME LOS DIAS DE DURACION */
    FOR select ND.nnde_duracion, ND.nnde_prorroga from NOMINA_NOVEDADES NN,  nomina_novedades_detalle ND
        where NN.nono_id = ND.nono_id AND NN.TERC_NIT = :NITEMPL AND (ND.nnde_ano = SUBSTR(:FECLIQ, 1, 4)) and
        (((NN.nono_ppago = 1) AND (ND.nnde_periodo = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER))) or ((NN.nono_ppago = 2) AND
        ((ND.nnde_periodo = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)
        or (ND.nnde_periodo+1 = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)))) and
        ((nn.nono_id <> :idnov) or (ND.nnde_item <> :ITEM)) and nd.nnde_periodo >= :pernov and nd.nnde_diaini > :diaini
        ORDER BY ND.nnde_ano, ND.nnde_periodo, ND.nnde_diaini
        INTO :DURA2, :prorroga
        do
        if (PRORROGA = 'S') then
            DURA = DURA + DURA2;
        ELSE
            BREAK;
    /* 24-SUSPENCION O LNR */
    if ((tiponov = 9) or (tiponov = 13)) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 25-INCAPACIDAD POR EG */
    if (tiponov = 2) then
        NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 26-LICENCIA MATERNIDAD */
    if (tiponov = 4) then
      NOVEDAD = 'X';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 27-VACACIONES */
    if (TIPONOV = 6) then
      NOVEDAD = 'X';
    else if (TIPONOV = 12) then
      NOVEDAD = 'L';
    else
      NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 28-APORTE VOLUNTARIO */
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 29-VARIACION CENTROS TRABAJO */
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 30-DIAS INCAPACIDAD PROFESIONAL */
    if (TIPONOV = 3) then
        execute procedure CAF(:dura, 2, 'N') returning_values (:INCAP);
    else
        INCAP = '  ';
    DATOS = :DATOS || :INCAP;
    /* 31-CODIGO AFP */
    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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 32-CODIGO NUEVA AFP */
    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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 33-CODIGO EPS */
    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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 34-CODIGO NUEVA EPS */
    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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 35-CODIGO CCF */
    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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 36-DIAS PENSION */
    if ((STIPOCOT = '00') AND (TIPOCOT <> '12') AND (TIPOCOT <> '19')) then
      DIASLAB = DURA;
    else
      DIASLAB = '00';
    if (:DIASLAB is null) then
      DIASLAB = '00';
    execute procedure CAF(:DIASLAB, 2, 'N') returning_values (:DIASLAB);
    DATOS = :DATOS || :DIASLAB;
    /* 37-DIAS EPS */
    DIASLAB = DURA;
    if (:DIASLAB is null) then
      DIASLAB = '00';
    execute procedure CAF(:DIASLAB, 2, 'N') returning_values (:DIASLAB);
    DATOS = :DATOS || :DIASLAB;
    /* 38-DIAS ARP */
    DATOS = :DATOS || :DIASLAB;
    /* 39-DIAS CCF */
    DATOS = :DATOS || :DIASLAB;
    /* 40-SALARIO BASE */
    select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITEMPL and
        M.MVSE_FECHA <= :fecnov1 order by M.MVSE_FECHA desc
        into :SALBASIC;
    if (:SALBASIC is null) then
      SALBASIC = '0';
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 41-SALARIO INTEGRAL */
    if (exists (select TERC_NIT from EMPLEADOS where TERC_NIT = :nitempl and EMPL_SALINTEG = 'S')) then
        DATOS = :DATOS || 'X';
    else
        DATOS = :DATOS || ' ';
    /* 42-IBC PENSION */
    execute procedure ibc_aporte(:nitempl, :iddoc, 'EPS') returning_values (:IBCAFP);
    IBCAFP = IBCAFP * DURA / 30;
    SALBASIC = IBCAFP;
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 43-IBC EPS */
    execute procedure ibc_aporte(:nitempl, :iddoc, 'EPS') returning_values (:ibceps);
    IBCEPS = IBCEPS * DURA / 30;
    SALBASIC = IBCEPS;
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 44-IBC ARL */
--    execute procedure ibc_aporte(:nitempl, :iddoc, 'ARL') returning_values (:IBCARL);
    execute procedure ibc_aporte(:nitempl, :iddoc, 'EPS') returning_values (:ibcarl);
    IBCARL = IBCARL * DURA / 30;
    SALBASIC = IBCARL;
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 45-IBC CCF */
    execute procedure ibc_aporte(:nitempl, :iddoc, 'EPS') returning_values (:IBCCCF);
    IBCCCF = IBCCCF * DURA / 30;
    SALBASIC = IBCCCF;
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 46-TARIFA AFP  */
    select (P.PAAN_AFPTR + P.PAAN_AFPEM)/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
        into :PORAFP;
    execute procedure CAF(:PORAFP, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 47-COTIZACION PENSIONES */
    if ((STIPOCOT = '00') AND (TIPOCOT <> '12') AND (TIPOCOT <> '19')) then
        COTOBL = '0';
    else
        COTOBL = IBCAFP * PORAFP;
    if (:COTOBL is null) then
      COTOBL = '0';
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 48-APORTE VOLUNTARIO EMPLEADO */
    COTOBL = '0';
    if (PRIVEZ = 'S') then
        BEGIN
        select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
            and (NC.conc_cod = 965) and NC.terc_nit = :nitempl
            into :COTOBL;
        if (:COTOBL is null) then
          COTOBL = '0';
        execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
        PRIVEZN = 'N';
        END
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 49-APORTE VOLUNTARIO EMPLEADOR */
    COTOBL = '0';
    if (PRIVEZ = 'S') then
        BEGIN
        select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
            and (NC.conc_cod = 964) and NC.terc_nit = :nitempl
            into :COTOBL;
        if (:COTOBL is null) then
          COTOBL = '0';
        execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
        PRIVEZN = 'N';
        END
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 50-TOTAL APORTE LO CALCULA EL SISTEMA*/
    DATOS = :DATOS || '000000000';
    /* 51-APORTE FSP-SOLIDARIDAD 50% */
    COTOBL = '0';
    select sum(NC.noco_valor/-2) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and (NC.conc_cod = 921) and NC.terc_nit = :nitempl
        into :VRFSP;
    if (:VRFSP is null) then
      VRFSP = 0;
    COTOBL = VRFSP * DURA / 30;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 52-APORTE FSP-SUBSISTENCIA 50% */
    DATOS = :DATOS || :COTOBL;
    /* 53-VALOR NO RET. X APORTE VOLUNTARIO */
    DATOS = :DATOS || '000000000';
    /* 54-TARIFA SALUD */
    if (EXISTS (select NOMI_ID from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and ((NC.conc_cod = 914) or (NC.conc_cod = 915) or (conc_cod = 938) or (CONC_COD = 1016)) and NC.terc_nit = :nitempl)) then
        select (P.PAAN_EPSTR + P.PAAN_EPSEM)/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :POREPS;
    else
        select (P.PAAN_EPSTR)/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :POREPS;
    execute procedure CAF(:POREPS, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 55-VR COTIZADO SALUD */
    COTOBL = IBCEPS * POREPS;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 56-UPC ADICIONAL */
    DATOS = :DATOS || '000000000';
    /* 57-NRO AUTORIZACION IEG */
    DATOS = :DATOS || '               ';
    /* 58-VR INCAPACIDAD AUTORIZADA */
    DATOS = :DATOS || '000000000';
    /* 59-NRO AUTORIZACION LIC.MAT. */
    DATOS = :DATOS || '               ';
    /* 60-VALOR LIC. MATERNIDAD */
    DATOS = :DATOS || '000000000';
    /* 61-TARIFA RIESGOS */
    TARARL = null;
    select first 1 cast(dpto_tararp as double precision)/100 from empleado_conceptos C, departamento D, empleados E
        where d.dpto_cod = e.empl_dpto and E.terc_nit = :nitempl and E.terc_nit = C.terc_nit and
    ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) into :TARARL;
    execute procedure CAF(:TARARL, 9, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 62-CODIGO CENTRO TRABAJO */
    DATOS = :DATOS || '000000000';
    /* 63-APORTE ARL */
    if ((tiponov = 2) or (tiponov = 4) or (tiponov = 6)) then
        COTOBL = 0;
    else
        COTOBL = IBCARL * TARARL;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 64-TARIFA CCF */
    select P.PAAN_CCF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCCF;
    PORCAPOR = SUBSTR(PORCCF, 1, STRLEN(PORCCF) - 2);
    execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 65-APORTE CCF */
    COTOBL = IBCCCF * PORCCF;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N')
        returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 66-TARIFA SENA */
    COTOBL = '0';
    APORINC = 0;
    select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and ((NC.conc_cod = 918) or (NC.conc_cod = 919) or (NC.conc_cod = 940) or (NC.conc_cod = 1018)) and NC.terc_nit = :nitempl
        into :aporinc;
    if (aporinc IS NULL) then
        aporinc = 0;
    if (aporinc <> 0) then
        select P.PAAN_SENA/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCAPOR;
    else
        PORCAPOR = '0';
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 67-APORTE SENA */
    if (aporinc IS NULL) then
        select P.PAAN_SENA/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCOT;
    ELSE
        PORCOT = 0;
    COTOBL = IBCCCF * PORCOT;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 68-TARIFA ICBF */
    COTOBL = '0';
    APORINC = 0;
    select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and ((NC.conc_cod = 916) or (NC.conc_cod = 917) or (NC.conc_cod = 939) or (NC.conc_cod = 1017)) and NC.terc_nit = :nitempl
        into :aporinc;
    if (aporinc IS NULL) then
        aporinc = 0;
    if (aporinc <> 0) then
        select P.PAAN_ICBF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCOT;
    else
        PORCOT = 0;
    PORCAPOR = PORCOT;
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 69-APORTE ICBF */
    if (aporinc IS NULL) then
        select P.PAAN_ICBF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCOT;
    ELSE
        PORCOT = 0;
    COTOBL = IBCCCF * PORCOT;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 70-TARIFA ESAP */
    select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and (NC.conc_cod = 947) and NC.terc_nit = :nitempl
        into :aporinc;
    if (aporinc IS NULL) then
        aporinc = 0;
    if (aporinc <> 0) then
        BEGIN
        select conc_porc from conceptos_nomina P where CONC_COD = 947 into :PORCAPOR;
        PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
        END
    else
        PORCAPOR = '0';
    execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 71-APORTE ESAP */
    COTOBL = APORINC;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 72-TARIFA MEN */
    select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and (NC.conc_cod = 946) and NC.terc_nit = :nitempl
        into :aporinc;
    if (aporinc IS NULL) then
        aporinc = 0;
    if (aporinc <> 0) then
        BEGIN
        select conc_porc from conceptos_nomina P where CONC_COD = 946 into :PORCAPOR;
        PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
        END
    else
        PORCAPOR = '0';
    execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 73-APORTE MEN */
    COTOBL = APORINC;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    COTOBL = 0;
    /* 74-TIPO ID COTIZANTE PRINCIPAL SI ES UPC ADICIONAL */
    DATOS = :DATOS || '  ';
    /* 75-ID COTIZANTE PRINCIPAL SI ES UPC ADICIONAL */
    DATOS = :DATOS || '                ';
    /* 76-EXONERADO PAGO SALUD */
    if (IBCEPS > (SMMLV * 10)) then
        DATOS = :DATOS || 'N';
    else
        DATOS = :DATOS || 'S';
    /* 77-CODIGO ARL */
    CODADMIN = '';
    select A.admi_codarp from ADMINISTRADORA A, EMPLEADOS E where E.EMPL_ARP = A.TERC_NIT and E.TERC_NIT = :NITEMPL
        into :CODADMIN;
    if (:CODADMIN is null) then
      CODADMIN = ' ';
    execute procedure CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 78-RIESGO LABORAL */
    CODTAR = '1';
    tararl = tararl * 100;
    SELECT TARL_ID FROM TARIFAS_ARL WHERE TARL_TARIFA = :TARARL INTO :CODTAR;
    DATOS = :DATOS || :CODTAR;
    /* 79-ALTO RIESGO */
    if (EXISTS(SELECT E.terc_nit FROM EMPLEADOS E WHERE E.terc_nit = :nitempl AND E.empl_altoriesgo = 'S')) then
        DATOS = :DATOS || '1';
    else
        DATOS = :DATOS || ' ';
    /* 80-fecha ingreso */
    if ((SUBSTR(:FECING, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
        (SUBSTR(:FECING, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
      DATOS = :DATOS || substring(fecing from 1 for 4) || '-' || substring(fecing from 6 for 2) || '-' || substring(fecing from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 81-fecha retiro */
    if ((SUBSTR(:fecret, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
        (SUBSTR(:fecret, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
      DATOS = :DATOS || substring(fecret from 1 for 4) || '-' || substring(fecret from 6 for 2) || '-' || substring(fecret from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 82-fecha variacion salario */
    DATOS = :DATOS || '          ';
    /* 83-fecha INICIO SLN */
    FECFINN =fecnov1+dura;
    if (FECFINN > FECFIN) then
        FECFINN = FECFIN;
    if ((tiponov = 9) or (tiponov = 13)) then
      DATOS = :DATOS || substring(fecnov1 from 1 for 4) || '-' || substring(fecnov1 from 6 for 2) || '-' || substring(fecnov1 from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 84-fecha FIN SLN */
    if ((tiponov = 9) or (tiponov = 13)) then
      DATOS = :DATOS || substring(fecfinn from 1 for 4) || '-' || substring(fecfinn from 6 for 2) || '-' || substring(fecfinn from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 85-fecha ini IEG */
    if (tiponov = 2) then
      DATOS = :DATOS || substring(fecnov1 from 1 for 4) || '-' || substring(fecnov1 from 6 for 2) || '-' || substring(fecnov1 from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 86-fecha fin IEG */
    if (tiponov = 2) then
        DATOS = :DATOS || substring (fecfinn from 1 for 4) || '-' || substring(fecfinn from 6 for 2) || '-' || substring(fecfinn from 9 for 2);
    ELSE
        DATOS = :DATOS || '          ';
    /* 87-fecha ini LMA */
    if (tiponov = 4) then
      DATOS = :DATOS || substring(fecnov1 from 1 for 4) || '-' || substring(fecnov1 from 6 for 2) || '-' || substring(fecnov1 from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 88-fecha fin LMA */
    if (tiponov = 4) then
      DATOS = :DATOS || substring(fecfinn from 1 for 4) || '-' || substring(fecfinn from 6 for 2) || '-' || substring(fecfinn from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 89-fecha ini VAC-LR */
    if ((tiponov = 6) or (tiponov = 12)) then
      DATOS = :DATOS || substring(fecnov1 from 1 for 4) || '-' || substring(fecnov1 from 6 for 2) || '-' || substring(fecnov1 from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 90-fecha fin VAC-LR */
    if ((tiponov = 6) or (tiponov = 12)) then
      DATOS = :DATOS || substring(fecfinn from 1 for 4) || '-' || substring(fecfinn from 6 for 2) || '-' || substring(fecfinn from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 91-fecha ini VCT */
    DATOS = :DATOS || '          ';
    /* 92-fecha fin VCT */
    DATOS = :DATOS || '          ';
    /* 93-fecha ini IRL */
    if (tiponov = 3) then
      DATOS = :DATOS || substring(fecnov1 from 1 for 4) || '-' || substring(fecnov1 from 6 for 2) || '-' || substring(fecnov1 from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 94-fecha fin IRL */
    if (tiponov = 3) then
      DATOS = :DATOS || substring(fecfinn from 1 for 4) || '-' || substring(fecfinn from 6 for 2) || '-' || substring(fecfinn from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 95-IBC otros parafiscales */
    SALBASIC = IBCCCF;
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 96-Horas laboradas: reporta 0 en novedades */
    DATOS = :DATOS || '000';
    /* 97-Fecha radicacion en el exterior */
    DATOS = :DATOS || '          ';
    SUSPEND;
end^


ALTER PROCEDURE RENGLON_VS_APORTES (
    IDDOC INTEGER,
    FECLIQ DATE,
    DATOS1 VARCHAR(685),
    NITEMPL VARCHAR(20),
    PRIVEZ CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PPAGO INTEGER,
    PERNOV INTEGER,
    TIPONOV INTEGER,
    DIAINI INTEGER)
RETURNS (
    DATOS VARCHAR(686),
    PRIVEZN CHAR(1))
AS
declare variable STIPOCOT varchar(2);
declare variable FECING date;
declare variable FECRET date;
declare variable FECNOV1 date;
declare variable NOVEDAD varchar(1);
declare variable CODADMIN varchar(6);
declare variable DIASLAB VARCHAR(3);
declare variable DIASL INTEGER;
declare variable SALBASIC varchar(22);
declare variable IBCEPS NUMERIC(18,2);
declare variable IBCAFP NUMERIC(18,2);
declare variable IBCARL NUMERIC(18,2);
declare variable IBCCCF NUMERIC(18,2);
declare variable VRFSP NUMERIC(18,2);
declare variable POREPS NUMERIC(18,2);
declare variable PORAFP NUMERIC(18,2);
declare variable PORCCF NUMERIC(18,2);
declare variable PORCOT NUMERIC(18,2);
declare variable SMMLV NUMERIC(18,2);
declare variable TARARL NUMERIC(18,2);
declare variable CODTAR INTEGER;
declare variable INCAP varchar(2);
declare variable PORCAPOR varchar(9);
declare variable COTOBL varchar(14);
declare variable DIASAU INTEGER;
declare variable APORINC NUMERIC(18,2);
begin
select P.paan_salminimo from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :smmlv;
DATOS = DATOS1;
select E.STCO_COD, E.EMPL_FECING, E.EMPL_FECRET
      from EMPLEADOS E where E.TERC_NIT = :nitempl
      into :STIPOCOT, :FECING, :FECRET;
EXECUTE PROCEDURE fecha_periodo_pago (:ppago, SUBSTR(:FECLIQ, 1, 4), :pernov, :diaini) returning_values (fecnov1);
if (fecnov1 > fecini) then
    BEGIN
    /* HAY DOS REGLONES, HAGA EL ANTERIOR A LA NOVEDAD */
    DIASAU = 0;
    SELECT SUM(ND.nnde_duracion) from NOMINA_NOVEDADES NN,  nomina_novedades_detalle ND
        where NN.nono_id = ND.nono_id AND NN.TERC_NIT = :NITEMPL AND (ND.nnde_ano = SUBSTR(:FECLIQ, 1, 4)) and
          (((NN.nono_ppago = 1) AND (ND.nnde_periodo = SUBSTR(:FECLIQ, 6, 7))) or ((NN.nono_ppago = 2) AND ((ND.nnde_periodo = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)
            or (ND.nnde_periodo+1 = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)))) AND NN.nono_fecha < :FECNOV1
          and ((NN.TNOV_COD = 2) OR (NN.TNOV_COD = 3) OR (NN.TNOV_COD = 4) OR (NN.TNOV_COD = 6) or (NN.TNOV_COD = 9) OR (NN.TNOV_COD = 12) OR (NN.TNOV_COD = 13))
          INTO :DIASAU;
    if (DIASAU IS NULL) then
        DIASAU = 0;
    /* 21-VARIACION PERMANENTE SALARIO */
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 22-CAMBIO TARIFA ESPECIAL*/
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 23-VARIACION TRANSITORIA */
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 24-SUSPENCION O LNR */
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 25-INCAPACIDAD POR EG */
    NOVEDAD = ' ';
    /* 26-LICENCIA MATERNIDAD */
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 27-VACACIONES */
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 28-APORTE VOLUNTARIO */
    NOVEDAD = ' ';
    /* 29-VARIACION CENTROS TRABAJO */
    NOVEDAD = ' ';
    DATOS = :DATOS || :NOVEDAD;
    /* 30-DIAS INCAPACIDAD PROFESIONAL */
    INCAP = '  ';
    DATOS = :DATOS || :INCAP;
    /* 31-CODIGO AFP */
    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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 32-CODIGO NUEVA AFP */
    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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 33-CODIGO EPS */
    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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 34-CODIGO NUEVA EPS */
    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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 35-CODIGO CCF */
    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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 36-DIAS PENSION */
    if (STIPOCOT <> '  ') then
      DIASLAB = '00';
    else
      DIASLAB = (FECNOV1-FECINI)-DIASAU;
    if (:DIASLAB is null) then
      DIASLAB = '00';
    execute procedure CAF(:DIASLAB, 2, 'N') returning_values (:DIASLAB);
    DATOS = :DATOS || :DIASLAB;
    /* 37-DIAS EPS */
    DATOS = :DATOS || :DIASLAB;
    /* 38-DIAS ARP */
    DATOS = :DATOS || :DIASLAB;
    /* 39-DIAS CCF */
    DATOS = :DATOS || :DIASLAB;
    /* 40-SALARIO BASE */
    select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITEMPL and
        M.MVSE_FECHA < :fecnov1 order by M.MVSE_FECHA desc
        into :SALBASIC;
    if (:SALBASIC is null) then
      SALBASIC = '0';
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 41-SALARIO INTEGRAL */
    if (exists (select TERC_NIT from EMPLEADOS where TERC_NIT = :nitempl and EMPL_SALINTEG = 'S')) then
        DATOS = :DATOS || 'X';
    else
        DATOS = :DATOS || ' ';
    /* 42-IBC PENSION */
    execute procedure ibc_aporte(:nitempl, :iddoc, 'AFC') returning_values (:IBCAFP);
    DIASL = (FECNOV1-FECINI)-DIASAU;
    IBCAFP = IBCAFP * DIASL / 30;
    SALBASIC = IBCAFP;
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 5);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 43-IBC EPS */
    execute procedure ibc_aporte(:nitempl, :iddoc, 'EPS') returning_values (:ibceps);
    IBCEPS = IBCEPS * DIASL / 30;
    SALBASIC = IBCEPS;
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 5);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 44-IBC ARL */
    execute procedure ibc_aporte(:nitempl, :iddoc, 'ARP') returning_values (:IBCARL);
    IBCARL = IBCARL * DIASL / 30;
    SALBASIC = IBCARL;
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 5);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 45-IBC CCF */
    execute procedure ibc_aporte(:nitempl, :iddoc, 'CCF') returning_values (:IBCCCF);
    IBCCCF = IBCCCF * DIASL / 30;
    SALBASIC = IBCCCF;
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 5);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 46-TARIFA AFP  */
    select (P.PAAN_AFPTR + P.PAAN_AFPEM)/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
        into :PORAFP;
    execute procedure CAF(:PORAFP, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 47-COTIZACION PENSIONES */
    COTOBL = IBCAFP * PORAFP;
    if (:COTOBL is null) then
      COTOBL = '0';
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 48-APORTE VOLUNTARIO EMPLEADO */
    COTOBL = '0';
    PRIVEZN = PRIVEZ;
    if (PRIVEZ = 'S') then
        BEGIN
        select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
            and (NC.conc_cod = 965) and NC.terc_nit = :nitempl
            into :COTOBL;
        if (:COTOBL is null) then
          COTOBL = '0';
        execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
        PRIVEZ = 'N';
        END
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 49-APORTE VOLUNTARIO EMPLEADOR */
    COTOBL = '0';
    if (PRIVEZ = 'S') then
        BEGIN
        select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
            and (NC.conc_cod = 964) and NC.terc_nit = :nitempl
            into :COTOBL;
        if (:COTOBL is null) then
          COTOBL = '0';
        execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
        PRIVEZN = 'N';
        END
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 50-TOTAL APORTE LO CALCULA EL SISTEMA*/
    DATOS = :DATOS || '000000000';
    /* 51-APORTE FSP-SOLIDARIDAD 50% */
    COTOBL = '0';
    select sum(NC.noco_valor/-2) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and (NC.conc_cod = 921) and NC.terc_nit = :nitempl
        into :vrfsp;
    if (:vrfsp is null) then
      vrfsp = '0';
    
    COTOBL = VRFSP * DIASL / 30;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 52-APORTE FSP-SUBSISTENCIA 50% */
    DATOS = :DATOS || :COTOBL;
    /* 53-VALOR NO RET. X APORTE VOLUNTARIO */
    DATOS = :DATOS || '000000000';
    /* 54-TARIFA SALUD */
    select (P.PAAN_EPSTR + P.PAAN_EPSEM)/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
        into :POREPS;
    execute procedure CAF(:POREPS, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 55-VR COTIZADO SALUD */
    COTOBL = IBCEPS * POREPS;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 56-UPC ADICIONAL */
    DATOS = :DATOS || '000000000';
    /* 57-NRO AUTORIZACION IEG */
    DATOS = :DATOS || '               ';
    /* 58-VR INCAPACIDAD AUTORIZADA */
    DATOS = :DATOS || '000000000';
    /* 59-NRO AUTORIZACION LIC.MAT. */
    DATOS = :DATOS || '               ';
    /* 60-VALOR LIC. MATERNIDAD */
    DATOS = :DATOS || '000000000';
    /* 61-TARIFA RIESGOS */
    TARARL = null;
    select max(C.CONC_PORC/100) from conceptos_nomina C, empleado_conceptos E where E.terc_nit = :nitempl and E.conc_cod = C.conc_cod and
        ((C.CONC_COD = 908) or (C.CONC_COD = 909) or (C.CONC_COD = 935) or (C.CONC_COD = 1013)) into :TARARL;
    if (TARARL is null) then
        begin
        select max(e.emco_porc/100) from conceptos_nomina C, empleado_conceptos E where E.terc_nit = :nitempl and E.conc_cod = C.conc_cod and
            ((C.CONC_COD = 908) or (C.CONC_COD = 909) or (C.CONC_COD = 935) or (C.CONC_COD = 1013)) into :TARARL;
        if (TARARL is null) then
            begin
            select dpto_tararp from empleado_conceptos C, departamento D, empleados E
                where d.dpto_cod = e.empl_dpto and E.terc_nit = :nitempl and E.terc_nit = C.terc_nit and
            ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) into :TARARL;
            end
        end
    execute procedure CAF(:TARARL, 9, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 62-CODIGO CENTRO TRABAJO */
    DATOS = :DATOS || '000000000';
    /* 63-APORTE ARL */
    COTOBL = IBCARL * TARARL;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 64-TARIFA CCF */
    select P.PAAN_CCF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCCF;
    PORCAPOR = SUBSTR(PORCCF, 1, STRLEN(PORCCF) - 2);
    execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 65-APORTE CCF */
    COTOBL = IBCCCF * PORCCF;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N')
        returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 66-TARIFA SENA */
    COTOBL = '0';
    APORINC = 0;
    select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and ((NC.conc_cod = 918) or (NC.conc_cod = 919) or (NC.conc_cod = 940) or (NC.conc_cod = 1018)) and NC.terc_nit = :nitempl
        INTO :APORINC;
    if (aporinc IS NULL) then
        aporinc = 0;
    if (aporinc <> 0) then
        select P.PAAN_SENA/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCAPOR;
    else
        PORCAPOR = '0';
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 67-APORTE SENA */
    if (aporinc IS NULL) then
        select P.PAAN_SENA/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCOT;
    ELSE
        PORCOT = 0;
    COTOBL = IBCCCF * PORCOT;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 68-TARIFA ICBF */
    COTOBL = '0';
    APORINC = 0;
    select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and ((NC.conc_cod = 916) or (NC.conc_cod = 917) or (NC.conc_cod = 939) or (NC.conc_cod = 1017)) and NC.terc_nit = :nitempl
        into :aporinc;
    if (aporinc IS NULL) then
        aporinc = 0;
    if (aporinc <> 0) then
        select P.PAAN_ICBF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCAPOR;
    else
        PORCAPOR = '0';
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 69-APORTE ICBF */
    if (aporinc IS NULL) then
        select P.PAAN_ICBF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCOT;
    ELSE
        PORCOT = 0;
    COTOBL = IBCCCF * PORCOT;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 70-TARIFA ESAP */
    COTOBL = '0';
    select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and (NC.conc_cod = 947) and NC.terc_nit = :nitempl
        into :COTOBL;
    if (:COTOBL is null) then
      COTOBL = '0';
    if (cotobl <> '0') then
        select conc_porc from conceptos_nomina P where CONC_COD = 947 into :PORCAPOR;
    else
        PORCAPOR = '0';
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 71-APORTE ESAP */
    select conc_porc from conceptos_nomina P where CONC_COD = 947 into :PORCOT;
    COTOBL = IBCCCF * PORCOT;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    /* 72-TARIFA MEN */
    COTOBL = '0';
    select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and (NC.conc_cod = 946) and NC.terc_nit = :nitempl
        into :COTOBL;
    if (:COTOBL is null) then
      COTOBL = '0';
    if (cotobl <> '0') then
        select conc_porc from conceptos_nomina P where CONC_COD = 946 into :PORCAPOR;
    else
        PORCAPOR = '0';
    PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
    execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
    DATOS = :DATOS || :PORCAPOR;
    /* 73-APORTE MEN */
    select conc_porc from conceptos_nomina P where CONC_COD = 946 into :PORCOT;
    COTOBL = IBCCCF * PORCOT;
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
    execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
    DATOS = :DATOS || :COTOBL;
    COTOBL = 0;
    /* 74-TIPO ID COTIZANTE PRINCIPAL SI ES UPC ADICIONAL */
    DATOS = :DATOS || '  ';
    /* 75-ID COTIZANTE PRINCIPAL SI ES UPC ADICIONAL */
    DATOS = :DATOS || '                ';
    /* 76-EXONERADO PAGO SALUD */
    if (((IBCEPS/DIASL)*30) > (SMMLV * 10)) then
        DATOS = :DATOS || 'N';
    else
        DATOS = :DATOS || 'S';
    /* 77-CODIGO ARL */
    CODADMIN = '';
    select A.admi_codarp from ADMINISTRADORA A, EMPLEADOS E where E.EMPL_ARP = A.TERC_NIT and E.TERC_NIT = :NITEMPL
        into :CODADMIN;
    if (:CODADMIN is null) then
      CODADMIN = ' ';
    execute procedure CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
    DATOS = :DATOS || :CODADMIN;
    /* 78-RIESGO LABORAL */
    CODTAR = '1';
    SELECT TARL_ID FROM TARIFAS_ARL WHERE TARL_TARIFA = :TARARL INTO :CODTAR;
    DATOS = :DATOS || :CODTAR;
    /* 79-ALTO RIESGO */
    if (EXISTS(SELECT E.terc_nit FROM EMPLEADOS E WHERE E.terc_nit = :nitempl AND E.empl_altoriesgo = 'S')) then
        DATOS = :DATOS || '1';
    else
        DATOS = :DATOS || ' ';
    /* 80-fecha ingreso */
    if ((SUBSTR(:FECING, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
        (SUBSTR(:FECING, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
      DATOS = :DATOS || substring(fecing from 1 for 4) || '-' || substring(fecing from 6 for 2) || '-' || substring(fecing from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 81-fecha retiro */
    if ((SUBSTR(:fecret, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
        (SUBSTR(:fecret, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
      DATOS = :DATOS || substring(fecret from 1 for 4) || '-' || substring(fecret from 6 for 2) || '-' || substring(fecret from 9 for 2);
    ELSE
      DATOS = :DATOS || '          ';
    /* 82-fecha variacion salario */
    DATOS = :DATOS || '          ';
    /* 83-fecha INICIO SLN */
    DATOS = :DATOS || '          ';
    /* 84-fecha FIN SLN */
    DATOS = :DATOS || '          ';
    /* 85-fecha ini IEG */
    DATOS = :DATOS || '          ';
    /* 86-fecha fin IEG */
    DATOS = :DATOS || '          ';
    /* 87-fecha ini LMA */
    DATOS = :DATOS || '          ';
    /* 88-fecha fin LMA */
    DATOS = :DATOS || '          ';
    /* 89-fecha ini VAC-LR */
    DATOS = :DATOS || '          ';
    /* 90-fecha fin VAC-LR */
    DATOS = :DATOS || '          ';
    /* 91-fecha ini VCT */
    DATOS = :DATOS || '          ';
    /* 92-fecha fin VCT */
    DATOS = :DATOS || '          ';
    /* 93-fecha ini IRL */
    DATOS = :DATOS || '          ';
    /* 94-fecha fin IRL */
    DATOS = :DATOS || '          ';
    /* 95-IBC otros parafiscales */
    SALBASIC = IBCCCF;
    SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 5);
    execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
    DATOS = :DATOS || :SALBASIC;
    /* 96-Horas laboradas: reporta 7 POR DIA YA QUE NO HAY HABILES - OJO REVISAR */
    DIASL = DIASL * 7;
    execute procedure CAF(:DIASL, 3, 'N') returning_values (:DIASLAB);
    DATOS = :DATOS || DIASLAB;
    /* 97-Fecha radicacion en el exterior */
    DATOS = :DATOS || '          ';
    SUSPEND;
    END
/* AHORA SI LA NOVEDAD */
DATOS = DATOS1;
/* HAY DOS REGLONES, HAGA EL ANTERIOR A LA NOVEDAD */
DIASAU = 0;
SELECT SUM(ND.nnde_duracion) from NOMINA_NOVEDADES NN,  nomina_novedades_detalle ND
    where NN.nono_id = ND.nono_id AND NN.TERC_NIT = :NITEMPL AND (ND.nnde_ano = SUBSTR(:FECLIQ, 1, 4)) and
      (((NN.nono_ppago = 1) AND (ND.nnde_periodo = SUBSTR(:FECLIQ, 6, 7))) or ((NN.nono_ppago = 2) AND ((ND.nnde_periodo = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)
        or (ND.nnde_periodo+1 = CAST(SUBSTR(:FECLIQ, 6, 7) AS INTEGER)*2)))) AND NN.nono_fecha >= :FECNOV1
      and ((NN.TNOV_COD = 2) OR (NN.TNOV_COD = 3) OR (NN.TNOV_COD = 4) OR (NN.TNOV_COD = 6) or (NN.TNOV_COD = 9) OR (NN.TNOV_COD = 12) OR (NN.TNOV_COD = 13))
      INTO :DIASAU;
if (DIASAU IS NULL) then
    DIASAU = 0;
/* 21-VARIACION PERMANENTE SALARIO */
if (tiponov = 8) then
  NOVEDAD = 'X';
else
  NOVEDAD = ' ';
DATOS = :DATOS || :NOVEDAD;
/* 22-CAMBIO TARIFA ESPECIAL*/
if (tiponov = 10) then
  NOVEDAD = 'X';
else
  NOVEDAD = ' ';
DATOS = :DATOS || :NOVEDAD;
/* 23-VARIACION TRANSITORIA */
if (tiponov = 11) then
  NOVEDAD = 'X';
else
  NOVEDAD = ' ';
DATOS = :DATOS || :NOVEDAD;
/* 24-SUSPENCION O LNR */
NOVEDAD = ' ';
DATOS = :DATOS || :NOVEDAD;
/* 25-INCAPACIDAD POR EG */
NOVEDAD = ' ';
/* 26-LICENCIA MATERNIDAD */
NOVEDAD = ' ';
DATOS = :DATOS || :NOVEDAD;
/* 27-VACACIONES */
NOVEDAD = ' ';
DATOS = :DATOS || :NOVEDAD;
/* 28-APORTE VOLUNTARIO */
NOVEDAD = ' ';
/* 29-VARIACION CENTROS TRABAJO */
if (TIPONOV = 7) then
    NOVEDAD = 'X';
ELSE
    NOVEDAD = ' ';
DATOS = :DATOS || :NOVEDAD;
/* 30-DIAS INCAPACIDAD PROFESIONAL */
INCAP = '  ';
DATOS = :DATOS || :INCAP;
/* 31-CODIGO AFP */
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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
DATOS = :DATOS || :CODADMIN;
/* 32-CODIGO NUEVA AFP */
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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
DATOS = :DATOS || :CODADMIN;
/* 33-CODIGO EPS */
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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
DATOS = :DATOS || :CODADMIN;
/* 34-CODIGO NUEVA EPS */
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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
DATOS = :DATOS || :CODADMIN;
/* 35-CODIGO CCF */
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 CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
DATOS = :DATOS || :CODADMIN;
/* 36-DIAS PENSION */
if (STIPOCOT <> '  ') then
  DIASLAB = '00';
else
  DIASLAB = (FECFIN - FECNOV1)-DIASAU;
if (:DIASLAB is null) then
  DIASLAB = '00';
execute procedure CAF(:DIASLAB, 2, 'N') returning_values (:DIASLAB);
DATOS = :DATOS || :DIASLAB;
/* 37-DIAS EPS */
DATOS = :DATOS || :DIASLAB;
/* 38-DIAS ARP */
DATOS = :DATOS || :DIASLAB;
/* 39-DIAS CCF */
DATOS = :DATOS || :DIASLAB;
/* 40-SALARIO BASE */
select first 1 M.MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where M.TERC_NIT = :NITEMPL and
    M.MVSE_FECHA <= :fecnov1 order by M.MVSE_FECHA desc
    into :SALBASIC;
if (:SALBASIC is null) then
  SALBASIC = '0';
SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
DATOS = :DATOS || :SALBASIC;
/* 41-SALARIO INTEGRAL */
if (exists (select TERC_NIT from EMPLEADOS where TERC_NIT = :nitempl and EMPL_SALINTEG = 'S')) then
    DATOS = :DATOS || 'X';
else
    DATOS = :DATOS || ' ';
/* 42-IBC PENSION */
execute procedure ibc_aporte(:nitempl, :iddoc, 'AFC') returning_values (:IBCAFP);
DIASL = (FECFIN - FECNOV1)-DIASAU;
IBCAFP = IBCAFP * DIASL / 30;
SALBASIC = IBCAFP;
SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 5);
execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
DATOS = :DATOS || :SALBASIC;
/* 43-IBC EPS */
execute procedure ibc_aporte(:nitempl, :iddoc, 'EPS') returning_values (:ibceps);
IBCEPS = IBCEPS * DIASL / 30;
SALBASIC = IBCEPS;
SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 5);
execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
DATOS = :DATOS || :SALBASIC;
/* 44-IBC ARL */
execute procedure ibc_aporte(:nitempl, :iddoc, 'ARP') returning_values (:IBCARL);
IBCARL = IBCARL * DIASL / 30;
SALBASIC = IBCARL;
SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 5);
execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
DATOS = :DATOS || :SALBASIC;
/* 45-IBC CCF */
execute procedure ibc_aporte(:nitempl, :iddoc, 'CCF') returning_values (:IBCCCF);
IBCCCF = IBCCCF * DIASL / 30;
SALBASIC = IBCCCF;
SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 5);
execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
DATOS = :DATOS || :SALBASIC;
/* 46-TARIFA AFP  */
select (P.PAAN_AFPTR + P.PAAN_AFPEM)/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
    into :PORAFP;
execute procedure CAF(:PORAFP, 7, 'P') returning_values (:PORCAPOR);
DATOS = :DATOS || :PORCAPOR;
/* 47-COTIZACION PENSIONES */
COTOBL = IBCAFP * PORAFP;
if (:COTOBL is null) then
  COTOBL = '0';
execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
/* 48-APORTE VOLUNTARIO EMPLEADO */
COTOBL = '0';
if (PRIVEZ = 'S') then
    BEGIN
    select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and (NC.conc_cod = 965) and NC.terc_nit = :nitempl
        into :COTOBL;
    if (:COTOBL is null) then
      COTOBL = '0';
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    END
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
/* 49-APORTE VOLUNTARIO EMPLEADOR */
COTOBL = '0';
if (PRIVEZ = 'S') then
    BEGIN
    select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
        and (NC.conc_cod = 964) and NC.terc_nit = :nitempl
        into :COTOBL;
    if (:COTOBL is null) then
      COTOBL = '0';
    execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
    END
PRIVEZ = 'N';
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
/* 50-TOTAL APORTE LO CALCULA EL SISTEMA*/
DATOS = :DATOS || '000000000';
/* 51-APORTE FSP-SOLIDARIDAD 50% */
COTOBL = '0';
select sum(NC.noco_valor/-2) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
    and (NC.conc_cod = 921) and NC.terc_nit = :nitempl
    into :vrfsp;
if (:vrfsp is null) then
  vrfsp = 0;
COTOBL = VRFSP * DIASL / 30;
execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
/* 52-APORTE FSP-SUBSISTENCIA 50% */
DATOS = :DATOS || :COTOBL;
/* 53-VALOR NO RET. X APORTE VOLUNTARIO */
DATOS = :DATOS || '000000000';
/* 54-TARIFA SALUD */
select (P.PAAN_EPSTR + P.PAAN_EPSEM)/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4)
    into :POREPS;
execute procedure CAF(:POREPS, 7, 'P') returning_values (:PORCAPOR);
DATOS = :DATOS || :PORCAPOR;
/* 55-VR COTIZADO SALUD */
COTOBL = IBCEPS * POREPS;
execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
/* 56-UPC ADICIONAL */
DATOS = :DATOS || '000000000';
/* 57-NRO AUTORIZACION IEG */
DATOS = :DATOS || '               ';
/* 58-VR INCAPACIDAD AUTORIZADA */
DATOS = :DATOS || '000000000';
/* 59-NRO AUTORIZACION LIC.MAT. */
DATOS = :DATOS || '               ';
/* 60-VALOR LIC. MATERNIDAD */
DATOS = :DATOS || '000000000';
/* 61-TARIFA RIESGOS */
TARARL = null;
select max(C.CONC_PORC/100) from conceptos_nomina C, empleado_conceptos E where E.terc_nit = :nitempl and E.conc_cod = C.conc_cod and
    ((C.CONC_COD = 908) or (C.CONC_COD = 909) or (C.CONC_COD = 935) or (C.CONC_COD = 1013)) into :TARARL;
if (TARARL is null) then
    begin
    select max(e.emco_porc/100) from conceptos_nomina C, empleado_conceptos E where E.terc_nit = :nitempl and E.conc_cod = C.conc_cod and
        ((C.CONC_COD = 908) or (C.CONC_COD = 909) or (C.CONC_COD = 935) or (C.CONC_COD = 1013)) into :TARARL;
    if (TARARL is null) then
        begin
        select dpto_tararp from empleado_conceptos C, departamento D, empleados E
            where d.dpto_cod = e.empl_dpto and E.terc_nit = :nitempl and E.terc_nit = C.terc_nit and
        ((CONC_COD = 908) or (CONC_COD = 909) or (CONC_COD = 935) or (CONC_COD = 1013)) into :TARARL;
        end
    end
execute procedure CAF(:TARARL, 9, 'P') returning_values (:PORCAPOR);
DATOS = :DATOS || :PORCAPOR;
/* 62-CODIGO CENTRO TRABAJO */
DATOS = :DATOS || '000000000';
/* 63-APORTE ARL */
COTOBL = IBCARL * TARARL;
execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
/* 64-TARIFA CCF */
select P.PAAN_CCF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCCF;
PORCAPOR = SUBSTR(PORCCF, 1, STRLEN(PORCCF) - 2);
execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
DATOS = :DATOS || :PORCAPOR;
/* 65-APORTE CCF */
COTOBL = IBCCCF * PORCCF;
execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N')
    returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
/* 66-TARIFA SENA */
COTOBL = '0';
APORINC = 0;
select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
    and ((NC.conc_cod = 918) or (NC.conc_cod = 919) or (NC.conc_cod = 940) or (NC.conc_cod = 1018)) and NC.terc_nit = :nitempl
    INTO :APORINC;
if (aporinc IS NULL) then
    aporinc = 0;
if (aporinc <> 0) then
    select P.PAAN_SENA/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCAPOR;
else
    PORCAPOR = '0';
PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
DATOS = :DATOS || :PORCAPOR;
/* 67-APORTE SENA */
if (aporinc IS NULL) then
    select P.PAAN_SENA/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCOT;
ELSE
    PORCOT = 0;
COTOBL = IBCCCF * PORCOT;
execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
/* 68-TARIFA ICBF */
COTOBL = '0';
APORINC = 0;
select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
    and ((NC.conc_cod = 916) or (NC.conc_cod = 917) or (NC.conc_cod = 939) or (NC.conc_cod = 1017)) and NC.terc_nit = :nitempl
    into :aporinc;
if (aporinc IS NULL) then
    aporinc = 0;
if (aporinc <> 0) then
    select P.PAAN_ICBF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCAPOR;
else
    PORCAPOR = '0';
PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
DATOS = :DATOS || :PORCAPOR;
/* 69-APORTE ICBF */
if (aporinc IS NULL) then
    select P.PAAN_ICBF/100 from PARAMETROS_ANO P where P.PAAN_ANO = SUBSTR(:FECLIQ, 1, 4) into :PORCOT;
ELSE
    PORCOT = 0;
COTOBL = IBCCCF * PORCOT;
execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
/* 70-TARIFA ESAP */
COTOBL = '0';
select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
    and (NC.conc_cod = 947) and NC.terc_nit = :nitempl
    into :COTOBL;
if (:COTOBL is null) then
  COTOBL = '0';
if (cotobl <> '0') then
    select conc_porc from conceptos_nomina P where CONC_COD = 947 into :PORCAPOR;
else
    PORCAPOR = '0';
PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
DATOS = :DATOS || :PORCAPOR;
/* 71-APORTE ESAP */
select conc_porc from conceptos_nomina P where CONC_COD = 947 into :PORCOT;
COTOBL = IBCCCF * PORCOT;
execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
/* 72-TARIFA MEN */
COTOBL = '0';
select sum(NC.noco_valor) from nomina_conceptos NC, pago_aportes_nom P where P.pgap_id = :IDDOC and NC.nomi_id = P.pgap_idnom
    and (NC.conc_cod = 946) and NC.terc_nit = :nitempl
    into :COTOBL;
if (:COTOBL is null) then
  COTOBL = '0';
if (cotobl <> '0') then
    select conc_porc from conceptos_nomina P where CONC_COD = 946 into :PORCAPOR;
else
    PORCAPOR = '0';
PORCAPOR = SUBSTR(PORCAPOR, 1, STRLEN(PORCAPOR) - 2);
execute procedure CAF(:PORCAPOR, 7, 'P') returning_values (:PORCAPOR);
DATOS = :DATOS || :PORCAPOR;
/* 73-APORTE MEN */
select conc_porc from conceptos_nomina P where CONC_COD = 946 into :PORCOT;
COTOBL = IBCCCF * PORCOT;
execute procedure REDONDEE(COTOBL, 2) returning_values (COTOBL);
COTOBL = SUBSTR(COTOBL, 1, STRLEN(COTOBL) - 5);
execute procedure CAF(:COTOBL, 9, 'N') returning_values (:COTOBL);
DATOS = :DATOS || :COTOBL;
suspend;
DATOS = '';
COTOBL = 0;
/* 74-TIPO ID COTIZANTE PRINCIPAL SI ES UPC ADICIONAL */
DATOS = :DATOS || '  ';
/* 75-ID COTIZANTE PRINCIPAL SI ES UPC ADICIONAL */
DATOS = :DATOS || '                ';
/* 76-EXONERADO PAGO SALUD */
if (((IBCEPS/DIASL)*30) > (SMMLV * 10)) then
    DATOS = :DATOS || 'N';
else
    DATOS = :DATOS || 'S';
/* 77-CODIGO ARL */
CODADMIN = '';
select A.admi_codarp from ADMINISTRADORA A, EMPLEADOS E where E.EMPL_ARP = A.TERC_NIT and E.TERC_NIT = :NITEMPL
    into :CODADMIN;
if (:CODADMIN is null) then
  CODADMIN = ' ';
execute procedure CAF(:CODADMIN, 6, 'A') returning_values (:CODADMIN);
DATOS = :DATOS || :CODADMIN;
/* 78-RIESGO LABORAL */
CODTAR = '1';
SELECT TARL_ID FROM TARIFAS_ARL WHERE TARL_TARIFA = :TARARL INTO :CODTAR;
DATOS = :DATOS || :CODTAR;
/* 79-ALTO RIESGO */
if (EXISTS(SELECT E.terc_nit FROM EMPLEADOS E WHERE E.terc_nit = :nitempl AND E.empl_altoriesgo = 'S')) then
    DATOS = :DATOS || '1';
else
    DATOS = :DATOS || ' ';
/* 80-fecha ingreso */
if ((SUBSTR(:FECING, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
    (SUBSTR(:FECING, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
  DATOS = :DATOS || substring(fecing from 1 for 4) || '-' || substring(fecing from 6 for 2) || '-' || substring(fecing from 9 for 2);
ELSE
  DATOS = :DATOS || '          ';
/* 81-fecha retiro */
if ((SUBSTR(:fecret, 6, 7) = SUBSTR(:FECLIQ, 6, 7)) and
    (SUBSTR(:fecret, 1, 4) = SUBSTR(:FECLIQ, 1, 4))) then
  DATOS = :DATOS || substring(fecret from 1 for 4) || '-' || substring(fecret from 6 for 2) || '-' || substring(fecret from 9 for 2);
ELSE
  DATOS = :DATOS || '          ';
/* 82-fecha variacion salario */
if ((tiponov = 8) or (tiponov = 11)) then
  DATOS = :DATOS || substring(fecnov1 from 1 for 4) || '-' || substring(fecnov1 from 6 for 2) || '-' || substring(fecnov1 from 9 for 2);
ELSE
  DATOS = :DATOS || '          ';
/* 83-fecha INICIO SLN */
DATOS = :DATOS || '          ';
/* 84-fecha FIN SLN */
DATOS = :DATOS || '          ';
/* 85-fecha ini IEG */
DATOS = :DATOS || '          ';
/* 86-fecha fin IEG */
DATOS = :DATOS || '          ';
/* 87-fecha ini LMA */
DATOS = :DATOS || '          ';
/* 88-fecha fin LMA */
DATOS = :DATOS || '          ';
/* 89-fecha ini VAC-LR */
DATOS = :DATOS || '          ';
/* 90-fecha fin VAC-LR */
DATOS = :DATOS || '          ';
/* 91-fecha ini VCT */
if ((tiponov = 7) or (tiponov = 10)) then
  DATOS = :DATOS || substring(fecnov1 from 1 for 4) || '-' || substring(fecnov1 from 6 for 2) || '-' || substring(fecnov1 from 9 for 2);
ELSE
  DATOS = :DATOS || '          ';
/* 92-fecha fin VCT */
DATOS = :DATOS || '          ';
/* 93-fecha ini IRL */
DATOS = :DATOS || '          ';
/* 94-fecha fin IRL */
DATOS = :DATOS || '          ';
/* 95-IBC otros parafiscales */
SALBASIC = IBCCCF;
SALBASIC = SUBSTR(SALBASIC, 1, STRLEN(SALBASIC) - 3);
execute procedure CAF(:SALBASIC, 9, 'N') returning_values (:SALBASIC);
DATOS = :DATOS || :SALBASIC;
/* 96-Horas laboradas: reporta 0 en novedades */
DATOS = :DATOS || '000';
/* 97-Fecha radicacion en el exterior */
DATOS = :DATOS || '          ';
SUSPEND;
end^


ALTER PROCEDURE RENUMERAR_CLIENTES
RETURNS (
    NIT VARCHAR(20),
    I INTEGER)
AS
begin
I = 0;
FOR SELECT TERC_NIT FROM clientes INTO :nit
    DO
    BEGIN
    I = I + 1;
    UPDATE CLIENTES SET CLIE_COD = :I WHERE TERC_NIT = :NIT;
    suspend;
    END
end^


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^


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(8),
    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^


ALTER PROCEDURE REP_ANALISIS_CARTERA (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DIASR INTEGER,
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    EXTENDIDA CHAR(1),
    MONEDA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    MAILCART VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    DIASCR INTEGER,
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    RESALTAR CHAR(1),
    INSTCART VARCHAR(255),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    DIAS INTEGER,
    SALDO NUMERIC(18,2),
    CORRIENTE NUMERIC(18,2),
    CERO NUMERIC(18,2),
    TREINTA NUMERIC(18,2),
    SESENTA NUMERIC(18,2),
    NOVENTA NUMERIC(18,2),
    CIENTOCHENTA NUMERIC(18,2),
    DOSSETENTA NUMERIC(18,2),
    TRESSESENTA NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    GRUPCOD INTEGER,
    DIA_CAR INTEGER,
    RADICADA NUMERIC(18,2),
    SINRADICAR NUMERIC(18,2),
    CALIFICA VARCHAR(20),
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
declare variable ext3 varchar(8);
declare variable factorext integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS EXTENDIDO CON RANGOS IGUALES AL NORMAL O TRIPLES') RETURNING_VALUES (:ext3);
if (ext3 = 'TRIPLES') then
    factorext = 3;
else
    factorext = 1;
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, clsu_dir, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD,
    CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA, CLIE_MAILCART, CLIE_CALIFICA, CLIE_DIAS
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :DIRECCION, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL,
    :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :RESALTAR, INSTCART, :MAILCART, :CALIFICA, :DIASCR
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

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


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(8),
    DIAS INTEGER,
    DTOF NUMERIC(18,2),
    FECDTOF DATE,
    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 dtoapl numeric(18,2);
declare variable vencimiento varchar(12);
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('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
execute procedure LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'INCLUIR ANTICIPOS A PROVEEDORES EN REPORTES Y CONSULTAS DE CUENTAS POR PAGAR') returning_values (INCLANTI);
/* 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
            if ((inclanti = 'SI') or (TIPO <> 55)) then
                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 <> 0) 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
                    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_DTOFMONTO, NDPR_DTOFECHA, NDPR_NUMPROV, NDPR_TRM from NOTAS_DEBITO_PROVEEDOR
                                where NDPR_ID = :ID into :DTOF, :fecdtof, :NUMPROV, :TRM;
                        if (TIPO = 52) then
                            select 0, NCPR_FECHA, '', 1 from NOTAS_CREDITO_PROVEEDOR where NCPR_ID = :ID into :DTOF, :fecdtof, :NUMPROV, :TRM;
                        if (TIPO = 55) then
                            select ANPR_DTOFMONTO, ANPR_DTOFECHA, '', ANPR_TRM from ANTICIPOS_PROVEEDOR where ANPR_ID = :ID into :DTOF, :fecdtof, :NUMPROV, :TRM;
                        if (TIPO = 21) then
                            select FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_NUMPROV, FACO_TRM from FACTURAS_COMPRA where FACO_ID = :ID into :DTOF, :fecdtof, :NUMPROV, :TRM;
                        if (TIPO = 24) then
                            select 0, DVCO_FECHA, '', 1 from devoluciones_compras where DVCO_ID = :ID into :DTOF, :fecdtof, :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
                        SUSPEND;
                        END
                    END /* SALDO <> 0 */
                END
            END /* FOR MVPR */
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA;
            if (TRM <> 0) then
             SALDOMON = (:SALDO / :TRM);
            else
             begin
             SALDOMON = null;
             trm = null;
             end
            SUSPEND;
            end
        END /* OK */
    END /* FOR NIT */
END^


ALTER PROCEDURE REP_APLICACLI (
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMNIT VARCHAR(60),
    ITEM INTEGER,
    IDDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NRODOC VARCHAR(8),
    ABONO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
BEGIN
  if (DETALLE = 'S') then
    BEGIN
    FOR SELECT P.APCL_ID, PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, P.TERC_NIT, TERC_NOM,
        ACDE_ITEM, ACDE_IDDOC, ACDE_TIPODOC, ACDE_PREFIJO, ACDE_NUMERO, ACDE_APLICADO, ACDE_RTFTE, ACDE_RTIVA, ACDE_RTICA
    FROM APLICACION_CLIENTE P, APLICACION_CLIENTE_DETALLE PD, TERCEROS T
    WHERE P.APCL_ID = PD.APCL_ID AND P.TERC_NIT = T.TERC_NIT AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMNIT,
        :ITEM, :IDDOC, :TIPODOC, :PREFDOC, :NRODOC, :ABONO, :RTFTE, :RTIVA, :RTICA
    DO
      SUSPEND;
    END
  ELSE
    BEGIN
    FOR SELECT APCL_ID, PREF_PRE, APCL_NUMERO, APCL_FECHA, APCL_CONCEPTO, P.TERC_NIT, TERC_NOM
    FROM APLICACION_CLIENTE P, TERCEROS T
    WHERE P.TERC_NIT = T.TERC_NIT AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMNIT
    DO
        BEGIN
        SELECT SUM(ACDE_APLICADO), SUM(ACDE_RTFTE), SUM(ACDE_RTIVA), SUM(ACDE_RTICA)
        FROM APLICACION_CLIENTE_DETALLE
        WHERE APCL_ID = :ID
        INTO :ABONO, :RTFTE, :RTIVA, :RTICA;
        SUSPEND;
        END
    END
END^


ALTER PROCEDURE REP_APLICAPROV (
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    NOMNIT VARCHAR(60),
    ITEM INTEGER,
    IDDOC INTEGER,
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NRODOC VARCHAR(8),
    ABONO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2))
AS
BEGIN
  if (DETALLE = 'S') then
    BEGIN
    FOR SELECT P.APPR_ID, PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, P.TERC_NIT, TERC_NOM,
        APPD_ITEM, APPD_IDDOC, APPD_TIPODOC, APPD_PREFIJO, APPD_NUMERO, APPD_APLICADO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA
    FROM APLICACION_PROVEDOR P, APLICACION_PROVEEDOR_DETALLE PD, TERCEROS T
    WHERE P.APPR_ID = PD.APPR_ID AND P.TERC_NIT = T.TERC_NIT AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMNIT,
        :ITEM, :IDDOC, :TIPODOC, :PREFDOC, :NRODOC, :ABONO, :RTFTE, :RTIVA, :RTICA
    DO
      SUSPEND;
    END
  ELSE
    BEGIN
    FOR SELECT P.APPR_ID, PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, P.TERC_NIT, TERC_NOM
    FROM APLICACION_PROVEDOR P, TERCEROS T
    WHERE P.TERC_NIT = T.TERC_NIT AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMNIT
    DO
        BEGIN
        SELECT SUM(APPD_APLICADO), SUM(APPD_RTFTE), SUM(APPD_RTIVA), SUM(APPD_RTICA)
        FROM APLICACION_PROVEEDOR_DETALLE
        WHERE APPR_ID = :ID
        INTO :ABONO, :RTFTE, :RTIVA, :RTICA;
        SUSPEND;
        END
    END
END^


ALTER PROCEDURE REP_APORTES_NOMINA (
    ADMINI VARCHAR(20),
    ADMFIN VARCHAR(20),
    EMPINI VARCHAR(20),
    EMPFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ORDEN CHAR(1),
    SOLOSS CHAR(1))
RETURNS (
    ADMINIST VARCHAR(20),
    NOMADM VARCHAR(60),
    ADMEPS CHAR(1),
    ADMAFP CHAR(1),
    ADMARP CHAR(1),
    ADMCCF CHAR(1),
    EMPNIT VARCHAR(20),
    EMPNOM VARCHAR(60),
    EMPDEP VARCHAR(60),
    FECNOM DATE,
    NOMCONC VARCHAR(60),
    ANO CHAR(4),
    PERIODO INTEGER,
    CONCEPTO VARCHAR(60),
    MONTOAP NUMERIC(18,2),
    DEDUC CHAR(1))
AS
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
begin
if (ORDEN = 'C') then
    BEGIN
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = ADMINI;
    NOMFIN = ADMFIN;
    ADMINI = '';
    ADMFIN = 'zz';
    END
FOR SELECT T.TERC_NIT, TERC_NOM, A.admi_eps, A.admi_arp, A.admi_afp, A.admi_ccf FROM TERCEROS T, ADMINISTRADORA A WHERE T.terc_nit = A.terc_nit AND TERC_ADMINI = 'S' AND
    T.terc_nit >= :admini AND T.terc_nit <= :admfin AND T.terc_nom >= :NOMINI AND T.terc_nom <= :NOMFIN
    INTO :administ, :nomadm, :admeps, :admarp, :admafp, :admccf
    DO
    BEGIN
    FOR select N.nomi_ano, N.nomi_periodo, N.nomi_feccausa, NC.terc_nit, NC.noco_valor, NC.noco_deduc, C.conc_nombre, N.nomi_conc
        from nomina_conceptos NC, conceptos_nomina C, NOMINA N
        where NC.nomi_id = N.nomi_id AND NC.noco_aporte = 'S' and NC.noco_entidad = :administ AND NC.conc_cod = C.conc_cod
        AND ((C.conc_repoi = 'S') or (:SOLOSS = 'N')) AND NC.noco_valor <> 0 AND NC.terc_nit >= :empini AND NC.terc_nit <= :empfin
        AND N.nomi_feccausa >= :fecini AND N.nomi_feccausa <= :fecfin
        INTO :ano, :periodo, :fecnom, :empnit, :montoap, :deduc, :concepto, :NOMCONC
        DO
        BEGIN
        empnom = '';
        if (DEDUC = 'S') then
            MONTOAP = MONTOAP * -1;
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :empnit INTO :empnom;
        empdep = '';
        SELECT DPTO_NOMBRE FROM departamento D, empleados E WHERE E.terc_nit = :empnit AND E.empl_dpto = D.dpto_cod INTO :empdep;
        suspend;
        END
    END
end^


ALTER PROCEDURE REP_ARTICULO_BARRAS (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    ORDEN CHAR(1))
RETURNS (
    ARTI_COD VARCHAR(15),
    ARTI_DES VARCHAR(60),
    ARTI_DESCORTA VARCHAR(30),
    GRUP_COD VARCHAR(2),
    GRUP_NOM VARCHAR(30),
    SUBG_COD VARCHAR(3),
    SUBG_NOM VARCHAR(30),
    MARC_COD VARCHAR(3),
    MARC_NOM VARCHAR(30),
    ARTI_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, arti_descorta
    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, :arti_descorta
    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^


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

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(f.fact_sucursal), max(vend_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
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N' AND
            FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :VEND
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CODCLI, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(r.revt_sucursal), MAX(VEND_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
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :DESCORTA, UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :VEND
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CODCLI, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(v.devt_sucursal), MAX(VEND_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
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI and ((devt_remid is null) or (DEVT_REMID = 0)) AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :VEND
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CODCLI, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(p.pedi_sucursal), MAX(VEND_COD)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :DESCORTA, UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :VEND
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(c.coti_sucursal), MAX(VEND_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
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, c.coti_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :VEND
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO)/FADE_FACTOR*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, f.fact_sucursal, A.arti_descorta, SUBSTRING(FACT_OBS FROM 1 FOR 255), VEND_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
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_FECHA >= :FECINI AND
            FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY TERC_NIT, f.fact_sucursal, ARTI_COD, FACT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL,
            :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :descorta, :OBSDOC, :VEND
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO) / RVDE_FACTOR, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, r.revt_sucursal, A.arti_descorta, SUBSTRING(REVT_OBS FROM 1 FOR 255), VEND_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
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, r.revt_sucursal, ARTI_COD, REVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL,
            :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :descorta, :OBSDOC, :VEND
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, (DVDE_PRUNIT-DVDE_DTOMONTO)/DVDE_FACTOR*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, v.devt_sucursal, A.arti_descorta, SUBSTRING(DEVT_OBS FROM 1 FOR 255), VEND_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
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI and ((devt_remid is null) or (DEVT_REMID = 0)) AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, v.devt_sucursal, ARTI_COD, DEVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL,
            :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :descorta, :OBSDOC, :VEND
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO)/PEDE_FACTOR*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, p.pedi_sucursal, A.arti_descorta, SUBSTRING(PEDI_OBS FROM 1 FOR 255), VEND_COD
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, p.pedi_sucursal, ARTI_COD, PEDI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL,
            :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :descorta, :OBSDOC, :VEND
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO)/CTDE_FACTOR*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, c.coti_sucursal, A.arti_descorta, SUBSTRING(COTI_OBS FROM 1 FOR 255), vend_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
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, c.coti_sucursal, ARTI_COD, COTI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL,
            :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :descorta, :OBSDOC, :VEND
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
END^


ALTER PROCEDURE REP_ARTICULOS_CONTABIL (
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    INACTIVOS CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    MARINI VARCHAR(3),
    MARFIN VARCHAR(3),
    SUBINI VARCHAR(3),
    SUBFIN VARCHAR(3))
RETURNS (
    ARTI_COD VARCHAR(15),
    ARTI_DES VARCHAR(60),
    ARTI_DESCORTA VARCHAR(30),
    GRUP_COD VARCHAR(2),
    GRUP_NOM VARCHAR(30),
    SUBG_COD VARCHAR(3),
    SUBG_NOM VARCHAR(30),
    MARC_COD VARCHAR(3),
    MARC_NOM VARCHAR(30),
    ARTI_IVA NUMERIC(9,4),
    ARTI_UNIDAD VARCHAR(8),
    ESAR_NOM VARCHAR(20),
    ARTI_EXIST CHAR(1),
    ARTI_FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ARTI_OBS VARCHAR(2048),
    ARTI_PESO NUMERIC(18,2),
    ARTI_ALTO NUMERIC(18,2),
    ARTI_ANCHO NUMERIC(18,2),
    ARTI_LARGO NUMERIC(18,2),
    ARTI_CONSUMO NUMERIC(18,2),
    ARTI_ENSAMBLE CHAR(1),
    ARTI_TERCERO CHAR(1),
    ARTI_INVIMA VARCHAR(20),
    ARTI_CUM VARCHAR(20),
    ARTI_POSARANCEL VARCHAR(20),
    ARTI_PORCARAN NUMERIC(9,4),
    ARTI_INALC NUMERIC(9,4),
    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_CTAIVADC VARCHAR(20),
    COAR_CTAIVAV VARCHAR(20),
    COAR_CTAIVADV VARCHAR(20),
    COAR_CTAVNT VARCHAR(20),
    COAR_CTADEV VARCHAR(20),
    COAR_CTACONS VARCHAR(20),
    COAR_CTACOS VARCHAR(20))
AS
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
begin
if (ORDEN = 'C') then
    BEGIN
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    ARTINI = '';
    ARTFIN = 'zz';
    END
FOR select a.arti_cod, arti_des, a.grup_cod, subg_cod, a.marc_cod, t.taiv_porc arti_iva, arti_unidad, esar_nom, arti_exist,
    arti_foto, substring(arti_obs from 1 for 2048), arti_peso, arti_ancho, arti_alto, arti_largo, arti_consumo, arti_fecha, arti_descorta,
    coar_ctainv, coar_ctacomp, coar_ctaivac, coar_ctaivav, coar_ctavnt, coar_ctadev, coar_ctacons, coar_ctacos, COAR_CTAIVADV, COAR_CTAIVADC,
    ARTI_ENSAMBLE, ARTI_TERCERO, ARTI_INVIMA, ARTI_CUM, ARTI_PORCARAN, ARTI_INALC, ARTI_POSARANCEL
    from articulo a, contabil_articulo c, tarifa_iva t, estado_articulo E
    where a.arti_cod >= :ARTINI and a.arti_cod <= :ARTFIN and a.ARTI_DES >= :DESINI AND a.ARTI_DES <= :DESFIN and a.arti_cod = c.arti_cod and
    A.esar_cod = E.esar_cod AND a.taiv_cod = t.taiv_cod and ((a.marc_cod is null) or (a.marc_cod >= :MARINI and a.marc_cod <= :MARFIN))
    and ((a.grup_cod is null) or (a.grup_cod >= :GRPINI and a.grup_cod <= :GRPFIN))
    and ((a.subg_cod is null) or (a.subg_cod >= :SUBINI and a.subg_cod <= :SUBFIN)) and a.esar_cod <> :INACTIVOS
    into  :ARTI_COD, :ARTI_DES, :GRUP_COD, :SUBG_COD, :MARC_COD, :ARTI_IVA, :ARTI_UNIDAD, esar_nom, arti_exist,
    arti_foto, arti_obs, arti_peso, arti_ancho, arti_alto, arti_largo, arti_consumo, arti_fecha, arti_descorta,
    :COAR_CTAINV, :COAR_CTACOMP, :COAR_CTAIVAC, :COAR_CTAIVAV, :COAR_CTAVNT, :COAR_CTADEV, :COAR_CTACONS, :COAR_CTACOS, :coar_ctaivadv, :coar_ctaivadc,
    :ARTI_ENSAMBLE, :ARTI_TERCERO, :ARTI_INVIMA, :ARTI_CUM, :ARTI_PORCARAN, :ARTI_INALC, :arti_posarancel
    DO
    BEGIN
    GRUP_NOM = NULL;
    MARC_NOM = NULL;
    SUBG_NOM = NULL;
    COBA_COD = NULL;
    unar_unidad = NULL;
    unar_faccan = NULL;
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :GRUP_COD INTO :GRUP_NOM;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBG_COD AND GRUP_COD = :GRUP_COD INTO :SUBG_NOM;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARC_COD INTO :MARC_NOM;
    SELECT FIRST 1 coba_cod FROM BARRAS_ARTICULO WHERE arti_cod = :arti_cod AND COBA_UNIDAD = :arti_unidad INTO :coba_cod;
    select FIRST 1 unar_unidad, unar_faccan FROM unidad_articulo WHERE ARTI_COD = :arti_cod INTO unar_unidad, unar_faccan;
    if (:AGRUPA = 'G') then
      begin
      if (((:GRPFIN <> 'ZZ') and (:grup_cod is not null)) or (:GRPFIN = 'ZZ'))  then
           suspend;
      end
    else
      if (:AGRUPA = 'B') then
         begin
         if (((:SUBFIN <> 'ZZZ') and (:subg_cod is not null)) or (:SUBFIN = 'ZZZ'))  then
           suspend;
         end
      else
        if (:AGRUPA = 'M') then
          begin
          if (((:MARFIN <> 'ZZZ') and (:marc_cod is not null)) or (:MARFIN = 'ZZZ'))  then
            suspend;
          end
        else
          suspend;
    END
end^


ALTER PROCEDURE REP_ARTICULOS_PROVEEDOR (
    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))
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(8),
    FECHA DATE,
    DTO NUMERIC(9,2),
    NUMPROV VARCHAR(15))
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 = '0';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '0';
    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 TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN
    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
            FOR SELECT MAX(D.ARTI_COD), SUM(FCDE_CANT * FCDE_FACTOR), SUM(FCDE_TOTAL-FCDE_IVAMONTO), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), SUM(FCDE_TOTAL), MAX(ARTI_DES), MAX(TERC_NIT), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FACO_NUMPROV)
                FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F, ARTICULO A/*, TERCEROS T*/
                WHERE F.FACO_ID = D.FACO_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACO_ANULADO = 'N'
                GROUP BY TERC_NIT,D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :DESCRIPCION, :NIT, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :numprov
                DO
                BEGIN
                select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
                  from terceros T, PROVEEDORES P
                     where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                     INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
                select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_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
        if (TIPO = 22) then
            FOR SELECT MAX(D.ARTI_COD), SUM(RPVD_CANT * RPVD_FACTOR), SUM(RPVD_TOTAL-RPVD_IVAMONTO), SUM(RPVD_IVAMONTO), SUM(RPVD_CONSUMO), SUM(RPVD_TOTAL), MAX(ARTI_DES), MAX(TERC_NIT), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(REPR_NUMPROV)
                FROM REMISION_PROVEEDOR_DET D, REMISION_PROVEEDOR R, ARTICULO A
                WHERE R.REPR_ID = D.REPR_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REPR_ANULADO = 'N'
                GROUP BY TERC_NIT,D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :DESCRIPCION, :NIT, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :numprov
                DO
                BEGIN
                select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
                  from terceros T, PROVEEDORES P
                     where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                     INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
                select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_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
        if (TIPO = 24) then
            FOR SELECT MAX(D.ARTI_COD), SUM(DVCD_CANT * DVCD_FACTOR), SUM(DVCD_TOTAL-DVCD_IVAMONTO), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO), SUM(DVCD_TOTAL), MAX(ARTI_DES), MAX(TERC_NIT), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(DVCO_FACTURA)
                FROM devoluciones_compras_det D, DEVOLUCIONES_COMPRAS V, ARTICULO A
                WHERE V.DVCO_ID = D.DVCO_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DVCO_ANULADO = 'N'
                GROUP BY TERC_NIT,D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :DESCRIPCION, :NIT, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NUMPROV
                DO
                BEGIN
                select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
                  from terceros T, PROVEEDORES P
                     where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                     INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
                select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_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
        if (TIPO = 23) then
            FOR SELECT MAX(D.ARTI_COD), SUM(OCDE_CANT * OCDE_FACTOR), SUM(OCDE_TOTAL-OCDE_IVAMONTO), SUM(OCDE_IVAMONTO), SUM(OCDE_CONSUMO), SUM(OCDE_TOTAL), MAX(ARTI_DES), MAX(TERC_NIT), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM ORDENES_COMPRA_DETALLE D, ORDENES_COMPRA O, ARTICULO A
                WHERE O.ORDC_ID = D.ORDC_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND ORDC_ANULADO = 'N'
                GROUP BY TERC_NIT,D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :DESCRIPCION, :NIT, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
                  from terceros T, PROVEEDORES P
                     where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                     INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
                select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_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
        if (TIPO = 25) then
            FOR SELECT MAX(D.ARTI_COD), SUM(CPRD_CANT * CPRD_FACTOR), SUM(CPRD_TOTAL-CPRD_IVAMONTO), SUM(CPRD_IVAMONTO), SUM(CPRD_CONSUMO), SUM(CPRD_TOTAL), MAX(ARTI_DES), MAX(TERC_NIT), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM COTIZACIONES_PROVEEDOR_DET D, COTIZACION_PROVEEDOR C, ARTICULO A
                WHERE C.COPR_ID = D.COPR_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COPR_ANULADO = 'N'
                GROUP BY TERC_NIT,D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :DESCRIPCION, :NIT, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
                  from terceros T, PROVEEDORES P
                     where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                     INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
                select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_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
    ELSE
        BEGIN
        if (TIPO = 21) then
            FOR SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, FCDE_CANT * FCDE_FACTOR, FCDE_PRUNIT / FCDE_FACTOR, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_DTOPORC, FCDE_TOTAL, D.ARTI_COD, TERC_NIT, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FACO_NUMPROV
                FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D, ARTICULO A
                WHERE F.FACO_ID = D.FACO_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACO_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL, :ARTICULO, :NIT, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :numprov
                DO
                BEGIN
                select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
                  from terceros T, PROVEEDORES P
                     where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                     INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
                select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_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
        if (TIPO = 22) then
            FOR SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA, RPVD_CANT * RPVD_FACTOR, RPVD_PRUNIT / RPVD_FACTOR, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_DTOPORC, RPVD_TOTAL, D.ARTI_COD, TERC_NIT, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, REPR_NUMPROV
                FROM REMISION_PROVEEDOR R, REMISION_PROVEEDOR_DET D, ARTICULO A
                WHERE R.REPR_ID = D.REPR_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REPR_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL, :ARTICULO, :NIT, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :numprov
                DO
                BEGIN
                select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
                  from terceros T, PROVEEDORES P
                     where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                     INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
                select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_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
        if (TIPO = 24) then
            FOR SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, DVCD_CANT * DVCD_FACTOR, DVCD_PRUNIT / DVCD_FACTOR, DVCD_IVAMONTO, DVCD_CONSUMO, DVCD_DTOPORC, DVCD_TOTAL, D.ARTI_COD, TERC_NIT, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, DVCO_FACTURA
                FROM DEVOLUCIONES_COMPRAS V, DEVOLUCIONES_COMPRAS_DET D, ARTICULO A
                WHERE V.DVCO_ID = D.DVCO_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DVCO_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL, :ARTICULO, :NIT, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :numprov
                DO
                BEGIN
                select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
                  from terceros T, PROVEEDORES P
                     where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                     INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
                select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_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
        if (TIPO = 23) then
            FOR SELECT PREF_PRE, ORDC_NUMERO, ORDC_FECHA, OCDE_CANT * OCDE_FACTOR, OCDE_PRUNIT / OCDE_FACTOR, OCDE_IVAMONTO, OCDE_CONSUMO, OCDE_DTOPORC, OCDE_TOTAL, D.ARTI_COD, TERC_NIT, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE D, ARTICULO A
                WHERE O.ORDC_ID = D.ORDC_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND ORDC_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL, :ARTICULO, :NIT, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
                  from terceros T, PROVEEDORES P
                     where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                     INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
                select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_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
        if (TIPO = 25) then
            FOR SELECT PREF_PRE, C.COPR_NUMERO, COPR_FECHA, CPRD_CANT * CPRD_FACTOR, CPRD_PRUNIT / CPRD_FACTOR, CPRD_IVAMONTO, CPRD_CONSUMO, CPRD_DTOPORC, CPRD_TOTAL, D.ARTI_COD, TERC_NIT, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM COTIZACION_PROVEEDOR C, COTIZACIONES_PROVEEDOR_DET D, ARTICULO A
                WHERE C.COPR_ID = D.COPR_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COPR_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL, :ARTICULO, :NIT, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
                  from terceros T, PROVEEDORES P
                     where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                     INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
                select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_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^


ALTER PROCEDURE REP_ARTICULOS_PROVEEDORI (
    TIPO INTEGER,
    DETALLE CHAR(1),
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(4),
    GRPFIN VARCHAR(4),
    SUBINI VARCHAR(3),
    SUBFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA 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),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(3),
    NOMGRUPO VARCHAR(60),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(60),
    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))
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 = '0';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '0';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    BEGIN
    MARINI = GRPINI;
    MARFIN = GRPFIN;
    GRPINI = '';
    GRPFIN = 'zz';
    SUBINI = '';
    SUBFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (TIPO = 137) then
        FOR SELECT MAX(D.ARTI_COD), SUM(D.fpde_cant * D.fpde_factor), SUM(D.fpde_total-D.fpde_ivamonto), SUM(D.fpde_ivamonto), SUM(D.fpde_totgtos), SUM(D.fpde_totmon),
            MAX(ARTI_DES), MAX(TERC_NIT), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM factura_proforma_det D, factura_proforma F, ARTICULO A/*, TERCEROS T*/
            WHERE F.FAPO_ID = D.FAPO_ID AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
            AND FAPO_FECHA >= :FECINI AND FAPO_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FAPO_ANULADO = 'N'
            AND (((:grpini = '') AND (:grpfin = 'zz')) or ((A.grup_cod >= :grpini) AND (A.grup_cod <= :grpfin)))
            AND (((:SUBINI = '') AND (:SUBFIN = 'zz')) or ((A.subg_cod >= :SUBINI) AND (A.subg_cod <= :subfin)))
            AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
            GROUP BY TERC_NIT,D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :DESCRIPCION, :NIT, :UNIDAD,
            :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
              from terceros T, PROVEEDORES P
                 where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                 INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :CODZONA INTO :NOMZONA;
            nomgrupo = '';
            NOMSUBG = '';
            NOMMARC = '';
            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;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO 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;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
    if (TIPO = 23) then
        FOR SELECT MAX(D.ARTI_COD), SUM(D.slde_cant * D.slde_factor), SUM(D.slde_total), 0, 0, SUM(D.slde_totmon), MAX(ARTI_DES), MAX(TERC_NIT), MAX(ARTI_UNIDAD),
            MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
            FROM solicitud_importacion_det D, solicitud_importacion O, ARTICULO A
            WHERE O.slim_id = D.slim_id AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND SLIM_FECHA >= :FECINI AND SLIM_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND SLIM_ANULADO = 'N'
            GROUP BY TERC_NIT,D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :DESCRIPCION, :NIT, :UNIDAD,
            :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
              from terceros T, PROVEEDORES P
                 where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                 INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :CODZONA INTO :NOMZONA;
            nomgrupo = '';
            NOMSUBG = '';
            NOMMARC = '';
            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;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO 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;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
    END
ELSE
    BEGIN
    if (TIPO = 21) then
        FOR SELECT PREF_PRE, FAPO_NUMERO, FAPO_FECHA, D.fpde_cant * D.fpde_factor, D.fpde_cant * D.fpde_prunit, D.fpde_ivamonto, D.fpde_totgtos, D.fpde_dtoporc, D.fpde_totmon,
            D.ARTI_COD, TERC_NIT, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM factura_proforma F, factura_proforma_det D, ARTICULO A
            WHERE F.fapo_id = D.fapo_id AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
            AND FAPO_FECHA >= :FECINI AND FAPO_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FAPO_ANULADO = 'N'
            INTO :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
            :ARTICULO, :NIT, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
              from terceros T, PROVEEDORES P
                 where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                 INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :CODZONA INTO :NOMZONA;
            nomgrupo = '';
            NOMSUBG = '';
            NOMMARC = '';
            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;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SUSPEND;
            END
    if (TIPO = 23) then
        FOR SELECT PREF_PRE, SLIM_NUMERO, SLIM_FECHA, D.slde_cant * D.slde_factor, D.slde_cant * D.slde_prunit, 0, 0, D.slde_dtoporc, D.slde_totmon,
            D.ARTI_COD, TERC_NIT, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
            FROM solicitud_importacion O, solicitud_importacion_det D, ARTICULO A
            WHERE O.slim_id = D.slim_id AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
            AND SLIM_FECHA >= :FECINI AND SLIM_FECHA <= :FECFIN AND TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND SLIM_ANULADO = 'N'
            INTO :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :TOTAL,
            :ARTICULO, :NIT, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
            DO
            BEGIN
            select TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
              from terceros T, PROVEEDORES P
                 where P.TERC_NIT = T.TERC_NIT and T.TERC_NIT = :NIT
                 INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA;
            select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :CODZONA INTO :NOMZONA;
            nomgrupo = '';
            NOMSUBG = '';
            NOMMARC = '';
            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;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SUSPEND;
            END
    END
END^


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),
    SINREMI CHAR(1))
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    DTO NUMERIC(9,2),
    DTO1 NUMERIC(9,2),
    DTO2 NUMERIC(9,2),
    DTO3 NUMERIC(9,2),
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCIU VARCHAR(5),
    CODCLI VARCHAR(20),
    NOMCIU VARCHAR(60),
    GRPCAR INTEGER,
    NOMGRPCAR VARCHAR(30))
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);
declare variable remid integer;
declare variable pedid 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';
        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_DESCORTA), 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, :DESCORTA, :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_DESCORTA), 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, :DESCORTA, :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;
        if (SINREMI = 'N') then
            BEGIN
            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_DESCORTA), 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, :DESCORTA, :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
        ELSE
            BEGIN
            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_DESCORTA), 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)) AND (DEVT_REMID = 0) and (DEVT_PEDID = 0)
                GROUP BY V.vend_cod, D.ARTI_COD
                INTO :ARTICULO, :CODVEND, :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL,
                :DESCRIPCION, :DESCORTA, :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
        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_DESCORTA), 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, :DESCORTA, :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_DESCORTA), 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, :DESCORTA, :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_DTO1, FADE_DTO2, FADE_DTO3, FADE_TOTAL*FACT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD , F.TERC_NIT, F.fact_nomcliente, F.fact_sucursal, A.arti_descorta
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                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, :DTO1, :DTO2, :DTO3, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal, :descorta
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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, 0, 0, 0, RVDE_TOTAL,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.terc_nit, R.revt_nomterc, r.revt_sucursal, A.arti_descorta
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                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, DTO1, :DTO2, :DTO3, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal, :descorta
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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, 0, 0, 0, DVDE_TOTAL*DEVT_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.terc_nit, V.devt_nomterc, v.devt_sucursal, A.arti_descorta, devt_remid, devt_pedid
            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 DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and
                A.ARTI_COD >= :CODINI AND A.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)))
            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, :DTO1, :DTO2, :DTO3, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal, :descorta, :remid, :pedid
            DO
            BEGIN
            if ((SINREMI = 'N') or ((REMID = 0) and (PEDID = 0)))  then
                begin
                EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
                SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
                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
        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_DTO1, PEDE_DTO2, PEDE_DTO3, PEDE_TOTAL*PEDI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal, A.arti_descorta
            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, :DTO1, :DTO2, :DTO3, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal, :descorta
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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, 0, 0, 0, CTDE_TOTAL*COTI_FACTOR,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc, c.coti_sucursal, A.arti_descorta
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 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, :DTO1, :DTO2, :DTO3, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nomcliente, :sucursal, :descorta
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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
  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_DESCORTA), 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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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_DESCORTA), 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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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_DESCORTA), 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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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_DESCORTA), 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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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_DESCORTA), 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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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_DESCORTA), 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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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(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_DESCORTA), 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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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_DESCORTA), 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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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_DESCORTA), 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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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_DESCORTA), 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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nomcliente, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE nombres_grupos_cliente (:NIT) returning_values (:codzona, :GRPCAR, :codciu, :nomzona, :NOMGRPCAR, :nomciu);
            SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :CODCLI;
            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^


ALTER PROCEDURE REP_ASOCIADOS (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOM VARCHAR(60),
    DIR VARCHAR(60),
    TEL VARCHAR(40),
    OBS VARCHAR(255),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    ESTADO CHAR(1),
    ANIV DATE,
    CODCIUD VARCHAR(5),
    NOMCIUD VARCHAR(60))
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,ciud_cod,terc_tel,SUBSTRING(TERC_OBS FROM 1 FOR 255),terc_email,terc_fax,terc_cel,terc_asocinac,terc_aniv
    from terceros t where t.terc_nit >= :nitini and t.terc_nit <= :nitfin and terc_nom >= :nomini and terc_nom <= :nomfin
    into :nit, :nom, :dir, :codciud, :tel, :obs, :email, :fax, :cel, :estado, :aniv
    do
    begin
    if ((inactivos = 'S') or (estado <> 'N'))  then
        begin
        nomciud = '';
        select ciud_nom from ciudades where ciud_cod = :codciud into :nomciud;
        suspend;
        end
    end
end^


ALTER PROCEDURE REP_AUDITORIA (
    CODUSUARIO VARCHAR(10),
    FECINI DATE,
    FECFIN DATE,
    TIPODOC INTEGER,
    CODIGO VARCHAR(20))
RETURNS (
    USUARIO VARCHAR(10),
    FECHA DATE,
    HORA TIME,
    DOCUMENTO VARCHAR(60),
    OPERACION VARCHAR(30),
    NUMERODOC VARCHAR(20),
    EQUIPO VARCHAR(60),
    RAZONANULA VARCHAR(255),
    DATOS VARCHAR(4096))
AS
declare variable CODOPER CHAR(1);
begin
FOR SELECT AUDI_USUARIO, AUDI_FECHA, AUDI_HORA, T.TIDO_NOMLARGO, AUDI_OPER, AUDI_COD, AUDI_RAZON, AUDI_IPCLIENTE, AUDI_DATOS
    FROM AUDITORIA A, TIPO_DOCUMENTO T WHERE A.TIDO_COD = T.TIDO_COD AND 
    AUDI_FECHA >= :FECINI AND AUDI_FECHA <= :FECFIN AND ((:TIPODOC = 0) or (A.TIDO_COD = :TIPODOC)) AND
    ((:codusuario = '') OR (AUDI_USUARIO = :codusuario)) AND ((:codigo = '') OR (AUDI_COD = :codigo))
    INTO :USUARIO, :FECHA, :HORA, :documento, :CODOPER, :NUMERODOC, :RAZONANULA, :equipo, :datos
    DO
    BEGIN
    /* TRAIA EL NOMBRE DE LA TERMINAL */
    if (exists (SELECT TERM_NOMBRE FROM terminales_nombres WHERE TERM_IP = :EQUIPO)) then
        SELECT TERM_NOMBRE FROM terminales_nombres WHERE TERM_IP = :EQUIPO INTO :equipo;
    if (CODOPER = 'I') then
        OPERACION = 'REGISTRO NUEVO';
    if (CODOPER = 'U') then
        OPERACION = 'ACTUALIZACION';
    if (CODOPER = 'A') then
        OPERACION = 'ANULACION';
    if (CODOPER = 'D') then
        OPERACION = 'ELIMINACION';
    suspend;
    END
end^


ALTER PROCEDURE REP_AUSENTISMO (
    EMPLDESDE VARCHAR(20),
    EMPLHASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    NOMEMPL VARCHAR(60),
    DEPTO VARCHAR(60),
    NOMSECCION VARCHAR(60),
    NOMAREA VARCHAR(60),
    CARGO VARCHAR(60),
    FECHA DATE,
    NOVEDAD VARCHAR(60),
    DIAS INTEGER,
    TIPOINC VARCHAR(15),
    VALOR NUMERIC(18,2),
    MOTIVO VARCHAR(255))
AS
BEGIN
FOR SELECT N.terc_nit, TN.tnov_nombre, T.terc_nom, E.empl_dpto, E.empl_secc, E.empl_area, E.empl_cargo, N.nono_fecha,
    N.nono_dura, N.nono_tipoincap, N.nono_valor, N.nono_motivo
    FROM empleados E, TERCEROS T, nomina_novedades N, tipos_novedad TN
    WHERE N.terc_nit = T.terc_nit AND T.terc_nit = E.terc_nit AND N.tnov_cod = TN.tnov_cod AND
    N.terc_nit >= :empldesde AND N.terc_nit <= :emplhasta AND N.nono_fecha >= :fecini AND N.nono_fecha <= :fecfin
    INTO :NIT, :novedad, :nomempl, :depto, :nomseccion, :nomarea, :cargo, :fecha, :dias, :tipoinc, :valor, :motivo
  DO
  BEGIN
  SELECT A.area_nombre FROM area A WHERE A.dpto_cod = :depto AND A.secc_cod = :nomseccion AND A.area_cod = :nomarea INTO :nomarea;
  SELECT S.secc_nom FROM seccion s WHERE S.dpto_cod = :depto AND S.secc_cod = :nomseccion INTO :nomseccion;
  SELECT D.dpto_nombre FROM departamento D WHERE D.dpto_cod = :depto INTO :depto;
  SUSPEND;
  END
END^


ALTER PROCEDURE REP_CAMPANAS (
    FECHAI DATE,
    FECHAF DATE,
    CUMPLIDOS CHAR(1),
    DETALLE CHAR(1))
RETURNS (
    ID INTEGER,
    FECINI DATE,
    FECFIN DATE,
    NOMBRE VARCHAR(60),
    ITOK INTEGER,
    ITTOT INTEGER,
    PORCENTA NUMERIC(9,2),
    CLIENTE VARCHAR(20),
    NOMCLI VARCHAR(60),
    FECCONT DATE,
    EXPLICA VARCHAR(255),
    RESPTA VARCHAR(60))
AS
declare variable ABIERTA CHAR(1);
declare variable RESPUESTA INTEGER;
begin
FOR SELECT CRCM_ID, CRCM_NOMBRE, CRCM_FECINI, CRCM_FECFIN, CRCM_ABIERTA FROM crm_campana
    WHERE CRCM_FECINI >= :FECHAI AND CRCM_FECINI <= :FECHAF
    INTO :ID, :nombre, :fecini, :fecfin, :ABIERTA
    DO
    BEGIN
    if (ABIERTA = 'N') then
        BEGIN
        SELECT COUNT(*) FROM crm_campana_detalle WHERE CRCM_ID = :ID INTO :ittot;
        SELECT COUNT(*) FROM crm_campana_detalle D, crm_compromisos C
            WHERE C.CRCM_ID = :ID AND C.crco_id = D.crcd_evento AND C.crco_cumplido = 'S' AND C.crco_fecha >= :FECINI
            INTO :itok;
        if (ittot <> 0) then
            PORCENTA = ITOK * 100 / ITTOT;
        ELSE
            PORCENTA = 0;
        if (DETALLE = 'N') then
            BEGIN
            if ((CUMPLIDOS = 'S') or (ITTOT > ITOK)) then
                suspend;
            END
        ELSE
            BEGIN
            FOR SELECT D.crcd_cliente, D.crcd_feccontac, C.crcl_nom FROM crm_campana_detalle D, crm_clientes C
                WHERE D.crcd_cliente = C.crcl_nit AND D.crcm_id = :ID
                INTO :cliente, :feccont, :nomcli
                DO
                BEGIN
                explica = '';
                respta = '';
                RESPUESTA = 0;
                SELECT FIRST 1 E.crev_explica, E.crev_respuesta FROM crm_eventos E
                    WHERE E.crcm_id = :id AND E.crcl_nit = :cliente ORDER BY E.crev_id DESC
                    INTO :explica, :respuesta;
                SELECT CRER_NOMBRE FROM crm_evento_respuesta WHERE CRER_ID = :respuesta INTO :respta;
                SUSPEND;
                END
            END
        END
    ELSE
        BEGIN
        SELECT COUNT(*) FROM crm_eventos E WHERE E.crcm_id = :ID INTO :ITTOT;
        ITOK = ITTOT;
        PORCENTA = 0;
        if (DETALLE = 'S') then
            BEGIN
            FOR SELECT D.crcl_nit, D.crev_fecha, C.crcl_nom, D.crev_explica, D.crev_respuesta
                FROM crm_eventos D, crm_clientes C
                WHERE D.crcl_nit = C.crcl_nit AND D.crcm_id = :ID
                INTO :cliente, :feccont, :nomcli, :explica, :respuesta
                DO
                BEGIN
                SELECT CRER_NOMBRE FROM crm_evento_respuesta WHERE CRER_ID = :respuesta INTO :respta;
                SUSPEND;
                END
            END
        ELSE
            suspend;
        END
    END
end^


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


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),
    RCREE 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),
    RADICADA NUMERIC(18,2),
    SINRADICAR NUMERIC(18,2),
    INSTCART VARCHAR(255),
    CALIFICA VARCHAR(20),
    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 ENTREGA DATE;
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 PRCREE 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 AUTORCREE VARCHAR(10);
declare variable FAUTORCREE 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';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
  /* Ubique el NIT */
  FOR select C.TERC_NIT, 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, CLIE_CALIFICA
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND 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, :CALIFICA
    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;
        RCREE = 0;
        DTOF = 0;
        RADICADA = 0;
        SINRADICAR = 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
                    ENTREGA = NULL;
                    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, FACT_ENTREGA FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM, :ENTREGA;
                    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), SUM(SDCA_RCREE - SDCA_ABRCREE)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA, :prcree;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM), SUM((SDCA_RCREE - SDCA_ABRCREE)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :PRTFTE, :PRTIVA, :PRTICA, :prcree;
                    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 (FAUTORET <= FECDOC) then
                        PRTFTE = 0;
                    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 (prcree IS NULL) then
                        prcree = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (prcree > 0) then
                            prcree = 0;
                        END
                    ELSE    
                        BEGIN
                        if (prcree < 0) then
                            prcree = 0;
                        END
                    if (fautorcree <= FECDOC) then
                        prcree = 0;

                    SALDO = SALDO + PSALDO;
                    RTFTE = RTFTE + PRTFTE;
                    RTIVA = RTIVA + PRTIVA;
                    RTICA = RTICA + PRTICA;
                    RCREE = RCREE + prcree;
                    DTOF = DTOF + PDTOF;
                    if (ENTREGA IS NULL) then
                        SINRADICAR = SINRADICAR + PSALDO;
                    ELSE
                        RADICADA = RADICADA + PSALDO;
                    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;
                RCREE = 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
                            ENTREGA = NULL;
                            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, FACT_ENTREGA FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :PDTOF, :FECDTO, :TRM, :ENTREGA;
                            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), SUM(SDCA_RCREE - SDCA_ABRCREE)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA, :prcree;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM), SUM((SDCA_RCREE - SDCA_ABRCREE)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :PRTFTE, :PRTIVA, :PRTICA, :prcree;
                            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 (FAUTORET <= FECDOC) then
                                PRTFTE = 0;
                            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 (prcree IS NULL) then
                                prcree = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (prcree > 0) then
                                    prcree = 0;
                                END
                            ELSE
                                BEGIN
                                if (prcree < 0) then
                                    prcree = 0;
                                END
                            if (fautorcree <= FECDOC) then
                                prcree = 0;
                            SALDO = SALDO + PSALDO;
                            RTFTE = RTFTE + PRTFTE;
                            RTIVA = RTIVA + PRTIVA;
                            RTICA = RTICA + PRTICA;
                            RCREE = RCREE + prcree;
                            DTOF = DTOF + PDTOF;
                            if (ENTREGA IS NULL) then
                                SINRADICAR = SINRADICAR + PSALDO;
                            ELSE
                                RADICADA = RADICADA + PSALDO;
                            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^


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),
    DIASCR INTEGER,
    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(12);
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, CLIE_DIAS
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        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, :DIASCR
    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^


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),
    CALIFICA VARCHAR(20),
    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, CLIE_CALIFICA
    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, :CALIFICA
    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
                        if (AGRUPA = 'G') then
                          begin
                          if ((grupoc >= :venini) and (grupoc <= :venfin)) 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
                        if (AGRUPA = 'G') then
                          begin
                          if ((grupoc >= :venini) and (grupoc <= :venfin)) then
                            suspend;
                          end
                        else
                          suspend;
            END
        end
    end
end^


ALTER PROCEDURE REP_CLIENTES_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODCLI VARCHAR(20),
    NOMCLI VARCHAR(60),
    FECING VARCHAR(8),
    NITCLIE VARCHAR(20),
    DIR VARCHAR(60),
    TEL VARCHAR(40),
    CODMUNI VARCHAR(5),
    TIPONEG INTEGER,
    NOMCIU VARCHAR(60),
    ZONA VARCHAR(3))
AS
declare variable fecclie date;
declare variable TIPO VARCHAR(10);
begin
TIPO = 'FACTVENT';
for select distinct c.terc_nit from clientes c, facturas f, prefijos p, terceros t where f.terc_nit = c.terc_nit
    and t.terc_nit = c.terc_nit and f.fact_anulado = 'N' and f.pref_pre = p.pref_pre and ((p.sucu_id = :subempresa)
    or (:subempresa = 0)) and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and p.tido_cod = 31 order by c.clie_cod into :codcli
    do
    begin
        select t.terc_nom, c.clie_fecha, c.terc_nit, t.terc_dir, t.terc_tel, t.terc_ciu, c.grca_cod, c.zona_cod from clientes c, terceros t where c.clie_cod = :codcli and c.terc_nit = t.terc_nit
        into :nomcli, fecclie, :nitclie, :dir, :tel, :nomciu, :tiponeg, :zona;
    if (tel is null) then
        begin
        select terc_cel from terceros where terc_nit = :nitclie into :tel;
        end
    if (fecclie is null) then
        begin
        fecclie = 'NOW';
        end
    if (zona is null) then
        begin
        zona = '';
        end
    select ciud_cod from ciudades where ciud_nom = :nomciu into :codmuni;
    execute procedure fecha_a_conta(fecclie) returning_values(fecing);
    suspend;
    end
TIPO = 'DEVOLCLI';
for select distinct c.clie_cod from clientes c, devoluciones_ventas f, prefijos p, terceros t where f.terc_nit = c.terc_nit
    and t.terc_nit = c.terc_nit and f.devt_anulado = 'N' and f.pref_pre = p.pref_pre and ((p.sucu_id = :subempresa)
    or (:subempresa = 0)) and f.devt_fecha >= :fecini and f.devt_fecha <= :fecfin and p.tido_cod = 33 order by c.clie_cod into :codcli
    do
    begin
        select t.terc_nom, c.clie_fecha, c.terc_nit, t.terc_dir, t.terc_tel, t.terc_ciu, c.grca_cod, c.zona_cod from clientes c, terceros t where c.clie_cod = :codcli and c.terc_nit = t.terc_nit
        into :nomcli, fecclie, :nitclie, :dir, :tel, :nomciu, :tiponeg, :zona;
    if (tel is null) then
        begin
        select terc_cel from terceros where terc_nit = :nitclie into :tel;
        end
    if (fecclie is null) then
        begin
        fecclie = 'NOW';
        end
    if (zona is null) then
        begin
        zona = '';
        end
    select ciud_cod from ciudades where ciud_nom = :nomciu into :codmuni;
    execute procedure fecha_a_conta(fecclie) returning_values(fecing);
    suspend;
    end
end^


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 VARCHAR(20),
    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^


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),
    RTICABASE NUMERIC(18,2),
    RTECREE 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_rticabase, C.clie_rtcree, 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, :rticabase, :rtecree,
    :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
                                    if (AGRUPA = 'G') then
                                      begin
                                      if ((grupoc >= :venini) and (grupoc <= :venfin)) 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_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
                                if (AGRUPA = 'G') then
                                  begin
                                  if ((grupoc >= :venini) and (grupoc <= :venfin)) then
                                    suspend;
                                  end
                                else
                                    suspend;
                END
            end
        end
    end
end^


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),
    PRECIO NUMERIC(18,2),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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_TOTAL-FCDE_IVAMONTO, 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, :PRECIO, :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_TOTAL-RPVD_IVAMONTO, 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, :PRECIO, :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_TOTAL-DVCD_IVAMONTO, 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, :PRECIO, :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_TOTAL-OCDE_IVAMONTO, 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, :PRECIO, :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_TOTAL-CPRD_IVAMONTO, 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, :PRECIO, :BASE, :IVA, :CONSUMO, :DTO
                DO
                BEGIN
                NOMBRE = '';
                SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nombre;
                SUSPEND;
                END
        END
    END
END^


ALTER PROCEDURE REP_COMPRAS_ARTICULOI (
    TIPO INTEGER,
    DETALLE CHAR(1),
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    SUBINI VARCHAR(4),
    SUBFIN VARCHAR(4),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    AGENCIA INTEGER,
    CEROS CHAR(1))
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(3),
    NOMGRUPO VARCHAR(60),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(60),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    TOTMON NUMERIC(18,2),
    GASTOS NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    DTO NUMERIC(9,2),
    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);
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
    BEGIN
    MARINI = GRPINI;
    MARFIN = GRPFIN;
    SUBINI = '';
    SUBFIN = 'zz';
    GRPINI = '';
    GRPFIN = '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
      AND (((:grpini = '') AND (:grpfin = 'zz')) or ((A.grup_cod >= :grpini) AND (A.grup_cod <= :grpfin)))
      AND (((:subINI = '') AND (:SUBFIN = 'zz')) or ((A.subg_cod >= :SUBINI) AND (A.subg_cod <= :subfin)))
      AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN)))
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    EXECUTE PROCEDURE nombres_grupos_inventario (:CODGRUPO, :CODSUBG, :CODMARC)
        returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 137 INTO :NOMTIPO;
            SELECT SUM(D.fpde_cant * D.fpde_factor), SUM(D.fpde_total-D.fpde_ivamonto), SUM(D.fpde_totmon), SUM(D.fpde_totgtos)
                FROM factura_proforma_det D, factura_proforma F, PREFIJOS P
                WHERE F.fapo_id = D.fapo_id AND ARTI_COD = :ARTICULO AND FAPO_FECHA >= :FECINI AND FAPO_FECHA <= :FECFIN AND FAPO_ANULADO = 'N'
                AND ((P.sucu_id = :AGENCIA) or (P.sucu_id = 0) or (:AGENCIA = 0)) AND P.tido_cod = 137 AND P.pref_pre = F.pref_pre
                INTO :CANTIDAD, :BASE, :TOTMON, :GASTOS;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (TOTMON IS NULL) then
                TOTMON = 0;
            if (GASTOS IS NULL) then
                GASTOS = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            end
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 139 INTO :NOMTIPO;
            SELECT SUM(OD.slde_cant * OD.slde_factor), SUM(OD.slde_total), SUM(OD.slde_totmon)
                FROM solicitud_importacion_det OD, solicitud_importacion O, PREFIJOS P
                WHERE O.slim_id = OD.slim_id AND ARTI_COD = :ARTICULO AND SLIM_FECHA >= :FECINI AND SLIM_FECHA <= :FECFIN AND SLIM_ANULADO = 'N'
                AND ((P.sucu_id = :AGENCIA) or (P.sucu_id = 0) or (:AGENCIA = 0)) AND P.tido_cod = 139 AND P.pref_pre = O.pref_pre
                INTO :CANTIDAD, :BASE, :TOTMON;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (TOTMON IS NULL) then
                TOTMON = 0;
            GASTOS = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            end
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 137 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FAPO_NUMERO, FAPO_FECHA, D.fpde_cant * D.fpde_factor, D.fpde_prunit / D.fpde_factor, D.fpde_totmon, D.fpde_totgtos, D.fpde_dtoporc
                FROM factura_proforma F, factura_proforma_det D, PREFIJOS P
                WHERE F.FAPO_ID = D.FAPO_ID AND ARTI_COD = :ARTICULO AND FAPO_FECHA >= :FECINI AND FAPO_FECHA <= :FECFIN AND FAPO_ANULADO = 'N'
                AND ((P.sucu_id = :AGENCIA) or (P.sucu_id = 0) or (:AGENCIA = 0)) AND P.tido_cod = 137 AND P.pref_pre = F.pref_pre
                ORDER BY FAPO_FECHA, F.FAPO_ID, D.fpde_item
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :TOTMON, :GASTOS, :DTO
                DO
                    SUSPEND;
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 139 INTO :NOMTIPO;
            FOR SELECT O.PREF_PRE, SLIM_NUMERO, SLIM_FECHA, OD.slde_cant * OD.slde_factor, OD.slde_prunit / OD.slde_factor, OD.slde_totmon, 0, OD.slde_dtoporc
                FROM solicitud_importacion O, solicitud_importacion_det OD, PREFIJOS P
                WHERE O.slim_id = OD.slim_id AND ARTI_COD = :ARTICULO AND SLIM_FECHA >= :FECINI AND SLIM_FECHA <= :FECFIN AND SLIM_ANULADO = 'N'
                AND ((P.sucu_id = :AGENCIA) or (P.sucu_id = 0) or (:AGENCIA = 0)) AND P.tido_cod = 139 AND P.pref_pre = O.pref_pre
                ORDER BY SLIM_FECHA, O.slim_id, OD.slde_item
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :TOTMON, :GASTOS, :DTO
                DO
                    SUSPEND;
            END
        END
    END
END^


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(8),
    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^


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^


ALTER PROCEDURE REP_COMPRAS_PROVEEDORI (
    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),
    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),
    TOTMON NUMERIC(18,2),
    GASTOS NUMERIC(18,2),
    ARANCEL NUMERIC(18,2),
    TOTGEN 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 = 137) then
          SELECT COUNT(*), SUM(F.fapo_dtomonto), SUM(f.fapo_adicional), SUM(f.fapo_ivamonto), SUM(F.fapo_extra), SUM(F.fapo_totmon), SUM(F.fapo_totgtos), SUM(F.fapo_arancmonto), SUM(F.fapo_total)
            FROM factura_proforma F, PREFIJOS P
            WHERE F.pref_pre = P.pref_pre AND P.tido_cod = 137 AND ((:subempresa = 0) or (P.sucu_id = :subempresa))
            AND TERC_NIT = :NIT AND FApO_FECHA >= :FECINI AND FApO_FECHA <= :FECFIN AND FApO_ANULADO = 'N'
            INTO :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTMON, :GASTOS, :ARANCEL, :TOTAL;
        if (TIPO = 139) 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, :TOTMON, :GASTOS, :ARANCEL, :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 (TOTMON IS NULL) then
            TOTMON = 0;
        if (GASTOS IS NULL) then
            GASTOS = 0;
        if (ARANCEL IS NULL) then
            ARANCEL = 0;
        SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
        TOTGEN = TOTAL + GASTOS + ARANCEL;
        if (CEROS = 'S') then
          SUSPEND;
        ELSE
          if (CANTIDAD > 0) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 137) THEN
          FOR SELECT FAPO_ID, F.PREF_PRE, FAPO_NUMERO, FAPO_FECHA, FAPO_DTOMONTO, FAPO_ADICIONAL, FAPO_IVAMONTO, FAPO_EXTRA, FAPO_TOTAL, FAPO_TOTMON, FAPO_TOTGTOS, F.fapo_arancmonto
            FROM factura_proforma F, PREFIJOS P
            WHERE F.pref_pre = P.pref_pre AND P.tido_cod = 137 AND ((:subempresa = 0) or (P.sucu_id = :subempresa)) AND TERC_NIT = :NIT AND FAPO_FECHA >= :FECINI AND FAPO_FECHA <= :FECFIN AND FAPO_ANULADO = 'N'
            ORDER BY FAPO_FECHA, FAPO_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :TOTMON, :GASTOS, :ARANCEL
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            TOTGEN = TOTAL + GASTOS + ARANCEL;
            SUSPEND;
            END
        if (TIPO = 139) THEN
          FOR SELECT SLIM_ID, F.PREF_PRE, SLIM_NUMERO, SLIM_FECHA, F.SLIM_DTOMONTO, F.SLIM_ADICIONAL, 0, F.slim_extra, F.slim_total, F.slim_totmon, 0, 0
            FROM solicitud_importacion 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 SLIM_FECHA >= :FECINI AND SLIM_FECHA <= :FECFIN AND SLIM_ANULADO = 'N'
            ORDER BY SLIM_FECHA, SLIM_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :TOTMON, :GASTOS, :ARANCEL
            DO
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            TOTGEN = TOTAL + GASTOS + ARANCEL;
            SUSPEND;
            END
        END
    END
END^


ALTER PROCEDURE REP_COMPRAS_RIMAR (
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    LISTA INTEGER,
    MESES INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    BARRAS VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMAR VARCHAR(3),
    GRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    ULTCOSTOME NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    PROVEEDOR VARCHAR(60),
    SUGERIDO NUMERIC(18,2))
AS
declare variable SALDO2 numeric(18,4);
declare variable TRANSITO numeric(18,4);
declare variable TRANSITO2 numeric(18,4);
declare variable CADSQL varchar(1024);
declare variable SERVER varchar(100);
declare variable COMPANIA varchar(3);
declare variable USUARIO varchar(10);
declare variable CLAVE varchar(10);
declare variable FECCOS date;
declare variable TRCONF varchar(2);
declare variable FECREM date;
declare variable CANTREM numeric(18,2);
declare variable PROVEEDOR2 varchar(60);
declare variable TRM numeric(18,2);
declare variable TRM2 numeric(18,2);
declare variable DEV NUMERIC(18,2);
begin
SELECT FIRST 1 RPCO_SERVIDOR, RPCO_COD FROM replica_compania INTO :SERVER, :COMPANIA;
SERVER = SERVER || '\DATOS\' || :COMPANIA || '\SYSPLUS.FDB';
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'NOMBRE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (USUARIO);
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'CLAVE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (CLAVE);
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'TRASLADOS', 'AFECTAR AMBAS BODEGAS AL CONFIRMAR ENTREGA') returning_values (TRCONF);
FOR SELECT ARTI_COD, ARTI_DES, GRUP_COD, SUBG_COD, MARC_COD
    FROM ARTICULO WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :GRPFIN AND ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN
    ORDER BY GRUP_COD, SUBG_COD, ARTI_COD
    INTO :CODIGO, :DESCRIPCION, :codgrp, :codsubg, :codmar
    DO
    BEGIN
    BARRAS = '';
    SELECT FIRST 1 B.coba_cod FROM barras_articulo B WHERE ARTI_COD = :CODIGO INTO :barras;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :codmar INTO :marca;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE GRUP_COD = :codgrp AND SUBG_COD = :codsubg INTO :SUBGRUPO;
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :codgrp INTO :GRUPO;
    /* EXISTENCIA */
    EXECUTE PROCEDURE saldo_total_inventario(:codigo, :fecfin) returning_values (:SALDO);
    if (SERVER IS NOT NULL) then
        BEGIN
        CADSQL = 'SELECT SALDO FROM saldo_total_inventario(''' || :codigo || ''', ''' || :fecfin || ''')';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :SALDO2;
        SALDO = SALDO + SALDO2;
        END
    if (TRCONF = 'NO') then
        BEGIN
        TRANSITO = 0;
        SELECT SUM(TRAS_CANT * TRAS_FACTOR) FROM TRASFERENCIAS T, TRASFERENCIAS_DETALLE TD
            WHERE T.TRAN_ID = TD.TRAN_ID AND TRAN_FECHA <= :FECFIN AND TRAN_CONFIRMA = 'N' AND ARTI_COD = :CODIGO AND TRAN_ANULADO = 'N'
            INTO :TRANSITO;
        if (transito is null) then
            transito = 0;
        SALDO = SALDO + TRANSITO;
        if (SERVER IS NOT NULL) then
            BEGIN
            TRANSITO2 = 0;
            CADSQL = 'SELECT SUM(TRAS_CANT * TRAS_FACTOR) FROM TRASFERENCIAS T, TRASFERENCIAS_DETALLE TD WHERE T.TRAN_ID = TD.TRAN_ID AND TRAN_FECHA <= ''' ||
                :FECFIN || ''' AND TRAN_CONFIRMA = ''N'' AND ARTI_COD = ''' || :codigo || ''' AND TRAN_ANULADO = ''N''';
            EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
                INTO :TRANSITO2;
            if (transito2 is null) then
                transito2 = 0;
            SALDO = SALDO + TRANSITO2;
            END
        END
    /* UTIMA COMPRA */
    fechacmp = null;
    fecrem = null;
    cantcmp = 0;
    select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR, TERC_NOM, FACO_TRM from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D, TERCEROS T
        where F.FACO_ID = D.faco_id and D.ARTI_COD = :CODIGO and FACO_FECHA <= :fecfin AND FACO_ANULADO = 'N' AND F.TERC_NIT = T.TERC_NIT
        order by FACO_FECHA desc, F.FACO_ID desc
        into :fechacmp, :cantcmp, :proveedor, :TRM;
    select first 1 REPR_FECHA, RPVD_CANT * RPVD_FACTOR, TERC_NOM, 1 from remision_proveedor F, remision_proveedor_det D, TERCEROS T
        where F.repr_id = D.repr_id and D.ARTI_COD = :CODIGO and REPR_FECHA <= :fecfin AND REPR_ANULADO = 'N' AND F.TERC_NIT = T.TERC_NIT
        order by REPR_FECHA desc, F.repr_id desc
        into :fecrem, :cantrem, :proveedor2, :TRM2;
    if ((FECREM is not null) and (FECREM > fechacmp)) then
        begin
        fechacmp = FECREM;
        cantcmp = cantrem;
        proveedor = proveedor2;
        TRM = 1;
        end
    if (SERVER IS NOT NULL) then
        BEGIN
        fecrem = null;
        cantrem = 0;
        CADSQL = 'select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR, TERC_NOM, FACO_TRM from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D, terceros T where F.FACO_ID = D.faco_id and D.ARTI_COD = ''' ||
          :codigo || ''' and FACO_FECHA <= ''' || :fecfin || ''' AND F.TERC_NIT = T.TERC_NIT AND FACO_ANULADO = ''N'' order by FACO_FECHA desc, F.FACO_ID desc';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :fecrem, :cantrem, :proveedor2, :trm2;
        if ((FECREM is not null) and (FECREM > fechacmp)) then
            begin
            fechacmp = FECREM;
            cantcmp = cantrem;
            proveedor = :proveedor2;
            TRM = TRM2;
            end

        CADSQL = 'select first 1 REPR_FECHA, RPVD_CANT * RPVD_FACTOR, TERC_NOM from remision_proveedor F, remision_proveedor_det D, TERCEROS T where F.repr_id = D.repr_id and D.ARTI_COD = ''' ||
          :codigo || ''' and REPR_FECHA <= ''' || :fecfin || ''' AND F.TERC_NIT = T.TERC_NIT AND REPR_ANULADO = ''N'' order by REPR_FECHA desc, F.REPR_ID desc';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :fecrem, :cantrem, :proveedor2;
        if ((FECREM is not null) and (FECREM > fechacmp)) then
            begin
            fechacmp = FECREM;
            cantcmp = cantrem;
            proveedor = :proveedor2;
            TRM = 1;
            end
        END
    /* ORDENADO */
    EXECUTE PROCEDURE ordenes_compra_articulo(:CODIGO, :FECFIN) returning_values (:ordenado);
    if (SERVER IS NOT NULL) then
        BEGIN
        SALDO2 = 0;
        CADSQL = 'SELECT ORDENADO FROM ORDENES_COMPRA_ARTICULO(''' || :codigo || ''', ''' || :fecfin || ''')';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :SALDO2;
        ordenado = ordenado + SALDO2;
        END
    /* ventas */
    SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :CODIGO AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECFIN AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32)) INTO :ventas;
    if (ventas IS NULL) then
        VENTAS = 0;
    DEV = 0;
    SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :CODIGO AND MVAR_FECHA >= :FECINI AND MVAR_FECHA <= :FECFIN AND (MVAR_TIPODOC = 33) INTO :dev;
    if (DEV IS NULL) then
        DEV = 0;
    VENTAS = VENTAS - DEV;
    if (SERVER IS NOT NULL) then
        BEGIN
        SALDO2 = 0;
        CADSQL = 'SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = ''' || :codigo || ''' AND MVAR_FECHA >= ''' || :fecini || ''' AND MVAR_FECHA <= ''' ||
            :fecfin || ''' AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32))';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :SALDO2;
        if (saldo2 is null) then
            saldo2 = 0;
        ventas = ventas + SALDO2;
        SALDO2 = 0;
        CADSQL = 'SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = ''' || :codigo || ''' AND MVAR_FECHA >= ''' || :fecini || ''' AND MVAR_FECHA <= ''' ||
            :fecfin || ''' AND (MVAR_TIPODOC = 33)';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :SALDO2;
        if (saldo2 is null) then
            saldo2 = 0;
        ventas = ventas - SALDO2;
        END
    /* PRECIO */
    SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :CODIGO AND LIPR_COD = :LISTA INTO :PRECIO;
    /* ULTIMO COSTO */
    SELECT FIRST 1 COST_ULTIMO, COST_FECHA FROM COSTOS WHERE (ARTI_COD = :codigo) AND (COST_FECHA <= :FECFIN)
        ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC INTO :ultcosto, FECCOS;
    if (SERVER IS NOT NULL) then
        BEGIN
        fecrem = null;
        CADSQL = 'SELECT FIRST 1 COST_ULTIMO, COST_FECHA FROM COSTOS WHERE (ARTI_COD = ''' || :codigo || ''' ) AND (COST_FECHA <= ''' || :fecfin ||
            ''') ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :cantrem, :fecrem;
        if ((FECREM is not null) and (FECREM > feccos)) then
            begin
            feccos = FECREM;
            ultcosto = cantrem;
            end
        END
    if (TRM <> 1) then
        ultcostome = ultcosto / TRM;
    else
        ultcostome = 0;
    /* PROMEDIO VENTAS */
    CANTREM = 0;
    SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :CODIGO AND MVAR_FECHA >= (:FECFIN-365) AND MVAR_FECHA <= :FECFIN AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32)) INTO :cantrem;
    if (cantrem IS NULL) then
        cantrem = 0;
    DEV = 0;
    SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
        WHERE ARTI_COD = :CODIGO AND MVAR_FECHA >= (:FECFIN-365) AND MVAR_FECHA <= :FECFIN AND (MVAR_TIPODOC = 33) INTO :DEV;
    if (DEV IS NULL) then
        DEV = 0;
    cantrem = cantrem - DEV;
    if (SERVER IS NOT NULL) then
        BEGIN
        SALDO2 = 0;
        CADSQL = 'SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = ''' || :codigo || ''' AND MVAR_FECHA >= ''' || (:fecfin-365) || ''' AND MVAR_FECHA <= ''' ||
            :fecfin || ''' AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32))';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :SALDO2;
        if (saldo2 is null) then
            saldo2 = 0;
        cantrem = cantrem + SALDO2;
        SALDO2 = 0;
        CADSQL = 'SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = ''' || :codigo || ''' AND MVAR_FECHA >= ''' || (:fecfin-365) || ''' AND MVAR_FECHA <= ''' ||
            :fecfin || ''' AND (MVAR_TIPODOC = 33)';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :SALDO2;
        if (saldo2 is null) then
            saldo2 = 0;
        cantrem = cantrem - SALDO2;
        END
    CANTREM = CANTREM * :MESES / 12;
    SUGERIDO = CANTREM - SALDO - ORDENADO;
    suspend;
    END
end^


ALTER PROCEDURE REP_COMPRAS_SISMED (
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    ITEM INTEGER,
    MES CHAR(2),
    CUM VARCHAR(18),
    PRMIN NUMERIC(18,2),
    PRMAX NUMERIC(18,2),
    COMPRAS NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    FACMIN VARCHAR(12),
    FACMAX VARCHAR(12))
AS
declare variable CODIGO VARCHAR(20);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable NUMMES INTEGER;
begin
ITEM = 0;
NUMMES = MESINI;
WHILE (NUMMES <= MESFIN) DO
    BEGIN
    if (NUMMES < 10) then
        MES = '0' || :NUMMES;
    ELSE
        MES = :NUMMES;
    FECINI = ANO || '/' || nummes || '/01';

    FECFIN = FECINI + 31;
    FECFIN = :FECFIN - EXTRACT(DAY FROM :FECFIN) + 1;

    FOR SELECT ARTI_COD, ARTI_CUM FROM ARTICULO A WHERE ARTI_CUM <> '' AND ESAR_COD = 'A'
        INTO :CODIGO, :CUM
        DO
        BEGIN
        SELECT SUM(D.fcde_cant* D.fcde_factor), SUM(D.fcde_total-D.fcde_ivamonto), MIN(D.fcde_prunit/D.fcde_factor), MAX(D.fcde_prunit/D.fcde_factor)
            FROM facturas_compra F, facturas_compras_detalle D, prefijos P WHERE F.faco_id = D.faco_id AND D.arti_cod = :CODIGO
            AND F.faco_fecha >= :FECINI AND F.faco_fecha <= :FECFIN AND F.faco_anulado = 'N'
            AND P.tido_cod = 21 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
            INTO :CANTIDAD, :COMPRAS, :PRMIN, :PRMAX;

        FACMIN = '';
        select MIN(F.pref_pre || F.faco_numero) FROM facturas_compra F, facturas_compras_detalle D, prefijos P
            WHERE F.faco_id = D.faco_id AND D.arti_cod = :CODIGO AND (D.fcde_prunit / D.fcde_factor) = :prmin
            AND F.faco_fecha >= :FECINI AND F.faco_fecha <= :FECFIN AND F.faco_anulado = 'N'
            AND P.tido_cod = 21 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
            INTO :FACMIN;
        select MAX(F.pref_pre || F.faco_numero) FROM facturas_compra F, facturas_compras_detalle D, prefijos P
            WHERE F.faco_id = D.faco_id AND D.arti_cod = :CODIGO AND (D.fcde_prunit / D.fcde_factor) = :prmax
            AND F.faco_fecha >= :FECINI AND F.faco_fecha <= :FECFIN AND F.faco_anulado = 'N'
            AND P.tido_cod = 21 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
            INTO :facmax;
        if (CANTIDAD <> 0) then
            BEGIN
            ITEM = ITEM + 1;
            suspend;
            END
        END
    NUMMES = NUMMES + 1;
    END
end^


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(8),
    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^


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^


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),
    RCREE NUMERIC(18,2),
    FORMAPAGO VARCHAR(30),
    FPBANCO VARCHAR(3),
    FPCUENTA VARCHAR(20),
    FPNUMERO VARCHAR(20),
    FPFECHA DATE,
    ANULADO CHAR(1),
    OBS VARCHAR(255),
    MONTOCAJA NUMERIC(18,2),
    MONTOCHEQ NUMERIC(18,2),
    CODCOBRADOR INTEGER,
    NOMCOBRADOR VARCHAR(60))
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_RTCREEM, RECA_ANULADO, RECA_PROVISIONAL, SUBSTRING(RECA_OBS FROM 1 FOR 255), R.COBR_COD
        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, :RCREE, ANULADO, :numrel, :OBS, :CODCOBRADOR
        DO
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobrador INTO :NOMCOBRADOR;
            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;
                RCREE = 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_RTCREE, EGRE_ANULADO, SUBSTRING(EGRE_OBS FROM 1 FOR 255)
        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, :RCREE, :ANULADO, :OBS
        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;
                    RCREE = 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 = '';
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    RCREE = 0;
    /* CAMBIO DOC */
    FOR SELECT CADO_ID, TIDO_NOMLARGO, PREF_PRE, CADO_NUMERO, CADO_FECHA, CADO_CONC, '', D.CAJA_ID, CAJA_NOMBRE, 0, CADO_ANULADO, SUBSTRING(CADO_OBS FROM 1 FOR 255)
        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, :OBS
        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;
                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 = '';
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    RCREE = 0;
    /* CONSIGNA TARJETAS */
    FOR SELECT COTJ_ID, TIDO_NOMLARGO, PREF_PRE, COTJ_NUMERO, COTJ_FECHA, '', '', J.CAJA_ID, CAJA_NOMBRE, COTJ_ANULADO, SUBSTRING(COTJ_OBS FROM 1 FOR 255)
        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, :OBS
        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;
                MONTOCAJA = 0;
                montocheq = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                if (DETALLE = 'S') then
                    BEGIN
                    FOR SELECT FOPA_NOM, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, :FECHA, CTJD_BASE
                        FROM CONSIGNA_TARJETAS_DET D, formas_pago F
                        WHERE COTJ_ID = :ID AND D.fopa_id = F.fopa_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_RCREE, RCPR_ANULADO, RCPR_IDCRUCE, SUBSTRING(RCPR_OBS FROM 1 FOR 255)
        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, :RCREE, :ANULADO, :IDCRUCE, :OBS
        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;
                RCREE = 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 = '';
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    RCREE = 0;
    /* 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;
                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^


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),
    RCREE NUMERIC(18,2),
    ANULADO CHAR(1),
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    GRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(60),
    MONTOG NUMERIC(18,2),
    CODCOBRADOR INTEGER,
    NOMCOBRADOR VARCHAR(60))
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_RTCREEM, 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, :RCREE, :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;
                RCREE = 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, RCDE_COBR
                    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, :CODCOBRADOR
                    DO
                        SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobrador INTO :NOMCOBRADOR;
                        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_RTCREE, 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, :RCREE, :ANULADO
        do
        CODCOBRADOR = 0;
        nomcobrador = '';
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
                BEGIN
                if (ANULADO = 'S') then
                    BEGIN
                    MONTO = 0;
                    DESCUENTO = 0;
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    RCREE = 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 = '';
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    RCREE = 0;
    /* 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
        CODCOBRADOR = 0;
        nomcobrador = '';
          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;
                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 = '';
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    RCREE = 0;
    /* 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
        CODCOBRADOR = 0;
        nomcobrador = '';
          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;
                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_RCREE, 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, :RCREE, :ANULADO, :IDCRUCE
        DO
        CODCOBRADOR = 0;
        nomcobrador = '';
        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;
                RCREE = 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 = '';
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    RCREE = 0;
    /* 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
        CODCOBRADOR = 0;
        nomcobrador = '';
        if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                DESCUENTO = 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^


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),
    NIT VARCHAR(20),
    BENEFICIARIO VARCHAR(60),
    COBR INTEGER,
    COMIP CHAR(1),
    NUMREL VARCHAR(10),
    MONTO NUMERIC(18,2),
    DESCUENTO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFDOC VARCHAR(4),
    NUMDOC VARCHAR(8),
    FECDOC DATE,
    ANULADO CHAR(1),
    ABONODOC NUMERIC(18,2),
    RTFTEDOC NUMERIC(18,2),
    RTIVADOC NUMERIC(18,2),
    RTICADOC NUMERIC(18,2),
    RCREEDOC NUMERIC(18,2),
    DSCTODOC NUMERIC(18,2),
    CODCOBRADOR INTEGER,
    NOMCOBRADOR VARCHAR(60))
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, COBR_COD, TERC_NIT, RECA_NOMTERC, R.CAJA_ID, CAJA_NOMBRE, RECA_MONTO, RECA_DTOF, RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_RTCREEM, 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, :COBR, :NIT, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :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;
                rcreedoc = 0;
                RCREE = 0;
                dsctodoc = 0;
                fecdoc = null;
                SUSPEND;
                END
              ELSE
                BEGIN
                if (numrel is null) then
                    numrel = '';
                if (EXISTS (SELECT RCDE_ITEM FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :ID)) then
                    BEGIN
                    FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_RCREE, RCDE_DTOF, RCDE_COMIP, RCDE_COBR
                        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, :rcreedoc, :dsctodoc, :comip, :codcobrador
                        DO
                        BEGIN
                        SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobrador INTO :NOMCOBRADOR;
                        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :idtipo AND MVCL_IDREF = :iddoc INTO :fecdoc;
                        SUSPEND;
                        END
                    FOR SELECT rccr_tipodoc, rccr_iddoc, TIDO_NOMCORTO, rccr_prefijo, rccr_numero, rccr_abono, rccr_rtfte, rccr_rtiva, rccr_rtica, rccr_rcree, rccr_dtof, ''
                        FROM recibos_caja_crucec D, tipo_documento TD
                        WHERE TD.tido_cod = D.rccr_tipodoc AND RECA_ID = :ID
                        ORDER BY D.rccr_item
                        INTO :idtipo, :iddoc, :tipodoc, :prefdoc, :numdoc, :abonodoc, :rtftedoc, :rtivadoc, :rticadoc, :rcreedoc, :dsctodoc, :comip
                        DO
                            BEGIN
                            SELECT MVPR_FECHA FROM movimiento_proveedor WHERE MVPR_TIPOREF = :idtipo AND MVPR_IDREF = :iddoc INTO :fecdoc;
                            SUSPEND;
                            END
                    END
                else    
                    BEGIN
                    if (EXISTS (SELECT RCCR_ITEM FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :ID)) then
                        BEGIN
                        FOR SELECT rccr_tipodoc, rccr_iddoc, TIDO_NOMCORTO, rccr_prefijo, rccr_numero, rccr_abono, rccr_rtfte, rccr_rtiva, rccr_rtica, rccr_rcree, rccr_dtof, ''
                            FROM recibos_caja_crucec D, tipo_documento TD
                            WHERE TD.tido_cod = D.rccr_tipodoc AND RECA_ID = :ID
                            ORDER BY D.rccr_item
                            INTO :idtipo, :iddoc, :tipodoc, :prefdoc, :numdoc, :abonodoc, :rtftedoc, :rtivadoc, :rticadoc, :rcreedoc, :dsctodoc, :comip
                            DO
                                BEGIN
                                SELECT MVPR_FECHA FROM movimiento_proveedor WHERE MVPR_TIPOREF = :idtipo AND MVPR_IDREF = :iddoc INTO :fecdoc;
                                SUSPEND;
                                END
                        END
                    ELSE
                        begin
                        tipodoc = '';
                        prefdoc = '';
                        numdoc = '';
                        abonodoc = MONTO;
                        rtftedoc = 0;
                        rtivadoc = 0;
                        rticadoc = 0;
                        rcreedoc = 0;
                        dsctodoc = 0;
                        fecdoc = null;
                        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, TERC_NIT, 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, :NIT, :BENEFICIARIO, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :ANULADO
        do
            BEGIN
            codcobrador = 0;
            nomcobrador = '';
            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;
                    rcreedoc = 0;
                    RCREE = 0;
                    dsctodoc = 0;
                    fecdoc = null;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    if (numrel is null) then
                        numrel = '';
                    if (EXISTS (SELECT EGRE_ID FROM EGRESOS_DETALLE WHERE EGRE_ID = :ID)) then
                        BEGIN
                        FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, TIDO_NOMCORTO, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_RCREE, 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, :rcreedoc, :dsctodoc
                            DO
                                BEGIN
                                SELECT MVPR_FECHA FROM movimiento_proveedor WHERE MVPR_TIPOREF = :idtipo AND MVPR_IDREF = :iddoc INTO :fecdoc;
                                SUSPEND;
                                END
                        END
                    ELSE
                        if (EXISTS (SELECT EGRE_ID FROM EGRESOS_CRUCEC WHERE EGRE_ID = :ID)) then
                            BEGIN
                            FOR SELECT egcc_tipodoc, egcc_iddoc, TIDO_NOMCORTO, egcc_prefijo, egcc_numero, egcc_abono, egcc_rtfte, egcc_rtiva, egcc_rtica, egcc_rcree, egcc_dtof
                                FROM egresos_crucec D, tipo_documento TD
                                WHERE TD.tido_cod = D.egcc_tipodoc AND EGRE_ID = :ID
                                ORDER BY D.egcc_item
                                INTO :idtipo, :iddoc, :tipodoc, :prefdoc, :numdoc, :abonodoc, :rtftedoc, :rtivadoc, :rticadoc, :rcreedoc, :dsctodoc
                                DO
                                    BEGIN
                                    SELECT MVCL_FECHA FROM movimiento_clientes WHERE MVCL_TIPOREF = :idtipo AND MVCL_IDREF = :iddoc INTO :fecdoc;
                                    SUSPEND;
                                    END
                            END
                        ELSE
                            BEGIN
                            tipodoc = '';
                            prefdoc = '';
                            numdoc = '';
                            abonodoc = MONTO;
                            rtftedoc = 0;
                            rtivadoc = 0;
                            rticadoc = 0;
                            rcreedoc = 0;
                            dsctodoc = 0;
                            fecdoc = null;
                            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, :NIT, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :ANULADO
        DO
          begin
          codcobrador = 0;
          nomcobrador = '';
          if ((IDCAJA = 0) or (IDCAJA = CAJA)) then
            BEGIN
            tipodoc = '';
            prefdoc = '';
            numdoc = '';
            RTFTE = 0;
            RTIVA = 0;
            RTICA = 0;
            abonodoc = 0;
            rtftedoc = 0;
            rtivadoc = 0;
            rticadoc = 0;
            rcreedoc = 0;
            RCREE = 0;
            dsctodoc = 0;
            fecdoc = null;
            DESCUENTO = 0;
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 0;
                SUSPEND;
                END
            ELSE
                BEGIN
                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, :NIT, :BENEFICIARIO, :CAJA, :NOMCAJA, :ANULADO
        DO
          BEGIN
          codcobrador = 0;
          nomcobrador = '';
          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;
            rcreedoc = 0;
            dsctodoc = 0;
            fecdoc = null;
            DESCUENTO = 0;
            RTFTE = 0;
            RTIVA = 0;
            RTICA = 0;
            RCREE = 0;
            if ((ANULADOS = 'S') or (ANULADO = 'N')) then
              if (ANULADO = 'S') then
                BEGIN
                MONTO = 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, TERC_NIT, RCPR_NOMTERC, R.CAJA_ID, CAJA_NOMBRE, RCPR_MONTO, RCPR_DTOF, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, RCPR_RCREE, 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, :NIT, :BENEFICIARIO, :CAJA, :NOMCAJA, :MONTO, :DESCUENTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :ANULADO, :IDCRUCE
        DO
          begin
          codcobrador = 0;
          nomcobrador = '';
          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;
                RCREE = 0;
                tipodoc = '';
                prefdoc = '';
                numdoc = '';
                abonodoc = 0;
                rtftedoc = 0;
                rtivadoc = 0;
                rticadoc = 0;
                rcreedoc = 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_RCREE, 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, :rcreedoc, :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, 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, :NIT, :BENEFICIARIO, :CAJA, :NOMCAJA, :ANULADO
        DO
          begin
          codcobrador = 0;
          nomcobrador = '';
          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;
                RCREE = 0;
                tipodoc = '';
                prefdoc = '';
                numdoc = '';
                abonodoc = 0;
                rtftedoc = 0;
                rtivadoc = 0;
                rticadoc = 0;
                rcreedoc = 0;
                dsctodoc = 0;
                fecdoc = null;
                SUSPEND;
                END
              ELSE
                BEGIN
                SUSPEND;
                END
            END
          end
    END
END^


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(8),
    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(8),
    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),
    RCREEPORC NUMERIC(9,2),
    RCREEMONTO 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_RTCREE, NDCL_RTCREEM, 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, :RCREEPORC, :RCREEMONTO, :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;
                RCREEPORC = 0;
                RCREEMONTO = 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 (RCREEMONTO IS NULL) then
                RCREEMONTO = 0;
              if (DTOMONTO IS NULL) then
                DTOMONTO = 0;
              TOTAL = MONTO + IVAMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - rcreemonto;
              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, NCCL_RTCREE, NCCL_RTCREEM, 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, :RCREEPORC, :RCREEMONTO, :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;
                RCREEPORC = 0;
                RCREEMONTO = 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 (RCREEMONTO IS NULL) then
                RCREEMONTO = 0;
              if (DTOMONTO IS NULL) then
                DTOMONTO = 0;
              TOTAL = MONTO + IVAMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - rcreemonto;
              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, ACDE_RCREE, 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, :RCREEMONTO, :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;
                  RCREEPORC = 0;
                  RCREEMONTO = 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;
                  if (RCREEMONTO IS NULL) then
                    RCREEMONTO = 0;
                  TOTAL = ABONO + IVAMONTO;
                  NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RCREEMONTO;
                 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), SUM(ACDE_RCREE), 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, :RCREEMONTO, :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;
                  RCREEPORC = 0;
                  RCREEMONTO = 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;
                  if (RCREEMONTO IS NULL) then
                    RCREEMONTO = 0;
                  TOTAL = MONTO + IVAMONTO;
                  NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RCREEMONTO;
                 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, 0, 0, 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, :RCREEPORC, :RCREEMONTO, :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;
                RCREEPORC = 0;
                RCREEMONTO = 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 (RCREEMONTO IS NULL) then
                 RCREEMONTO = 0;
               if (DTOMONTO IS NULL) then
                 DTOMONTO = 0;
               TOTAL = MONTO + IVAMONTO;
               NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RCREEMONTO;
              END
            SUSPEND;
            END
    END
END^


ALTER PROCEDURE REP_COMPROBANTES_CMP (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER,
    MONEDA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NUMPROV VARCHAR(15),
    SIMPLIFICA CHAR(1),
    ORDEN VARCHAR(30),
    COTIZACI VARCHAR(30),
    REMISION VARCHAR(30),
    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),
    BASEIT 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),
    TRM NUMERIC(18,2))
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 21 INTO :NOMTIPO;
    /* FACTURA */
    FOR SELECT FACO_ID, F.PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, F.BODE_COD, B.BODE_NOM, F.TERC_NIT, TERC_NOM, FACO_NUMPROV, FACO_ORDEN, FACO_COTIZACI, FACO_REMISION, 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, FACO_ANULADO, FACO_SIMPLIFICADO, FACO_TRM
        FROM FACTURAS_COMPRA F, BODEGA B, TERCEROS T, PREFIJOS P
        WHERE F.BODE_COD = B.BODE_COD AND T.TERC_NIT = F.TERC_NIT AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 21 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY F.FACO_FECHA, FACO_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :NIT, :NOMTERCERO, :NUMPROV, :ORDEN, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO,
        :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :simplifica, :TRM
        DO
        BEGIN
        if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
          if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                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;
                    BASEIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                     FOR SELECT FCDE_ITEM, ARTI_COD, FCDE_CODBAR, FCDE_DESC, FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_REFERENCIA, FCDE_PRUNIT, FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL, FCDE_TOTAL - FCDE_IVAMONTO
                       FROM FACTURAS_COMPRAS_DETALLE
                        WHERE FACO_ID = :ID
                        ORDER BY FCDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT, :BASEIT
                        DO
                        BEGIN
                        if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                            BEGIN
                            PRECIO = PRECIO / TRM;
                            DTOMONTOIT = DTOMONTOIT / TRM;
                            IVAMONTOIT = IVAMONTOIT / TRM;
                            CONSUMOIT = CONSUMOIT / TRM;
                            SUBTOTALIT = SUBTOTALIT / TRM;
                            BASEIT = BASEIT / TRM;
                            END
                        SUSPEND;
                        END
                    END
                END
            ELSE
                BEGIN
                if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                    BEGIN
                    DTOMONTO = DTOMONTO / TRM;
                    ADICIONAL = ADICIONAL / TRM;
                    IVAMONTO = IVAMONTO / TRM;
                    EXTRA = EXTRA / TRM;
                    DTOFMONTO = DTOFMONTO / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                SUSPEND;
                END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 22 INTO :NOMTIPO;
    /* REMISION */
    FOR SELECT REPR_ID, R.PREF_PRE, REPR_NUMERO, R.REPR_FECHA, REPR_FECHA V,R.BODE_COD, B.BODE_NOM, R.TERC_NIT, TERC_NOM, REPR_NUMPROV, REPR_ORDEN, REPR_COTIZACI, '', REPR_DTOPORC, REPR_DTOMONTO, REPR_ADICIONAL, REPR_IVAMONTO,
        0, 0, 0, 0, 0, 0, REPR_EXTRA, 0, 0, REPR_FECHA, REPR_TOTAL, REPR_ANULADO, REPR_SIMPLIFICADO
        FROM REMISION_PROVEEDOR R, BODEGA B, TERCEROS T, PREFIJOS P
        WHERE R.BODE_COD = B.BODE_COD AND T.TERC_NIT = R.TERC_NIT AND R.REPR_FECHA >= :FECINI AND R.REPR_FECHA <= :FECFIN
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 22 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
         ORDER BY R.REPR_FECHA, REPR_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :NIT, :NOMTERCERO, :NUMPROV, :ORDEN, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO,
        :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :SIMPLIFICA
        DO
        BEGIN
        if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
          if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                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;
                    BASEIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                     FOR SELECT RPVD_ITEM, ARTI_COD, RPVD_CODBAR, RPVD_DESC, RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, '', RPVD_PRUNIT, RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL, RPVD_TOTAL - RPVD_IVAMONTO
                        FROM REMISION_PROVEEDOR_DET
                        WHERE REPR_ID = :ID
                        ORDER BY RPVD_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT, :BASEIT
                        DO
                        BEGIN
                        if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                            BEGIN
                            PRECIO = PRECIO / TRM;
                            DTOMONTOIT = DTOMONTOIT / TRM;
                            IVAMONTOIT = IVAMONTOIT / TRM;
                            CONSUMOIT = CONSUMOIT / TRM;
                            SUBTOTALIT = SUBTOTALIT / TRM;
                            BASEIT = BASEIT / TRM;
                            END
                        SUSPEND;
                        END
                    END
                END
            ELSE
                BEGIN
                if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                    BEGIN
                    DTOMONTO = DTOMONTO / TRM;
                    ADICIONAL = ADICIONAL / TRM;
                    IVAMONTO = IVAMONTO / TRM;
                    EXTRA = EXTRA / TRM;
                    DTOFMONTO = DTOFMONTO / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                SUSPEND;
                END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 24 INTO :NOMTIPO;
    /* DEVOLUCIONES */
    FOR SELECT DVCO_ID, D.PREF_PRE, DVCO_NUMERO, DVCO_FECHA, DVCO_FECHA, D.BODE_COD, B.BODE_NOM, D.TERC_NIT, TERC_NOM, '', '', '', DVCO_FACTURA, DVCO_DTOPORC, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
        DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO, DVCO_EXTRA, 0, 0, DVCO_FECHA, DVCO_TOTAL, DVCO_ANULADO, DVCO_SIMPLIFICADO
        FROM DEVOLUCIONES_COMPRAS D, BODEGA B, TERCEROS T, PREFIJOS P
        WHERE D.BODE_COD = B.BODE_COD AND D.TERC_NIT = T.TERC_NIT AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 24 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY D.DVCO_FECHA, DVCO_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :NIT, :NOMTERCERO, :NUMPROV, :ORDEN, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO,
        :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :simplifica
        DO
        BEGIN
        if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
          if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                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;
                    BASEIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                     FOR SELECT DVCD_ITEM, ARTI_COD, DVCD_CODBAR, DVCD_DESC, DVCD_CANT, DVCD_UNIDAD, BODE_COD, DVCD_LOTE, '', DVCD_PRUNIT, DVCD_DTOPORC, DVCD_DTOMONTO, DVCD_IVAPORC, DVCD_IVAMONTO, DVCD_CONSUMO, DVCD_TOTAL, DVCD_TOTAL - DVCD_IVAMONTO
                         FROM DEVOLUCIONES_COMPRAS_DET
                         WHERE DVCO_ID = :ID
                         ORDER BY DVCD_ITEM
                         INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT, :BASEIT
                         DO
                            BEGIN
                            if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                                BEGIN
                                PRECIO = PRECIO / TRM;
                                DTOMONTOIT = DTOMONTOIT / TRM;
                                IVAMONTOIT = IVAMONTOIT / TRM;
                                CONSUMOIT = CONSUMOIT / TRM;
                                SUBTOTALIT = SUBTOTALIT / TRM;
                                BASEIT = BASEIT / TRM;
                                END
                            SUSPEND;
                            END
                    END
                END
            ELSE
                BEGIN
                if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                    BEGIN
                    DTOMONTO = DTOMONTO / TRM;
                    ADICIONAL = ADICIONAL / TRM;
                    IVAMONTO = IVAMONTO / TRM;
                    EXTRA = EXTRA / TRM;
                    DTOFMONTO = DTOFMONTO / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                SUSPEND;
                END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 23 INTO :NOMTIPO;
    /* ORDEN */
    FOR SELECT ORDC_ID, O.PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_FECHA + ORDC_VALIDEZ, O.BODE_COD, B.BODE_NOM, O.TERC_NIT, TERC_NOM, '', '', ORDC_COTIZACION, '', ORDC_DTOPORC, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_IVAMONTO,
        0, 0, 0, 0, 0, 0, ORDC_EXTRA, 0, 0, ORDC_FECHA, ORDC_TOTAL, ORDC_ANULADO, ORDC_SIMPLIFICADO
        FROM ORDENES_COMPRA O, BODEGA B, TERCEROS T, PREFIJOS P
        WHERE O.BODE_COD = B.BODE_COD AND O.TERC_NIT = T.TERC_NIT AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN
         AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 23 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY O.ORDC_FECHA, ORDC_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :NIT, :NOMTERCERO, :NUMPROV, :ORDEN, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO,
        :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :simplifica
        DO
        BEGIN
        if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
          if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                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;
                    BASEIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                     FOR SELECT OCDE_ITEM, ARTI_COD, OCDE_CODBAR, OCDE_DESC, OCDE_CANT, OCDE_UNIDAD, '', '', '', OCDE_PRUNIT, OCDE_DTOPORC, OCDE_DTOMONTO, OCDE_IVAPORC, OCDE_IVAMONTO, OCDE_CONSUMO, OCDE_TOTAL, OCDE_TOTAL - OCDE_IVAMONTO
                         FROM ORDENES_COMPRA_DETALLE
                         WHERE ORDC_ID = :ID
                         ORDER BY OCDE_ITEM
                         INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT, :BASEIT
                         DO
                            BEGIN
                            if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                                BEGIN
                                PRECIO = PRECIO / TRM;
                                DTOMONTOIT = DTOMONTOIT / TRM;
                                IVAMONTOIT = IVAMONTOIT / TRM;
                                CONSUMOIT = CONSUMOIT / TRM;
                                SUBTOTALIT = SUBTOTALIT / TRM;
                                BASEIT = BASEIT / TRM;
                                END
                            SUSPEND;
                            END
                    END
                END
            ELSE
                BEGIN
                if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                    BEGIN
                    DTOMONTO = DTOMONTO / TRM;
                    ADICIONAL = ADICIONAL / TRM;
                    IVAMONTO = IVAMONTO / TRM;
                    EXTRA = EXTRA / TRM;
                    DTOFMONTO = DTOFMONTO / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                SUSPEND;
                END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 25 INTO :NOMTIPO;
    /* COTIZACION */
    FOR SELECT COPR_ID, C.PREF_PRE, COPR_NUMERO, COPR_FECHA, COPR_FECHA, C.BODE_COD, BODE_NOM, C.TERC_NIT, TERC_NOM, '', '', '', '', COPR_DTOPORC, COPR_DTOMONTO, COPR_ADICIONAL, COPR_IVAMONTO, 0, 0, 0, 0, 0, 0, COPR_EXTRA, 0, 0, COPR_FECHA, COPR_TOTAL, COPR_ANULADO
        FROM COTIZACION_PROVEEDOR C, BODEGA B, TERCEROS T, PREFIJOS P
        WHERE C.BODE_COD = B.BODE_COD AND C.TERC_NIT = T.TERC_NIT AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 25 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY C.COPR_FECHA, COPR_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :NIT, :NOMTERCERO, :NUMPROV, :ORDEN, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO
        DO
        BEGIN
        if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
          if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                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;
                    BASEIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                      FOR SELECT CPRD_ITEM, 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_TOTAL - CPRD_IVAMONTO
                         FROM COTIZACIONES_PROVEEDOR_DET
                         WHERE COPR_ID = :ID
                         ORDER BY CPRD_ITEM
                         INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT, :BASEIT
                         DO
                            BEGIN
                            if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                                BEGIN
                                PRECIO = PRECIO / TRM;
                                DTOMONTOIT = DTOMONTOIT / TRM;
                                IVAMONTOIT = IVAMONTOIT / TRM;
                                CONSUMOIT = CONSUMOIT / TRM;
                                SUBTOTALIT = SUBTOTALIT / TRM;
                                BASEIT = BASEIT / TRM;
                                END
                            SUSPEND;
                            END
                    END
                END
            ELSE
                BEGIN
                if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                    BEGIN
                    DTOMONTO = DTOMONTO / TRM;
                    ADICIONAL = ADICIONAL / TRM;
                    IVAMONTO = IVAMONTO / TRM;
                    EXTRA = EXTRA / TRM;
                    DTOFMONTO = DTOFMONTO / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                SUSPEND;
                END
            END
        END
    END
END^


ALTER PROCEDURE REP_COMPROBANTES_CXPAGAR (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    NUMPROV VARCHAR(20),
    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(8),
    ABONO NUMERIC(18,2),
    MONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    INALCM NUMERIC(18,2),
    RTFTEPORC NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPORC NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPORC NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    DTOFECHA DATE,
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    DTO1 NUMERIC(18,2),
    DTO2 NUMERIC(18,2),
    DTO3 NUMERIC(18,2),
    DTO4 NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    NETO NUMERIC(18,2),
    PROV_COD VARCHAR(15),
    ZONA_COD VARCHAR(60),
    NUMFAC VARCHAR(12),
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    BASE0 NUMERIC(18,2),
    BASE1 NUMERIC(18,2),
    BASE2 NUMERIC(18,2),
    BASE3 NUMERIC(18,2),
    IVA1 NUMERIC(18,2),
    IVA2 NUMERIC(18,2),
    IVA3 NUMERIC(18,2),
    TRM NUMERIC(18,2),
    ANULADO CHAR(1),
    NOMTIPO VARCHAR(30))
AS
BEGIN
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
/* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 51 INTO :NOMTIPO;
    FOR SELECT N.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,
        PROV_COD, NDPR_ANULADO, P.GRPR_COD, NDPR_DTO1M, NDPR_DTO3M, NDPR_DTO3M, NDPR_DTO4M, N.arti_cod, N.ndpr_facid, NDPR_RTCREE, NDPR_RTCREEM,
        ndpr_base0, ndpr_base1, ndpr_base2, ndpr_base3, ndpr_iva1, ndpr_iva2, ndpr_iva3, ndpr_inalcm, NDPR_NUMPROV, NDPR_TRM
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T, PROVEEDORES P, GRUPOS_PROVEEDORES G, PREFIJOS PR
        WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND g.grpr_cod = p.grpr_cod and NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN AND ((:PREFIJO IS NULL) or (:PREFIJO = '') or (PR.PREF_PRE = :PREFIJO))
         AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 51 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDPR_FECHA, NDPR_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,
        :PROV_COD, :ANULADO, :ZONA_COD, :dto1, :dto2, :dto3, :dto4, :articulo, :numfac, :RTCREE, :RTCREEM,
        :base0, :base1, :base2, :base3, :iva1, :iva2, :iva3, :inalcm, :numprov, :trm
        DO
          BEGIN
          if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
              BEGIN
                IVAPORC = 0;
                MONTO = 0;
                IVAMONTO = 0;
                inalcm = 0;
                RTFTEPORC = 0;
                RTFTEMONTO = 0;
                RTIVAPORC = 0;
                RTIVAMONTO = 0;
                RTICAPORC = 0;
                RTICAMONTO = 0;
                RTCREE = 0;
                RTCREEM = 0;
                DTOPORC = 0;
                DTOMONTO = 0;
                TOTAL = 0;
                NETO = 0;
                BASE0 = 0;
                BASE1 = 0;
                BASE2 = 0;
                BASE3 = 0;
                IVA1 = 0;
                IVA2 = 0;
                IVA3 = 0;
                DTO1 = 0;
                DTO2 = 0;
                DTO3 = 0;
                DTO4 = 0;
              END
            else
              begin
               if (IVAMONTO IS NULL) then
                 IVAMONTO = 0;
               if (inalcm IS NULL) then
                 inalcm = 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;
               if (base0 IS NULL) then
                 base0 = 0;
               if (base1 IS NULL) then
                 base1 = 0;
               if (base2 IS NULL) then
                 base2 = 0;
               if (base3 IS NULL) then
                 base3 = 0;
               if (iva1 IS NULL) then
                 iva1 = 0;
               if (iva2 IS NULL) then
                 iva2 = 0;
               if (iva3 IS NULL) then
                 iva3 = 0;
               TOTAL = MONTO + IVAMONTO;
               NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
               end
            DESCRIPCION = '';
            if ((ARTICULO <> '') AND (ARTICULO IS NOT NULL)) then
                SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :articulo INTO :descripcion;
            if ((NUMFAC <> 0) AND (NUMFAC IS NOT NULL)) then
                SELECT PREF_PRE || FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ID = :numfac INTO :NUMFAC;
            SUSPEND;
            END
          END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    DTO1 = 0;
    DTO2 = 0;
    DTO3 = 0;
    DTO4 = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 52 INTO :NOMTIPO;
    FOR SELECT N.PREF_PRE, NCPR_NUMERO, NCPR_FECHA, NCPR_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NCPR_MONTO,
        NCPR_IVAPORC, NCPR_IVAMONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, PROV_COD,
        NCPR_ANULADO, G.GRPR_COD, ARTI_COD, NCPR_FACID, ncpr_base0, ncpr_base1, ncpr_base2, ncpr_base3, NCPR_RTCREE, NCPR_RTCREEM,
        ncpr_iva1, ncpr_iva2, ncpr_iva3, ncpr_inalcm, NCPR_NUMPROV, NCPR_TRM
        FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T, PROVEEDORES P, GRUPOS_PROVEEDORES G, PREFIJOS PR
        WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND g.grpr_cod = p.grpr_cod AND NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN AND ((:PREFIJO IS NULL) or (:PREFIJO = '') or (PR.PREF_PRE = :PREFIJO))
         AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 52 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NCPR_FECHA, NCPR_ID
        INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL,
        :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :PROV_COD,
        :ANULADO, :ZONA_COD, :ARTICULO, :NUMFAC, :base0, :base1, :base2, :base3, :RTCREE, :RTCREEM,
        :iva1, :iva2, :iva3, :inalcm, :numprov, :trm
        DO
            BEGIN
            if (anulado = 'S') then
              BEGIN
                IVAPORC = 0;
                MONTO = 0;
                IVAMONTO = 0;
                inalcm = 0;
                RTFTEPORC = 0;
                RTFTEMONTO = 0;
                RTIVAPORC = 0;
                RTIVAMONTO = 0;
                RTICAPORC = 0;
                RTICAMONTO = 0;
                RTCREE = 0;
                RTCREEM = 0;
                DTOPORC = 0;
                DTOMONTO = 0;
                TOTAL = 0;
                NETO = 0;
                BASE0 = 0;
                BASE1 = 0;
                BASE2 = 0;
                BASE3 = 0;
                IVA1 = 0;
                IVA2 = 0;
                IVA3 = 0;
                DTO1 = 0;
                DTO2 = 0;
                DTO3 = 0;
                DTO4 = 0;
              END
            else
              begin
               if (IVAMONTO IS NULL) then
                 IVAMONTO = 0;
               if (inalcm IS NULL) then
                 inalcm = 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;
               if (base0 IS NULL) then
                 base0 = 0;
               if (base1 IS NULL) then
                 base1 = 0;
               if (base2 IS NULL) then
                 base2 = 0;
               if (base3 IS NULL) then
                 base3 = 0;
               if (iva1 IS NULL) then
                 iva1 = 0;
               if (iva2 IS NULL) then
                 iva2 = 0;
               if (iva3 IS NULL) then
                 iva3 = 0;
               TOTAL = MONTO + IVAMONTO;
               NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
              end
            DESCRIPCION = '';
            if ((ARTICULO <> '') AND (ARTICULO IS NOT NULL)) then
                SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :articulo INTO :descripcion;
            if ((NUMFAC <> 0) AND (NUMFAC IS NOT NULL)) then
                SELECT PREF_PRE || FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ID = :numfac INTO :NUMFAC;
            SUSPEND;
            END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    DTO1 = 0;
    DTO2 = 0;
    DTO3 = 0;
    DTO4 = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 53 INTO :NOMTIPO;
    if (DETALLE = 'S') then
        BEGIN
        FOR SELECT A.PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, A.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
            APPD_ITEM, TIDO_NOMCORTO, APPD_PREFIJO, APPD_NUMERO, APPD_APLICADO,
            APPD_RTFTE, APPD_RTIVA, APPD_RTICA, PROV_COD, APPR_ANULADO, GRPR_COD
            FROM APLICACION_PROVEDOR A, APLICACION_PROVEEDOR_DETALLE D, TERCEROS T, PROVEEDORES P, TIPO_DOCUMENTO TD, PREFIJOS PR
            WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND A.APPR_ID = D.APPR_ID AND APPD_TIPODOC = TD.TIDO_COD AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN AND ((:PREFIJO IS NULL)or (:PREFIJO = '') or (PR.PREF_PRE = :PREFIJO))
             AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 53 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY APPR_FECHA, APPD_ITEM
            INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :ITEM, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :PROV_COD, :ANULADO, :ZONA_COD
            DO
            BEGIN
              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
        END
    ELSE
        BEGIN
        FOR SELECT MAX(A.PREF_PRE), MAX(APPR_NUMERO), MAX(APPR_FECHA), MAX(APPR_CONC), 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(APPD_APLICADO), SUM(APPD_RTFTE), SUM(APPD_RTIVA), SUM(APPD_RTICA), MAX(PROV_COD), MAX(APPR_ANULADO)
            FROM APLICACION_PROVEDOR A, APLICACION_PROVEEDOR_DETALLE D, TERCEROS T, PROVEEDORES P, TIPO_DOCUMENTO TD, PREFIJOS PR
            WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND A.APPR_ID = D.APPR_ID AND APPD_TIPODOC = TD.TIDO_COD AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN AND ((:PREFIJO IS NULL) or (:PREFIJO = '') or (PR.PREF_PRE = :PREFIJO))
             AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 53 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.APPR_ID
            INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :MONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :PROV_COD, :ANULADO
            DO
            BEGIN
            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
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    DTO1 = 0;
    DTO2 = 0;
    DTO3 = 0;
    DTO4 = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 55 INTO :NOMTIPO;
    FOR SELECT A.PREF_PRE, ANPR_NUMERO, ANPR_FECHA, ANPR_CONC, A.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, ANPR_BASE,
        ANPR_IVAPORC, ANPR_IVAMONTO, ANPR_RTFTEPORC, ANPR_RTFTEMONTO, ANPR_RTIVAPORC, ANPR_RTIVAMONTO, ANPR_RTICAPORC, ANPR_RTICAMONTO, ANPR_DTOFECHA, ANPR_DTOFPORC, ANPR_DTOFMONTO, PROV_COD, ANPR_ANULADO, GRPR_COD
        FROM ANTICIPOS_PROVEEDOR A, TERCEROS T, PROVEEDORES P, PREFIJOS PR
        WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND ANPR_FECHA >= :FECINI AND ANPR_FECHA <= :FECFIN AND ((:PREFIJO IS NULL) or (:PREFIJO = '') or (PR.PREF_PRE = :PREFIJO))
         AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 55 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY ANPR_FECHA, ANPR_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, :PROV_COD, :ANULADO, :ZONA_COD
        DO
          BEGIN
          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
END^


ALTER PROCEDURE REP_COMPROBANTES_FAC (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    AUTORIZA VARCHAR(20),
    PTVTID INTEGER,
    PTVTNOM VARCHAR(60),
    VENDCOD INTEGER,
    VENDNOM VARCHAR(60),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    SUCURSAL VARCHAR(10),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TELEFONO VARCHAR(40),
    PEDIDO VARCHAR(30),
    COTIZACI VARCHAR(30),
    REMISION VARCHAR(30),
    OBS VARCHAR(255),
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    LOTE VARCHAR(15),
    REFERENCIA VARCHAR(60),
    PRECIO NUMERIC(18,2),
    DTOPORCIT NUMERIC(9,2),
    DTOMONTOIT NUMERIC(18,2),
    IVAPORCIT NUMERIC(9,2),
    IVAMONTOIT NUMERIC(18,2),
    CONSUMOIT NUMERIC(18,2),
    SUBTOTALIT NUMERIC(18,2),
    DTOPOR NUMERIC(9,2),
    DTO1POR NUMERIC(9,2),
    DTO2POR NUMERIC(9,2),
    DTO3POR NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    DTO1MONTO NUMERIC(18,2),
    DTO2MONTO NUMERIC(18,2),
    DTO3MONTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVAMONTO NUMERIC(18,2),
    RTFTEPOR NUMERIC(9,2),
    RTFTEMONTO NUMERIC(18,2),
    RTIVAPOR NUMERIC(9,2),
    RTIVAMONTO NUMERIC(18,2),
    RTICAPOR NUMERIC(9,2),
    RTICAMONTO NUMERIC(18,2),
    RTCREE NUMERIC(9,2),
    RTCREEM NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    DTOFPOR NUMERIC(9,2),
    DTOFMONTO NUMERIC(18,2),
    DTOFFECHA DATE,
    TOTAL NUMERIC(18,2),
    ANULADO CHAR(1),
    VEHICULO VARCHAR(8),
    DESPACHO VARCHAR(255),
    FECREG DATE,
    HORAREG TIME,
    CONTADO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    CONSCLI VARCHAR(7))
AS
declare variable CEROSIZQ CHAR(2);
declare variable MAXDIA smallint;
declare variable APLICADO NUMERIC(18,2);
BEGIN
VEHICULO = '';
execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'IMPRIMIR REPORTES DE COMPROBANTES Y CONSECUTIVOS CON CEROS A LA IZQUIERDA') returning_values (CEROSIZQ);
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, B.BODE_NOM, F.AUTO_NUMERO, F.PTVT_ID, PTVT_NOM,
        F.VEND_COD, VEND_NOMBRE, F.FACT_COMIPORC, F.FACT_COMIMONTO, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_COTIZACI, FACT_REMISION,
        FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO,
        FACT_RTICAPOR, FACT_RTICAMONTO, FACT_RTCREE, FACT_RTCREEM, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL, FACT_ANULADO, VEHI_COD,
        SUBSTRING(FACT_OBS FROM 1 FOR 255), FACT_SUCURSAL, FACT_DESPACHO
        FROM FACTURAS F, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
         F.BODE_COD = B.BODE_COD AND F.PTVT_ID = P.PTVT_ID AND F.VEND_COD = V.VEND_COD AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
         AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         F.PREF_PRE >= :prefini AND F.PREF_PRE <= :preffin
        ORDER BY FACT_FECHA, FACT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM,
        :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION,
        :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO,
        :RTICAPOR, :RTICAMONTO, :RTCREE, :RTCREEM, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :VEHICULO,
        :OBS, :sucursal, :despacho
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            DIRECCION = '';
            CIUDAD = '';
            TELEFONO = '';
            SELECT TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE terc_nit = :NIT INTO :direccion, :ciudad, :telefono;
            SELECT SUM(RCDE_ABONO+RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE D.rcde_tipodoc = 31 AND D.rcde_iddoc = :id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
                INTO :CONTADO;
            if (CONTADO IS NULL) then
                CONTADO = 0;
            SELECT SUM(AD.acde_aplicado) FROM aplicacion_cliente_detalle AD, aplicacion_cliente A
                WHERE AD.acde_tipodoc = 31 AND AD.acde_iddoc = :id AND A.apcl_id = AD.apcl_id AND A.apcl_fecha = :FECHA AND AD.acde_anulado = 'N'
                INTO :APLICADO;
            if (aplicado IS NULL) then
                APLICADO = 0;
            CONTADO = CONTADO + APLICADO;
            CREDITO = TOTAL - CONTADO;
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 31 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                RTCREE = 0;
                RTCREEM = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), FADE_CANT, FADE_UNIDAD,
                        BODE_COD, FADE_LOTE, FADE_REFERENCIA, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO,
                        FADE_CONSUMO, FADE_TOTAL, fade_dto1, fade_dto2, fade_dto3, fade_dtom1, fade_dtom2, fade_dtom3
                        FROM FACTURAS_DETALLE FD
                        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, :dto1por, :dto2por, :dto3por, :dto1monto, :dto2monto, :dto3monto
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    DESPACHO = '';
    RTCREE = 0;
    RTCREEM = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.BODE_COD, B.BODE_NOM, '', R.PTVT_ID, PTVT_NOM, R.VEND_COD, VEND_NOMBRE, 0, 0, R.TERC_NIT, REVT_NOMTERC, '', '', '', 0, 0, 0, REVT_IVAMONTO, 0, 0, 0, 0, 0, 0, 0, 0, 0, REVT_FECHA DTOF, REVT_TOTAL, REVT_ANULADO, SUBSTRING(REVT_OBS FROM 1 FOR 255), REVT_SUCURSAL
        FROM REMISIONES_VENTA R, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
         R.BODE_COD = B.BODE_COD AND R.PTVT_ID = P.PTVT_ID AND R.VEND_COD = V.VEND_COD AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN
         AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 32 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         R.PREF_PRE >= :prefini AND R.PREF_PRE <= :preffin
        ORDER BY REVT_FECHA, REVT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            DIRECCION = '';
            CIUDAD = '';
            TELEFONO = '';
            SELECT TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE terc_nit = :NIT INTO :direccion, :ciudad, :telefono;
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 32 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, RVDE_REFERENCIA, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL
                        FROM REMISIONES_VENTA_DETALLE
                        WHERE REVT_ID = :ID
                        ORDER BY RVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    DESPACHO = '';
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_FECHA VENCE, D.BODE_COD, B.BODE_NOM, '', D.PTVT_ID, PTVT_NOM,
        D.VEND_COD, VEND_NOMBRE, DEVT_COMIPORC, DEVT_COMIMONTO, D.TERC_NIT, DEVT_NOMTERC, DEVT_FACTURA, '', DEVT_REMISION,
        DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO,
        DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_RTCREE, DEVT_RTCREEM, DEVT_EXTRA, 0, 0, DEVT_FECHA DTOF, DEVT_TOTAL, DEVT_ANULADO, SUBSTRING(DEVT_OBS FROM 1 FOR 255), DEVT_SUCURSAL
        FROM DEVOLUCIONES_VENTAS D, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE D.PTVT_ID >= :PTOINI AND D.PTVT_ID <= :PTOFIN AND
         D.BODE_COD = B.BODE_COD AND D.PTVT_ID = P.PTVT_ID AND D.VEND_COD = V.VEND_COD AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
         AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         D.PREF_PRE >= :prefini AND D.PREF_PRE <= :preffin
        ORDER BY DEVT_FECHA, DEVT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM,
        :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION,
        :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO,
        :RTICAPOR, :RTICAMONTO, :RTCREE, :RTCREEM, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 33 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            SELECT SUM(RCDE_ABONO+RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE D.rcde_tipodoc = 33 AND D.rcde_iddoc = :id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
                INTO :CONTADO;
            if (CONTADO IS NULL) then
                CONTADO = 0;
            ELSE
                CONTADO = CONTADO * -1;
            CREDITO = TOTAL - CONTADO;
            DIRECCION = '';
            CIUDAD = '';
            TELEFONO = '';
            SELECT TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE terc_nit = :NIT INTO :direccion, :ciudad, :telefono;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT DVDE_ITEM, ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD,
                        DVDE_LOTE, DVDE_REFERENCIA, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO,
                        DVDE_TOTAL, DVDE_DTO1, DVDE_DTO2, DVDE_DTO3, DVDE_DTOM1, DVDE_DTOM2, DVDE_DTOM3
                        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, :dto1por, :dto2por, :dto3por, :dto1monto, :dto2monto, :dto3monto
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    DESPACHO = '';
    RTCREE = 0;
    RTCREEM = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_FECHA VENCE, '', '', '', P.PTVT_ID, PTVT_NOM, P.VEND_COD, VEND_NOMBRE,
        0, 0, P.TERC_NIT, PEDI_NOMTERC, PEDI_ORDENC, PEDI_COTIZACI, '', PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO,
        0, 0, 0, 0, 0, 0, PEDI_EXTRA, 0, 0, PEDI_FECHA DTOF, PEDI_TOTAL, PEDI_ANULADO, SUBSTRING(PEDI_OBS FROM 1 FOR 255), PEDI_SUCURSAL, PEDI_CONSDIA
        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, :CONSCLI
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            DIRECCION = '';
            CIUDAD = '';
            TELEFONO = '';
            SELECT TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE terc_nit = :NIT INTO :direccion, :ciudad, :telefono;
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 34 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            MAXDIA = 0;
            SELECT MAX(PEDI_CONSDIA) FROM PEDIDOS WHERE PEDI_ANULADO = 'N' AND PEDI_FECHA = :FECHA AND TERC_NIT = :NIT INTO :MAXDIA;
            if (MAXDIA IS NULL) then
                MAXDIA = 0;
            CONSCLI = CONSCLI || '/' || MAXDIA;

            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                RTCREE = 0;
                RTCREEM = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD,
                        '', '', PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO,
                        PEDE_CONSUMO, PEDE_TOTAL, pede_dto1, pede_dto2, pede_dto3, pede_dtom1, pede_dtom2, pede_dtom3
                        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, :dto1por, :dto2por, :dto3por, :dto1monto, :dto2monto, :dto3monto
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    DESPACHO = '';
    RTCREE = 0;
    RTCREEM = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_FECHA VENCE, '', '', '', C.PTVT_ID, PTVT_NOM, C.VEND_COD, VEND_NOMBRE, 0, 0, C.TERC_NIT, COTI_NOMTERC, '', '', '', COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, 0, 0, 0, 0, 0, 0, COTI_EXTRA, 0, 0, COTI_FECHA DTOF, COTI_TOTAL, COTI_ANULADO, SUBSTRING(COTI_OBS FROM 1 FOR 255), COTI_SUCURSAL
        FROM COTIZACIONES C, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
         C.PTVT_ID = P.PTVT_ID AND C.VEND_COD = V.VEND_COD AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN
         AND PR.PREF_PRE = C.PREF_PRE AND PR.TIDO_COD = 35 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         C.PREF_PRE >= :prefini AND C.PREF_PRE <= :preffin
        ORDER BY COTI_FECHA, COTI_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            DIRECCION = '';
            CIUDAD = '';
            TELEFONO = '';
            SELECT TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE terc_nit = :NIT INTO :direccion, :ciudad, :telefono;
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 35 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, '', '', CTDE_REFERENCIA, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL
                        FROM COTIZACIONES_DETALLE
                        WHERE COTI_ID = :ID
                        ORDER BY CTDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
END^


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


ALTER PROCEDURE REP_COMPROBANTES_TRANS (
    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 (
    DOCUMENTO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VEHICULO VARCHAR(8),
    VNUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    CAJAID INTEGER,
    CAJANOM VARCHAR(60),
    RUTAID INTEGER,
    RUTANOM VARCHAR(60),
    VENDCOD INTEGER,
    VENDNOM VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CONCEPTO VARCHAR(60),
    FORMAP CHAR(1),
    ANULADO CHAR(1),
    MONTO NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    ITEM INTEGER,
    VALORIT NUMERIC(18,2))
AS
declare variable DESTINO VARCHAR(5);
BEGIN
VEHICULO = '';
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 86 INTO :DOCUMENTO;
    FOR SELECT TIQP_ID, F.tiqp_pref, TIQP_NUMERO, TIQP_FECHA, TIQP_CAJA, CAJA_NOMBRE, TIQP_VEND, VEND_NOMBRE, TIQP_VEHICULO,
        TIQP_RUTA, TIQP_NIT, TIQP_NOMBRE, TIQP_PASAJE, TIQP_SEGURO, TIQP_TOTAL, TIQP_FORMAP, TIQP_ANULADO
        FROM tiquete_pasajero F, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE F.tiqp_caja >= :PTOINI AND F.tiqp_caja <= :PTOFIN AND
         F.tiqp_caja = C.caja_id AND F.tiqp_vend = V.vend_cod AND TIQP_FECHA >= :FECINI AND TIQP_FECHA <= :FECFIN
         AND PR.PREF_PRE = F.tiqp_pref AND PR.TIDO_COD = 86 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         F.tiqp_pref >= :prefini AND F.tiqp_pref <= :preffin
        ORDER BY TIQP_FECHA, TIQP_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid,  :NIT, :NOMTERCERO, :monto, :seguros, :total, :formap, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT RUTA_NOMBRE FROM ruta_pasajeros WHERE RUTA_ID = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 87 INTO :DOCUMENTO;
    FOR SELECT CGRM_ID, R.CGRM_PREF, CGRM_NUMERO, CGRM_FECHA, R.cgrm_caja, C.caja_nombre, R.cgrm_vend, VEND_NOMBRE, R.cgrm_vehiculo,
        R.cgrm_destino, R.cgrm_nit, R.cgrm_remnom, R.cgrm_flete, R.cgrm_seguro, R.cgrm_total, R.cgrm_fpago, R.cgrm_anulado
        FROM carga_remesa R, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE R.cgrm_caja >= :PTOINI AND R.cgrm_caja <= :PTOFIN AND
        R.cgrm_caja = c.caja_id AND R.cgrm_vend = V.VEND_COD AND CGRM_FECHA >= :FECINI AND CGRM_FECHA <= :FECFIN AND R.tido_cod = 87 AND
        PR.PREF_PRE = R.cgrm_pref AND PR.TIDO_COD = 87 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
        R.cgrm_pref >= :prefini AND R.cgrm_pref <= :preffin
        ORDER BY CGRM_FECHA, CGRM_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid, :NIT, :NOMTERCERO, :monto, :seguros, :total, :formap, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT CIUD_NOM FROM ciudades WHERE CIUD_COD = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 88 INTO :DOCUMENTO;
    FOR SELECT PLPA_ID, P.plpa_pref, PLPA_NUMERO, PLPA_FECHA, P.plpa_caja, CAJA_NOMBRE, P.plpa_despacha, VEND_NOMBRE, P.plpa_vehiculo,
        P.plpa_ruta, P.plpa_pasaje, P.plpa_remesa, P.plpa_neto, P.plpa_anulado
        FROM PLANILLA_PASAJEROS P, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE P.plpa_caja >= :PTOINI AND P.plpa_caja <= :PTOFIN AND
         P.plpa_caja = C.caja_id AND P.plpa_despacha = V.VEND_COD AND PLPA_FECHA >= :FECINI AND PLPA_FECHA <= :FECFIN
         AND PR.PREF_PRE = P.plpa_pref AND PR.TIDO_COD = 88 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         P.plpa_pref >= :prefini AND P.plpa_pref <= :preffin
        ORDER BY PLPA_FECHA, PLPA_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid, :monto, :seguros, :total, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT RUTA_NOMBRE FROM ruta_pasajeros WHERE RUTA_ID = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    valorit = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT PLPA_ITEM, 'TIQUETE ' || PLPD_PREF || PLPD_NUMERO, T.tiqp_formap, PLPA_VALOR
                        FROM planilla_pasajeros_det D, tiquete_pasajero T
                        WHERE PLPA_ID = :ID AND D.plpa_tiquete = T.tiqp_id
                        ORDER BY PLPA_ITEM
                        INTO :ITEM, :concepto, :formap, :valorit
                        DO
                        SUSPEND;
                    FOR SELECT PLPA_ITEM, 'REMESA ' || PLPR_PREF || PLPR_NUMREM, C.cgrm_fpago, PLPR_VALOR
                        FROM planilla_pasajeros_rem R, carga_remesa C
                        WHERE PLPA_ID = :ID AND R.plpr_remesa = C.cgrm_id
                        ORDER BY PLPA_ITEM
                        INTO :ITEM, :concepto, :formap, :valorit
                        DO
                        SUSPEND;
                    FOR SELECT PLPC_ITEM, C.copl_nom, PLPC_VALOR
                        FROM planilla_pasajeros_con P, conceptos_planilla C
                        WHERE PLPA_ID = :ID AND P.plpc_conc = C.copl_id
                        ORDER BY PLPC_ITEM
                        INTO :ITEM, :concepto, :valorit
                        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 = 85 INTO :DOCUMENTO;
    FOR SELECT CGRM_ID, R.CGRM_PREF, CGRM_NUMERO, CGRM_FECHA, R.cgrm_caja, C.caja_nombre, R.cgrm_vend, VEND_NOMBRE, R.cgrm_vehiculo,
        R.cgrm_destino, R.cgrm_nit, R.cgrm_remnom, R.cgrm_flete, R.cgrm_seguro, R.cgrm_total, R.cgrm_fpago, R.cgrm_anulado
        FROM carga_remesa R, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE R.cgrm_caja >= :PTOINI AND R.cgrm_caja <= :PTOFIN AND
        R.cgrm_caja = c.caja_id AND R.cgrm_vend = V.VEND_COD AND CGRM_FECHA >= :FECINI AND CGRM_FECHA <= :FECFIN AND
        PR.PREF_PRE = R.cgrm_pref AND PR.TIDO_COD = 85 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
        R.cgrm_pref >= :prefini AND R.cgrm_pref <= :preffin
        ORDER BY CGRM_FECHA, CGRM_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :DESTINO, :NIT, :NOMTERCERO, :monto, :seguros, :total, :formap, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            if ((DESTINO <> '') AND (DESTINO IS NOT NULL)) then
                SELECT CIUD_NOM FROM ciudades WHERE CIUD_COD = :DESTINO INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 89 INTO :DOCUMENTO;
    FOR SELECT MANC_ID, M.manc_pref, MANC_NUMERO, MANC_FECHA, M.manc_vehiculo, m.manc_conductor,
        M.manc_destino, M.manc_fleteneto, M.manc_apagar, M.manc_total, M.manc_anulado
        FROM manifiesto_carga M, PREFIJOS PR WHERE MANC_FECHA >= :FECINI AND MANC_FECHA <= :FECFIN
         AND PR.PREF_PRE = M.manc_pref AND PR.TIDO_COD = 89 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         M.manc_pref >= :prefini AND M.manc_pref <= :preffin
        ORDER BY MANC_FECHA, MANC_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :vehiculo, :nitcond,
        :destino, :monto, :seguros, :total, :anulado
        DO
        BEGIN
        rutaid = :destino;
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT CIUD_NOM FROM ciudades WHERE CIUD_COD = :destino INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    valorit = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT MNCD_ITEM, 'REMESA ' || MNCD_PREF || MNCD_NUMERO, C.cgrm_fpago, MNCD_VALOR
                        FROM manifiesto_carga_det D, carga_remesa C
                        WHERE MANC_ID = :ID AND D.mncd_remesa = C.cgrm_id
                        ORDER BY MNCD_ITEM
                        INTO :ITEM, :concepto, :formap, :valorit
                        DO
                        SUSPEND;
                    FOR SELECT MNCC_ITEM, C.copl_nom, MNCC_VALOR
                        FROM manifiestos_carga_conc M, conceptos_planilla C
                        WHERE MANC_ID = :ID AND M.mncc_conc = C.copl_id
                        ORDER BY MNCC_ITEM
                        INTO :ITEM, :concepto, :valorit
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
END^


ALTER PROCEDURE REP_CONCEP_XPAGAR (
    FEC DATE,
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    ANO CHAR(4))
RETURNS (
    CONO_IDORI INTEGER,
    CONO_PERIODO INTEGER,
    CONO_ANO CHAR(4),
    CONO_VALOR NUMERIC(18,2),
    CONO_ABONO NUMERIC(18,2),
    CONO_SALDO 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_APORTE CHAR(1),
    NOMPER VARCHAR(60),
    NOMEMPL VARCHAR(60))
AS
BEGIN
FOR SELECT N.nomi_id, P.pnom_nombre, N.nomi_periodo, N.nomi_ano, N.nomi_periodocidad 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 AND N.nomi_ano = :ano
    INTO :cono_idori, :nomper, :cono_periodo, :cono_ano, :cono_periodicidad
    DO
    BEGIN
    FOR SELECT CONC_COD, TERC_NIT, NOCO_VALOR, NOCO_PERIODO, NOCO_ANO, noco_deduc, noco_aporte
        FROM NOMINA_CONCEPTOS WHERE NOMI_ID = :cono_idori AND NOCO_gtoempr = 'N' AND NOCO_PROV = 'N'
        AND TERC_NIT >= :nitdesde AND TERC_NIT <= :nithasta
        INTO :conc_cod, :terc_nit, :cono_valor, :cono_periodo, :cono_ano, :cono_deduc, :cono_aporte
        DO
        BEGIN
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :terc_nit INTO :nomempl;
        IF (cono_valor <> 0) THEN
            BEGIN
            SELECT conc_nombre, conc_nomcorto FROM CONCEPTOS_NOMINA WHERE CONC_COD = :CONC_COD
                INTO :nomconc, :nomcortconc;
            SELECT SUM(cono_abono) FROM CONSOLIDADO_NOMINA C WHERE C.cono_idori = :cono_idori AND C.terc_nit = :terc_nit AND C.CONC_COD = :CONC_COD
                AND C.cono_deb = 'S' AND C.cono_pagook = 'S' INTO :cono_abono;
            IF (cono_abono IS NULL) THEN
                cono_abono = 0;
            cono_saldo = :cono_valor - :cono_abono;
            IF (cono_saldo <> 0) THEN
                SUSPEND;
            END
        END 
    END
END^


ALTER PROCEDURE REP_CONCEPTOS_NOMINA (
    ANOINI CHAR(4),
    ANOFIN CHAR(4),
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    DETALLE CHAR(1),
    CONCDESDE VARCHAR(20),
    CONCHASTA VARCHAR(20))
RETURNS (
    FECNOM DATE,
    CONCNOM VARCHAR(60),
    COD INTEGER,
    NIT VARCHAR(20),
    VALOR NUMERIC(18,2),
    ENTIDAD VARCHAR(20),
    DEDUC CHAR(1),
    PROV CHAR(1),
    APORTE CHAR(1),
    PAGOOK CHAR(1),
    PERIODO INTEGER,
    ANO CHAR(4),
    APLICAPROM CHAR(1),
    SALARIO CHAR(1),
    GTOEMPR CHAR(1),
    CTAGASTO VARCHAR(20),
    CTAPAGAR VARCHAR(20),
    NOMCTAGASTO VARCHAR(60),
    NOMCTAPAGAR VARCHAR(60),
    NOMCORTO VARCHAR(60),
    NOMPER VARCHAR(60),
    NOMEMPL VARCHAR(60))
AS
declare variable periodicidad integer;
BEGIN
if (DETALLE = 'S') then
    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, C.conc_ctagast, C.conc_ctacxp,
      N.noco_aplicaprom,N.noco_salario,N.noco_gtoempr,C.conc_nomcorto,T.terc_nom, o.nomi_periodocidad
      FROM NOMINA_CONCEPTOS N, CONCEPTOS_NOMINA C, NOMINA O, TERCEROS T
      WHERE N.noco_periodo <> 0 AND c.conc_cod = n.conc_cod AND O.nomi_id = N.nomi_id
      AND O.nomi_ano >= :anoini AND O.nomi_ano <= :anofin AND T.terc_nit = N.terc_nit AND N.conc_cod >= :concdesde AND N.conc_cod <= :conchasta
      AND N.noco_periodo >= :perdesde AND N.noco_periodo <= :perhasta
      ORDER BY N.conc_cod, O.nomi_ano, O.nomi_periodo, N.terc_nit
      INTO :fecnom,:concnom,:cod, :Nit,:valor,:entidad,:deduc, :prov,:aporte,:pagook, :periodo,:ano, :ctagasto, :ctapagar,
      :aplicaprom,:salario,:gtoempr,:nomcorto,:nomempl, :periodicidad
      DO
      BEGIN
      if (periodicidad < 4) then
        SELECT P.pnom_nombre FROM PERIODO_PAGO_NOMBRE P WHERE (P.ppag_cod = :periodicidad) AND P.ppag_periodo = :periodo into :nomper;
      else if (periodicidad = 4) then
        nomper = 'LIQUIDACION';
      else if (periodicidad = 5) then
        nomper = 'VACACIONES';
      SELECT CUEN_NOM FROM CUENTAS WHERE CUEN_COD = :ctagasto INTO :nomctagasto;
      SELECT CUEN_NOM FROM CUENTAS WHERE CUEN_COD = :ctapagar INTO :nomctapagar;
      SUSPEND;
      END
ELSE
    FOR SELECT MAX(C.conc_nombre),MAX(N.conc_cod), SUM(N.noco_valor),MAX(N.noco_deduc),
      MAX(N.noco_prov),MAX(N.noco_aporte),MAX(C.conc_ctagast), MAX(C.conc_ctacxp),
      MAX(N.noco_aplicaprom),MAX(N.noco_salario),MAX(N.noco_gtoempr),MAX(C.conc_nomcorto)
      FROM NOMINA_CONCEPTOS N, CONCEPTOS_NOMINA C, NOMINA O
      WHERE N.noco_periodo <> 0 AND c.conc_cod = n.conc_cod AND O.nomi_id = N.nomi_id AND
      O.nomi_ano >= :anoini AND O.nomi_ano <= :anofin AND N.conc_cod >= :concdesde AND N.conc_cod <= :conchasta
      AND N.noco_periodo >= :perdesde AND N.noco_periodo <= :perhasta
      GROUP BY N.conc_cod, O.nomi_ano
      INTO :concnom,:cod, :valor,:deduc, :prov,:aporte,:ctagasto, :ctapagar,
      :aplicaprom,:salario,:gtoempr,:nomcorto
      DO
      BEGIN
      SELECT CUEN_NOM FROM CUENTAS WHERE CUEN_COD = :ctagasto INTO :nomctagasto;
      SELECT CUEN_NOM FROM CUENTAS WHERE CUEN_COD = :ctapagar INTO :nomctapagar;
      SUSPEND;
      END
END^


ALTER PROCEDURE REP_CONDUCTORES (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOM VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    OBS VARCHAR(255),
    EMAIL VARCHAR(100),
    CEL VARCHAR(25),
    ESTADO CHAR(1),
    LICVEN DATE,
    LICENCIA VARCHAR(20),
    CATEGORIA VARCHAR(20),
    NOMCIUD VARCHAR(60))
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_email,terc_cel,terc_licencia, terc_categoria, terc_licven, terc_estado
    from terceros t where t.terc_nit >= :nitini and t.terc_nit <= :nitfin and terc_nom >= :nomini and terc_nom <= :nomfin and terc_conductor = 'S'
    into :nit, :nom, :dir, :ciu, :tel, :email, :cel, :licencia, :categoria, :licven, :estado
    do
    begin
    if ((inactivos = 'S') or (estado <> 'N'))  then
        begin
        suspend;
        end
    end
end^


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


ALTER PROCEDURE REP_CONSECUTIVOS_CAJA (
    TIPO INTEGER,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    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 FOPA_NOM, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, :FECHA, CTJD_BASE
                            FROM CONSIGNA_TARJETAS_DET D, formas_pago F
                            WHERE COTJ_ID = :ID AND D.fopa_id = F.fopa_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^


ALTER PROCEDURE REP_CONSECUTIVOS_CARTERA (
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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(8),
    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^


ALTER PROCEDURE REP_CONSECUTIVOS_CMP (
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER,
    MONEDA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(30),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    NUMPROV VARCHAR(15),
    SIMPLIFICA CHAR(1),
    ORDEN VARCHAR(30),
    COTIZACI VARCHAR(30),
    REMISION VARCHAR(30),
    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),
    BASEIT 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),
    TRM NUMERIC(18,2))
AS
BEGIN
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 21 INTO :NOMTIPO;
    /* FACTURA */
    FOR SELECT FACO_ID, F.PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, F.BODE_COD, B.BODE_NOM, F.TERC_NIT, TERC_NOM, FACO_NUMPROV, FACO_ORDEN, FACO_COTIZACI, FACO_REMISION, 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, FACO_ANULADO, FACO_SIMPLIFICADO, FACO_TRM
        FROM FACTURAS_COMPRA F, BODEGA B, TERCEROS T, PREFIJOS P
        WHERE F.BODE_COD = B.BODE_COD AND T.TERC_NIT = F.TERC_NIT AND F.PREF_PRE >= :PREINI AND F.PREF_PRE <= :PREFIN AND FACO_NUMERO >= :NUMINI AND FACO_NUMERO <= :NUMFIN
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 21 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY F.PREF_PRE, FACO_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :NIT, :NOMTERCERO, :NUMPROV, :ORDEN, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :simplifica, :TRM
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                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;
                    BASEIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                      FOR SELECT FCDE_ITEM, ARTI_COD, FCDE_CODBAR, FCDE_DESC, FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_REFERENCIA, FCDE_PRUNIT, FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL, FCDE_TOTAL - FCDE_IVAMONTO
                         FROM FACTURAS_COMPRAS_DETALLE
                         WHERE FACO_ID = :ID
                         ORDER BY FCDE_ITEM
                         INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT, :BASEIT
                         DO
                        BEGIN
                        if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                            BEGIN
                            PRECIO = PRECIO / TRM;
                            DTOMONTOIT = DTOMONTOIT / TRM;
                            IVAMONTOIT = IVAMONTOIT / TRM;
                            CONSUMOIT = CONSUMOIT / TRM;
                            SUBTOTALIT = SUBTOTALIT / TRM;
                            BASEIT = BASEIT / TRM;
                            END
                        SUSPEND;
                        END
                    END
                END
            ELSE
                BEGIN
                if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                    BEGIN
                    DTOMONTO = DTOMONTO / TRM;
                    ADICIONAL = ADICIONAL / TRM;
                    IVAMONTO = IVAMONTO / TRM;
                    EXTRA = EXTRA / TRM;
                    DTOFMONTO = DTOFMONTO / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                SUSPEND;
                END
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 22 INTO :NOMTIPO;
    /* REMISION */
    FOR SELECT REPR_ID, R.PREF_PRE, REPR_NUMERO, REPR_FECHA, REPR_FECHA, R.BODE_COD, B.BODE_NOM, R.TERC_NIT, TERC_NOM, REPR_NUMPROV, REPR_ORDEN, REPR_COTIZACI, '', REPR_DTOPORC, REPR_DTOMONTO, REPR_ADICIONAL, REPR_IVAMONTO, 0, 0, 0, 0, 0, 0, REPR_EXTRA, 0, 0, REPR_FECHA, REPR_TOTAL, REPR_ANULADO, REPR_SIMPLIFICADO
        FROM REMISION_PROVEEDOR R, BODEGA B, TERCEROS T, PREFIJOS P
        WHERE R.BODE_COD = B.BODE_COD AND T.TERC_NIT = R.TERC_NIT AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND REPR_NUMERO >= :NUMINI AND REPR_NUMERO <= :NUMFIN
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 22 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY R.PREF_PRE, REPR_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :NIT, :NOMTERCERO, :NUMPROV, :ORDEN, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :simplifica
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                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;
                    BASEIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                     FOR SELECT RPVD_ITEM, ARTI_COD, RPVD_CODBAR, RPVD_DESC, RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, '', RPVD_PRUNIT, RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL, RPVD_TOTAL - RPVD_IVAMONTO
                        FROM REMISION_PROVEEDOR_DET
                         WHERE REPR_ID = :ID
                        ORDER BY RPVD_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT, :BASEIT
                        DO
                        BEGIN
                        SUSPEND;
                        END
                    END
                END
            ELSE
                BEGIN
                SUSPEND;
                END
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 24 INTO :NOMTIPO;
    /* DEVOLUCIONES */
    FOR SELECT DVCO_ID, D.PREF_PRE, DVCO_NUMERO, DVCO_FECHA, DVCO_FECHA, D.BODE_COD, B.BODE_NOM, D.TERC_NIT, TERC_NOM, '', '', '', DVCO_FACTURA, DVCO_DTOPORC, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO, DVCO_EXTRA, 0, 0, DVCO_FECHA, DVCO_TOTAL, DVCO_ANULADO, DVCO_SIMPLIFICADO, DVCO_TRM
        FROM DEVOLUCIONES_COMPRAS D, BODEGA B, TERCEROS T, PREFIJOS P
        WHERE D.BODE_COD = B.BODE_COD AND D.TERC_NIT = T.TERC_NIT AND D.PREF_PRE >= :PREINI AND D.PREF_PRE <= :PREFIN AND DVCO_NUMERO >= :NUMINI AND DVCO_NUMERO <= :NUMFIN
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = 24 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY D.PREF_PRE, DVCO_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :NIT, :NOMTERCERO, :NUMPROV, :ORDEN, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :simplifica, :TRM
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                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;
                    BASEIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                     FOR SELECT DVCD_ITEM, ARTI_COD, DVCD_CODBAR, DVCD_DESC, DVCD_CANT, DVCD_UNIDAD, BODE_COD, DVCD_LOTE, '', DVCD_PRUNIT, DVCD_DTOPORC, DVCD_DTOMONTO, DVCD_IVAPORC, DVCD_IVAMONTO, DVCD_CONSUMO, DVCD_TOTAL, DVCD_TOTAL - DVCD_IVAMONTO
                         FROM DEVOLUCIONES_COMPRAS_DET
                         WHERE DVCO_ID = :ID
                         ORDER BY DVCD_ITEM
                         INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT, :BASEIT
                         DO
                        BEGIN
                        if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                            BEGIN
                            PRECIO = PRECIO / TRM;
                            DTOMONTOIT = DTOMONTOIT / TRM;
                            IVAMONTOIT = IVAMONTOIT / TRM;
                            CONSUMOIT = CONSUMOIT / TRM;
                            SUBTOTALIT = SUBTOTALIT / TRM;
                            BASEIT = BASEIT / TRM;
                            END
                        SUSPEND;
                        END
                    END
                END
            ELSE
                BEGIN
                if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                    BEGIN
                    DTOMONTO = DTOMONTO / TRM;
                    ADICIONAL = ADICIONAL / TRM;
                    IVAMONTO = IVAMONTO / TRM;
                    EXTRA = EXTRA / TRM;
                    DTOFMONTO = DTOFMONTO / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                SUSPEND;
                END
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 23 INTO :NOMTIPO;
    /* ORDEN */
    FOR SELECT ORDC_ID, O.PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_FECHA + ORDC_VALIDEZ, O.BODE_COD, B.BODE_NOM, O.TERC_NIT, TERC_NOM, '', '', ORDC_COTIZACION, '', ORDC_DTOPORC, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_IVAMONTO, 0, 0, 0, 0, 0, 0, ORDC_EXTRA, 0, 0, ORDC_FECHA, ORDC_TOTAL, ORDC_ANULADO, ORDC_SIMPLIFICADO
        FROM ORDENES_COMPRA O, BODEGA B, TERCEROS T, PREFIJOS P
        WHERE O.BODE_COD = B.BODE_COD AND O.TERC_NIT = T.TERC_NIT AND O.PREF_PRE >= :PREINI AND O.PREF_PRE <= :PREFIN AND ORDC_NUMERO >= :NUMINI AND ORDC_NUMERO <= :NUMFIN
         AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 23 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY O.PREF_PRE, ORDC_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :NIT, :NOMTERCERO, :NUMPROV, :ORDEN, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :simplifica
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                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;
                    BASEIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                     FOR SELECT OCDE_ITEM, ARTI_COD, OCDE_CODBAR, OCDE_DESC, OCDE_CANT, OCDE_UNIDAD, '', '', '', OCDE_PRUNIT, OCDE_DTOPORC, OCDE_DTOMONTO, OCDE_IVAPORC, OCDE_IVAMONTO, OCDE_CONSUMO, OCDE_TOTAL, OCDE_TOTAL - OCDE_IVAMONTO
                        FROM ORDENES_COMPRA_DETALLE
                        WHERE ORDC_ID = :ID
                        ORDER BY OCDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT, :BASEIT
                        DO
                        BEGIN
                        SUSPEND;
                        END
                    END
                END
            ELSE
                BEGIN
                SUSPEND;
                END
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 25 INTO :NOMTIPO;
    /* COTIZACION */
    FOR SELECT COPR_ID, C.PREF_PRE, COPR_NUMERO, COPR_FECHA, COPR_FECHA, C.BODE_COD, BODE_NOM, C.TERC_NIT, TERC_NOM, '', '', '', '', COPR_DTOPORC, COPR_DTOMONTO, COPR_ADICIONAL, COPR_IVAMONTO, 0, 0, 0, 0, 0, 0, COPR_EXTRA, 0, 0, COPR_FECHA, COPR_TOTAL, COPR_ANULADO
        FROM COTIZACION_PROVEEDOR C, BODEGA B, TERCEROS T, PREFIJOS P
        WHERE C.BODE_COD = B.BODE_COD AND C.TERC_NIT = T.TERC_NIT AND C.PREF_PRE >= :PREINI AND C.PREF_PRE <= :PREFIN AND COPR_NUMERO >= :NUMINI AND COPR_NUMERO <= :NUMFIN
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 25 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY C.PREF_PRE, COPR_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :NIT, :NOMTERCERO, :NUMPROV, :ORDEN, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                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;
                    BASEIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                      FOR SELECT CPRD_ITEM, 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_TOTAL - CPRD_IVAMONTO
                         FROM COTIZACIONES_PROVEEDOR_DET
                         WHERE COPR_ID = :ID
                         ORDER BY CPRD_ITEM
                         INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT, :BASEIT
                         DO
                        BEGIN
                        if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                            BEGIN
                            PRECIO = PRECIO / TRM;
                            DTOMONTOIT = DTOMONTOIT / TRM;
                            IVAMONTOIT = IVAMONTOIT / TRM;
                            CONSUMOIT = CONSUMOIT / TRM;
                            SUBTOTALIT = SUBTOTALIT / TRM;
                            BASEIT = BASEIT / TRM;
                            END
                        SUSPEND;
                        END
                    END
                END
            ELSE
                BEGIN
                if ((MONEDA <> 0) AND (TRM <> 1) AND (TRM <> 0)) then
                    BEGIN
                    DTOMONTO = DTOMONTO / TRM;
                    ADICIONAL = ADICIONAL / TRM;
                    IVAMONTO = IVAMONTO / TRM;
                    EXTRA = EXTRA / TRM;
                    DTOFMONTO = DTOFMONTO / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                SUSPEND;
                END
            END
        END
    END
END^


ALTER PROCEDURE REP_CONSECUTIVOS_CXPAGAR (
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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(8),
    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),
    PROV_COD VARCHAR(15),
    ZONA_COD VARCHAR(60),
    ANULADO CHAR(1),
    NOMTIPO VARCHAR(30))
AS
BEGIN
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
/* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 51 INTO :NOMTIPO;
    FOR SELECT N.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, PROV_COD, NDPR_ANULADO, GRPR_COD
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T, PROVEEDORES P, PREFIJOS PR
        WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND N.PREF_PRE >= :PREINI AND N.PREF_PRE <= :PREFIN AND NDPR_NUMERO >= :NUMINI AND NDPR_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 51 AND ((PR.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, :PROV_COD, :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 = 52 INTO :NOMTIPO;
    FOR SELECT N.PREF_PRE, NCPR_NUMERO, NCPR_FECHA, NCPR_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NCPR_MONTO,
        NCPR_IVAPORC, NCPR_IVAMONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, PROV_COD, NCPR_ANULADO, GRPR_COD
        FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T, PROVEEDORES P, PREFIJOS PR
        WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND N.PREF_PRE >= :PREINI AND N.PREF_PRE <= :PREFIN AND NCPR_NUMERO >= :NUMINI AND NCPR_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 52 AND ((PR.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, :PROV_COD, :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 = 53 INTO :NOMTIPO;
    if (DETALLE = 'S') then
        BEGIN
        FOR SELECT A.PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, A.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL,
            APPD_ITEM, TIDO_NOMCORTO, APPD_PREFIJO, APPD_NUMERO, APPD_APLICADO,
            APPD_RTFTE, APPD_RTIVA, APPD_RTICA, PROV_COD, APPR_ANULADO, GRPR_COD
            FROM APLICACION_PROVEDOR A, APLICACION_PROVEEDOR_DETALLE D, TERCEROS T, PROVEEDORES P, TIPO_DOCUMENTO TD, PREFIJOS PR
            WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND A.APPR_ID = D.APPR_ID AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND APPR_NUMERO >= :NUMINI AND APPR_NUMERO <= :NUMFIN AND APPD_TIPODOC = TD.TIDO_COD
             AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 53 AND ((PR.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, :PROV_COD, :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(APPR_NUMERO), MAX(APPR_FECHA), MAX(APPR_CONC), 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(APPD_APLICADO), SUM(APPD_RTFTE), SUM(APPD_RTIVA), SUM(APPD_RTICA), MAX(PROV_COD), MAX(APPR_ANULADO), MAX(GRPR_COD)
            FROM APLICACION_PROVEDOR A, APLICACION_PROVEEDOR_DETALLE D, TERCEROS T, PROVEEDORES P, TIPO_DOCUMENTO TD, PREFIJOS PR
            WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND A.APPR_ID = D.APPR_ID AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND APPR_NUMERO >= :NUMINI AND APPR_NUMERO <= :NUMFIN AND APPD_TIPODOC = TD.TIDO_COD
             AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 53 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.APPR_ID
            INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :MONTO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :PROV_COD, :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 = 55 INTO :NOMTIPO;
    FOR SELECT A.PREF_PRE, ANPR_NUMERO, ANPR_FECHA, ANPR_CONC, A.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, ANPR_BASE,
        ANPR_IVAPORC, ANPR_IVAMONTO, ANPR_RTFTEPORC, ANPR_RTFTEMONTO, ANPR_RTIVAPORC, ANPR_RTIVAMONTO, ANPR_RTICAPORC, ANPR_RTICAMONTO, ANPR_DTOFECHA, ANPR_DTOFPORC, ANPR_DTOFMONTO, PROV_COD, ANPR_ANULADO, GRPR_COD
        FROM ANTICIPOS_PROVEEDOR A, TERCEROS T, PROVEEDORES P, PREFIJOS PR
        WHERE A.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND ANPR_NUMERO >= :NUMINI AND ANPR_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 55 AND ((PR.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, :PROV_COD, :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^


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


ALTER PROCEDURE REP_CONSECUTIVOS_IMP (
    TIPO INTEGER,
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(6),
    NUMFIN VARCHAR(6),
    DETALLE CHAR(1),
    SOLOCERR CHAR(1))
RETURNS (
    TIPODOC INTEGER,
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ESTADO CHAR(1),
    NIT VARCHAR(20),
    NOMPROV VARCHAR(60),
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTOFOB NUMERIC(18,2),
    COSTOFOBM NUMERIC(18,2),
    TRM NUMERIC(18,2),
    MONEDA VARCHAR(60),
    DTOITE NUMERIC(9,2),
    COSTOTOT NUMERIC(18,2),
    FLETE NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    IMPUESTOS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PRNETO NUMERIC(18,2))
AS
begin
if (TIPO = 137) then
    BEGIN
    TIPODOC = TIPO;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    FOR SELECT FP.fapo_id, FP.pref_pre, FP.fapo_numero, FP.fapo_fecha, FP.terc_nit, FP.timo_cod, FP.fapo_estado
        FROM factura_proforma FP
        WHERE PREF_PRE >= :preini AND PREF_PRE <= :prefin AND FAPO_NUMERO >= :numini AND FAPO_NUMERO <= :numfin
        AND FAPO_ANULADO = 'N' AND ((FAPO_ESTADO = 'C') or (:SOLOCERR ='N'))
        INTO :id,  :PREFIJO, :NUMERO, :fecha,  :NIT, :MONEDA, :ESTADO
        DO
        BEGIN
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nomprov;
        SELECT TIMO_NOMBRE FROM TIPOS_MONEDA WHERE TIMO_COD = :MONEDA INTO :MONEDA;
        FOR SELECT FD.arti_cod, FD.fpde_cant, FD.fpde_unidad, FD.fpde_prunit, FD.fpde_prunitmon, FD.fpde_total, FD.fpde_trm, FD.fpde_dtoporc,
            FD.fpde_flete, FD.fpde_seguro, FD.fpde_otrogto, FD.fpde_ivamonto
            FROM factura_proforma_det FD WHERE FAPO_ID = :ID
            INTO :articulo, :cant, :unidad, :costofob, :costofobm, :total, :trm, :dtoite,
            :flete, :seguros, :otros, :impuestos
            DO
            BEGIN
            COSTOTOT = TOTAL - FLETE - SEGUROS - OTROS - IMPUESTOS;
            SELECT ARTI_DES, ARTI_DESCORTA FROM ARTICULO WHERE ARTI_COD = :articulo INTO :descripcion, :descorta;
            PRNETO = TOTAL / CANT;
            suspend;
            END
        END
    END
if (TIPO = 139) then
    BEGIN
    TIPODOC = TIPO;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    FOR SELECT FP.slim_id, FP.pref_pre, FP.slim_numero, FP.slim_fecha, FP.terc_nit, FP.timo_cod, '1'
        FROM solicitud_importacion FP
        WHERE PREF_PRE >= :preini AND PREF_PRE <= :prefin AND SLIM_NUMERO >= :numini AND SLIM_NUMERO <= :numfin
        AND SLIM_ANULADO = 'N'
        INTO :id,  :PREFIJO, :NUMERO, :fecha,  :NIT, :MONEDA, :ESTADO
        DO
        BEGIN
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nomprov;
        SELECT TIMO_NOMBRE FROM TIPOS_MONEDA WHERE TIMO_COD = :MONEDA INTO :MONEDA;
        FOR SELECT FD.arti_cod, FD.slde_cant, FD.slde_unidad, FD.slde_prunit, FD.slde_prunitmon, FD.slde_total, FD.slde_trm, FD.slde_dtoporc,
            0, 0, 0, 0
            FROM solicitud_importacion_det FD WHERE SLIM_ID = :ID
            INTO :articulo, :cant, :unidad, :costofob, :costofobm, :total, :trm, :dtoite,
            :flete, :seguros, :otros, :impuestos
            DO
            BEGIN
            COSTOTOT = TOTAL - FLETE - SEGUROS - OTROS - IMPUESTOS;
            SELECT ARTI_DES, ARTI_DESCORTA FROM ARTICULO WHERE ARTI_COD = :articulo INTO :descripcion, :descorta;
            PRNETO = TOTAL / CANT;
            suspend;
            END
        END
    END
end^


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


ALTER PROCEDURE REP_CONSECUTIVOS_TRANS (
    TIPO INTEGER,
    DETALLE CHAR(1),
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    NUMINI VARCHAR(4),
    NUMFIN VARCHAR(4),
    PTOINI INTEGER,
    PTOFIN INTEGER,
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    DOCUMENTO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VEHICULO VARCHAR(8),
    VNUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    CAJAID INTEGER,
    CAJANOM VARCHAR(60),
    RUTAID INTEGER,
    RUTANOM VARCHAR(60),
    VENDCOD INTEGER,
    VENDNOM VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CONCEPTO VARCHAR(60),
    FORMAP CHAR(1),
    ANULADO CHAR(1),
    MONTO NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    ITEM INTEGER,
    VALORIT NUMERIC(18,2))
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 = 86 INTO :DOCUMENTO;
    FOR SELECT TIQP_ID, F.tiqp_pref, TIQP_NUMERO, TIQP_FECHA, TIQP_CAJA, CAJA_NOMBRE, TIQP_VEND, VEND_NOMBRE, TIQP_VEHICULO,
        TIQP_RUTA, TIQP_NIT, TIQP_NOMBRE, TIQP_PASAJE, TIQP_SEGURO, TIQP_TOTAL, TIQP_FORMAP, TIQP_ANULADO
        FROM tiquete_pasajero F, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE F.tiqp_caja >= :PTOINI AND F.tiqp_caja <= :PTOFIN AND
         F.tiqp_caja = C.caja_id AND F.tiqp_vend = V.vend_cod AND TIQP_NUMERO >= :NUMINI AND TIQP_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = F.tiqp_pref AND PR.TIDO_COD = 86 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         F.tiqp_pref >= :preini AND F.tiqp_pref <= :prefin
        ORDER BY TIQP_FECHA, TIQP_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid,  :NIT, :NOMTERCERO, :monto, :seguros, :total, :formap, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT RUTA_NOMBRE FROM ruta_pasajeros WHERE RUTA_ID = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 87 INTO :DOCUMENTO;
    FOR SELECT CGRM_ID, R.CGRM_PREF, CGRM_NUMERO, CGRM_FECHA, R.cgrm_caja, C.caja_nombre, R.cgrm_vend, VEND_NOMBRE, R.cgrm_vehiculo,
        R.cgrm_destino, R.cgrm_nit, R.cgrm_remnom, R.cgrm_flete, R.cgrm_seguro, R.cgrm_total, R.cgrm_fpago, R.cgrm_anulado
        FROM carga_remesa R, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE R.cgrm_caja >= :PTOINI AND R.cgrm_caja <= :PTOFIN AND
        R.cgrm_caja = c.caja_id AND R.cgrm_vend = V.VEND_COD AND CGRM_NUMERO >= :NUMINI AND CGRM_NUMERO <= :NUMFIN AND R.tido_cod = 87 AND
        PR.PREF_PRE = R.cgrm_pref AND PR.TIDO_COD = 87 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
        R.cgrm_pref >= :preini AND R.cgrm_pref <= :prefin
        ORDER BY CGRM_FECHA, CGRM_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid, :NIT, :NOMTERCERO, :monto, :seguros, :total, :formap, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT CIUD_NOM FROM ciudades WHERE CIUD_COD = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 88 INTO :DOCUMENTO;
    FOR SELECT PLPA_ID, P.plpa_pref, PLPA_NUMERO, PLPA_FECHA, P.plpa_caja, CAJA_NOMBRE, P.plpa_despacha, VEND_NOMBRE, P.plpa_vehiculo,
        P.plpa_ruta, P.plpa_pasaje, P.plpa_remesa, P.plpa_neto, P.plpa_anulado
        FROM PLANILLA_PASAJEROS P, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE P.plpa_caja >= :PTOINI AND P.plpa_caja <= :PTOFIN AND
         P.plpa_caja = C.caja_id AND P.plpa_despacha = V.VEND_COD AND PLPA_NUMERO >= :NUMINI AND PLPA_FECHA <= :NUMFIN
         AND PR.PREF_PRE = P.plpa_pref AND PR.TIDO_COD = 88 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         P.plpa_pref >= :preini AND P.plpa_pref <= :prefin
        ORDER BY PLPA_FECHA, PLPA_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid, :monto, :seguros, :total, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT RUTA_NOMBRE FROM ruta_pasajeros WHERE RUTA_ID = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    valorit = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT PLPA_ITEM, 'TIQUETE ' || PLPD_PREF || PLPD_NUMERO, T.tiqp_formap, PLPA_VALOR
                        FROM planilla_pasajeros_det D, tiquete_pasajero T
                        WHERE PLPA_ID = :ID AND D.plpa_tiquete = T.tiqp_id
                        ORDER BY PLPA_ITEM
                        INTO :ITEM, :concepto, :formap, :valorit
                        DO
                        SUSPEND;
                    FOR SELECT PLPA_ITEM, 'REMESA ' || PLPR_PREF || PLPR_NUMREM, C.cgrm_fpago, PLPR_VALOR
                        FROM planilla_pasajeros_rem R, carga_remesa C
                        WHERE PLPA_ID = :ID AND R.plpr_remesa = C.cgrm_id
                        ORDER BY PLPA_ITEM
                        INTO :ITEM, :concepto, :formap, :valorit
                        DO
                        SUSPEND;
                    FOR SELECT PLPC_ITEM, C.copl_nom, PLPC_VALOR
                        FROM planilla_pasajeros_con P, conceptos_planilla C
                        WHERE PLPA_ID = :ID AND P.plpc_conc = C.copl_id
                        ORDER BY PLPC_ITEM
                        INTO :ITEM, :concepto, :valorit
                        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 = 85 INTO :DOCUMENTO;
    FOR SELECT CGRM_ID, R.CGRM_PREF, CGRM_NUMERO, CGRM_FECHA, R.cgrm_caja, C.caja_nombre, R.cgrm_vend, VEND_NOMBRE, R.cgrm_vehiculo,
        R.cgrm_destino, R.cgrm_nit, R.cgrm_remnom, R.cgrm_flete, R.cgrm_seguro, R.cgrm_total, R.cgrm_fpago, R.cgrm_anulado
        FROM carga_remesa R, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE R.cgrm_caja >= :PTOINI AND R.cgrm_caja <= :PTOFIN AND
        R.cgrm_caja = c.caja_id AND R.cgrm_vend = V.VEND_COD AND CGRM_NUMERO >= :NUMINI AND CGRM_NUMERO <= :NUMFIN AND R.tido_cod = 87 AND
        PR.PREF_PRE = R.cgrm_pref AND PR.TIDO_COD = 85 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
        R.cgrm_pref >= :preini AND R.cgrm_pref <= :prefin
        ORDER BY CGRM_FECHA, CGRM_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid, :NIT, :NOMTERCERO, :monto, :seguros, :total, :formap, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT CIUD_NOM FROM ciudades WHERE CIUD_COD = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 89 INTO :DOCUMENTO;
    FOR SELECT MANC_ID, M.manc_pref, MANC_NUMERO, MANC_FECHA, M.manc_vehiculo, m.manc_conductor,
        M.manc_destino, M.manc_fleteneto, M.manc_apagar, M.manc_total, M.manc_anulado
        FROM manifiesto_carga M, PREFIJOS PR WHERE MANC_NUMERO >= :NUMINI AND MANC_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = M.manc_pref AND PR.TIDO_COD = 89 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         M.manc_pref >= :preini AND M.manc_pref <= :prefin
        ORDER BY MANC_FECHA, MANC_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :vehiculo, :nitcond,
        :rutaid, :monto, :seguros, :total, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT CIUD_NOM FROM ciudades WHERE CIUD_COD = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    valorit = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT MNCD_ITEM, 'REMESA ' || MNCD_PREF || MNCD_NUMERO, C.cgrm_fpago, MNCD_VALOR
                        FROM manifiesto_carga_det D, carga_remesa C
                        WHERE MANC_ID = :ID AND D.mncd_remesa = C.cgrm_id
                        ORDER BY MNCD_ITEM
                        INTO :ITEM, :concepto, :formap, :valorit
                        DO
                        SUSPEND;
                    FOR SELECT MNCC_ITEM, C.copl_nom, MNCC_VALOR
                        FROM manifiestos_carga_conc M, conceptos_planilla C
                        WHERE MANC_ID = :ID AND M.mncc_conc = C.copl_id
                        ORDER BY MNCC_ITEM
                        INTO :ITEM, :concepto, :valorit
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
END^


ALTER PROCEDURE REP_CONSIGNACIONES (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    CODCUENTA VARCHAR(3),
    NROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    CODBANCO VARCHAR(2),
    NOMBANCO VARCHAR(60),
    ITEM INTEGER,
    FORPAGO VARCHAR(30),
    DET_CODBCO VARCHAR(2),
    DET_CUENTA VARCHAR(20),
    DET_NUMERO VARCHAR(20),
    DET_FECHA DATE,
    DET_MONTO NUMERIC(18,2))
AS
declare variable ID INTEGER;
BEGIN
  /*  */
  FOR SELECT CONS_ID, PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CUBA_CODCTA, CUBA_NUMERO, CUBA_TITULAR, 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_FECHA >= :FECINI AND CONS_FECHA <= :FECFIN
    into
    :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODCUENTA, :NROCUENTA, :TITULAR, :CODBANCO, :NOMBANCO
    DO
    FOR SELECT CODE_ITEM2, FOPA_NOM, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO
      FROM consigna_detalle D, FORMAS_PAGO F
      WHERE D.FOPA_ID = F.FOPA_ID AND D.CONS_ID = :ID
      INTO
      :ITEM, :FORPAGO, :DET_CODBCO, :DET_CUENTA, :DET_NUMERO, :DET_FECHA, :DET_MONTO
      DO
      SUSPEND;
END^


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 VARCHAR(20),
    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^


ALTER PROCEDURE REP_CRM_COMPROMISOS (
    TIPO INTEGER,
    ASESOR INTEGER,
    FECINI DATE,
    FECFIN DATE,
    CUMPLIDOS CHAR(1))
RETURNS (
    ID INTEGER,
    FECHA DATE,
    HORA TIME,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CONTACTO VARCHAR(60),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    NOMASESOR VARCHAR(60),
    CODASESOR INTEGER,
    OBSERVACION VARCHAR(255),
    USUARIO VARCHAR(8),
    CUMPLIDO CHAR(1))
AS
begin
FOR SELECT CRCO_ID, CRCO_FECHA, CRCO_HORA, CRCO_NIT, CRCO_CONTACTO, CRCO_TIPO, CRCO_ASESOR, CRCO_OBS, CRCO_CUMPLIDO, CRCO_USUARIO
    FROM crm_compromisos WHERE CRCO_FECHA >= :FECINI AND CRCO_FECHA <= :FECFIN AND CRCO_ANULADO = 'N' AND
    ((:ASESOR = 0) or (CRCO_ASESOR = :ASESOR)) AND ((:TIPO = 0) or (CRCO_TIPO = :TIPO)) AND
    ((:CUMPLIDOS = 'S') or (CRCO_CUMPLIDO = 'N'))
    INTO :ID, FECHA, :HORA, :NIT, :CONTACTO, :CODTIPO, :CODASESOR, :observacion, :cumplido, :usuario
    DO
    BEGIN
    SELECT CRCL_NOM FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT INTO :nomcliente;
    if (CONTACTO = 0) then
        SELECT TERC_CONTACTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :contacto;
    ELSE
        SELECT CRCO_NOMBRE FROM CRM_CONTACTOS WHERE CRCL_NIT = :NIT AND CRCO_ID = :CONTACTO INTO :contacto;
    SELECT CRTE_NOMBRE FROM crm_tipoevento WHERE CRTE_ID = :CODTIPO INTO :nomtipo;
    if (CODASESOR IS NOT NULL) then
        SELECT CRAS_NOMBRE FROM CRM_ASESOR WHERE CRAS_ID = :CODASESOR INTO :nomasesor;
   else
        NOMASESOR = '';
    suspend;
    END
end^


ALTER PROCEDURE REP_CRM_EVENTOS (
    TIPOC INTEGER,
    ASESOR INTEGER,
    MOTIVO INTEGER,
    RESPTA INTEGER,
    FECINI DATE,
    FECFIN DATE,
    INTERNOS CHAR(1))
RETURNS (
    ID INTEGER,
    FECHA DATE,
    HORA TIME,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CONTACTO VARCHAR(60),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    CODMOTIVO INTEGER,
    NOMMOTIVO VARCHAR(60),
    NOMASESOR VARCHAR(60),
    CODASESOR INTEGER,
    CODRESPTA INTEGER,
    NOMRESPTA VARCHAR(60),
    EXPLICA VARCHAR(255),
    SOLUCION VARCHAR(512))
AS
begin
FOR SELECT CREV_ID, CREV_FECHA, CREV_HORA, CRCL_NIT, CRCL_CONTACTO, CREV_MOTIVO, CREV_ASESOR, CREV_RESPUESTA, CREV_EXPLICA, CREV_SOLUCION, CREV_TIPO
    FROM crm_eventos WHERE CREV_FECHA >= :FECINI AND CREV_FECHA <= :FECFIN AND CREV_ANULADO = 'N' AND
    ((:ASESOR = 0) or (CREV_ASESOR = :ASESOR)) AND ((:TIPOC = 0) or (CREV_TIPO = :TIPOC)) AND
    ((:MOTIVO = 0) or (CREV_MOTIVO = :MOTIVO)) AND ((:RESPTA = 0) or (CREV_RESPUESTA = :RESPTA)) AND
    ((:INTERNOS = 'S') or (CREV_TIPO < 900))
    INTO :ID, FECHA, :HORA, :NIT, :CONTACTO, :CODMOTIVO, :CODASESOR, :CODRESPTA, :EXPLICA, :SOLUCION, :CODTIPO
    DO
    BEGIN
    SELECT CRCL_NOM FROM CRM_CLIENTES WHERE CRCL_NIT = :NIT INTO :nomcliente;
    if (CONTACTO = 0) then
        SELECT TERC_CONTACTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :contacto;
    ELSE
        SELECT CRCO_NOMBRE FROM CRM_CONTACTOS WHERE CRCL_NIT = :NIT AND CRCO_ID = :CONTACTO INTO :contacto;
    SELECT CRTE_NOMBRE FROM crm_tipoevento WHERE CRTE_ID = :CODTIPO INTO :nomtipo;
    if (CODASESOR IS NOT NULL) then
        SELECT CRAS_NOMBRE FROM CRM_ASESOR WHERE CRAS_ID = :CODASESOR INTO :nomasesor;
    else
        NOMASESOR = '';
    if (CODRESPTA IS NOT NULL) then
        SELECT CRER_NOMBRE FROM crm_evento_respuesta WHERE CRER_ID = :codrespta INTO :nomrespta;
    else
        NOMRESPTA = '';
    if (CODMOTIVO IS NOT NULL) then
        SELECT CREM_NOMBRE FROM crm_evento_motivo WHERE CREM_ID = :CODMOTIVO INTO :nommotivo;
    else
        NOMMOTIVO = '';
    suspend;
    END
end^


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


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),
    RCREE 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 PRCREE 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);
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('CXPAGAR', 'SALDOS', 'INCLUIR ANTICIPOS A PROVEEDORES EN REPORTES Y CONSULTAS DE CUENTAS POR PAGAR') returning_values (INCLANTI);
  /* 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;
        RCREE = 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
            if ((inclanti = 'SI') or (TIPO <> 55)) then
                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), SUM(SDCP_RCREE - SDCP_ABRCREE)
                            FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA, :PRCREE;
                    else
                        SELECT SUM((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), SUM((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), SUM((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM), SUM((SDCP_RCREE-SDCP_ABRCREE)/SDCP_TRM)
                            FROM SALDOS_DOC_CXPAGAR WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID INTO :PRTFTE, :PRTIVA, :PRTICA, :PRCREE;
                    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
                    if (PRCREE IS NULL) then
                        PRCREE = 0;
                    if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) THEN
                        BEGIN
                        if (PRCREE > 0) then
                            PRCREE = 0;
                        END
                    ELSE
                        BEGIN
                        if (PRCREE < 0) then
                            PRCREE = 0;
                        END
                    SALDO = SALDO + PSALDO;
                    RTFTE = RTFTE + PRTFTE;
                    RTIVA = RTIVA + PRTIVA;
                    RTICA = RTICA + PRTICA;
                    RCREE = RCREE + PRCREE;
                    DTOF = DTOF + PDTOF;
                    END
                END
            END
        SUSPEND;
        END
    END
END^


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(8),
    CONCEPTO VARCHAR(60),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    FECDTOF DATE,
    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);
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('CXPAGAR', 'SALDOS', 'INCLUIR ANTICIPOS A PROVEEDORES EN REPORTES Y CONSULTAS DE CUENTAS POR PAGAR') returning_values (INCLANTI);
  execute procedure LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'ANALISIS DE CXPAGAR CON FECHA FACTURA O VENCIMIENTO') returning_values (FOV);
  /* 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
            if ((inclanti = 'SI') or (TIPO <> 55)) then
                begin
                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_DTOFECHA, NDPR_NUMPROV, NDPR_TRM from NOTAS_DEBITO_PROVEEDOR
                            where NDPR_ID = :ID into :DTOF, :fecdtof, :NUMPROV, :TRM;
                    if (TIPO = 52) then
                        select 0, NCPR_FECHA, '', 1 from NOTAS_CREDITO_PROVEEDOR where NCPR_ID = :ID into :DTOF, :fecdtof, :NUMPROV, :TRM;
                    if (TIPO = 55) then
                        select ANPR_DTOFMONTO, ANPR_DTOFECHA, '', ANPR_TRM from ANTICIPOS_PROVEEDOR where ANPR_ID = :ID into :DTOF, :fecdtof, :NUMPROV, :TRM;
                    if (TIPO = 21) then
                        select FACO_DTOFMONTO, FACO_DTOFFECHA, FACO_NUMPROV, FACO_TRM from FACTURAS_COMPRA where FACO_ID = :ID into :DTOF, :fecdtof, :NUMPROV, :TRM;
                    if (TIPO = 24) then
                        select 0, DVCO_FECHA, '', 1 from devoluciones_compras where DVCO_ID = :ID into :DTOF, :fecdtof, :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), sum(SDCP_RCREE-SDCP_ABRCREE)
                            from SALDOS_DOC_CXPAGAR where SDCP_TIPOREF = :TIPO and SDCP_IDREF = :ID into :RTFTE, :RTIVA, :RTICA, :RCREE;
                    else
                        select sum((SDCP_RTEFTE-SDCP_ABRTFTE)/SDCP_TRM), sum((SDCP_RTIVA-SDCP_ABRTIVA)/SDCP_TRM), sum((SDCP_RTICA-SDCP_ABRTICA)/SDCP_TRM), sum((SDCP_RCREE-SDCP_ABRCREE)/SDCP_TRM)
                            from SALDOS_DOC_CXPAGAR where SDCP_TIPOREF = :TIPO and SDCP_IDREF = :ID into :RTFTE, :RTIVA, :RTICA, :RCREE;
                    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
    
                    if (RCREE is null) then
                        RCREE = 0;
                    if ((TIPO = 52) or (TIPO = 55) or (TIPO = 24)) then
                        begin
                        if (RCREE > 0) then
                            RCREE = 0;
                        end
                    else
                        begin
                        if (RCREE < 0) then
                            RCREE = 0;
                        end
                    suspend;
                    end
                end
            end
        end
    end
end^


ALTER PROCEDURE REP_DECRETO1818 (
    FECINI DATE,
    FECFIN DATE,
    PREFI VARCHAR(4),
    TIPOPREF INTEGER)
RETURNS (
    TIPO INTEGER,
    PREF VARCHAR(4),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    FECHA DATE,
    VTATOTAL NUMERIC(18,2),
    VTADEC1818 NUMERIC(18,2))
AS
declare variable TDEC INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'TARIFA DE IVA PARA PRODUCTOS EXENTOS DECRETO 1818 DE 2015')
    returning_values (:TDEC);
TIPO = TIPOPREF;
FOR SELECT MAX(FACT_FECHA), MAX(PREF_PRE), MIN(FACT_NUMERO), MAX(FACT_NUMERO), SUM(FADE_TOTAL*FACT_FACTOR)
    FROM FACTURAS F, FACTURAS_DETALLE D
    WHERE F.fact_id = D.fact_id AND F.fact_fecha >= :FECINI AND F.fact_fecha <= :FECFIN AND FACT_ANULADO = 'N'
    AND ((PREF_PRE = :PREFI) or (:prefi = ''))
    GROUP BY FACT_FECHA, PREF_PRE
    INTO :FECHA, :PREF, :NUMINI, :NUMFIN, :VTATOTAL
    DO
    BEGIN
    SELECT SUM(FADE_TOTAL*FACT_FACTOR) FROM FACTURAS F, FACTURAS_DETALLE D
    WHERE F.fact_id = D.fact_id AND F.fact_fecha = :fecha AND FACT_ANULADO = 'N'
    AND ((PREF_PRE = :PREFI) or (:prefi = '')) AND D.fade_tiva = :TDEC
    INTO :VTADEC1818;
    if (VTADEC1818 IS NULL) then
        VTADEC1818 = 0;
    suspend;
    END
end^


ALTER PROCEDURE REP_DETALLE_CERTIFICADO (
    FECINI CHAR(8),
    FECFIN CHAR(8),
    PROYINI VARCHAR(4),
    PROYFIN VARCHAR(4),
    CENTINI VARCHAR(4),
    CENTFIN VARCHAR(4),
    TIPO CHAR(1))
RETURNS (
    ITEM INTEGER,
    CUENTA VARCHAR(20),
    CATEGORIA VARCHAR(60),
    CODCUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    DV CHAR(1),
    BASE NUMERIC(18,2),
    PORC NUMERIC(9,2),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    IVA NUMERIC(18,2),
    RETEFTE NUMERIC(18,2),
    RETEIVA NUMERIC(18,2),
    RETEICA NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
declare variable ID INTEGER;
declare variable CTAIVA VARCHAR(20);
declare variable CTARTIVA VARCHAR(20);
declare variable CTARTICA VARCHAR(20);
declare variable CTARTFTE VARCHAR(20);
declare variable CTACREE VARCHAR(20);
declare variable BASEIVA NUMERIC(18,2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (CTACREE);
FOR SELECT CR.crcd_item, C.cuen_cod, C.cuen_nom, CR.crcd_iva, CR.crcd_rtfte, CR.crcd_rtiva, CR.crcd_rtica, CR.crcd_nombre
    FROM cuentas_reporte_certdet CR, CUENTAS C
    WHERE C.cuen_cod = CR.crcd_cuenta AND (((:TIPO = 'C') AND (CRCD_ITEM < 6)) or ((:TIPO = 'G') AND (CRCD_ITEM = 6)))
    ORDER BY cr.crcd_item
    INTO :ITEM, :CUENTA, :NOMCUENTA, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :categoria
    DO
    BEGIN
    FOR SELECT max(d.enco_consec), MAX(D.cuen_cod), MAX(D.terc_nit), SUM(D.code_base), MAX(D.code_porc), SUM(D.code_debito), SUM(D.code_credito)
        FROM comprobante_detalle D, comprobante_encabezado E
        WHERE E.enco_consec = D.enco_consec AND E.enco_fecha >= :FECINI AND E.enco_fecha <= :FECFIN AND
        SUBSTRING(D.cuen_cod FROM 1 FOR STRLEN(:CUENTA)) = :CUENTA AND D.CUEN_COD <> :CTACREE
        AND D.PROY_COD >= :PROYINI AND D.PROY_COD <= :PROYFIN AND D.CENT_COD >= :CENTINI AND D.CENT_COD <= :CENTFIN
        GROUP BY D.enco_consec, D.TERC_NIT
        INTO :ID, :CODCUENTA, :NIT, :BASE, :PORC, :DEBITO, :CREDITO
        DO
        BEGIN
        if ((TIPO <> 'G') OR (NIT <> '900334110')) then
            BEGIN
            IVA = 0;
            RETEFTE = 0;
            RETEIVA = 0;
            RETEICA = 0;
            SELECT CUEN_NOM FROM CUENTAS WHERE CUEN_COD = :CODCUENTA INTO :nomcuenta;
            SELECT TERC_NOM, TERC_DV FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC, :DV;
            NETO = DEBITO - CREDITO;
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_BASE) FROM comprobante_detalle D, comprobante_encabezado E
                WHERE D.enco_consec = E.enco_consec AND E.enco_fecha >= :FECINI AND E.enco_fecha <= :FECFIN AND
                SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(:CTAIVA)) = :CTAIVA AND D.TERC_NIT = :NIT AND D.ENCO_CONSEC = :ID
                AND D.PROY_COD >= :PROYINI AND D.PROY_COD <= :PROYFIN AND D.CENT_COD >= :CENTINI AND D.CENT_COD <= :CENTFIN
                INTO :IVA, :BASEIVA;
            SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado E
                WHERE D.enco_consec = E.enco_consec AND E.enco_fecha >= :FECINI AND E.enco_fecha <= :FECFIN AND
                SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(:CTARTFTE)) = :CTARTFTE AND D.TERC_NIT = :NIT AND D.ENCO_CONSEC = :ID
                AND D.PROY_COD >= :PROYINI AND D.PROY_COD <= :PROYFIN AND D.CENT_COD >= :CENTINI AND D.CENT_COD <= :CENTFIN
                INTO :RETEFTE;
            SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado E
                WHERE D.enco_consec = E.enco_consec AND E.enco_fecha >= :FECINI AND E.enco_fecha <= :FECFIN AND
                SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(:CTARTIVA)) = :CTARTIVA AND D.TERC_NIT = :NIT AND D.ENCO_CONSEC = :ID
                AND D.PROY_COD >= :PROYINI AND D.PROY_COD <= :PROYFIN AND D.CENT_COD >= :CENTINI AND D.CENT_COD <= :CENTFIN
                INTO :RETEIVA;
            SELECT SUM(CODE_DEBITO-CODE_CREDITO) FROM comprobante_detalle D, comprobante_encabezado E
                WHERE D.enco_consec = E.enco_consec AND E.enco_fecha >= :FECINI AND E.enco_fecha <= :FECFIN AND
                SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(:CTARTICA)) = :CTARTICA AND D.TERC_NIT = :NIT AND D.ENCO_CONSEC = :ID
                AND D.PROY_COD >= :PROYINI AND D.PROY_COD <= :PROYFIN AND D.CENT_COD >= :CENTINI AND D.CENT_COD <= :CENTFIN
                INTO :RETEICA;
            if (IVA IS NULL) then
                IVA = 0;
            if (RETEFTE IS NULL) then
                RETEFTE = 0;
            if (RETEIVA IS NULL) then
                RETEIVA = 0;
            if (RETEICA IS NULL) then
                RETEICA = 0;
            if (ITEM = 1) then
                BEGIN
                BASE = NETO;
                NETO = (BASE + IVA + retefte + RETEIVA + RETEICA)*-1;
                BASE = BASE * -1;
                IVA = IVA * -1;
                PORC = ROUND(IVA * 100/ BASE, 0);
                suspend;
                END
            if (ITEM = 2) then
                BEGIN
                BASE = BASEIVA;
                NETO = BASE + IVA;
                if (BASE <> 0) then
                    PORC = ROUND(IVA * 100/ BASE, 1);
                ELSE
                    PORC = 16;
                retefte = 0;
                RETEIVA = 0;
                RETEICA = 0;
                if (IVA <> 0) then
                    suspend;
                END
            if (ITEM = 3) then
                BEGIN
                retefte = NETO*-1;
                RETEIVA = 0;
                RETEICA = 0;
                NETO = 0;
                BASE = BASE * -1;
                suspend;
                END
            if (ITEM = 4) then
                BEGIN
                retefte = NETO;
                RETEIVA = 0;
                RETEICA = 0;
                NETO = 0;
                suspend;
                END
            if (ITEM = 5) then
                BEGIN
                retefte = NETO;
                RETEIVA = 0;
                RETEICA = 0;
                NETO = 0;
                suspend;
                END
            if (ITEM = 6) then
                BEGIN
                BASE = NETO;
                NETO = BASE + IVA + retefte + RETEIVA + RETEICA;
                suspend;
                END
            END
        END
    END
end^


ALTER PROCEDURE REP_DETERIORO_CARTERA (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    FECHA DATE,
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER,
    GRUPCART INTEGER,
    DIASC INTEGER,
    TASA NUMERIC(18,4),
    CEROS CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIR VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    MAILCART VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60),
    DV CHAR(1),
    DIASCR INTEGER,
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    RESALTAR CHAR(1),
    INSTCART VARCHAR(255),
    TIPO INTEGER,
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    CONCEPTO VARCHAR(60),
    MONTO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    DETERIORO NUMERIC(18,2),
    PROVISIONAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8),
    FECDOC DATE,
    VENCE DATE,
    DIAS INTEGER,
    CUPO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    TOTCLI NUMERIC(18,2),
    NOTA VARCHAR(256),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    CALIFICA VARCHAR(20),
    GRUPCOD INTEGER,
    GRUPNOM VARCHAR(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable INCLANTI CHAR(2);
declare variable DB CHAR(1);
declare variable VPRESENTE double precision;
declare variable DIASD integer;
declare variable AUX1 double precision;
declare variable AUX2 double precision;
declare variable NOMINAL double precision;
declare variable EOV 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);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DETERIORO DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA') RETURNING_VALUES (FOV);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CALCULAR DETERIORO CON TASA EFECTIVA ANUAL O MES VENCIDO') RETURNING_VALUES (EOV);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
/* tasa diaria */
if (EOV = 'EA') then
    begin
    AUX1 = (1 + TASA / 100);
    AUX2 = 1.0000 / 365.0000;
    NOMINAL = power(AUX1, AUX2) - 1;
    end
else
    begin
    NOMINAL = ((TASA / 30.0000) / 100);
    end
/* Ubique el NIT */
FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO,
    CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR,
    CLIE_INSTCARTERA, CLIE_MAILCART, CLIE_CALIFICA, CLIE_DIAS
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO,
    :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :resaltar,
    INSTCART, :mailcart, :CALIFICA, :DIASCR
    DO  
    BEGIN
    TOTCLI = 0;
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            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, 0) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    if (FOV = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        BEGIN
                        DIAS = FECHA - VENCE;
                        if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
                            BEGIN
                            SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                            DIAS = FECHA - VENCE;
                            END
                        END
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO 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 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;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA), SUM(SDCA_RCREE - SDCA_ABRCREE)
                        FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                        INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (RCREE IS NULL) then
                        RCREE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RCREE > 0) then
                            RCREE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RCREE < 0) then
                            RCREE = 0;
                        END
                    if (fautorcree <= FECDOC) then
                        RCREE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    TOTCLI = TOTCLI + SALDO;
                    if (DIAS > DIASC) then
                        BEGIN
                        /* CALCULE EL DETERIORO */
                        DIASD = DIAS - DIASC;
                        if (EOV = 'EA') then
                            begin
                            VPRESENTE = SALDO / (power((1 + NOMINAL), DIASD));
                            DETERIORO = (SALDO - VPRESENTE);
                            SUSPEND;
                            end
                        else
                            begin
                            DETERIORO = ((SALDO * NOMINAL) * diasd);
                            SUSPEND;
                            end
                        END
                    ELSE
                        if (:CEROS = 'S') then
                        begin
                        DETERIORO = 0;
                        suspend;
                        end
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), SUM(RPDE_RCREE*-1)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :RCREE
            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, 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))
                    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, 0) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                                BEGIN
                                DIAS = FECHA - VENCE;
                                if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
                                    BEGIN
                                    SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                                    DIAS = FECHA - VENCE;
                                    END
                                END
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO 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), SUM(SDCA_RCREE - SDCA_ABRCREE)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            if (RCREE IS NULL) then
                                RCREE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RCREE > 0) then
                                    RCREE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RCREE < 0) then
                                    RCREE = 0;
                                END
                            if (fautorcree <= FECDOC) then
                                RCREE = 0;
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                            if (IDNOTA IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            TOTCLI = TOTCLI + SALDO;
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), SUM(RPDE_RCREE*-1)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :RCREE
                    DO
                    BEGIN
                    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^


ALTER PROCEDURE REP_DIFCOSTOS_FACREM (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    IDORI INTEGER,
    PREFORI VARCHAR(4),
    NUMORI VARCHAR(6),
    FECORI DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    ITEM INTEGER,
    IDDES INTEGER,
    PREFDES VARCHAR(4),
    NUMDES VARCHAR(6),
    FECDES DATE,
    ARTIC VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTORI NUMERIC(18,2),
    CANTDES NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    COSTOFAC NUMERIC(18,2),
    COSTOREM NUMERIC(18,2))
AS
declare variable CONSOLIDA INTEGER;
begin
FOR SELECT F.fact_id, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_ITEM, F.TERC_NIT, F.fact_nomcliente, ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_UNIDAD, FADE_CANT, FACT_CONSOLIDA
  FROM FACTURAS F, FACTURAS_DETALLE D, 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 ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND FACT_CONSOLIDA <> 0
  ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO, FADE_ITEM
  INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :CONSOLIDA
  DO
    BEGIN
    execute procedure costo_promedio(:artic, :fecori) returning_values (:costoFAC);
    FOR SELECT COFA_IDORI, COFA_CANTCR
        FROM CONSOLIDADO_FALTANTES WHERE COFA_ID = :CONSOLIDA AND ARTI_COD = :ARTIC AND COFA_TIPOORI = 32
        INTO :iddes, :cantdes
        DO
        BEGIN
        SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_id = :iddes AND REVT_ANULADO = 'N'
            INTO :PREFDES, :NUMDES, :FECDES;
        SELECT SUM(COST_ENTP-COST_SALP) FROM COSTOS C, movimiento_articulo m
            WHERE m.mvar_cons = c.cost_idmov and C.cost_tipo = 32 and M.mvar_idref = :iddes into :costorem;
        COSTOFAC = COSTOFAC * cantdes;
        SUSPEND;
        END
    END
end^


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),
    LOTE VARCHAR(15),
    LOTEV DATE,
    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,
    FECULTV DATE,
    DIASUV INTEGER,
    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(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') or (DETALLE = 'L'))  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, ARTI_CLASE
      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, :CLASE
      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 (DETALLE = 'L') then
            BEGIN
            FOR SELECT L.lote_nro, l.lote_costo, LOTE_VENCE
                FROM LOTES L WHERE ARTI_COD = :codigo AND BODE_COD = :codbod
                INTO :LOTE, :costo, :lotev
                DO
                BEGIN
                EXECUTE PROCEDURE saldo_lote_fecha(:CODIGO, :CODBOD, :LOTE, :FECHA) RETURNING_VALUES (:exist);
                if (PROMEDIO > 0) then
                    DISPONIBILIDAD = EXIST / PROMEDIO;
                ELSE
                    DISPONIBILIDAD = 0;
                if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
                    SUGERIDO = (DIAS * PROMEDIO) - EXIST;
                ELSE
                    SUGERIDO = 0;
                FECCOMPRA = NULL;
                SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO D WHERE ((D.mvar_tipodoc = 13) or (D.mvar_tipodoc = 15) or (D.mvar_tipodoc = 11) or (D.mvar_tipodoc = 21))
                    AND D.ARTI_COD = :CODIGO AND MVAR_FECHA <= :FECHA AND D.bode_cod = :codbod AND D.mvar_entrada = 'S'
                    INTO :FECCOMPRA;
                fecultv = NULL;
                SELECT MAX(FACT_FECHA) FROM FACTURAS F, FACTURAS_DETALLE D
                    WHERE F.fact_id = D.fact_id AND D.ARTI_COD = :CODIGO AND FACT_FECHA <= :FECHA AND D.bode_cod = :codbod AND D.fade_lote = :LOTE
                    INTO :fecultv;
                if (fecultv IS NOT NULL) then
                    diasuv = FECHA - fecultv;
                ELSE
                    diasuv = 0;
                if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
                    SUSPEND;
                END
            END
        ELSE
            BEGIN
            if ((DISPONIBILIDAD < DIAS) and (PROMEDIO > 0))then
                SUGERIDO = (DIAS * PROMEDIO) - EXIST;
            ELSE
                SUGERIDO = 0;
            FECCOMPRA = NULL;
            SELECT MAX(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO D WHERE ((D.mvar_tipodoc = 13) or (D.mvar_tipodoc = 15) or (D.mvar_tipodoc = 11) or (D.mvar_tipodoc = 21))
                AND D.ARTI_COD = :CODIGO AND MVAR_FECHA <= :FECHA AND D.bode_cod = :codbod AND D.mvar_entrada = 'S'
                INTO :FECCOMPRA;
            fecultv = NULL;
            SELECT MAX(FACT_FECHA) FROM FACTURAS F, FACTURAS_DETALLE D
                WHERE F.fact_id = D.fact_id AND D.ARTI_COD = :CODIGO AND FACT_FECHA <= :FECHA AND D.bode_cod = :codbod
                INTO :fecultv;
            if (fecultv IS NOT NULL) then
                diasuv = FECHA - fecultv;
            ELSE
                diasuv = 0;
            if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
                SUSPEND;
            END
        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, ARTI_CLASE
      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, :CLASE
      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(MVAR_FECHA) FROM MOVIMIENTO_ARTICULO D WHERE ((D.mvar_tipodoc = 13) or (D.mvar_tipodoc = 15) or (D.mvar_tipodoc = 11) or (D.mvar_tipodoc = 21))
            AND D.ARTI_COD = :CODIGO AND MVAR_FECHA <= :FECHA AND D.bode_cod = :codbod AND D.mvar_entrada = 'S'
            INTO :FECCOMPRA;
        fecultv = NULL;
        SELECT MAX(FACT_FECHA) FROM FACTURAS F, FACTURAS_DETALLE D
            WHERE F.fact_id = D.fact_id AND D.ARTI_COD = :CODIGO AND FACT_FECHA <= :FECHA
            INTO :fecultv;
        if (fecultv IS NOT NULL) then
            diasuv = FECHA - fecultv;
        ELSE
            diasuv = 0;
        if ((PROMEDIO > 0) or (EXIST <> 0) or (CEROS = 'S')) then
            SUSPEND;
        END
  END
END^


ALTER PROCEDURE REP_DOCUMENTOS_CLIENTE (
    TIPO INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(10),
    GRPFIN VARCHAR(10),
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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(8),
    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)) and NDCL_ANULADO = 'N'
                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)) and NCCL_ANULADO = 'N'
                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)) and APCL_ANULADO = 'N'
                    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)) and APCL_ANULADO = 'N'
                    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 = 44) then
            if (DETALLE = 'S') then
                BEGIN
                FOR SELECT R.pref_pre, RECA_NUMERO, RECA_FECHA, RECA_CONC, RCDE_ITEM, TIDO_NOMCORTO, RCDE_PREFIJO, RCDE_NUMERO,
                    RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RECA_ANULADO, RECA_FECHA, 0, RCDE_DTOF
                    FROM recibos_caja R, recibos_caja_detalle D, TIPO_DOCUMENTO T, PREFIJOS P
                    WHERE R.TERC_NIT = :NIT AND R.reca_id = D.reca_id AND RCDE_TIPODOC = T.TIDO_COD AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND
                     P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 61 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and RECA_ANULADO = 'N'
                    INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :ITEM, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :ANULADO, :DTOFECHA, :DTOPORC, :DTOMONTO
                    DO
                        BEGIN
                        TOTAL = ABONO;
                        NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                        SUSPEND;
                        END
                END
            ELSE
                BEGIN
                FOR SELECT R.pref_pre, RECA_NUMERO, RECA_FECHA, R.reca_conc, RECA_MONTO,
                    0, 0, 0, R.reca_rtftemonto, 0, R.reca_rtivamonto, 0, R.reca_rticamonto, RECA_ANULADO, RECA_FECHA, 0, R.reca_dtof
                    FROM recibos_caja R, PREFIJOS P
                    WHERE R.TERC_NIT = :NIT AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND
                     P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 61 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and RECA_ANULADO = 'N'
                    INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :ANULADO, :DTOFECHA, :DTOPORC, :DTOMONTO
                    DO
                        BEGIN
                        TOTAL = MONTO;
                        NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
                        SUSPEND;
                        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)) and ANCL_ANULADO = 'N'
                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^


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^


ALTER PROCEDURE REP_DOCUMENTOS_PROVEEDOR (
    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(8),
    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(8),
    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),
    RTCREE NUMERIC(9,2),
    RTCREEM 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),
    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, 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, :DIR, :TELEFONO, :CIUDAD, :CONTACTO, :fax, :CEL, :EMAIL, :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;
        /* DETERMINE LA TABLA A EXAMINAR */
        if (TIPO = 51) then
            BEGIN
            FOR SELECT N.PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_CONC, NDPR_VENCE, NDPR_MONTO, NDPR_IVAPORC, NDPR_IVAMONTO,
                NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, NDPR_RTCREE, NDPR_RTCREEM, NDPR_ANULADO, NDPR_DTOFECHA, NDPR_DTOFPORC, NDPR_DTOFMONTO
                FROM NOTAS_DEBITO_PROVEEDOR N, PREFIJOS P
                WHERE TERC_NIT = :NIT AND NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN AND
                 P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :VENCE, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :rtcree, :rtcreem, :ANULADO, :dtofecha, :dtoporc, :dtomonto
                DO
                    BEGIN
                    TOTAL = MONTO + IVAMONTO;
                    NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEM;
                    SUSPEND;
                    END
            END
        if (TIPO = 52) then
            BEGIN
            FOR SELECT N.PREF_PRE, NCPR_NUMERO, NCPR_FECHA, NCPR_CONC, NCPR_MONTO, NCPR_IVAPORC, NCPR_IVAMONTO,
                NCPR_RTFTEPORC, NCPR_RTFTEMONTO, NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, NCPR_RTCREE, NCPR_RTCREEM, NCPR_ANULADO, NCPR_FECHA, 0, 0
                FROM NOTAS_CREDITO_PROVEEDOR N, PREFIJOS P
                WHERE TERC_NIT = :NIT AND NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN AND
                 P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :RTCREE, :RTCREEM, :ANULADO, :dtofecha, :dtoporc, :dtomonto
                DO
                    BEGIN
                    TOTAL = MONTO + IVAMONTO;
                    NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEM;
                    SUSPEND;
                    END
            END
        if (TIPO = 53) then
            BEGIN
            if (DETALLE = 'S') then
                BEGIN
                FOR SELECT A.PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, APPD_ITEM, TIDO_NOMCORTO, APPD_PREFIJO, APPD_NUMERO,
                    APPD_APLICADO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPD_RCREE, APPR_ANULADO, APPR_FECHA, 0, 0
                    FROM APLICACION_PROVEDOR A, APLICACION_PROVEEDOR_DETALLE D, TIPO_DOCUMENTO T, PREFIJOS P
                    WHERE A.TERC_NIT = :NIT AND A.APPR_ID = D.APPR_ID AND APPD_TIPODOC = T.TIDO_COD AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN AND
                     P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 53 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :ITEM, :TIPODOC, :PREFDOC, :NUMDOC, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :RTCREEM, :ANULADO, :dtofecha, :dtoporc, :dtomonto
                    DO
                        BEGIN
                        TOTAL = MONTO + IVAMONTO;
                        NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEM;
                        SUSPEND;
                        END
                END
            ELSE
                BEGIN
                FOR SELECT MAX(A.PREF_PRE), MAX(APPR_NUMERO), MAX(APPR_FECHA), MAX(APPR_CONC), SUM(APPD_APLICADO), SUM(APPD_RTFTE),
                    SUM(APPD_RTIVA), SUM(APPD_RTICA), SUM(APPD_RCREE), MAX(APPR_ANULADO), MAX(APPR_FECHA), 0, 0
                    FROM APLICACION_PROVEDOR A, APLICACION_PROVEEDOR_DETALLE D, TIPO_DOCUMENTO T, PREFIJOS P
                    WHERE A.TERC_NIT = :NIT AND A.APPR_ID = D.APPR_ID AND APPD_TIPODOC = T.TIDO_COD AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN AND
                     P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 53 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY A.APPR_ID
                    INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :ABONO, :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :RTCREEM, :ANULADO, :dtofecha, :dtoporc, :dtomonto
                    DO
                        BEGIN
                        TOTAL = MONTO + IVAMONTO;
                        NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEM;
                        SUSPEND;
                        END
                    END
            END
        if (TIPO = 54) then
            BEGIN
            FOR SELECT E.PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO, 0, 0,
                0, EGRE_RTFTEMONTO, 0, EGRE_RTIVAMONTO, 0, EGRE_RTICAMONTO, EGRE_RTCREE, EGRE_RTCREE, EGRE_ANULADO, EGRE_FECHA, 0, 0
                FROM EGRESOS E, PREFIJOS P
                WHERE TERC_NIT = :NIT AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND
                 P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 62 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :RTCREE, :RTCREEM, :ANULADO, :dtofecha, :dtoporc, :dtomonto
                DO
                    BEGIN
                    TOTAL = MONTO + IVAMONTO;
                    NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEM;
                    SUSPEND;
                    END
            END
        if (TIPO = 55) then
            BEGIN
            FOR SELECT A.PREF_PRE, ANPR_NUMERO, ANPR_FECHA, ANPR_CONC, ANPR_BASE,
                ANPR_IVAPORC, ANPR_IVAMONTO, ANPR_RTFTEPORC, ANPR_RTFTEMONTO, ANPR_RTIVAPORC, ANPR_RTIVAMONTO, ANPR_RTICAPORC, ANPR_RTICAMONTO, ANPR_RTCREE, ANPR_RTCREEM, ANPR_ANULADO, ANPR_FECHA, 0, 0
                FROM ANTICIPOS_PROVEEDOR A, PREFIJOS P
                WHERE TERC_NIT = :NIT AND ANPR_FECHA >= :FECINI AND ANPR_FECHA <= :FECFIN AND
                 P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 55 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :PREF, :NUMERO, :FECHA, :CONCEPTO, :MONTO, :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :RTCREE, :RTCREEM, :ANULADO, :dtofecha, :dtoporc, :dtomonto
                DO
                    BEGIN
                    TOTAL = MONTO + IVAMONTO;
                    NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEM;
                    SUSPEND;
                    END
            END
        END /* OK */
    END /* FOR NIT */
END^


ALTER PROCEDURE REP_DOCUMENTOS_VEHICULO (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(8),
    PREFFIN VARCHAR(8),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    DOCUMENTO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VEHICULO VARCHAR(8),
    VNUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    CAJAID INTEGER,
    CAJANOM VARCHAR(60),
    RUTAID INTEGER,
    RUTANOM VARCHAR(60),
    VENDCOD INTEGER,
    VENDNOM VARCHAR(60),
    NIT VARCHAR(20),
    NOMTERCERO VARCHAR(60),
    CONCEPTO VARCHAR(60),
    FORMAP CHAR(1),
    ANULADO CHAR(1),
    MONTO NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    ITEM INTEGER,
    VALORIT NUMERIC(18,2))
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 = 86 INTO :DOCUMENTO;
    FOR SELECT TIQP_ID, F.tiqp_pref, TIQP_NUMERO, TIQP_FECHA, TIQP_CAJA, CAJA_NOMBRE, TIQP_VEND, VEND_NOMBRE, TIQP_VEHICULO,
        TIQP_RUTA, TIQP_NIT, TIQP_NOMBRE, TIQP_PASAJE, TIQP_SEGURO, TIQP_TOTAL, TIQP_FORMAP, TIQP_ANULADO
        FROM tiquete_pasajero F, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE TIQP_VEHICULO >= :prefini AND TIQP_VEHICULO <= :preffin AND
         F.tiqp_caja = C.caja_id AND F.tiqp_vend = V.vend_cod AND TIQP_FECHA >= :FECINI AND TIQP_FECHA <= :FECFIN
         AND PR.PREF_PRE = F.tiqp_pref AND PR.TIDO_COD = 86 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY TIQP_FECHA, TIQP_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid,  :NIT, :NOMTERCERO, :monto, :seguros, :total, :formap, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT RUTA_NOMBRE FROM ruta_pasajeros WHERE RUTA_ID = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 87 INTO :DOCUMENTO;
    FOR SELECT CGRM_ID, R.CGRM_PREF, CGRM_NUMERO, CGRM_FECHA, R.cgrm_caja, C.caja_nombre, R.cgrm_vend, VEND_NOMBRE, R.cgrm_vehiculo,
        R.cgrm_destino, R.cgrm_nit, R.cgrm_remnom, R.cgrm_flete, R.cgrm_seguro, R.cgrm_total, R.cgrm_fpago, R.cgrm_anulado
        FROM carga_remesa R, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE R.cgrm_vehiculo >= :prefini AND R.cgrm_vehiculo <= :preffin AND
        R.cgrm_caja = c.caja_id AND R.cgrm_vend = V.VEND_COD AND CGRM_FECHA >= :FECINI AND CGRM_FECHA <= :FECFIN AND R.tido_cod = 87 AND
        PR.PREF_PRE = R.cgrm_pref AND PR.TIDO_COD = 87 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY CGRM_FECHA, CGRM_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid, :NIT, :NOMTERCERO, :monto, :seguros, :total, :formap, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT CIUD_NOM FROM ciudades WHERE CIUD_COD = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 88 INTO :DOCUMENTO;
    FOR SELECT PLPA_ID, P.plpa_pref, PLPA_NUMERO, PLPA_FECHA, P.plpa_caja, CAJA_NOMBRE, P.plpa_despacha, VEND_NOMBRE, P.plpa_vehiculo,
        P.plpa_ruta, P.plpa_pasaje, P.plpa_remesa, P.plpa_neto, P.plpa_anulado
        FROM PLANILLA_PASAJEROS P, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE P.plpa_vehiculo >= :prefini AND P.plpa_vehiculo <= :preffin AND
         P.plpa_caja = C.caja_id AND P.plpa_despacha = V.VEND_COD AND PLPA_FECHA >= :FECINI AND PLPA_FECHA <= :FECFIN
         AND PR.PREF_PRE = P.plpa_pref AND PR.TIDO_COD = 88 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PLPA_FECHA, PLPA_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid, :monto, :seguros, :total, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT CORU_NOMBRE FROM corredor_ruta WHERE CORU_ID = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    valorit = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT PLPA_ITEM, 'TIQUETE ' || PLPD_PREF || PLPD_NUMERO, T.tiqp_formap, PLPA_VALOR
                        FROM planilla_pasajeros_det D, tiquete_pasajero T
                        WHERE PLPA_ID = :ID AND D.plpa_tiquete = T.tiqp_id
                        ORDER BY PLPA_ITEM
                        INTO :ITEM, :concepto, :formap, :valorit
                        DO
                        SUSPEND;
                    FOR SELECT PLPA_ITEM, 'REMESA ' || PLPR_PREF || PLPR_NUMREM, C.cgrm_fpago, PLPR_VALOR
                        FROM planilla_pasajeros_rem R, carga_remesa C
                        WHERE PLPA_ID = :ID AND R.plpr_remesa = C.cgrm_id
                        ORDER BY PLPA_ITEM
                        INTO :ITEM, :concepto, :formap, :valorit
                        DO
                        SUSPEND;
                    FOR SELECT PLPC_ITEM, C.copl_nom, PLPC_VALOR
                        FROM planilla_pasajeros_con P, conceptos_planilla C
                        WHERE PLPA_ID = :ID AND P.plpc_conc = C.copl_id
                        ORDER BY PLPC_ITEM
                        INTO :ITEM, :concepto, :valorit
                        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 = 85 INTO :DOCUMENTO;
    FOR SELECT CGRM_ID, R.CGRM_PREF, CGRM_NUMERO, CGRM_FECHA, R.cgrm_caja, C.caja_nombre, R.cgrm_vend, VEND_NOMBRE, R.cgrm_vehiculo,
        R.cgrm_destino, R.cgrm_nit, R.cgrm_remnom, R.cgrm_flete, R.cgrm_seguro, R.cgrm_total, R.cgrm_fpago, R.cgrm_anulado
        FROM carga_remesa R, CAJAS C, VENDEDORES V, PREFIJOS PR WHERE R.cgrm_vehiculo >= :prefini AND R.cgrm_vehiculo <= :preffin AND
        R.cgrm_caja = c.caja_id AND R.cgrm_vend = V.VEND_COD AND CGRM_FECHA >= :FECINI AND CGRM_FECHA <= :FECFIN AND R.tido_cod = 87 AND
        PR.PREF_PRE = R.cgrm_pref AND PR.TIDO_COD = 85 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY CGRM_FECHA, CGRM_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :CAJAID, :CAJANOM, :VENDCOD, :VENDNOM, :vehiculo,
        :rutaid, :NIT, :NOMTERCERO, :monto, :seguros, :total, :formap, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero, vehi_conductor FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero, :nitcond;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT CIUD_NOM FROM ciudades WHERE CIUD_COD = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 89 INTO :DOCUMENTO;
    FOR SELECT MANC_ID, M.manc_pref, MANC_NUMERO, MANC_FECHA, M.manc_vehiculo, m.manc_conductor,
        M.manc_destino, M.manc_fleteneto, M.manc_apagar, M.manc_total, M.manc_anulado
        FROM manifiesto_carga M, PREFIJOS PR WHERE MANC_FECHA >= :FECINI AND MANC_FECHA <= :FECFIN
         AND PR.PREF_PRE = M.manc_pref AND PR.TIDO_COD = 89 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         M.manc_vehiculo >= :prefini AND M.manc_vehiculo <= :preffin
        ORDER BY MANC_FECHA, MANC_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :vehiculo, :nitcond,
        :rutaid, :monto, :seguros, :total, :anulado
        DO
        BEGIN
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT vehi_tipo, tich_nom, vehi_numero FROM vehiculos vh, tipo_vehiculo t
                WHERE vh.vehi_tipo = t.tivh_cod and VEHI_COD = :vehiculo INTO :codtipo, :nomtipo, :vnumero;
            SELECT TERC_NOM FROM terceros WHERE TERC_NIT = :nitcond INTO :nomcond;
            SELECT CIUD_NOM FROM ciudades WHERE CIUD_COD = :rutaid INTO :rutanom;
            if (anulado = 'S') then
                BEGIN
                MONTO = 0;
                seguros = 0;
                total = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    valorit = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT MNCD_ITEM, 'REMESA ' || MNCD_PREF || MNCD_NUMERO, C.cgrm_fpago, MNCD_VALOR
                        FROM manifiesto_carga_det D, carga_remesa C
                        WHERE MANC_ID = :ID AND D.mncd_remesa = C.cgrm_id
                        ORDER BY MNCD_ITEM
                        INTO :ITEM, :concepto, :formap, :valorit
                        DO
                        SUSPEND;
                    FOR SELECT MNCC_ITEM, C.copl_nom, MNCC_VALOR
                        FROM manifiestos_carga_conc M, conceptos_planilla C
                        WHERE MANC_ID = :ID AND M.mncc_conc = C.copl_id
                        ORDER BY MNCC_ITEM
                        INTO :ITEM, :concepto, :valorit
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
END^


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, PREFIJOS P
            WHERE E.egre_id = J.egre_id AND CLEG_ID = :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'
            INTO :MONTOCAJA;
        if (MONTOCAJA IS NULL) then
            MONTOCAJA = 0;
        SELECT SUM(EGBC_MONTO) FROM EGRESOS_BANCO B, EGRESOS E, PREFIJOS P
            WHERE E.egre_id = B.egre_id AND CLEG_ID = :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'
            INTO :MONTOCHEQ;
        if (MONTOCHEQ IS NULL) then
            MONTOCHEQ = 0;
        SUSPEND;
        END
    end
END^


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 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, TERC_NOM, TERC_DIR, TERC_TEL
           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, :nombreempl, :direccion, :telefono
            do
            BEGIN
            nomeps = '';
            nomafp = '';
            nomarp = '';
            nomccf = '';
            nomafc = '';
            nombretico = '';
            nombresubti = '';
            nomdepto = '';
            nomseccion = '';
            nomarea = '';
            nombreper = '';
            nombrebnco = '';
            nomsucur = '';
            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 AND S.stco_cod = :stco_cod into :nombresubti;
            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
                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
                nomeps = '';
                nomafp = '';
                nomarp = '';
                nomccf = '';
                nomafc = '';
                nombretico = '';
                nombresubti = '';
                nomdepto = '';
                nomseccion = '';
                nomarea = '';
                nombreper = '';
                nombrebnco = '';
                nomsucur = '';
                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 AND S.stco_cod = :stco_cod into :nombresubti;
                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
                    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
                nomeps = '';
                nomafp = '';
                nomarp = '';
                nomccf = '';
                nomafc = '';
                nombretico = '';
                nombresubti = '';
                nomdepto = '';
                nomseccion = '';
                nomarea = '';
                nombreper = '';
                nombrebnco = '';
                nomsucur = '';
                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 AND S.stco_cod = :stco_cod into :nombresubti;
                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
                    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
    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, TERC_NOM, TERC_DIR, TERC_TEL
        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, :fecnaccumpl, :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, :nombreempl, :direccion, :telefono
        DO
        BEGIN
        nomeps = '';
        nomafp = '';
        nomarp = '';
        nomccf = '';
        nomafc = '';
        nombretico = '';
        nombresubti = '';
        nomdepto = '';
        nomseccion = '';
        nomarea = '';
        nombreper = '';
        nombrebnco = '';
        nomsucur = '';
        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 AND S.stco_cod = :stco_cod into :nombresubti;
        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';
        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
END^


ALTER PROCEDURE REP_ENSAMBLES (
    FECINI DATE,
    FECFIN DATE,
    PREFINI VARCHAR(4),
    PREFFIN VARCHAR(4),
    OPER INTEGER,
    MAQUI INTEGER,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    DETALLE CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    TURNO VARCHAR(60),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    BODEGA VARCHAR(2),
    NOMBODEGA VARCHAR(60),
    PRODUCTO VARCHAR(20),
    DESPROD VARCHAR(60),
    CANT NUMERIC(18,4),
    COSTO 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),
    COSTOCOMP NUMERIC(18,4),
    PESOCOMP NUMERIC(18,4))
AS
declare variable cantretal NUMERIC(18,4);
declare variable ID INTEGER;
begin
FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, E.BODE_COD, BODE_NOM, ENSA_TURNO, ENSA_CODBAR, ENSA_DESC,
    ENSA_CANT, ENSA_PESO, ENSA_OBS, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_COSTO
    FROM ENSAMBLES E, BODEGA B, PREFIJOS P
    WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_FECHA >= :FECINI AND E.ENSA_FECHA <= :FECFIN AND E.PREF_PRE >= :prefini AND E.PREF_PRE <= :preffin
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ENSA_ANULADO = 'N'
     AND ((:OPER = 0) OR (ENSA_OPER = :OPER)) AND ((:MAQUI = 0) or (ENSA_MAQUINA = :MAQUI)) AND E.bode_cod >= :bodini AND E.bode_cod <= :bodfin
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :conc, :bodega, :nombodega, :turno, :producto, :desprod,
    :cant, :peso, :OBS, :retal, :cantretal, :operario, :maquina, :costo
    DO
    BEGIN
    SELECT ENSA_NOMBRE FROM ensamble_turno WHERE ENSA_TURNO = :turno INTO :turno;
    SELECT ENOP_NOMBRE FROM ensamble_operario WHERE ENOP_ID = :operario INTO :operario;
    SELECT ENMA_NOMBRE FROM ensamble_maquina WHERE ENMA_ID = :maquina INTO :maquina;
    SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :retal INTO :pesoretal;
    if (pesoretal IS NULL) then
        pesoretal = 0;
    pesoretal = pesoretal * cantretal / 1000;
    if (DETALLE = 'S') then
        FOR SELECT ESDE_CODBAR, ESDE_DESC, ESDE_CANT, BODE_COD, ESDE_PESO, ESDE_COSTO
            FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
            :codcomp, :descomp, :cantcomp, :bodcomp, :pesocomp, :costocomp
            DO
            BEGIN
            SUSPEND;
            END
    else
        SUSPEND;
    END
end^


ALTER PROCEDURE REP_ENTREGA_FACTURAS (
    TIPODOC INTEGER,
    FECINI DATE,
    FECFIN DATE,
    ENTRINI INTEGER,
    ENTRFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    IDDOC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    NOMCLIENTE VARCHAR(60),
    ITEMS INTEGER,
    TOTAL NUMERIC(18,2),
    ENTRID INTEGER,
    ENTRNOM VARCHAR(60),
    FECREG DATE,
    HORAREG TIME,
    FECASI DATE,
    HORAASI TIME,
    FECLIS DATE,
    HORALIS TIME,
    FECENT DATE,
    HORAENT TIME,
    TIEMPOL TIME,
    TIEMPOE TIME,
    OBSERVACION BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
declare variable tie float;
declare variable hora integer;
declare variable minu integer;
declare variable secu integer;
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, AUDI_FECHA, AUDI_HORA, fact_nomcliente, FACT_TOTAL FROM FACTURAS F, AUDITORIA A
    WHERE A.tido_cod = 31 AND F.fact_id = A.audi_iddoc AND A.audi_oper = 'I' AND AUDI_FECHA >= :FECINI AND AUDI_FECHA <= :FECFIN
    AND ((:AGENCIA = 0) or (EXISTS (SELECT PREF_PRE FROM PREFIJOS WHERE PREF_PRE = F.PREF_PRE AND SUCU_ID = :AGENCIA)))
    INTO :IDDOC, :PREF, :NUMERO, :FECREG, :HORAREG, :NOMCLIENTE, :TOTAL
    DO
    BEGIN
    FECASI = NULL;
    HORAASI = NULL;
    FECENT = NULL;
    HORAENT = NULL;
    OBSERVACION = '';
    ENTRNOM = '';
    SELECT ENDO_FECHAA, ENDO_HORAA, ENDO_FECHAE, ENDO_HORAE, ENDO_OBS, ENDO_ENCARGADO, ENTG_NOMBRE, ENDO_FECHAL, ENDO_HORAL
        FROM entrega_documentos D, ENTREGADORES E WHERE TIDO_COD = 31 AND ENDO_IDDOC = :IDDOC AND E.entg_id = D.endo_encargado
        INTO :FECASI, :HORAASI, :FECENT, :HORAENT, :OBSERVACION, :ENTRID, :ENTRNOM, :feclis, :horalis;
    if ((ENTRID >= :ENTRINI) AND (ENTRID <= :ENTRFIN)) then
        BEGIN
        SELECT COUNT(FADE_ITEM) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC INTO :ITEMS;
        tie = (FECENT - FECLIS) * 3600 + (HORAENT - HORALIS);
        if (TIE > 0) then
            BEGIN
            hora = floor(tie / 3600);
            minu = floor((tie-(hora*3600)) / 60);
            secu = tie-(hora*3600)-(minu*60);
            tiempoe = hora || ':' || minu || ':' || secu;
            END
        ELSE
            tiempoe = '00:00:00';
        tie = (FECLIS - FECASI) * 3600 + (HORALIS - HORAASI);
        if (TIE > 0) then
            BEGIN
            hora = floor(tie / 3600);
            minu = floor((tie-(hora*3600)) / 60);
            secu = tie-(hora*3600)-(minu*60);
            tiempol = hora || ':' || minu || ':' || secu;
            END
        ELSE
            tiempol = '00:00:00';
        suspend;
        END
    END
end^


ALTER PROCEDURE REP_ESTADO_CUENTA_BANCO (
    FECINI DATE,
    FECFIN DATE,
    CTAINI VARCHAR(2),
    CTAFIN VARCHAR(2))
RETURNS (
    FECHA DATE,
    TIPO VARCHAR(30),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    DEBITO NUMERIC(18,2),
    CREDITO NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    CONCEPTO VARCHAR(60),
    NUMEROCUENTA VARCHAR(20),
    TITULAR VARCHAR(60),
    SUCURSAL VARCHAR(60),
    NOMBANCO VARCHAR(60),
    COD_CUENTA VARCHAR(3),
    CODIGO INTEGER,
    SALDOINICIAL NUMERIC(18,2))
AS
declare variable DB CHAR(1);
declare variable NUMROWS INTEGER;
declare variable TOTAL NUMERIC(18,2);
BEGIN
FOR SELECT CUBA_COD, CUBA_CODCTA,CUBA_TITULAR,CUBA_NUMERO, CUBA_SUCURSAL, BANC_NOMBRE
  FROM cuentas_banco C, BANCOS B
  WHERE C.BANC_COD = B.BANC_COD AND CUBA_CODCTA >= :CTAINI AND CUBA_CODCTA <= :CTAFIN
  ORDER BY CUBA_CODCTA
  INTO :CODIGO, :COD_CUENTA,:TITULAR,:NUMEROCUENTA, :SUCURSAL, :NOMBANCO
  DO
  begin
  EXECUTE PROCEDURE SALDO_CUENTA_BANCO(:CODIGO, :FECINI) returning_values(:SALDOINICIAL);
  SALDO =SALDOINICIAL;
  SELECT COUNT(MOBA_ID) FROM MOVIMIENTO_BANCO
    WHERE CUBA_COD = :CODIGO AND MOBA_FECHA >= :FECINI AND MOBA_FECHA <= :FECFIN INTO :NUMROWS;
  if (NUMROWS = 0) then
    BEGIN
    TIPO = '';
    PREFIJO = '';
    NUMERO = '';
    CONCEPTO = '';
    DEBITO = 0;
    CREDITO = 0;
    SUSPEND;
    END
  ELSE
    FOR SELECT MOBA_FECHA, TIDO_NOMLARGO, MOBA_PREF, MOBA_NUMERO, MOBA_CONCEPTO, MOBA_DB, MOBA_TOTAL
        FROM MOVIMIENTO_BANCO M, TIPO_DOCUMENTO T
        WHERE M.MOBA_TIPODOC = T.TIDO_COD AND M.CUBA_COD =:CODIGO AND M.MOBA_FECHA >=:FECINI AND M.MOBA_FECHA <=:FECFIN
        ORDER BY MOBA_TIPODOC, MOBA_FECHA, MOBA_ID
        INTO :FECHA, :TIPO, :PREFIJO, :NUMERO, :CONCEPTO, :DB, :TOTAL
        DO
        BEGIN
        if (DB = 'S') then
            BEGIN
            DEBITO = TOTAL;
            CREDITO = 0;
            SALDO = SALDO + DEBITO;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = TOTAL;
            SALDO = SALDO - CREDITO;
            END
        SUSPEND;
        END
  end
END^


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^


ALTER PROCEDURE REP_FACTURAS_MES (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    ANO VARCHAR(4),
    MES INTEGER,
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        if (NOT EXISTS (SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_SUCURSAL = :sucursal AND FAME_ANO = :ANO AND FAME_MES = :MES)) then
            SUSPEND;
        END
    END
end^


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


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


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


ALTER PROCEDURE REP_FALTANTES_PROVEEDORI (
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(4),
    GRPFIN VARCHAR(4),
    SUBINI VARCHAR(3),
    SUBFIN VARCHAR(3),
    AGRUPA CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(3),
    NOMGRUPO VARCHAR(60),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(60),
    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);
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
    begin
    MARINI = GRPINI;
    MARFIN = GRPFIN;
    GRPINI = '';
    GRPFIN = 'zz';
    SUBINI = '';
    SUBFIN = 'zz';
    end
    
select TIDO_NOMLARGO from TIPO_DOCUMENTO where TIDO_COD = 139 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
        and (((:GRPINI = '') and (:GRPFIN = 'zz')) or ((A.grup_cod >= :GRPINI) and (A.grup_cod <= :grpfin)))
        and (((:subini = '') and (:subfin = 'zz')) or ((A.subg_cod >= :subini) and (A.subg_cod <= :subfin)))
        and (((:MARINI = '') and (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) and (A.MARC_COD <= :MARFIN)))
      into :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
    do
      begin
      execute procedure nombres_grupos_inventario (:CODGRUPO, :CODSUBG, :CODMARC)
        returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
      if (DETALLE = 'N') then
        begin
        FALTANTE = 0;
        CANTIDAD = 0;
        BASE = 0;
        for select O.slim_id, d.slde_item, d.slde_cant, (d.slde_prunit-d.slde_dtomonto)
            from solicitud_importacion_det D, solicitud_importacion O, PREFIJOS P
            where O.slim_id = D.slim_id and ARTI_COD = :ARTICULO and SLIM_FECHA >= :FECINI and SLIM_FECHA < :FECFIN
            and TERC_NIT = :NIT and SLIM_ANULADO = 'N' and P.PREF_PRE = O.PREF_PRE and P.TIDO_COD = 139 and ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            order by O.slim_id, D.slde_item into :ID, :ITEM, :CANT, :MONTO
            do
            begin
            NROPROV = '';
            CANTIDAD = CANTIDAD + CANT;
            EXECUTE PROCEDURE FALTANTE_CORTE(139, 137, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
            FALTANTE = FALTANTE + CANT;
            BASE = BASE + MONTO;
            end
        if (FALTANTE is null) then
            FALTANTE = 0;
        if (BASE is null) then
            BASE = 0;
        if (CEROS = 'S') then
            suspend;
        else
            if (FALTANTE <> 0) then
                suspend;
        end
      else
        begin
        for select O.slim_id, D.slde_item, O.pref_pre, SLIM_NUMERO, SLIM_FECHA, D.slde_cant * D.slde_factor, (D.slde_prunit-D.slde_dtomonto) * D.slde_cant, 0
            from solicitud_importacion O, solicitud_importacion_det D, PREFIJOS P
            where O.slim_id = D.slim_id and ARTI_COD = :ARTICULO and SLIM_FECHA >= :FECINI and SLIM_FECHA < :FECFIN
             and TERC_NIT = :NIT and SLIM_ANULADO = 'N' and P.PREF_PRE = O.PREF_PRE and P.TIDO_COD = 139 and ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            into :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA
            do
                begin
                nroprov = '';
                EXECUTE PROCEDURE FALTANTE_CORTE(139, 137, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                if ((CEROS = 'S') or (FALTANTE <> 0) ) then
                  suspend;
                end
        end
      end
    end
end^


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

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


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


ALTER 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));
    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 / META;
    else
        PORC = 0;
    if (CEROS = 'S') then
        SUSPEND;
    ELSE
        if ((BASE <> 0) OR (cajas <> 0) or (unidades <> 0) ) then
            SUSPEND;
    END /* FOR */
END^


ALTER PROCEDURE REP_HISTOEMPL (
    FECDESDE DATE,
    FECHASTA DATE,
    PERDESDE INTEGER,
    PERHASTA INTEGER,
    PERIODICIDAD INTEGER)
RETURNS (
    NOMI_FECCAUSA DATE,
    CONC_NOMBRE VARCHAR(60),
    CONC_COD INTEGER,
    TERC_NIT VARCHAR(20),
    FECING DATE,
    NOCO_VALOR NUMERIC(18,2),
    NOCO_ENTIDAD VARCHAR(20),
    NOCO_DEDUC CHAR(1),
    NOCO_PROV CHAR(1),
    NOCO_APORTE CHAR(1),
    NOCO_PAGOOK CHAR(1),
    NOCO_PERIODO INTEGER,
    NOCO_ANO CHAR(4),
    NOCO_APLICAPROM CHAR(1),
    NOCO_SALARIO CHAR(1),
    NOCO_GTOEMPR CHAR(1),
    CONC_NOMCORTO VARCHAR(60),
    PNOM_NOMBRE VARCHAR(60),
    TERC_NOM VARCHAR(60),
    FECRET DATE)
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
    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 = P.ppag_cod) or (O.nomi_periodocidad = 5))
    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
    BEGIN
    FECRET = NULL;
    SELECT EMPL_FECING, EMPL_FECRET FROM EMPLEADOS WHERE TERC_NIT = :terc_nit INTO :fecing, :fecret;
    SUSPEND;
    END
END^


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 SUB_TYPE 0 SEGMENT SIZE 80)
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^


ALTER PROCEDURE REP_IMPORTACIONES (
    TIPO INTEGER,
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    SOLOCERR CHAR(1))
RETURNS (
    TIPODOC INTEGER,
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    ESTADO CHAR(1),
    NIT VARCHAR(20),
    NOMPROV VARCHAR(60),
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTOFOB NUMERIC(18,2),
    COSTOFOBM NUMERIC(18,2),
    TRM NUMERIC(18,2),
    MONEDA VARCHAR(60),
    DTOITE NUMERIC(9,2),
    COSTOTOT NUMERIC(18,2),
    FLETE NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    IMPUESTOS NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    PRNETO NUMERIC(18,2))
AS
begin
if (TIPO = 137) then
    BEGIN
    TIPODOC = TIPO;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    FOR SELECT FP.fapo_id, FP.pref_pre, FP.fapo_numero, FP.fapo_fecha, FP.terc_nit, FP.timo_cod, FP.fapo_estado
        FROM factura_proforma FP
        WHERE FAPO_FECHA >= :FECINI AND FAPO_FECHA <= :FECFIN AND FAPO_ANULADO = 'N' AND ((FAPO_ESTADO = 'C') or (:SOLOCERR ='N'))
        INTO :id,  :PREFIJO, :NUMERO, :fecha,  :NIT, :MONEDA, :ESTADO
        DO
        BEGIN
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :nomprov;
        SELECT TIMO_NOMBRE FROM TIPOS_MONEDA WHERE TIMO_COD = :MONEDA INTO :MONEDA;
        FOR SELECT FD.arti_cod, FD.fpde_cant, FD.fpde_unidad, FD.fpde_prunit, FD.fpde_prunitmon, FD.fpde_fob * FD.fpde_trm, FD.fpde_trm, FD.fpde_dtoporc,
            FD.fpde_flete, FD.fpde_seguro, FD.fpde_otrogto, FD.fpde_ivamonto, FD.fpde_total
            FROM factura_proforma_det FD WHERE FAPO_ID = :ID
            INTO :articulo, :cant, :unidad, :costofob, :costofobm, :costotot, :trm, :dtoite,
            :flete, :seguros, :otros, :impuestos, :total
            DO
            BEGIN
            SELECT ARTI_DES, ARTI_DESCORTA FROM ARTICULO WHERE ARTI_COD = :articulo INTO :descripcion, :descorta;
            PRNETO = TOTAL / CANT;
            suspend;
            END
        END
    END
end^


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),
    NIIF CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    RESERVADO NUMERIC(18,4))
AS
declare variable entrada char(1);
declare variable cant numeric(18,4);
declare variable costo numeric(18,2);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable pedido numeric(18,4);
declare variable ordenc numeric(18,4);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable pedauto char(2);
declare variable idant integer;
declare variable cambcosto 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', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, t.taiv_porc
      FROM ARTICULO A, tarifa_iva t
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
        ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((A.ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.taiv_cod = T.taiv_cod
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivaporc
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            if (NIIF = 'S') then
                EXECUTE PROCEDURE valor_inicial_inventario_n(CODIGO, FECINI) returning_values (COSTOINI);
            else
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            if (NIIF = 'S') then
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            else
                EXECUTE PROCEDURE costo_promedio_niif(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
                if (NIIF = 'S') then
                  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM costos_niif
                    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
                    WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                    INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
                if (NIIF = 'S') then
                  SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                    FROM costos_niif 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;
                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;
            /* SUME LOS CAMBIOS DE COSTO DEL PERIODO */
            if (NIIF = 'S') then
                SELECT SUM((C.caco_antcosto-C.caco_nvocosto) * M.mvar_cant)
                    FROM MOVIMIENTO_ARTICULO M, cambio_costo C WHERE M.mvar_tipodoc = 10 AND M.mvar_idref = C.caco_id
                    AND M.mvar_fecha >= :fecini AND M.mvar_fecha <= :fecfin AND M.arti_cod = :codigo and c.caco_clase >= 2
                    INTO :CAMBCOSTO;
            else
                SELECT SUM((C.caco_antcosto-C.caco_nvocosto) * M.mvar_cant)
                    FROM MOVIMIENTO_ARTICULO M, cambio_costo C WHERE M.mvar_tipodoc = 10 AND M.mvar_idref = C.caco_id
                    AND M.mvar_fecha >= :fecini AND M.mvar_fecha <= :fecfin AND M.arti_cod = :codigo and c.caco_clase <= 2
                    INTO :CAMBCOSTO;
            if (cambcosto IS NULL) then
              cambcosto = 0;
            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;
            if (cambcosto > 0) then
              COSTOSAL = COSTOSAL + CAMBCOSTO;
            ELSE
              COSTOENT = COSTOENT - CAMBCOSTO; -- ES NEGATIVO

            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                if (NIIF = 'S') then
                    EXECUTE PROCEDURE valor_inicial_inventario_n(CODIGO, FECFIN+1) returning_values (cosfinal);
                else
                    EXECUTE PROCEDURE valor_inicial_inventario(CODIGO, FECFIN+1) returning_values (cosfinal);
                SELECT SUM(RSDE_LIBERAR)
                    FROM RESERVAS_DETALLE RD, RESERVAS R
                    WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :fecfin AND RESE_VENCE >= :fecfin AND RSDE_ANULADO = 'N'
                    INTO :RESERVADO;
                if (RESERVADO IS NULL) then
                    RESERVADO = 0;
                PEDIDO = 0;
                FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                    FROM PEDIDOS P, PEDIDOS_DETALLE PD
                    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :fecfin AND PEDI_FECHA <= :fecfin AND PEDE_ANULADO = 'N'
                    INTO :ID, :ITEM, :CANT2
                    do
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                        EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if (ORDENC IS NULL) then
                        ORDENC = 0;
                    PEDIDO = PEDIDO + ORDENC * FACTOR;
                    END
                RESERVADO = RESERVADO + PEDIDO;
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                if (NIIF = 'S') then
                    EXECUTE PROCEDURE costo_promedio_niif(CODIGO, FECFIN+1) returning_values (COSFINAL);
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                SELECT SUM(RSDE_LIBERAR)
                    FROM RESERVAS_DETALLE RD, RESERVAS R
                    WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :fecfin AND RESE_VENCE >= :fecfin AND RD.BODE_COD = :bodega AND RSDE_ANULADO = 'N'
                    INTO :RESERVADO;
                if (RESERVADO IS NULL) then
                    RESERVADO = 0;
                PEDIDO = 0;
                FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                    FROM PEDIDOS P, PEDIDOS_DETALLE PD
                    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :bodega
                    INTO :ID, :ITEM, :CANT2
                    do
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                        EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if (ORDENC IS NULL) then
                        ORDENC = 0;
                    PEDIDO = PEDIDO + ORDENC * FACTOR;
                    END
                RESERVADO = RESERVADO + PEDIDO;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            if (EXISTS (SELECT MVAR_CONS FROM MOVIMIENTO_ARTICULO M WHERE M.arti_cod = :CODIGO AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13))) then
                BEGIN
                if (NIIF = 'S') then
                    FOR SELECT MVAR_TIPODOC, MVAR_IDREF, 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_niif 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, :ID, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                      DO
                        BEGIN
                        if (TIPODOC = '10') THEN
                            BEGIN
                            IF (IDANT <> ID) then
                                BEGIN
                                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :TIPODOC;
                                SELECT SUM(MVAR_CANT * MVAR_COSTONIIF), SUM(MVAR_CANT) FROM movimiento_articulo WHERE MVAR_TIPODOC = 10 AND MVAR_IDREF = :ID
                                    INTO :COSTOFIN, :cant;
                                SALIDAS = 0;
                                ENTRADAS = 0;
                                if (CANT > 0) then
                                    COSTOSAL = COSTOFIN / CANT;
                                else
                                    COSTOSAL = 0;
                                SUSPEND;
                                END
                            END
                        else
                            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 + (ENTRADAS * COSTOENT)) / (CANT + ENTRADAS);
                                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
                        IDANT = ID;
                        END
                ELSE
                    FOR SELECT MVAR_TIPODOC, MVAR_IDREF, 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, :ID, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                      DO
                        BEGIN
                        if (TIPODOC = '10') THEN
                            BEGIN
                            IF (IDANT <> ID) then
                                BEGIN
                                SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :TIPODOC;
                                SELECT SUM(MVAR_CANT * MVAR_COSTO), SUM(MVAR_CANT) FROM movimiento_articulo WHERE MVAR_TIPODOC = 10 AND MVAR_IDREF = :ID
                                    INTO :COSTOFIN, :cant;
                                SALIDAS = 0;
                                ENTRADAS = 0;
                                if (CANT > 0) then
                                    COSTOSAL = COSTOFIN / CANT;
                                else
                                    COSTOSAL = 0;
                                SUSPEND;
                                END
                            END
                        else
                            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 + (ENTRADAS * COSTOENT)) / (CANT + ENTRADAS);
                                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
                        IDANT = ID;
                        END
                END
            ELSE
                BEGIN
                if ((SALDOINI <> 0) or (COSTOINI <> 0))  then
                    BEGIN
                    TIPODOC = 0;
                    ID = 0;
                    ENTRADA = 'N';
                    PREFIJO = '';
                    NUMERO = '';
                    ENTRADAS = 0;
                    SALIDAS = 0;
                    COSTOENT = 0;
                    CONCEPTO = '';
                    FECHA = NULL;
                    NIT = '';
                    CONS = 0;
                    CODBOD = '';
                    costo = 0;
                    cant = 0;
                    SUSPEND;
                    END
                END

            END
        END
END^


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


ALTER PROCEDURE REP_METAS_VENTAS (
    DESDE VARCHAR(10),
    HASTA VARCHAR(10),
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    FECHA DATE,
    META NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    COMIPORC NUMERIC(9,2),
    COMIMONTO NUMERIC(18,2))
AS
declare variable IVAMONTO numeric(18,2);
declare variable EXTRA numeric(18,2);
declare variable TOTAL numeric(18,2);
declare variable CONSUMO numeric(18,2);
declare variable IVAMONTOD numeric(18,2);
declare variable EXTRAD numeric(18,2);
declare variable TOTALD numeric(18,2);
declare variable CONSUMOD numeric(18,2);
declare variable SITOT char(2);
declare variable comibase 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
    FOR select VEME_FECHA, VEME_META, veme_comipor, veme_comimonto, veme_comibase
        from vendedor_meta V WHERE VEND_ID = :CODVEND AND VEME_FECHA >= :fecini AND VEME_FECHA <= :fecfin
        INTO :fecha, :meta, :comiporc, :comimonto, :comibase
        DO
        BEGIN
        total = 0;
        totald = 0;
        ivamonto = 0;
        ivamontod = 0;
        extra = 0;
        extrad = 0;
        consumo = 0;
        consumod = 0;
        select SUM(FACT_TOTAL), SUM(FACT_EXTRA), SUM(FACT_IVAMONTO)
            from FACTURAS f where VEND_COD = :CODVEND and FACT_FECHA = :fecha and FACT_ANULADO = 'N'
            into :TOTAL, :extra, :ivamonto;
        select SUM(FADE_CONSUMO)
            from FACTURAS f, facturas_detalle d where F.FACT_ID = D.FACT_ID and VEND_COD = :CODVEND and FACT_FECHA = :fecha and FACT_ANULADO = 'N'
            into :CONSUMO;
        SELECT SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_TOTAL)
            from DEVOLUCIONES_VENTAS V where VEND_COD = :CODVEND and DEVT_FECHA = :fecha and DEVT_ANULADO = 'N'
            into :IVAMONTOD, :EXTRAD, :TOTALD;
        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 = :fecha and DEVT_ANULADO = 'N'
            into :CONSUMOD;
        if (total is null) then
            total = 0;
        if (totald is null) then
            totald = 0;
        if (ivamonto is null) then
            ivamonto = 0;
        if (ivamontod is null) then
            ivamontod = 0;
        if (consumo is null) then
            consumo = 0;
        if (consumod is null) then
            consumod = 0;
        if (extra is null) then
            extra = 0;
        if (extrad is null) then
            extrad = 0;
        if (SITOT = 'SI') then
            VENTAS = TOTAL - TOTALD;
        else
            VENTAS = TOTAL - EXTRA - IVAMONTO - CONSUMO - (TOTALD - EXTRAD - IVAMONTOD - CONSUMOD);
        execute procedure redondee(:VENTAS, 0) returning_values (:VENTAS);
        if (ventas >= meta) then
            begin
            if (comimonto <> 0) then
                BEGIN
                /* PAGA UN MONTO POR CADA $BASE */
                if (COMIBASE <> 0) then
                    COMIMONTO = FLOOR(VENTAS / COMIBASE) * COMIMONTO;
                END
            ELSE
                begin
                COMIMONTO = VENTAS * COMIPORC / 100;
                end
            end
        else
            COMIMONTO = 0;
        suspend;
        end
    end
end^


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(8),
    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
        if ((TIPODOC >= 85) AND (TIPODOC <= 89)) then
            BEGIN
            BANCO = '';
            CUENTA = '';
            NUMDOC = '';
            IDFORMA = 1;
            FORPAGO  = 'EFECTIVO';
            SUSPEND;
            END
        END
    END
END^


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^


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

                            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_RCREE)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA <= :fautorcree AND MVCL_DEBITO = 'N' and
                                MVCL_ABONO = 'N' AND mvcl_tiporef <> 45 AND MVCL_SUCURSAL = :SUCURSAL AND
                                ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :rcree;
                            if (rcree IS NULL) then
                                rcree = 0;
                            CREDITO = CREDITO - RCREE;
                            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_RCREE/MVCL_TRM)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA <= :fautorcree AND MVCL_DEBITO = 'S' AND MVCL_TRM <> 1 AND
                                MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :rcree;
                            if (rcree IS NULL) then
                                rcree = 0;
                            DEBITO = DEBITO - RCREE;

                            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_RCREE/MVCL_TRM)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA <= :fautorcree 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 :RCREE;
                            if (rcree IS NULL) then
                                rcree = 0;
                            CREDITO = CREDITO - RCREE;
                            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;
                            SELECT SUM(MVCL_RCREE)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                MVCL_FECHA <= :fautorcree AND COBR_COD = :CODCOBR AND MVCL_DEBITO = 'N' and
                                MVCL_ABONO = 'S' AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :RCREE;
                            if (rcree IS NULL) then
                                rcree = 0;
                            ABONOS = ABONOS - RCREE;
                            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;
                            SELECT SUM(MVCL_RCREE/MVCL_TRM)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                MVCL_FECHA <= :fautorcree 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 :RCREE;
                            if (rcree IS NULL) then
                                rcree = 0;
                            ABONOS = ABONOS - RCREE;
                            END
                        END
                    if (DEBITO IS NULL) then
                        DEBITO = 0;
                    if (CREDITO IS NULL) then
                        CREDITO = 0;
                    if (ABONOS IS NULL) then
                        ABONOS = 0;
                    CREDITO = CREDITO + ABONOS;
                    TDEBITO = DEBITO;
                    TCREDITO = CREDITO;
                    SALDO = INICIAL + DEBITO - CREDITO;
                    SUSPEND;
                    END
                END  /* ok = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA C */
    END  /* FOR NIT */
END^


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),
    CALIFICA VARCHAR(20),
    INICIAL NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    TIPOREF INTEGER,
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    RCREE NUMERIC(18,2),
    CUPO NUMERIC(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable 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, CLIE_CALIFICA
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT  = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((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, :CALIFICA
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        INICIAL = 0;
        FECINI = FECINI - 1;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
          WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPODOC, :IDDOC
          DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        SALDO = INICIAL;
        FECINI = FECINI + 1;
        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_rcree, 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, :RCREE, :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 (RCREE IS NULL) then
                    RCREE = 0;
                if (DB = 'N') then
                    BEGIN
                    CREDITO = DEBITO;
                    DEBITO = 0;
                    RTFTE = rtfte * -1;
                    RTIVA = rtiva * -1;
                    RTICA = rtica * -1;
                    RCREE = rcree * -1;
                    END
                ELSE
                    CREDITO = 0;
                if ((MONEDA <> 0) AND (TRM <> 0)) then
                    BEGIN
                    SALDO = saldo / TRM;
                    DEBITO = DEBITO / TRM;
                    CREDITO = CREDITO / TRM;
                    RTFTE = RTFTE / TRM;
                    RTIVA = RTIVA / TRM;
                    RTICA = RTICA / TRM;
                    RCREE = RCREE / TRM;
                    END
                SUSPEND;
                END
            END
        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_rcree, 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, :RCREE, :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 (RCREE IS NULL) then
                            RCREE = 0;
                        if (DB = 'N') then
                            BEGIN
                            CREDITO = DEBITO;
                            DEBITO = 0;
                            RTFTE = rtfte * -1;
                            RTIVA = rtiva * -1;
                            RTICA = rtica * -1;
                            RCREE = rcree * -1;
                            END
                        ELSE
                            CREDITO = 0;
                        if ((MONEDA <> 0) AND (TRM <> 0)) then
                            BEGIN
                            SALDO = saldo / TRM;
                            DEBITO = DEBITO / TRM;
                            CREDITO = CREDITO / TRM;
                            RTFTE = RTFTE / TRM;
                            RTIVA = RTIVA / TRM;
                            RTICA = RTICA / TRM;
                            RCREE = RCREE / TRM;
                            END
                        SUSPEND;
                        END
                END  /* ok = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA C */
    END  /* FOR NIT */
END^


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(8),
    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),
    RCREE NUMERIC(18,2),
    ARTFTE NUMERIC(18,2),
    ARTIVA NUMERIC(18,2),
    ARTICA NUMERIC(18,2),
    ARCREE NUMERIC(18,2),
    ID INTEGER)
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_rcree, mvpr_abono, MVPR_TRM, MVPR_ID
            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_id
            into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :RCREE, :AB, :TRM, :ID
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (RCREE IS NULL) then
                RCREE = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = RTFTE * -1;
                RTIVA = RTIVA * -1;
                RTICA = RTICA * -1;
                RCREE = RCREE * -1;
                END
            ELSE
                CREDITO = 0;
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                DEBITO = DEBITO / TRM;
                CREDITO = CREDITO / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                RCREE = RCREE / TRM;
                END
            SALDO = SALDO + DEBITO - CREDITO;
            if (AB = 'N') then
                BEGIN
                if (DESCRETE = 'SI') then
                    SALDO = SALDO - RTFTE - RTIVA - RTICA - RCREE;
                ABONO = 0;
                END
            ELSE
                BEGIN
                ABONO = CREDITO;
                CREDITO = 0;
                if (DESCRETE <> 'SI') then
                    SALDO = SALDO + RTFTE + RTIVA + RTICA + RCREE;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica), sum(mvpr_rcree)
                    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, :RCREE;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM), sum(mvpr_rcree/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, :RCREE;
            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 (RCREE IS NULL) then
                RCREE = 0;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica), sum(mvpr_rcree) 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, :ARCREE;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM), sum(mvpr_rcree/MVPR_TRM) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_TIPOREF <> 55 AND MVPR_ABONO = 'N' INTO :CREDITO, :ARTFTE, :ARTIVA, :ARTICA, :ARCREE;
            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 (ARCREE IS NULL) then
                ARCREE = 0;
            RTFTE = RTFTE - ARTFTE;
            RTIVA = RTIVA - ARTIVA;
            RTICA = RTICA - ARTICA;
            RCREE = RCREE - ARCREE;
            if (MONEDA = 0) then
                SELECT SUM(MVPR_MONTO), sum(mvpr_rtfte), sum(mvpr_rtiva), sum(mvpr_rtica), sum(mvpr_rcree) FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA, :ARCREE;
            else
                SELECT SUM(MVPR_MONTO/MVPR_TRM), sum(mvpr_rtfte/MVPR_TRM), sum(mvpr_rtiva/MVPR_TRM), sum(mvpr_rtica/MVPR_TRM), sum(mvpr_rcree/MVPR_TRM)
                    FROM movimiento_proveedor
                    WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
                    INTO :ABONO, :ARTFTE, :ARTIVA, :ARTICA, :ARCREE;
            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 (ARCREE IS NULL) then
                ARCREE = 0;
            if (DESCRETE <> 'SI') then
                ABONO = ABONO + ARTFTE + ARTIVA + ARTICA + ARCREE;
            SALDO = INICIAL + DEBITO - CREDITO - ABONO;
            if (DESCRETE = 'SI') then
                SALDO = SALDO - RTFTE - RTIVA - RTICA - RCREE;
            SUSPEND;
            END
        END
    END
END^


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

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

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

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

--      if (codigo <> codant) then EL SALDO DEBE SER POR LOTE Y NO POR ARTICULO
          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') AND MVAR_TIPODOC <> 10 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') AND MVAR_TIPODOC <> 10
                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) AND MVAR_TIPODOC <> 10
                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^


ALTER PROCEDURE REP_MUNICIPIOS_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODCIU VARCHAR(5),
    NOMCIU VARCHAR(60))
AS
begin
for select distinct t.terc_ciu from facturas f, prefijos p, terceros t, ciudades c where f.terc_nit = t.terc_nit and f.fact_fecha >= :fecini
    and f.fact_fecha <= :fecfin and f.fact_anulado = 'N' and f.pref_pre = p.pref_pre and ((p.sucu_id = :subempresa)
    or (:subempresa = 0)) and p.tido_cod = 31 and t.terc_ciu = c.ciud_nom
    into :nomciu
    do
    begin
    select ciud_cod from ciudades where ciud_nom = :nomciu into :codciu;
    suspend;
    end
for select distinct  t.terc_ciu from devoluciones_ventas f, prefijos p, terceros t, ciudades c where f.terc_nit = t.terc_nit and f.devt_fecha >= :fecini
    and f.devt_fecha <= :fecfin and f.devt_anulado = 'N' and f.pref_pre = p.pref_pre and ((p.sucu_id = :subempresa)
    or (:subempresa = 0)) and p.tido_cod = 33 and t.terc_ciu = c.ciud_nom and f.devt_factid is null
    into :nomciu
    do
    begin
    select ciud_cod from ciudades where ciud_nom = :nomciu into :codciu;
    suspend;
    end
end^


ALTER PROCEDURE REP_NOMINA_HORASEXTRA (
    ANOINI CHAR(4),
    ANOFIN CHAR(4),
    PERINI INTEGER,
    PERFIN INTEGER,
    EMPINI VARCHAR(20),
    EMPFIN VARCHAR(20))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DEPTO INTEGER,
    DEPTONOM VARCHAR(60),
    FECHA DATE,
    ANO CHAR(4),
    PERIODO INTEGER,
    SALBASE NUMERIC(18,2),
    HORASDIU INTEGER,
    MHORASDIU NUMERIC(18,2),
    HORASFDIU INTEGER,
    MHORASFDIU NUMERIC(18,2),
    HORASNOC INTEGER,
    MHORASNOC NUMERIC(18,2),
    HORASFNOC INTEGER,
    MHORASFNOC NUMERIC(18,2),
    HORASRNOC INTEGER,
    MHORASRNOC NUMERIC(18,2),
    HORASRFES INTEGER,
    MHORASRFES NUMERIC(18,2),
    HORASRFNOC INTEGER,
    MHORASRFNOC NUMERIC(18,2),
    HORASRDOM INTEGER,
    MHORASDOM NUMERIC(18,2))
AS
declare variable PERIODICIDAD INTEGER;
begin
FOR SELECT n.terc_nit, T.terc_nom, N.noex_ano, N.noex_periodio, N.noex_salbase, N.noex_diur, N.noex_mdiur,
    N.noex_fdiur, N.noex_mfdiur, N.noex_noct, N.noex_mnoct, N.noex_fnoct, N.noex_mfnoct, N.noex_recnoct, N.noex_mrecnoct,
    N.noex_recfest, N.noex_mrecfest, N.noex_recfnoc, N.noex_mrecfnoc, N.noex_domin, N.noex_mdomin, E.empl_dpto, E.empl_ppago
    FROM nomina_horasext N, TERCEROS T, empleados E
    WHERE N.terc_nit = T.terc_nit AND N.terc_nit >= :empini AND N.terc_nit <= :empfin AND E.terc_nit = T.terc_nit AND
    (((N.noex_ano = :anoini) AND (N.noex_periodio >= :perini)) or ((N.noex_ano = :anofin) AND (N.noex_periodio <= :perfin))
    or ((N.noex_ano > :anoini) and (N.noex_ano < :anofin)))
    ORDER BY N.noex_ano, N.noex_periodio, N.terc_nit
    INTO :NIT, :NOMBRE, :ano, :periodo, :SALBASE, HORASDIU, MHORASDIU,
    HORASFDIU, MHORASFDIU, HORASNOC, MHORASNOC, HORASFNOC, MHORASFNOC, HORASRNOC, MHORASRNOC,
    HORASRFES, MHORASRFES, HORASRFNOC, MHORASRFNOC, HORASRDOM, MHORASDOM, :DEPTO, :PERIODICIDAD
    DO
    BEGIN
    EXECUTE PROCEDURE fecha_final_periodo_pago(:periodicidad, :ano,  :periodo) returning_values (:FECHA);
    SELECT DPTO_NOMBRE FROM DEPARTAMENTO WHERE DPTO_COD = :DEPTO INTO :DEPTONOM;
    suspend;
    END
end^


ALTER PROCEDURE REP_NOMINA_NOVEDADES (
    FECINI DATE,
    FECFIN DATE,
    EMPINI VARCHAR(20),
    EMPFIN VARCHAR(20))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DEPTO INTEGER,
    DEPTONOM VARCHAR(60),
    FECHA DATE,
    TIPONOV VARCHAR(60),
    VALOR NUMERIC(18,2),
    ANO CHAR(4),
    PERIODO INTEGER,
    DIA INTEGER,
    DURA INTEGER,
    PRORROGA CHAR(1),
    MOTIVO VARCHAR(60))
AS
begin
FOR SELECT n.terc_nit, n.nono_fecha, T.terc_nom, TN.tnov_nombre, N.nono_dura, N.nono_valor, N.nono_ano, N.nono_periodo, N.nono_diaini,
    N.nono_prorroga, N.nono_motivo, E.empl_dpto
    FROM NOMINA_NOVEDADES N, TERCEROS T, tipos_novedad TN, empleados E
    WHERE N.terc_nit = T.terc_nit AND TN.tnov_cod = N.tnov_cod AND N.terc_nit >= :empini AND N.terc_nit <= :empfin AND
    E.terc_nit = T.terc_nit AND N.nono_fecha >= :fecini AND N.nono_fecha <= :fecfin
    ORDER BY N.nono_fecha, N.terc_nit
    INTO :NIT, :FECHA, :NOMBRE, :tiponov, :dura, :valor, :ano, :periodo, :dia, :prorroga, :motivo, :DEPTO
    DO
    BEGIN
    SELECT DPTO_NOMBRE FROM DEPARTAMENTO WHERE DPTO_COD = :DEPTO INTO :DEPTONOM;
    suspend;
    END
end^


ALTER PROCEDURE REP_PEDIDOS_ENTREGA (
    FECINI DATE,
    FECFIN DATE,
    TIPOENT INTEGER)
RETURNS (
    FECHA DATE,
    EMPRESA VARCHAR(20),
    ORIGEN VARCHAR(5),
    CIUDAD VARCHAR(5),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIRECCION VARCHAR(60),
    TELEFONO VARCHAR(40),
    CELULAR VARCHAR(40),
    UNIDADES INTEGER,
    VOLUMEN DOUBLE PRECISION,
    MONTO NUMERIC(18,2),
    ANEXOS VARCHAR(20),
    NUMERO VARCHAR(12),
    FORMAPAGO VARCHAR(20),
    CONTIENE VARCHAR(20),
    OBSERVACION VARCHAR(256))
AS
declare variable ID INTEGER;
begin
EMPRESA = '4317';
ORIGEN = '11001';
ANEXOS = 'FACTURA';
FORMAPAGO = 'CONTRA ENTREGA';
CONTIENE = 'PAPELERIA';
observacion = '';
FOR SELECT PEDI_ID, PREF_PRE || PEDI_NUMERO, PEDI_FECHA, P.TERC_NIT, CS.clsu_nombre, CS.clsu_dir, T.ciud_cod, CS.clsu_tel, T.terc_cel, PEDI_TOTAL
    FROM PEDIDOS P, terceros T, CLIENTE_SUCURSALES CS
    WHERE P.terc_nit = T.terc_nit AND T.terc_nit = CS.terc_nit AND P.pedi_sucursal = CS.clcu_cod AND
    PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND P.pedi_tipoentrega = :TIPOENT
    INTO :ID, :numero, :fecha, :nit, :nombre, :direccion, :ciudad, :telefono, :celular, :MONTO
    DO
    BEGIN
    SELECT COUNT(PEDE_ITEM), SUM(CAST(PD.pede_cant AS DOUBLE PRECISION) * CAST(PD.pede_factor AS DOUBLE PRECISION) * CAST(A.arti_peso AS DOUBLE PRECISION))
        FROM PEDIDOS_DETALLE PD, ARTICULO A
        WHERE PD.arti_cod = A.arti_cod AND PEDI_ID = :ID INTO :unidades, :volumen;
    suspend;
    END
end^


ALTER PROCEDURE REP_PLANILLA_INVENTARIO (
    FECINI DATE,
    FECFIN DATE,
    AGENCIA INTEGER,
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ARTIINI VARCHAR(15),
    ARTIFIN VARCHAR(15),
    GRUPOINI VARCHAR(2),
    GRUPOFIN VARCHAR(2),
    SUBGINI VARCHAR(3),
    SUBGFIN VARCHAR(3),
    CEROS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRP VARCHAR(3),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    INICIAL NUMERIC(18,2),
    ENTRADA NUMERIC(18,2),
    SALIDA NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    AJUSTE NUMERIC(18,2),
    ENSAMBLE NUMERIC(18,2),
    DESENSAMBLE NUMERIC(18,2),
    COMPRA NUMERIC(18,2),
    REMCOMP NUMERIC(18,2),
    DEVCOMP NUMERIC(18,2),
    VENTA NUMERIC(18,2),
    REMCLIE NUMERIC(18,2),
    DEVCLIE NUMERIC(18,2),
    NOTADB NUMERIC(18,2),
    NOTACR NUMERIC(18,2),
    FINAL NUMERIC(18,2),
    BODECOD VARCHAR(2),
    COSTOP NUMERIC(18,2),
    VALOREXISTE NUMERIC(18,2),
    VNTMES NUMERIC(18,2),
    VNTANO NUMERIC(18,2),
    PROMANO NUMERIC(18,2),
    MARCA VARCHAR(3),
    NOMMARCA VARCHAR(30))
AS
declare variable SUMA numeric(18,4);
declare variable TIPO integer;
declare variable MFACT numeric(18,2);
declare variable DEVOL integer;
declare variable MDEVOL numeric(18,2);
declare variable IVAFACT numeric(18,2);
declare variable IVADEV numeric(18,2);
declare variable MES integer;
declare variable ANO integer;
declare variable DIA integer;
declare variable FECINIMES date;
declare variable FECINIANO date;
BEGIN
for select a.arti_cod, a.arti_des, a.GRUP_COD, a.SUBG_COD, A.marc_cod from articulo A, GRUPO G
    where substring(arti_cod from 1 FOR 2) <> '.t' AND ARTI_EXIST <> 'N' AND a.grup_cod = g.grup_cod and a.arti_cod >= :artiini
    and a.arti_cod <= :artifin and a.grup_cod >= :grupoini and a.grup_cod <= :grupofin
    into :CODIGO, :DESCRIPCION, :CODGRP, :CODSUBG, :MARCA
    DO
    BEGIN
    if (((codsubg >= :subgini) and (codsubg <= :subgfin)) or ((subgini = '0') and (subgfin = 'zz')))  then
        begin
        execute procedure nombres_grupos_inventario(:codgrp, :codsubg, :marca) returning_values(:nomgrupo, :nomsubg, :nommarca);
        for select bode_cod from bodega where bode_Activa = 'S' AND ((SUCU_ID = :AGENCIA) or (:AGENCIA = 0)) AND
            BODE_COD >= :BODINI AND BODE_COD <= :BODFIN
            into :BODECOD
            do
            BEGIN
            FINAL = 0;
            INICIAL = 0;
            ENTRADA = 0;
            SALIDA = 0;
            TRASLADO = 0;
            AJUSTE = 0;
            ENSAMBLE = 0;
            DESENSAMBLE = 0;
            COMPRA = 0;
            REMCOMP = 0;
            DEVCOMP = 0;
            VENTA = 0;
            REMCLIE = 0;
            DEVCLIE = 0;
            MES = EXTRACT(MONTH FROM :fecfin);
            ANO = EXTRACT(YEAR FROM :fecfin);
            DIA = EXTRACT(DAY FROM :fecfin);
            FECINIMES = ANO||'/'||MES||'/01';
            FECINIANO = ANO||'/01/01';
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, BODECOD) returning_values (INICIAL);
            EXECUTE PROCEDURE COSTO_PROMEDIO (CODIGO, FECFIN) returning_values (COSTOP);
            EXECUTE PROCEDURE VENTAS_ARTICULO (CODIGO, FECINIMES, FECFIN, AGENCIA, BODECOD) returning_values (VNTMES, MFACT, DEVOL, MDEVOL, IVAFACT, IVADEV);
            EXECUTE PROCEDURE VENTAS_ARTICULO (CODIGO, FECINIANO, FECFIN, AGENCIA, BODECOD) returning_values (VNTANO, MFACT, DEVOL, MDEVOL, IVAFACT, IVADEV);
            PROMANO = VNTANO / :MES;
            EXECUTE PROCEDURE redondee(:promano,3) returning_values (:promano);
            FOR SELECT SUM(MVAR_CANT*IIF(MVAR_ENTRADA='S',1,-1)), MAX(MVAR_TIPODOC) FROM MOVIMIENTO_ARTICULO M, BODEGA B
                WHERE M.bode_cod = B.bode_cod AND ARTI_COD = :CODIGO AND MVAR_FECHA >= :fecini AND MVAR_FECHA <= :fecfin
                AND B.BODE_COD = :BODECOD AND ((B.sucu_id = :AGENCIA) or (:AGENCIA = 0))
                GROUP BY M.mvar_tipodoc
                INTO :SUMA, :TIPO
                do
                BEGIN
                if (SUMA IS NULL) then
                    SUMA = 0;
                if (TIPO = 11) then
                    ENTRADA = SUMA;
                if (TIPO = 12) then
                    SALIDA = SUMA;
                if (TIPO = 13) then
                    TRASLADO = SUMA;
                if (TIPO = 14) then
                    AJUSTE = SUMA;
                if (TIPO = 15) then
                    ENSAMBLE = SUMA;
                if (TIPO = 16) then
                    DESENSAMBLE = SUMA;
                if (TIPO = 21) then
                    COMPRA = SUMA;
                if (TIPO = 22) then
                    REMCOMP = SUMA;
                if (TIPO = 24) then
                    DEVCOMP = SUMA;
                if (TIPO = 31) then
                    VENTA = SUMA;
                if (TIPO = 32) then
                    REMCLIE = SUMA;
                if (TIPO = 33) then
                    DEVCLIE = SUMA;
                END
            FINAL = INICIAL + ENTRADA + SALIDA + TRASLADO + AJUSTE + ENSAMBLE + DESENSAMBLE + COMPRA + REMCOMP + DEVCOMP + VENTA + REMCLIE + DEVCLIE;
            NOTADB = 0;
            NOTACR = 0;
            VALOREXISTE = FINAL * COSTOP;
            EXECUTE PROCEDURE redondee(:VALOREXISTE,3) returning_values (:VALOREXISTE);
            EXECUTE PROCEDURE redondee(:FINAL,3) returning_values (:FINAL);
            EXECUTE PROCEDURE redondee(:COSTOP,3) returning_values (:COSTOP);
            if ((:CEROS = 'S') or ((:inicial <> 0) or (:ENTRADA <> 0) or (:salida <> 0) or (:traslado <> 0) or (:AJUSTE <> 0)
                or (:ENSAMBLE <> 0) or (:desensamble <> 0) or (:COMPRA <> 0) or (:REMCOMP <> 0) or (:DEVCOMP <> 0) or (:VENTA <> 0)
                or (:remclie <> 0) or (:DEVCLIE <> 0))) then
                SUSPEND;
            END
        FINAL = 0;
        INICIAL = 0;
        ENTRADA = 0;
        SALIDA = 0;
        TRASLADO = 0;
        AJUSTE = 0;
        ENSAMBLE = 0;
        DESENSAMBLE = 0;
        COMPRA = 0;
        REMCOMP = 0;
        DEVCOMP = 0;
        VENTA = 0;
        REMCLIE = 0;
        DEVCLIE = 0;
        if ((:CEROS = 'S') or ((:inicial <> 0) or (:ENTRADA <> 0) or (:salida <> 0) or (:traslado <> 0) or (:AJUSTE <> 0)
            or (:ENSAMBLE <> 0) or (:desensamble <> 0) or (:COMPRA <> 0) or (:REMCOMP <> 0) or (:DEVCOMP <> 0) or (:VENTA <> 0)
            or (:remclie <> 0) or (:DEVCLIE <> 0))) then
        SUSPEND;
        end
    END
END^


ALTER PROCEDURE REP_PRECIOS_RIMAR (
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    ORDEN CHAR(1),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    LISTA INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    REFERENCIA VARCHAR(20),
    CODGRP VARCHAR(2),
    CODSUBG VARCHAR(3),
    CODMAR VARCHAR(3),
    GRUPO VARCHAR(30),
    SUBGRUPO VARCHAR(30),
    MARCA VARCHAR(30),
    PRECIO NUMERIC(18,2),
    BAJO CHAR(1))
AS
declare variable SALDO numeric(18,4);
declare variable PRECIO2 numeric(18,4);
declare variable CADSQL varchar(1024);
declare variable SERVER varchar(100);
declare variable COMPANIA varchar(3);
declare variable USUARIO varchar(10);
declare variable CLAVE varchar(10);
declare variable FECPRE date;
begin
SELECT FIRST 1 RPCO_SERVIDOR, RPCO_COD FROM replica_compania INTO :SERVER, :COMPANIA;
SERVER = SERVER || '\DATOS\' || :COMPANIA || '\SYSPLUS.FDB';
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'NOMBRE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (USUARIO);
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'CLAVE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (CLAVE);
FOR SELECT ARTI_COD, ARTI_DES, GRUP_COD, SUBG_COD, MARC_COD
    FROM ARTICULO WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :GRPFIN AND ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN
    ORDER BY GRUP_COD, SUBG_COD, ARTI_COD
    INTO :CODIGO, :DESCRIPCION, :codgrp, :codsubg, :codmar
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_total_inventario(:codigo, :fecha) returning_values (:SALDO);
    if (SALDO <= 0) then
        BEGIN
        if (SERVER IS NOT NULL) then
            BEGIN
            CADSQL = 'SELECT SALDO FROM saldo_total_inventario(''' || :codigo || ''', ''' || :fecha || ''')';
            EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
                INTO :SALDO;
            END
        END
    if (SALDO > 0) then
        BEGIN
        PRECIO = 0;
        PRECIO2 = null;
        SELECT PRAR_FIJO FROM precios_articulo WHERE ARTI_COD = :CODIGO AND LIPR_COD = :LISTA INTO :PRECIO;
        if (PRECIO <> 0) then
            BEGIN
            SELECT FIRST 1 C.capr_fecha, C.capr_precio FROM cambia_precios C WHERE C.arti_cod = :CODIGO AND C.lipr_cod = :LISTA
                ORDER BY C.capr_fecha DESC INTO :fecpre,  :precio2;
            if (PRECIO = PRECIO2) then
                BEGIN
                SELECT FIRST 1 C.capr_precio FROM cambia_precios C WHERE C.arti_cod = :CODIGO AND C.lipr_cod = :LISTA AND C.capr_fecha < :fecpre
                    ORDER BY C.capr_fecha DESC INTO :precio2;
                if (PRECIO2 IS NULL) then
                    PRECIO2 = 0;
                END
            IF (PRECIO < PRECIO2) THEN
                BAJO = '*';
            ELSE
                BAJO = ' ';
            SELECT FIRST 1 B.coba_cod FROM barras_articulo B WHERE ARTI_COD = :CODIGO INTO :referencia;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :codmar INTO :marca;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE GRUP_COD = :codgrp AND SUBG_COD = :codsubg INTO :SUBGRUPO;
            SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :codgrp INTO :GRUPO;
            suspend;
            END
        END
    END
end^


ALTER PROCEDURE REP_PRECIOS_SISMED (
    ANO CHAR(4),
    MESINI INTEGER,
    MESFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    ITEM INTEGER,
    MES CHAR(2),
    CANAL CHAR(3),
    CUM VARCHAR(18),
    COMERC CHAR(2),
    PRMIN NUMERIC(18,2),
    PRMAX NUMERIC(18,2),
    VENTAS NUMERIC(18,2),
    CANTIDAD NUMERIC(18,2),
    FACMIN VARCHAR(12),
    FACMAX VARCHAR(12))
AS
declare variable CODIGO VARCHAR(20);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable NUMMES INTEGER;
begin
CANAL = 'COM';
comerc = 'SI';
ITEM = 0;
NUMMES = MESINI;
WHILE (NUMMES <= MESFIN) DO
    BEGIN
    if (NUMMES < 10) then
        MES = '0' || :NUMMES;
    ELSE
        MES = :NUMMES;
    FECINI = ANO || '/' || nummes || '/01';
    
    FECFIN = FECINI + 31;
    FECFIN = :FECFIN - EXTRACT(DAY FROM :FECFIN) + 1;

    FOR SELECT ARTI_COD, ARTI_CUM FROM ARTICULO A WHERE (ARTI_CUM <> '') AND (ESAR_COD <> 'I')
        INTO :CODIGO, :CUM
        DO
        BEGIN
        CANTIDAD = 0;
        FACMIN = '0';
        FACMAX = '0';
        VENTAS = 0;
        PRMIN = 0;
        PRMAX = 0;
        SELECT SUM(D.fade_cant* D.FADE_FACTOR), SUM(D.fade_total-D.fade_ivamonto), MIN(D.fade_prunit/D.fade_factor), MAX(D.fade_prunit/D.fade_factor)
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P WHERE F.fact_id = D.fact_id AND D.arti_cod = :CODIGO
            AND F.fact_fecha >= :FECINI AND F.fact_fecha <= :FECFIN AND F.fact_anulado = 'N' AND D.fade_prunit <> 0
            AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
            INTO :CANTIDAD, :VENTAS, :PRMIN, :PRMAX;
        if (cantidad is null) then
            cantidad = 0;
        if (ventas is null) then
            ventas = 0;
        if (prmin is null) then
            prmin = 0;
        if (prmax is null) then
            prmax = 0;
        if (cantidad <> 0) then
            begin
            select MIN(F.pref_pre || F.fact_numero) from FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.fact_id = D.fact_id AND D.arti_cod = :CODIGO AND round((D.fade_prunit/D.fade_factor),2) = :PRMIN
                AND F.fact_fecha >= :FECINI AND F.fact_fecha <= :FECFIN AND F.fact_anulado = 'N'
                AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
                INTO :FACMIN;
            select MAX(F.pref_pre || F.fact_numero) from FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.fact_id = D.fact_id AND D.arti_cod = :CODIGO AND ROUND((D.fade_prunit/D.fade_factor),2) = :prmax
                AND F.fact_fecha >= :FECINI AND F.fact_fecha <= :FECFIN AND F.fact_anulado = 'N'
                AND P.tido_cod = 31 AND P.pref_pre = F.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA))
                INTO :facmax;
            COMERC = 'SI';
            end
        else
            COMERC = 'NO';
            if (CANTIDAD = 0 or CANTIDAD IS NULL) then
                BEGIN
                   PRMIN = 0;
                   PRMAX = 0;
                   VENTAS = 0;
                   FACMIN = 0;
                   FACMAX = 0;
                END
        ITEM = ITEM + 1;
        suspend;
        END
    NUMMES = NUMMES + 1;
    END
end^


ALTER PROCEDURE REP_PRECIOS_TODOS (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    LINI INTEGER,
    LFIN INTEGER,
    FECHA DATE,
    MASIVA 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),
    PRECIO1 NUMERIC(18,2),
    PRECIO2 NUMERIC(18,2),
    PRECIO3 NUMERIC(18,2),
    PRECIO4 NUMERIC(18,2),
    PRECIO5 NUMERIC(18,2),
    PRECIO6 NUMERIC(18,2),
    PRECIO7 NUMERIC(18,2),
    PRECIO8 NUMERIC(18,2),
    PRECIO9 NUMERIC(18,2),
    MARGEN1 NUMERIC(9,2),
    MARGEN2 NUMERIC(9,2),
    MARGEN3 NUMERIC(9,2),
    MARGEN4 NUMERIC(9,2),
    MARGEN5 NUMERIC(9,2),
    MARGEN6 NUMERIC(9,2),
    MARGEN7 NUMERIC(9,2),
    MARGEN8 NUMERIC(9,2),
    MARGEN9 NUMERIC(9,2),
    IVA NUMERIC(9,2),
    COSTOP NUMERIC(18,2),
    UCOSTO NUMERIC(18,2),
    MENOR VARCHAR(60))
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 PRECIO NUMERIC(18,2);
declare variable MARGEN 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);
FOR SELECT a.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.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
    DO
    BEGIN
    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
    I = 0;
    PRECIO1 = 0;
    PRECIO2 = 0;
    PRECIO3 = 0;
    PRECIO4 = 0;
    PRECIO5 = 0;
    PRECIO6 = 0;
    PRECIO7 = 0;
    PRECIO8 = 0;
    PRECIO9 = 0;
    MARGEN1 = 0;
    MARGEN2 = 0;
    MARGEN3 = 0;
    MARGEN4 = 0;
    MARGEN5 = 0;
    MARGEN6 = 0;
    MARGEN7 = 0;
    MARGEN8 = 0;
    MARGEN9 = 0;
    FOR SELECT PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF
        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
        ORDER BY L.LIPR_COD
        INTO :PRECIO, :MARGEN, :UTIL, :LISIVA
        do
        BEGIN
        if (MOU = 'UTILIDAD') then
            MARGEN = UTIL;
        if (MASIVA = 'S') then
            BEGIN
            if (LISIVA = 'N') then
                PRECIO = PRECIO * (1 + (IVA / 100));
            END
        ELSE
            BEGIN
            if (LISIVA = 'S') then
                PRECIO = PRECIO / (1 + (IVA/100));
            END
        I = I + 1;
        if (I = 1) then
            BEGIN
            PRECIO1 = PRECIO;
            MARGEN1 = MARGEN;
            END
        if (I = 2) then
            BEGIN
            PRECIO2 = PRECIO;
            MARGEN2 = MARGEN;
            END
        if (I = 3) then
            BEGIN
            PRECIO3 = PRECIO;
            MARGEN3 = MARGEN;
            END
        if (I = 4) then
            BEGIN
            PRECIO4 = PRECIO;
            MARGEN4 = MARGEN;
            END
        if (I = 5) then
            BEGIN
            PRECIO5 = PRECIO;
            MARGEN5 = MARGEN;
            END
        if (I = 6) then
            BEGIN
            PRECIO6 = PRECIO;
            MARGEN6 = MARGEN;
            END
        if (I = 7) then
            BEGIN
            PRECIO7 = PRECIO;
            MARGEN7 = MARGEN;
            END
        if (I = 8) then
            BEGIN
            PRECIO8 = PRECIO;
            MARGEN8 = MARGEN;
            END
        if (I = 9) then
            BEGIN
            PRECIO9 = PRECIO;
            MARGEN9 = MARGEN;
            END
        end
    MENOR = '';
    EXECUTE PROCEDURE costo_promedio_y_ultimo(:codigo, :FECHA) returning_values (:UCOSTO, :COSTOP);
    if (MASIVA = 'S') then
        begin
        costop = costop * (1 + (IVA / 100));
        ucosto = ucosto * (1 + (IVA / 100));
        end
    if ((PRECIO1 <> 0) AND (PRECIO1 < COSTOP)) then
        MENOR = MENOR || '1,';
    if ((PRECIO2 <> 0) AND (PRECIO2 < COSTOP)) then
        MENOR = MENOR || '2,';
    if ((PRECIO3 <> 0) AND (PRECIO3 < COSTOP)) then
        MENOR = MENOR || '3,';
    if ((PRECIO4 <> 0) AND (PRECIO4 < COSTOP)) then
        MENOR = MENOR || '4,';
    if ((PRECIO5 <> 0) AND (PRECIO5 < COSTOP)) then
        MENOR = MENOR || '5,';
    if ((PRECIO6 <> 0) AND (PRECIO6 < COSTOP)) then
        MENOR = MENOR || '6,';
    if ((PRECIO7 <> 0) AND (PRECIO7 < COSTOP)) then
        MENOR = MENOR || '7,';
    if ((PRECIO8 <> 0) AND (PRECIO8 < COSTOP)) then
        MENOR = MENOR || '8,';
    if ((PRECIO9 <> 0) AND (PRECIO9 < COSTOP)) then
        MENOR = MENOR || '9,';
    SUSPEND;

    END

END^


ALTER PROCEDURE REP_PRESTAMOS_NOMINA (
    EMPINI VARCHAR(20),
    EMPFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    ORDEN CHAR(1))
RETURNS (
    EMPNIT VARCHAR(20),
    EMPNOM VARCHAR(60),
    FECPRE DATE,
    ANO CHAR(4),
    PERIODO INTEGER,
    CONCEPTO VARCHAR(60),
    MONTOPRE NUMERIC(18,2),
    INTPRE NUMERIC(9,2),
    CUOTAS INTEGER,
    MONTOCUO NUMERIC(18,2),
    PAGADO CHAR(1),
    SALDO NUMERIC(18,2))
AS
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable ANOINI CHAR(4);
declare variable ANOFIN CHAR(4);
declare variable PERINI INTEGER;
declare variable PERFIN INTEGER;
declare variable PPAGO INTEGER;
declare variable DIAINI INTEGER;
declare variable DIAFIN INTEGER;
declare variable id INTEGER;
declare variable ITEM INTEGER;
begin
if (ORDEN = 'C') then
    BEGIN
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = empini;
    NOMFIN = empfin;
    empini = '';
    empfin = 'zz';
    END
FOR SELECT T.TERC_NIT, TERC_NOM, EMPL_PPAGO FROM TERCEROS T, empleados E
    WHERE T.TERC_NIT = E.terc_nit AND T.terc_nit >= :empini AND T.terc_nit <= :empfin AND T.terc_nom >= :NOMINI AND T.terc_nom <= :NOMFIN
    INTO :empnit, :empnom, :PPAGO
    DO
    BEGIN
    ANOINI = extract (year FROM fecini);
    PERINI = extract (MONTH FROM fecini);
    DIAINI = EXTRACT(DAY FROM FECINI);
    ANOFIN = extract (year FROM fecfin);
    PERFIN = extract (MONTH FROM fecfin);
    DIAFIN = EXTRACT(DAY FROM FECFIN);
    IF (ppago = 2) THEN
        BEGIN
        PERINI =  (PERINI * 2);
        if (DIAINI <= 15) then
            PERINI = PERINI - 1;
        PERFIN =  (PERFIN * 2);
        if (DIAFIN <= 15) then
            PERFIN = PERFIN - 1;
        END
    ELSE
        IF (ppago = 3) THEN
            BEGIN
            PERINI =  (PERINI * 4);
            if (DIAINI <= 21) then
                PERINI = PERINI - 1;
            if (DIAINI <= 14) then
                PERINI = PERINI - 1;
            if (DIAINI <= 7) then
                PERINI = PERINI - 1;
            PERFIN =  (PERFIN * 4);
            if (DIAFIN <= 21) then
                PERFIN = PERFIN - 1;
            if (DIAFIN <= 14) then
                PERFIN = PERFIN - 1;
            if (DIAFIN <= 7) then
                PERFIN = PERFIN - 1;
            END
    FOR SELECT P.prno_fecha, P.prno_conc, P.prno_cuotas, P.prno_monto, P.prno_intces, C.prcu_ano, C.prcu_periodo, C.prcu_monto,
        C.prcu_ok, P.prno_id, C.prcu_item
        FROM prestamo_nomina P, prestamo_cuotas C
        WHERE P.terc_nit = :empnit AND P.prno_id = C.prno_id AND
        (((:anofin = :ANOINI) AND (C.prcu_periodo >= :PERINI) AND (C.prcu_periodo <= :PERFIN)) OR
        ((:anofin <> :ANOINI) AND (((C.prcu_ano = :ANOINI) AND (C.prcu_periodo >= :PERINI)) OR
        ((C.prcu_ano > :anoini) AND (C.prcu_ano < :anofin)) OR
        ((C.prcu_ano = :ANOFIN) AND (C.prcu_periodo <= :PERFIN)))))
        ORDER BY C.prcu_ano, C.prcu_periodo
        INTO :fecpre, :concepto, :cuotas, :montopre, :intpre, :ano, :periodo, :montocuo, :pagado, :ID, :ITEM
        DO
        BEGIN
        saldo = 0;
        SELECT SUM(PRCU_MONTO-PRCU_ABONO) FROM prestamo_cuotas PC
            WHERE PRNO_ID = :id AND PRCU_ITEM = :ITEM INTO :SALDO;
        if (saldo is null) then
            saldo = 0;
        suspend;
        END
    END
end^


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(8),
    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^


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),
    PRECIO NUMERIC(18,2),
    IVAP NUMERIC(9,2),
    COSTO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
declare variable FACTOR NUMERIC(18,4);
declare variable TIVA INTEGER;
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, ARPR_PRECIO, A.taiv_cod
        FROM ARTICULOS_PRODUCTO P, ARTICULO A
        WHERE P.ARTI_COD = :CODIGO AND P.ARPR_COMP = A.ARTI_COD
          INTO :CODCOMP, :DESCOMP, :CODBARCOMP, :CANT, :UNDCOMP, :PRECIO, :TIVA
          DO
            begin
            SELECT TAIV_PORC FROM tarifa_iva WHERE TAIV_COD = :TIVA INTO :IVAP;
            EXECUTE PROCEDURE COSTO_PROMEDIO (:CODCOMP, :FECHA) returning_values (:COSTO);
            EXECUTE PROCEDURE factor_unidad_cant (:CODCOMP, :UNDCOMP) returning_values (:FACTOR);
            CANT = CANT * FACTOR;
            TOTAL = COSTO * CANT;
            SUSPEND;
            END
        END
END^


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^


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(8),
    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),
    EMAIL VARCHAR(100))
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, TERC_EMAIL,
            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, :EMAIL,
            :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, TERC_EMAIL,
            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, :EMAIL,
            :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^


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(8),
    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^


ALTER PROCEDURE REP_REVALID_CLIENTES (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NOMCLI VARCHAR(60),
    NOMCLISUCU VARCHAR(60),
    CLIDV CHAR(1),
    NITCLIE VARCHAR(20),
    DIR VARCHAR(60),
    TEL1 VARCHAR(40),
    TEL2 VARCHAR(40),
    ZONANOM VARCHAR(60),
    CONTACTO VARCHAR(60),
    MUNICIPIO VARCHAR(60),
    DEPTO VARCHAR(60),
    CODVEND INTEGER,
    CODCLISUCU VARCHAR(10),
    SEMANA VARCHAR(20),
    DIAVISITA VARCHAR(60),
    SUBSEGMENTO VARCHAR(60),
    FRECUENCIA VARCHAR(60))
AS
declare variable DIRSUCU varchar(60);
declare variable CODSUB varchar(4);
declare variable NOMCIU varchar(60);
declare variable ZONACOD varchar(2);
declare variable POSC integer;
begin
for select distinct(c.clie_cod), cs.clcu_cod from clientes c, terceros t, cliente_sucursales cs, facturas f, devoluciones_ventas d
    where t.terc_nit = c.terc_nit and c.clie_revalid = 'S' and cs.terc_nit = c.terc_nit and cs.terc_nit = t.terc_nit
    and ((cs.clcu_cod = f.fact_sucursal) or (cs.clcu_cod = d.devt_sucursal)) and ((f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin)
    or (d.devt_fecha >= :fecini and d.devt_fecha <= :fecfin)) AND ((c.terc_nit = f.terc_nit) or (c.terc_nit = d.devt_id))
    order by c.clie_cod into :nitclie, :codclisucu
    do
    begin
    select t.terc_nom, cs.clsu_nombre, t.terc_ciu, t.terc_dir, cs.clsu_dir, cs.clsu_tel, t.terc_cel, c.zona_cod,
    t.terc_dv, c.vend_cod, c.clie_pedidos, c.clie_instrucciones, c.segm_cod, c.grca_cod
    from clientes c, cliente_sucursales cs, terceros t where t.terc_nit = :nitclie and c.terc_nit = t.terc_nit
    and cs.clcu_cod = :codclisucu and c.terc_nit = cs.terc_nit
    into :nomcli, :nomclisucu, :nomciu, :dir, :dirsucu, :tel1, :tel2, :zonacod, :clidv, :codvend, :frecuencia, :diavisita, :codsub, :semana;
    contacto = '';
    zonanom = '';
    execute procedure nombre_ascii(nomcli) returning_values(nomcli);
    execute procedure nombre_ascii(nomclisucu) returning_values(nomclisucu);
    if ((nomclisucu is null) or (nomclisucu = ''))  then
        nomclisucu = 'Principal';
    if ((:codsub is not null)) then
        select segm_nombre from segmentos where segm_cod = :codsub into :subsegmento;
    if (strlen(nomclisucu)>50) then
        nomclisucu = substr(nomclisucu,1,50);
    select first 1(tecc_nombre) from terceros_contactos where terc_nit = :nitclie into :contacto;
    select zona_nom from zonas where zona_cod = :zonacod into :zonanom;
    if ((:zonanom is null) or (:zonanom = ''))  then
        zonanom = 'N/A';
    zonanom = :zonacod || ' - ' || :zonanom;
    if (strlen(zonanom)>50) then
        zonanom = substr(zonanom,1,50);
    if ((dir = '') or (dir is null)) then
        dir = :dirsucu;
    if ((tel1 is null) or (tel1 = ''))  then
        tel1 = 'N/A';
    if ((tel2 is null) or (tel2 = '') ) then
        tel2 = 'N/A';
    execute procedure pos('-',:nomciu) returning_values(POSC);
    municipio = substr(nomciu,1,posc-2);
    execute procedure nombre_ascii(municipio) returning_values(municipio);
    depto = substr(nomciu, posc+2,50);
    execute procedure nombre_ascii(depto) returning_values(depto);
    suspend;
    end
end^


ALTER PROCEDURE REP_REVALID_PRODUCTOS (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    CODMARCA VARCHAR(3))
RETURNS (
    CODART VARCHAR(15),
    DESCART VARCHAR(60),
    UNIDAD VARCHAR(8),
    FACTOR NUMERIC(18,4),
    NOMGRUPO VARCHAR(30))
AS
declare variable CODGRUPO varchar(2);
begin
for select arti_cod, arti_unidad from articulo where ((grup_cod = '02') or (grup_cod = '21') or (grup_cod = '22'))
    order by arti_cod into :codart, :unidad
    do
    begin
    select arti_des, grup_cod from articulo where arti_cod = :codart into :descart, :codgrupo;
    select grup_nom from grupo where grup_cod = :codgrupo into :nomgrupo;
    select unar_faccan from unidad_articulo where arti_cod = :codart and unar_unidad = :unidad into :factor;
    if (factor is null) then
        factor = 1;
    suspend;
    end
end^


ALTER PROCEDURE REP_REVALID_VENTAS (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    TIPO CHAR(1),
    NUMDOC VARCHAR(12),
    FECDOC DATE,
    CODCLI VARCHAR(20),
    NOMCLI VARCHAR(60),
    VENDNOM VARCHAR(60),
    VENDCOD INTEGER,
    CLIFACTNOM VARCHAR(60),
    CODART VARCHAR(15),
    DESCART VARCHAR(60),
    CANT NUMERIC(18,4),
    TOTITEM NUMERIC(18,2),
    VOLUMEN NUMERIC(18,2))
AS
declare variable PREF varchar(4);
declare variable NUM varchar(8);
declare variable IDDOC integer;
declare variable PRUNIT numeric(18,2);
declare variable FACTOR numeric(18,4);
declare variable UNIDAD varchar(8);
begin
TIPO = 'F';
for select f.fact_id, f.terc_nit, f.vend_cod, f.fact_fecha, f.fact_numero, f.pref_pre, f.fact_nomcliente
    from facturas f, vendedores v, prefijos p where f.vend_cod = v.vend_cod and f.fact_fecha >= :fecini
    and f.fact_fecha <= :fecfin and f.fact_anulado = 'N' and f.pref_pre = p.pref_pre and ((p.sucu_id = :subempresa) or (:subempresa = 0))
    and p.tido_cod = 31 order by f.fact_numero into :iddoc, :codcli, :vendcod, :fecdoc, :num, :pref, :clifactnom
    do
    begin
    numdoc = :num;
    select terc_nom from terceros where terc_nit = :codcli into :nomcli;
    select vend_nombre from vendedores where vend_cod = :vendcod into :vendnom;
    for select fd.arti_cod, fd.fade_cant, fd.fade_prunit, fd.fade_desc, FD.fade_unidad from facturas_detalle fd where fd.fact_id = :iddoc
        into :codart, :cant, :prunit, :descart, :unidad
        do
        begin
        totitem = :prunit * :cant;
        select unar_faccan from unidad_articulo where arti_cod = :codart and unar_unidad = :unidad into :factor;
        if (:factor is not null) then
            volumen = :factor * :cant;
        else
            volumen = 0;
        suspend;
        end
    end
TIPO = 'D';
for select f.devt_id, f.terc_nit, f.vend_cod, f.devt_fecha, f.devt_numero, f.pref_pre, f.devt_nomterc
    from devoluciones_ventas f, vendedores v, prefijos p where f.vend_cod = v.vend_cod and f.devt_fecha >= :fecini
    and f.devt_fecha <= :fecfin and f.devt_anulado = 'N' and f.pref_pre = p.pref_pre and ((p.sucu_id = :subempresa) or (:subempresa = 0))
    and p.tido_cod = 33 order by f.devt_numero into :iddoc, :codcli, :vendcod, :fecdoc, :num, :pref, :clifactnom
    do
    begin
    numdoc = :num;
    select terc_nom from terceros where terc_nit = :codcli into :nomcli;
    select vend_nombre from vendedores where vend_cod = :vendcod into :vendnom;
    for select fd.arti_cod, fd.dvde_cant, fd.dvde_prunit, fd.dvde_desc, fd.dvde_unidad from devoluciones_ventas_detalle fd
    where fd.devt_id = :iddoc into :codart, :cant, :prunit, :descart, :unidad
        do
        begin
        totitem = :prunit * :cant;
        select unar_faccan from unidad_articulo where arti_cod = :codart and unar_unidad = :unidad into :factor;
        if (:factor is not null) then
            volumen = :factor * :cant;
        else
            volumen = 0;
        suspend;
        end
    end
end^


ALTER PROCEDURE REP_RUTAS_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODCLI VARCHAR(20),
    CODVEND VARCHAR(20),
    FRECUENCIA VARCHAR(40),
    MES VARCHAR(2))
AS
declare variable fecclie varchar(8);
begin
for select distinct c.clie_cod from clientes c, facturas f, prefijos p, terceros t where f.terc_nit = c.terc_nit
    and t.terc_nit = c.terc_nit and f.fact_anulado = 'N' and f.pref_pre = p.pref_pre and ((p.sucu_id = :subempresa)
    or (:subempresa = 0)) and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and p.tido_cod = 31 order by c.clie_cod into :codcli
    do
    begin
    select c.vend_cod from clientes c, terceros t where c.clie_cod = :codcli and c.terc_nit = t.terc_nit into :codvend;
    execute procedure fecha_a_conta(fecini) returning_values(fecclie);
    execute procedure mes_fecha(fecclie) returning_values(:mes);
    if (mes < 10) then
        begin
        MES = SUBSTR(mes, 2, 2);
        end
    frecuencia = '4';
    suspend;
    end
end^


ALTER PROCEDURE REP_RUTEROS (
    FECINI DATE,
    FECFIN DATE,
    VEHINI VARCHAR(8),
    VEHFIN VARCHAR(8),
    PROINI VARCHAR(20),
    PROFIN VARCHAR(20),
    DETALLE CHAR(1),
    RUTAINI INTEGER,
    RUTAFIN INTEGER,
    AGENCIA INTEGER)
RETURNS (
    ID INTEGER,
    FECHA DATE,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    RUTA INTEGER,
    NOMRUTA VARCHAR(60),
    VEHICULO VARCHAR(8),
    CONDUCTOR VARCHAR(20),
    NOMCOND VARCHAR(60),
    PROPIETARIO VARCHAR(20),
    NOMPROP VARCHAR(60),
    FACTURAS INTEGER,
    DOCUMENTO VARCHAR(8),
    FACTURA VARCHAR(12),
    FECDOC DATE,
    CLIENTE VARCHAR(20),
    NOMCLI VARCHAR(60),
    CODVEN INTEGER,
    URGENTE CHAR(1),
    KILOS NUMERIC(18,2),
    ITEMS INTEGER,
    VALOR NUMERIC(18,2),
    SUCURSAL VARCHAR(10),
    BASE NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
declare variable IDFAC INTEGER;
declare variable IDREM INTEGER;
begin
if (DETALLE = 'S') then
    BEGIN
    FOR SELECT R.rute_id, R.pref_pre, R.rute_numero, R.rute_fecha, R.rute_vehiculo, R.rute_conductor, R.rute_nomcond,
        D.rutd_factid, D.rutd_remid, t.tido_nomcorto, D.rutd_pref || D.rutd_numero, R.rute_ruta, D.rutd_nit, D.rutd_nomcli, D.rutd_vend, D.rutd_urgente
        FROM rutero R, rutero_detalle D, PREFIJOS P, tipo_documento t
        WHERE R.rute_id = D.rute_id AND R.rute_fecha >= :FECINI AND R.rute_fecha <= :fecfin AND R.rute_anulado = 'N' and d.rutd_tipodoc = t.tido_cod
        AND R.rute_vehiculo >= :VEHINI AND R.rute_vehiculo <= :VEHFIN AND P.tido_cod = 37 AND P.pref_pre = R.pref_pre
        AND ((P.sucu_id = :agencia) or (:AGENCIA = 0)) AND (R.rute_ruta >= :RUTAINI) AND (R.rute_ruta <= :RUTAFIN)
        INTO :id, :pref, :numero, :fecha, :vehiculo, :conductor, :nomcond, :idfac, :idrem, :documento, :factura, :ruta, :cliente, :nomcli, :CODVEN, :urgente
        DO
        BEGIN
        select ruta_nom from rutas_entrega where ruta_id = :ruta into :nomruta;
        SELECT V.terc_nit FROM vehiculos V where v.vehi_cod = :vehiculo into :propietario;
        if (IDFAC <> 0) then
            SELECT FACT_SUCURSAL, VEND_COD, FACT_FECHA, FACT_TOTAL-FACT_IVAMONTO, FACT_TOTAL-fact_rtftemonto-F.fact_rtivamonto-F.fact_rticamonto
            FROM FACTURAS F
            WHERE FACT_ID = :idfac INTO :sucursal, :codven, :FECDOC, :BASE, :NETO;
        if (IDREM <> 0) then
            SELECT REVT_FECHA FROM remisiones_venta WHERE REVT_ID = :idrem INTO :FECDOC;

        if ((:PROPIETARIO >= :PROINI) AND (:PROPIETARIO <= :PROFIN)) then
            BEGIN
            select terc_nom from terceros where terc_nit = :propietario into :nomprop;
            if (IDFAC <> 0) then
                select sum(fade_cant * fade_factor * arti_peso), count(d.fade_item), SUM(FADE_TOTAL)
                    from facturas_detalle d, articulo a
                    where d.arti_cod = a.arti_cod and d.fact_id = :idfac into :kilos, :items, :valor;
            if (IDREM <> 0) then
                select sum(rvde_cant * rvde_factor * arti_peso), count(d.rvde_item), SUM(RVDE_TOTAL)
                    from remisiones_venta_detalle d, articulo a
                    where d.arti_cod = a.arti_cod and d.revt_id = :idrem into :kilos, :items, :valor;
            if (kilos is null) then
                kilos = 0;
            suspend;
            END
        END
    END
ELSE
    BEGIN
    FOR SELECT MAX(R.rute_id), MAX(R.pref_pre), MAX(R.rute_numero), max(r.rute_fecha), max(r.rute_vehiculo), count(d.rutd_item),
        max(r.rute_ruta)
        FROM rutero R, rutero_detalle D, prefijos p
        where r.rute_id = d.rute_id AND R.rute_fecha >= :fecini AND R.rute_fecha <= :fecfin AND R.rute_anulado = 'N'
        and p.tido_cod = 37 and P.pref_pre = R.pref_pre AND ((P.sucu_id = :agencia) or (:AGENCIA = 0))
        AND (R.rute_ruta >= :RUTAINI) AND (R.rute_ruta <= :RUTAFIN)
        group by r.rute_id
        into :ID, :pref, :numero, :fecha, :vehiculo, :facturas, :ruta
        DO
        BEGIN
        SELECT V.terc_nit FROM vehiculos V where v.vehi_cod = :vehiculo into :propietario;
        select ruta_nom from rutas_entrega where ruta_id = :ruta into :nomruta;
        select terc_nom from terceros where terc_nit = :propietario into :nomprop;
        select sum(fade_cant * fade_factor * arti_peso/1000), count(fd.fade_item), SUM(FADE_TOTAL)
            from RUTERO R, rutero_detalle d, FACTURAS F, facturas_detalle fd, articulo a
            where R.rute_id = D.rute_id AND fd.arti_cod = a.arti_cod and F.fact_id = FD.fact_id AND f.fact_id = D.rutd_factid
            AND R.rute_id = :id
            into :kilos, :items, :valor;
        suspend;
        END
    END
end^


ALTER PROCEDURE REP_SIN_FACTURAS_MES (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    GRPINI VARCHAR(5),
    GRPFIN VARCHAR(5),
    ANO VARCHAR(4),
    MES INTEGER,
    ORDEN CHAR(1),
    AGRUPA CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CONTACTO VARCHAR(60),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CODCLI VARCHAR(20),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    CODCOBR INTEGER,
    NOMCOBR VARCHAR(60),
    DV CHAR(1),
    CODCIUD CHAR(5),
    NOMCIUD VARCHAR(60),
    SUCURSAL VARCHAR(10),
    NOMSUC VARCHAR(60))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT and T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        if (NOT EXISTS (SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_SUCURSAL = :sucursal AND FAME_ANO = :ANO AND FAME_MES = :MES)) then
            SUSPEND;
        END
    END
end^


ALTER PROCEDURE REP_SKU_BIT (
    FECINI DATE,
    FECFIN DATE,
    CODSUBG VARCHAR(3),
    SUBEMPRESA INTEGER)
RETURNS (
    CODART VARCHAR(15),
    NOMART VARCHAR(60),
    TIPOREF VARCHAR(2),
    UNIDAD VARCHAR(8),
    CODBARRAS VARCHAR(15),
    NOMFAMI VARCHAR(60),
    SALDO NUMERIC(18,4),
    FECHA VARCHAR(8))
AS
declare variable TIPO VARCHAR(10);
begin
TIPO = 'FACTVENT';
for select distinct fd.arti_cod from facturas_detalle fd, articulo a, facturas f, prefijos p
    where a.arti_cod = fd.arti_cod and a.subg_cod = :codsubg and f.fact_id = fd.fact_id and f.fact_anulado = 'N'
    and p.pref_pre = f.pref_pre and ((p.sucu_id = :subempresa) or (:subempresa = 0)) and p.tido_cod = 31
    and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and fd.fade_anulado = 'N'
    order by a.arti_cod into :codart
    do
    begin
    select arti_des, arti_unidad from articulo where arti_cod = :codart into :nomart, :unidad;
    select first 1(coba_cod) from barras_articulo where arti_cod = :codart into :codbarras;
    if (codbarras is null) then
        begin
        codbarras = '';
        end
    select subg_nom from subgrupo where subg_nom = :codsubg into :nomfami;
    tiporef = 'RG';
    execute procedure saldo_total_inventario(codart,fecfin) returning_values(saldo);
    execute procedure fecha_a_conta(fecfin) returning_values(fecha);
    suspend;
    end
TIPO = 'DEVOLCLI';
for select distinct fd.arti_cod from devoluciones_ventas_detalle fd, articulo a, devoluciones_ventas f, prefijos p, facturas fv
    where a.arti_cod = fd.arti_cod and a.subg_cod = :codsubg and f.devt_id = fd.devt_id and f.devt_anulado = 'N'
    and p.pref_pre = f.pref_pre and ((p.sucu_id = :subempresa) or (:subempresa = 0)) and p.tido_cod = 33
    and f.devt_fecha >= :fecini and f.devt_fecha <= :fecfin and ((fv.fact_id = f.devt_factid and fv.fact_fecha < :fecini)
    or(f.devt_factid is null)) and fd.dvde_anulado = 'N'
    order by fd.arti_cod into :codart
    do
    begin
    select arti_des, arti_unidad from articulo where arti_cod = :codart into :nomart, :unidad;
    select first 1(coba_cod) from barras_articulo where arti_cod = :codart into :codbarras;
    if (codbarras is null) then
        codbarras = '';
    select subg_nom from subgrupo where subg_cod = :codsubg into :nomfami;
    tiporef = 'RG';
    execute procedure saldo_total_inventario(codart,fecfin) returning_values(saldo);
    execute procedure fecha_a_conta(fecfin) returning_values(fecha);
    suspend;
    end
end^


ALTER PROCEDURE REP_SUGERIDO_PROVEEDOR (
    FECHA DATE,
    PRVINI VARCHAR(20),
    PRVFIN VARCHAR(20),
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    CODART VARCHAR(20),
    DESART VARCHAR(60),
    CODGRP VARCHAR(3),
    CODSUBG VARCHAR(3),
    CODMAR VARCHAR(3),
    PROMEDIO NUMERIC(18,4),
    MINIMO NUMERIC(18,2),
    EXIST NUMERIC(18,4),
    SUGERIDO NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2),
    PEDIDO NUMERIC(18,4),
    ORDINV NUMERIC(18,4),
    ORDCMP NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    NOMGRUPO VARCHAR(60),
    NOMSUBG VARCHAR(60),
    NOMMARC VARCHAR(30))
AS
declare variable salidas numeric(18,4);
declare variable pedite numeric(18,4);
declare variable cantaux numeric(18,4);
declare variable pedauto char(2);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable FACTOR2 numeric(18,4);
declare variable CANT numeric(18,4);
declare variable DIASA INTEGER;
declare variable MINDIAS VARCHAR(2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN 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 = '0';
    CODFIN = 'zz';
    END
execute procedure LEE_CONFIGURACION('INVENTARIO', 'EXISTENCIAS', 'MINIMO INVENTARIO EN DIAS') returning_values (MINDIAS);
execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
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, ARTI_DES, ARTI_MIN, ARTI_DIAS, ARTI_UNIDAD, A.grup_cod, A.subg_cod, A.MARC_COD, TERC_NIT, PVAR_COSTO
    FROM ARTICULO A, proveedor_articulo M WHERE A.arti_cod = M.arti_cod AND M.terc_nit >= :prvini AND M.terc_nit <= :prvfin
    AND ARTI_ENSAMBLE = 'N' AND ESAR_COD <> 'I' AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN
    AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND GRUP_COD >= :GRPINI AND GRUP_COD <= :GRPFIN
    ORDER BY M.terc_nit, M.arti_cod
    INTO :codart, :desart, :minimo, :diasa, :unidad, :codgrp, :codsubg, :codmar, :NIT, :COSTO
    DO
    BEGIN
    if (MINDIAS <> 'SI') then
        if (DIA_ART = 'SI') then
            minimo  = DIASA;
        ELSE
            MINIMO = CAST(DIASC AS INTEGER);
    execute procedure promedio_total_articulo (:codart, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
    if (MINIMO is null) then
        MINIMO = 0;
    PROMEDIO = MINIMO * PROMEDIO;
    /* SUME LOS PEDIDOS EXTRA */
    PEDIDO = 0;
    CANT = 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 = :CODART and PEDI_VENCE >= :FECHA and PEDI_FECHA <= :FECHA
            and PEDE_ANULADO = 'N'
        into :ID, :ITEM, :cantaux
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (PEDITE, UND, FACTOR2);
        if ((PEDITE * FACTOR2 = cantaux) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (PEDITE, UND, FACTOR2);
        if (PEDITE is null) then
            PEDITE = 0;
        PEDIDO = PEDIDO + PEDITE * FACTOR2;
        end
    if (PEDIDO IS NULL) then
        PEDIDO = 0;
    CANT = CANT + PEDIDO;
    /* SUME LAS ORDENES DE INVENTARIO */
    ORDINV = 0;
    select SUM(OD.orid_cant * OD.orid_factor)
        from ordenes_inventario O, ordeninventario_detalle OD
        where O.orin_id = OD.orin_id and OD.arti_cod = :CODART and orin_fecllega >= :FECHA and O.orin_fecha <= :FECHA
            and O.orin_anulado = 'N'
        into :ordinv;
    if (ORDINV is null) then
        ORDINV = 0;
    CANT = CANT + ORDINV;
    execute procedure saldo_total_inventario(:codart, :fecha) returning_values (:exist);
    CANT = CANT - exist;
    /* descuente las ordenes de compra pendientes por llegar */
    ORDCMP = 0;
    select sum(OD.ocde_cant * OD.ocde_factor)
        from ordenes_compra O, ordenes_compra_detalle OD
        where O.ordc_id = OD.ordc_id and OD.ARTI_COD = :CODART and (O.ordc_fecha + O.ordc_validez) >= :FECHA and O.ordc_fecha <= :FECHA
            and O.ordc_anulado = 'N'
        into :ordcmp;
    if (ORDCMP IS NULL) then
        ORDCMP = 0;
    CANT = CANT - ORDCMP;
    SUGERIDO = PROMEDIO + CANT;
    /* SI LA EXISTENCIA ES INFERIOR AL PORCENTAJE DEL OPTIMO REPORTELO */
    if (SUGERIDO > 0) then
        BEGIN
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nit INTO :nombre;
        execute procedure NOMBRES_GRUPOS_INVENTARIO(:CODGRP, :CODSUBG, :CODMAR)
            returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
        /* REDONDEE A UNIDADES */
        SUGERIDO = CEIL(SUGERIDO);
        TOTAL = SUGERIDO * COSTO;
        suspend;
        END
    END
end^


ALTER PROCEDURE REP_TERCEROS (
    TIPO INTEGER,
    ORDEN CHAR(1),
    DESDE VARCHAR(60),
    HASTA VARCHAR(60),
    VENDINI INTEGER,
    VENDFIN INTEGER,
    GRPINI CHAR(2),
    GRPFIN CHAR(2))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DIRECCION VARCHAR(60),
    CIUDAD VARCHAR(40),
    TEL VARCHAR(40),
    CONTACTO VARCHAR(40),
    EMAIL VARCHAR(100),
    FAX VARCHAR(25),
    CEL VARCHAR(25),
    CTARTFTE VARCHAR(20),
    CTARTIVA VARCHAR(20),
    CTARTICA VARCHAR(20),
    CTAVENTA VARCHAR(20),
    CTACLIENTE VARCHAR(20),
    CTAPROV VARCHAR(20),
    CTAEMPL VARCHAR(20),
    CODIGO VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMCOBR VARCHAR(60),
    RTFTEBASE NUMERIC(18,2),
    CUPO NUMERIC(18,2),
    RTFTEPOR NUMERIC(9,2),
    RTIVAPOR NUMERIC(9,2),
    RTICAPOR NUMERIC(9,2),
    NOMGRUPO VARCHAR(60))
AS
BEGIN
  /* TIPOS: 0-TODOS, 1-CLIENTES, 2-PROV, 3-EMPL */
  if (TIPO = 0) then
    if (ORDEN = 'C') then
      BEGIN
      FOR SELECT TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, TERC_CTAPROV, TERC_CTAEMPL
        FROM TERCEROS
        WHERE TERC_NIT >= :DESDE AND TERC_NIT <= :HASTA ORDER BY TERC_NIT
        INTO :NIT, :NOMBRE, :DIRECCION, :CIUDAD, :TEL, :CONTACTO, :EMAIL, :FAX, :CEL, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAVENTA, :CTACLIENTE, :CTAPROV, :CTAEMPL
        DO
          SUSPEND;
      END
END^


ALTER PROCEDURE REP_TIPONEGOCIO_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODTIPONEG INTEGER,
    NOMTIPONEG VARCHAR(60))
AS
begin
for select distinct c.grca_cod from facturas f, prefijos p, terceros t, clientes c where f.terc_nit = t.terc_nit and f.fact_fecha >= :fecini
    and f.fact_fecha <= :fecfin and f.fact_anulado = 'N' and f.pref_pre = p.pref_pre and ((p.sucu_id = :subempresa)
    or (:subempresa = 0)) and t.terc_nit =  c.terc_nit and p.tido_cod = 31
    into :codtiponeg
    do
    begin
    if (:codtiponeg is null) then
        begin
        codtiponeg = 0;
        nomtiponeg = 'NO REGISTRA';
        end
    else
    select grca_nombre from grupo_cartera where grca_cod = :codtiponeg into :nomtiponeg;
    suspend;
    end
end^


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

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

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

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

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

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

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

                COSTO = COSTO + costounit * cantdet;
                END
            NOMGRUPO = '';
            NOMSUBG = '';
            NOMMARC = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            IF (CANTIDAD IS NULL) THEN
                CANTIDAD = 0;
            IF (BASE IS NULL) THEN
                BASE = 0;
            IF (IVA IS NULL) THEN
                IVA = 0;
            if (ICOINC = 'SI') then
                BASE = TOTAL - IVA;
            UTILIDAD = BASE - COSTO;
            IF (UOM = 'UTILIDAD') THEN
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
            ELSE
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
            IF (CEROS = 'S') THEN
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        IF (CEROS = 'S') THEN
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                IF (numrows = 0) THEN
                    BEGIN
                    NOMGRUPO = '';
                    NOMSUBG = '';
                    NOMMARC = '';
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    IF (BIN_AND(TIPO, 1) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal, F.vend_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 F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND SUBSTRING(D.arti_cod FROM 1 FOR 2) <> '.t'
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.fade_desc >= :DESINI AND D.fade_desc <= :DESFIN
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal, :vendcod
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                VENDNOMBRE = '';
                if (:vendcod IS NOT NULL) then
                    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :vendcod INTO :vendnombre;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(31, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTOUNIT = COSTOUNIT + CONSART;
                    end
                COSTO = COSTOUNIT * CANTIDAD;
                if (ICOINC = 'SI') then
                    BASE = TOTAL - IVA;
                UTILIDAD = BASE - 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, R.vend_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 R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.rvde_desc >= :DESINI AND D.rvde_desc <= :DESFIN
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal, :vendcod
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                VENDNOMBRE = '';
                if (:vendcod IS NOT NULL) then
                SELECT VEND_NOMBRE from vendedores WHERE VEND_COD = :vendcod INTO :vendnombre;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(32, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTOUNIT = COSTOUNIT + CONSART;
                    end
                COSTO = COSTOUNIT * CANTIDAD;
                if (ICOINC = 'SI') then
                    BASE = TOTAL - IVA;
                UTILIDAD = BASE - 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, V.vend_cod
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))  AND SUBSTRING(D.arti_cod FROM 1 FOR 2) <> '.t'
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.dvde_desc >= :DESINI AND D.dvde_desc <= :DESFIN
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal, :vendcod
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                VENDNOMBRE = '';
                if (:vendcod IS NOT NULL) then
                    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :vendcod INTO :vendnombre;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(33, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTOUNIT = COSTOUNIT + CONSART;
                    end
                COSTO = COSTOUNIT * CANTIDAD;
                if (ICOINC = 'SI') then
                    BASE = TOTAL - IVA;
                UTILIDAD = BASE - 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, P.vend_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 P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.pede_desc >= :DESINI AND D.pede_desc <= :DESFIN
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal, :vendcod
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                VENDNOMBRE = '';
                if (:vendcod IS NOT NULL) then
                    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :vendcod INTO :vendnombre;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTOUNIT = COSTOUNIT + CONSART;
                    end
                /* 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;
                if (ICOINC = 'SI') then
                    BASE = TOTAL - IVA;
                UTILIDAD = BASE - 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, C.vend_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 C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.ctde_desc >= :DESINI AND D.ctde_desc <= :DESFIN
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal, :vendcod
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                VENDNOMBRE = '';
                if (:vendcod IS NOT NULL) then
                    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :vendcod INTO :vendnombre;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTOUNIT = COSTOUNIT + CONSART;
                    end
                /* 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;
                if (ICOINC = 'SI') then
                    BASE = TOTAL - IVA;
                UTILIDAD = BASE - 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^


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),
    ULTIMO 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(8),
    FECHA DATE,
    DTO NUMERIC(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable CODLISTA INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACCOST NUMERIC(18,4);
declare variable ULTCOS NUMERIC(18,2);
declare variable icoinc char(2);
declare variable CONSART NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
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
                    EXECUTE PROCEDURE COSTO_VENTAS_ITEM(31, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                    if (ultimo = 'S') then
                        COSTOUNIT = ultcos;
                    if (ICOINC = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                    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;
                if (ICOINC = 'SI') then
                    BASE = BASE + CONSUMO;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') 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
                    EXECUTE PROCEDURE COSTO_VENTAS_ITEM(32, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                    if (ultimo = 'S') then
                        COSTOUNIT = ultcos;
                    if (ICOINC = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                    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;
                if (ICOINC = 'SI') then
                    BASE = BASE + CONSUMO;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') 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
                 AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
                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
                    EXECUTE PROCEDURE COSTO_VENTAS_ITEM(33, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                    if (ultimo = 'S') then
                        COSTOUNIT = ultcos;
                    if (ICOINC = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                    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;
                if (ICOINC = 'SI') then
                    BASE = BASE + CONSUMO;
                UTILIDAD = BASE - 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_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                    if (ultimo = 'S') then
                        COSTOUNIT = ultcos;
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;
                    if (ICOINC = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end

                    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;
                if (ICOINC = 'SI') then
                    BASE = BASE + CONSUMO;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') 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_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                    if (ultimo = 'S') then
                        COSTOUNIT = ultcos;
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;
                    if (ICOINC = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end

                    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;
                if (ICOINC = 'SI') then
                    BASE = BASE + CONSUMO;
                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;
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(31, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                if (ultimo = 'S') then
                    COSTOUNIT = ultcos;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTOUNIT = COSTOUNIT + CONSART;
                    BASE = BASE + CONSUMO;
                    end
                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;
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(32, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                if (ultimo = 'S') then
                    COSTOUNIT = ultcos;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTOUNIT = COSTOUNIT + CONSART;
                    BASE = BASE + CONSUMO;
                    end
                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'
                 AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL))
                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;
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(33, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                if (ultimo = 'S') then
                    COSTOUNIT = ultcos;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTOUNIT = COSTOUNIT + CONSART;
                    BASE = BASE + CONSUMO;
                    end
                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_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ultimo = 'S') then
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTOUNIT = COSTOUNIT + CONSART;
                    BASE = BASE + CONSUMO;
                    end

                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_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (ultimo = 'S') then
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTOUNIT = COSTOUNIT + CONSART;
                    BASE = BASE + CONSUMO;
                    end

                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^


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 DOUBLE PRECISION,
    COSTO DOUBLE PRECISION,
    UTILIDAD DOUBLE PRECISION,
    PORC NUMERIC(9,2),
    IVA DOUBLE PRECISION,
    IVAPOR NUMERIC(9,2),
    CONSUMO DOUBLE PRECISION,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    TIPODOC INTEGER,
    PART FLOAT)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable FACCOST NUMERIC(18,4);
declare variable IDREP INTEGER;
declare variable ID integer;
declare variable ITEM integer;
declare variable icoinc char(2);
declare variable CONSART 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);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
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
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(31, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);

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

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

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

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

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

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

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTO = COSTO + (CONSART*CANTDET);
                    end
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 35, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            CANTIDAD = 0;
            SELECT CAST(BASE AS DOUBLE PRECISION), CAST(IVA AS DOUBLE PRECISION), CAST(CONSUMO AS DOUBLE PRECISION), CAST(COSTO AS DOUBLE PRECISION), 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, CAST(FADE_CANT * FADE_FACTOR AS DOUBLE PRECISION), CAST((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR AS DOUBLE PRECISION), CAST(FADE_IVAMONTO*FACT_FACTOR AS DOUBLE PRECISION), CAST(FADE_CONSUMO AS DOUBLE PRECISION),
            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);
            EXECUTE PROCEDURE COSTO_VENTAS_ITEM(31, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            if (ICOINC = 'SI') then
                begin
                EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                COSTO = COSTO + (CONSART * cantidad);
                BASE = BASE + CONSUMO;
                end
            UTILIDAD = BASE - 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, CAST(RVDE_CANT * RVDE_FACTOR AS DOUBLE PRECISION), CAST(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO AS DOUBLE PRECISION), CAST(RVDE_IVAMONTO AS DOUBLE PRECISION), CAST(RVDE_CONSUMO AS DOUBLE PRECISION),
            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);
            EXECUTE PROCEDURE COSTO_VENTAS_ITEM(32, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            if (ICOINC = 'SI') then
                begin
                EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                COSTO = COSTO + (CONSART * cantidad);
                BASE = BASE + CONSUMO;
                end
            UTILIDAD = BASE - 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, CAST(DVDE_CANT * DVDE_FACTOR AS DOUBLE PRECISION), CAST((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR AS DOUBLE PRECISION), CAST(DVDE_IVAMONTO*DEVT_FACTOR AS DOUBLE PRECISION), CAST(DVDE_CONSUMO AS DOUBLE PRECISION),
            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;
            EXECUTE PROCEDURE COSTO_VENTAS_ITEM(33, :id, :item, :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;
            if (ICOINC = 'SI') then
                begin
                EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                COSTO = COSTO + (CONSART * cantidad);
                BASE = BASE + CONSUMO;
                end
            UTILIDAD = BASE - 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, CAST(PEDE_CANT * PEDE_FACTOR AS DOUBLE PRECISION), CAST((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR AS DOUBLE PRECISION), CAST(PEDE_IVAMONTO*PEDI_FACTOR AS DOUBLE PRECISION), CAST(PEDE_CONSUMO AS DOUBLE PRECISION),
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A, TARIFA_IVA T
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            if (ICOINC = 'SI') then
                begin
                EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                COSTO = COSTO + (CONSART * cantidad);
                BASE = BASE + CONSUMO;
                end
            UTILIDAD = BASE - 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, CAST(CTDE_CANT * CTDE_FACTOR AS DOUBLE PRECISION), CAST((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR AS DOUBLE PRECISION), CAST(CTDE_IVAMONTO*COTI_FACTOR AS DOUBLE PRECISION), CAST(CTDE_CONSUMO AS DOUBLE PRECISION),
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            if (ICOINC = 'SI') then
                begin
                EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                COSTO = COSTO + (CONSART * cantidad);
                BASE = BASE + CONSUMO;
                end
            UTILIDAD = BASE - 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^


ALTER PROCEDURE REP_UTILIDAD_VENTAS_SUBG (
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    ULTIMO CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,4),
    COSTO NUMERIC(18,4),
    UTILIDAD NUMERIC(18,4),
    PORC NUMERIC(9,2),
    IVA NUMERIC(18,4),
    IVAPOR NUMERIC(9,2),
    CONSUMO NUMERIC(18,4),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    TIPODOC INTEGER,
    PART FLOAT)
AS
declare variable COSTOUNIT numeric(18,4);
declare variable CANTDET numeric(18,4);
declare variable TOTAL numeric(18,2);
declare variable CODINI varchar(15);
declare variable CODFIN varchar(15);
declare variable DESINI varchar(15);
declare variable DESFIN varchar(15);
declare variable MARINI varchar(3);
declare variable MARFIN varchar(3);
declare variable UOM varchar(20);
declare variable ULTCOS numeric(18,2);
declare variable FACCOST numeric(18,4);
declare variable IDREP integer;
declare variable ID integer;
declare variable ITEM integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
  if (DETALLE = 'S') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR select MAX(a.GRUP_COD), max(a.marc_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_CANT)
            from articulo A, facturas F, facturas_detalle D, prefijos P
            where f.fact_id = d.fact_id and a.arti_cod = d.arti_cod and p.tido_cod = 31 and p.pref_pre = f.pref_pre and
            f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and a.arti_cod >= :codini and a.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 = '00') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) and
            f.fact_anulado = 'N' and ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            group by GRUP_COD, marc_cod
            INTO :codgrupo, :codmarc, :BASE, :IVA, :CONSUMO, :CANTIDAD
            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 AND a.marc_cod = :codmarc 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;
                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, :codgrupo||'-'||:codmarc, :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+CONSUMO-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        for select g.grup_cod, g.grup_nom, m.marc_cod, m.marc_nom from grupo G, marcas m
            into :codgrupo, :nomgrupo, :codmarc, :nommarc
            DO
            BEGIN
            ARTICULO = :codgrupo||'-'||:codmarc;
            DESCRIPCION = :codmarc;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            CANTIDAD = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            BASE = BASE + CONSUMO;
            UTILIDAD = BASE - 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
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), MAX(A.marc_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_CANT)
            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, :codmarc, :BASE, :IVA, :CONSUMO, :CANTIDAD
            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;
                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;
            UTILIDAD = BASE - COSTO;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 31, :codgrupo||'-'||:codmarc, :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+CONSUMO-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        for select g.grup_cod, g.grup_nom, m.marc_cod, m.marc_nom from grupo G, marcas m
            into :codgrupo, :nomgrupo, :codmarc, :nommarc
            DO
            BEGIN
            ARTICULO = :codgrupo||'-'||:codmarc;
            DESCRIPCION = :codmarc;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            CANTIDAD = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            BASE = BASE + CONSUMO;
            UTILIDAD = BASE - 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
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), MAX(A.marc_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_CANT)
            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, :codmarc, :BASE, :IVA, :CONSUMO, :CANTIDAD
            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;
                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;
            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;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 31, :codgrupo||'-'||:codmarc, :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+CONSUMO-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        for select g.grup_cod, g.grup_nom, m.marc_cod, m.marc_nom from grupo G, marcas m
            into :codgrupo, :nomgrupo, :codmarc, :nommarc
            DO
            BEGIN
            ARTICULO = :codgrupo||'-'||:codmarc;
            DESCRIPCION = :codmarc;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            CANTIDAD = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            BASE = BASE + CONSUMO;
            UTILIDAD = BASE - 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
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), MAX(A.marc_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_CANT)
            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, :codmarc, :BASE, :IVA, :CONSUMO, :CANTIDAD
            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);
                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, :codgrupo||'-'||:codmarc, :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+CONSUMO-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        for select g.grup_cod, g.grup_nom, m.marc_cod, m.marc_nom from grupo G, marcas m
            into :codgrupo, :nomgrupo, :codmarc, :nommarc
            DO
            BEGIN
            ARTICULO = :codgrupo||'-'||:codmarc;
            DESCRIPCION = :codmarc;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            CANTIDAD = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            BASE = BASE + CONSUMO;
            UTILIDAD = BASE - 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
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), MAX(A.marc_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO), SUM(CTDE_CANT)
            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, :codmarc, :BASE, :IVA, :CONSUMO, :CANTIDAD
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (cantidad is null) 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, :codgrupo||'-'||:codmarc, :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+CONSUMO-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        for select g.grup_cod, g.grup_nom, m.marc_cod, m.marc_nom from grupo G, marcas m
            into :codgrupo, :nomgrupo, :codmarc, :nommarc
            DO
            BEGIN
            ARTICULO = :codgrupo||'-'||:codmarc;
            DESCRIPCION = :codmarc;
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            CANTIDAD = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            BASE = BASE + CONSUMO;
            UTILIDAD = BASE - 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
            BEGIN
            COSTO = 0;
            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, 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);
            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 + CONSUMO;
            UTILIDAD = BASE - 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);
            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 + CONSUMO;
            UTILIDAD = BASE - 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);
            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;
            BASE = BASE + CONSUMO;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A, TARIFA_IVA T
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

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

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE + CONSUMO;
            UTILIDAD = BASE - 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^


ALTER PROCEDURE REP_VACACIONES_NOMINA (
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECHA DATE)
RETURNS (
    TERC_NIT VARCHAR(20),
    TERC_NOM VARCHAR(60),
    EMPL_FECING DATE,
    PRVA_FECHA DATE,
    EMPL_DIASACUM INTEGER,
    EMPL_DIASDES INTEGER,
    EMPL_DIASDIS INTEGER,
    EMPL_ULTVAC DATE,
    SALARIO NUMERIC(18,2),
    VACACION NUMERIC(18,2),
    EMPL_DPTO INTEGER,
    DPTO_NOMBRE VARCHAR(60),
    EMPL_SECC INTEGER,
    SECC_NOM VARCHAR(60))
AS
declare variable DIAI INTEGER;
declare variable DIAH INTEGER;
declare variable MESI INTEGER;
declare variable MESH INTEGER;
declare variable ANOI INTEGER;
declare variable ANOH INTEGER;
declare variable FECPRO DATE;
declare variable DIASD INTEGER;
declare variable LICNR INTEGER;
declare variable APROX INTEGER;
begin
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
FOR SELECT T.terc_nit, T.terc_nom, e.empl_fecing, E.empl_dpto, E.empl_secc
    FROM TERCEROS T, empleados E
    WHERE T.terc_nit = E.terc_nit AND E.empl_fecret IS NULL AND T.TERC_NIT >= :terini AND T.TERC_NIT <= :terfin
    INTO :TERC_NIT, :terc_nom,  :EMPL_FECING, :EMPL_DPTO, :EMPL_SECC
    DO
    BEGIN
    SELECT MAX(P.prva_fecha) FROM program_vacaciones P WHERE P.terc_nit = :terc_nit INTO :prva_fecha;
    SELECT DPTO_NOMBRE FROM departamento WHERE DPTO_COD = :EMPL_DPTO INTO :DPTO_NOMBRE;
    SELECT SECC_NOM FROM SECCION WHERE DPTO_COD = :EMPL_DPTO AND SECC_COD = :EMPL_SECC INTO :SECC_NOM;
    EMPL_ULTVAC = NULL;
    select nosi_fecvac from nomina_saldini e where terc_nit = :terc_nit into :empl_ultvac;
    if (empl_ultvac IS NULL) then
        EMPL_ULTVAC = :empl_fecing;
    /* DIAS LABORADOS */
    DIAI = extract (DAY FROM EMPL_ULTVAC);
    DIAH = extract (DAY FROM FECHA);
    MESI = extract (MONTH FROM EMPL_ULTVAC);
    MESH = extract (MONTH FROM FECHA);
    ANOI = extract (YEAR FROM EMPL_ULTVAC);
    ANOH = extract (YEAR FROM FECHA);
    EMPL_DIASACUM = (anoh-anoi)*360;
    EMPL_DIASACUM = EMPL_DIASACUM + (MESH - MESI) * 30;
    SELECT SUM (ND.nnde_duracion) FROM nomina_novedades N, nomina_novedades_detalle ND
        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :terc_nit AND ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
        AND N.nono_fecha >= :EMPL_ULTVAC AND N.nono_fecha <= :fecha INTO :LICNR;
    if (LICNR IS NULL) then
        LICNR = 0;
    EMPL_DIASACUM = EMPL_DIASACUM - LICNR;
    
    if ((DIAH - DIAI) > 29) then
        EMPL_DIASACUM = EMPL_DIASACUM + 30;
    ELSE
        EMPL_DIASACUM = EMPL_DIASACUM + (DIAH - DIAI) + 1;
    EMPL_DIASACUM = EMPL_DIASACUM * 15 / 360;
    /* DIAS DISFRUTADOS */
    SELECT SUM(vd.vadi_dias) FROM vacaciones_disfrut v, vacaciones_disfrut_det vd
        WHERE v.vadi_id = vd.vadi_id and v.TERC_NIT = :terc_nit 
        INTO :diasd;
    if (DIASD IS NULL) then
        DIASD = 0;
    SELECT SUM(VACA_DIASSOL), MAX(vaca_fecha) FROM VACACIONES V WHERE TERC_NIT = :terc_nit AND VACA_FECHA >= :empl_fecing
        INTO :empl_diasdes, :empl_ultvac;
    if (empl_diasdes is null) then
        empl_diasdes = 0;
    empl_diasdes = empl_diasdes + DIASD;
    empl_diasdis = EMPL_DIASACUM - empl_diasdes;
    /* ajuste enero */
    if ((mesh = 2) and (diah = 29)) then
        FECPRO = (ANOH-1) || '/' || MESH || '/' || 28;
    else
        FECPRO = (ANOH-1) || '/' || MESH || '/' || DIAH;
    EXECUTE PROCEDURE salario_promedio_vacaciones (:terc_nit , :FECPRO, :fecha, 'S') returning_values (:salario);
    vacacion = :salario * empl_diasdis / 30;
    EXECUTE PROCEDURE REDONDEE(:vacacion, :aprox) RETURNING_VALUES (:vacacion);
    suspend;
    END
end^


ALTER PROCEDURE REP_VEHICULOS (
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    PLACA VARCHAR(8),
    NUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    CAPACIDAD INTEGER,
    LINEA VARCHAR(60),
    MARCA VARCHAR(60),
    COLOR VARCHAR(60),
    SERIE VARCHAR(20),
    MODELO VARCHAR(4),
    REPOT VARCHAR(4),
    CARROC VARCHAR(60),
    REGISTRONC VARCHAR(20),
    SOAT DATE,
    CONTRA DATE,
    EXTRA DATE,
    NITASOC VARCHAR(20),
    NOMASOC VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    ACTIVO CHAR(1))
AS
declare variable NUMINI VARCHAR(20);
declare variable NUMFIN VARCHAR(20);
declare variable PLAINI VARCHAR(20);
declare variable PLAFIN VARCHAR(20);
begin
if (ORDEN = 'P') then
    BEGIN
    PLAINI = DESDE;
    PLAFIN = HASTA;
    NUMINI = '';
    NUMFIN = 'zz';
    END
ELSE
    BEGIN
    NUMINI = DESDE;
    NUMFIN = HASTA;
    PLAINI = '';
    PLAFIN = 'zz';
    END
if ((NUMINI = '') AND (NUMFIN = 'zz')) then
  FOR select vehi_cod, vehi_numero, vehi_tipo, vehi_linea, vehi_marca, vehi_capacidad, vehi_color, vehi_serie,
        vehi_modelo, vehi_repotenciado, vehi_carroc, vehi_registronc, vehi_fecsoat, vehi_segcontr, vehi_segextra,
        terc_nit, vehi_conductor, vehi_activo
    from vehiculos where vehi_cod >= :plaini and vehi_cod <= :plafin
    into :placa, :numero, :codtipo, :linea, :marca, :capacidad, :color, :serie,
        :modelo, :repot, :carroc, :registronc, :soat, :contra, :extra,
        :nitasoc, :nitcond, :activo
    do
    begin
    if ((inactivos = 'S') or (activo <> 'N'))  then
        begin
        select tich_nom from tipo_vehiculo where tivh_cod = :codtipo into :nomtipo;
        select vhca_nom from vehiculo_carroceria where vhca_id = :carroc into :carroc;
        select vhli_nom from vehiculo_linea where vhli_cod = :linea into :linea;
        select vhma_nom from vehiculo_marca where vhma_cod = :marca into :marca;
        select terc_nom from terceros where terc_nit = :nitasoc into :nomasoc;
        select terc_nom from terceros where terc_nit = :nitcond into :nomcond;
        suspend;
        end
    end
ELSE
  FOR select vehi_cod, vehi_numero, vehi_tipo, vehi_linea, vehi_marca, vehi_capacidad, vehi_color, vehi_serie,
        vehi_modelo, vehi_repotenciado, vehi_carroc, vehi_registronc, vehi_fecsoat, vehi_segcontr, vehi_segextra,
        terc_nit, vehi_conductor, vehi_activo
    from vehiculos where vehi_cod >= :plaini and vehi_cod <= :plafin and vehi_numero >= :numini and vehi_numero <= :numfin
    into :placa, :numero, :codtipo, :linea, :marca, :capacidad, :color, :serie,
        :modelo, :repot, :carroc, :registronc, :soat, :contra, :extra, :nitasoc, :nitcond, :activo
    do
    begin
    if ((inactivos = 'S') or (activo <> 'N'))  then
        begin
        select tich_nom from tipo_vehiculo where tivh_cod = :codtipo into :nomtipo;
        select vhca_nom from vehiculo_carroceria where vhca_id = :carroc into :carroc;
        select vhli_nom from vehiculo_linea where vhli_cod = :linea into :linea;
        select vhma_nom from vehiculo_marca where vhma_cod = :marca into :marca;
        select terc_nom from terceros where terc_nit = :nitasoc into :nomasoc;
        select terc_nom from terceros where terc_nit = :nitcond into :nomcond;
        suspend;
        end
    end
end^


ALTER PROCEDURE REP_VEHICULOS_ASOCIADO (
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    ORDEN CHAR(1),
    INACTIVOS CHAR(1))
RETURNS (
    NITASOC VARCHAR(20),
    NOMASOC VARCHAR(60),
    DIR VARCHAR(60),
    CIU VARCHAR(40),
    TEL VARCHAR(40),
    PLACA VARCHAR(8),
    NUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    CAPACIDAD INTEGER,
    LINEA VARCHAR(60),
    MARCA VARCHAR(60),
    COLOR VARCHAR(60),
    SERIE VARCHAR(20),
    MODELO VARCHAR(4),
    REPOT VARCHAR(4),
    CARROC VARCHAR(60),
    REGISTRONC VARCHAR(20),
    SOAT DATE,
    CONTRA DATE,
    EXTRA DATE,
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    ACTIVO CHAR(1))
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 vehi_cod, vehi_numero, vehi_tipo, vehi_linea, vehi_marca, vehi_capacidad, vehi_color, vehi_serie,
        vehi_modelo, vehi_repotenciado, vehi_carroc, vehi_registronc, vehi_fecsoat, vehi_segcontr, vehi_segextra,
        v.terc_nit, vehi_conductor, vehi_activo, terc_nom, terc_dir, terc_ciu, terc_tel
    from vehiculos v, terceros t where v.terc_nit = t.terc_nit and t.TERC_NIT >= :NITINI and t.TERC_NIT <= :NITFIN and
        terc_nom >= :nomini and terc_nom <= :nomfin
    into :placa, :numero, :codtipo, :linea, :marca, :capacidad, :color, :serie,
        :modelo, :repot, :carroc, :registronc, :soat, :contra, :extra, :nitasoc, :nitcond, :activo,
        :nomasoc, :dir, :ciu, :tel
    do
    begin
    if ((inactivos = 'S') or (activo <> 'N'))  then
        begin
        select tich_nom from tipo_vehiculo where tivh_cod = :codtipo into :nomtipo;
        select vhca_nom from vehiculo_carroceria where vhca_id = :carroc into :carroc;
        select vhli_nom from vehiculo_linea where vhli_cod = :linea into :linea;
        select vhma_nom from vehiculo_marca where vhma_cod = :marca into :marca;
        select terc_nom from terceros where terc_nit = :nitcond into :nomcond;
        suspend;
        end
    end
end^


ALTER PROCEDURE REP_VEHICULOS_VENCE (
    DESDE VARCHAR(15),
    HASTA VARCHAR(15),
    ORDEN CHAR(1),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PLACA VARCHAR(8),
    NUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    CAPACIDAD INTEGER,
    LINEA VARCHAR(60),
    MARCA VARCHAR(60),
    COLOR VARCHAR(60),
    SERIE VARCHAR(20),
    MODELO VARCHAR(4),
    REPOT VARCHAR(4),
    CARROC VARCHAR(60),
    REGISTRONC VARCHAR(20),
    SOAT DATE,
    CONTRA DATE,
    EXTRA DATE,
    NITASOC VARCHAR(20),
    NOMASOC VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60),
    ACTIVO CHAR(1))
AS
declare variable NUMINI VARCHAR(20);
declare variable NUMFIN VARCHAR(20);
declare variable PLAINI VARCHAR(20);
declare variable PLAFIN VARCHAR(20);
begin
if (ORDEN = 'P') then
    BEGIN
    PLAINI = DESDE;
    PLAFIN = HASTA;
    NUMINI = '';
    NUMFIN = 'zz';
    END
ELSE
    BEGIN
    NUMINI = DESDE;
    NUMFIN = HASTA;
    PLAINI = '';
    PLAFIN = 'zz';
    END

FOR select vehi_cod, vehi_numero, vehi_tipo, vehi_linea, vehi_marca, vehi_capacidad, vehi_color, vehi_serie,
        vehi_modelo, vehi_repotenciado, vehi_carroc, vehi_registronc, vehi_fecsoat, vehi_segcontr, vehi_segextra,
        terc_nit, vehi_conductor, vehi_activo
    from vehiculos where vehi_cod >= :plaini and vehi_cod <= :plafin and vehi_numero >= :numini and vehi_numero <= :numfin and vehi_activo = 'S'
    into :placa, :numero, :codtipo, :linea, :marca, :capacidad, :color, :serie,
        :modelo, :repot, :carroc, :registronc, :soat, :contra, :extra, :nitasoc, :nitcond, :activo
    do
    begin
    if (((soat >= :fecini) and (soat <= :fecfin)) or ((contra >= :fecini) and (contra <= :fecfin)) or ((extra >= :fecini) and (extra <= :fecfin))) then
        begin
        select tich_nom from tipo_vehiculo where tivh_cod = :codtipo into :nomtipo;
        select vhca_nom from vehiculo_carroceria where vhca_id = :carroc into :carroc;
        select vhli_nom from vehiculo_linea where vhli_cod = :linea into :linea;
        select vhma_nom from vehiculo_marca where vhma_cod = :marca into :marca;
        select terc_nom from terceros where terc_nit = :nitasoc into :nomasoc;
        select terc_nom from terceros where terc_nit = :nitcond into :nomcond;
        suspend;
        end
    end
end^


ALTER PROCEDURE REP_VENCIMIENTOS (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    PLACA VARCHAR(8),
    NUMERO VARCHAR(15),
    CODTIPO INTEGER,
    NOMTIPO VARCHAR(60),
    CAPACIDAD INTEGER,
    LINEA VARCHAR(60),
    MARCA VARCHAR(60),
    COLOR VARCHAR(60),
    SERIE VARCHAR(20),
    MODELO VARCHAR(4),
    SOAT DATE,
    CONTRA DATE,
    EXTRA DATE,
    FECHA DATE,
    NITASOC VARCHAR(20),
    NOMASOC VARCHAR(60),
    NITCOND VARCHAR(20),
    NOMCOND VARCHAR(60))
AS
begin
FOR select vehi_cod, vehi_numero, vehi_tipo, vehi_linea, vehi_marca, vehi_capacidad, vehi_color, vehi_serie,
        vehi_modelo, vehi_fecsoat, vehi_segcontr, vehi_segextra, terc_nit, vehi_conductor
    from vehiculos where VEHI_ACTIVO = 'S' AND (VEHI_FECSOAT >= :FECINI AND VEHI_FECSOAT <= :FECFIN) or
        (VEHI_SEGCONTR >= :FECINI AND VEHI_SEGCONTR <= :FECFIN) or (VEHI_SEGEXTRA >= :FECINI AND VEHI_SEGEXTRA <= :FECFIN)
    into :placa, :numero, :codtipo, :linea, :marca, :capacidad, :color, :serie,
        :modelo, :soat, :contra, :extra, :nitasoc, :nitcond
    do
    begin
    FECHA = SOAT;
    if (FECHA > CONTRA) then
        FECHA = CONTRA;
    if (FECHA > EXTRA) then
        FECHA = EXTRA;
    select tich_nom from tipo_vehiculo where tivh_cod = :codtipo into :nomtipo;
    select vhli_nom from vehiculo_linea where vhli_cod = :linea into :linea;
    select vhma_nom from vehiculo_marca where vhma_cod = :marca into :marca;
    select terc_nom from terceros where terc_nit = :nitasoc into :nomasoc;
    select terc_nom from terceros where terc_nit = :nitcond into :nomcond;
    suspend;
    end
end^


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^


ALTER PROCEDURE REP_VENDEDORES_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND INTEGER,
    NOMVEND VARCHAR(60),
    NITVEND VARCHAR(20),
    UBICAVEND VARCHAR(60))
AS
declare variable TIPO VARCHAR(10);
begin
TIPO = 'FACTVENT';
for select distinct f.vend_cod from facturas f, vendedores v, prefijos p where f.vend_cod = v.vend_cod
    and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and f.fact_anulado = 'N' and f.pref_pre = p.pref_pre
    and ((p.sucu_id = :subempresa) or (:subempresa = 0)) and p.tido_cod = 31 into :codvend
    do
    begin
    if (:codvend is null) then
    codvend = 0;
    if (codvend <> 0) then
        begin
        select vend_nombre, vend_cc, vend_direccion from vendedores where vend_cod = :codvend into :nomvend, :nitvend, :ubicavend;
        end
    if (nomvend is null) then
        begin
        nomvend = '';
        end
    if (nitvend is null) then
        begin
        nitvend = '';
        end
    if (ubicavend is null) then
        begin
        ubicavend = '';
        end
    suspend;
    end
TIPO = 'DEVOLCLI';
for select distinct f.vend_cod from devoluciones_ventas f, vendedores v, prefijos p where f.vend_cod = v.vend_cod
    and f.devt_fecha >= :fecini and f.devt_fecha <= :fecfin and f.devt_anulado = 'N' and f.pref_pre = p.pref_pre
    and ((p.sucu_id = :subempresa) or (:subempresa = 0)) and p.tido_cod = 33 into :codvend
    do
    begin
    if (:codvend is null) then
    codvend = 0;
    if (codvend <> 0) then
        begin
        select vend_nombre, vend_cc, vend_direccion from vendedores where vend_cod = :codvend into :nomvend, :nitvend, :ubicavend;
        end
    if (nomvend is null) then
        begin
        nomvend = '';
        end
    if (nitvend is null) then
        begin
        nitvend = '';
        end
    if (ubicavend is null) then
        begin
        ubicavend = '';
        end
    suspend;
    end
end^


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^


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),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    INVIMA VARCHAR(20),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    TIVA INTEGER,
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    REFEREN VARCHAR(60),
    DTO NUMERIC(9,2),
    TRANSP VARCHAR(60),
    ALTERNATIVAS NUMERIC(18,4),
    NOMTIPO VARCHAR(50),
    DESPACHO VARCHAR(255),
    OBS VARCHAR(255),
    HORA INTEGER)
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_DESCORTA), MAX(ARTI_UNIDAD),
            MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), MAX(FACT_NOMCLIENTE), MAX(ARTI_INVIMA), MAX(D.fade_tiva)
            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'
            AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :DESCORTA, :UNIDAD,
            :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre, :invima, :tiva
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) 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, ARTI_DESCORTA, ARTI_INVIMA, TAIV_COD
                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, :descorta, :invima, :tiva
                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_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD),
            MAX(TERC_NIT), MAX(R.revt_nomterc), MAX(ARTI_INVIMA), MAX(D.rvde_tiva)
            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))
            AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :nombre, :invima, :tiva
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) 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, ARTI_DESCORTA, ARTI_INVIMA, TAIV_COD
                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, :DESCORTA, :invima, :tiva
                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_DESCORTA), MAX(ARTI_UNIDAD),
            MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), MAX(V.devt_nomterc), MAX(ARTI_INVIMA), MAX(D.dvde_tiva)
            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))
            AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre, :invima, :tiva
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) 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, ARTI_DESCORTA, ARTI_INVIMA, TAIV_COD
                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, :DESCORTA, :invima, :tiva
                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_DESCORTA), MAX(ARTI_UNIDAD),
            MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), MAX(P.pedi_nomterc), MAX(ARTI_INVIMA), MAX(D.pede_tiva)
            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))
            AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
            :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre, :invima, :tiva
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) 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, ARTI_DESCORTA, ARTI_INVIMA, TAIV_COD
                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, :DESCORTA, :INVIMA, :tiva
                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_DESCORTA), MAX(ARTI_UNIDAD),
            MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), MAX(C.coti_nomterc), MAX(ARTI_INVIMA), MAX(D.ctde_tiva)
            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, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre, :invima, :tiva
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) 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, ARTI_DESCORTA, ARTI_INVIMA, TAIV_COD
                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, :DESCORTA, :invima, :tiva
                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, FADE_REFERENCIA, SUBSTRING(FACT_OBS FROM 1 FOR 255), FACT_SUCURSAL, FACT_DESPACHO,
            ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FACT_TRANSP, F.TERC_NIT, FACT_NOMCLIENTE, ARTI_INVIMA, D.fade_tiva
            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'
                AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
            /*ORDER BY D.ARTI_COD, FACT_FECHA, FACT_ID, FADE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :referen, :OBS, :sucursal, :despacho,
                :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp, :nit, :nombre, :invima, :tiva
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS 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, RVDE_REFERENCIA, SUBSTRING(REVT_OBS FROM 1 FOR 255), REVT_SUCURSAL,
            ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, REVT_TRANSP, R.TERC_NIT, R.revt_nomterc, ARTI_INVIMA, D.rvde_tiva
            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))
                AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :referen, :OBS, :SUCURSAL,
                :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp, :nit, :nombre, :invima, :tiva
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS 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, DVDE_REFERENCIA, SUBSTRING(DEVT_OBS FROM 1 FOR 255), DEVT_SUCURSAL,
            ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.TERC_NIT, V.devt_nomterc, ARTI_INVIMA, D.dvde_tiva
            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))
                AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
            /*ORDER BY D.ARTI_COD, DEVT_FECHA, DEVT_ID, DVDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :referen, :obs, :sucursal,
                :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre, :invima, :tiva
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_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, PEDE_REFERENCIA, SUBSTRING(PEDI_OBS FROM 1 FOR 255), PEDI_SUCURSAL,
            ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.TERC_NIT, P.pedi_nomterc, ARTI_INVIMA, D.pede_tiva
            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))
                AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
            /*ORDER BY D.ARTI_COD, PEDI_FECHA, PEDI_ID, PEDE_ITEM*/
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :referen, :obs, :sucursal,
                :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre, :INVIMA, :tiva
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS 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, CTDE_REFERENCIA, SUBSTRING(COTI_OBS FROM 1 FOR 255), COTI_SUCURSAL,
            ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, C.terc_nit, C.coti_nomterc, ARTI_INVIMA, D.ctde_tiva
            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, :referen, :obs, :sucursal,
                :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre, :invima, :tiva
            DO
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE 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 = 'T') 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), 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_DESCORTA), MAX(ARTI_UNIDAD),
                MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FACT_TRANSP), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(ARTI_INVIMA), MAX(D.fade_tiva)
                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'
                AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
            GROUP BY FACT_TRANSP, D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp, :nit, :nombre, :invima, :tiva
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) 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_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD),
                MAX(REVT_TRANSP), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(ARTI_INVIMA), MAX(D.rvde_tiva)
                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))
                AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
                GROUP BY REVT_TRANSP, D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :transp, :nit, :nombre, :invima, :tiva
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) 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
        /* TOTALES POR FECHA Y HORA */
        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_DESCORTA), MAX(ARTI_UNIDAD),
                MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FACT_FECHA), MAX(F.terc_nit), MAX(F.fact_nomcliente),
                MAX(EXTRACT(HOUR FROM AUDI_HORA)), MAX(ARTI_INVIMA), MAX(D.fade_tiva)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A, AUDITORIA U
                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'
                AND U.tido_cod = 31 AND U.audi_iddoc = F.fact_id AND U.audi_oper = 'I'
                AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
                GROUP BY D.ARTI_COD, F.fact_fecha, EXTRACT(HOUR FROM AUDI_HORA)
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :fecha, :nit, :nombre, :hora, :invima, :tiva
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) 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_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD),
                MAX(REVT_FECHA), MAX(R.terc_nit), MAX(R.revt_nomterc), MAX(EXTRACT(HOUR FROM AUDI_HORA)), MAX(ARTI_INVIMA), MAX(D.rvde_tiva)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A, AUDITORIA U
                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))
                AND U.tido_cod = 32 AND U.audi_iddoc = R.revt_id AND U.audi_oper = 'I'
                AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
                GROUP BY D.ARTI_COD, R.revt_fecha, EXTRACT(HOUR FROM AUDI_HORA)
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :fecha, :nit, :nombre, :HORA, :invima, :tiva
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) 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
            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(DVDE_CONSUMO), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD),
                MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(DEVT_FECHA), MAX(V.terc_nit), MAX(V.devt_nomterc),
                MAX(EXTRACT(HOUR FROM AUDI_HORA)), MAX(ARTI_INVIMA), MAX(D.dvde_tiva)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A, AUDITORIA U
                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))
                AND U.tido_cod = 33 AND U.audi_iddoc = V.devt_id AND U.audi_oper = 'I'
                AND D.bode_cod >= :bodini AND D.bode_cod <= :bodfin
                GROUP BY D.ARTI_COD, V.devt_fecha, EXTRACT(HOUR FROM AUDI_HORA)
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :fecha, :nit, :nombre, :hora, :invima, :tiva
                DO
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) 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^


ALTER PROCEDURE REP_VENTAS_ARTICULO_ANO (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    FECHA DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    GRUPO VARCHAR(2),
    SUBGRUPO VARCHAR(3),
    MARCA VARCHAR(3),
    NOMGRP VARCHAR(60),
    NOMSUBG VARCHAR(60),
    NOMMARCA 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 ARTN VARCHAR(20);
declare variable TOTAL NUMERIC(18,2);
declare variable MES INTEGER;
BEGIN
CODIGO = '';
FOR SELECT ARTICULO, MES, TOTAL
    FROM VENTAS_ARTICULO_ANO1 (:artini, :artfin, :grpini, :grpfin, :orden, :agrupa, :fecha, :subempresa)
    ORDER BY ARTICULO, MES
    INTO :ARTN, :MES, :TOTAL
    DO
    BEGIN
    if (CODIGO = '') then
        BEGIN
        CODIGO = ARTN;
        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 (CODIGO <> ARTN) then
        BEGIN
        SELECT ARTI_DES, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO
            WHERE ARTI_COD = :CODIGO INTO descripcion, :grupo, :subgrupo, :marca;
        SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :nomgrp;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE GRUP_COD = :grupo AND SUBG_COD = :subgrupo INTO :nomsubg;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :marca INTO :nommarca;
        SUSPEND;
        CODIGO = ARTN;
        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
CODIGO = ARTN;
SELECT ARTI_DES, GRUP_COD, SUBG_COD, MARC_COD FROM ARTICULO
    WHERE ARTI_COD = :CODIGO INTO descripcion, :grupo, :subgrupo, :marca;
SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :grupo INTO :nomgrp;
SELECT SUBG_NOM FROM SUBGRUPO WHERE GRUP_COD = :grupo AND SUBG_COD = :subgrupo INTO :nomsubg;
SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :marca INTO :nommarca;
SUSPEND;
END^


ALTER PROCEDURE REP_VENTAS_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    SUBG VARCHAR(3))
RETURNS (
    NITCLI VARCHAR(20),
    CODVEND INTEGER,
    FECDOC VARCHAR(8),
    NUMDOC VARCHAR(8),
    TOTALDOC NUMERIC(18,2),
    TOTALCASA NUMERIC(18,2),
    TOTALCONTROL NUMERIC(18,2))
AS
declare variable TOTAL NUMERIC(18,2);
declare variable IDDOC INTEGER;
declare variable IVADOC NUMERIC(18,2);
declare variable FEC Date;
declare variable TIPO VARCHAR(10);
begin
totalcontrol = 0;
TIPO = 'FACTVENT';
for select f.fact_id, f.terc_nit, f.vend_cod, f.fact_fecha, f.fact_numero, f.fact_total, f.fact_ivamonto
    from facturas f, vendedores v, prefijos p where f.vend_cod = v.vend_cod and f.fact_fecha >= :fecini
    and f.fact_fecha <= :fecfin and f.fact_anulado = 'N' and f.pref_pre = p.pref_pre and ((p.sucu_id = :subempresa) or (:subempresa = 0))
    and p.tido_cod = 31 order by f.fact_numero into :iddoc, :nitcli, :codvend, :fec, :numdoc, :total, :ivadoc
    do
    begin
    select sum(fade_total-fade_ivamonto) from facturas_detalle d, articulo a where d.fact_id = :iddoc
    and a.subg_cod = :subg and a.arti_cod = d.arti_cod into :totalcasa;
    if (totalcasa is null) then
        begin
        totalcasa = 0;
        end
    execute procedure fecha_a_conta(fec) returning_values(fecdoc);
    totaldoc = total - ivadoc;
    totalcontrol = :totalcontrol + :totalcasa;
    suspend;
    end
TIPO = 'DEVOLCLI';
for select f.devt_id, f.terc_nit, f.vend_cod, f.devt_fecha, f.devt_numero, f.devt_total, f.devt_ivamonto
    from devoluciones_ventas f, vendedores v, prefijos p where f.vend_cod = v.vend_cod and f.devt_fecha >= :fecini
    and f.devt_fecha <= :fecfin and f.devt_anulado = 'N' and f.pref_pre = p.pref_pre and ((p.sucu_id = :subempresa) or (:subempresa = 0))
    and p.tido_cod = 33 order by f.devt_numero into :iddoc, :nitcli, :codvend, :fec, :numdoc, :total, :ivadoc
    do
    begin
    select sum(-dvde_total+dvde_ivamonto) from devoluciones_ventas_detalle d, articulo a where d.devt_id = :iddoc
    and a.subg_cod = :subg and a.arti_cod = d.arti_cod into :totalcasa;
    if (totalcasa is null) then
        begin
        totalcasa = 0;
        end
    execute procedure fecha_a_conta(fec) returning_values(fecdoc);
    totaldoc = total - ivadoc;
    totalcontrol = :totalcontrol + :totalcasa;
    suspend;
    end
end^


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


ALTER PROCEDURE REP_VENTAS_CLIENTE (
    TIPO INTEGER,
    NITDESDE VARCHAR(20),
    NITHASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    DV CHAR(1),
    CONTACTO VARCHAR(255),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    NOMTIPO VARCHAR(50),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    SUCURSAL VARCHAR(10),
    DESPACHO VARCHAR(255),
    OBS VARCHAR(255),
    ID INTEGER,
    ABONOS NUMERIC(18,2),
    SALDO NUMERIC(18,2),
    FECDOC DATE,
    CANTIDAD INTEGER,
    SUBTOTAL NUMERIC(18,2),
    DTO NUMERIC(18,2),
    ADICIONAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    EXTRA NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    NETO NUMERIC(18,2),
    ULTVENTA DATE,
    APELLIDO1 VARCHAR(60),
    APELLIDO2 VARCHAR(60),
    NOMBRE1 VARCHAR(60),
    NOMBRE2 VARCHAR(60),
    CODCIU VARCHAR(5),
    TRANSPORTA VARCHAR(60))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_CONTACTO),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), max(FACT_FECHA),
            COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CONTACTO,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_CONTACTO),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(REVT_FECHA),
            COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CONTACTO,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_CONTACTO),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(DEVT_FECHA),
            COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            GROUP BY V.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CONTACTO,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
             :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD <> 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_CONTACTO),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(PEDI_FECHA),
            COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CONTACTO,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_CONTACTO),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(COTI_FECHA),
            COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CONTACTO,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL,
            FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, SUBSTRING(FACT_OBS FROM 1 FOR 255), FACT_DESPACHO, TERC_CONTACTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, F.fact_sucursal, F.fact_transp
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :obs, :despacho, :contacto,
            :nit, :nombre, :codzona, :telefono, :ciudad, :dv, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal, :transporta
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(31, :id, :fecfin, 0) returning_values (:saldo);
            abonos = TOTAL - SALDO;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0, SUBSTRING(REVT_OBS FROM 1 FOR 255),
        T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, R.revt_sucursal, R.revt_transp, TERC_CONTACTO
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :obs,
                :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal, :transporta, :contacto
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        transporta = '';
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT DEVT_ID, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL,
            DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, SUBSTRING(DEVT_OBS FROM 1 FOR 255), TERC_CONTACTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, V.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :obs, :contacto,
            :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(33, :id, :fecfin, 0) returning_values (:saldo);
            abonos = TOTAL - SALDO;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        transporta = '';
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
            0, 0, 0, SUBSTRING(PEDI_OBS FROM 1 FOR 255), TERC_CONTACTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, P.pedi_sucursal
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :obs, :contacto,
            :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        transporta = '';
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT COTI_ID, CT.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
            0, 0, 0, SUBSTRING(COTI_OBS FROM 1 FOR 255), TERC_CONTACTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, CT.coti_sucursal
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :obs, :contacto,
            :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END^


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


ALTER PROCEDURE REP_VENTAS_EVENTO (
    EVENTO INTEGER,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    CEROS CHAR(1))
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    DESCORTA VARCHAR(30),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    UNIDAD VARCHAR(8),
    CANTIDAD NUMERIC(18,4),
    BASE NUMERIC(18,2),
    TIVA INTEGER,
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    REFEREN 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);
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
    /* 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_DESCORTA), MAX(ARTI_UNIDAD),
        MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), MAX(P.pedi_nomterc), MAX(D.pede_tiva)
        FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A WHERE P.pedi_evento = :evento 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'
        GROUP BY D.ARTI_COD
        INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
        :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre, :tiva
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (CANTIDAD IS NULL) 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, ARTI_DESCORTA, TAIV_COD
            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, :DESCORTA, :tiva
            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
ELSE
    BEGIN
    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, PEDE_REFERENCIA, PEDI_SUCURSAL,
        ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, P.TERC_NIT, P.pedi_nomterc, D.pede_tiva
        FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A WHERE P.pedi_evento = :evento 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'
        /*ORDER BY D.ARTI_COD, PEDI_FECHA, PEDI_ID, PEDE_ITEM*/
        INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO, :DTO, :referen, :sucursal,
            :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :nit, :nombre, :tiva
        DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        SUSPEND;
        END
    END
END^


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(8),
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    SUCURSAL VARCHAR(10),
    CIUDAD VARCHAR(40),
    DESPACHO VARCHAR(255),
    OBS VARCHAR(255),
    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;
            NETO = NETO * -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, FACT_SUCURSAL, SUBSTRING(FACT_OBS FROM 1 FOR 255), FACT_DESPACHO
            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, :SUCURSAL, :OBS, :despacho
            DO
            BEGIN
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                INTO :CONSUMO;
            CIUDAD = NULL;
            SELECT TERC_CIU FROM TERCEROS WHERE TERC_NIT = :NIT INTO :ciudad;
            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, REVT_SUCURSAL, SUBSTRING(REVT_OBS FROM 1 FOR 255)
            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, :SUCURSAL, :OBS
            DO
            BEGIN
            SELECT SUM(RVDE_CONSUMO) FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID
                INTO :CONSUMO;
            CIUDAD = NULL;
            SELECT TERC_CIU FROM TERCEROS WHERE TERC_NIT = :NIT INTO :ciudad;
            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, DEVT_SUCURSAL, SUBSTRING(DEVT_OBS FROM 1 FOR 255)
            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, :SUCURSAL, :OBS
            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;
            CIUDAD = NULL;
            SELECT TERC_CIU FROM TERCEROS WHERE TERC_NIT = :NIT INTO :ciudad;
            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, PEDI_SUCURSAL, SUBSTRING(PEDI_OBS FROM 1 FOR 255)
            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, :sucursal, :obs
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID
                INTO :CONSUMO;
            CIUDAD = NULL;
            SELECT TERC_CIU FROM TERCEROS WHERE TERC_NIT = :NIT INTO :ciudad;
            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, COTI_SUCURSAL, SUBSTRING(COTI_OBS FROM 1 FOR 255)
            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, :sucursal, :OBS
            DO
            BEGIN
            SELECT SUM(CTDE_CONSUMO) FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID
                INTO :CONSUMO;
            CIUDAD = NULL;
            SELECT TERC_CIU FROM TERCEROS WHERE TERC_NIT = :NIT INTO :ciudad;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END^


ALTER PROCEDURE REP_VENTAS_VENDEDOR_GRUPO (
    FECINI DATE,
    FECFIN DATE,
    TIPODOC INTEGER)
RETURNS (
    CODVEN INTEGER,
    NOMVEN VARCHAR(60),
    VENTAS NUMERIC(18,2),
    DEVOL NUMERIC(18,2),
    NETO NUMERIC(18,2),
    LISTA VARCHAR(60),
    GRUPO VARCHAR(60),
    GRUPO2 VARCHAR(60),
    GRUPO3 VARCHAR(60),
    GRUPO4 VARCHAR(60))
AS
declare variable NOTAS NUMERIC(18,2);
declare variable CODLIS INTEGER;
begin
if (TIPODOC = 31) then
  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, VEND_LISTA FROM VENDEDORES WHERE VEND_COD = :codven INTO :nomven, :CODLIS;
    LISTA = '';
    SELECT LIVE_NOMBRE FROM listas_vendedor WHERE LIVE_ID = :codlis INTO :lista;
    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;
    NOTAS = 0;
    SELECT SUM(NCCL_MONTO) FROM notas_credito_clientes WHERE NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND NCCL_ANULADO = 'N'
        AND VEND_COD = :CODVEN INTO :NOTAS;
    if (NOTAS IS NULL) then
        NOTAS = 0;
    NETO = NETO - NOTAS;
    suspend;
    END
  VENTAS = 0;
  FOR SELECT MAX(VEND_COD), SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas D
    WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND
    NOT EXISTS (SELECT FACT_ID FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND VEND_COD = D.vend_cod)
    GROUP BY VEND_COD INTO :CODVEN, :DEVOL
    DO
    BEGIN
    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;
    SELECT SUM(NCCL_MONTO) FROM notas_credito_clientes WHERE NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND NCCL_ANULADO = 'N'
        AND VEND_COD = :CODVEN INTO :NOTAS;
    if (NOTAS IS NULL) then
        NOTAS = 0;
    NETO = NETO - NOTAS;
    suspend;
    END
  NOTAS = 0;
  FOR SELECT MAX(VEND_COD), SUM(NCCL_MONTO) FROM notas_credito_clientes N WHERE NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND NCCL_ANULADO = 'N'
    AND VEND_COD = :CODVEN AND NOT EXISTS (SELECT FACT_ID FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND VEND_COD = N.vend_cod)
    AND NOT EXISTS (SELECT DEVT_ID FROM devoluciones_ventas WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND VEND_COD = N.vend_cod)
    GROUP BY VEND_COD INTO :CODVEN, :NOTAS
    DO
    BEGIN
    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;
    NETO = VENTAS - NOTAS;
    SUSPEND;
    END
  END
ELSE
  BEGIN
  FOR SELECT MAX(VEND_COD), SUM(PEDI_TOTAL-PEDI_IVAMONTO) FROM PEDIDOS
    WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_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;
    NOTAS = 0;
    SELECT SUM(NCCL_MONTO) FROM notas_credito_clientes WHERE NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND NCCL_ANULADO = 'N'
        AND VEND_COD = :CODVEN INTO :NOTAS;
    if (NOTAS IS NULL) then
        NOTAS = 0;
    NETO = NETO - NOTAS;
    suspend;
    END
  VENTAS = 0;
  FOR SELECT MAX(VEND_COD), SUM(DEVT_TOTAL-DEVT_IVAMONTO) FROM devoluciones_ventas D
    WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND
    NOT EXISTS (SELECT PEDI_ID FROM PEDIDOS WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND VEND_COD = D.vend_cod)
    GROUP BY VEND_COD INTO :CODVEN, :DEVOL
    DO
    BEGIN
    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;
    NOTAS = 0;
    SELECT SUM(NCCL_MONTO) FROM notas_credito_clientes WHERE NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND NCCL_ANULADO = 'N'
        AND VEND_COD = :CODVEN INTO :NOTAS;
    if (NOTAS IS NULL) then
        NOTAS = 0;
    NETO = NETO - NOTAS;
    suspend;
    END
  NETO = 0;
  FOR SELECT MAX(VEND_COD), SUM(NCCL_MONTO) FROM notas_credito_clientes N WHERE NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND NCCL_ANULADO = 'N'
    AND VEND_COD = :CODVEN AND NOT EXISTS (SELECT PEDI_ID FROM PEDIDOS WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND VEND_COD = N.vend_cod)
    AND NOT EXISTS (SELECT DEVT_ID FROM devoluciones_ventas WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND VEND_COD = N.vend_cod)
    GROUP BY VEND_COD INTO :CODVEN, :NOTAS
    DO
    BEGIN
    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;
    NETO = VENTAS - NOTAS;
    SUSPEND;
    END
  END
end^


ALTER PROCEDURE REP_VENTAS_VENDEDOR_RIMAR (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    CODIGO INTEGER,
    NOMBRE VARCHAR(60),
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    RECAUDO NUMERIC(18,2))
AS
declare variable CADSQL VARCHAR(1024);
declare variable SERVER VARCHAR(100);
declare variable COMPANIA VARCHAR(3);
declare variable USUARIO VARCHAR(10);
declare variable CLAVE VARCHAR(10);
declare variable FACTURAS2 INTEGER;
declare variable DEVOLUCIONES2 INTEGER;
declare variable MFACTURAS2 NUMERIC(18,2);
declare variable MDEVOLUCIONES2 NUMERIC(18,2);
declare variable RECAUDO2 NUMERIC(18,2);
begin
SELECT FIRST 1 RPCO_SERVIDOR, RPCO_COD FROM replica_compania INTO :SERVER, :COMPANIA;
SERVER = SERVER || '\DATOS\' || :COMPANIA || '\SYSPLUS.FDB';
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'NOMBRE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (USUARIO);
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'CLAVE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (CLAVE);
for select VEND_COD, VEND_NOMBRE from VENDEDORES V into :CODIGO, :NOMBRE
    DO
    BEGIN
    SELECT FACTURAS, MFACTURAS, DEVOLUCIONES, MDEVOLUCIONES FROM VENTAS_VENDEDOR(:CODIGO, :FECINI, :FECFIN, 0)
        INTO :FACTURAS, :MFACTURAS, :DEVOLUCIONES, :MDEVOLUCIONES;
    if (SERVER IS NOT NULL) then
        BEGIN
        CADSQL = 'SELECT FACTURAS, MFACTURAS+IVAFACT, DEVOLUCIONES, MDEVOLUCIONES+IVADEV FROM VENTAS_VENDEDOR(' || :codigo || ', ''' || :fecini || ''', ''' || :fecfin || ''',0)';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :facturas2, :mfacturas2, :devoluciones2, :mdevoluciones2;
        FACTURAS = FACTURAS + FACTURAS2;
        MFACTURAS = MFACTURAS + MFACTURAS2;
        DEVOLUCIONES = DEVOLUCIONES + DEVOLUCIONES2;
        MDEVOLUCIONES = MDEVOLUCIONES + MDEVOLUCIONES2;
        END
    /* RECAUDO */
    SELECT SUM(RCDE_ABONO) FROM RECIBOS_CAJA R, recibos_caja_detalle RD, FACTURAS F
        WHERE R.reca_id = RD.reca_id AND RD.rcde_tipodoc = 31 AND RD.rcde_iddoc = F.fact_id AND
        R.reca_fecha >= :FECINI AND R.reca_fecha <= :FECFIN AND F.vend_cod = :CODIGO AND RECA_ANULADO = 'N'
        INTO :RECAUDO;
    if (RECAUDO IS NULL) then
        RECAUDO = 0;
    if (SERVER IS NOT NULL) then
        BEGIN
        CADSQL = 'SELECT SUM(RCDE_ABONO) FROM RECIBOS_CAJA R, recibos_caja_detalle RD, FACTURAS F WHERE R.reca_id = RD.reca_id AND RD.rcde_tipodoc = 31 AND RD.rcde_iddoc = F.fact_id AND R.reca_fecha >= ''' ||
            :fecini || ''' AND R.reca_fecha <= ''' || :fecfin || ''' AND RECA_ANULADO = ''N'' AND F.vend_cod = ' || :codigo;
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
            INTO :RECAUDO2;
        if (RECAUDO2 IS NULL) then
            RECAUDO2 = 0;
        RECAUDO = RECAUDO + RECAUDO2;
        END
    if ((MFACTURAS <> 0) or (MDEVOLUCIONES <> 0) or (RECAUDO <> 0)) then
        SUSPEND;
    END
end^


ALTER PROCEDURE REP_VENTASDET_BIT (
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    SUBG VARCHAR(3))
RETURNS (
    CODARTI VARCHAR(15),
    NITCLI VARCHAR(20),
    CODVEND INTEGER,
    FECDOC VARCHAR(8),
    NUMDOC VARCHAR(8),
    CANT NUMERIC(18,4),
    TOTITEM NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO VARCHAR(1),
    COSTO NUMERIC(18,2))
AS
declare variable TOTAL NUMERIC(18,2);
declare variable IVA NUMERIC(18,2);
declare variable FEC DATE;
begin
TIPO = '0';
for select d.arti_cod, f.terc_nit, f.vend_cod, f.fact_fecha, f.fact_numero, d.fade_cant, d.fade_total, d.fade_ivamonto,
    d.fade_unidad from facturas f, facturas_detalle d, vendedores v, prefijos p, articulo a where f.vend_cod = v.vend_cod
    and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and f.fact_anulado = 'N' and f.pref_pre = p.pref_pre
    and ((p.sucu_id = :subempresa) or (:subempresa = 0)) and d.fact_id = f.fact_id and a.arti_cod = d.arti_cod and
    p.tido_cod = 31 and a.subg_cod = :subg and d.fade_anulado = 'N'
    into :codarti, :nitcli, :codvend, :fec, :numdoc, :cant, :total, :iva, :unidad
    do
    begin
    TOTITEM = total - iva;
    execute procedure costo_promedio(:codarti,:fec) returning_values(:costo);
    execute procedure fecha_a_conta(fec) returning_values(fecdoc);
    suspend;
    end
TIPO = '1';
for select d.arti_cod, f.terc_nit, f.vend_cod, f.devt_fecha, f.devt_numero, d.dvde_cant, d.dvde_total, d.dvde_ivamonto,
    d.dvde_unidad from devoluciones_ventas f, devoluciones_ventas_detalle d, vendedores v, prefijos p, articulo a, facturas fv
    where f.vend_cod = v.vend_cod and f.devt_fecha >= :fecini and f.devt_fecha <= :fecfin and f.devt_anulado = 'N' and f.pref_pre = p.pref_pre
    and ((p.sucu_id = :subempresa) or (:subempresa = 0)) and d.devt_id = f.devt_id and a.arti_cod = d.arti_cod and
    p.tido_cod = 33 and a.subg_cod = :subg and f.devt_anulado = 'N' and ((fv.fact_id = f.devt_factid and fv.fact_fecha < :fecini)
    or(f.devt_factid is null))
    into :codarti, :nitcli, :codvend, :fec, :numdoc, :cant, :total, :iva, :unidad
    do
    begin
    TOTITEM = -total + iva;
    execute procedure costo_promedio(:codarti,:fec) returning_values(:costo);
    execute procedure fecha_a_conta(fec) returning_values(fecdoc);
    suspend;
    end
end^


ALTER PROCEDURE REPARTE_SALIDA (
    PREFS VARCHAR(4),
    NUMERO VARCHAR(8),
    PREFE VARCHAR(4),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    IDENS INTEGER,
    NUMENS VARCHAR(12),
    FECENS DATE)
AS
declare variable ARTIC VARCHAR(20);
declare variable BODE VARCHAR(20);
declare variable TOTCAN DOUBLE PRECISION;
declare variable CANT DOUBLE PRECISION;
declare variable CANTPR DOUBLE PRECISION;
declare variable CANENS DOUBLE PRECISION;
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR DOUBLE PRECISION;
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 ITEM INTEGER;
declare variable DESPR VARCHAR(60);
begin
SELECT SUM(ENSA_CANT) FROM ENSAMBLES E
    WHERE PREF_PRE = :PREFE AND ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN AND ENSA_ANULADO = 'N'
    INTO TOTCAN;
if (TOTCAN IS NULL) then
    TOTCAN = 0;
if (TOTCAN <> 0) then
    BEGIN
    FOR SELECT D.arti_cod, D.bode_cod, D.sade_cant, D.sade_unidad, D.sade_factor, D.sade_ivaporc, D.sade_consumo, D.sade_desc
        FROM SALIDAS S, salidas_detalle D WHERE S.sali_id = D.sali_id AND S.pref_pre = :PREFS AND S.sali_numero = :numero
        INTO :ARTIC, :BODE, :CANT, :UNIDAD, :FACTOR, :IVA, :CONSUMO, :DESPR
        DO
        BEGIN
        FOR SELECT ENSA_ID, PREF_PRE || ENSA_NUMERO, ENSA_FECHA, ENSA_CANT FROM ENSAMBLES E
            WHERE PREF_PRE = :PREFE AND ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN AND ENSA_ANULADO = 'N'
            INTO :IDENS, :NUMENS, :FECENS, :CANENS
            DO
            BEGIN
            SELECT MAX(ESDE_ITEM) FROM ENSAMBLES_DETALLE WHERE ENSA_ID = :IDENS INTO :ITEM;
            if (ITEM IS NULL) then
                ITEM = 0;
            ITEM = ITEM + 1;
            CANTPR = (CANT * FACTOR) * CANENS / TOTCAN;
            EXECUTE PROCEDURE costo_promedio_unidad (:artic, :fecens, :unidad) returning_values (:COSTO);
            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, :artic,  :bode, :cantpr, :unidad, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :artic, 'N', 'N', :despr, :COSTO * :cantpr, 0);
            END
        suspend;
        END
    END
end^


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^


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^


ALTER PROCEDURE REPORTE_IMPORTACIONES (
    PREINI VARCHAR(4),
    PREFIN VARCHAR(4),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    ANULADOS CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    FECHA DATE,
    REFERENCIA VARCHAR(60),
    CONCEPTO VARCHAR(60),
    MONEDA INTEGER,
    NOMMONEDA VARCHAR(30),
    FECLLEGA DATE,
    PROY VARCHAR(4),
    CENT VARCHAR(4),
    CTAIMP VARCHAR(20),
    ORDENES INTEGER,
    ORDENADO NUMERIC(18,2),
    FACTURAS INTEGER,
    FACTURADO NUMERIC(18,2),
    GASTOS INTEGER,
    GASTADO NUMERIC(18,2),
    TOTALIMP NUMERIC(18,2),
    CERRADA CHAR(1),
    ANULADO CHAR(1),
    ITEM INTEGER,
    CODART VARCHAR(20),
    DESCART VARCHAR(60),
    DESCORTA VARCHAR(30),
    OBSART BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    CANT NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    PRUNIT NUMERIC(18,2),
    PRUMON NUMERIC(18,2),
    TOTALFAC NUMERIC(18,2),
    TRMFAC NUMERIC(18,2),
    FLETES NUMERIC(18,2),
    SEGUROS NUMERIC(18,2),
    IMPUESTOS NUMERIC(18,2),
    OTROS NUMERIC(18,2),
    TOTALITE NUMERIC(18,2))
AS
declare variable tigi integer;
declare variable tipo char(1);
declare variable liquida char(1);
declare variable total double precision;
declare variable totitem double precision;
declare variable gasto double precision;
declare variable PESO double precision;
declare variable VOLUMEN double precision;
declare variable FOB NUMERIC(18,2);
begin
FOR SELECT IMPO_ID, IMPO_PREF, IMPO_NUMERO, IMPO_FECHA, IMPO_CONC, IMPO_ANULADO, IMPO_REFERENCIA, IMPO_CERRADA,
    IMPO_PROY, IMPO_CENTRO, IMPO_MONEDA, IMPO_CTAIMP
    FROM IMPORTACION WHERE IMPO_PREF >= :PREINI AND IMPO_PREF <= :PREFIN AND IMPO_FECHA >= :fecini AND IMPO_FECHA <= :fecfin
    AND ((:ANULADOS = 'S') or (IMPO_ANULADO = 'N'))
    ORDER BY IMPO_ID DESC
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :ANULADO, :REFERENCIA, :CERRADA,
    :PROY, :CENT, :MONEDA, :CTAIMP
    DO
    BEGIN
    SELECT TIMO_NOMBRE FROM TIPOS_MONEDA WHERE TIMO_COD = :MONEDA INTO :NOMMONEDA;
    SELECT max(fapo_feccie) FROM factura_proforma WHERE FAPO_IDIMPOR = :ID AND FAPO_ANULADO = 'N' into :fecllega;
    SELECT COUNT(SLIM_ID), SUM(SLIM_TOTAL) FROM solicitud_importacion WHERE SLIM_IDIMPOR = :ID AND SLIM_ANULADO = 'N'
        INTO :ORDENES, :ORDENADO;
    SELECT COUNT(FAPO_ID), SUM(FAPO_TOTAL) FROM factura_proforma WHERE FAPO_IDIMPOR = :ID AND FAPO_ANULADO = 'N'
        INTO :FACTURAS, :FACTURADO;
    SELECT COUNT(GAIN_ID), SUM(GAIN_VALOR) FROM gastos_importacion WHERE GAIN_IDIMPOR = :ID AND GAIN_ANULADO = 'N'
        INTO :GASTOS, :GASTADO;
    if (FACTURADO IS NULL) then
        FACTURADO = 0;
    if (GASTADO IS NULL) then
        GASTADO = 0;
    TOTALIMP = facturado + gastado;
    if (DETALLE = 'S') then
        BEGIN
        DELETE FROM importacion_liquidacion WHERE IMPO_ID = :ID;
        ITEM = 0;
        FOR SELECT FD.arti_cod, FD.fpde_cant * fd.fpde_factor, FD.fpde_prunit-FD.fpde_dtomonto, (FD.fpde_prunitmon*(1-FD.fpde_dtoporc/100)), FD.fpde_trm,
            FD.fpde_flete, FD.fpde_seguro, FD.fpde_ivamonto, FD.fpde_otrogto, FD.fpde_peso, FD.fpde_volumen, FD.fpde_fob
            FROM FACTURA_PROFORMA F, factura_proforma_det FD
            WHERE F.fapo_id = FD.fapo_id AND F.fapo_idimpor = :ID AND FD.fpde_anulado = 'N'
            INTO :codart, :cant, :prunit, :prumon, :trmfac, :fletes, :seguros, :impuestos, :otros, :peso, :volumen, :fob
            DO
            BEGIN
            ITEM = ITEM + 1;
            INSERT INTO importacion_liquidacion (IMPO_ID, IMLI_ITEM, ARTI_COD, IMLI_CANT, IMLI_PRUNIT,
                IMLI_PRUMON, IMLI_FLETES, IMLI_SEGUROS, IMLI_IMPTOS, IMLI_OTROS, IMLI_PESO, IMLI_VOLUMEN, IMLI_FOB)
                VALUES (:ID, :ITEM, :codart, :cant, :prunit,
                :prumon, :fletes, :seguros, :impuestos, :otros, :peso, :volumen, :fob);
            END
        if (CERRADA = 'N') then
            BEGIN
            /* ASIGNE LOS GASTOS */
            FOR SELECT G.tigi_cod, G.gain_valor * G.gain_trm FROM gastos_importacion G WHERE G.gain_idimpor = :ID and g.gain_anulado = 'N'
                into :tigi, gasto
                DO
                BEGIN
                /* calcule la proporcion por item ya sea por peso, volumen, cantidad o valor */
                select t.tigi_tipo, t.tigi_liquidacion from tipo_gastos_importacion t where t.tigi_cod = :tigi
                    into :tipo, :liquida;
                if (liquida = 'C') then
                    begin
                    /* cubicaje-volumen */
                    select sum(imli_volumen) from importacion_liquidacion where impo_id = :id into :total;
                    for select imli_item, imli_volumen from importacion_liquidacion where impo_id = :id
                        into :item, :totitem
                        do
                        begin
                        if (tipo = 'F') then
                            update importacion_liquidacion
                                set imli_fletes = imli_fletes + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'S') then
                            update importacion_liquidacion
                                set imli_seguros = imli_seguros + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'I') then
                            update importacion_liquidacion
                                set imli_imptos = imli_imptos + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'O') then
                            update importacion_liquidacion
                                set imli_otros = imli_otros + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        end
                    end
                if (liquida = 'P') then
                    begin
                    /* peso */
                    select sum(imli_peso) from importacion_liquidacion where impo_id = :id into :total;
                    for select imli_item, imli_peso from importacion_liquidacion where impo_id = :id
                        into :item, :totitem
                        do
                        begin
                        if (tipo = 'F') then
                            update importacion_liquidacion
                                set imli_fletes = imli_fletes + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'S') then
                            update importacion_liquidacion
                                set imli_seguros = imli_seguros + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'I') then
                            update importacion_liquidacion
                                set imli_imptos = imli_imptos + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'O') then
                            update importacion_liquidacion
                                set imli_otros = imli_otros + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        end
                    end
                if (liquida = 'T') then
                    begin
                    /* cantidad total */
                    select sum(imli_cant) from importacion_liquidacion where impo_id = :id into :total;
                    for select imli_item, imli_cant from importacion_liquidacion where impo_id = :id
                        into :item, :totitem
                        do
                        begin
                        if (tipo = 'F') then
                            update importacion_liquidacion
                                set imli_fletes = imli_fletes + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'S') then
                            update importacion_liquidacion
                                set imli_seguros = imli_seguros + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'I') then
                            update importacion_liquidacion
                                set imli_imptos = imli_imptos + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'O') then
                            update importacion_liquidacion
                                set imli_otros = imli_otros + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        end
                    end
                if (liquida = 'V') then
                    begin
                    /* valor */
                    select sum(imli_fob) from importacion_liquidacion where impo_id = :id into :total;
                    for select imli_item, imli_fob from importacion_liquidacion where impo_id = :id
                        into :item, :totitem
                        do
                        begin
                        if (tipo = 'F') then
                            update importacion_liquidacion
                                set imli_fletes = imli_fletes + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'S') then
                            update importacion_liquidacion
                                set imli_seguros = imli_seguros + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'I') then
                            update importacion_liquidacion
                                set imli_imptos = imli_imptos + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        if (tipo = 'O') then
                            update importacion_liquidacion
                                set imli_otros = imli_otros + (:gasto * :totitem / :total)
                            where impo_id = :id and imli_item = :item;
                        end
                    end
                END
            END
        /* reporte los articulos */
        for select IMLI_ITEM, ARTI_COD, IMLI_CANT, IMLI_PRUNIT, IMLI_PRUMON, IMLI_FLETES, IMLI_SEGUROS, IMLI_IMPTOS, IMLI_OTROS
            from importacion_liquidacion where impo_id = :id
            INTO :ITEM, :codart, :cant, :prunit, :prumon, :fletes, :seguros, :impuestos, :otros
            DO
            BEGIN
            TOTALFAC = CANT * PRUNIT;
            TOTALITE = TOTALFAC + FLETES + SEGUROS + IMPUESTOS + OTROS;
            SELECT ARTI_DES, ARTI_UNIDAD, ARTI_DESCORTA, ARTI_OBS FROM ARTICULO WHERE ARTI_COD = :codart
                INTO :descart, :unidad, :descorta, :obsart;
            SUSPEND;
            END
        END
    ELSE
        BEGIN
        suspend;
        END
    END
end^


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^


ALTER PROCEDURE RESERVAS_ARTICULO (
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    RESERVA NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
declare variable PEDIDO NUMERIC(18,4);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable UND VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable FACT NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable RESWEB CHAR(2);
declare variable VALIDEZ INTEGER;
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_VENCE >= :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_VENCE >= :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
            execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'RESERVAR MERCANCIA CON PEDIDO WEB SIN CONFIRMAR') returning_values (:resweb);
            if (RESWEB = 'SI') then
                BEGIN
                execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'DIAS DE VALIDEZ') returning_values (VALIDEZ);
                for select P.pewe_id, PD.pewd_item, p.pewe_fecha, p.pewe_pref, p.pewe_numped, p.terc_nit, PD.pewd_cant * PD.pewd_factor, pd.pewd_unidad, PD.pewd_cant * PD.pewd_factor, pd.pewd_factor
                    from PEDIDO_WEB P, pedido_web_detalle PD
                    where P.pewe_id = PD.pewe_id and PD.arti_cod = :CODIGO and P.pewe_fecha >= (:FECHA-:VALIDEZ)
                    AND PEWE_FECHA <= :FECHA and P.pewe_idped = 0
                    INTO :ID, :ITEM, :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :reserva, :UNIDAD, :FALTANTE, :FACTOR
                    do
                    begin
                    COSTOTOT = RESERVA * COSTO;
                    if (RESERVA > 0) then
                        SUSPEND;
                    end
                END
            END
        END
END^


ALTER PROCEDURE RESERVAS_ARTICULO_FECHA (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECRES DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VENCE DATE,
    CLIENTE VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
declare variable FACT NUMERIC(18,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable RESWEB CHAR(2);
declare variable VALIDEZ INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
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_VENCE, 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_VENCE >= :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
execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'RESERVAR MERCANCIA CON PEDIDO WEB SIN CONFIRMAR') returning_values (:resweb);
if (RESWEB = 'SI') then
    BEGIN
    execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'DIAS DE VALIDEZ') returning_values (VALIDEZ);
    for select P.pewe_id, PD.pewd_item, p.pewe_fecha, p.pewe_pref, p.pewe_numped, P.pewe_fecha+:VALIDEZ, p.terc_nit, PD.pewd_cant * PD.pewd_factor, pd.pewd_unidad, pd.pewd_factor
        from PEDIDO_WEB P, pedido_web_detalle PD
        where P.pewe_id = PD.pewe_id and PD.arti_cod = :articulo and P.pewe_fecha >= (:FECHA-:VALIDEZ)
        AND PEWE_FECHA <= :FECHA and P.pewe_idped = 0
        INTO :ID, :ITEM, :FECRES, :PREFIJO, :NUMERO, :VENCE, :CLIENTE, :CANTIDAD, :UNIDAD, :FACTOR
        do
        SUSPEND;
    END
END^


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^


ALTER PROCEDURE RESTE_SALDO_BANCO (
    CUENTA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
DECLARE VARIABLE existe INTEGER;
DECLARE VARIABLE saldo NUMERIC(15,4);
declare variable sumar integer;
BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /*  Si en SALDO_BANCO existe el registro CUENTA-fecha le suma
        a los debitos el monto, si no, crea un nuevo registro       */
  SELECT 1 FROM SALDO_BANCOS
    WHERE (CUBA_COD = :CUENTA) AND
      (SABA_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_CUENTA_BANCO(:CUENTA, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO SALDO_BANCOS (CUBA_COD, SABA_FECHA,
        SABA_DEBITOS, SABA_CREDITOS, SABA_SALDO)
        VALUES (:CUENTA, :FECHA, 0, (:MONTO * :sumar), :saldo);
      END /* if existe */
  ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE SALDO_BANCOS
          SET SABA_CREDITOS = SABA_CREDITOS + (:MONTO * :sumar)
          WHERE (CUBA_COD = :CUENTA) AND
            (SABA_FECHA = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE SALDO_BANCOS
        SET SABA_SALDO = SABA_SALDO - (:MONTO * :sumar)
        WHERE (CUBA_COD = :CUENTA) AND
            (SABA_FECHA > :fecha);
END^


ALTER PROCEDURE RESTE_SALDO_BANCO_CONF (
    CUENTA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
DECLARE VARIABLE existe INTEGER;
DECLARE VARIABLE saldo NUMERIC(15,4);
declare variable sumar integer;
BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /*  Si en SALDO_BANCO existe el registro CUENTA-fecha le suma
        a los debitos el monto, si no, crea un nuevo registro       */
  SELECT 1 FROM saldo_bancos_conf
    WHERE (CUBA_COD = :CUENTA) AND
      (SABA_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_cuenta_banco_conf(:CUENTA, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO saldo_bancos_conf (CUBA_COD, SABA_FECHA,
        SABA_DEBITOS, SABA_CREDITOS, SABA_SALDO)
        VALUES (:CUENTA, :FECHA, 0, (:MONTO * :sumar), :saldo);
      END /* if existe */
  ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE saldo_bancos_conf
          SET SABA_CREDITOS = SABA_CREDITOS + (:MONTO * :sumar)
          WHERE (CUBA_COD = :CUENTA) AND
            (SABA_FECHA = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE saldo_bancos_conf
        SET SABA_SALDO = SABA_SALDO - (:MONTO * :sumar)
        WHERE (CUBA_COD = :CUENTA) AND
            (SABA_FECHA > :fecha);
END^


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^


ALTER PROCEDURE RESTE_SALDO_EFECTIVO (
    CAJA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
declare variable EXISTE CHAR(1);
declare variable SALDO NUMERIC(18,2);
BEGIN
EXISTE = 'N';
SELECT 'S' FROM SALDO_EFECTIVO WHERE SAEF_FECHA = :FECHA AND CAJA_ID = :CAJA INTO :EXISTE;
if (ANULAR <> 'S') then
    BEGIN
    if (EXISTE = 'S') then
        UPDATE SALDO_EFECTIVO SET SAEF_CREDITOS = SAEF_CREDITOS + :MONTO
            WHERE SAEF_FECHA = :FECHA AND CAJA_ID = :CAJA;
    ELSE
        BEGIN
        EXECUTE PROCEDURE SALDO_EN_EFECTIVO (:CAJA, :FECHA) RETURNING_VALUES (:SALDO);
        INSERT INTO SALDO_EFECTIVO (SAEF_FECHA, CAJA_ID, SAEF_SALDO, SAEF_DEBITOS, SAEF_CREDITOS)
            VALUES (:FECHA, :CAJA, :SALDO, 0, :MONTO);
        END
    /* ACTUALICE LOS SALDOS DE FECHAS POSTERIORES */
    UPDATE SALDO_EFECTIVO SET SAEF_SALDO = SAEF_SALDO - :MONTO
      WHERE CAJA_ID = :CAJA AND SAEF_FECHA > :FECHA;
    END
ELSE
    BEGIN
    UPDATE SALDO_EFECTIVO SET SAEF_CREDITOS = SAEF_CREDITOS - :MONTO
        WHERE SAEF_FECHA = :FECHA AND CAJA_ID = :CAJA;
    /* ACTUALICE LOS SALDOS DE FECHAS POSTERIORES */
    UPDATE SALDO_EFECTIVO SET SAEF_SALDO = SAEF_SALDO + :MONTO
      WHERE CAJA_ID = :CAJA AND SAEF_FECHA > :FECHA;
    END
END^


ALTER PROCEDURE RESULTADO_ANUAL (
    ANO CHAR(4),
    NIIF CHAR(1))
RETURNS (
    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),
    SAENE NUMERIC(18,2),
    SAFEB NUMERIC(18,2),
    SAMAR NUMERIC(18,2),
    SAABR NUMERIC(18,2),
    SAMAY NUMERIC(18,2),
    SAJUN NUMERIC(18,2),
    SAJUL NUMERIC(18,2),
    SAAGO NUMERIC(18,2),
    SASEP NUMERIC(18,2),
    SAOCT NUMERIC(18,2),
    SANOV NUMERIC(18,2),
    SADIC NUMERIC(18,2),
    SACIE NUMERIC(18,2))
AS
declare variable MES INTEGER;
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable UTILMES NUMERIC(18,2);
declare variable ACUMULADO NUMERIC(18,2);
BEGIN
MES = 1;
ACUMULADO = 0;
WHILE (MES < 14) DO
    BEGIN
    if (NIIF <> 'S') then
        BEGIN
        /* CALCULE LA UTILIDAD DEL EJERCICIO */
        EXECUTE PROCEDURE MOVIMIENTOS_CUENTA_MES('4', ANO, MES) RETURNING_VALUES (DEBITO, CREDITO);
        UTILMES = (DEBITO-CREDITO);
        EXECUTE PROCEDURE MOVIMIENTOS_CUENTA_MES('5', ANO, MES) RETURNING_VALUES (DEBITO, CREDITO);
        UTILMES = UTILMES + (DEBITO-CREDITO);
        EXECUTE PROCEDURE MOVIMIENTOS_CUENTA_MES('6', ANO, MES) RETURNING_VALUES (DEBITO, CREDITO);
        UTILMES = UTILMES + (DEBITO-CREDITO);
        EXECUTE PROCEDURE MOVIMIENTOS_CUENTA_MES('7', ANO, MES) RETURNING_VALUES (DEBITO, CREDITO);
        UTILMES = UTILMES + (DEBITO-CREDITO);
        END
    ELSE
        BEGIN
        /* CALCULE LA UTILIDAD DEL EJERCICIO */
        EXECUTE PROCEDURE movimientos_cuenta_mes_niif('4', ANO, MES) RETURNING_VALUES (DEBITO, CREDITO);
        UTILMES = (DEBITO-CREDITO);
        EXECUTE PROCEDURE movimientos_cuenta_mes_niif('5', ANO, MES) RETURNING_VALUES (DEBITO, CREDITO);
        UTILMES = UTILMES + (DEBITO-CREDITO);
        EXECUTE PROCEDURE movimientos_cuenta_mes_niif('6', ANO, MES) RETURNING_VALUES (DEBITO, CREDITO);
        UTILMES = UTILMES + (DEBITO-CREDITO);
        EXECUTE PROCEDURE movimientos_cuenta_mes_niif('7', ANO, MES) RETURNING_VALUES (DEBITO, CREDITO);
        UTILMES = UTILMES + (DEBITO-CREDITO);
        END
    ACUMULADO = ACUMULADO + UTILMES;
    if (MES = 1) then
        BEGIN
        MVENE = UTILMES;
        SAENE = ACUMULADO;
        END
    if (MES = 2) then
        BEGIN
        MVFEB = UTILMES;
        SAFEB = ACUMULADO;
        END
    if (MES = 3) then
        BEGIN
        MVMAR = UTILMES;
        SAMAR = ACUMULADO;
        END
    if (MES = 4) then
        BEGIN
        MVABR = UTILMES;
        SAABR = ACUMULADO;
        END
    if (MES = 5) then
        BEGIN
        MVMAY = UTILMES;
        SAMAY = ACUMULADO;
        END
    if (MES = 6) then
        BEGIN
        MVJUN = UTILMES;
        SAJUN = ACUMULADO;
        END
    if (MES = 7) then
        BEGIN
        MVJUL = UTILMES;
        SAJUL = ACUMULADO;
        END
    if (MES = 8) then
        BEGIN
        MVAGO = UTILMES;
        SAAGO = ACUMULADO;
        END
    if (MES = 9) then
        BEGIN
        MVSEP = UTILMES;
        SASEP = ACUMULADO;
        END
    if (MES = 10) then
        BEGIN
        MVOCT = UTILMES;
        SAOCT = ACUMULADO;
        END
    if (MES = 11) then
        BEGIN
        MVNOV = UTILMES;
        SANOV = ACUMULADO;
        END
    if (MES = 12) then
        BEGIN
        MVDIC = UTILMES;
        SADIC = ACUMULADO;
        END
    if (MES = 13) then
        BEGIN
        MVCIE = UTILMES;
        SACIE = ACUMULADO;
        END
    MES = MES + 1;
    END
SUSPEND;
END^


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^


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),
    CAJA_ID INTEGER,
    SALDOFIN_EFEC 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, CAJA_ID FROM PUNTO_VENTA WHERE PTVT_ID >= :ptoini AND PTVT_ID <= :ptofin AND ((SUCU_ID = :agencia) or (:AGENCIA = 0))
    INTO :ptovta, :ptovtanom, :caja_id
    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;
    EXECUTE PROCEDURE SALDO_EN_EFECTIVO(:CAJA_ID, :FECHA)RETURNING_VALUES(:saldofin_efec);
    SUSPEND;
    END
end^


ALTER PROCEDURE RESUMEN_GERENCIAL_RIMAR (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    VENTAS NUMERIC(18,2),
    COSTOS NUMERIC(18,2),
    CARTERA NUMERIC(18,2),
    BANCOS NUMERIC(18,2),
    INVENTARIO NUMERIC(18,2),
    UTILIDAD NUMERIC(18,2))
AS
declare variable CADSQL VARCHAR(1024);
declare variable SERVER VARCHAR(100);
declare variable COMPANIA VARCHAR(3);
declare variable USUARIO VARCHAR(10);
declare variable CLAVE VARCHAR(10);
declare variable ventas2 NUMERIC(18,2);
begin
SELECT FIRST 1 RPCO_SERVIDOR, RPCO_COD FROM replica_compania INTO :SERVER, :COMPANIA;
SERVER = SERVER || '\DATOS\' || :COMPANIA || '\SYSPLUS.FDB';
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'NOMBRE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (USUARIO);
EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ARTICULOS', 'CLAVE DE USUARIO PARA REPLICACION DE ARTICULOS') returning_values (CLAVE);
/* VENTAS */
SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    INTO VENTAS;
if (VENTAS IS NULL) then
    VENTAS = 0;
if (SERVER IS NOT NULL) then
    BEGIN
    CADSQL = 'SELECT SUM(FACT_TOTAL-FACT_IVAMONTO) FROM FACTURAS WHERE FACT_ANULADO = ''N'' AND FACT_FECHA >= ''' || :fecini || ''' AND FACT_FECHA <= ''' || :fecfin || '''';
    EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
        INTO :VENTAS2;
    if (VENTAS2 IS NULL) then
        VENTAS2 = 0;
    VENTAS = VENTAS + VENTAS2;
    END
/* COSTO EN VENTAS */
SELECT COSTO FROM COSTO_VENTAS_FECHAS (:FECINI, :FECFIN, 0) INTO :COSTOS;
if (SERVER IS NOT NULL) then
    BEGIN
    CADSQL = 'SELECT COSTO FROM COSTO_VENTAS_FECHAS (''' || :fecini || ''', ''' || :fecfin || ''', 0)';
    EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
        INTO :VENTAS2;
    if (VENTAS2 IS NULL) then
        VENTAS2 = 0;
    COSTOS = COSTOS + VENTAS2;
    END
UTILIDAD = VENTAS - COSTOS;
/* VALOR INVENTARIO */
SELECT SALDO FROM VALOR_INVENTARIO(:fecfin) INTO :inventario;
if (SERVER IS NOT NULL) then
    BEGIN
    CADSQL = 'SELECT SALDO FROM VALOR_INVENTARIO(''' || :fecfin || ''')';
    EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
        INTO :VENTAS2;
    if (VENTAS2 IS NULL) then
        VENTAS2 = 0;
    INVENTARIO = INVENTARIO + VENTAS2;
    END
/* CARTERA */
SELECT CARTERA FROM CARTERA_TOTAL(:fecfin) INTO :cartera;
if (SERVER IS NOT NULL) then
    BEGIN
    CADSQL = 'SELECT CARTERA FROM CARTERA_TOTAL(''' || :fecfin || ''')';
    EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
        INTO :VENTAS2;
    if (VENTAS2 IS NULL) then
        VENTAS2 = 0;
    CARTERA = CARTERA + VENTAS2;
    END
/* SALDOS BANCOS */
SELECT TOTAL FROM saldo_total_bancos(:fecfin) INTO :bancos;
if (SERVER IS NOT NULL) then
    BEGIN
    CADSQL = 'SELECT TOTAL FROM saldo_total_bancos(''' || :fecfin || ''')';
    EXECUTE STATEMENT :CADSQL ON EXTERNAL :SERVER as user :USUARIO PASSWORD :CLAVE
        INTO :VENTAS2;
    if (VENTAS2 IS NULL) then
        VENTAS2 = 0;
    BANCOS = BANCOS + VENTAS2;
    END
suspend;
end^


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^


ALTER PROCEDURE RESUMEN_PUNTOS_TX1 (
    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^


ALTER PROCEDURE RESUMEN_SALDOS_BANCO (
    FECINI DATE,
    FECFIN DATE,
    INACTIVOS CHAR(1))
RETURNS (
    CUBA_COD INTEGER,
    CUBA_NUMERO VARCHAR(20),
    BANC_NOMBRE VARCHAR(60),
    CUBA_TITULAR VARCHAR(60),
    SALDO_INICIAL NUMERIC(18,2),
    CONSIGNA NUMERIC(18,2),
    CHEQUES NUMERIC(18,2),
    DEVCHEQ NUMERIC(18,2),
    RETIROS NUMERIC(18,2),
    NOTASDB NUMERIC(18,2),
    NOTASCR NUMERIC(18,2),
    TRASLADO NUMERIC(18,2),
    SALDO_CONF NUMERIC(18,2),
    SALDO_FINAL NUMERIC(18,2),
    SALDO_ULTIMO NUMERIC(18,2),
    CHEQUESSC NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    CUBA_CODCTA VARCHAR(3))
AS
declare variable ESTADO CHAR(1);
declare variable TIPO INTEGER;
declare variable MONTO NUMERIC(18,2);
declare variable DB CHAR(1);
BEGIN
  FOR SELECT CUBA_COD, CUBA_CODCTA, BANC_NOMBRE, CUBA_NUMERO, CUBA_TITULAR, CUBA_ESTADO
    FROM CUENTAS_BANCOS 
    INTO :CUBA_COD, :CUBA_CODCTA, :BANC_NOMBRE, :CUBA_NUMERO, :CUBA_TITULAR, :ESTADO
    DO
    BEGIN
    if ((INACTIVOS = 'S') or (ESTADO = 'N')) then
        BEGIN
        EXECUTE PROCEDURE SALDO_CUENTA_BANCO (:CUBA_COD, :FECINI) RETURNING_VALUES (:SALDO_INICIAL);
        CONSIGNA = 0;
        CHEQUES = 0;
        RETIROS = 0;
        NOTASDB = 0;
        NOTASCR = 0;
        TRASLADO = 0;
        DEVCHEQ = 0;
        DEBITOS = 0;
        CREDITOS = 0;
        for SELECT MAX(MOBA_TIPODOC), max(moba_db), SUM(MOBA_TOTAL) FROM MOVIMIENTO_BANCO WHERE CUBA_COD = :CUBA_COD AND MOBA_FECHA >= :FECINI
            AND MOBA_FECHA <= :FECFIN group by MOBA_TIPODOC, MOBA_DB
            INTO :TIPO, :DB, :MONTO
            DO
            BEGIN
            IF (TIPO = 71) THEN
              CONSIGNA = MONTO;
            IF (TIPO = 72) THEN
              CHEQUES = MONTO;
            IF ((TIPO = 73) or (tipo = 79)) THEN
              RETIROS = RETIROS + MONTO;
            IF (TIPO = 74) THEN
              NOTASDB = MONTO;
            IF (TIPO = 75) THEN
              NOTASCR = MONTO;
            IF (TIPO = 76) THEN
                if (DB = 'S') then
                  TRASLADO = TRASLADO + MONTO;
                ELSE
                  TRASLADO = TRASLADO - MONTO;
            IF (TIPO = 77) THEN
              DEVCHEQ = MONTO;
            if (DB = 'S') then
                DEBITOS = DEBITOS + MONTO;
            else
                CREDITOS = CREDITOS + MONTO;
            END
        CHEQUESSC = 0;
        SELECT SUM(CH.cheq_monto) FROM CHEQUES CH WHERE CHEQ_FECHA <= :FECFIN AND CHEQ_ANULADO = 'N' AND CHEQ_CONFIRMA = 'N'
            INTO :CHEQUESSC;
        if (CHEQUESSC IS NULL) then
            CHEQUESSC = 0;

        SALDO_FINAL = SALDO_INICIAL + CONSIGNA - CHEQUES + CHEQUESSC - DEVCHEQ - RETIROS - NOTASDB + NOTASCR + TRASLADO;
        EXECUTE PROCEDURE saldo_cuenta_banco_conf (:CUBA_COD, :FECFIN) RETURNING_VALUES (:SALDO_CONF);
        EXECUTE PROCEDURE SALDO_FINAL_CUENTA_BANCO (:CUBA_COD) RETURNING_VALUES (:SALDO_ULTIMO);
        SUSPEND;
        END
    END
END^


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


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


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^


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^


ALTER PROCEDURE RETIROS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT RETI_ID, CUBA_COD, PRBA_PREF, RETI_NUMERO FROM RETIROS
    WHERE RETI_ANULADO = 'N' AND RETI_FECHA >= :FECINI AND RETI_FECHA <= :FECFIN
    ORDER BY RETI_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 73 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 73 AND CUBA_COD = :CTA INTO :IDI;
  if (IDI is NOT NULL) then
      BEGIN
      EXECUTE PROCEDURE CONTABIL_RETIRO (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
      if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
      ELSE
        ESTADO = 'ERROR';
      suspend;
      END
  end
  END
END^


ALTER PROCEDURE REVERSA_TRASLADO (
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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;
    if (CANT <> 0) then
        suspend;
    END
end^


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') or ((CAMBIO = 'PRECIO') AND (LISTA = LISTAREF))) 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^


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^


ALTER PROCEDURE RUTERO_CONSOLIDADO_ARTICULO (
    ID INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    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),
    CODGRP VARCHAR(3),
    CODSUBG VARCHAR(3),
    CODMARC VARCHAR(3),
    NOMGRP VARCHAR(60),
    NOMSUBG VARCHAR(60),
    NOMMARC VARCHAR(60),
    BODEGA VARCHAR(2),
    STAND VARCHAR(20),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    ALTERNATIVAS NUMERIC(18,4),
    PRINCIPALES NUMERIC(18,4),
    PESOTOT NUMERIC(18,4),
    CAJAS NUMERIC(18,4),
    VALOR NUMERIC(18,2))
AS
declare variable factcant numeric(18,4);
declare variable PESO NUMERIC(18,4);
declare variable CANTREM NUMERIC(18,4);
declare variable VALORREM NUMERIC(18,4);
declare variable CAJASREM NUMERIC(18,4);
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), SUM(FADE_TOTAL), 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, :valor, :bodega, :CAJAS
    DO
    begin
    /* SUME LAS REMISIONES DEL ARTICULO */
    SELECT SUM(RVDE_CANT*RVDE_FACTOR), SUM(RVDE_TOTAL), SUM(RVDE_CAJAS)
    FROM remisiones_venta_detalle RD, rutero_detalle R
    WHERE R.rute_id = :id AND R.rutd_remid = RD.revt_id and BODE_COD = :bodega and ARTI_COD = :codigo
    INTO :CANTREM, :valorREM, :CAJASREM;
    if (CANTREM IS NULL) then
        CANTREM = 0;
    if (VALORREM IS NULL) then
        VALORREM = 0;
    if (CAJASREM IS NULL) then
        CAJASREM = 0;
    CANT = CANT + CANTREM;
    VALOR = VALOR + VALORREM;
    CAJAS = CAJAS + CAJASREM;
    PESO = 0;
    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO FROM ARTICULO
        WHERE ARTI_COD = :CODIGO INTO :descripcion, :unidad, :codgrp, :codsubg, :codmarc, :peso;
    SELECT GRUP_NOM FROM grupo WHERE GRUP_COD = :codgrp INTO :nomgrp;
    SELECT SUBG_NOM FROM subgrupo WHERE GRUP_COD = :codgrp AND SUBG_COD = :codsubg INTO :nomsubg;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :codmarc INTO :nommarc;
    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;
    factcant = NULL;
    SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :codigo and unar_activa = 'S' INTO :factcant;
    if (factcant IS NULL) then
        BEGIN
        ALTERNATIVAS = 0;
        PRINCIPALES = CANT;
        END
    ELSE
        BEGIN
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        END
    if (PESO IS NULL) then
        PESO = 0;
    PESOTOT = PESO * CANT;
    suspend;
    end
  FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT*RVDE_FACTOR), SUM(RVDE_TOTAL), MAX(BODE_COD), SUM(RVDE_CAJAS)
    FROM remisiones_venta_detalle D, rutero_detalle R
    WHERE R.rute_id = :id AND R.rutd_remid = D.revt_id and
    not exists (select fact_id from facturas_detalle fd where fd.fact_id = R.rutd_factid and BODE_COD = d.bode_cod and ARTI_COD = d.arti_cod)
    GROUP BY BODE_COD, ARTI_COD
    INTO :CODIGO, :CANT, :valor, :bodega, :CAJAS
    DO
    begin
    PESO = 0;
    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO FROM ARTICULO
        WHERE ARTI_COD = :CODIGO INTO :descripcion, :unidad, :codgrp, :codsubg, :codmarc, :peso;
    SELECT GRUP_NOM FROM grupo WHERE GRUP_COD = :codgrp INTO :nomgrp;
    SELECT SUBG_NOM FROM subgrupo WHERE GRUP_COD = :codgrp AND SUBG_COD = :codsubg INTO :nomsubg;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :codmarc INTO :nommarc;
    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;
    factcant = NULL;
    SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :codigo and unar_activa = 'S' INTO :factcant;
    if (factcant IS NULL) then
        BEGIN
        ALTERNATIVAS = 0;
        PRINCIPALES = CANT;
        END
    ELSE
        BEGIN
        ALTERNATIVAS = FLOOR(CANT / factcant);
        PRINCIPALES = CANT - (alternativas * factcant);
        END
    if (PESO IS NULL) then
        PESO = 0;
    PESOTOT = PESO * CANT;
    suspend;
    end
end^


ALTER PROCEDURE RUTERO_FACTURA (
    TIPO INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8))
RETURNS (
    ID INTEGER,
    CLIENTE VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    MONTO NUMERIC(18,2),
    CAJAS NUMERIC(18,4),
    VENDEDOR INTEGER)
AS
begin
if (TIPO = 31) then
    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' and rutd_anulado = 'N')
        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
ELSE
    BEGIN
    SELECT REVT_ID, TERC_NIT, REVT_SUCURSAL, REVT_NOMTERC, REVT_TOTAL, VEND_COD
        FROM remisiones_venta R WHERE PREF_PRE = :pref AND REVT_NUMERO = :numero AND REVT_ANULADO = 'N' AND
        NOT EXISTS (SELECT RUTE_ID FROM RUTERO_DETALLE WHERE RUTD_REMID = R.revt_id and rutd_entregado = 'S' and rutd_anulado = 'N') AND
        NOT EXISTS (SELECT COFA_ID FROM consolidado_faltantes WHERE COFA_TIPOORI = 32 AND COFA_TIPODES = 31 AND COFA_IDORI = R.revt_id AND COFA_CANTCR <> 0)
        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
end^


ALTER PROCEDURE SALARIO_BASE_EMPLEADO (
    NITE VARCHAR(20),
    PERIODICIDAD INTEGER,
    ANO CHAR(4),
    PERIODO INTEGER,
    FECHA DATE,
    MENSUAL CHAR(1),
    CONC_COD INTEGER)
RETURNS (
    SALARIO NUMERIC(18,2))
AS
declare variable DIASLAB INTEGER;
declare variable DURANOV INTEGER;
declare variable BASICO NUMERIC(18, 2);
declare variable BASICOEMP NUMERIC(18, 2);
declare variable CAMBSALTRANS NUMERIC(18, 2);
declare variable HORASEX NUMERIC(18, 2);
declare variable COMISION NUMERIC(18, 2);
declare variable RETROACT NUMERIC(18, 2);
declare variable RECARGO NUMERIC(18, 2);
declare variable REEMBOLSO NUMERIC(18, 2);
declare variable INCAP NUMERIC(18, 2);
declare variable salinteg char(1);
declare variable tar_salinteg numeric(9,4);
declare variable auxtrans numeric(18,2);
declare variable CONC_DIAS CHAR(1);
declare variable perinicial integer;
declare variable perfinal integer;
declare variable liquidaper integer;
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable DIASINC char(1);
declare variable DIASNOV integer;
declare variable parambenef char(2);
declare variable beneficios numeric(18,2);
declare variable SMLV numeric(18,2);
declare variable AUXTRANO numeric(18,2);
declare variable VACACION NUMERIC(18,2);
declare variable incextra char(2);
declare variable VALORPREDET NUMERIC(18,2);
declare variable OTROS NUMERIC(18,2);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','TOMAR BENEFICIOS PARA CALCULAR PROVISIONES')returning_values(:PARAMBENEF);
execute procedure LEE_CONFIGURACION('NOMINA', 'LIQUIDACION', 'INCLUIR HORAS EXTRAS EN BASE PARA DETERMINAR AUXILIO DE TRANSPORTE') returning_values (:incextra);
select P.paan_salinteg, p.paan_salminimo, p.paan_auxtr from PARAMETROS_ANO P where P.PAAN_ANO = :ANO
    into :TAR_SALINTEG, :smlv, :auxtrano;
select E.empl_salinteg from EMPLEADOS E where e.terc_nit = :nite and E.EMPL_FECING <= :FECHA into :SALINTEG;
select CE.EMCO_LUQUIDAPER, CN.CONC_DIAS, CN.CONC_PROV, CN.CONC_APORTE, CN.conc_diasinc
    from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where (CE.CONC_COD = CN.CONC_COD) and (CE.TERC_NIT = :NITE) AND CE.CONC_COD = :CONC_COD
    into :LIQUIDAPER, :CONC_DIAS, :CONC_PROV, :CONC_APORTE , :diasinc;
if (CONC_DIAS = 'S') then
    execute procedure DIAS_LABORADOS (:NITE, :PERIODO, :FECHA, :MENSUAL,:CONC_COD) returning_values (:DIASLAB);
else
    begin
    select PPAG_DIAS from PERIODO_PAGO where PPAG_COD = :periodicidad into :diaslab;
    if (mensual = 'S') then
        diaslab = 30;
    end

execute procedure ibc_empleado (:NITE, :ANO, :periodo, :conc_cod) returning_values (:BASICOEMP);
/* 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 and nd.nnde_ano = :ano
    into :CAMBSALTRANS, :DURANOV;
if (CAMBSALTRANS is null) then
    CAMBSALTRANS = 0;
if (DURANOV is null) then
    DURANOV = 0;
DIASLAB = :DIASLAB - :DURANOV;
BASICO = ((:BASICOEMP/30)*:DIASLAB) + :CAMBSALTRANS;

/*COMISIONES*/
if (MENSUAL = 'S') then
    begin
    if (PERIODICIDAD = 1) then
        begin
        perinicial = PERIODO;
        PERFINAL = PERIODO;
        end
    if (PERIODICIDAD = 2) then
        begin
        IF (MOD(PERIODO, 2) = 1) THEN
            BEGIN
            perinicial = PERIODO;
            PERFINAL = PERIODO + 1;
            END
        else
            BEGIN
            perinicial = PERIODO-1;
            PERFINAL = PERIODO;
            END
        end
    if (PERIODICIDAD = 3) then
        begin
        IF (MOD(PERIODO, 4) = 1) THEN
            BEGIN
            perinicial = PERIODO;
            PERFINAL = PERIODO + 3;
            END
        IF (MOD(PERIODO, 4) = 2) THEN
            BEGIN
            perinicial = PERIODO - 1;
            PERFINAL = PERIODO + 2;
            END
        IF (MOD(PERIODO, 4) = 3) THEN
            BEGIN
            perinicial = PERIODO - 2;
            PERFINAL = PERIODO + 1;
            END
        IF (MOD(PERIODO, 4) = 0) THEN
            BEGIN
            perinicial = PERIODO - 3;
            PERFINAL = PERIODO;
            END
        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 and c.emco_fecini >= :fecha and c.emco_fecfin <= :fecha 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 */
select sum(VD.vacd_monto) from vacaciones V, vacaciones_detalle VD
    where v.vaca_id = vD.vaca_id and v.terc_nit = :NITE and v.vaca_disfr = 'S'
    and VD.vacd_periodo >= :perinicial and vD.vacd_periodo <= :perfinal and VD.vacd_ano = :ANO AND V.vaca_fecha <= :fecha
    into :vacacion;
if (:vacacion is null) then
    vacacion = 0;
/* INCAPACIDAD */
if (DIASINC <> 'S') then
    begin
    select sum(ND.nnde_duracion), sum(ND.nnde_valor) 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) or (N.TNOV_COD = 12))
        into :diasnov, :incap;
    if (:diasnov is null) then
        diasnov = 0;
    if (:incap is null) then
        INCAP = 0;
    end
else
    INCAP = 0;
/*SALARIO INTEGRAL */
if (SALINTEG = 'S') then
    BASICO = BASICO * (tar_salinteg / 100);

/*HORAS EXTRA*/
if (((conc_cod <> 955) and (conc_cod <> 956) and (conc_cod <> 957) and (conc_cod <> 2) and (conc_cod <> 26)) or (incextra = 'SI'))  then
    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 :HORASEX;
    end
if (HORASEX is null) then
    HORASEX = 0;
/*RECARGOS*/
if (((conc_cod <> 955) and (conc_cod <> 956) and (conc_cod <> 957) and (conc_cod <> 2) and (conc_cod <> 26)) or (incextra = 'SI'))  then
    begin
    select sum(C.noex_montorec) 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 :recargo;
    end
if (RECARGO is null) then
    RECARGO = 0;
if ((CONC_PROV = 'S') AND (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 <= :FECHA and CE.EMCO_FECFIN >= :FECHA) 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;
/* otros conceptos que son salario */
select sum(CE.EMCO_MONTO) from EMPLEADO_CONCEPTOS CE, CONCEPTOS_NOMINA CN where CN.conc_salario = 'S'
    and (CE.TERC_NIT = :NITE) and (CE.CONC_COD = CN.CONC_COD) and
    ((CE.EMCO_FECINI <= :FECHA and CE.EMCO_FECFIN >= :FECHA) or ((CN.CONC_TODOSPER = 'N')
    and (CE.EMCO_PPAGO = :PERIODO)) or (CN.CONC_TODOSPER = 'S'))
    AND ((CN.conc_cod <> 901) AND (CN.conc_cod <> 902) AND (CN.conc_cod <> 903) AND (CN.conc_cod <> 1011)
    AND (CN.conc_cod <> 971) AND (CN.conc_cod <> 972) AND (CN.conc_cod <> 973) AND (CN.conc_cod <> 1023)
    AND (CN.conc_cod <> 974) AND (CN.conc_cod <> 980) AND (CN.conc_cod <> 981)
    AND (CN.conc_cod <> 970) AND (CN.conc_cod <> 1009) AND (CN.conc_cod <> 1010) AND (CN.conc_cod <> 1037))
    and ce.emco_fecini >= :fecha and ce.emco_fecfin <= :fecha and cn.conc_fecini >= :fecha
    and cn.conc_fecfin <= :fecha into :OTROS;
if (OTROS is null) then
    OTROS = 0;
/* VALOR PREDETERMINADO */
VALORPREDET = null;
select SUM(VP.NVPR_MONTO) from NOMINA_VALOR_PREDET VP, conceptos_nomina CN where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and
    VP.NVPR_PERIODO >= :perinicial and VP.NVPR_PERIODO <= :perfinal and VP.NVPR_ANO = :ANO and VP.CONC_COD = CN.CONC_COD and
    VP.TERC_NIT = :NITE AND CN.conc_salario = 'S'
    into :VALORPREDET;
if (VALORPREDET is null) then
    VALORPREDET = 0;

/* auxilio de transporte */
if (CONC_APORTE <> 'S') then
  if ((CONC_COD <> 929) and (CONC_COD <> 930) and (CONC_COD <> 944) and
    (conc_cod <> 955) and (conc_cod <> 956) and (conc_cod <> 957) and (conc_cod <> 2) and (conc_cod <> 26)) then
    begin
    /* si no es vacaciones ni auxilio de transporte */
    if (exists (select terc_nit from empleado_conceptos where terc_nit = :nite and
        ((conc_cod = 955) or (conc_cod = 956) or (conc_cod = 957) or (conc_cod = 2) or (conc_cod = 26)))) then
        if (:BASICO < (:SMLV*2)) then
            begin
            if (mensual <> 'S') then
                AUXTRANS = (:AUXTRANO / 30) * :DIASLAB;
            end
        else
            AUXTRANS = 0;
    else
        AUXTRANS = 0;
    end
  else
    AUXTRANS = 0;
else
  AUXTRANS = 0;
/*BASE*/
SALARIO = :BASICO + :COMISION + :HORASEX + :RETROACT+ :REEMBOLSO + :INCAP + :RECARGO + :AUXTRANS + :BENEFICIOS + :VACACION + OTROS + VALORPREDET;
if (SALARIO < 0) then
    SALARIO = 0;
suspend;
end^


ALTER PROCEDURE SALARIO_PROMEDIO (
    NITEMP VARCHAR(20),
    FECHA DATE,
    COP CHAR(1))
RETURNS (
    SALARIO NUMERIC(18,2))
AS
declare variable ANOFIN integer;
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable FECINI DATE;
declare variable DIAS INTEGER;
declare variable FECHA2 DATE;
declare variable BASICO NUMERIC(18,2);
declare variable BASICO2 NUMERIC(18,2);
declare variable BASICOAUX NUMERIC(18,2);
declare variable COMISION NUMERIC(18,2);
declare variable OTROS NUMERIC(18,2);
declare variable PERIODICIDAD INTEGER;
declare variable ANOINI integer;
declare variable VARIA CHAR(1);
declare variable FECING DATE;
declare variable AUXTR NUMERIC(18,2);
declare variable SMLV NUMERIC(18,2);
declare variable aprox integer;
declare variable FACSAL NUMERIC(9,2);
declare variable FACSAL2 NUMERIC(9,2);
declare variable LICNR INTEGER;
declare variable FECULT DATE;
declare variable FECMAX DATE;
declare variable DIASSAL INTEGER;
begin
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
/* PROMEDIO EL ULTIMO ANO O SEIS MESES */
SELECT EMPL_PPAGO, EMPL_SALVAR, EMPL_FECING, EMPL_FACSAL FROM EMPLEADOS WHERE TERC_NIT = :nitemp
    INTO :periodicidad, :VARIA, :FECING, :FACSAL;
COMISION = 0;
/* calcule el periodo a promediar */
EXECUTE PROCEDURE periodo_nom_fechaf (:fecha, :periodicidad) returning_values (:perfinal, :anofin);
EXECUTE PROCEDURE fecha_inicial_periodo_pago (:periodicidad, anofin, :perfinal) returning_values (:fecult);
select max(nomi_feccausa+1) from nomina n, nomina_detalle nd where n.nomi_id = nd.nomi_id and nd.terc_nit = :nitemp
    and nomi_feccausa <= :fecha into fecmax;
if ((fecmax is not null) AND (fecmax > FECULT)) then
    fecult = fecmax;

/* AJUSTAR LOS MESES DEPENDIENDO DE LA FECHA DE INGRESO */
if (COP = 'C') then
    BEGIN
    FECINI = :anofin || '/01/01';
    PERINICIAL = 1;
    END
ELSE
    BEGIN
    if (extract(month from fecha) >= 7) then
        BEGIN
        fecini = :anofin || '/07/01';
        PERINICIAL = 7;
        if (periodicidad = 2) then
            PERINICIAL = (PERINICIAL * 2) - 1;
        if (periodicidad = 3) then
            PERINICIAL = (PERINICIAL * 4) - 3;
        END
    else
        BEGIN
        fecini = :anofin || '/01/01';
        PERINICIAL = 1;
        END
    END
if (FECING > FECINI) then
    BEGIN
    FECINI = FECING;
    EXECUTE PROCEDURE periodo_nom_fechaf (:fecini, :periodicidad) returning_values (:perinicial, :anoini);
    END

/* tome el salario actual */
select first 1 MVSE_SALARIO, MVSE_FECHA, MVSE_FACSAL from MOVIMIENTO_SALARIO_EMPLEADO M
    where TERC_NIT = :NITEMP and MVSE_FECHA <= :FECHA order by MVSE_FECHA desc into :BASICO, :FECHA2, :FACSAL;
if ((FACSAL IS NULL) or (FACSAL = 0))  then
    FACSAL = 100;
if ((VARIA = 'S') or (FECHA2 > FECINI))  then
    BEGIN
    /* EL CAMBIO OCURRIO EN MEDIO DEL PERIODO  O ES VARIABLE */
    /* SUME LO PAGADO POR SUELDO */
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anofin
        and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :nitemp
        AND ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903) or (CONC_COD = 970) or (CONC_COD = 971)
        or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 974) or (CONC_COD = 980) or (CONC_COD = 981)
        OR (CONC_COD = 932) OR (CONC_COD = 975) OR (CONC_COD = 978)
        OR (CONC_COD = 997) OR (CONC_COD = 998) OR (CONC_COD = 999) OR (CONC_COD = 949) OR (CONC_COD = 950)
        OR (CONC_COD = 1000) OR (CONC_COD = 1001) OR (CONC_COD = 1002)
        OR (CONC_COD = 1003) OR (CONC_COD = 1004) OR (CONC_COD = 1005)
        OR (CONC_COD = 1006) OR (CONC_COD = 1007) OR (CONC_COD = 1008) OR (CONC_COD = 1011))
        INTO :SALARIO;
    /* SUMA LOS DIAS DEL ULTIMO PERIODO SIN PAGAR */
    EXECUTE PROCEDURE dias_entre_nomina(fecult, FECHA) returning_values (DIASSAL);
    SALARIO = SALARIO + ((BASICO * DIASSAL /30) * (FACSAL / 100));

    INSERT INTO valores_nomina VALUES(:nitemp, :fecha2 || 'SALARIO PROMEDIO-SALARIO ACUMULADO', :salario, 0, 0);

    EXECUTE PROCEDURE dias_entre_nomina(fecini, FECHA) returning_values (DIASSAL);
    SELECT SUM (ND.nnde_duracion) FROM nomina_novedades N, nomina_novedades_detalle ND
        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitemp AND ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
        AND N.nono_fecha >= :fecini AND N.nono_fecha <= :fecha INTO :LICNR;
    if (LICNR IS NULL) then
        LICNR = 0;
    DIASSAL = DIASSAL - LICNR;
    if (diassal <> 0) then
        SALARIO = (SALARIO / DIASSAL) * 30;
    ELSE
        SALARIO = 0;
    END
ELSE
    BEGIN
    SALARIO = BASICO;
    SALARIO = SALARIO * FACSAL / 100;
    END
if (SALARIO is null) then
    SALARIO = 0;
INSERT INTO valores_nomina VALUES(:nitemp, 'SALARIO PROMEDIO-SALARIO BASE', :salario, 0, 0);
/* sume el auxilio de transporte */
if (exists (select terc_nit from empleado_conceptos e where terc_nit = :NITEMP and ((conc_cod = 955) or (conc_cod = 956) or (conc_cod = 957)))) then
    begin
    select paan_auxtr, paan_salminimo from parametros_ano where paan_ano = extract(year from :fecha) into :auxtr, :smlv;
    execute procedure salario_base_empleado (:nitemp, :periodicidad, :anofin, :perfinal, :fecha, 'S', 955) returning_values (:basicoaux);
    if (basicoaux < 2 * smlv) then
        SALARIO = SALARIO + AUXTR;
    end
INSERT INTO valores_nomina VALUES(:nitemp, 'SALARIO PROMEDIO-SALARIO+AUX', :salario, 0, 0);
if (VARIA = 'N') then
    BEGIN
    select SUM(NCOM_MONTO) FROM nomina_comisiones NC WHERE TERC_NIT = :nitemp AND
        NCOM_ANO = :anofin AND NCOM_PERIODO = :perfinal INTO :comision;
    if (comision IS NULL) then
        COMISION = 0;
    SALARIO = SALARIO + COMISION;
    /* SUME LOS CONCEPTOS QUE SIRVEN PARA PROMEDIOS */
    if (PERIODICIDAD = 1) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and e.emco_activo = 'S' and c.conc_activo = 'S' and terc_nit = :NITEMP
            INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        END
    if (PERIODICIDAD = 2) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP and e.emco_activo = 'S' and c.conc_activo = 'S' AND E.emco_mensual = 'S'
            INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        select SUM(EMCO_MONTO*2) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP and e.emco_activo = 'S' and c.conc_activo = 'S' AND E.emco_mensual = 'N'
            INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        END
    if (PERIODICIDAD = 3) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP and e.emco_activo = 'S' and c.conc_activo = 'S' AND E.emco_mensual = 'S'
            INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        select SUM(EMCO_MONTO*4) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP and e.emco_activo = 'S' and c.conc_activo = 'S' AND E.emco_mensual = 'N'
            INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        END
    INSERT INTO valores_nomina VALUES(:nitemp, 'SALARIO PROMEDIO-NO VARI SALARIO+OTROS F', :salario, 0, 0);
    END
else
    BEGIN
    select SUM(NCOM_MONTO) FROM nomina_comisiones NC WHERE TERC_NIT = :nitemp AND
        NCOM_ANO = :anofin AND NCOM_PERIODO = :perfinal INTO :comision;
    if (comision IS NULL) then
        COMISION = 0;
    select SUM(NH.noex_montorec+NH.noex_monto) FROM nomina_horasext NH WHERE TERC_NIT = :nitemp AND
        NOEX_ANO = :anofin AND NH.noex_periodio = :perfinal INTO :OTROS;
    if (OTROS IS NULL) then
        OTROS = 0;
    COMISION = COMISION + OTROS;
    INSERT INTO valores_nomina VALUES(:nitemp, 'SALARIO PROMEDIO-VARIABLE SALARIO+COMI+EXTRAS', :salario, 0, 0);

    /* los demas conceptos que aplican para el promedio */
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
        N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anofin
        and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :nitemp
        and (N.CONC_COD <> 955) and (N.CONC_COD <> 956) and (N.CONC_COD <> 957)
        AND (CONC_COD <> 901) AND (CONC_COD <> 902) AND (CONC_COD <> 903)
        AND (CONC_COD <> 971) AND (CONC_COD <> 972) AND (CONC_COD <> 973)
        AND (CONC_COD <> 974) AND (CONC_COD <> 980) AND (CONC_COD <> 981)
        AND (CONC_COD <> 932) AND (CONC_COD <> 975) AND (CONC_COD <> 978)
        AND (CONC_COD <> 997) AND (CONC_COD <> 998) AND (CONC_COD <> 999) AND (CONC_COD <> 949)  AND (CONC_COD <> 950)
        AND (CONC_COD <> 1000) AND (CONC_COD <> 1001) AND (CONC_COD <> 1002)
        AND (CONC_COD <> 1003) AND (CONC_COD <> 1004) AND (CONC_COD <> 1005)
        AND (CONC_COD <> 1006) AND (CONC_COD <> 1007) AND (CONC_COD <> 1008) AND (CONC_COD <> 1011)
        into :OTROS;
    if (OTROS is null) then
        OTROS = 0;
    OTROS = OTROS + COMISION;

    /* CALCULAR EL PROMEDIO EN DIAS */
    execute procedure dias_entre_nomina(FECINI, FECHA) returning_values (:dias);
    LICNR = 0;
    SELECT SUM (ND.nnde_duracion) FROM nomina_novedades N, nomina_novedades_detalle ND
        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitemp AND ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
        AND N.nono_fecha >= :fecini AND N.nono_fecha <= :fecha INTO :LICNR;
    if (LICNR IS NULL) then
        LICNR = 0;
    DIAS = DIAS - LICNR;
    if (DIAS < 30) then
        DIAS = 30;
    OTROS = OTROS * 30 / DIAS;
    INSERT INTO valores_nomina VALUES(:nitemp, 'SALARIO PROMEDIO-VARIABLE OTROS', :otros, 0, 0);

    SALARIO = SALARIO + OTROS;
    END
execute procedure redondee(SALARIO, :aprox) returning_values (SALARIO);
suspend;
end^


ALTER PROCEDURE SALARIO_PROMEDIO_DETALLE (
    NITEMP VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    TIPO CHAR(1))
RETURNS (
    CONC INTEGER,
    NOMCONC VARCHAR(60),
    MONTO NUMERIC(18,2))
AS
declare variable ANOFIN integer;
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable DIAS INTEGER;
declare variable FECHA2 DATE;
declare variable BASICO NUMERIC(18,2);
declare variable BASICOAUX NUMERIC(18,2);
declare variable PERIODICIDAD INTEGER;
declare variable ANOINI integer;
declare variable VARIA CHAR(1);
declare variable FECING DATE;
declare variable AUXTR NUMERIC(18,2);
declare variable SMLV NUMERIC(18,2);
declare variable FACSAL NUMERIC(9,2);
declare variable LICNR INTEGER;
declare variable FECULT DATE;
declare variable DIASSAL INTEGER;
declare variable SALARIO NUMERIC(18,2);
declare variable INCHE CHAR(2);
begin
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','INCLUIR HORAS EXTRAS EN BASE PARA LIQUIDACION DE VACACIONES EN LIQUIDACION DEFINITIVA')returning_values(:INCHE);
/* PROMEDIO EL ULTIMO ANO O SEIS MESES */
SELECT EMPL_PPAGO, EMPL_SALVAR, EMPL_FECING, EMPL_FACSAL FROM EMPLEADOS WHERE TERC_NIT = :nitemp
    INTO :periodicidad, :VARIA, :FECING, :FACSAL;
/* calcule el periodo a promediar */
EXECUTE PROCEDURE periodo_nom_fechaf (:fecfin, :periodicidad) returning_values (:perfinal, :anofin);
EXECUTE PROCEDURE fecha_inicial_periodo_pago (:periodicidad, anofin, :perfinal) returning_values (:fecult);
/* AJUSTAR LOS MESES DEPENDIENDO DE LA FECHA DE INGRESO */
if (TIPO = 'C') then
    BEGIN
    FECINI = :anofin || '/01/01';
    PERINICIAL = 1;
    END
ELSE
    BEGIN
    if (extract(month from fecfin) >= 7) then
        BEGIN
        fecini = :anofin || '/07/01';
        PERINICIAL = 7;
        if (periodicidad = 2) then
            PERINICIAL = (PERINICIAL * 2) - 1;
        if (periodicidad = 3) then
            PERINICIAL = (PERINICIAL * 4) - 3;
        END
    else
        BEGIN
        fecini = :anofin || '/01/01';
        PERINICIAL = 1;
        END
    END
if (FECING > FECINI) then
    BEGIN
    FECINI = FECING;
    EXECUTE PROCEDURE periodo_nom_fechaf (:fecini, :periodicidad) returning_values (:perinicial, :anoini);
    END

/* tome el salario actual */
select first 1 MVSE_SALARIO, MVSE_FECHA, MVSE_FACSAL from MOVIMIENTO_SALARIO_EMPLEADO M
    where TERC_NIT = :NITEMP and MVSE_FECHA <= :FECFIN order by MVSE_FECHA desc into :BASICO, :FECHA2, :FACSAL;
if ((FACSAL IS NULL) or (FACSAL = 0))  then
    FACSAL = 100;
if ((VARIA = 'S') or (FECHA2 > FECINI))  then
    BEGIN
    /* EL CAMBIO OCURRIO EN MEDIO DEL PERIODO  O ES VARIABLE */
    /* SUME LO PAGADO POR SUELDO */
    for select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anofin
        and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :nitemp
        AND ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903) or (CONC_COD = 970) or (CONC_COD = 971)
        or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 974) or (CONC_COD = 980) or (CONC_COD = 981)
        OR (CONC_COD = 932) OR (CONC_COD = 975) OR (CONC_COD = 978)
        OR (CONC_COD = 997) OR (CONC_COD = 998) OR (CONC_COD = 999) OR (CONC_COD = 949) OR (CONC_COD = 950)
        OR (CONC_COD = 1000) OR (CONC_COD = 1001) OR (CONC_COD = 1002)
        OR (CONC_COD = 1003) OR (CONC_COD = 1004) OR (CONC_COD = 1005)
        OR (CONC_COD = 1006) OR (CONC_COD = 1007) OR (CONC_COD = 1008) OR (CONC_COD = 1011))
        INTO :MONTO
        DO
        BEGIN
        nomconc = 'SALARIO BASE';
        SUSPEND;
        END
    /* SUMA LOS DIAS DEL ULTIMO PERIODO SIN PAGAR */
    EXECUTE PROCEDURE dias_entre_nomina(fecult, FECFIN) returning_values (DIASSAL);
    MONTO = ((BASICO * DIASSAL /30) * (FACSAL / 100));
    select max(conc_cod) from empleado_conceptos EC where TERC_NIT = :nitemp
        AND ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903) or (CONC_COD = 970) or (CONC_COD = 971)
        or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 974) or (CONC_COD = 980) or (CONC_COD = 981))
        INTO :conc;
    nomconc = 'DIAS DE SALARIO PENDIENTES POR PAGAR';
    SUSPEND;

    EXECUTE PROCEDURE dias_entre_nomina(fecini, FECFIN) returning_values (DIASSAL);
    if (diassal <> 0) then
        SALARIO = SALARIO / DIASSAL;
    ELSE
        SALARIO = 0;
    END
ELSE
    BEGIN
    SALARIO = BASICO;
    SALARIO = SALARIO * FACSAL / 100;
    MONTO = SALARIO;
    NOMCONC = 'SALARIO FIJO';
    SUSPEND;
    END
if (SALARIO is null) then
    SALARIO = 0;
/* sume el auxilio de transporte */
if (TIPO <> 'V') then
    BEGIN
    if (exists (select terc_nit from empleado_conceptos e where terc_nit = :NITEMP and ((conc_cod = 955) or (conc_cod = 956) or (conc_cod = 957)))) then
        begin
        select paan_auxtr, paan_salminimo from parametros_ano where paan_ano = extract(year from :fecfin) into :auxtr, :smlv;
        execute procedure salario_base_empleado (:nitemp, :periodicidad, :anofin, :perfinal, :fecfin, 'S', 955) returning_values (:basicoaux);
        if (basicoaux < 2 * smlv) then
            BEGIN
            SALARIO = SALARIO + AUXTR;
            MONTO = AUXTR;
            CONC = 955;
            NOMCONC = 'AUXILIO TRANSPORTE';
            SUSPEND;
            END
        end
    END
if (VARIA = 'N') then
    BEGIN
    MONTO = 0;
    select SUM(NCOM_MONTO) FROM nomina_comisiones NC WHERE TERC_NIT = :nitemp AND
        NCOM_ANO = :anofin AND NCOM_PERIODO = :perfinal INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    NOMCONC = 'COMISIONES POR PAGAR DEL PERIODO ACTUAL';
    SUSPEND;
    /* SUME LOS CONCEPTOS QUE SIRVEN PARA PROMEDIOS */
    if (PERIODICIDAD = 1) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and e.emco_activo = 'S' and c.conc_activo = 'S' and terc_nit = :NITEMP
            INTO :MONTO;
        if (MONTO IS NULL) then
            MONTO = 0;
        NOMCONC = 'CONCEPTOS MONTO FIJO PERIODO ACTUAL';
        SUSPEND;
        END
    if (PERIODICIDAD = 2) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP and e.emco_activo = 'S' and c.conc_activo = 'S' AND E.emco_mensual = 'S'
            INTO :MONTO;
        if (MONTO IS NULL) then
            MONTO = 0;
        NOMCONC = 'CONCEPTOS MONTO FIJO MENSUAL PERIODO ACTUAL';
        SUSPEND;
        select SUM(EMCO_MONTO*2) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP and e.emco_activo = 'S' and c.conc_activo = 'S' AND E.emco_mensual = 'N'
            INTO :MONTO;
        if (MONTO IS NULL) then
            MONTO = 0;
        NOMCONC = 'CONCEPTOS MONTO FIJO QUINCENAL PERIODO ACTUAL';
        SUSPEND;
        END
    if (PERIODICIDAD = 3) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP and e.emco_activo = 'S' and c.conc_activo = 'S' AND E.emco_mensual = 'S'
            INTO :MONTO;
        if (MONTO IS NULL) then
            MONTO = 0;
        NOMCONC = 'CONCEPTOS MONTO FIJO MENSUAL PERIODO ACTUAL';
        SUSPEND;
        select SUM(EMCO_MONTO*4) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP and e.emco_activo = 'S' and c.conc_activo = 'S' AND E.emco_mensual = 'N'
            INTO :MONTO;
        if (MONTO IS NULL) then
            MONTO = 0;
        NOMCONC = 'CONCEPTOS MONTO FIJO PERIODO ACTUAL';
        SUSPEND;
        END
    END
else
    BEGIN
    /* PRIMERO OTROS CONCEPTOS DEL PERIODO ACTUAL */
    select SUM(NCOM_MONTO) FROM nomina_comisiones NC WHERE TERC_NIT = :nitemp AND
        NCOM_ANO = :anofin AND NCOM_PERIODO = :perfinal INTO :MONTO;
    CONC = 920;
    NOMCONC = 'COMISIONES SIN PAGAR PERIODO FINAL';
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        SUSPEND;
    select SUM(NH.noex_montorec) FROM nomina_horasext NH WHERE TERC_NIT = :nitemp AND
        NOEX_ANO = :anofin AND NH.noex_periodio = (:perfinal) INTO :MONTO;
    CONC = 953;
    NOMCONC = 'RECARGOS SIN PAGAR PERIODO FINAL';
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        SUSPEND;
    if ((TIPO <> 'V') or (INCHE = 'SI')) then
        BEGIN
        select SUM(NH.noex_monto) FROM nomina_horasext NH WHERE TERC_NIT = :nitemp AND
            NOEX_ANO = :anofin AND NH.noex_periodio = (:perfinal) INTO :MONTO;
        if (MONTO IS NULL) then
            MONTO = 0;
        if (MONTO <> 0) then
            BEGIN
            CONC = 900;
            NOMCONC = 'HORAS EXTRAS SIN PAGAR PERIODO FINAL';
            SUSPEND;
            END
        END
    /* los demas conceptos que aplican para el promedio */
    FOR select MAX(CONC_COD), sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_APLICAPROM = 'S' and
        N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anofin
        and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :nitemp
        and (N.CONC_COD <> 955) and (N.CONC_COD <> 956) and (N.CONC_COD <> 957)
        AND (CONC_COD <> 901) AND (CONC_COD <> 902) AND (CONC_COD <> 903)
        AND (CONC_COD <> 971) AND (CONC_COD <> 972) AND (CONC_COD <> 973)
        AND (CONC_COD <> 974) AND (CONC_COD <> 980) AND (CONC_COD <> 981)
        AND (CONC_COD <> 932) AND (CONC_COD <> 975) AND (CONC_COD <> 978)
        AND (CONC_COD <> 997) AND (CONC_COD <> 998) AND (CONC_COD <> 999) AND (CONC_COD <> 949)  AND (CONC_COD <> 950)
        AND (CONC_COD <> 1000) AND (CONC_COD <> 1001) AND (CONC_COD <> 1002)
        AND (CONC_COD <> 1003) AND (CONC_COD <> 1004) AND (CONC_COD <> 1005)
        AND (CONC_COD <> 1006) AND (CONC_COD <> 1007) AND (CONC_COD <> 1008) AND (CONC_COD <> 1011)
        GROUP BY CONC_COD
        into :CONC, :MONTO
        DO
        BEGIN
        if (MONTO IS NULL) then
            MONTO = 0;
        if (MONTO <> 0) then
            BEGIN
            SELECT CONC_NOMBRE FROM conceptos_nomina WHERE CONC_COD = :CONC INTO :nomconc;
            SUSPEND;
            END
        END

    /* CALCULAR EL PROMEDIO EN DIAS */
    execute procedure dias_entre_nomina(FECINI, fecfin) returning_values (:dias);
    LICNR = 0;
    SELECT SUM (ND.nnde_duracion) FROM nomina_novedades N, nomina_novedades_detalle ND
        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitemp AND ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
        AND N.nono_fecha >= :fecini AND N.nono_fecha <= :fecfin INTO :LICNR;
    if (LICNR IS NULL) then
        LICNR = 0;
    DIAS = DIAS - LICNR;
    if (DIAS < 30) then
        DIAS = 30;
    CONC = 0;
    MONTO = DIAS;
    NOMCONC = 'DIAS LABORADOS';
    SUSPEND;
    END
end^


ALTER PROCEDURE SALARIO_PROMEDIO_SIN_AUX (
    NITEMP VARCHAR(20),
    FECHA DATE,
    MESES INTEGER,
    VACAC CHAR(1))
RETURNS (
    SALARIO NUMERIC(18,2))
AS
declare variable PERIODICIDAD INTEGER;
declare variable NUMEROPROM INTEGER;
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable FECINI DATE;
declare variable FECING DATE;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable DIAS INTEGER;
declare variable VARIA CHAR(1);
declare variable COMISION NUMERIC(18,2);
declare variable OTROS NUMERIC(18,2);
declare variable NUMNOM INTEGER;
declare variable aprox integer;
declare variable FACSAL NUMERIC(9,2);
declare variable VALORPREDET NUMERIC(18,2);
begin
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
/* PROMEDIO EL ULTIMO AÃ‘O O SEIS MESES */
SELECT EMPL_PPAGO, EMPL_SALVAR, EMPL_FECING, EMPL_FACSAL FROM EMPLEADOS WHERE TERC_NIT = :nitemp
    INTO :periodicidad, :VARIA, :FECING, :FACSAL;
if ((FACSAL IS NULL) or (FACSAL = 0))  then
    FACSAL = 100;
COMISION = 0;
/* tome el salario actual */
select first 1 MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where TERC_NIT = :NITEMP and MVSE_FECHA <= :fecha
    order by MVSE_FECHA desc INTO :SALARIO;
if (SALARIO is null) then
    SALARIO = 0;
SALARIO = SALARIO * FACSAL / 100;
if (VARIA = 'N') then
    BEGIN
    EXECUTE PROCEDURE periodo_nom_fecha (:fecha, :periodicidad) returning_values (:perfinal, :anofin);
    select SUM(NCOM_MONTO) FROM nomina_comisiones NC WHERE TERC_NIT = :nitemp AND
        NCOM_ANO = :anofin AND NCOM_PERIODO = :perfinal INTO :comision;
    if (comision IS NULL) then
        COMISION = 0;
    SALARIO = SALARIO + COMISION;

    /* SUME LOS CONCEPTOS QUE SIRVEN PARA PROMEDIOS */
    if (PERIODICIDAD = 1) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP
            and (E.CONC_COD <> 955) and (E.CONC_COD <> 956) and (E.CONC_COD <> 957) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        END
    if (PERIODICIDAD = 2) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP AND E.emco_mensual = 'S'
            and (E.CONC_COD <> 955) and (E.CONC_COD <> 956) and (E.CONC_COD <> 957) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        select SUM(EMCO_MONTO*2) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP AND E.emco_mensual = 'N'
            and (E.CONC_COD <> 955) and (E.CONC_COD <> 956) and (E.CONC_COD <> 957) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        END
    if (PERIODICIDAD = 3) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP AND E.emco_mensual = 'S'
            and (E.CONC_COD <> 955) and (E.CONC_COD <> 956) and (E.CONC_COD <> 957) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        select SUM(EMCO_MONTO*4) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP AND E.emco_mensual = 'N'
            and (E.CONC_COD <> 955) and (E.CONC_COD <> 956) and (E.CONC_COD <> 957) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        END
    VALORPREDET = null;
    select SUM(VP.NVPR_MONTO) from NOMINA_VALOR_PREDET VP, conceptos_nomina CN where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and
        VP.NVPR_PERIODO = :perfinal and VP.NVPR_ANO = :anofin and VP.CONC_COD = CN.CONC_COD and
        VP.TERC_NIT = :nitemp AND CN.conc_salario = 'S'
        into :VALORPREDET;
    if (VALORPREDET is null) then
        VALORPREDET = 0;
    SALARIO = SALARIO + VALORPREDET;
    execute procedure redondee(SALARIO, :aprox) returning_values (SALARIO);
    suspend;
    END
else
    BEGIN
    /* PRIMERO EL SUELDO ACTUAL */
    EXECUTE PROCEDURE periodo_nom_fecha (:fecha, :periodicidad) returning_values (:perfinal, :anofin);
    select SUM(NCOM_MONTO) FROM nomina_comisiones NC WHERE TERC_NIT = :nitemp AND
        NCOM_ANO = :anofin AND NCOM_PERIODO = (:perfinal+1) INTO :comision;
    if (comision IS NULL) then
        COMISION = 0;
    select SUM(NH.noex_montorec) FROM nomina_horasext NH WHERE TERC_NIT = :nitemp AND
        NOEX_ANO = :anofin AND NH.noex_periodio = (:perfinal+1) INTO :OTROS;
    if (OTROS IS NULL) then
        OTROS = 0;
    COMISION = COMISION + OTROS;
    if (VACAC = 'N') then
        BEGIN
        select SUM(NH.noex_monto) FROM nomina_horasext NH WHERE TERC_NIT = :nitemp AND
            NOEX_ANO = :anofin AND NH.noex_periodio = (:perfinal+1) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        COMISION = COMISION + OTROS;
        END
    VALORPREDET = null;
    select SUM(VP.NVPR_MONTO) from NOMINA_VALOR_PREDET VP, conceptos_nomina CN where VP.NVPR_PERIODICIDAD = :PERIODICIDAD and
        VP.NVPR_PERIODO = :perfinal and VP.NVPR_ANO = :anofin and VP.CONC_COD = CN.CONC_COD and
        VP.TERC_NIT = :nitemp AND CN.conc_salario = 'S'
        into :VALORPREDET;
    if (VALORPREDET is null) then
        VALORPREDET = 0;
    COMISION = COMISION + VALORPREDET;
    /* AHORA EL PROMEDIO */
    /* AJUSTAR LOS MESES DEPENDIENDO DE LA FECHA DE INGRESO */
    if (periodicidad = 1) then
        numeroprom = MESES;
    if (periodicidad = 2) then
        numeroprom = MESES * 2;
    if (periodicidad = 3) then
        numeroprom = MESES * 4;

    if (perfinal < numeroprom) then
        BEGIN
        anoini = anofin - 1;
        if (periodicidad = 1) then
            perinicial = 12 - (numeroprom - perfinal) + 2;
        if (periodicidad = 2) then
            begin
            perinicial = 24 - (numeroprom - perfinal) + 2;
            if (mod(perinicial, 2) = 0) then
                perinicial = perinicial + 1;
            end
        if (periodicidad = 3) then
            perinicial = 52 - (numeroprom - perfinal) + 2;
        END
    ELSE
        BEGIN
        PERINICIAL = :perfinal - :NUMEROPROM + 1;
        anoini = ANOFIN;
        END
    if (MESES = 12) then
        FECINI = FECHA - 364;
    ELSE
        FECINI = FECHA - (MESES * 30);
    if (FECING > FECINI) then
        BEGIN
        FECINI = FECING;
        EXECUTE PROCEDURE periodo_nom_fechaf (:fecini, :periodicidad) returning_values (:perinicial, :anoini);
        END

    if (anoini <> anofin) then
        BEGIN
        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 = :nitemp
            and (N.CONC_COD <> 955) and (N.CONC_COD <> 956) and (N.CONC_COD <> 957)
            AND (CONC_COD <> 901) AND (CONC_COD <> 902) AND (CONC_COD <> 903) AND (CONC_COD <> 1011)
            AND (CONC_COD <> 971) AND (CONC_COD <> 972) AND (CONC_COD <> 973)
            AND (CONC_COD <> 974) AND (CONC_COD <> 980) AND (CONC_COD <> 981)
            AND (CONC_COD <> 932) AND (CONC_COD <> 975) AND (CONC_COD <> 978)
            AND (CONC_COD <> 997) AND (CONC_COD <> 998) AND (CONC_COD <> 999)
            AND (CONC_COD <> 1000) AND (CONC_COD <> 1001) AND (CONC_COD <> 1002)
            AND (CONC_COD <> 1003) AND (CONC_COD <> 1004) AND (CONC_COD <> 1005)
            AND ((:VACAC = 'N') or ((CONC_COD <> 945) AND (CONC_COD <> 931) AND (CONC_COD <> 900)))
            into :OTROS;
        END
    else
        BEGIN
        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 = :nitemp
            and (N.CONC_COD <> 955) and (N.CONC_COD <> 956) and (N.CONC_COD <> 957)
            AND (CONC_COD <> 901) AND (CONC_COD <> 902) AND (CONC_COD <> 903) AND (CONC_COD <> 1011)
            AND (CONC_COD <> 971) AND (CONC_COD <> 972) AND (CONC_COD <> 973)
            AND (CONC_COD <> 974) AND (CONC_COD <> 980) AND (CONC_COD <> 981)
            AND (CONC_COD <> 932) AND (CONC_COD <> 975) AND (CONC_COD <> 978)
            AND (CONC_COD <> 997) AND (CONC_COD <> 998) AND (CONC_COD <> 999)
            AND (CONC_COD <> 1000) AND (CONC_COD <> 1001) AND (CONC_COD <> 1002)
            AND (CONC_COD <> 1003) AND (CONC_COD <> 1004) AND (CONC_COD <> 1005)
            AND ((:VACAC = 'N') or ((CONC_COD <> 945) AND (CONC_COD <> 931) AND (CONC_COD <> 900)))
            into :OTROS;
        END
    if (OTROS is null) then
        OTROS = 0;
    OTROS = OTROS + COMISION;

    /* CALCULAR EL PROMEDIO EN DIAS */
    execute procedure dias_entre_nomina(FECINI, FECHA) returning_values (:dias);
    if (DIAS < 30) then
        DIAS = 30;
    OTROS = OTROS * 30 / DIAS;

    SALARIO = SALARIO + OTROS;
    execute procedure redondee(SALARIO, :aprox) returning_values (SALARIO);
    suspend;
    END
end^


ALTER PROCEDURE SALARIO_PROMEDIO_VACACIONES (
    NITEMP VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    LIQUIDA CHAR(1))
RETURNS (
    SALARIO NUMERIC(18,2))
AS
declare variable PERIODICIDAD integer;
declare variable PERINICIAL integer;
declare variable PERFINAL integer;
declare variable FECULT date;
declare variable FECING date;
declare variable ANOINI integer;
declare variable ANOFIN integer;
declare variable DIAS integer;
declare variable VARIA char(1);
declare variable basico numeric(18,2);
declare variable COMISION numeric(18,2);
declare variable OTROS numeric(18,2);
declare variable APROX integer;
declare variable FACSAL numeric(9,2);
declare variable INCHE char(2);
declare variable LICNR integer;
begin
execute procedure LEE_CONFIGURACION('NOMINA','GENERAL','REDONDEO AL MULTIPLO DE DIEZ EN TOTALES')returning_values(:APROX);
execute procedure LEE_CONFIGURACION('NOMINA','LIQUIDACION','INCLUIR HORAS EXTRAS EN BASE PARA LIQUIDACION DE VACACIONES EN LIQUIDACION DEFINITIVA')returning_values(:INCHE);
/* PROMEDIO EL ULTIMO A? O SEIS MESES */
SELECT EMPL_PPAGO, EMPL_SALVAR, EMPL_FECING, EMPL_FACSAL FROM EMPLEADOS WHERE TERC_NIT = :nitemp
    INTO :periodicidad, :VARIA, :FECING, :FACSAL;
if ((FACSAL IS NULL) or (FACSAL = 0))  then
    FACSAL = 100;
EXECUTE PROCEDURE periodo_nom_fechaf (:fecfin, :periodicidad) returning_values (:perfinal, :anofin);
EXECUTE PROCEDURE fecha_inicial_periodo_pago (:periodicidad, anofin, :perfinal) returning_values (:fecult);
if (FECING > FECINI) then
    FECINI = FECING;
EXECUTE PROCEDURE periodo_nom_fechaf (:fecini, :periodicidad) returning_values (:perinicial, :anoini);
COMISION = 0;
/* tome el salario actual */
select first 1 MVSE_SALARIO from MOVIMIENTO_SALARIO_EMPLEADO M where TERC_NIT = :NITEMP and MVSE_FECHA <= :fecfin
    order by MVSE_FECHA desc INTO :basico;
if (basico is null) then
    basico = 0;
SALARIO = BASICO * FACSAL / 100;
if (VARIA = 'N') then
    BEGIN
    EXECUTE PROCEDURE periodo_nom_fecha (:fecfin, :periodicidad) returning_values (:perfinal, :anofin);
    select SUM(NCOM_MONTO) FROM nomina_comisiones NC WHERE TERC_NIT = :nitemp AND
        NCOM_ANO = :anofin AND NCOM_PERIODO = :perfinal INTO :comision;
    if (comision IS NULL) then
        COMISION = 0;
    SALARIO = SALARIO + COMISION;

    /* SUME LOS CONCEPTOS QUE SIRVEN PARA PROMEDIOS */
    if (PERIODICIDAD = 1) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP
            and (E.CONC_COD <> 955) and (E.CONC_COD <> 956) and (E.CONC_COD <> 957) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        END
    if (PERIODICIDAD = 2) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP AND E.emco_mensual = 'S'
            and (E.CONC_COD <> 955) and (E.CONC_COD <> 956) and (E.CONC_COD <> 957) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        select SUM(EMCO_MONTO*2) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP AND E.emco_mensual = 'N'
            and (E.CONC_COD <> 955) and (E.CONC_COD <> 956) and (E.CONC_COD <> 957) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        END
    if (PERIODICIDAD = 3) then
        BEGIN
        select SUM(EMCO_MONTO) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP AND E.emco_mensual = 'S'
            and (E.CONC_COD <> 955) and (E.CONC_COD <> 956) and (E.CONC_COD <> 957) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        select SUM(EMCO_MONTO*4) from empleado_conceptos e, conceptos_nomina c
            where e.conc_cod = c.conc_cod and c.conc_aplicaprom = 'S' and terc_nit = :NITEMP AND E.emco_mensual = 'N'
            and (E.CONC_COD <> 955) and (E.CONC_COD <> 956) and (E.CONC_COD <> 957) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        SALARIO = SALARIO + OTROS;
        END
    execute procedure redondee(SALARIO, :aprox) returning_values (SALARIO);
    suspend;
    END
else
    BEGIN
    /* EL CAMBIO OCURRIO EN MEDIO DEL PERIODO  O ES VARIABLE */
    /* SUME LO PAGADO POR SUELDO */
    select sum (NOCO_VALOR) from NOMINA_CONCEPTOS N where N.NOCO_PERIODO >= :PERINICIAL and N.NOCO_ANO = :anofin
        and N.NOCO_PERIODO <= :perfinal and TERC_NIT = :nitemp
        AND ((CONC_COD = 901) or (CONC_COD = 902) or (CONC_COD = 903) or (CONC_COD = 970) or (CONC_COD = 971)
        or (CONC_COD = 972) or (CONC_COD = 973) or (CONC_COD = 974) or (CONC_COD = 980) or (CONC_COD = 981)
        OR (CONC_COD = 932) OR (CONC_COD = 975) OR (CONC_COD = 978)
        OR (CONC_COD = 997) OR (CONC_COD = 998) OR (CONC_COD = 999) OR (CONC_COD = 949) OR (CONC_COD = 950)
        OR (CONC_COD = 1000) OR (CONC_COD = 1001) OR (CONC_COD = 1002)
        OR (CONC_COD = 1003) OR (CONC_COD = 1004) OR (CONC_COD = 1005)
        OR (CONC_COD = 1006) OR (CONC_COD = 1007) OR (CONC_COD = 1008) OR (CONC_COD = 1011))
        INTO :SALARIO;
    /* SUMA LOS DIAS DEL ULTIMO PERIODO SIN PAGAR */
    EXECUTE PROCEDURE dias_entre_nomina(fecult, fecfin) returning_values (DIAS);
    SALARIO = SALARIO + ((BASICO * DIAS /30) * (FACSAL / 100));

    EXECUTE PROCEDURE dias_entre_nomina(fecini, fecfin) returning_values (DIAS);
    SELECT SUM (ND.nnde_duracion) FROM nomina_novedades N, nomina_novedades_detalle ND
        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitemp AND ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
        AND N.nono_fecha >= :fecini AND N.nono_fecha <= :fecfin INTO :LICNR;
    if (LICNR IS NULL) then
        LICNR = 0;
    DIAS = DIAS - LICNR;
    if (dias <> 0) then
        SALARIO = (SALARIO / DIAS) * 30;
    ELSE
        SALARIO = 0;
    /* PRIMERO OTROS CONCEPTOS DEL PERIODO ACTUAL */
    EXECUTE PROCEDURE periodo_nom_fecha (:fecfin, :periodicidad) returning_values (:perfinal, :anofin);
    select SUM(NCOM_MONTO) FROM nomina_comisiones NC WHERE TERC_NIT = :nitemp AND
        NCOM_ANO = :anofin AND NCOM_PERIODO = (:perfinal+1) INTO :comision;
    if (comision IS NULL) then
        COMISION = 0;
    select SUM(NH.noex_montorec) FROM nomina_horasext NH WHERE TERC_NIT = :nitemp AND
        NOEX_ANO = :anofin AND NH.noex_periodio = (:perfinal+1) INTO :OTROS;
    if (OTROS IS NULL) then
        OTROS = 0;
    COMISION = COMISION + OTROS;
    if ((LIQUIDA = 'S') AND (INCHE = 'SI')) then
        BEGIN
        select SUM(NH.noex_monto) FROM nomina_horasext NH WHERE TERC_NIT = :nitemp AND
            NOEX_ANO = :anofin AND NH.noex_periodio = (:perfinal+1) INTO :OTROS;
        if (OTROS IS NULL) then
            OTROS = 0;
        COMISION = COMISION + OTROS;
        END
    /* AHORA EL PROMEDIO */
    if (anoini <> anofin) then
        BEGIN
        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 = :nitemp
            and (N.CONC_COD <> 955) and (N.CONC_COD <> 956) and (N.CONC_COD <> 957)
            AND (CONC_COD <> 901) AND (CONC_COD <> 902) AND (CONC_COD <> 903)
            AND (CONC_COD <> 971) AND (CONC_COD <> 972) AND (CONC_COD <> 973)
            AND (CONC_COD <> 974) AND (CONC_COD <> 980) AND (CONC_COD <> 981)
            AND (CONC_COD <> 932) AND (CONC_COD <> 975) AND (CONC_COD <> 978)
            AND (CONC_COD <> 997) AND (CONC_COD <> 998) AND (CONC_COD <> 999) AND (CONC_COD <> 949)  AND (CONC_COD <> 950)
            AND (CONC_COD <> 1000) AND (CONC_COD <> 1001) AND (CONC_COD <> 1002)
            AND (CONC_COD <> 1003) AND (CONC_COD <> 1004) AND (CONC_COD <> 1005)
            AND (CONC_COD <> 1006) AND (CONC_COD <> 1007) AND (CONC_COD <> 1008) AND (CONC_COD <> 1011)
            AND (((:LIQUIDA = 'S') AND (:INCHE = 'SI')) or ((CONC_COD <> 945) AND (CONC_COD <> 931) AND (CONC_COD <> 900)))
            into :OTROS;
        END
    else
        BEGIN
        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 = :nitemp
            and (N.CONC_COD <> 955) and (N.CONC_COD <> 956) and (N.CONC_COD <> 957)
            AND (CONC_COD <> 901) AND (CONC_COD <> 902) AND (CONC_COD <> 903)
            AND (CONC_COD <> 971) AND (CONC_COD <> 972) AND (CONC_COD <> 973)
            AND (CONC_COD <> 974) AND (CONC_COD <> 980) AND (CONC_COD <> 981)
            AND (CONC_COD <> 932) AND (CONC_COD <> 975) AND (CONC_COD <> 978)
            AND (CONC_COD <> 997) AND (CONC_COD <> 998) AND (CONC_COD <> 999) AND (CONC_COD <> 949)  AND (CONC_COD <> 950)
            AND (CONC_COD <> 1000) AND (CONC_COD <> 1001) AND (CONC_COD <> 1002)
            AND (CONC_COD <> 1003) AND (CONC_COD <> 1004) AND (CONC_COD <> 1005)
            AND (CONC_COD <> 1006) AND (CONC_COD <> 1007) AND (CONC_COD <> 1008) AND (CONC_COD <> 1011)
            AND (((:LIQUIDA = 'S') AND (:INCHE = 'SI')) or ((CONC_COD <> 945) AND (CONC_COD <> 931) AND (CONC_COD <> 900)))
            into :OTROS;
        END
    if (OTROS is null) then
        OTROS = 0;
    OTROS = OTROS + COMISION;

    /* CALCULAR EL PROMEDIO EN DIAS */
    execute procedure dias_entre_nomina(FECINI, FECFIN) returning_values (:dias);
    LICNR = 0;
    SELECT SUM (ND.nnde_duracion) FROM nomina_novedades N, nomina_novedades_detalle ND
        WHERE N.nono_id = ND.nono_id AND N.TERC_NIT = :nitemp AND ((N.TNOV_COD = 9) or (N.TNOV_COD = 13))
        AND N.nono_fecha >= :fecini AND N.nono_fecha <= :fecfin INTO :LICNR;
    if (LICNR IS NULL) then
        LICNR = 0;
    DIAS = DIAS - LICNR;
    if (DIAS < 30) then
        DIAS = 30;
    OTROS = OTROS * 30 / DIAS;

    SALARIO = SALARIO + OTROS;
    execute procedure redondee(SALARIO, :aprox) returning_values (SALARIO);
    suspend;
    END
end^


ALTER PROCEDURE SALDO_ACTIVO (
    CUENTA VARCHAR(20),
    ACTIVO VARCHAR(15),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
SELECT first 1 SAAC_SALDO+SAAC_DEBITOS-SAAC_CREDITOS FROM saldos_activo
    WHERE (CUEN_COD = :CUENTA) AND (ACFJ_COD = :activo) AND (SAAC_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, ACFJ_COD DESC, SAAC_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^


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^


ALTER PROCEDURE SALDO_ACTIVO_NIIF (
    CUENTA VARCHAR(20),
    ACTIVO VARCHAR(15),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
SELECT first 1 SAAC_SALDO+SAAC_DEBITOS-SAAC_CREDITOS FROM saldos_activo_NIIF
    WHERE (CUEN_COD = :CUENTA) AND (ACFJ_COD = :activo) AND (SAAC_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, ACFJ_COD DESC, SAAC_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_ARTICULO (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
SELECT FIRST 1 (SAAR_SALDO+SAAR_DEBITOS-SAAR_CREDITOS) FROM SALDOS_ARTICULO
    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTICULO) AND (SAAR_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, ARTI_COD DESC, SAAR_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_ARTICULO_MES (
    CUENTA VARCHAR(20),
    ARTICULO 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 (SAAR_SALDO+SAAR_DEBITOS-SAAR_CREDITOS) FROM SALDOS_ARTICULO
    WHERE CUEN_COD = :CUENTA AND ARTI_COD = :ARTICULO AND SAAR_FECHA <= :FECAUX
    ORDER BY CUEN_COD DESC, ARTI_COD DESC, SAAR_FECHA DESC
    INTO SALDO;
IF (SALDO IS NULL) THEN
    SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_ARTICULO_NIIF (
    CUENTA VARCHAR(20),
    ARTICULO VARCHAR(15),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
SELECT FIRST 1 (SAAR_SALDO+SAAR_DEBITOS-SAAR_CREDITOS) FROM SALDOS_ARTICULO_NIIF
    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTICULO) AND (SAAR_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, ARTI_COD DESC, SAAR_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_CENTRO (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
SELECT FIRST 1 (SACE_SALDO + SACE_DEBITO - SACE_CREDITO) FROM SALDOS_CENTROS
    WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA <= :FECHA)
    ORDER BY CUEN_COD desc,  PROY_COD DESC, CENT_COD desc,  SACU_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_CENTRO_MES (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FECAUX CHAR(8);
declare variable LG INTEGER;
declare variable CUENTAUX VARCHAR(20);
declare variable SALDOAUX NUMERIC(18,2);
BEGIN
LG = STRLEN(CUENTA);
IF (INICIAL = 'N') THEN
  MES = MES + 1;
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECAUX);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECAUX, -1) RETURNING_VALUES (FECAUX);
SALDO = 0;
FOR SELECT DISTINCT CUEN_COD FROM SALDOS_CENTROS WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO INTO :CUENTAUX
    DO
    BEGIN
    saldoaux = 0;
    SELECT FIRST 1 (SACE_SALDO+SACE_DEBITO-SACE_CREDITO) FROM SALDOS_CENTROS
        WHERE CUEN_COD = :CUENTAUX AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND SACU_FECHA <= :FECAUX
        ORDER BY CUEN_COD DESC, PROY_COD DESC, CENT_COD DESC, SACU_FECHA DESC
        INTO SALDOAUX;
    IF (SALDOAUX IS NULL) THEN
        SALDOAUX = 0;
    SALDO = SALDO + SALDOAUX;
    END
SUSPEND;
END^


ALTER PROCEDURE SALDO_CENTRO_MES_NIIF (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FECAUX CHAR(8);
declare variable LG INTEGER;
declare variable CUENTAUX VARCHAR(20);
declare variable SALDOAUX NUMERIC(18,2);
BEGIN
LG = STRLEN(CUENTA);
IF (INICIAL = 'N') THEN
  MES = MES + 1;
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECAUX);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECAUX, -1) RETURNING_VALUES (FECAUX);
SALDO = 0;
FOR SELECT DISTINCT CUEN_COD FROM saldos_centros_niif WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO INTO :CUENTAUX
    DO
    BEGIN
    SALDOAUX = 0;
    SELECT FIRST 1 (SACE_SALDO+SACE_DEBITO-SACE_CREDITO) FROM saldos_centros_niif
        WHERE CUEN_COD = :CUENTAUX AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND SACU_FECHA <= :FECAUX
        ORDER BY CUEN_COD DESC, PROY_COD DESC, CENT_COD DESC, SACU_FECHA DESC
        INTO SALDOAUX;
    IF (SALDOAUX IS NULL) THEN
        SALDOAUX = 0;
    SALDO = SALDO + SALDOAUX;
    END
SUSPEND;
END^


ALTER PROCEDURE SALDO_CENTRO_NIIF (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
SELECT FIRST 1 (SACE_SALDO + SACE_DEBITO - SACE_CREDITO) FROM SALDOS_CENTROS_NIIF
    WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA <= :FECHA)
    ORDER BY CUEN_COD desc,  PROY_COD DESC, CENT_COD desc,  SACU_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_CENTRO_TERCERO (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    NIT VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
SELECT FIRST 1 (SACT_SALDO + SACT_DEBITO - SACT_CREDITO) FROM SALDOS_CENTROS_TERCERO
    WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, PROY_COD DESC, CENT_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_CENTRO_TERCERO_NIIF (
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    NIT VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
SELECT FIRST 1 (SACT_SALDO + SACT_DEBITO - SACT_CREDITO) FROM SALDOS_CENTROS_TERCERO_NIIF
    WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, PROY_COD DESC, CENT_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^


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^


ALTER PROCEDURE SALDO_CLIENTE_FAC (
    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;
declare variable VALCUPO CHAR(1);
BEGIN
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
    if (TIPODOC = 31) then
        BEGIN
        VALCUPO = NULL;
        SELECT FIRST 1 e.evve_cupo from eventos_ventas e where exists (select cofa_item from
            facturas f, consolidado_faltantes c, pedidos p
            where fact_id = :iddoc and f.fact_consolida = c.cofa_id and c.cofa_tipoori = 34 and c.cofa_tipodes = 31 and
            c.cofa_idori = p.pedi_id and p.pedi_evento = e.evve_id and c.cofa_cantcr <> 0)
            into :valcupo;
        if (VALCUPO IS NULL) then
            VALCUPO = 'S';
        END
    else
        VALCUPO = 'S';
    if (VALCUPO = 'S') then
        begin
        EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECHA, MONEDA) returning_values (SAL);
        if (SAL <> 0) then
            SALDO = SALDO + SAL;
        end
    END
SUSPEND;
END^


ALTER PROCEDURE SALDO_CLIENTE_SUCURSAL (
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    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_sucursal = :sucursal 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^


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


ALTER PROCEDURE SALDO_CUENTA_BANCO (
    CUENTA INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FEC DATE;
BEGIN
/* Busca la fecha del Ãºltimo movimiento de la cuenta antes de la fecha */
SELECT  MAX(SABA_FECHA) FROM SALDO_BANCOS
  WHERE (CUBA_COD = :CUENTA) AND (SABA_FECHA <= :FECHA) INTO :FEC;
IF (FEC IS NULL) THEN
  SALDO = 0;
ELSE
  if (FEC = FECHA) then
    SELECT SABA_SALDO FROM SALDO_BANCOS
        WHERE (CUBA_COD = :CUENTA) AND (SABA_FECHA = :FEC) INTO :SALDO;
  ELSE
    /* Con la fecha mÃ¡xima calcule el nuevo saldo */
    SELECT (SABA_SALDO + SABA_DEBITOS - SABA_CREDITOS) FROM SALDO_BANCOS
        WHERE (CUBA_COD = :CUENTA) AND (SABA_FECHA = :FEC) INTO :SALDO;
SUSPEND;
END^


ALTER PROCEDURE SALDO_CUENTA_BANCO_CONF (
    CUENTA INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FEC DATE;
BEGIN
/* Busca la fecha del Ãºltimo movimiento de la cuenta antes de la fecha */
SELECT  MAX(SABA_FECHA) FROM SALDO_BANCOS_CONF
  WHERE (CUBA_COD = :CUENTA) AND (SABA_FECHA <= :FECHA) INTO :FEC;
IF (FEC IS NULL) THEN
  SALDO = 0;
ELSE
  if (FEC = FECHA) then
    SELECT SABA_SALDO FROM SALDO_BANCOS_CONF
        WHERE (CUBA_COD = :CUENTA) AND (SABA_FECHA = :FEC) INTO :SALDO;
  ELSE
    /* Con la fecha mÃ¡xima calcule el nuevo saldo */
    SELECT (SABA_SALDO + SABA_DEBITOS - SABA_CREDITOS) FROM SALDO_BANCOS_CONF
        WHERE (CUBA_COD = :CUENTA) AND (SABA_FECHA = :FEC) INTO :SALDO;
SUSPEND;
END^


ALTER PROCEDURE SALDO_CUENTA_MES (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FECAUX CHAR(8);
BEGIN
IF (INICIAL = 'N') THEN
  MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECAUX);
EXECUTE PROCEDURE saldo_cuenta(CUENTA, FECAUX) RETURNING_VALUES (SALDO);
SUSPEND;
END^


ALTER PROCEDURE SALDO_CUENTA_MES_NIIF (
    CUENTA VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FECAUX CHAR(8);
BEGIN
IF (INICIAL = 'N') THEN
  MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECAUX);
EXECUTE PROCEDURE saldo_cuenta_niif(CUENTA, FECAUX) RETURNING_VALUES (SALDO);
SUSPEND;
END^


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


ALTER PROCEDURE SALDO_CUENTAF (
    CUENTA VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE AUX VARCHAR(20);
DECLARE VARIABLE SALDOAUX numeric(18,2);
declare variable FEC CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
SALDO = 0;
CTAFIN = CUENTA || '999999';
FOR SELECT cuen_cod FROM CUENTAS WHERE cuen_cod >= :CUENTA AND CUEN_COD <= :CTAFIN and CUEN_AFECTABLE = 'S'
    INTO :AUX
    DO
    BEGIN
    SELECT first 1 SACU_FECHA, sacu_saldo + SACU_DEBITO - SACU_CREDITO FROM SALDOS_CUENTAS
        WHERE (CUEN_COD = :aux) AND (SACU_FECHA <= :FECHA) order by cuen_cod desc, sacu_fecha desc
    INTO :FEC, :saldoaux;
    IF (FEC IS NULL) THEN
        SALDOAUX = 0;
    if (saldoaux IS NULL) then
        SALDOAUX = 0;
    SALDO = SALDO + saldoaux;
    END
SUSPEND;
END^


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 AUTORCREE VARCHAR(10);
declare variable FAUTORCREE 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);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
/* BUSQUE LA 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 (FAUTORCREE <= 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_RTIVA-SDCA_RTICA-SDCA_RCREE) 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-SDCA_ABRCREE) FROM saldos_doc_cartera
                WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
ELSE
    if (FAUTORCREE <= FECDOC) then
        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;
    else
        if (DESC_RTES = 'SI') then
            SELECT sum(SDCA_MONTO-SDCA_ABONO-SDCA_RTFTE-SDCA_RTIVA-SDCA_RTICA-SDCA_RCREE) 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-SDCA_ABRCREE) FROM saldos_doc_cartera
                WHERE (SDCA_TIPOREF = :TIPO) AND (SDCA_IDREF = :ID) AND (SDCA_FECHA <= :FECHA) INTO :SALDO;
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
if (SALDO IS NULL) then
    SALDO = 0;
SUSPEND;
END^


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-SDCP_RCREE) 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_ABRCREE) 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^


ALTER PROCEDURE SALDO_EN_CAJA (
    CAJA INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FEC DATE;
BEGIN
/* Busca la fecha del Ãºltimo movimiento de la caja antes de la fecha */
SELECT  MAX(SACA_FECHA) FROM SALDO_CAJA
  WHERE (CAJA_ID = :CAJA) AND (SACA_FECHA <= :FECHA) INTO :FEC;
IF (FEC IS NULL) THEN
  SALDO = 0;
ELSE
  if (FEC = FECHA) then
    SELECT SACA_SALDO FROM SALDO_CAJA
        WHERE (CAJA_ID = :CAJA) AND (SACA_FECHA = :FEC) INTO :SALDO;
  ELSE
    /* Con la fecha mÃ¡xima calcule el nuevo saldo */
    SELECT (SACA_SALDO + SACA_DEBITOS - SACA_CREDITOS) FROM SALDO_CAJA
        WHERE (CAJA_ID = :CAJA) AND (SACA_FECHA = :FEC) INTO :SALDO;
SUSPEND;
END^


ALTER PROCEDURE SALDO_EN_EFECTIVO (
    CAJA INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
declare variable FECAUX DATE;
BEGIN
SELECT SAEF_SALDO FROM SALDO_EFECTIVO
    WHERE SAEF_FECHA = :FECHA AND CAJA_ID = :CAJA INTO :SALDO;
if (SALDO IS NULL) then
    BEGIN
    SELECT MIN(SAEF_FECHA) FROM SALDO_EFECTIVO
        WHERE SAEF_FECHA > :FECHA AND CAJA_ID = :CAJA INTO :FECAUX;
    if (FECAUX IS NOT NULL) then
        SELECT SAEF_SALDO FROM SALDO_EFECTIVO
            WHERE SAEF_FECHA = :FECAUX AND CAJA_ID = :CAJA INTO :SALDO;
    END
if (SALDO IS NULL) then
    BEGIN
    SELECT MAX(SAEF_FECHA) FROM SALDO_EFECTIVO
        WHERE SAEF_FECHA < :FECHA AND CAJA_ID = :CAJA INTO :FECHA;
    if (FECHA IS NULL) then
        SALDO = 0;
    ELSE
        SELECT (SAEF_SALDO + SAEF_DEBITOS - SAEF_CREDITOS)
            FROM SALDO_EFECTIVO WHERE SAEF_FECHA = :FECHA AND
            CAJA_ID = :CAJA INTO :SALDO;
    END
SUSPEND;
END^


ALTER PROCEDURE SALDO_FINAL_CAJA (
    CAJA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FEC DATE;
BEGIN
/* Busca la fecha del Ãºltimo movimiento de la cuenta antes de la fecha */
SELECT  MAX(SACA_FECHA) FROM SALDO_CAJA
  WHERE (CAJA_ID = :CAJA) INTO :FEC;
IF (FEC IS NULL) THEN
  SALDO = 0;
ELSE
  /* Con la fecha mÃ¡xima calcule el nuevo saldo */
  SELECT (SACA_SALDO + SACA_DEBITOS - SACA_CREDITOS) FROM SALDO_CAJA
    WHERE (CAJA_ID = :CAJA) AND (SACA_FECHA = :FEC) INTO :SALDO;
SUSPEND;
END^


ALTER PROCEDURE SALDO_FINAL_CUENTA_BANCO (
    CUENTA INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FEC DATE;
BEGIN
/* Busca la fecha del Ãºltimo movimiento de la cuenta antes de la fecha */
SELECT  MAX(SABA_FECHA) FROM SALDO_BANCOS
  WHERE (CUBA_COD = :CUENTA) INTO :FEC;
IF (FEC IS NULL) THEN
  SALDO = 0;
ELSE
  /* Con la fecha mÃ¡xima calcule el nuevo saldo */
  SELECT (SABA_SALDO + SABA_DEBITOS - SABA_CREDITOS) FROM SALDO_BANCOS
    WHERE (CUBA_COD = :CUENTA) AND (SABA_FECHA = :FEC) INTO :SALDO;
SUSPEND;
END^


ALTER PROCEDURE SALDO_FORMA_PAGO (
    CAJA INTEGER,
    FORMAP INTEGER,
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
declare variable TIPOENT INTEGER;
declare variable TIPOSAL INTEGER;
declare variable IDDOC INTEGER;
declare variable IDSAL INTEGER;
declare variable MONTO NUMERIC(18,2);
declare variable FECREC DATE;
declare variable OK CHAR(1);
begin
SALDO = 0;
FOR SELECT DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL
    FROM DOCUMENTOS_PAGO_CAJA D
    WHERE D.FOPA_ID = :formap AND D.CAJA_ID = :caja AND D.FOPA_ID <> 1 AND DPCA_MONTO <> 0
    ORDER BY DPCA_FECHA
    INTO :MONTO, :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 = :caja
        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 = :caja
                INTO :FECREC;
                if (FECREC > FECHA) then
                    OK = 'S';
            END
        END
    if (OK = 'S') then
        SALDO = SALDO + MONTO;
    END
suspend;
end^


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^


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^


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 B WHERE BODE_ACTIVA = 'S' and
        exists (select exis_fecha from existencia where arti_cod = :articulo and bode_cod = b.bode_cod)
    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^


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^


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^


ALTER PROCEDURE SALDO_LOTE_FECHA (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    LOTE VARCHAR(15),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
begin
/* SUME LOS MOVIMIENTOS DE FECHA ANTERIOR O IGUAL A LA DE HOY */
SELECT SUM(EXLO_ENT-EXLO_SAL) FROM EXISTENCIA_LOTE WHERE (ARTI_COD = :ARTICULO) AND (BODE_COD = :BODEGA) AND (LOTE_NRO = :LOTE)
    AND EXLO_FECHA <= :FECHA INTO :SALDO;
if (SALDO is null) then
    SALDO = 0;
SUSPEND;
end^


ALTER PROCEDURE SALDO_LOTES_FECHA (
    ARTICULO VARCHAR(15),
    BODEGA VARCHAR(2),
    FECHA DATE)
RETURNS (
    LOTE VARCHAR(15),
    SALDO NUMERIC(18,4),
    VENCE DATE)
AS
begin
/* Muestra los lotes del artÃ­culo con existencia esa fecha */
for select L.lote_nro, LOTE_VENCE
    from LOTES L where ARTI_COD = :articulo and BODE_COD = :bodega
    into :LOTE, :vence
    do
    begin
    execute procedure saldo_lote_fecha(:articulo, :bodega,  :lote,  :fecha) returning_values (:saldo);
    if (saldo <> 0) then
      suspend;
    end
end^


ALTER PROCEDURE SALDO_PRESTAMO (
    ID INTEGER)
RETURNS (
    SALDO NUMERIC(18,2))
AS
begin
SELECT SUM(PRCU_MONTO-PRCU_ABONO) FROM prestamo_cuotas WHERE PRNO_ID = :id INTO :SALDO;
if (saldo is null) then
    saldo = 0;
suspend;
end^


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^


ALTER PROCEDURE SALDO_TERCERO (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
SELECT FIRST 1 (SATE_SALDO+SATE_DEBITO-SATE_CREDITO) FROM SALDOS_TERCEROS
    WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_TERCERO_FECHA (
    ARTICULO VARCHAR(15),
    NIT VARCHAR(20),
    CODSUC VARCHAR(10),
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,4))
AS
begin
/* SUME LOS MOVIMIENTOS DE FECHA ANTERIOR O IGUAL A LA DE HOY */
SELECT FIRST 1 EXTE_SALDO+EXTE_ENTR-EXTE_SAL FROM existencia_tercero
    WHERE (ARTI_COD = :ARTICULO) AND (TERC_NIT = :NIT) AND (CLSU_COD = :CODSUC)
    AND EXTE_FECHA <= :FECHA ORDER BY EXTE_FECHA DESC
    INTO :SALDO;
if (SALDO is null) then
    SALDO = 0;
else
    SALDO = SALDO * -1;
SUSPEND;
end^


ALTER PROCEDURE SALDO_TERCERO_MES (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FECAUX CHAR(8);
DECLARE VARIABLE FECINI CHAR(8);
DECLARE VARIABLE ANOINI CHAR(4);
DECLARE VARIABLE MESINI CHAR(2);
BEGIN
IF (INICIAL = 'N') THEN
  MES = MES + 1;
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECAUX);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECAUX, -1) RETURNING_VALUES (FECAUX);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÃ‘O DE INICIO') RETURNING_VALUES (:ANOINI);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (:MESINI);
execute procedure compone_fecha_conta (:ANOINI, CAST(:MESINI AS INTEGER), 1) returning_values (:FECINI);
if (FECAUX >= FECINI) then
    SELECT FIRST 1 (SATE_SALDO+SATE_DEBITO-SATE_CREDITO) FROM SALDOS_TERCEROS
        WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND SACU_FECHA <= :FECAUX
        ORDER BY CUEN_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
        INTO SALDO;
ELSE
    SELECT SATE_SALDO FROM SALDOS_TERCEROS
        WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND SACU_FECHA = :FECINI
        ORDER BY CUEN_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
        INTO SALDO;
IF (SALDO IS NULL) THEN
    SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_TERCERO_MES_NIIF (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    ANO CHAR(4),
    MES INTEGER,
    INICIAL CHAR(1))
RETURNS (
    SALDO NUMERIC(18,2))
AS
DECLARE VARIABLE FECAUX CHAR(8);
DECLARE VARIABLE FECINI CHAR(8);
DECLARE VARIABLE ANOINI CHAR(4);
DECLARE VARIABLE MESINI CHAR(2);
BEGIN
IF (INICIAL = 'N') THEN
  MES = MES + 1;
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECAUX);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECAUX, -1) RETURNING_VALUES (FECAUX);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÃ‘O BALANCE DE APERTURA NIIF') RETURNING_VALUES (:ANOINI);
MESINI = 1;
execute procedure compone_fecha_conta (:ANOINI, CAST(:MESINI AS INTEGER), 1) returning_values (:FECINI);
if (FECAUX >= FECINI) then
    SELECT FIRST 1 (SATE_SALDO+SATE_DEBITO-SATE_CREDITO) FROM saldos_terceros_niif
        WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND SACU_FECHA <= :FECAUX
        ORDER BY CUEN_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
        INTO SALDO;
ELSE
    SELECT SATE_SALDO FROM saldos_terceros_niif
        WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND SACU_FECHA = :FECINI
        ORDER BY CUEN_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
        INTO SALDO;
IF (SALDO IS NULL) THEN
    SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_TERCERO_NIIF (
    CUENTA VARCHAR(20),
    NIT VARCHAR(20),
    FECHA CHAR(8))
RETURNS (
    SALDO NUMERIC(18,2))
AS
BEGIN
SELECT FIRST 1 (SATE_SALDO+SATE_DEBITO-SATE_CREDITO) FROM SALDOS_TERCEROS_NIIF
    WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDO_TERCEROS_FECHA (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    NIT VARCHAR(20),
    CODSUC VARCHAR(10),
    NOMBRE VARCHAR(60),
    INICIAL NUMERIC(18,4),
    REMISIONES NUMERIC(18,4),
    DEVOLUCIONES NUMERIC(18,4),
    SALDO NUMERIC(18,4))
AS
begin
/* Muestra los lotes del artÃƒÂ­culo con existencia esa fecha */
for select DISTINCT TERC_NIT, CLSU_COD from existencia_tercero L where ARTI_COD = :articulo
    ORDER BY TERC_NIT, CLSU_COD
    into :NIT, :CODSUC
    do
    begin
    select terc_nom from terceros where terc_nit = :nit into :nombre;
    execute procedure saldo_tercero_fecha(:articulo, :nit, :CODSUC, :fecini-1) returning_values (:inicial);
    SELECT SUM(EXTE_ENTR), SUM(EXTE_SAL) FROM EXISTENCIA_TERCERO WHERE ARTI_COD = :articulo AND TERC_NIT = :nit AND CLSU_COD = :codsuc
        INTO :devoluciones, :remisiones;
    if (devoluciones IS NULL) then
        devoluciones = 0;
    if (remisiones IS NULL) then
        remisiones = 0;
    execute procedure saldo_tercero_fecha(:articulo, :nit, :CODSUC, :fecfin) returning_values (:saldo);
    if ((saldo <> 0) or (REMISIONES <> 0) or (DEVOLUCIONES <> 0)) then
      suspend;
    end
end^


ALTER PROCEDURE SALDO_TOTAL_BANCOS (
    FECHA DATE)
RETURNS (
    TOTAL NUMERIC(18,2))
AS
declare variable CUBA_COD INTEGER;
declare variable SALDO NUMERIC(18,2);
begin
TOTAL = 0;
FOR SELECT CUBA_COD FROM CUENTAS_BANCOS
    INTO :CUBA_COD
    DO
    BEGIN
    execute PROCEDURE saldo_cuenta_banco(:CUBA_COD, :FECHA) returning_values (:SALDO);
    total = TOTAL + SALDO;
    END
suspend;
end^


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
    SALDO_BOD = 0;
    /* 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 = :BOD) AND (EXIS_FECHA <= :FECHA)
        ORDER BY ARTI_COD DESC, BODE_COD DESC, EXIS_FECHA DESC INTO :SALDO_BOD;
    if (SALDO_BOD IS NULL) then
        SALDO_BOD = 0;
    SALDO = SALDO + SALDO_BOD;
    END
if (saldo is null) then
    SALDO = 0;
SUSPEND;
END^


ALTER PROCEDURE SALDOS_ARTICULO_CUENTA (
    ARTICULO VARCHAR(15),
    ANO CHAR(4),
    MES INTEGER)
RETURNS (
    SALDOINI NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    SALDOFIN NUMERIC(18,2),
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(60))
AS
BEGIN
  /* Procedure body */
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS INTO CUENTA, NOMCUENTA
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_ARTICULO_MES(CUENTA, ARTICULO, ANO, MES, 'S') RETURNING_VALUES (SALDOINI);
  EXECUTE PROCEDURE MOVIMIENTO_ARTICULOC_MES(CUENTA, ARTICULO, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
  EXECUTE PROCEDURE MOVIMIENTO_ARTICULOC_MES(CUENTA, ARTICULO, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
  SALDOFIN = SALDOINI + DEBITOS - CREDITOS;
  SUSPEND;
  END
END^


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),
    RCREE NUMERIC(18,2))
AS
declare variable desc_rtes char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE 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), SUM(SDCA_RCREE - SDCA_ABRCREE)
    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 31 AND SDCA_IDREF = :ID
    INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
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;
if ((RCREE IS NULL) or (RCREE < 0))  then
    RCREE = 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;
    RCREE = RCREE / 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';
    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
    if (AUTORCREE <> '') then
        FAUTORCREE = CAST(AUTORCREE AS DATE);
    else
        FAUTORCREE = '9999/12/31';
    /* BUSQUE LA 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 - RCREE;
    SALDO = SALDO;
    END
SUSPEND;
END^


ALTER PROCEDURE SALIDAS_ANO_ANTERIOR (
    ARTICULO VARCHAR(15),
    FECHA DATE,
    BODEGA VARCHAR(2))
RETURNS (
    SALIDAS NUMERIC(18,4))
AS
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable INCSALI VARCHAR(2);
declare variable DIASANO integer;
BEGIN
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA HISTORICO DE VENTA DEL ANO ANTERIOR EN CONSULTA DE EXISTENCIAS') returning_values (diasano);
if (DIASANO <> 0) 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);
    FECINI = FECHA - 365;
    FECFIN = FECINI + DIASANO;
    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 <= :FECFIN 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 <= :FECFIN AND ((MVAR_TIPODOC = 31) or (MVAR_TIPODOC = 32)) INTO :SALIDAS;
    if (SALIDAS IS NULL) then
        SALIDAS = 0;
    SUSPEND;
    END
ELSE
    BEGIN
    SALIDAS = 0;
    SUSPEND;
    END
END^


ALTER PROCEDURE SALIDAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT 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_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 12 INTO :IDI;
    if (CN <> 'N') then
      EXECUTE PROCEDURE CONTABIL_SALIDA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
    if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_salida_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
    if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
    ELSE
        ESTADO = 'ERROR';
    suspend;
    end
  END
END^


ALTER PROCEDURE SALIDAS_SIN_CONTABILIDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
declare variable IDREF INTEGER;
BEGIN
FOR SELECT SALI_ID, PREF_PRE, SALI_NUMERO FROM SALIDAS WHERE SALI_ANULADO = 'N' AND
    SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN AND ((:PREFIJO = '') or (PREF_PRE = :PREFIJO))
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idc = null;
  if (not exists (SELECT E.ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE ENCO_TIPOREF = 12 AND ENCO_IDREF = :ID AND E.enco_consec = D.enco_consec)) then
    BEGIN
    SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 12 AND CNTB_IDREF = :ID into :idc;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= 100000;
    if (idc IS NOT NULL) then
        begin
        ESTADO = 'PROCESANDO';
        ERROR = NULL;
        SUSPEND;
        SELECT MAX(ININ_ID) FROM interfaz_inventario WHERE PREF_PRE = :PREF AND TIDO_COD = 12 INTO :IDI;
        EXECUTE PROCEDURE contabil_salida_niif (:ID, :IDI, :idc) RETURNING_VALUES (:ERROR, VER);
        if ((ERROR = 0) or (error IS NULL)) then
            BEGIN
            SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E WHERE ENCO_TIPOREF = 12 AND ENCO_IDREF = :ID INTO :IDREF;
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
                SELECT :IDREF, 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 = :idc AND CNDE_ITEM >= 100000;
            UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDREF;
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        end
    END
  END
END^


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 BODLOTE CHAR(1);
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);
SELECT BODE_LOTES FROM BODEGA WHERE BODE_COD = :BODEGA INTO :BODLOTE;
if (BODLOTE = 'S') then
  BEGIN
  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
  END
ELSE
  LOTE = '1';
SUSPEND;
END^


ALTER PROCEDURE SERIALES_ITEM_DOCUMENTO (
    TIPO INTEGER,
    IDDOC INTEGER,
    ITEM INTEGER)
RETURNS (
    SERIALES VARCHAR(4096))
AS
declare variable SERIE VARCHAR(20);
begin
SERIALES = '';
FOR SELECT S.sedo_serial FROM seriales_documento S WHERE S.tido_cod = :TIPO AND S.sedo_iddoc = :IDDOC AND S.sedo_item = :item
    INTO :SERIE
    DO
    BEGIN
    SERIALES = SERIALES || SERIE || ',';
    END
if (SERIALES <> '') then
    SERIALES = SUBSTRING (SERIALES FROM 1 FOR STRLEN(SERIALES)-1);
suspend;
end^


ALTER PROCEDURE SUGERIDO_BODEGA (
    FECHA DATE,
    CODBOD VARCHAR(2))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    MINIMO NUMERIC(18,4),
    FALTANTE NUMERIC(18,4),
    ULTCOSTO NUMERIC(18,2))
AS
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
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, ARTI_MIN
      FROM ARTICULO A
      WHERE ESAR_COD = 'A'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :MINIMO
      DO
        BEGIN
        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);
                FALTANTE = MINIMO - CANT;
                SUSPEND;
                END
            end
        END
END^


ALTER PROCEDURE SUGERIDO_PROVEEDOR (
    FECHA DATE,
    PROVE VARCHAR(20),
    PORCREP NUMERIC(18,2))
RETURNS (
    CODART VARCHAR(20),
    DESART VARCHAR(60),
    CODGRP VARCHAR(3),
    CODSUBG VARCHAR(3),
    CODMAR VARCHAR(3),
    CODBOD VARCHAR(2),
    NOMBOD VARCHAR(60),
    PROMEDIO NUMERIC(18,4),
    VENTANT NUMERIC(18,4),
    MINIMO NUMERIC(18,2),
    EXIST NUMERIC(18,4),
    OPTIMO NUMERIC(18,4),
    CANT NUMERIC(18,4),
    PORCR NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    COSTO NUMERIC(18,2),
    PEDIDO NUMERIC(18,4),
    ORDINV NUMERIC(18,4),
    ORDCMP NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    NOMGRUPO VARCHAR(60),
    NOMSUBG VARCHAR(60),
    NOMMARC VARCHAR(30),
    NOMPROV VARCHAR(60))
AS
declare variable salidas numeric(18,4);
declare variable pedite numeric(18,4);
declare variable cantaux numeric(18,4);
declare variable pedauto char(2);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor2 numeric(18,4);
declare variable DIASA INTEGER;
declare variable MINDIAS VARCHAR(2);
declare variable PORART VARCHAR(8);
begin
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 (MINDIAS);
execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
FOR SELECT A.ARTI_COD, ARTI_DES, ARTI_MIN, ARTI_DIAS, ARTI_UNIDAD, A.grup_cod, A.subg_cod, A.MARC_COD
    FROM ARTICULO A, proveedor_articulo M WHERE A.arti_cod = M.arti_cod AND M.terc_nit = :prove
    AND ARTI_ENSAMBLE = 'N' AND ESAR_COD <> 'I'
    INTO :codart, :desart, :minimo, :diasa, :unidad, :codgrp, :codsubg, :codmar
    DO
    BEGIN
    if (MINDIAS <> 'SI') then
        minimo  = DIASA;
    FOR SELECT BODE_COD, BODE_NOM FROM bodega WHERE BODE_ACTIVA = 'S' INTO :codbod, :nombod
        DO
        BEGIN
        if (PORART = 'STAND') then
            SELECT STAND_MIN FROM STANDS WHERE ARTI_COD = :codart AND STAND_BODEGA = :codbod INTO :minimo;
        EXECUTE PROCEDURE promedio_salidas_articulo (:CODART, :FECHA, :CODBOD) returning_values (:promedio, :salidas);
        OPTIMO = PROMEDIO * MINIMO;
        CANT = OPTIMO;
        if (CANT IS NULL) then
            CANT = 0;
        /* SUME LOS PEDIDOS EXTRA */
        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 = :CODART and PEDI_VENCE >= :FECHA and PEDI_FECHA <= :FECHA
                and PEDE_ANULADO = 'N' AND PD.bode_cod = :codbod
            into :ID, :ITEM, :cantaux
            do
            begin
            execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (PEDITE, UND, FACTOR2);
            if ((PEDITE * FACTOR2 = cantaux) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (PEDITE, UND, FACTOR2);
            if (PEDITE is null) then
                PEDITE = 0;
            PEDIDO = PEDIDO + PEDITE * FACTOR2;
            end
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        CANT = CANT + PEDIDO;
        /* SUME LAS ORDENES DE INVENTARIO */
        ORDINV = 0;
        select SUM(OD.orid_cant * OD.orid_factor)
            from ordenes_inventario O, ordeninventario_detalle OD
            where O.orin_id = OD.orin_id and OD.arti_cod = :CODART and orin_fecllega >= :FECHA and O.orin_fecha <= :FECHA
                and O.orin_anulado = 'N'
            into :ordinv;
        if (ORDINV is null) then
            ORDINV = 0;
        CANT = CANT + ORDINV;
        execute procedure saldo_inventario(:codart, :CODBOD, :fecha) returning_values (:exist);
        CANT = CANT - exist;
        /* descuente las ordenes de compra pendientes por llegar */
        ORDCMP = 0;
        select sum(OD.ocde_cant * OD.ocde_factor)
            from ordenes_compra O, ordenes_compra_detalle OD
            where O.ordc_id = OD.ordc_id and OD.ARTI_COD = :CODART and (O.ordc_fecha + O.ordc_validez) >= :FECHA and O.ordc_fecha <= :FECHA
                and O.ordc_anulado = 'N' AND OD.bode_cod = :codbod
            into :ordcmp;
        if (ORDCMP IS NULL) then
            ORDCMP = 0;
        CANT = CANT - ORDCMP;
        /* SI LA EXISTENCIA ES INFERIOR AL PORCENTAJE DEL OPTIMO REPORTELO */
        if (CANT > 0) then
            BEGIN
            if (OPTIMO <> 0) then
                PORCR = exist * 100 / OPTIMO;
            /* CONVIERTA A UNIDAD ALTERNATIVA MAYOR SI LA HAY */
            UND = NULL;
            SELECT first 1 UNAR_UNIDAD, UNAR_FACCAN FROM unidad_articulo U WHERE ARTI_COD = :codart AND U.unar_faccan > 1
                INTO :und, :factor2;
            if ((UND IS NOT NULL) AND (FACTOR2 <> 0)) then
                BEGIN
                UNIDAD = UND;
                CANT = CANT / FACTOR2;
                EXIST = EXIST / FACTOR2;
                PROMEDIO = PROMEDIO / FACTOR2;
                END
            SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :prove INTO :nomprov;
            execute procedure NOMBRES_GRUPOS_INVENTARIO(:CODGRP, :CODSUBG, :CODMAR)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            SELECT PVAR_COSTO FROM proveedor_articulo WHERE TERC_NIT = :prove AND ARTI_COD = :codart INTO :costo;
            SELECT SUM(FADE_CANT * FADE_FACTOR) FROM FACTURAS_DETALLE D, FACTURAS F
                WHERE F.fact_id = D.fact_id AND F.fact_fecha > (:FECHA - 365) AND F.fact_fecha < (:FECHA - 335) and d.bode_cod = :codbod
                AND ARTI_COD = :codart AND FACT_ANULADO = 'N' INTO :VENTANT;
            if (VENTANT IS NULL) then
                VENTANT = 0;
            if (PORCR < porcrep) then
                BEGIN
                /* REDONDEE A UNIDADES */
                CANT = CEIL(CANT);
                if (CANT < 0) then
                    CANT = 0;
                TOTAL = COSTO * CANT;
                END
            ELSE
                BEGIN
                CANT = 0;
                TOTAL = 0;
                END
            suspend;
            END
        END
    END
end^


ALTER PROCEDURE SUGIERE_METAS_VENTAS (
    VEND INTEGER,
    FECINI DATE,
    FECFIN DATE,
    BASE CHAR(1),
    CRECE NUMERIC(18,4))
RETURNS (
    FECHA DATE,
    VENTAS NUMERIC(18,2))
AS
declare variable I INTEGER;
declare variable IVAMONTO numeric(18,2);
declare variable EXTRA numeric(18,2);
declare variable TOTAL numeric(18,2);
declare variable CONSUMO numeric(18,2);
declare variable IVAMONTOD numeric(18,2);
declare variable EXTRAD numeric(18,2);
declare variable TOTALD numeric(18,2);
declare variable CONSUMOD numeric(18,2);
declare variable DOMINGO numeric(18,2);
declare variable LUNES numeric(18,2);
declare variable MARTES numeric(18,2);
declare variable MIERCOLES numeric(18,2);
declare variable JUEVES numeric(18,2);
declare variable VIERNES numeric(18,2);
declare variable SABADO numeric(18,2);
declare variable SITOT char(2);
declare variable FECI date;
declare variable FECF date;
declare variable NUMDIAS INTEGER;
begin
execute procedure LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
/* RANGO DE FECHAS A PROMEDIAR */
if (BASE = 'A') then
    begin
    FECI = FECINI - 365;
    FECF = FECI + 30;
    end
if (BASE = 'M') then
    begin
    FECI = FECINI - 30;
    FECF = FECINI;
    end
if (BASE = 'T') then
    begin
    FECI = FECINI - 90;
    FECF = FECINI;
    end
/* CALCULE EL PROMEDIO  */
I = 0;
WHILE (I < 7) DO
    BEGIN
    select sum(FACT_TOTAL), sum(FACT_EXTRA), sum(FACT_IVAMONTO)
        from FACTURAS f where VEND_COD = :VEND and FACT_FECHA >= :feci and FACT_FECHA <= :fecf and FACT_ANULADO = 'N'
        AND EXTRACT(WEEKDAY FROM FACT_FECHA) = :I
        into :TOTAL, :extra, :ivamonto;
    if (total is null) then
        total = 0;
    if (ivamonto is null) then
        ivamonto = 0;
    if (extra is null) then
        extra = 0;
    select sum(FADE_CONSUMO)
        from FACTURAS f, facturas_detalle d where F.FACT_ID = D.FACT_ID and VEND_COD = :VEND and FACT_FECHA = :fecha and
        FACT_ANULADO = 'N' AND EXTRACT(WEEKDAY FROM FACT_FECHA) = :I
        into :CONSUMO;
    if (consumo is null) then
        consumo = 0;
    select sum(DEVT_TOTAL), sum(DEVT_EXTRA), sum(DEVT_IVAMONTO)
        from devoluciones_ventas f where VEND_COD = :VEND and DEVT_FECHA >= :feci and DEVT_FECHA <= :fecf and DEVT_ANULADO = 'N'
        AND EXTRACT(WEEKDAY FROM DEVT_FECHA) = :I
        into :TOTALD, :extrad, :ivamontod;
    if (totald is null) then
        totald = 0;
    if (ivamontod is null) then
        ivamontod = 0;
    if (extrad is null) then
        extrad = 0;
    select sum(DVDE_CONSUMO)
        from devoluciones_ventas f, devoluciones_ventas_detalle d where F.devt_id = D.devt_id and VEND_COD = :VEND and
        DEVT_FECHA = :fecha and DEVT_ANULADO = 'N'  AND EXTRACT(WEEKDAY FROM DEVT_FECHA) = :I
        into :CONSUMOD;
    if (consumod is null) then
        consumod = 0;
    if (SITOT = 'SI') then
        VENTAS = TOTAL - TOTALD;
    else
        VENTAS = TOTAL - EXTRA - IVAMONTO - CONSUMO - (TOTALD - EXTRAD - IVAMONTOD - CONSUMOD);
    /* EL INCREMENTO */
    VENTAS = VENTAS * (100 + CRECE) / 100;
    /* CALCULE CUANTOS DIAS TUVIERON VENTAS */
    NUMDIAS = 0;
    FOR SELECT DISTINCT FACT_FECHA FROM FACTURAS WHERE VEND_COD = :VEND and FACT_FECHA >= :feci and FACT_FECHA <= :fecf and FACT_ANULADO = 'N'
        AND EXTRACT(WEEKDAY FROM FACT_FECHA) = :I INTO :fecha DO
        NUMDIAS = NUMDIAS + 1;
    if (NUMDIAS <> 0) then
        VENTAS = VENTAS / NUMDIAS;

    if (i = 0) then
        DOMINGO = VENTAS;
    if (i = 1) then
        LUNES = VENTAS;
    if (i = 2) then
        MARTES = VENTAS;
    if (i = 3) then
        MIERCOLES = VENTAS;
    if (i = 4) then
        JUEVES = VENTAS;
    if (i = 5) then
        VIERNES = VENTAS;
    if (i = 6) then
        SABADO = VENTAS;
    I = I + 1;
    END
/* ASIGNE EL PROMEDIO MAS EL CRECIMIENTO DIA A DIA */
FECHA = FECINI;
WHILE (FECHA < FECFIN) DO
    BEGIN
    I = EXTRACT(WEEKDAY FROM FECHA);
    if (i = 0) then
        VENTAS = DOMINGO;
    if (i = 1) then
        VENTAS = LUNES;
    if (i = 2) then
        VENTAS = MARTES;
    if (i = 3) then
        VENTAS = MIERCOLES;
    if (i = 4) then
        VENTAS = JUEVES;
    if (i = 5) then
        VENTAS = VIERNES;
    if (i = 6) then
        VENTAS = SABADO;
    suspend;
    FECHA = FECHA + 1;
    END
end^


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;
declare variable CONSUMO NUMERIC(18, 2);
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, ARTI_CONSUMO FROM ARTICULO A, TARIFA_IVA T
    WHERE A.TAIV_COD = T.TAIV_COD AND ARTI_COD = :ARTICULO INTO :TARIVA, :CONSUMO;
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) + CONSUMO;
if (UOM = 'U') then
    BEGIN
    AUX = AUX * (100 + :PORC)/100;
    EXECUTE PROCEDURE REDONDEE (AUX, DIG) returning_values (PRECIO);
    END
ELSE
    BEGIN
    AUX = AUX / ((100 - :PORC)/100);
    EXECUTE PROCEDURE REDONDEE (AUX, DIG) returning_values (PRECIO);
    END
SUSPEND;
END^


ALTER PROCEDURE SUMA_APERTURA_NIIF (
    FECINI DATE,
    FECFIN DATE,
    NULO CHAR(1))
RETURNS (
    CUENTA VARCHAR(20),
    SALDO2649 NUMERIC(18,2),
    DBNIIF NUMERIC(18,2),
    CRNIIF NUMERIC(18,2),
    SALDONIIF NUMERIC(18,2))
AS
begin
FOR SELECT MAX(CUEN_COD), SUM(APND_SALDOINI) FROM APERTURA_NIIF_DET AD
    GROUP BY CUEN_COD INTO :CUENTA, :saldo2649
    DO
    BEGIN
    dbniif = 0;
    crniif = 0;
    SELECT SUM(APND_DEBITO+APND_RECLDB), SUM(APND_CREDITO+APND_RECLCR) FROM apertura_niif_det
        WHERE CUEN_COD = :cuenta AND ((APND_CTANIIF IS NOT NULL) AND (APND_CTANIIF <> ''))
        INTO :dbniif, :crniif;
    SALDONIIF = dbniif - crniif;
    suspend;
    END
end^


ALTER PROCEDURE SUMA_DESCUENTOS_FINANCIEROS (
    IDF INTEGER)
AS
declare variable ARTICULO VARCHAR(20);
declare variable DIAS INTEGER;
declare variable DIAS2 INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable PRECIO NUMERIC(18,2);
declare variable PRECIO2 NUMERIC(18,2);
declare variable ITEM INTEGER;
declare variable FECHA DATE;
declare variable DTOF1M numeric(18,2);
declare variable DTOF1F date;
declare variable DTOF2M numeric(18,2);
declare variable DTOF2F date;
declare variable DTOF3M numeric(18,2);
declare variable DTOF3F date;
declare variable DTOF4M numeric(18,2);
declare variable DTOF4F date;
declare variable GRUPLISTA VARCHAR(60);
begin
SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :IDF INTO :FECHA;
dtof1m = 0;
dtof2m = 0;
dtof3m = 0;
dtof4m = 0;
FOR SELECT ARTI_COD, FD.fade_cant * FD.fade_factor, L.lipr_dtof1dias, fade_cant * fade_prunit, L.lipr_gruplis
    FROM FACTURAS_DETALLE fd, lista_precios L
    WHERE FACT_ID = :IDF AND FD.lipr_cod = L.lipr_cod
    INTO :ARTICULO, :CANT, :DIAS, :PRECIO, :GRUPLISTA
    DO
    BEGIN
    ITEM = 0;
    FOR SELECT FIRST 4 SUM(PRAR_FIJO*:CANT), MAX(lipr_dtof1dias) FROM lista_precios L, PRECIOS_ARTICULO P
        WHERE P.lipr_cod = L.lipr_cod AND P.arti_cod = :articulo AND lipr_dtof1dias < :DIAS AND L.lipr_gruplis = :gruplista and p.prar_fijo <> 0
        group BY L.lipr_cod
        INTO :PRECIO2, :DIAS2
        DO
        BEGIN
        ITEM = ITEM + 1;
        if (ITEM = 1) then
            BEGIN
            dtof1m = dtof1m + PRECIO - PRECIO2;
            dtof1f = FECHA + DIAS2;
            END
        if (ITEM = 2) then
            BEGIN
            dtof2m = dtof2m + PRECIO - PRECIO2;
            dtof2f = FECHA + DIAS2;
            END
        if (ITEM = 3) then
            BEGIN
            dtof3m = dtof3m + PRECIO - PRECIO2;
            dtof3f = FECHA + DIAS2;
            END
        if (ITEM = 4) then
            BEGIN
            dtof4m = dtof4m + PRECIO - PRECIO2;
            dtof4f = FECHA + DIAS2;
            END
        END
    END
if (dtof1f is null) then
    dtof1f = fecha;
UPDATE FACTURAS
    SET FACT_DTOFMONTO = :DTOF1M,
        FACT_DTOFPOR = (:DTOF1M*100)/(FACT_TOTAL-FACT_IVAMONTO),
        FACT_DTOFFECHA = :DTOF1F,
        FACT_DTOF1M = :DTOF2M,
        FACT_DTOF1 = (:DTOF2M*100)/(FACT_TOTAL-FACT_IVAMONTO),
        FACT_DTOF1FEC = :DTOF2F,
        FACT_DTOF2M = :DTOF3M,
        FACT_DTOF2 = (:DTOF3M*100)/(FACT_TOTAL-FACT_IVAMONTO),
        FACT_DTOF2FEC = :DTOF3F,
        FACT_DTOF3M = :DTOF4M,
        FACT_DTOF3 = (:DTOF4M*100)/(FACT_TOTAL-FACT_IVAMONTO),
        FACT_DTOF3FEC = :DTOF4F
    WHERE FACT_ID = :IDF;
end^


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^


ALTER PROCEDURE SUME_SALDO_BANCO (
    CUENTA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
DECLARE VARIABLE existe INTEGER;
DECLARE VARIABLE saldo NUMERIC(15,4);
declare variable sumar integer;
BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /*  Si en SALDO_BANCO existe el registro CUENTA-fecha le suma
        a los debitos el monto, si no, crea un nuevo registro       */
  SELECT 1 FROM SALDO_BANCOS
    WHERE (CUBA_COD = :CUENTA) AND
      (SABA_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_CUENTA_BANCO(:CUENTA, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO SALDO_BANCOS (CUBA_COD, SABA_FECHA,
        SABA_DEBITOS, SABA_CREDITOS, SABA_SALDO)
        VALUES (:CUENTA, :FECHA, (:MONTO * :sumar), 0, :saldo);
      END /* if existe */
  ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE SALDO_BANCOS
          SET SABA_DEBITOS = SABA_DEBITOS + (:MONTO * :sumar)
          WHERE (CUBA_COD = :CUENTA) AND
            (SABA_FECHA = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE SALDO_BANCOS
        SET SABA_SALDO = SABA_SALDO + (:MONTO * :sumar)
        WHERE (CUBA_COD = :CUENTA) AND
            (SABA_FECHA > :fecha);
END^


ALTER PROCEDURE SUME_SALDO_BANCO_CONF (
    CUENTA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
DECLARE VARIABLE existe INTEGER;
DECLARE VARIABLE saldo NUMERIC(15,4);
declare variable sumar integer;
BEGIN
  if (ANULAR = 'S') then
    sumar = -1;
  else
    sumar = 1;
  /*  Si en SALDO_BANCO existe el registro CUENTA-fecha le suma
        a los debitos el monto, si no, crea un nuevo registro       */
  SELECT 1 FROM SALDO_BANCOS_CONF
    WHERE (CUBA_COD = :CUENTA) AND
      (SABA_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_cuenta_banco_conf(:CUENTA, :fecha)
        RETURNING_VALUES :saldo;
      INSERT INTO saldo_bancos_conf (CUBA_COD, SABA_FECHA,
        SABA_DEBITOS, SABA_CREDITOS, SABA_SALDO)
        VALUES (:CUENTA, :FECHA, (:MONTO * :sumar), 0, :saldo);
      END /* if existe */
  ELSE
      BEGIN
      /* Ya existe un registro en la fecha */
      UPDATE saldo_bancos_conf
          SET SABA_DEBITOS = SABA_DEBITOS + (:MONTO * :sumar)
          WHERE (CUBA_COD = :CUENTA) AND
            (SABA_FECHA = :fecha);
      END
    /*  Recorra los registros de fechas posteriores actualizando el saldo
        anterior */
    UPDATE saldo_bancos_conf
        SET SABA_SALDO = SABA_SALDO + (:MONTO * :sumar)
        WHERE (CUBA_COD = :CUENTA) AND
            (SABA_FECHA > :fecha);
END^


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^


ALTER PROCEDURE SUME_SALDO_CUENTA
AS
BEGIN
  /* Procedure body */
  SUSPEND;
END^


ALTER PROCEDURE SUME_SALDO_EFECTIVO (
    CAJA INTEGER,
    FECHA DATE,
    MONTO NUMERIC(18,2),
    ANULAR CHAR(1))
AS
declare variable EXISTE CHAR(1);
declare variable SALDO NUMERIC(18,2);
BEGIN
EXISTE = 'N';
SELECT 'S' FROM SALDO_EFECTIVO WHERE SAEF_FECHA = :FECHA AND CAJA_ID = :CAJA INTO :EXISTE;
if (ANULAR <> 'S') then
    BEGIN
    if (EXISTE = 'S') then
        UPDATE SALDO_EFECTIVO SET SAEF_DEBITOS = SAEF_DEBITOS + :MONTO
            WHERE SAEF_FECHA = :FECHA AND CAJA_ID = :CAJA;
    ELSE
        BEGIN
        EXECUTE PROCEDURE SALDO_EN_EFECTIVO (:CAJA, :FECHA) RETURNING_VALUES (:SALDO);
        INSERT INTO SALDO_EFECTIVO (SAEF_FECHA, CAJA_ID, SAEF_SALDO, SAEF_DEBITOS, SAEF_CREDITOS)
            VALUES (:FECHA, :CAJA, :SALDO, :MONTO, 0);
        END
    /* ACTUALICE LOS SALDOS DE FECHAS POSTERIORES */
    UPDATE SALDO_EFECTIVO SET SAEF_SALDO = SAEF_SALDO + :MONTO
      WHERE CAJA_ID = :CAJA AND SAEF_FECHA > :FECHA;
    END
ELSE
    BEGIN
    UPDATE SALDO_EFECTIVO SET SAEF_DEBITOS = SAEF_DEBITOS - :MONTO
        WHERE SAEF_FECHA = :FECHA AND CAJA_ID = :CAJA;
    /* ACTUALICE LOS SALDOS DE FECHAS POSTERIORES */
    UPDATE SALDO_EFECTIVO SET SAEF_SALDO = SAEF_SALDO - :MONTO
      WHERE CAJA_ID = :CAJA AND SAEF_FECHA > :FECHA;
    END
END^


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^


ALTER PROCEDURE TERCEROS_CREADOS (
    FECINI DATE,
    FECFIN DATE,
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    NULO CHAR(1))
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    FECHA DATE,
    CTAPROV VARCHAR(20),
    CTACLIE VARCHAR(20))
AS
begin
FOR SELECT TERC_NIT, TERC_NOM, AUDI_FECHA, TERC_CTAPROV, TERC_CTACLIENTE FROM TERCEROS T, AUDITORIA A
    WHERE A.tido_cod = 102 AND A.audi_oper = 'I' AND A.audi_cod = T.terc_nit AND T.terc_nit >= :DESDE AND T.terc_nit <= :hasta
    AND A.audi_fecha >= :fecini AND A.audi_fecha <= :fecfin
    INTO :NIT, :NOMBRE, :FECHA, :CTAPROV, :CTACLIE
    DO
    BEGIN
    SELECT PROV_CTAPAGAR FROM proveedores WHERE TERC_NIT = :NIT INTO :ctaprov;
    suspend;
    END
end^


ALTER PROCEDURE TOTAL_DOC_COMPRA (
    TIPODOC INTEGER,
    ID INTEGER)
RETURNS (
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2))
AS
BEGIN
  if (TIPODOC = 21) then /* FACTURA */
    BEGIN
    SELECT SUM(FCDE_TOTAL), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO)
        FROM FACTURAS_COMPRAS_DETALLE
        WHERE FACO_ID = :ID
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 22) then /* REMISION */
    BEGIN
    SELECT SUM(RPVD_TOTAL), SUM(RPVD_IVAMONTO), SUM(RPVD_CONSUMO)
        FROM remision_PROVEEDOR_det
        WHERE REPR_ID = :ID
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 23) then /* ORDEN */
    BEGIN
    SELECT SUM(OCDE_TOTAL), SUM(OCDE_IVAMONTO), SUM(OCDE_CONSUMO)
        FROM ORDENES_COMPRA_detalle
        WHERE ORDC_ID = :ID
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 24) then /* DEVOLUCION */
    BEGIN
    SELECT SUM(DVCD_TOTAL), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
        FROM devoluciones_compras_det
        WHERE DVCO_ID = :ID
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  if (TIPODOC = 25) then /* COTIZACION */
    BEGIN
    SELECT SUM(CPRD_TOTAL), SUM(CPRD_IVAMONTO), SUM(CPRD_CONSUMO)
        FROM cotizaciones_PROVEEDOR_det
        WHERE COPR_ID = :ID
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  SUBTOTAL = SUBTOTAL - IVA - CONSUMO;
  SUSPEND;
END^


ALTER PROCEDURE TOTAL_DOC_IMPORT (
    TIPODOC INTEGER,
    ID INTEGER)
RETURNS (
    SUBTOTAL NUMERIC(18,2))
AS
BEGIN
  if (TIPODOC = 130) then /* FACTURA */
    BEGIN
    SELECT SUM(S.SLDE_TOTMON)
        FROM SOLICITUD_IMPORTACION_DET S
        WHERE SLIM_ID = :ID
        INTO :SUBTOTAL;
    END
  if (TIPODOC = 132) then /* FACTURA */
    BEGIN
    SELECT SUM(S.orem_valormon)
        FROM orden_embarque S
        WHERE orem_ID = :ID
        INTO :SUBTOTAL;
    END
  SUBTOTAL = SUBTOTAL;
  SUSPEND;
END^


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
  if (TIPODOC = 40) then /* PENDIENTE */
    BEGIN
    SELECT SUM(PEVD_TOTAL), SUM(PEVD_IVAMONTO), SUM(PEVD_CONSUMO)
        FROM pendiente_ventas_detalle D
        WHERE D.pend_id = :ID
        INTO :SUBTOTAL, :IVA, :CONSUMO;
    END
  SUBTOTAL = SUBTOTAL - IVA - CONSUMO;
  SUSPEND;
END^


ALTER PROCEDURE TOTAL_FACTURA_WEB (
    ID INTEGER)
RETURNS (
    ITEMS INTEGER,
    TOTAL NUMERIC(18,2))
AS
begin
select COUNT(FAWD_ITEM), SUM(FAWD_TOTAL) FROM FACTURA_WEB_DETALLE WHERE FACW_ID = :id
    INTO :ITEMS, :TOTAL;
if (TOTAL IS NULL) then
    TOTAL = 0;
if (ITEMS IS NULL) then
    ITEMS = 0;
  suspend;
end^


ALTER PROCEDURE TOTAL_PAGOS_TERCERO_ANO (
    NIT VARCHAR(20),
    INI CHAR(8),
    FIN CHAR(8),
    NAT CHAR(1))
RETURNS (
    TOTAL NUMERIC(18,2))
AS
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
begin
SELECT SUM(CODE_DEBITO), SUM(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 :DEBITOS, :CREDITOS;
if (NAT = 'D') then
    TOTAL = DEBITOS;
if (NAT = 'C') then
    TOTAL = CREDITOS;
if (NAT = 'N') then
    TOTAL = DEBITOS - CREDITOS;
suspend;
end^


ALTER PROCEDURE TOTAL_PEDIDO_WEB (
    ID INTEGER)
RETURNS (
    ITEMS INTEGER,
    TOTAL NUMERIC(18,2))
AS
begin
select COUNT(PEWD_ITEM), SUM(PEWD_TOTAL) FROM PEDIDO_WEB_DETALLE WHERE PEWE_ID = :id
    INTO :ITEMS, :TOTAL;
if (TOTAL IS NULL) then
    TOTAL = 0;
if (ITEMS IS NULL) then
    ITEMS = 0;
  suspend;
end^


ALTER PROCEDURE TRAE_ARTICULO_MOVIL (
    CODIGO VARCHAR(20),
    VEND INTEGER,
    CLIENTE VARCHAR(20),
    SUCUCLI VARCHAR(10),
    IDPEDWEB INTEGER)
RETURNS (
    DES VARCHAR(60),
    DESCORTA VARCHAR(30),
    GRUPO VARCHAR(30),
    SUBGR VARCHAR(30),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ALTERNATIVA VARCHAR(30),
    IVA NUMERIC(9,2),
    CONSUMO NUMERIC(18,2),
    EXISTEN NUMERIC(18,2),
    LISTA INTEGER,
    PRECIO NUMERIC(18,2),
    OBS VARCHAR(1024),
    NOMLISTA VARCHAR(30),
    OK INTEGER)
AS
declare variable DIG integer;
declare variable CODBOD varchar(2);
declare variable FECHA date;
declare variable FECHAAUX date;
declare variable EXISTOT varchar(6);
declare variable CONTEXIST char(1);
declare variable RESERPEDWEB char(2);
declare variable RESERVADO numeric(18,2);
declare variable CODREP char(2);
declare variable EXISPED char(2);
declare variable EXRESERV varchar(10);
declare variable VALIDEZ integer;
declare variable CANTPEDWEB numeric(18,4);
declare variable CANT numeric(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'PEDIDOS', 'VALIDAR EXISTENCIA TOTAL O SOLO EN LA BODEGA INDICADA EN EL PUNTO DE VENTA') returning_values (:EXISTOT);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'PEDIDOS', 'VALIDAR EXISTENCIAS DESDE EL PEDIDO') returning_values (:EXISPED);
SELECT LIPR_COD FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :CLIENTE AND CLCU_COD = :SUCUCLI INTO :LISTA;
if ((LISTA IS NULL) or (LISTA = 0)) then
    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;
SELECT LIPR_NOM FROM LISTA_PRECIOS WHERE LIPR_COD = :LISTA INTO :NOMLISTA;
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
    select ARTI_EXIST, arti_des, arti_descorta, grup_cod, subg_cod, arti_unidad, taiv_porc, marc_cod, ARTI_CONSUMO, CAST(ARTI_OBS AS VARCHAR(1024))
        from articulo a, tarifa_iva t
        where a.taiv_cod = t.taiv_cod and ARTI_COD = :CODIGO
        INTO CONTEXIST, :DES, :DESCORTA, :GRUPO, :SUBGR, :UNIDAD, :IVA, :MARCA, :CONSUMO, :OBS;
    if (DES IS NULL) then
        DES = '';
    else
        BEGIN
        EXECUTE PROCEDURE NOMBRE_ASCII(DES) returning_values (DES);
        if ((:grupo is null)or (:grupo = '') ) then
            begin
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO GRUPO;
            EXECUTE PROCEDURE NOMBRE_ASCII(GRUPO) returning_values (GRUPO);
            end
        if ((:marca is null)or (:marca = '') ) then
            begin
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO MARCA;
            EXECUTE PROCEDURE NOMBRE_ASCII(SUBGR) returning_values (SUBGR);
            end
        if ((:subgr is null)or(:subgr = '')) then
            begin
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGR AND GRUP_COD = :GRUPO INTO :SUBGR;
            EXECUTE PROCEDURE NOMBRE_ASCII(MARCA) returning_values (MARCA);
            end
        ALTERNATIVA = '';
        select FIRST 1 unar_unidad || ' x ' || unar_faccan FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :alternativa;
        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 BODE_COD FROM punto_venta PT, VENDEDORES V WHERE ((PT.sucu_id = V.sucu_id) or (V.sucu_id = 0))  AND V.vend_cod = :VEND INTO :CODBOD;
        FECHA = CAST('NOW' AS DATE);
        if ((:contexist = 'N') OR (:exisped = 'NO')) then
            EXISTEN = 99999;
        ELSE
        BEGIN
        if (EXISTOT = 'TOTAL') then
            EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
        ELSE
            EXECUTE PROCEDURE saldo_inventario (:CODIGO, :CODBOD, :FECHA) returning_values (:EXISTEN);
        END
        execute procedure lee_configuracion('INVENTARIO','EXISTENCIAS','ACCION A TOMAR SI LA EXISTENCIA ESTA RESERVADA') returning_values(:exreserv);
        if (:exreserv = 'PROHIBIR') then
            BEGIN
            RESERVADO = 0;
            SELECT SUM(RESERVADO) FROM EXISTENCIAS_UNIDAD(:CODIGO, :FECHA, :UNIDAD) INTO :RESERVADO;
            execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'RESERVAR MERCANCIA CON PEDIDO WEB SIN CONFIRMAR') returning_values (:RESERPEDWEB);
            if (RESERPEDWEB = 'SI') then
                BEGIN
                execute procedure LEE_CONFIGURACION('FACTURACION', 'PEDIDOS', 'DIAS DE VALIDEZ') returning_values (VALIDEZ);
                CANTPEDWEB = 0;
                FECHAAUX = :FECHA - :VALIDEZ;
                for select PD.pewd_cant * PD.pewd_factor
                    from PEDIDO_WEB P, pedido_web_detalle PD, EVENTOS_VENTAS E
                    where P.pewe_id = PD.pewe_id and PD.arti_cod = :CODIGO and P.pewe_fecha >= (:FECHAAUX) AND PEWE_FECHA <= :FECHA
                    AND P.pewe_idped = 0 AND ((P.PEWE_EVENTO = E.EVVE_ID) or (P.PEWE_EVENTO IS NULL))
                    AND ((E.EVVE_EXIS = 'S') or (E.EVVE_EXIS IS NULL))
                    into :CANT
                    do
                    begin
                    CANTPEDWEB = CANTPEDWEB + CANT;
                    end
                RESERVADO = RESERVADO + CANTPEDWEB;
                END
            EXISTEN = EXISTEN - RESERVADO;
            END
        execute procedure lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR VARIAS OCURRENCIAS DEL MISMO ARTICULO EN UN DOCUMENTO') returning_values(:codrep);
        if (:codrep = 'NO') then
            SELECT COUNT(ARTI_COD) FROM PEDIDO_WEB_DETALLE WHERE ARTI_COD = :codigo AND PEWE_ID = :idpedweb into :OK;
        else
            OK = 0;
        END
    SUSPEND;

    END
END^


ALTER PROCEDURE TRAE_ARTICULOS_MOVIL_OFFLINE
RETURNS (
    CODIGO VARCHAR(20),
    DES VARCHAR(60),
    DESCORTA VARCHAR(30),
    GRUPO VARCHAR(60),
    SUBGR VARCHAR(60),
    MARCA VARCHAR(30),
    UNIDAD VARCHAR(8),
    ALTERNATIVA VARCHAR(30),
    IVA NUMERIC(9,2),
    CONSUMO NUMERIC(18,2),
    EXISTEN NUMERIC(18,2),
    PRECIO NUMERIC(18,2),
    FOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80)
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
declare variable FECHA DATE;
declare variable CODBOD VARCHAR(2);
declare variable EXISTOT VARCHAR(6);
BEGIN
EXISTEN = 0;
FECHA = cast('now' as DATE);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'PEDIDOS', 'VALIDAR EXISTENCIA TOTAL O SOLO EN LA BODEGA INDICADA EN EL PUNTO DE VENTA') returning_values (:EXISTOT);
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;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA > 0) then
    BEGIN
        FOR select a.arti_cod, arti_des, arti_descorta, grup_cod, subg_cod, arti_unidad, taiv_porc, marc_cod, ARTI_CONSUMO, ARTI_OBS, ARTI_FOTO
            from articulo a, tarifa_iva t where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t'
            and esar_cod = 'A'
            INTO :CODIGO, :DES, :DESCORTA, :GRUPO, :SUBGR, :UNIDAD, :IVA, :MARCA, :CONSUMO, :OBS, :FOTO
            do                                                                                         
            begin
            EXECUTE PROCEDURE NOMBRE_ASCII(DES) returning_values (DES);
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO MARCA;
            SELECT first 1 GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO GRUPO;
            SELECT first 1 SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGR AND GRUP_COD = :GRUPO INTO :SUBGR;
            EXECUTE PROCEDURE NOMBRE_ASCII(GRUPO) returning_values (GRUPO);
            EXECUTE PROCEDURE NOMBRE_ASCII(SUBGR) returning_values (SUBGR);
            EXECUTE PROCEDURE NOMBRE_ASCII(MARCA) returning_values (MARCA);
            EXECUTE PROCEDURE NOMBRE_ASCII(UNIDAD) returning_values (UNIDAD);
            ALTERNATIVA = '';
            select FIRST 1 unar_unidad || ' x ' || unar_faccan FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :alternativa;
            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
                if (EXISTOT = 'TOTAL') then
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                ELSE
                    BEGIN
                    select first 1 bode_cod from punto_venta p, usuario u where u.user_cod = USER and u.sucu_id = p.sucu_id into :codbod;
                    EXECUTE PROCEDURE saldo_inventario (:CODIGO, :CODBOD, :FECHA) returning_values (:EXISTEN);
                    END
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (ok = 'S') then
                SUSPEND;
            end
    END
END^


ALTER PROCEDURE TRAE_CIUDADES_MOVIL
RETURNS (
    CIUD_COD VARCHAR(5),
    CIUD_NOM VARCHAR(60),
    PREDET CHAR(1))
AS
declare variable CIUPRE VARCHAR(10);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'TERCEROS', 'CODIGO DE CIUDAD A SUGERIR') returning_values (:CIUPRE);
for select ciud_cod, ciud_nom from ciudades where ciud_activa = 'S'
    into CIUD_COD, CIUD_NOM
    do
    BEGIN
    PREDET = 'N';
    if (:ciupre = :ciud_cod) then
        PREDET = 'S';
    EXECUTE PROCEDURE NOMBRE_ASCII(CIUD_NOM) returning_values (CIUD_NOM);
    suspend;
    END
end^


ALTER PROCEDURE TRAE_CLIENTE_MOVIL (
    NIT VARCHAR(20))
RETURNS (
    TERC_NOM VARCHAR(124),
    SALDO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2))
AS
declare variable contacto varchar(60);
begin
select terc_nom, substr(terc_contacto,1,60) from terceros t, clientes c where t.terc_nit = c.terc_nit and t.terc_nit = :NIT INTO :TERC_NOM, :CONTACTO;
if (TERC_NOM IS NULL) then
    TERC_NOM = '';
if ((CONTACTO IS NULL) or (CONTACTO = ''))  then
    TERC_NOM = :TERC_NOM;
ELSE
    TERC_NOM = :terc_nom || ' - ' || :CONTACTO;
EXECUTE PROCEDURE NOMBRE_ASCII(TERC_NOM) returning_values (TERC_NOM);
select sum(SALDO) FROM vencido_cliente(:nit, CAST('NOW' AS DATE), '0', 'S') INTO :SALDO;
if (:saldo is null) then
    saldo = 0;
execute procedure cupo_disponible(:nit, CAST('NOW' AS DATE), '0') returning_values (:DISPONIBLE);
suspend;
end^


ALTER PROCEDURE TRAE_CLIENTE_WEB (
    NIT VARCHAR(20))
RETURNS (
    TERC_NOM VARCHAR(60),
    TERC_DV CHAR(1),
    TERC_DIR VARCHAR(60),
    TERC_CIU VARCHAR(40),
    TERC_TEL VARCHAR(25),
    TERC_CEL VARCHAR(25),
    TERC_EMAIL VARCHAR(100),
    TERC_CONTACTO VARCHAR(255),
    TERC_INSTRUCCIONES VARCHAR(255))
AS
begin
SELECT TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CEL, TERC_EMAIL, TERC_CONTACTO, TERC_DV, CLIE_INSTRUCCIONES
    FROM TERCEROS T, CLIENTES C WHERE T.terc_nit = C.terc_nit AND TERC_CLIE = 'S' and T.terc_nit = :NIT
    INTO :TERC_NOM, :TERC_DIR, :TERC_CIU, :TERC_TEL, :TERC_CEL, :TERC_EMAIL, :TERC_CONTACTO, TERC_DV, TERC_INSTRUCCIONES;
if (TERC_NOM IS NULL) then
    TERC_NOM = '';
ELSE
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_NOM) returning_values (TERC_NOM);
if (TERC_DV IS NULL) then
    TERC_DV = '';
if (TERC_DIR IS NULL) then
    TERC_DIR = '';
ELSE
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_DIR) returning_values (TERC_DIR);
if (TERC_CIU IS NULL) then
    TERC_CIU = '';
ELSE
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_CIU) returning_values (TERC_CIU);
if (TERC_CONTACTO IS NULL) then
    TERC_CONTACTO = '';
ELSE
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_CONTACTO) returning_values (TERC_CONTACTO);
if (TERC_EMAIL IS NULL) then
    TERC_EMAIL = '';
ELSE
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_EMAIL) returning_values (TERC_EMAIL);
if (TERC_TEL IS NULL) then
    TERC_TEL = '';
ELSE
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_TEL) returning_values (TERC_TEL);
if (TERC_CEL IS NULL) then
    TERC_CEL = '';
ELSE
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_CEL) returning_values (TERC_CEL);
if (TERC_INSTRUCCIONES IS NULL) then
    TERC_INSTRUCCIONES = '';
ELSE
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_INSTRUCCIONES) returning_values (TERC_INSTRUCCIONES);
suspend;
end^


ALTER PROCEDURE TRAE_CLIENTES_MOVIL (
    BUSCAR VARCHAR(60),
    VEND INTEGER)
RETURNS (
    TERC_NIT VARCHAR(20),
    TERC_NOM VARCHAR(60),
    TERC_CONTACTO VARCHAR(60),
    TERC_DIR VARCHAR(100),
    TERC_DV CHAR(1))
AS
declare variable CLIXVEND CHAR(2);
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'PEDIDOS', 'MOSTRAR SOLO CLIENTES DEL VENDEDOR EN PEDIDOS WEB') returning_values (:CLIXVEND);
for select t.terc_nit, terc_nom, terc_contacto, terc_dir, terc_dv
    from terceros t, clientes c where t.terc_nit = c.terc_nit and terc_clie = 'S' and ((vend_cod = :vend) or (:CLIXVEND = 'NO'))
        AND (upper(terc_nom) like upper('%' || :buscar || '%')) and clie_estado = 'A' order by terc_nom
    into terc_nit, terc_nom, terc_contacto, terc_dir, terc_dv
    do
    BEGIN
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_NOM) returning_values (TERC_NOM);
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_CONTACTO) returning_values (TERC_CONTACTO);
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_DIR) returning_values (TERC_DIR);
    suspend;
    END
end^


ALTER PROCEDURE TRAE_CLIENTES_MOVIL_OFFLINE (
    VEND INTEGER)
RETURNS (
    TERC_NIT VARCHAR(20),
    TERC_NOM VARCHAR(60),
    TERC_CONTACTO VARCHAR(60),
    TERC_DIR VARCHAR(100),
    TERC_CEL VARCHAR(25),
    LIPR_COD INTEGER)
AS
declare variable CLIXVEND CHAR(2);
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'PEDIDOS', 'MOSTRAR SOLO CLIENTES DEL VENDEDOR EN PEDIDOS WEB') returning_values (:CLIXVEND);
for select t.terc_nit, terc_nom, substr(terc_contacto, 1, 60), terc_dir,lipr_cod, terc_cel from terceros t, clientes c where t.terc_nit = c.terc_nit
    and terc_clie = 'S' and c.clie_estado = 'A' and ((vend_cod = :vend) or (:CLIXVEND = 'NO'))
    order by terc_nom
    into terc_nit, terc_nom, terc_contacto, terc_dir, lipr_cod, terc_cel
    do
    BEGIN
    /*if (terc_nom is null or (terc_contacto is null) ) then
    razon_social = terc_nom;
    else
    razon_social = terc_nom || ' - ' || terc_contacto;*/
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_NOM) returning_values (TERC_NOM);
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_CONTACTO) returning_values (TERC_CONTACTO);
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_DIR) returning_values (TERC_DIR);
    EXECUTE PROCEDURE NOMBRE_ASCII(TERC_CEL) returning_values (TERC_CEL);
    --EXECUTE PROCEDURE NOMBRE_ASCII(RAZON_SOCIAL) returning_values (RAZON_SOCIAL);
    suspend;
    END
end^


ALTER PROCEDURE TRAE_FACTURA (
    ID INTEGER)
RETURNS (
    ITEMS INTEGER,
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    FECHA DATE,
    ENTREGA DATE,
    OBS VARCHAR(1024),
    TOTAL NUMERIC(18,2))
AS
begin
SELECT P.TERC_NIT, FACW_SUCURSAL, TERC_NOM, FACW_TOTAL, FACW_FECHA, FACW_ENTREGA, CAST(FACW_OBS AS VARCHAR(1024))
    FROM FACTURA_WEB P, TERCEROS T
    WHERE P.terc_nit = T.terc_nit AND FACW_ID = :ID
    INTO :NIT, :SUCURSAL, :NOMBRE, :TOTAL, :FECHA, :ENTREGA, :OBS;
SELECT MAX(FAWD_ITEM+1) FROM factura_web_detalle WHERE FACW_ID = :ID INTO :items;
suspend;
end^


ALTER PROCEDURE TRAE_PEDIDO (
    ID INTEGER)
RETURNS (
    ITEMS INTEGER,
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    FECHA DATE,
    ENTREGA DATE,
    OBS VARCHAR(1024),
    TOTAL NUMERIC(18,2))
AS
begin
SELECT P.TERC_NIT, PEWE_SUCURSAL, TERC_NOM, PEWE_TOTAL, PEWE_FECHA, PEWE_ENTREGA, CAST(PEWE_OBS AS VARCHAR(1024))
    FROM PEDIDO_WEB P, TERCEROS T
    WHERE P.terc_nit = T.terc_nit AND PEWE_ID = :ID
    INTO :NIT, :SUCURSAL, :NOMBRE, :TOTAL, :FECHA, :ENTREGA, :OBS;
SELECT MAX(PEWD_ITEM+1) FROM pedido_web_detalle WHERE PEWE_ID = :ID INTO :items;
suspend;
end^


ALTER PROCEDURE TRAE_PEDIDOS_VEND (
    VEND INTEGER,
    FECHA DATE)
RETURNS (
    NUMDOC VARCHAR(12),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
begin
FOR select PREF_PRE || PEDI_NUMERO, TERC_NIT, PEDI_SUCURSAL, PEDI_NOMTERC, PEDI_TOTAL
    from PEDIDOS WHERE PEDI_ANULADO = 'N' AND PEDI_FECHA = :FECHA AND VEND_COD = :VEND
    INTO :NUMDOC, :NIT, :SUCURSAL, :NOMBRE, :TOTAL
    DO
    BEGIN
    EXECUTE PROCEDURE NOMBRE_ASCII(:NOMBRE) returning_values (:NOMBRE);
    suspend;
    END
end^


ALTER PROCEDURE TRAE_RECAUDO_RUTA (
    RUTA INTEGER,
    FECHA DATE)
RETURNS (
    CONTRATO INTEGER,
    VALOR NUMERIC(18,2))
AS
declare variable PORC2 NUMERIC(18,2);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable SUCURSAL VARCHAR(20);
declare variable ID INTEGER;
declare variable VALOR2 NUMERIC(18,2);
begin
FECINI = FECHA - EXTRACT(DAY FROM FECHA) + 1;
FECFIN = dateadd(month,  1, FECINI) - 1;
FOR SELECT CNCL_ID, CNCL_NUMERO, CNCL_VALOR, CNCL_PORC2 FROM CONTRATOS_COLEGIOS WHERE CNCL_RUTA1 = :RUTA
    INTO :contrato, :sucursal, :valor, :porc2
    DO
    BEGIN
    /* las facturas del mes a liquidar */
    FOR SELECT F.fact_id FROM FACTURAS F WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND FACT_SUCURSAL = :sucursal
        INTO :ID
        DO
        BEGIN
        VALOR = 0;
        SELECT SUM(RD.rcde_abono) FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
            WHERE RD.rcde_iddoc = :ID AND RD.rcde_tipodoc = 31 AND R.reca_id = RD.reca_id AND
            RECA_ANULADO = 'N'
            INTO :VALOR;
        if (VALOR IS NULL) then
            VALOR = 0;
        VALOR2 = 0;
        SELECT SUM(AD.acde_aplicado) FROM aplicacion_cliente A, aplicacion_cliente_detalle AD
            WHERE AD.acde_iddoc = :ID AND AD.acde_tipodoc = 31 AND A.apcl_id = AD.apcl_id AND
            A.apcl_anulado = 'N'
            INTO :VALOR2;
        if (VALOR2 IS NULL) then
            VALOR2 = 0;
        VALOR = (VALOR+VALOR2) * (100 - PORC2) / 100;
        suspend;
        END
    /* las facturas anteriores abonadas este mes */
    FOR SELECT F.fact_id FROM FACTURAS F WHERE FACT_FECHA < :FECINI AND FACT_ANULADO = 'N' AND FACT_SUCURSAL = :sucursal
        INTO :ID
        DO
        BEGIN
        VALOR = 0;
        SELECT SUM(RD.rcde_abono) FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
            WHERE RD.rcde_iddoc = :ID AND RD.rcde_tipodoc = 31 AND R.reca_id = RD.reca_id AND r.reca_fecha >= :fecini and reca_fecha <= :fecfin AND
            RECA_ANULADO = 'N'
            INTO :VALOR;
        if (VALOR IS NULL) then
            VALOR = 0;
        VALOR2 = 0;
        SELECT SUM(AD.acde_aplicado) FROM aplicacion_cliente A, aplicacion_cliente_detalle AD
            WHERE AD.acde_iddoc = :ID AND AD.acde_tipodoc = 31 AND A.apcl_id = AD.apcl_id AND apcl_fecha >= :fecini and apcl_fecha <= :fecfin AND
            A.apcl_anulado = 'N'
            INTO :VALOR2;
        if (VALOR2 IS NULL) then
            VALOR2 = 0;
        VALOR = (VALOR+VALOR2) * (100 - PORC2) / 100;
        suspend;
        END
    END
/* la ruta 2 */
FOR SELECT CNCL_ID, CNCL_NUMERO, CNCL_VALOR, CNCL_PORC2 FROM CONTRATOS_COLEGIOS WHERE CNCL_RUTA2 = :RUTA
    INTO :contrato, :sucursal, :valor, :porc2
    DO
    BEGIN
    FOR SELECT F.fact_id FROM FACTURAS F WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
        AND FACT_SUCURSAL = :sucursal
        INTO :ID
        DO
        BEGIN
        VALOR = 0;
        SELECT SUM(RD.rcde_abono) FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
            WHERE RD.rcde_iddoc = :ID AND RD.rcde_tipodoc = 31 AND R.reca_id = RD.reca_id AND
            RECA_ANULADO = 'N'
            INTO :VALOR;
        if (VALOR IS NULL) then
            VALOR = 0;
        VALOR2 = 0;
        SELECT SUM(AD.acde_aplicado) FROM aplicacion_cliente A, aplicacion_cliente_detalle AD
            WHERE AD.acde_iddoc = :ID AND AD.acde_tipodoc = 31 AND A.apcl_id = AD.apcl_id AND
            A.apcl_anulado = 'N'
            INTO :VALOR2;
        if (VALOR2 IS NULL) then
            VALOR2 = 0;
        VALOR = (VALOR+VALOR2) * (100 - PORC2) / 100;
        suspend;
        END
    /* las facturas anteriores abonadas este mes */
    FOR SELECT F.fact_id FROM FACTURAS F WHERE FACT_FECHA < :FECINI AND FACT_ANULADO = 'N' AND FACT_SUCURSAL = :sucursal
        INTO :ID
        DO
        BEGIN
        VALOR = 0;
        SELECT SUM(RD.rcde_abono) FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
            WHERE RD.rcde_iddoc = :ID AND RD.rcde_tipodoc = 31 AND R.reca_id = RD.reca_id AND r.reca_fecha >= :fecini and reca_fecha <= :fecfin AND
            RECA_ANULADO = 'N'
            INTO :VALOR;
        if (VALOR IS NULL) then
            VALOR = 0;
        VALOR2 = 0;
        SELECT SUM(AD.acde_aplicado) FROM aplicacion_cliente A, aplicacion_cliente_detalle AD
            WHERE AD.acde_iddoc = :ID AND AD.acde_tipodoc = 31 AND A.apcl_id = AD.apcl_id AND apcl_fecha >= :fecini and apcl_fecha <= :fecfin AND
            A.apcl_anulado = 'N'
            INTO :VALOR2;
        if (VALOR2 IS NULL) then
            VALOR2 = 0;
        VALOR = (VALOR+VALOR2) * (100 - PORC2) / 100;
        suspend;
        END
    END
end^


ALTER PROCEDURE TRAE_RUTERO_DET (
    IDRUT INTEGER,
    ITEMRUT INTEGER)
RETURNS (
    RUTD_PREF VARCHAR(4),
    RUTD_NUMERO VARCHAR(8),
    RUTD_NIT VARCHAR(20),
    RUTD_CAJAS NUMERIC(18,4),
    TERC_DIR VARCHAR(60),
    TERC_TEL VARCHAR(40),
    TERC_CIU VARCHAR(40),
    RUTD_NOMCLI VARCHAR(60))
AS
BEGIN
    FOR select RUTD_PREF, RUTD_NUMERO, RUTD_NIT, RUTD_CAJAS, TERC_DIR, TERC_TEL, TERC_CIU, RUTD_NOMCLI
    FROM RUTERO_DETALLE D, TERCEROS T WHERE D.RUTD_NIT = T.TERC_NIT AND RUTE_ID = :IDRUT AND RUTD_ITEM = :ITEMRUT
    INTO :RUTD_PREF, :RUTD_NUMERO, :RUTD_NIT, :RUTD_CAJAS, :TERC_DIR, :TERC_TEL, :TERC_CIU, :RUTD_NOMCLI
    DO
    begin
    EXECUTE PROCEDURE NOMBRE_ASCII(:TERC_DIR) returning_values (:TERC_DIR);
    EXECUTE PROCEDURE NOMBRE_ASCII(:TERC_CIU) returning_values (:TERC_CIU);
    EXECUTE PROCEDURE NOMBRE_ASCII(:RUTD_NOMCLI) returning_values (:RUTD_NOMCLI);
    suspend;
    END
END^


ALTER PROCEDURE TRAE_RUTEROS_CONDUCTOR (
    CONDUCT VARCHAR(20))
RETURNS (
    RUTID INTEGER,
    PREFRUT VARCHAR(4),
    NUMRUT VARCHAR(8),
    FECRUT DATE,
    ITEMDOCRUT INTEGER,
    IDDOC INTEGER,
    NITDOCRUT VARCHAR(20),
    NOMCLIDOCRUT VARCHAR(60),
    DIRCLI VARCHAR(60))
AS
BEGIN
SELECT FIRST 1 RUTE_ID, PREF_PRE, RUTE_NUMERO, RUTE_FECHA FROM RUTERO R WHERE RUTE_CONDUCTOR = :CONDUCT AND RUTE_CONFIMADO = 'S'
    AND EXISTS(SELECT * FROM RUTERO_DETALLE D WHERE R.RUTE_ID = D.RUTE_ID AND D.RUTD_ENTREGADO = 'N')
    ORDER BY RUTE_ID DESC INTO :RUTID, PREFRUT, NUMRUT, :FECRUT;
    FOR SELECT RUTD_ITEM, RUTD_FACTID, RUTD_NIT, RUTD_NOMCLI FROM RUTERO_DETALLE
    WHERE RUTE_ID = :RUTID AND RUTD_ENTREGADO <> 'S' INTO :itemdocrut, :IDDOC, :nitdocrut, :nomclidocrut
    DO
    begin
    SELECT TERC_DIR FROM TERCEROS WHERE TERC_NIT = :NITDOCRUT INTO :DIRCLI;
    EXECUTE PROCEDURE NOMBRE_ASCII(:nomclidocrut) returning_values (:nomclidocrut);

    SUSPEND;
    END
END^


ALTER PROCEDURE TRAE_SUCURSALES (
    NIT VARCHAR(20))
RETURNS (
    NOMBRE VARCHAR(125),
    CLCU_COD VARCHAR(10),
    LIPR_COD INTEGER)
AS
declare variable DIR VARCHAR(60);
begin
FOR select CLSU_NOMBRE, CLSU_DIR, CLCU_COD, LIPR_COD from CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT and CLSU_ACTIVO = 'S'
    INTO :NOMBRE, :DIR, :clcu_cod, LIPR_COD
    DO
    BEGIN
    if ((:DIR IS NOT NULL) or (:DIR <> '')) then
        NOMBRE = :NOMBRE ||  ' - ' || :DIR;
    EXECUTE PROCEDURE NOMBRE_ASCII(:NOMBRE) returning_values (:NOMBRE);
    suspend;
    END
end^


ALTER PROCEDURE TRAE_UN_RECAUDO (
    IDCONTRATO INTEGER,
    FECHA DATE)
RETURNS (
    VALOR NUMERIC(18,2))
AS
declare variable PORC2 NUMERIC(18,2);
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable SUCURSAL VARCHAR(20);
declare variable ID INTEGER;
declare variable VALOR2 NUMERIC(18,2);
begin
FECINI = FECHA - EXTRACT(DAY FROM FECHA) + 1;
FECFIN = dateadd(month,  1, FECINI) - 1;
SELECT CNCL_NUMERO, CNCL_PORC2 FROM CONTRATOS_COLEGIOS WHERE CNCL_ID = :idcontrato
    INTO :sucursal, :porc2;
VALOR = 0;
/* las facturas del mes a liquidar */
FOR SELECT F.fact_id FROM FACTURAS F WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND FACT_SUCURSAL = :sucursal
    INTO :ID
    DO
    BEGIN
    SELECT SUM(RD.rcde_abono) FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
        WHERE RD.rcde_iddoc = :ID AND RD.rcde_tipodoc = 31 AND R.reca_id = RD.reca_id AND
        RECA_ANULADO = 'N'
        INTO :VALOR2;
    if (VALOR2 IS NULL) then
        VALOR2 = 0;
    VALOR = (VALOR+VALOR2);
    VALOR2 = 0;
    SELECT SUM(AD.acde_aplicado) FROM aplicacion_cliente A, aplicacion_cliente_detalle AD
        WHERE AD.acde_iddoc = :ID AND AD.acde_tipodoc = 31 AND A.apcl_id = AD.apcl_id AND
        A.apcl_anulado = 'N'
        INTO :VALOR2;
    if (VALOR2 IS NULL) then
        VALOR2 = 0;
    VALOR = (VALOR+VALOR2);
    END
/* las facturas anteriores abonadas este mes */
FOR SELECT F.fact_id FROM FACTURAS F WHERE FACT_FECHA < :FECINI AND FACT_ANULADO = 'N' AND FACT_SUCURSAL = :sucursal
    INTO :ID
    DO
    BEGIN
    VALOR2 = 0;
    SELECT SUM(RD.rcde_abono) FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD
        WHERE RD.rcde_iddoc = :ID AND RD.rcde_tipodoc = 31 AND R.reca_id = RD.reca_id AND r.reca_fecha >= :fecini and reca_fecha <= :fecfin AND
        RECA_ANULADO = 'N'
        INTO :VALOR2;
    if (VALOR2 IS NULL) then
        VALOR2 = 0;
    VALOR = (VALOR+VALOR2);
    VALOR2 = 0;
    SELECT SUM(AD.acde_aplicado) FROM aplicacion_cliente A, aplicacion_cliente_detalle AD
        WHERE AD.acde_iddoc = :ID AND AD.acde_tipodoc = 31 AND A.apcl_id = AD.apcl_id AND apcl_fecha >= :fecini and apcl_fecha <= :fecfin AND
        A.apcl_anulado = 'N'
        INTO :VALOR2;
    if (VALOR2 IS NULL) then
        VALOR2 = 0;
    VALOR = (VALOR+VALOR2);
    END
VALOR = VALOR * (100 - PORC2) / 100;
suspend;
end^


ALTER PROCEDURE TRASCUENTAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT TRAS_ID, CUBA_COD, PRBA_PREF, TRAS_NUMERO FROM TRASLADOS
    WHERE TRAS_ANULADO = 'N' AND TRAS_FECHA >= :FECINI AND TRAS_FECHA <= :FECFIN
    ORDER BY TRAS_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 76 AND CUBA_COD = :CTA INTO :IDI;
    if (IDI is NOT NULL) then
      BEGIN
      if (CN <> 'N') then
        EXECUTE PROCEDURE contabil_trascuenta (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
      else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
      if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_trascuenta_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
      if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
      ELSE
        ESTADO = 'ERROR';
      suspend;
      END
    end
  END
END^


ALTER PROCEDURE TRASFERENCIAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT 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_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 13 INTO :IDI;
    if (CN <> 'N') then
        EXECUTE PROCEDURE contabil_traslamercancia (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
    if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_trasmerc_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
    if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        END
    ELSE
        ESTADO = 'ERROR';
    suspend;
    end
  END
END^


ALTER PROCEDURE TRASLACAJAS_SIN_CONTABILIDAD (
    FECINI DATE,
    FECFIN DATE,
    CN CHAR(1))
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT TRCJ_ID, PREF_PRE, TRCJ_numero FROM TRASLADOS_CAJA WHERE TRCJ_ANULADO = 'N' AND
    TRCJ_FECHA >= :FECINI AND TRCJ_FECHA <= :FECFIN
    ORDER BY TRCJ_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 66 INTO :IDI;
    if (CN <> 'N') then
        EXECUTE PROCEDURE CONTABIL_TRASLACAJA (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
    if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_traslacaja_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
    IF (ERROR = 0) THEN
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    end
  END
END^


ALTER PROCEDURE TRASLADOS_SIN_CONTABILDAD_NIIF (
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
declare variable IDREF INTEGER;
BEGIN
FOR SELECT TRAN_ID, PREF_PRE, TRAN_NUMERO FROM trasferencias WHERE TRAN_ANULADO = 'N' AND
    TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN AND ((:PREFIJO = '') or (PREF_PRE = :PREFIJO))
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idc = null;
  if (not exists (SELECT E.ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE ENCO_TIPOREF = 13 AND ENCO_IDREF = :ID AND E.enco_consec = D.enco_consec)) then
    BEGIN
    SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 13 AND CNTB_IDREF = :ID into :idc;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= 100000;
    if (idc IS NOT NULL) then
        begin
        ESTADO = 'PROCESANDO';
        ERROR = NULL;
        SUSPEND;
        SELECT MAX(ININ_ID) FROM interfaz_inventario WHERE PREF_PRE = :PREF AND TIDO_COD = 13 INTO :IDI;
        EXECUTE PROCEDURE contabil_trasmerc_niif (:ID, :IDI, :idc) RETURNING_VALUES (:ERROR, VER);
        if ((ERROR = 0) or (error IS NULL)) then
            BEGIN
            SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E WHERE ENCO_TIPOREF = 13 AND ENCO_IDREF = :ID INTO :IDREF;
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
                SELECT :IDREF, 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 = :idc AND CNDE_ITEM >= 100000;
            UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDREF;
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        end
    END
  END
END^


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


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^


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;
if (UCOSTO IS NULL) then
    UCOSTO = 0;
execute procedure factor_unidad_cant(:ARTICULO, :UNIDAD) RETURNING_VALUES (:FACTOR);
UCOSTO = UCOSTO * FACTOR;
SUSPEND;
END^


ALTER PROCEDURE ULTIMO_COSTO_NIIF (
    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_niif
    WHERE (ARTI_COD = :ARTICULO) AND (COST_FECHA <= :FECHA)
    ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC INTO :UCOSTO;
if (UCOSTO IS NULL) then
    UCOSTO = 0;
execute procedure factor_unidad_cant(:ARTICULO, :UNIDAD) RETURNING_VALUES (:FACTOR);
UCOSTO = UCOSTO * FACTOR;
SUSPEND;
END^


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


ALTER PROCEDURE UNIDADES (
    ID VARCHAR(15))
RETURNS (
    UNIDAD VARCHAR(8),
    FACCAN NUMERIC(18,4),
    FACPRE NUMERIC(18,4))
AS
BEGIN
  SELECT ARTI_UNIDAD, 1, 1 FROM ARTICULO WHERE ARTI_COD = :ID INTO :UNIDAD, :FACCAN, :FACPRE;
  SUSPEND;
  FOR SELECT UNAR_UNIDAD, UNAR_FACCAN, UNAR_FACPRE FROM UNIDAD_ARTICULO WHERE ARTI_COD = :ID AND UNAR_ACTIVA = 'S'
    INTO :UNIDAD, :FACCAN, :FACPRE
    DO SUSPEND;
END^


ALTER PROCEDURE UNIDADES_OFFLINE
RETURNS (
    ARTI_COD VARCHAR(15),
    UNAR_UNIDAD VARCHAR(8),
    UNAR_FACCAN NUMERIC(18,6),
    UNAR_FACPRE NUMERIC(18,6))
AS
begin
FOR select ARTI_COD, UNAR_UNIDAD, UNAR_FACCAN, UNAR_FACPRE
FROM UNIDAD_ARTICULO where UNAR_ACTIVA = 'S'
INTO :ARTI_COD, :UNAR_UNIDAD, :UNAR_FACCAN, :UNAR_FACPRE
do
begin
EXECUTE PROCEDURE NOMBRE_ASCII(UNAR_UNIDAD) returning_values (UNAR_UNIDAD);
suspend;
end
end^


ALTER PROCEDURE USUARIOS_MENSAJE
RETURNS (
    USUARIO VARCHAR(10),
    CONECTADO CHAR(1))
AS
begin
FOR SELECT USER_COD FROM USUARIO U INTO :USUARIO DO
    BEGIN
    CONECTADO = 'N';
    if (EXISTS (SELECT MON$USER FROM MON$ATTACHMENTS WHERE MON$USER = :USUARIO)) then
        CONECTADO = 'S';
    suspend;
    END
end^


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(8),
    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);
declare variable CONSART NUMERIC(18,2);
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
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(31, :id, :item, :articulo, :fecha) returning_values (:costo, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTO = COSTO + (CONSART * cant);
                    PRECIO = PRECIO + CONSUMO;
                    end
                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
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(32, :id, :item, :articulo, :fecha) returning_values (:costo, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTO = COSTO + (CONSART * cant);
                    PRECIO = PRECIO + CONSUMO;
                    end
                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
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(33, :id, :item, :articulo, :fecha) returning_values (:costo, :ultcos);
                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTO = COSTO + (CONSART * cant);
                    PRECIO = PRECIO + CONSUMO;
                    end
                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 (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTO = COSTO + (CONSART * cant);
                    PRECIO = PRECIO + CONSUMO;
                    end
                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 (ICOINC = 'SI') then
                    begin
                    EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                    COSTO = COSTO + (CONSART * cant);
                    PRECIO = PRECIO + CONSUMO;
                    end
                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^


ALTER PROCEDURE VALIDA_CUENTAS_ARTICULO
RETURNS (
    ART VARCHAR(20),
    CTA VARCHAR(20),
    TIPO VARCHAR(20))
AS
declare variable INV VARCHAR(20);
declare variable IVAC VARCHAR(20);
declare variable IVAV VARCHAR(20);
declare variable VNT VARCHAR(20);
declare variable COS VARCHAR(20);
declare variable COMP VARCHAR(20);
declare variable DEV VARCHAR(20);
declare variable CONS VARCHAR(20);
declare variable OK CHAR(1);
declare variable TIVA INTEGER;
begin
FOR SELECT ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTACONS, COAR_CTAVNT, COAR_CTACOS, COAR_CTACOMP, COAR_CTADEV
    FROM CONTABIL_ARTICULO ORDER BY ARTI_COD
    INTO :ART, :INV, :IVAC, :IVAV, :CONS, :VNT, :COS, :COMP, :DEV
    DO
    BEGIN
    TIPO = 'INVENTARIO';
    EXECUTE PROCEDURE EXISTE_CUENTA(INV) RETURNING_VALUES (:OK);
    if (OK = 'N') then
        BEGIN
        CTA = INV;
        suspend;
        END
    TIPO = 'IVA COMPRAS';
    EXECUTE PROCEDURE EXISTE_CUENTA(IVAC) RETURNING_VALUES (:OK);
    if (OK = 'N') then
        BEGIN
        SELECT TAIV_COD FROM ARTICULO WHERE ARTI_COD = :ART INTO :TIVA;
        if (TIVA <> 0) then
            BEGIN
            CTA = IVAC;
            suspend;
            END
        END
    TIPO = 'IVA VENTAS';
    EXECUTE PROCEDURE EXISTE_CUENTA(IVAV) RETURNING_VALUES (:OK);
    if (OK = 'N') then
        BEGIN
        SELECT TAIV_COD FROM ARTICULO WHERE ARTI_COD = :ART INTO :TIVA;
        if (TIVA <> 0) then
            BEGIN
            CTA = IVAV;
            suspend;
            END
        END
    TIPO = 'CONSUMO';
    EXECUTE PROCEDURE EXISTE_CUENTA(CONS) RETURNING_VALUES (:OK);
    if (OK = 'N') then
        BEGIN
        SELECT ARTI_CONSUMO FROM ARTICULO WHERE ARTI_COD = :ART INTO :TIVA;
        if (TIVA <> 0) then
            BEGIN
            CTA = CONS;
            suspend;
            END
        END
    TIPO = 'VENTAS';
    EXECUTE PROCEDURE EXISTE_CUENTA(VNT) RETURNING_VALUES (:OK);
    if (OK = 'N') then
        BEGIN
        CTA = VNT;
        suspend;
        END
    TIPO = 'COSTOS';
    EXECUTE PROCEDURE EXISTE_CUENTA(COS) RETURNING_VALUES (:OK);
    if (OK = 'N') then
        BEGIN
        CTA = COS;
        suspend;
        END
    TIPO = 'COMPRAS';
    EXECUTE PROCEDURE EXISTE_CUENTA(COMP) RETURNING_VALUES (:OK);
    if (OK = 'N') then
        BEGIN
        CTA = COMP;
        suspend;
        END
    TIPO = 'DEVOLUCIONES';
    EXECUTE PROCEDURE EXISTE_CUENTA(DEV) RETURNING_VALUES (:OK);
    if (OK = 'N') then
        BEGIN
        CTA = DEV;
        suspend;
        END
    END
end^


ALTER PROCEDURE VALIDE_ARTICULO (
    CODIGO VARCHAR(15))
RETURNS (
    TIPO CHAR(1),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    ID VARCHAR(15),
    LOTE CHAR(1))
AS
declare variable USARDC CHAR(2);
declare variable DESCORTA VARCHAR(30);
BEGIN
  TIPO = '0';
  DESCRIPCION = '';
  UNIDAD = '';
  LOTE = '';
  EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'ARTICULOS', 'USAR DESCRIPCION CORTA EN LUGAR DE LA ESTANDAR EN BUSQUEDA Y DOCUMENTOS DE VENTA') returning_values (USARDC);
  /* Busquelo como cÃ³digo de barras */
  SELECT FIRST 1 '1', B.ARTI_COD, COBA_DES,COBA_UNIDAD, ARTI_EXIST, ARTI_DESCORTA
        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, :DESCORTA;
  if (TIPO <> '1') then
    SELECT '2', ARTI_COD, ARTI_DES, ARTI_UNIDAD, ARTI_EXIST, ARTI_DESCORTA
        FROM ARTICULO
        WHERE ARTI_COD = :CODIGO
        INTO :TIPO, :ID, :DESCRIPCION, :UNIDAD, :LOTE, :DESCORTA;
  if (USARDC = 'SI') then
    DESCRIPCION = DESCORTA;
  SUSPEND;
END^


ALTER PROCEDURE VALIDE_BONO (
    FEC DATE,
    MONTO NUMERIC(18,2))
RETURNS (
    BANCO CHAR(2),
    CUENTA VARCHAR(10),
    NUMERO VARCHAR(8),
    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^


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);
    if (OK = 'S') then
        BEGIN
        SELECT CUEN_ACTIVA FROM CUENTAS WHERE CUEN_COD = :CUENTA INTO :OK;
        if (OK = 'N') then
          EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :cuenta || ' estÃ¡ inactiva.';
        END
    END
  SUSPEND;
END^


ALTER PROCEDURE VALIDE_CUENTA_C (
    CUENTA VARCHAR(20))
RETURNS (
    ERROR INTEGER)
AS
DECLARE VARIABLE TOT_DIGITOS SMALLINT;
DECLARE VARIABLE DIGITOS SMALLINT;
DECLARE VARIABLE LON SMALLINT;
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE N SMALLINT;
DECLARE VARIABLE MINNIVEL SMALLINT;
declare variable NIVEL SMALLINT;
BEGIN
ERROR = 0;
EXECUTE PROCEDURE EXISTE_CUENTA(CUENTA) RETURNING_VALUES (:OK);
IF (OK = 'N') THEN
    ERROR = 1;
ELSE
    BEGIN
    /* Verifica que los dÃ­gitos de la cuenta esten completos y retorna el nivel */
    NIVEL = 0;
    TOT_DIGITOS = 0;
    LON = STRLEN(CUENTA);
    FOR SELECT ESTR_NIVEL, ESTR_DIGITOS FROM ESTRUCTURA ORDER BY ESTR_NIVEL INTO :N, :DIGITOS
        DO
        BEGIN
        TOT_DIGITOS = TOT_DIGITOS + DIGITOS;
        IF (LON = TOT_DIGITOS) THEN
            NIVEL = N;
        END
    IF (NIVEL = 0) THEN
        ERROR = 2;
    ELSE
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'ESTRUCTURA', 'MINIMO NIVEL AFECTABLE') RETURNING_VALUES (:MINNIVEL);
        if (MINNIVEL > NIVEL) THEN
            ERROR = 3;
        ELSE
            BEGIN
            LON = STRLEN(CUENTA);
            SELECT COUNT(*) FROM CUENTAS WHERE SUBSTR(CUEN_COD, 1, :LON) = :CUENTA INTO :N;
            IF (N <> 1) THEN
                BEGIN
                OK = 'N';
                ERROR = 4;
                END
            END
        END
    END
SUSPEND;
END^


ALTER PROCEDURE VALIDE_CUENTA_NIIF (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
BEGIN
  /* Verifica que la cuenta exista y sea afectable */
  EXECUTE PROCEDURE EXISTE_CUENTA_NIIF(CUENTA) RETURNING_VALUES (:OK);
  IF (OK = 'N') THEN
      EXCEPTION CUENTA_NO_EXISTE 'La cuenta NIIF ' || :cuenta || ' no existe.';
  ELSE
    BEGIN
    EXECUTE PROCEDURE cuenta_afectable_niif (CUENTA) RETURNING_VALUES (:OK);
    if (OK = 'S') then
        BEGIN
        SELECT CUEN_ACTIVA FROM CUENTAS_NIIF WHERE CUEN_COD = :CUENTA INTO :OK;
        if (OK = 'N') then
          EXCEPTION CUENTA_NO_EXISTE 'La cuenta NIIF ' || :cuenta || ' estÃ¡ inactiva.';
        END
    END
  SUSPEND;
END^


ALTER PROCEDURE VALIDE_CUENTA_NIIF_C (
    CUENTA VARCHAR(20))
RETURNS (
    ERROR INTEGER)
AS
DECLARE VARIABLE TOT_DIGITOS SMALLINT;
DECLARE VARIABLE DIGITOS SMALLINT;
DECLARE VARIABLE LON SMALLINT;
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE N SMALLINT;
DECLARE VARIABLE MINNIVEL SMALLINT;
declare variable NIVEL SMALLINT;
BEGIN
ERROR = 0;
EXECUTE PROCEDURE existe_cuenta_niif(CUENTA) RETURNING_VALUES (:OK);
IF (OK = 'N') THEN
    ERROR = 1;
ELSE
    BEGIN
    /* Verifica que los dÃ­gitos de la cuenta esten completos y retorna el nivel */
    NIVEL = 0;
    TOT_DIGITOS = 0;
    LON = STRLEN(CUENTA);
    FOR SELECT ESTR_NIVEL, ESTR_DIGITOS FROM ESTRUCTURA ORDER BY ESTR_NIVEL INTO :N, :DIGITOS
        DO
        BEGIN
        TOT_DIGITOS = TOT_DIGITOS + DIGITOS;
        IF (LON = TOT_DIGITOS) THEN
            NIVEL = N;
        END
    IF (NIVEL = 0) THEN
        ERROR = 2;
    ELSE
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'ESTRUCTURA', 'MINIMO NIVEL AFECTABLE') RETURNING_VALUES (:MINNIVEL);
        if (MINNIVEL > NIVEL) THEN
            ERROR = 3;
        ELSE
            BEGIN
            LON = STRLEN(CUENTA);
            SELECT COUNT(*) FROM cuentas_niif WHERE SUBSTR(CUEN_COD, 1, :LON) = :CUENTA INTO :N;
            IF (N <> 1) THEN
                BEGIN
                OK = 'N';
                ERROR = 4;
                END
            END
        END
    END
SUSPEND;
END^


ALTER PROCEDURE VALIDE_DESCUENTO (
    ARTICULO VARCHAR(20),
    NIT VARCHAR(20),
    TOTAL NUMERIC(18,2),
    CANT NUMERIC(18,4))
RETURNS (
    ID INTEGER,
    OK CHAR(1),
    DTOP NUMERIC(18,2))
AS
declare variable codgrp varchar(2);
declare variable codsub varchar(3);
declare variable codmar varchar(3);
declare variable ITEM integer;
declare variable DIASEM integer;
declare variable VTAMAX NUMERIC(18,2);
declare variable VTACLI NUMERIC(18,2);
declare variable CANTOT NUMERIC(18,2);
declare variable TOTART NUMERIC(18,2);
declare variable SOLOCLI CHAR(1);
declare variable FECDESDE DATE;
begin
OK = 'N';
/* descuentos por cliente */
DIASEM = EXTRACT (weekday FROM CAST('NOW' AS DATE));
DIASEM = POWER(2, DIASEM);
SELECT d.dctp_id, D.dctp_fami, D.dctp_grupo, D.dctp_marca, D.dctp_porc, D.dctp_cliins FROM DESCUENTOS_PRECIOS d
    WHERE ((dctp_diasem = 0) or (bin_and(dctp_diasem, :diasem) <> 0)) and (dctp_horaini <= cast('NOW' as TIME)) and (dctp_horafin >= cast('NOW' as TIME))
        and (dctp_basemin <= :TOTAL) INTO :ID, :codgrp, :codsub, :codmar, :DTOP, :SOLOCLI;
if ((ID IS NOT NULL) AND (ID <> 0)) then
    BEGIN
    /* VALIDE CLIENTE */
    if (SOLOCLI = 'S') then
        BEGIN
        if ((NOT EXISTS (SELECT AUTO_NUMERO FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT)) AND
            (NOT EXISTS (SELECT PTVT_ID FROM PUNTO_VENTA WHERE TERC_NIT = :NIT))) then
            BEGIN
            SELECT CLIE_FECHA FROM CLIENTES WHERE TERC_NIT = :NIT INTO :FECDESDE;
            if (FECDESDE < CAST('NOW' AS DATE)) then
                OK = 'S';
            END
        END
    ELSE
        OK = 'S';
    if (OK = 'S') then
        BEGIN
        SELECT DD.dcpd_item, DD.dcpd_vtamax, DD.dcpd_cantot FROM descuentos_precios_det DD WHERE DD.dctp_id = :id AND DD.ARTI_COD = :articulo
            INTO :ITEM, :VTAMAX, :CANTOT;
        if ((ITEM IS NOT NULL) AND (ITEM <> 0)) then
            begin
            OK = 'S';
            end
        if (EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :codgrp AND SUBG_COD = :codsub AND MARC_COD = :codmar)) then
            BEGIN
            OK = 'S';
            END
        if (OK = 'S') then
            BEGIN
            /* VALIDE EL TOTAL DE UNIDADES */
            if (CANTOT <> 0) then
                BEGIN
                SELECT SUM(DCPC_VENTA) FROM DESCUENTOS_PRECIOS_CLI WHERE DCTP_ID = :ID AND ARTI_COD = :ARTICULO INTO :TOTART;
                if (TOTART IS NULL) then
                    TOTART = 0;
        
                if ((TOTART + CANT) > CANTOT) then
                    OK = 'N';
                END
            if (VTAMAX <> 0) then
                BEGIN
                SELECT sum(dcpc_venta) FROM DESCUENTOS_PRECIOS_CLI WHERE DCTP_ID = :ID AND TERC_NIT = :NIT AND ARTI_COD = :ARTICULO
                    INTO :VTACLI;
                if (VTACLI IS NULL) then
                    VTACLI = 0;
        
                if (VTACLI+CANT > VTAMAX) then
                    OK = 'N';
                END
            END
        END
    if (OK = 'N') then
        DTOP = 0;
    suspend;
    END
end^


ALTER PROCEDURE VALIDE_ESTRUCTURA (
    CUENTA VARCHAR(20))
RETURNS (
    NIVEL SMALLINT)
AS
DECLARE VARIABLE TOT_DIGITOS SMALLINT;
DECLARE VARIABLE DIGITOS SMALLINT;
DECLARE VARIABLE LON SMALLINT;
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE N SMALLINT;
BEGIN
  /* Verifica que los dÃ­gitos de la cuenta esten completos y retorna el nivel, si es incorrecto
     retorna nivel = 0 */
  OK = 'N';
  TOT_DIGITOS = 0;
  LON = STRLEN(CUENTA);
  FOR SELECT ESTR_NIVEL, ESTR_DIGITOS FROM ESTRUCTURA ORDER BY ESTR_NIVEL INTO :N, :DIGITOS
  DO
  BEGIN
  TOT_DIGITOS = TOT_DIGITOS + DIGITOS;
      IF (LON = TOT_DIGITOS) THEN
    BEGIN
    OK = 'S';
    NIVEL = N;
    END
  END
  IF (OK = 'N') THEN
  BEGIN
  EXCEPTION ESTRUCTURA_INCORRECTA;
  NIVEL = 0;
  END
  SUSPEND;
END^


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^


ALTER PROCEDURE VALIDE_NIVEL (
    CUENTA VARCHAR(20))
RETURNS (
    NIVEL SMALLINT)
AS
DECLARE VARIABLE MINNIVEL SMALLINT;
BEGIN
  /* Verifica la estructura y que el nivel de la cuenta sea mayor o igual que el mÃ­nimo afectable */
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
  IF (NIVEL > 0) THEN
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'ESTRUCTURA', 'MINIMO NIVEL AFECTABLE')     RETURNING_VALUES (:MINNIVEL);
    IF (MINNIVEL > NIVEL) THEN
      EXCEPTION NIVEL_NO_AFECTABLE;
    END
  SUSPEND;
END^


ALTER PROCEDURE VALIDE_PADRE (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
DECLARE VARIABLE NIVEL SMALLINT;
DECLARE VARIABLE DIGITOS SMALLINT;
DECLARE VARIABLE PADRE VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE VALOR SMALLINT;
DECLARE VARIABLE REGISTROS SMALLINT;
BEGIN
  /* Verifica que exista el padre de la cuenta */
  OK = 'N';
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
  IF (NIVEL > 1) THEN
    BEGIN
    NIVEL = NIVEL - 1;
    EXECUTE PROCEDURE DIGITOS_NIVEL (NIVEL) RETURNING_VALUES (:DIGITOS);
    PADRE = SUBSTR (CUENTA, 1, DIGITOS);
    EXECUTE PROCEDURE EXISTE_CUENTA (PADRE) RETURNING_VALUES (:EXISTE);
    IF (EXISTE = 'N') THEN
      EXCEPTION CUENTA_PADRE_NO_EXISTE;
    ELSE
  BEGIN
 /* Verifique que la cuenta padre no tenga movimiento */
        SELECT COUNT(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :PADRE INTO :REGISTROS;
        IF (REGISTROS > 0) THEN
          EXCEPTION MOVIMIENTO_CUENTA_PADRE;
        ELSE
          OK = 'S';
     END
    END
    suspend;
END^


ALTER PROCEDURE VALIDE_PADRE_NIIF (
    CUENTA VARCHAR(20))
RETURNS (
    OK CHAR(1))
AS
DECLARE VARIABLE NIVEL SMALLINT;
DECLARE VARIABLE DIGITOS SMALLINT;
DECLARE VARIABLE PADRE VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE REGISTROS SMALLINT;
BEGIN
  /* Verifica que exista el padre de la cuenta */
  OK = 'N';
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
  IF (NIVEL > 1) THEN
    BEGIN
    NIVEL = NIVEL - 1;
    EXECUTE PROCEDURE DIGITOS_NIVEL (NIVEL) RETURNING_VALUES (:DIGITOS);
    PADRE = SUBSTR (CUENTA, 1, DIGITOS);
    EXECUTE PROCEDURE existe_cuenta_niif (PADRE) RETURNING_VALUES (:EXISTE);
    IF (EXISTE = 'N') THEN
      EXCEPTION CUENTA_PADRE_NO_EXISTE  'No existe la cuenta ' || :PADRE;
    ELSE
    BEGIN
 /* Verifique que la cuenta padre no tenga movimiento */
        SELECT COUNT(CODE_ITEM) FROM COMPROBANTE_DETALLE_NIIF WHERE CUEN_COD = :PADRE INTO :REGISTROS;
        IF (REGISTROS > 0) THEN
          EXCEPTION MOVIMIENTO_CUENTA_PADRE;
        ELSE
          OK = 'S';
     END
    END
    suspend;
END^


ALTER PROCEDURE VALIDE_RECAUDO
RETURNS (
    CONTRATO VARCHAR(20),
    FECHA DATE,
    MONTO NUMERIC(18,2),
    RAZON VARCHAR(60))
AS
declare variable NIT varchar(20);
declare variable NIT2 VARCHAR(20);
begin
/* CON LA REFERENCIA UBIQUE EL CLIENTE, SUCURSAL */
FOR SELECT RECR_FECHA, RECR_REFERENCIA, RECR_MONTO FROM RECAUDO
    INTO :FECHA, :CONTRATO, :MONTO
    DO
    BEGIN
    NIT = NULL;
    NIT2 = NULL;
    SELECT FIRST 1 TERC_NIT FROM CLIENTE_SUCURSALES WHERE CLCU_COD = :contrato INTO :NIT;
    SELECT FIRST 1 SKIP 1 TERC_NIT FROM CLIENTE_SUCURSALES WHERE CLCU_COD = :contrato INTO :NIT2;
    if (NIT IS NULL) then
        BEGIN
        RAZON = 'CONTRATO NO EXISTE';
        SUSPEND;
        END
    ELSE
        BEGIN
        if (nit2 is not null) then
            begin
            RAZON = 'CONTRATO REPETIDO CON NITS ' || :NIT || ' Y ' || :NIT2;
            SUSPEND;
            end
        END
    END
end^


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^


ALTER PROCEDURE VALOR_INICIAL_INVENTARIO_N (
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    INICIAL NUMERIC(18,2))
AS
BEGIN
SELECT FIRST 1 (COST_SALDOP+COST_ENTP-COST_SALP) FROM costos_niif
    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^


ALTER PROCEDURE VALOR_INVENTARIO (
    FECHA DATE)
RETURNS (
    SALDO NUMERIC(18,2))
AS
declare variable COSTO NUMERIC(18,2);
declare variable CODIGO VARCHAR(20);
begin
SALDO = 0;
FOR SELECT ARTI_COD FROM ARTICULO A WHERE EXISTS (SELECT EXIS_FECHA FROM EXISTENCIA WHERE ARTI_COD = A.arti_cod)
    INTO :CODIGO
    DO
    BEGIN
    EXECUTE PROCEDURE valor_inicial_inventario (:CODIGO, :FECHA+1) returning_values (COSTO);
    SALDO = SALDO + COSTO;
    END
suspend;
end^


ALTER PROCEDURE VARIACION_COSTOS (
    ARTICULO VARCHAR(15),
    FECFIN DATE,
    MONEDA INTEGER)
RETURNS (
    FECHA DATE,
    COSTO NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    NUMERODOC VARCHAR(10),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable TRM NUMERIC(18,2);
begin
FOR SELECT FIRST 30 COST_FECHA, COST_ULTIMO, COST_TIPO, COST_IDMOV FROM COSTOS
    WHERE ARTI_COD = :ARTICULO AND COST_ENTC <> 0 AND COST_TIPO <> 33 AND COST_FECHA <= :FECFIN
    ORDER BY COST_FECHA DESC
    INTO :FECHA, :COSTO, :TIPO, :ID
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :TIPO INTO :tipodoc;
    SELECT first 1 M.mvar_pref || M.mvar_numero, m.mvar_idref FROM movimiento_articulo M
        WHERE M.mvar_cons = :ID and arti_cod = :articulo INTO :numerodoc, :id;
    if (MONEDA <> 0) then
        BEGIN
        /* BUSQUE LA COMPRA QUE LO INGRESO Y TRAIGA EL TRM */
        TRM = 1;
        if (TIPO = 21) then
            begin
            SELECT FACO_TRM FROM facturas_compra WHERE FACO_ID = :ID INTO :TRM;
            if ((TRM <> 1) AND (TRM IS NOT NULL)) then
                COSTO = COSTO / TRM;
            end
        if (TIPO = 137) then
            begin
            SELECT TACA_MONTO FROM factura_proforma WHERE FAPO_ID = :ID INTO :TRM;
            if ((TRM <> 1) AND (TRM IS NOT NULL)) then
                COSTO = COSTO / TRM;
            end
        END
    suspend;
    END
end^


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(8),
    SALDO NUMERIC(18,2),
    RTFTE NUMERIC(18,2),
    RTIVA NUMERIC(18,2),
    RTICA NUMERIC(18,2),
    RCREE NUMERIC(18,2),
    DTOF NUMERIC(18,2),
    TIPONOM VARCHAR(8))
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 AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable FECDOC DATE;
declare variable DIAS INTEGER;
declare variable DIASBLOQ INTEGER;
declare variable VALCUPO CHAR(1);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
/* BUSQUE 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
    if (TIPO = 31) then
        BEGIN
        VALCUPO = NULL;
        SELECT FIRST 1 e.evve_cupo from eventos_ventas e where exists (select cofa_item from
            facturas f, consolidado_faltantes c, pedidos p
            where fact_id = :id and f.fact_consolida = c.cofa_id and c.cofa_tipoori = 34 and c.cofa_tipodes = 31 and
            c.cofa_idori = p.pedi_id and p.pedi_evento = e.evve_id and c.cofa_cantcr <> 0)
            into :valcupo;
        if (VALCUPO IS NULL) then
            VALCUPO = 'S';
        END
    else
        VALCUPO = 'S';
    if (VALCUPO = 'S') then
        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;
                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA), SUM(SDCA_RCREE - SDCA_ABRCREE)
                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                if (RTFTE IS NULL) then
                    RTFTE = 0;
                if (RTIVA IS NULL) then
                    RTIVA = 0;
                if (RTICA IS NULL) then
                    RTICA = 0;
                if (RCREE IS NULL) then
                    RCREE = 0;
                if (FAUTORET <= FECDOC) then
                    BEGIN
                    RTFTE = 0;
                    RTIVA = 0;
                    RTICA = 0;
                    END
                if (fautorcree <= FECDOC) then
                    RCREE = 0;
                SUSPEND;
                END
            END
        END
    END
END^


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^


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^


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^


ALTER PROCEDURE VENTAS_ARTICULO (
    ARTICULO VARCHAR(15),
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER,
    BODEGA VARCHAR(2))
RETURNS (
    FACTURAS INTEGER,
    MFACTURAS NUMERIC(18,2),
    DEVOLUCIONES INTEGER,
    MDEVOLUCIONES NUMERIC(18,2),
    IVAFACT NUMERIC(18,2),
    IVADEV NUMERIC(18,2))
AS
declare variable dtoequal char(2);
declare variable dtopie numeric(18,2);
BEGIN
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (DTOEQUAL);
  SELECT 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 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 = :SUBEMPRESA) or (:SUBEMPRESA = 0))
       AND D.bode_cod = :BODEGA
      INTO :FACTURAS, :MFACTURAS, :IVAFACT;
/*  if (:DTOEQUAL='NO') then
      MFACTURAS = :MFACTURAS - :DTOPIE; */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (DTOEQUAL);
  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))
       AND D.bode_cod = :BODEGA
    INTO :DEVOLUCIONES, :MDEVOLUCIONES, :IVADEV;
  if (FACTURAS IS NULL) then
    FACTURAS = 0;
  if (DEVOLUCIONES IS NULL) then
    DEVOLUCIONES = 0;
  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^


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 DEV NUMERIC(18, 2);
BEGIN
FECINI = fecha - 365;
FOR SELECT MAX(d.arti_cod), MAX(EXTRACT(MONTH FROM FACT_FECHA)), SUM(FADE_CANT*FADE_FACTOR)
    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, :TOTAL
    DO
    BEGIN
    if (TOTAL IS NULL) then
        TOTAL = 0;
    SELECT SUM(DVDE_CANT*DVDE_FACTOR)
        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 :DEV;
    if (DEV IS NULL) then
        DEV = 0;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
/* AGREGUE LOS ARTICULOS SIN VENTAS */
FOR SELECT MAX(D.arti_cod), MAX(EXTRACT(MONTH FROM DEVT_FECHA)), SUM(DVDE_CANT*DVDE_FACTOR)
    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 D.arti_cod, EXTRACT(MONTH FROM DEVT_FECHA)
    INTO :articulo, :MES, :DEV
    DO
    BEGIN
    TOTAL = 0;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
END^


ALTER PROCEDURE VENTAS_ARTICULO_ANO1 (
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    FECHA DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    ARTICULO VARCHAR(20),
    MES INTEGER,
    TOTAL NUMERIC(18,2))
AS
declare variable FECINI DATE;
declare variable DEV NUMERIC(18, 2);
BEGIN
FECINI = fecha - 365;
FOR SELECT MAX(d.arti_cod), MAX(EXTRACT(MONTH FROM FACT_FECHA)), SUM(FADE_CANT*FADE_FACTOR)
    FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
    where F.fact_id = D.fact_id AND (((:ORDEN = 'C') AND (D.arti_cod >= :artini) AND (d.arti_cod <= :artfin)) OR
    ((:ORDEN = 'D') AND (A.arti_des >= :artini) AND (A.arti_des <= :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))
    AND A.arti_cod = D.arti_cod AND (((:AGRUPA = 'G') AND (A.grup_cod >= :grpini) AND (A.grup_cod <= :grpfin)) OR
    ((:AGRUPA = 'M') AND (A.marc_cod >= :grpini) AND (A.marc_cod <= :grpini)))
    GROUP BY d.arti_cod, EXTRACT(MONTH FROM FACT_FECHA)
    INTO :articulo, :MES, :TOTAL
    DO
    BEGIN
    if (TOTAL IS NULL) then
        TOTAL = 0;
    SELECT SUM(DVDE_CANT*DVDE_FACTOR)
        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 :DEV;
    if (DEV IS NULL) then
        DEV = 0;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
/* AGREGUE LOS ARTICULOS SIN VENTAS */
FOR SELECT MAX(D.arti_cod), MAX(EXTRACT(MONTH FROM DEVT_FECHA)), SUM(DVDE_CANT*DVDE_FACTOR)
    FROM DEVOLUCIONES_VENTAS V, devoluciones_ventas_detalle D, PREFIJOS P, ARTICULO A
    where V.devt_id = D.devt_id AND (((:ORDEN = 'C') AND (D.arti_cod >= :artini) AND (d.arti_cod <= :artfin)) OR
        ((:ORDEN = 'D') AND (A.arti_des >= :artini) AND (A.arti_des <= :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 A.arti_cod = D.arti_cod AND (((:AGRUPA = 'G') AND (A.grup_cod >= :grpini) AND (A.grup_cod <= :grpfin)) OR
        ((:AGRUPA = 'M') AND (A.marc_cod >= :grpini) AND (A.marc_cod <= :grpini)))
        AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)))
    GROUP BY D.arti_cod, EXTRACT(MONTH FROM DEVT_FECHA)
    INTO :articulo, :MES, :DEV
    DO
    BEGIN
    TOTAL = 0;
    TOTAL = TOTAL - DEV;
    if (TOTAL <> 0) then
        SUSPEND;
    END
END^


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)) AND ((devt_remid is null) or (DEVT_REMID = 0))
         AND ((devt_pedid is null) or (DEVT_PEDID = 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^


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^


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))
         and ((devt_remid is null) or (DEVT_REMID = 0)) and ((devt_pedid is null) or (DEVT_PEDID = 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^


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)
        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
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)
    ORDER BY MARC_COD, ARTI_COD
    INTO :ARTICULO, :DESCRIPCION, :GRUPO, :MARCA
    DO
        BEGIN
        NIT = '0';
        NOMBRE = '_ OTROS CANALES _';
        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 C.ZONA_COD <> '05' AND C.ZONA_COD <> '06' 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 C.ZONA_COD <> '05' AND C.ZONA_COD <> '06' 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;

        NIT = '05';
        NOMBRE = '_ DEPARTAMENTOS _';
        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 = '05' 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 = '05' 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;

        NIT = '06';
        NOMBRE = '_OTROS DEPARTAMENTOS _';
        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 = '06' 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 = '06' 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^


ALTER PROCEDURE VENTAS_CIUDAD_VENDEDOR (
    CODVEND INTEGER,
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CIUDAD VARCHAR(5),
    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(T.ciud_cod), MAX(T.terc_ciu), COUNT(*), SUM(FACT_TOTAL-FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS F, PREFIJOS P, TERCEROS T
    WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECFIN AND F.terc_nit = T.terc_nit
    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.ciud_cod INTO :CIUDAD, :NOMBRE, :FACTURAS, :MFACTURAS, :TFACTURAS
    do
    BEGIN
    SELECT COUNT(*), SUM(DEVT_TOTAL-DEVT_IVAMONTO), SUM(DEVT_TOTAL)
    FROM devoluciones_ventas F, PREFIJOS P, TERCEROS T
        WHERE VEND_COD = :CODVEND AND T.ciud_cod = :ciudad AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECFIN  AND DEVT_ANULADO = 'N'
        AND F.terc_nit = T.terc_nit 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, :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, TERCEROS T
        where d.fact_id = f.fact_id and F.terc_nit = T.terc_nit AND VEND_COD = :CODVEND AND T.ciud_cod = :ciudad 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, TERCEROS T
        where d.devt_id = f.devt_id and VEND_COD = :CODVEND AND F.TERC_NIT = T.terc_nit AND T.ciud_cod = :ciudad 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' and ((devt_remid is null) or (DEVT_REMID = 0))
        into :consumod;
    if (consumod is null) then
        consumod = 0;
    mdevoluciones = mdevoluciones - consumod;
    SUSPEND;
    END
facturas = 0;
mfacturas = 0;
tfacturas = 0;
FOR SELECT MAX(T.ciud_cod), MAX(T.terc_ciu), COUNT(*), SUM(DEVT_TOTAL-DEVT_IVAMONTO), SUM(DEVT_TOTAL)
    FROM devoluciones_ventas F, PREFIJOS P, TERCEROS T
    WHERE VEND_COD = :CODVEND AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECFIN AND F.terc_nit = T.terc_nit
    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 NOT EXISTS (SELECT FACT_ID FROM FACTURAS FV, PREFIJOS PR, TERCEROS TR WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECFIN
    AND FV.terc_nit = TR.terc_nit AND FACT_ANULADO = 'N' AND PR.PREF_PRE = FV.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    AND T.ciud_cod = TR.ciud_cod)
    GROUP BY T.ciud_cod INTO :ciudad, :NOMBRE, :devoluciones, :mdevoluciones, :tdevoluciones
    do
    BEGIN
    if (MDEVOLUCIONES IS NULL) then
        MDEVOLUCIONES = 0;
    if (TDEVOLUCIONES IS NULL) then
        TDEVOLUCIONES = 0;
    select sum(dvde_consumo) from devoluciones_ventas_detalle d, devoluciones_ventas f, PREFIJOS P, TERCEROS T
        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 substring(d.arti_cod from 1 FOR 2) <> '.t'
        AND F.terc_nit = T.terc_nit AND T.ciud_cod = :ciudad
        into :consumod;
    if (consumod is null) then
        consumod = 0;
    mdevoluciones = mdevoluciones - consumod;
    SUSPEND;
    END
end^


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^


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^


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^


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)) and ((devt_remid is null) or (DEVT_REMID = 0)) and ((devt_pedid is null) or (DEVT_PEDID = 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' and ((devt_remid is null) or (DEVT_REMID = 0))
        into :consumod;
    if (consumod is null) then
        consumod = 0;
    mdevoluciones = mdevoluciones - consumod;
    SUSPEND;
    END
facturas = 0;
mfacturas = 0;
tfacturas = 0;
FOR SELECT MAX(TERC_NIT), MAX(devt_nomterc), COUNT(*), SUM(DEVT_TOTAL-DEVT_IVAMONTO), SUM(DEVT_TOTAL)
    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))
    AND NOT EXISTS (SELECT FACT_ID FROM FACTURAS FV, PREFIJOS PR WHERE VEND_COD = :CODVEND AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECFIN
    AND FACT_ANULADO = 'N' AND PR.PREF_PRE = FV.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    AND TERC_NIT = F.terc_nit)
    GROUP BY TERC_NIT ORDER BY TERC_NIT INTO :NIT, :NOMBRE, :devoluciones, :mdevoluciones, :tdevoluciones
    do
    BEGIN
    if (MDEVOLUCIONES IS NULL) then
        MDEVOLUCIONES = 0;
    if (TDEVOLUCIONES IS NULL) then
        TDEVOLUCIONES = 0;
    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^


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^


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^


ALTER PROCEDURE VENTAS_PROVEEDOR (
    NIT VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    MFACTURAS NUMERIC(18,2),
    MDEVOLUCIONES NUMERIC(18,2),
    NETO NUMERIC(18,2))
AS
BEGIN
select sum(fade_total-fade_ivamonto) from facturas_detalle d, facturas f, PREFIJOS P, proveedor_articulo PA
    where d.fact_id = f.fact_id and FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
    AND PA.terc_nit = :NIT AND D.arti_cod = PA.arti_cod AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31
    AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0) or (SUCU_ID = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
    into :mfacturas;
if (MFACTURAS IS NULL) then
    MFACTURAS = 0;
select sum(dvde_total-dvde_ivamonto) from devoluciones_ventas_detalle d, devoluciones_ventas f, PREFIJOS P, proveedor_articulo PA
    where d.devt_id = f.devt_id and DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
    AND PA.terc_nit = :NIT AND D.arti_cod = PA.arti_cod AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33
    AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0) or (SUCU_ID = 0)) and substring(d.arti_cod from 1 FOR 2) <> '.t'
    into :mdevoluciones;
if (MDEVOLUCIONES IS NULL) then
    MDEVOLUCIONES = 0;
NETO = mfacturas - mdevoluciones;
SUSPEND;
END^


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^


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^


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 V where vend_estado = 'A' 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^


ALTER PROCEDURE VER_ARTICULOS_PEDWEB (
    IDDOC INTEGER)
RETURNS (
    PEWD_ITEM INTEGER,
    PEWD_CODBAR VARCHAR(15),
    ARTI_DES VARCHAR(60),
    PEWD_CANT NUMERIC(18,4),
    PEWD_PRUNIT NUMERIC(18,2),
    PEWD_TOTAL NUMERIC(18,2))
AS
begin
  for select PEWD_ITEM, PEWD_CODBAR, ARTI_DES, CAST(PEWD_CANT AS NUMERIC(18,2)) PEWD_CANT, PEWD_PRUNIT, PEWD_TOTAL
  FROM PEDIDO_WEB_DETALLE P, ARTICULO A WHERE P.ARTI_COD = A.ARTI_COD AND PEWE_ID = :iddoc
  INTO :PEWD_ITEM, :PEWD_CODBAR, :ARTI_DES, :PEWD_CANT, :PEWD_PRUNIT, :PEWD_TOTAL
  do
  BEGIN
  EXECUTE PROCEDURE NOMBRE_ASCII(ARTI_DES) returning_values (ARTI_DES);
  EXECUTE PROCEDURE NOMBRE_ASCII(PEWD_CODBAR) returning_values (PEWD_CODBAR);
  suspend;
  END
end^



SET TERM ; ^


/******************************************************************************/
/***                          Fields descriptions                           ***/
/******************************************************************************/

DESCRIBE FIELD ANNO_PERIODO TABLE ANTICIPOS_NOMINA
'PERIODO AL QUE AFECTA ESE ANTICIPO';



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/


/* Privileges of users */
GRANT SELECT ON PLAN_PRODUCCION TO FER;
GRANT SELECT ON PLAN_PRODUCCION TO FERNANDO;
GRANT SELECT ON PLAN_PRODUCCION TO OTRO;
GRANT ALL ON ACCESO_USUARIO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ACTIVACION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ACTIVOS_DOCUMENTOS TO PUBLIC;
GRANT ALL ON ACTIVOS_FIJOS TO PUBLIC;
GRANT ALL ON ADMINISTRADORA TO PUBLIC;
GRANT ALL ON AFP_ESPECIAL TO PUBLIC;
GRANT ALL ON AJUSTES TO PUBLIC;
GRANT ALL ON AJUSTES_DETALLE TO PUBLIC;
GRANT ALL ON AJUSTES_INFLACION TO PUBLIC;
GRANT ALL ON AJUSTE_CIERRE TO PUBLIC;
GRANT SELECT, INSERT ON AJUSTE_TOTAL TO PUBLIC;
GRANT ALL ON ANALISIS_ABCINVEN TO PUBLIC;
GRANT ALL ON ANTICIPOS_CLIENTE TO PUBLIC;
GRANT ALL ON ANTICIPOS_NOMINA TO PUBLIC;
GRANT ALL ON ANTICIPOS_PROVEEDOR TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON APERTURA_NIIF TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON APERTURA_NIIF_DET TO PUBLIC;
GRANT ALL ON APLICACION_CLIENTE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON APLICACION_CLIENTE_CRUCE TO PUBLIC;
GRANT ALL ON APLICACION_CLIENTE_DETALLE TO PUBLIC;
GRANT ALL ON APLICACION_PROVEDOR TO PUBLIC;
GRANT ALL ON APLICACION_PROVEEDOR_DETALLE TO PUBLIC;
GRANT ALL ON AREA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ARQUEO_CAJA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ARQUEO_CAJA_DET TO PUBLIC;
GRANT ALL ON ARTICULO TO PUBLIC;
GRANT ALL ON ARTICULOS_PRODUCTO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ARTICULOS_REPORTE TO PUBLIC;
GRANT ALL ON ARTICULO_ALERTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ARTICULO_BODEGA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ARTICULO_DOCUMENTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ARTICULO_EQUIVALENCIA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ASEGURADORA TO PUBLIC;
GRANT SELECT, INSERT ON ASESORES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON AUDITORIA TO PUBLIC;
GRANT ALL ON AUTORIZACIONES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON AUTORIZACIONES_CARTERA TO PUBLIC;
GRANT ALL ON BANCOS TO PUBLIC;
GRANT ALL ON BARRAS_ARTICULO TO PUBLIC;
GRANT ALL ON BODEGA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON BONOS_PAGO TO PUBLIC;
GRANT ALL ON CAJAS TO PUBLIC;
GRANT ALL ON CAJEROS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CAMBIA_COSTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CAMBIA_PRECIOS TO PUBLIC;
GRANT ALL ON CAMBIODOC_ENTRADAS TO PUBLIC;
GRANT ALL ON CAMBIODOC_SALIDAS TO PUBLIC;
GRANT ALL ON CAMBIO_ARTICULOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CAMBIO_COSTO TO PUBLIC;
GRANT ALL ON CAMBIO_DOCUMENTOS TO PUBLIC;
GRANT ALL ON CAMBIO_SITUACION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CANAL TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CARGA_PRODUCTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CARGA_REMESA TO PUBLIC;
GRANT ALL ON CENTROS TO PUBLIC;
GRANT ALL ON CESANTIAS TO PUBLIC;
GRANT ALL ON CESANTIAS_RETIROS TO PUBLIC;
GRANT ALL ON CESANTIA_DETALLE TO PUBLIC;
GRANT ALL ON CHEQUERA TO PUBLIC;
GRANT ALL ON CHEQUES TO PUBLIC;
GRANT ALL ON CIERRE_ANUAL TO PUBLIC;
GRANT ALL ON CIERRE_TERCEROS TO PUBLIC;
GRANT ALL ON CIUDADES TO PUBLIC;
GRANT ALL ON CLASE_EGRESO TO PUBLIC;
GRANT ALL ON CLIENTES TO PUBLIC;
GRANT ALL ON CLIENTES_ALERTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CLIENTES_FACTURACION_MASIVA TO PUBLIC;
GRANT ALL ON CLIENTE_SUCURSALES TO PUBLIC;
GRANT ALL ON COBRADORES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON COCINA_COLA_FUNCION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON COCINA_FUNCIONES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON COCINA_OPERARIOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON COLORES TO PUBLIC;
GRANT ALL ON COMISIONES TO PUBLIC;
GRANT ALL ON COMISIONES_PUNTOS TO PUBLIC;
GRANT ALL ON COMISION_COBRO TO PUBLIC;
GRANT ALL ON COMPRAS_INTERNACIONALES TO PUBLIC;
GRANT ALL ON COMPRAS_INTERNACIONALES_DETALLE TO PUBLIC;
GRANT ALL ON COMPROBANTE_DETALLE TO PUBLIC;
GRANT ALL ON COMPROBANTE_DETALLE_NIIF TO PUBLIC;
GRANT ALL ON COMPROBANTE_ENCABEZADO TO PUBLIC;
GRANT ALL ON CONCEPTOS TO PUBLIC;
GRANT ALL ON CONCEPTOS_CUENTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONCEPTOS_CXPAGAR TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONCEPTOS_FRECUENTES TO PUBLIC;
GRANT ALL ON CONCEPTOS_NOMINA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONCEPTOS_NOMINA_REPORTE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONCEPTOS_PLANILLA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONCEPTOS_TRANSPORTE TO PUBLIC;
GRANT ALL ON CONCEPTO_CONTABLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONCILIACION_BANCARIA TO PUBLIC;
GRANT ALL ON CONCILIACION_ENCABEZADO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONCILIACION_OPERACIONES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONCILIACION_PAT TO PUBLIC;
GRANT ALL ON CONCILIACION_PAT_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONCILIA_BANCO_CONTA_AUX TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONDUCTOR TO PUBLIC;
GRANT SELECT, UPDATE ON CONFIGURACION TO PUBLIC;
GRANT ALL ON CONFIGURACION_HORAS_EMPLEADO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONFIGURA_CERTRETE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONFIGURA_CERTRETEL TO PUBLIC;
GRANT ALL ON CONFIGURA_LINKFTP TO PUBLIC;
GRANT SELECT, UPDATE ON CONFIGURA_MEDIOSMAG TO PUBLIC;
GRANT SELECT, UPDATE ON CONFIGURA_POS TO PUBLIC;
GRANT ALL ON CONFIRMACION_DEPOSITO TO PUBLIC;
GRANT ALL ON CONSIGNA TO PUBLIC;
GRANT ALL ON CONSIGNA_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONSIGNA_RECIBOS TO PUBLIC;
GRANT ALL ON CONSIGNA_TARJETAS TO PUBLIC;
GRANT ALL ON CONSIGNA_TARJETAS_DET TO PUBLIC;
GRANT SELECT ON CONSIGNA_TOTAL TO PUBLIC;
GRANT ALL ON CONSOLIDADO_FALTANTES TO PUBLIC;
GRANT ALL ON CONSOLIDADO_NOMINA TO PUBLIC;
GRANT ALL ON CONSOLIDADO_NOMINA_PROV TO PUBLIC;
GRANT ALL ON CONSOLIDE_DOCS TO PUBLIC;
GRANT ALL ON CONSOLIDE_FALTANTES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONSOLIDE_FORMASP TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONSOLIDE_NOMINAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONSULTA_BALANCE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONSULTA_WEB TO PUBLIC;
GRANT ALL ON CONSUMOS TO PUBLIC;
GRANT ALL ON CONSUMO_DETALLE TO PUBLIC;
GRANT ALL ON CONTABILIZACION TO PUBLIC;
GRANT ALL ON CONTABILIZACION_DET TO PUBLIC;
GRANT ALL ON CONTABIL_ARTICULO TO PUBLIC;
GRANT ALL ON CONTABIL_ARTICULO_NIIF TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CONTRATOS_COLEGIOS TO PUBLIC;
GRANT ALL ON COSTOS TO PUBLIC;
GRANT ALL ON COSTOS_NIIF TO PUBLIC;
GRANT ALL ON COSTO_VENTAS TO PUBLIC;
GRANT ALL ON COSTO_VENTAS_NIIF TO PUBLIC;
GRANT ALL ON COTIZACIONES TO PUBLIC;
GRANT ALL ON COTIZACIONES_DETALLE TO PUBLIC;
GRANT ALL ON COTIZACIONES_PROVEEDOR_DET TO PUBLIC;
GRANT ALL ON COTIZACION_PROVEEDOR TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON COTIZACION_WEB TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON COTIZACION_WEB_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_AGRUPACION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_ASESOR TO PUBLIC;
GRANT ALL ON CRM_CAMPANA TO PUBLIC;
GRANT ALL ON CRM_CAMPANA_DETALLE TO PUBLIC;
GRANT ALL ON CRM_CAMPANA_MOTIVOS TO PUBLIC;
GRANT ALL ON CRM_CAMPANA_PLANILLA TO PUBLIC;
GRANT ALL ON CRM_CAMPANA_RESPUESTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_CARGOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_CLASE TO PUBLIC;
GRANT ALL ON CRM_CLIENTES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_COMPROMISOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_CONTACTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_ESTADO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_EVENTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_EVENTOS_NOTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_EVENTO_MOTIVO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_EVENTO_RESPUESTA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_PRODUCTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_SUBPRODUCTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_TIPOCONTACTO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_TIPOEVENTO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_TIPORELACION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CRM_TIPO_ACTIVIDAD TO PUBLIC;
GRANT ALL ON CUENTAS TO PUBLIC;
GRANT ALL ON CUENTAS_BANCO TO PUBLIC;
GRANT SELECT, INSERT ON CUENTAS_BANCOS TO PUBLIC;
GRANT ALL ON CUENTAS_EXPORTACION TO PUBLIC;
GRANT ALL ON CUENTAS_NIIF TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON CUENTAS_NIIF_NORMA TO PUBLIC;
GRANT ALL ON CUENTAS_REPORTE_CERTDET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON DENOMINACIONES TO PUBLIC;
GRANT ALL ON DEPARTAMENTO TO PUBLIC;
GRANT ALL ON DEPOSITOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON DEPRECIACION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON DEPRECIACION_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON DEPRECIACION_UNIDADES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON DESCUENTOS_PRECIOS TO PUBLIC;
GRANT ALL ON DESCUENTOS_PRECIOS_CLI TO PUBLIC;
GRANT ALL ON DESCUENTOS_PRECIOS_DET TO PUBLIC;
GRANT ALL ON DESENSAMBLES TO PUBLIC;
GRANT ALL ON DESENSAMBLES_DETALLE TO PUBLIC;
GRANT SELECT, INSERT ON DESENSAMBLE_TOTAL TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON DETERIORO_CARTERA_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON DETERIORO_CARTERA_ENC TO PUBLIC;
GRANT ALL ON DEVOLUCIONES_COMPRAS TO PUBLIC;
GRANT ALL ON DEVOLUCIONES_COMPRAS_DET TO PUBLIC;
GRANT ALL ON DEVOLUCIONES_VENTAS TO PUBLIC;
GRANT ALL ON DEVOLUCIONES_VENTAS_DETALLE TO PUBLIC;
GRANT ALL ON DEVOLUCIONES_VENTAS_DOCRELA TO PUBLIC;
GRANT ALL ON DEVOLUCION_CHEQUES TO PUBLIC;
GRANT ALL ON DEVOLUCION_COMPRAS_DOCRELA TO PUBLIC;
GRANT ALL ON DOCUMENTOS_CONTA TO PUBLIC;
GRANT ALL ON DOCUMENTOS_IMPORT_EMPLEADO TO PUBLIC;
GRANT SELECT, INSERT ON DOCUMENTOS_PAGO_CAJA TO PUBLIC;
GRANT ALL ON EDUCACION_FORMAL_EMPLEADO TO PUBLIC;
GRANT ALL ON EGRESOS TO PUBLIC;
GRANT ALL ON EGRESOS_BANCO TO PUBLIC;
GRANT ALL ON EGRESOS_CAJA TO PUBLIC;
GRANT ALL ON EGRESOS_CONTABILIDAD TO PUBLIC;
GRANT ALL ON EGRESOS_CRUCEC TO PUBLIC;
GRANT ALL ON EGRESOS_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON EMPAQUES TO PUBLIC;
GRANT ALL ON EMPLEADOS 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 ENSAMBLES TO PUBLIC;
GRANT ALL ON ENSAMBLES_DETALLE TO PUBLIC;
GRANT ALL ON ENSAMBLE_MAQUINA TO PUBLIC;
GRANT ALL ON ENSAMBLE_OPERARIO TO PUBLIC;
GRANT SELECT, INSERT ON ENSAMBLE_TOTAL TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ENSAMBLE_TURNO TO PUBLIC;
GRANT ALL ON ENTRADAS TO PUBLIC;
GRANT ALL ON ENTRADAS_DETALLE TO PUBLIC;
GRANT SELECT, INSERT ON ENTRADA_TOTAL TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ENTREGADORES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ENTREGA_DOCUMENTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ENVIO_RESUMDIA TO PUBLIC;
GRANT SELECT, INSERT ON ERRORES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON ERRORES_ENVIO_CORREO TO PUBLIC;
GRANT ALL ON ESTADO_ARTICULO TO PUBLIC;
GRANT ALL ON ESTRUCTURA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON EVENTOS_VENTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON EVENTO_EXISTENCIAS TO PUBLIC;
GRANT ALL ON EXISTENCIA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON EXISTENCIAS_ARTICULO_WEB TO PUBLIC;
GRANT ALL ON EXISTENCIA_LOTE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON EXISTENCIA_TERCERO TO PUBLIC;
GRANT ALL ON EXPERIENCIA_LABORAL_EMPLEADO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FACTOR_COSTO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FACTOR_INVENTARIO TO PUBLIC;
GRANT ALL ON FACTURAS TO PUBLIC;
GRANT ALL ON FACTURAS_COMPRA TO PUBLIC;
GRANT ALL ON FACTURAS_COMPRAS_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FACTURAS_CONTADO_PAGO TO PUBLIC;
GRANT ALL ON FACTURAS_DETALLE TO PUBLIC;
GRANT ALL ON FACTURAS_MES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FACTURA_ALQUILER TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FACTURA_CONCEPTO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FACTURA_CONCEPTO_ITEMS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FACTURA_EMBALAJE TO PUBLIC;
GRANT ALL ON FACTURA_PROFORMA TO PUBLIC;
GRANT ALL ON FACTURA_PROFORMA_DET TO PUBLIC;
GRANT ALL ON FACTURA_PROFORMA_GASTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FACTURA_WEB TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FACTURA_WEB_DETALLE TO PUBLIC;
GRANT ALL ON FLUJO_EFECTIVO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FODO_SOL_PENSIONAL TO PUBLIC;
GRANT ALL ON FORMAS_PAGO TO PUBLIC;
GRANT ALL ON FORMATOCONTABLE_DETALLE TO PUBLIC;
GRANT ALL ON FORMATOCONTABLE_TEXTOS TO PUBLIC;
GRANT ALL ON FORMATOS TO PUBLIC;
GRANT ALL ON FORMATOS_CONTABLES TO PUBLIC;
GRANT ALL ON FORMATO_DATOS TO PUBLIC;
GRANT ALL ON FORMATO_LINEAS TO PUBLIC;
GRANT ALL ON FORMA_PAGOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON FORMA_PAGO_REMESA TO PUBLIC;
GRANT ALL ON FOTOS_ARTICULO TO PUBLIC;
GRANT ALL ON GASTOS_IMPORTACION TO PUBLIC;
GRANT ALL ON GRUPO TO PUBLIC;
GRANT ALL ON GRUPOS_PROVEEDORES TO PUBLIC;
GRANT ALL ON GRUPO_CARTERA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON GRUPO_VENDEDOR TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON HEMOLIFE_CLIENTES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON HEMOLIFE_ENSAMBLES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON HEMOLIFE_EQUIVALENCIAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON HEMOLIFE_REMISIONES TO PUBLIC;
GRANT ALL ON HISTORICO_VENTAS TO PUBLIC;
GRANT ALL ON HORARIO_EMPLEADO TO PUBLIC;
GRANT ALL ON HORARIO_EMPLEADO_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON IMPORTACION TO PUBLIC;
GRANT ALL ON IMPORTACION_INVENTARIO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON IMPORTACION_LIQUIDACION TO PUBLIC;
GRANT ALL ON INCAPACIDADES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON INGRESOS_EMPLEADO TO PUBLIC;
GRANT ALL ON INTERFAZ_BANCOS TO PUBLIC;
GRANT ALL ON INTERFAZ_BANCOS_CTAS TO PUBLIC;
GRANT ALL ON INTERFAZ_BANCOS_NIIF TO PUBLIC;
GRANT ALL ON INTERFAZ_CAJA TO PUBLIC;
GRANT ALL ON INTERFAZ_CAJA_CTAS TO PUBLIC;
GRANT ALL ON INTERFAZ_CAJA_NIIF TO PUBLIC;
GRANT ALL ON INTERFAZ_CARTERA TO PUBLIC;
GRANT ALL ON INTERFAZ_CARTERA_CTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON INTERFAZ_CARTERA_NIIF TO PUBLIC;
GRANT ALL ON INTERFAZ_COMPRAS TO PUBLIC;
GRANT ALL ON INTERFAZ_COMPRAS_CTAS TO PUBLIC;
GRANT ALL ON INTERFAZ_COMPRAS_NIIF TO PUBLIC;
GRANT ALL ON INTERFAZ_CXPAGAR TO PUBLIC;
GRANT ALL ON INTERFAZ_CXPAGAR_CTAS TO PUBLIC;
GRANT ALL ON INTERFAZ_CXPAGAR_NIIF TO PUBLIC;
GRANT ALL ON INTERFAZ_INVENTARIO TO PUBLIC;
GRANT ALL ON INTERFAZ_INVENTARIO_CTAS TO PUBLIC;
GRANT ALL ON INTERFAZ_INVENTARIO_NIIF TO PUBLIC;
GRANT ALL ON INTERFAZ_NOMINA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON INTERFAZ_TRANSPORTE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON INTERFAZ_TRANSPORTE_CTAS TO PUBLIC;
GRANT ALL ON INTERFAZ_VENTAS TO PUBLIC;
GRANT ALL ON INTERFAZ_VENTAS_CTAS TO PUBLIC;
GRANT ALL ON INTERFAZ_VENTAS_NIIF TO PUBLIC;
GRANT ALL ON LIQUIDACION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON LIQUIDACION_RUTA_COLEGIO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON LIQUIDACION_RUTA_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON LIQUIDACION_RUTA_EFE TO PUBLIC;
GRANT ALL ON LISTAPREC_VENDEDOR TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON LISTAPRE_USUARIOS TO PUBLIC;
GRANT ALL ON LISTAS_VENDEDOR TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON LISTA_ARTICULOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON LISTA_ARTICULOS_DET TO PUBLIC;
GRANT ALL ON LISTA_PRECIOS TO PUBLIC;
GRANT ALL ON LLAMADOS_ATENCION TO PUBLIC;
GRANT ALL ON LOTES TO PUBLIC;
GRANT ALL ON LUGAR_INSPECCION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MANIFIESTOS_CARGA_CONC TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MANIFIESTO_CARGA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MANIFIESTO_CARGA_DET TO PUBLIC;
GRANT ALL ON MARCAS TO PUBLIC;
GRANT ALL ON MEDIOSMAG_ARCHIVOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MEDIOSMAG_ARCHIVOS2014 TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MEDIOSMAG_CUENTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MEDIOSMAG_DISTRITALES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MEDIOSMAG_DISTR_CUENTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MEDIOSMAG_DISTR_DATOS TO PUBLIC;
GRANT ALL ON MEDIOS_MAGNETICOS_DATOS TO PUBLIC;
GRANT ALL ON MEDIOS_TRANSPORTE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MENSAJERIA TO PUBLIC;
GRANT ALL ON MODO_TRANSPORTE TO PUBLIC;
GRANT SELECT, INSERT ON MODULOS TO PUBLIC;
GRANT ALL ON MOVIMIENTO_ARTICULO TO PUBLIC;
GRANT ALL ON MOVIMIENTO_BANCO TO PUBLIC;
GRANT ALL ON MOVIMIENTO_CAJA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_CARGO_EMPLEADO TO PUBLIC;
GRANT ALL ON MOVIMIENTO_CLIENTES TO PUBLIC;
GRANT SELECT, INSERT ON MOVIMIENTO_PROVEEDOR TO PUBLIC;
GRANT ALL ON MOVIMIENTO_SALARIO_EMPLEADO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_VINCUL_EMPLEADO TO PUBLIC;
GRANT ALL ON NIVEL_FORMACION TO PUBLIC;
GRANT SELECT, INSERT ON NOMBRES_CAMPOS TO PUBLIC;
GRANT ALL ON NOMBRES_COPIAS TO PUBLIC;
GRANT ALL ON NOMINA TO PUBLIC;
GRANT ALL ON NOMINA_CARTERA TO PUBLIC;
GRANT ALL ON NOMINA_CARTERA_DETALLE 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_DEPARTAMENTO TO PUBLIC;
GRANT ALL ON NOMINA_DETALLE TO PUBLIC;
GRANT ALL ON NOMINA_DETALLE_PROV TO PUBLIC;
GRANT ALL ON NOMINA_HORASEXT TO PUBLIC;
GRANT ALL ON NOMINA_NOVEDADES TO PUBLIC;
GRANT ALL ON NOMINA_NOVEDADES_DETALLE TO PUBLIC;
GRANT ALL ON NOMINA_PROV TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON NOMINA_SALDINI TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON NOMINA_UGPP_MESES TO PUBLIC;
GRANT ALL ON NOMINA_VALOR_PREDET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON NORMAS_NIIF TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON NORMAS_NIIF_DETALLE TO PUBLIC;
GRANT ALL ON NOTAS_CLIENTES TO PUBLIC;
GRANT ALL ON NOTAS_CREDITO TO PUBLIC;
GRANT ALL ON NOTAS_CREDITO_CLIENTES TO PUBLIC;
GRANT ALL ON NOTAS_CREDITO_PROVEEDOR TO PUBLIC;
GRANT ALL ON NOTAS_DEBITO TO PUBLIC;
GRANT ALL ON NOTAS_DEBITO_CLIENTES TO PUBLIC;
GRANT ALL ON NOTAS_DEBITO_PROVEEDOR TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON NOTAS_DOCUMENTO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON NOTAS_ESTADOS_FINANCIEROS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON NOTA_CREDITO_PROV_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON NOTA_DEBITO_PROV_DET TO PUBLIC;
GRANT ALL ON NUMERO_COPIA TO PUBLIC;
GRANT ALL ON OPCIONES TO PUBLIC;
GRANT ALL ON OPCIONES_INTERFAZ TO PUBLIC;
GRANT ALL ON ORDENES_COMPRA TO PUBLIC;
GRANT ALL ON ORDENES_COMPRA_DETALLE TO PUBLIC;
GRANT ALL ON ORDENES_COMPRA_DOCRELA TO PUBLIC;
GRANT ALL ON ORDENES_INVENTARIO TO PUBLIC;
GRANT ALL ON ORDENINVENTARIO_DETALLE TO PUBLIC;
GRANT SELECT, INSERT ON ORDENINV_TOTAL TO PUBLIC;
GRANT ALL ON ORDEN_EMBARQUE TO PUBLIC;
GRANT ALL ON PAGO_APORTES TO PUBLIC;
GRANT ALL ON PAGO_APORTES_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PAGO_APORTES_EMPLEADOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PAGO_APORTES_NOM TO PUBLIC;
GRANT ALL ON PAGO_NOMINA TO PUBLIC;
GRANT ALL ON PAGO_NOMINA_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PAGO_NOMINA_EGRESOS TO PUBLIC;
GRANT ALL ON PAISES TO PUBLIC;
GRANT ALL ON PARAMETROS_ANO TO PUBLIC;
GRANT ALL ON PARAMETROS_CONTABLES TO PUBLIC;
GRANT ALL ON PARENTESCO TO PUBLIC;
GRANT ALL ON PARQUEADERO TO PUBLIC;
GRANT ALL ON PEDIDOS TO PUBLIC;
GRANT ALL ON PEDIDOS_DETALLE TO PUBLIC;
GRANT ALL ON PEDIDOS_DOCRELA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PEDIDO_WEB TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PEDIDO_WEB_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PENDIENTE_VENTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PENDIENTE_VENTAS_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PERFIL_EMPLEADO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PERFIL_EMPLEADO_DETALLE TO PUBLIC;
GRANT ALL ON PERIODO_PAGO TO PUBLIC;
GRANT ALL ON PERIODO_PAGO_NOMBRE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PLANILLA_DIGITACION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PLANILLA_DIGITACION_CUENTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PLANILLA_PASAJEROS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PLANILLA_PASAJEROS_CON TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PLANILLA_PASAJEROS_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PLANILLA_PASAJEROS_REM TO PUBLIC;
GRANT ALL ON PLANTILLA_DETALLE TO PUBLIC;
GRANT ALL ON PLANTILLA_DETALLE_NIIF TO PUBLIC;
GRANT ALL ON PLANTILLA_ENCABEZADO TO PUBLIC;
GRANT ALL ON PLAN_PRODUCCION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PLAN_PRODUCCION_CONS_PROD TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PLAN_PRODUCCION_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PLAN_PRODUCCION_PRODUCTOS TO PUBLIC;
GRANT ALL ON PRECIOS_ARTICULO TO PUBLIC;
GRANT ALL ON PREFIJOS TO PUBLIC;
GRANT ALL ON PREFIJOS_BANCOS TO PUBLIC;
GRANT ALL ON PREFIJOS_CONTA TO PUBLIC;
GRANT ALL ON PREFIJOS_EXPORTACION TO PUBLIC;
GRANT ALL ON PRESTAMO_CUOTAS TO PUBLIC;
GRANT ALL ON PRESTAMO_NOMINA TO PUBLIC;
GRANT ALL ON PRESUPUESTO TO PUBLIC;
GRANT ALL ON PRESUPUESTO_VENTAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRESUPUESTO_VENTAS_GRUPO TO PUBLIC;
GRANT ALL ON PRESUPUESTO_VENTAS_MESES TO PUBLIC;
GRANT ALL ON PROCEDIMIENTOS_USUARIO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRODUCCION_DEVOLUCION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRODUCCION_DEVOLUCION_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRODUCCION_ENTRADA_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRODUCCION_ENTRADA_ENC TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRODUCCION_MONTAJE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRODUCCION_ORDEN TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRODUCCION_ORDEN_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRODUCCION_SALIDA_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRODUCCION_SALIDA_ENC TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PRODUCTO_MONTAJE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PROGRAMACION_PAGOS TO PUBLIC;
GRANT SELECT, INSERT ON PROGRAMAS TO PUBLIC;
GRANT ALL ON PROGRAM_VACACIONES TO PUBLIC;
GRANT ALL ON PROMEDIO_SALIDAS TO PUBLIC;
GRANT ALL ON PROVEEDORES TO PUBLIC;
GRANT ALL ON PROVEEDOR_ARTICULO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PROVISION_CARTERA TO PUBLIC;
GRANT ALL ON PROYECTOS TO PUBLIC;
GRANT ALL ON PUC TO PUBLIC;
GRANT ALL ON PUESTOS TO PUBLIC;
GRANT ALL ON PUNTOS_ARTICULOS TO PUBLIC;
GRANT ALL ON PUNTOS_CLIENTE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON PUNTOS_CLIENTE_ACUMULADO TO PUBLIC;
GRANT ALL ON PUNTOS_DIASESPECIAL TO PUBLIC;
GRANT ALL ON PUNTOS_PREMIOS TO PUBLIC;
GRANT ALL ON PUNTOS_REDENCION TO PUBLIC;
GRANT ALL ON PUNTOS_VENDEDOR TO PUBLIC;
GRANT ALL ON PUNTOS_VEND_REDENCION TO PUBLIC;
GRANT ALL ON PUNTO_EQUILIBRIO TO PUBLIC;
GRANT ALL ON PUNTO_VENTA TO PUBLIC;
GRANT SELECT ON RDB$FORMATS TO PUBLIC;
GRANT SELECT ON RDB$PAGES TO PUBLIC;
GRANT SELECT ON RDB$ROLES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON RECAUDO TO PUBLIC;
GRANT ALL ON RECIBOS_CAJA TO PUBLIC;
GRANT ALL ON RECIBOS_CAJA_CRUCEC TO PUBLIC;
GRANT ALL ON RECIBOS_CAJA_DETALLE TO PUBLIC;
GRANT ALL ON RECIBOS_CAJA_PAGO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON RECIBOS_PRESTAMOS TO PUBLIC;
GRANT ALL ON RECIBO_PROVISIONAL TO PUBLIC;
GRANT ALL ON RECIBO_PROVISIONAL_DETALLE TO PUBLIC;
GRANT ALL ON RECIBO_PROVISIONAL_PAGO TO PUBLIC;
GRANT ALL ON REGISTRO_AUTOMATICO TO PUBLIC;
GRANT ALL ON REGISTRO_CONCEPTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON RELEVOS_COLEGIOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REMESAS_DESTINATARIO TO PUBLIC;
GRANT ALL ON REMISIONES_VENTA TO PUBLIC;
GRANT ALL ON REMISIONES_VENTA_DETALLE TO PUBLIC;
GRANT ALL ON REMISIONES_VENTA_DOCRELA TO PUBLIC;
GRANT ALL ON REMISION_PROVEEDOR TO PUBLIC;
GRANT ALL ON REMISION_PROVEEDOR_DET TO PUBLIC;
GRANT ALL ON REMISION_PROVEEDOR_DOCRELA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REPLICACION_CONFIGURA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REPLICA_ARTICULO_ESTADO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REPLICA_COMPANIA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REPLICA_COMPRAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REPLICA_CONTA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REPLICA_CONTA_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REPLICA_EVENTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REPLICA_VENTAS TO PUBLIC;
GRANT ALL ON REPORTES_AUX TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REPORTES_MENSAJE TO PUBLIC;
GRANT ALL ON REPORTE_ERRORES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REP_UTILIDAD TO PUBLIC;
GRANT ALL ON RESERVAS TO PUBLIC;
GRANT ALL ON RESERVAS_DETALLE TO PUBLIC;
GRANT SELECT, INSERT ON RESERVA_TOTAL TO PUBLIC;
GRANT ALL ON RESPUESTA_TIPOCUENTA TO PUBLIC;
GRANT ALL ON RETENCIONES TO PUBLIC;
GRANT ALL ON RETENCION_MINIMA TO PUBLIC;
GRANT ALL ON RETIROS TO PUBLIC;
GRANT ALL ON REVISION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REVISION_PRECIOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON REVPRECIOS_DETALLE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON RUTAS_COLEGIOS TO PUBLIC;
GRANT ALL ON RUTAS_ENTREGA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON RUTA_PASAJEROS TO PUBLIC;
GRANT ALL ON RUTERO TO PUBLIC;
GRANT ALL ON RUTERO_DETALLE TO PUBLIC;
GRANT ALL ON RUTERO_FAC TO PUBLIC;
GRANT ALL ON SALDOS_ACTIVO TO PUBLIC;
GRANT ALL ON SALDOS_ACTIVO_NIIF TO PUBLIC;
GRANT ALL ON SALDOS_ARTICULO TO PUBLIC;
GRANT ALL ON SALDOS_ARTICULO_NIIF TO PUBLIC;
GRANT ALL ON SALDOS_CENTROS TO PUBLIC;
GRANT ALL ON SALDOS_CENTROS_NIIF TO PUBLIC;
GRANT ALL ON SALDOS_CENTROS_TERCERO TO PUBLIC;
GRANT ALL ON SALDOS_CENTROS_TERCERO_NIIF TO PUBLIC;
GRANT ALL ON SALDOS_CUENTAS TO PUBLIC;
GRANT ALL ON SALDOS_CUENTAS_NIIF TO PUBLIC;
GRANT SELECT, INSERT ON SALDOS_DOCCONTA TO PUBLIC;
GRANT ALL ON SALDOS_DOC_CARTERA TO PUBLIC;
GRANT SELECT, INSERT ON SALDOS_DOC_CXPAGAR TO PUBLIC;
GRANT ALL ON SALDOS_INICIALES TO PUBLIC;
GRANT ALL ON SALDOS_INICIALES_NIIF TO PUBLIC;
GRANT SELECT, INSERT ON SALDOS_INVENTARIO TO PUBLIC;
GRANT ALL ON SALDOS_TERCEROS TO PUBLIC;
GRANT ALL ON SALDOS_TERCEROS_NIIF TO PUBLIC;
GRANT SELECT, INSERT ON SALDO_BANCOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON SALDO_BANCOS_CONF TO PUBLIC;
GRANT SELECT, INSERT ON SALDO_CAJA TO PUBLIC;
GRANT SELECT, INSERT ON SALDO_EFECTIVO TO PUBLIC;
GRANT ALL ON SALIDAS TO PUBLIC;
GRANT ALL ON SALIDAS_DETALLE TO PUBLIC;
GRANT SELECT, INSERT ON SALIDA_TOTAL TO PUBLIC;
GRANT ALL ON SECCION TO PUBLIC;
GRANT ALL ON SEGMENTOS TO PUBLIC;
GRANT ALL ON SERIALES_ARTICULO TO PUBLIC;
GRANT ALL ON SERIALES_DOCUMENTO TO PUBLIC;
GRANT ALL ON SOLICITUD_IMPORTACION TO PUBLIC;
GRANT ALL ON SOLICITUD_IMPORTACION_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON SORTEOS_CONFIGURACION TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON SORTEO_FACTURA TO PUBLIC;
GRANT ALL ON STANDS TO PUBLIC;
GRANT ALL ON SUBGRUPO TO PUBLIC;
GRANT ALL ON SUBTIPO_COTIZANTE TO PUBLIC;
GRANT ALL ON SUCURSALES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON SUPERVISOR TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TARIFAS_ARL TO PUBLIC;
GRANT ALL ON TARIFA_IVA TO PUBLIC;
GRANT ALL ON TARJETAS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TASA_CAMBIO_MONEDA TO PUBLIC;
GRANT ALL ON TERCEROS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TERCEROS_CONTACTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TERCERO_DOCUMENTOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TERMINALES_NOMBRES TO PUBLIC;
GRANT ALL ON TERMINOS_COMERCIO_INT TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TERMINOS_ENTREGA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TERMINOS_PAGO TO PUBLIC;
GRANT ALL ON TIPOS_EMBARQUE TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TIPOS_MONEDA TO PUBLIC;
GRANT ALL ON TIPOS_NOVEDAD TO PUBLIC;
GRANT ALL ON TIPO_CARGA TO PUBLIC;
GRANT ALL ON TIPO_COMPROBANTE TO PUBLIC;
GRANT ALL ON TIPO_COTIZANTE TO PUBLIC;
GRANT ALL ON TIPO_CUENTAS TO PUBLIC;
GRANT SELECT, INSERT ON TIPO_DOCUMENTO TO PUBLIC;
GRANT ALL ON TIPO_EMBALAJE TO PUBLIC;
GRANT ALL ON TIPO_GASTOS_IMPORTACION TO PUBLIC;
GRANT SELECT, INSERT ON TIPO_ID TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TIPO_NOTADOC TO PUBLIC;
GRANT ALL ON TIPO_NOTA_CLIENTE TO PUBLIC;
GRANT SELECT, INSERT ON TIPO_PUC TO PUBLIC;
GRANT ALL ON TIPO_VEHICULO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TIPO_VINCULO_UGPP TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON TIQUETE_PASAJERO TO PUBLIC;
GRANT ALL ON TRANSPORTADORES_INTERNAC TO PUBLIC;
GRANT ALL ON TRASFERENCIAS TO PUBLIC;
GRANT ALL ON TRASFERENCIAS_DETALLE TO PUBLIC;
GRANT ALL ON TRASLADOS TO PUBLIC;
GRANT ALL ON TRASLADOS_CAJA TO PUBLIC;
GRANT ALL ON TRASLADOS_CAJA_DET TO PUBLIC;
GRANT SELECT, INSERT ON TRASLADO_TOTAL TO PUBLIC;
GRANT ALL ON TRASPORTADORES TO PUBLIC;
GRANT ALL ON UNIDADES_CARGA TO PUBLIC;
GRANT ALL ON UNIDAD_ARTICULO TO PUBLIC;
GRANT ALL ON USUARIO TO PUBLIC;
GRANT ALL ON VACACIONES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON VACACIONES_DETALLE TO PUBLIC;
GRANT ALL ON VACACIONES_DISFRUT TO PUBLIC;
GRANT ALL ON VACACIONES_DISFRUT_DET TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON VALORES_NOMINA TO PUBLIC;
GRANT ALL ON VEHICULOS TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON VEHICULOS_HISTORIA TO PUBLIC;
GRANT ALL ON VEHICULO_CARROCERIA TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON VEHICULO_COLOR TO PUBLIC;
GRANT ALL ON VEHICULO_LINEA TO PUBLIC;
GRANT ALL ON VEHICULO_MARCA TO PUBLIC;
GRANT ALL ON VENDEDORES TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON VENDEDORES_GRUPO TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON VENDEDOR_META TO PUBLIC;
GRANT ALL ON VENTAS_MES TO PUBLIC;
GRANT ALL ON ZONAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ABONOS_DOCUMENTO_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ABONOS_DOCUMENTO_CXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTIVO_VALOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTIVO_VALOR_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_COSTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_COSTO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ACTIVO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ARTICULO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENT_TERC_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CUENTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CUENTA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_TERCERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_TERCERO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACTUALIZA_PUNTOS_ACUMULADOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ACUMULA_PUNTOS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AJUSTES_APERTURA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AJUSTES_SIN_CONTABILDAD_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AKTIVIA_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AKTIVIA_CLIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AKTIVIA_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AKTIVIA_PRODUCTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AKTIVIA_VENDEDORES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ALERTAS_CONTRATO_EMPL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ANALISIS_BANCOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ANALISIS_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ANALISIS_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ANALISIS_COMPRAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ANALISIS_CXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ANALISIS_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ANALISIS_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ANALISIS_VENTAS_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ARREGLA_MOV_CAJA_RC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ASIGNA_RUTERO_FAC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ASIGNE_BOLETAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ASIGNE_FACTURA_ENTREGA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_ARTICULO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_CENTRO_INI_FIN TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_CENTRO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_CUENTA_INI_FIN TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_CUENTA_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_CUENTA_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_DESDE_HASTA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_TERCERO_INI_FIN TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_TERCERO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE AUXILIAR_TERCERO_MES_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_ANUAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_ANUAL_CENTROS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_ANUAL_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_ARTICULO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_CENTRO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_CENTRO_MES_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_CENTRO_TERCERO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_CENTRO_TERCERO_MES_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_COMPARATIVO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_COMPARATIVO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_CON_CENTROS_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_CON_CENTROS_MES_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_CON_TERCEROS_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_CON_TERCEROS_MES_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_FINAL_DET TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_INICIAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_INICIAL_DET TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_INICIAL_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_PRUEBA_ACUMULADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_PRUEBA_ACUMULADO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_TERCERO_ANO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_TERCERO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BALANCE_TERCERO_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BASE_CUENTA_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BASE_CUENTA_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BODEGA_FACTURACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BODEGA_FACTURACION_ALTERNA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BONOS_DISPONIBLES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BORRAR_FACTURAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BORRE_APERTURA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BORRE_CONTABIL_FACTURA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSCAR_CHEQUES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSCAR_COMPROMISOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSCAR_DEVOLCHEQ TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSCA_ID_DOC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSCA_ID_DOC_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSCA_ID_DOC_CXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSCA_ID_DOC_CXPAGAR_P TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_ANTICIPOS_CLI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_ANTICIPOS_PRV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_CAMPANAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_COMPROMISOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_COMPROMISOS_CLI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_DOCS_PRODUCCION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_EGRESOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_EVENTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_EVENTOS_CLI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_IMPORTACIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_NOTASDOC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_NOTAS_EVENTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_PENDIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_PRODUCCION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_PROSPECTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_REMESAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_REMISIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE BUSQUEDA_TIQUETES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CADENA_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CALCULA_CESANTIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CALCULA_INDEMNIZACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CALCULA_PRIMA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CALCULA_VACACIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CALCULE_DV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIA_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIA_CTAS_ARTI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_IDNOTADOC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_AJUSTEINV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_AJUSTESINF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ANTICLIE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ANTIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_APLICLIE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_APLIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ARQUEO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_AUTOCART TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CAMBART TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CAMBCOSTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CAMBDOCU TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CAMPANA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CHEQUE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CIERANUAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CIERTERC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_COMPRAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_COMPROBA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CONCILIAB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CONS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CONSIGNA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CONSIGNATAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CONSNOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CONSOLFP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CONSUMO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_COTICOMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_COTIWEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_COTIZACI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_CUENTA_BANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_DEPRECIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_DESENSAMBLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_DETCART TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_DEVOLCLIE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_DEVOLPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_DEV_CHEQUES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_EGRESO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ENSAMBLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ENTRADA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ENVIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_FACTPER TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_FACTURA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_FACWEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_GASTOIMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_HORARIOEMPL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_IMPORTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_INTERBANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_INTERCAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_INTERCARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_INTERCMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_INTERCOMPRA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_INTERCXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_INTERTRA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_INTERVTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_INTINVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_LIQRUTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_LIQUIDACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_MANIFIESTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINACOMISIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOMINA_PROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOTACRCLIE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOTACRPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOTADBCLIE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOTADBPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOTA_CR_BANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOTA_DB_BANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOVEDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ORDEMBARQUE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ORDENCOMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ORDENMCIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ORDENPROD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PAGO_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PEDIDO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PEDWEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PENDIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PLANILLAP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PLANTILLA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PRESTAMOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PRODDEV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PRODENT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_PRODSAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_RECICAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_RECIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_REMESAC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_REMICLIE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_REMIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_RESERVA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_RETIRO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_REVPRECIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_RUTERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_SALIDA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_SOLIMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_TIQUETE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_TRANSFER TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_TRASLACAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_TRASLADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_VACACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIOS_PATRIMONIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIOS_SITUACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAMBIO_PRECIOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CANCELE_FACTURA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CANTIDAD_POR_FACTOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CARTERA_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CARTERA_CLIENTES_OFFLINE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CARTERA_PUNTO_DIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CARTERA_TOTAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAUSA_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAUSA_NOMINA1 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAUSA_NOMINA_EMPLEADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAUSA_NOMINA_VACACIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CAUSA_RETENCION_LABORAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CEROS_ANCHO_FIJO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CERTIFICADOS_RETENCION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CERTIFICADOS_RETENCION_LABORAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CERTIFICA_LABORAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CHEQUEA_VENCIMIENTOS_CARGOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CHEQUEO_COSTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CHEQUEO_COSTOS_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CHEQUEO_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CHEQUEO_SALDOS_BANCOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CHEQUEO_SALDOS_CAJAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CHEQUEO_SALDOS_CONTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CHEQUES_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CIERRE_FACTURACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CIERRE_FORMAPAGO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CLASIFICA_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CLIENTES_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CLIENTES_DESCUENTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CLIENTES_SIN_REGISTRO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COBRADOR_NOTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CODIGOS_BARRAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CODIGO_BARRAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMISIONES_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMISIONES_CALLCENTER TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMISIONES_COBRO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMISIONES_DOCUMENTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPARA_CENTROS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPARA_CENTROS_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPARA_ITEM_FACTURA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPARA_MOVIMIENTO_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS8 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPRAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPRAS_ARTICULO_DETALLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPRAS_ARTICULO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPRAS_GRUPO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPRAS_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPRAS_PROVEEDOR_ANO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPRAS_PROVEEDOR_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPROBANTES_ACTIVO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPROBANTES_DIARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPROBANTES_NEGATIVOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COMPROBANTES_TERCERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIACION_PATRIMONIAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_BANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_BANCO_ACT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_BANCO_CONTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_COMPRAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_CXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_DEVCOMPRAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_DEVVENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_PAT_DETALLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONCILIA_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONFIRMA_RUTERO_FAC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSECUTIVOS_CONTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSIGNA_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSOLIDADO_PROVISIONES 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 CONSOLIDE_AJUSTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSOLIDE_PENDIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_ARTICULOS_MOVIL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_ARTICULOS_MOVILC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_ARTICULOS_PRECIOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_ARTICULOS_VTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_ARTICULOS_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_BALANCE_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_BALANCE_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_CLIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_EXISTENCIAS_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_PRESUPUESTO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_PUNTOS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSULTA_PUNTOS_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSUMO_HISTORICO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONSUMO_PRECIOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONS_SALDOSINI_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABILICE_COMP_SIMPLIFICADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABILICE_COSTO_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABILICE_EQUIVALENCIA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_AJUSTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_APLICACL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_APLICAPR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_APLICAPR_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_CAMBCOSTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_CAMBCOSTO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_CHEQUE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_CIERRE_COMP_INT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_CONSIGNA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_CONSIGNATAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_CONSIGNATAR_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_CONSIGNA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_DESENSAMBLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_DEVOLCHEQ TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_DEVOLCHEQ_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_DEVOLCLI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_DEVOLCOMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_EGRESO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_EGRESO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_ENSAMBLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_ENTRADA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_ENTRADA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTCOMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTCOMP_INT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTCOMP_INTN TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTURA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTURAS_CONTADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTURAS_CONTADO_NIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTURA_FACTOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTURA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTACRBC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTACRBC_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTACRCL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTACRPR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTACRPR_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTADBBC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTADBBC_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTADBCL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTADBCL_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTADBPR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTADBPR_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_PAGONOMI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_PLANILLA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_PRODUCCION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_PRODUCCION_DEV 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_RECICAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_RECICAJA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_RECIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_RECIPROV_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_REMIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_REMIPROV_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_RETIRO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_SALIDA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_TRASCUENTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_TRASCUENTA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_TRASLACAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_TRASLACAJA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_TRASLAMERCANCIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTACTOS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTADOS_SIN_RECIBO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTADO_MVERDE2 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTADO_MVERDE_NIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COPIA_CUENTAS_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COPIA_INTERFAZ_BANCOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COPIA_LISTA_PRECIOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CORREOS_TERCERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_EN_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_EN_VENTAS_CONTADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_EN_VENTAS_CONTADO_NIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_EN_VENTAS_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_NIIF_PROM_Y_ULT_UNIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO_UNIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO_UNIDAD_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO_Y_ULTIMO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO_Y_ULTIMO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO_Y_ULTIMO_UNIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_VENTAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_VENTAS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_VENTAS_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_VENTAS_FECHAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_VENTAS_ITEM TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_VENTAS_PUNTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE COSTO_VENTAS_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CREAR_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CREE_CUENTA_PUC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CRONOLOGICO_CONTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CRUCES_DOCUMENTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CRUCES_DOCUMENTOS_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CRUCES_DOCUMENTO_DETALLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUADRE_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUADRE_CAJA_ABONOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUADRE_CAJA_DETALLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUADRE_CAJA_EGRESOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUADRE_CAJA_FPAGO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUADRE_UNA_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUADRE_UNA_CAJA_ABONOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUADRE_UNA_CAJA_DETALLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUADRE_UNA_CAJA_EGRESOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUADRE_UNA_CAJA_FPAGO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUENTAS_ARTICULOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUENTA_AFECTABLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUENTA_AFECTABLE_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUENTA_INTERFAZ TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUENTA_INTERFAZ_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUENTA_MAL_AFECTABLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CUPO_DISPONIBLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CXPAGAR_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DATOS_COMPANIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DATOS_VEHICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DESCUENTOS_PEDIDO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DESENSAMBLES_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DESENSAMBLES_SIN_CONTABIL_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DETALLE_COMPRAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DETALLE_COMPRAS_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DETALLE_DEVOLUCIONES_POS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DETALLE_VENTAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DETALLE_VENTAS_ARTICULO_VEND TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DETALLE_VENTAS_CIUDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DETALLE_VENTAS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DETALLE_VENTAS_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DETERIORO_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DEVOLCLI_SIN_CONTABILIDAD_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DEVOLCOMP_SIN_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DEVOLUCIONES_SIN_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIAS_ENTRE_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS_LIQ TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIAS_LABORADOS_SINV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIAS_LIQUIDACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIAS_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIA_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIFERENCIAS_CONTEO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIF_MOVBANCO_CONCILIACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIGITOS_NIVEL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DIGITO_CHEQUEO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DINERO_DISPONIBLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DISPONIBILIDAD_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DOCCOMPRA_X_IMPORT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DOCCOMPRA_X_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DOCUMENTOS_IMPORTACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DOCUMENTOS_SERIAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DOCVENTAS_X_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE DV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EDITA_CLIENTE_MOVIL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EGRESOS_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EMPLEADO_ACTIVO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ENSAMBLES_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ENSAMBLES_SIN_CONTABILIDAD_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ENTRADAS_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ENTRADAS_SIN_CONTABILIDAD_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ENTREGA_FIN TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ENTREGA_ITEM TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ENTREGA_SIGUIENTE_ITEM TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ERRORINT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_ANO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ESTADO_FLUJO_EFECTIVO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ES_AFECTABLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ES_AFECTABLE_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS_BAJO_MINIMO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS_COMPRAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS_MENOS_RESERVA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS_MINYMAX TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS_SOBRE_MAXIMO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS_TERCEROS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS_UNIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS_UNIDAD_BOD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIAS_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTENCIA_BODEGA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTE_CENTRO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTE_CUENTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTE_CUENTA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXISTE_TERCERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXPORTA_FACTURAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXPORTA_FACTURAS_ASOB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE EXPORTA_FACTURAS_DET TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTCOMP_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTCOMP_SIN_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT_EXCEP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_PRE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURAR_CONCEPTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURAR_EVENTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURAS_MAL_TOTAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURAS_MES_NIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURAS_POR_ENTREGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURAS_RUTERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURAS_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURAS_SIN_CONTABILIDAD_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURAS_SIN_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURAS_SIN_MOV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FACTURA_ALQUILER_Y_TRANSPORTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FALTANTES_COMPRAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FALTANTES_COMPRAS_ARTICULOI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FALTANTES_VENTAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FALTANTE_CORTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FALTANTE_DOCUMENTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FECHAS_ANTERIORES_LOTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FECHA_DESDE_CONTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FECHA_FINAL_PERIODO_PAGO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FECHA_INICIAL_PERIODO_PAGO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FECHA_PERIODO_PAGO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FECHA_Y_NUMERO_CONTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FIN_DE_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FORMULA_PRECIOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE FORM_INTEGRADO_ELECTRONICO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_CARTERA_CLIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_COMPRAS_GRUPO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_COMPRAS_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_CXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_DISMINUCION_VENTAS_CLI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_DISMINUCION_VENTAS_PROD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_INVENTARIO_AGOTADOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_INVENTARIO_BAJAROT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_INVENTARIO_GRUPO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_INVENTARIO_MARCA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_INVENTARIO_PROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_MOVIMIENTO_CLIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_MOVIMIENTO_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_RESUMEN_BANCOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_RESUMEN_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_RESUMEN_SALDOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_VENTAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_VENTAS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_VENTAS_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_VENTAS_GRUPO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_VENTAS_PUNTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GER_VENTAS_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GRABE_FACTURA_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE GRABE_PEDIDO_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE HISTORIA_MENSAJES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE HISTORICO_CARTERA_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IBC_APORTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IBC_APORTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IBC_EMPLEADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_AJUSTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_ANTICLIE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_ANTIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_APLICLIE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_APLIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_APORTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_ARQUEO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_CAMBCOSTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_CAMBDOCU TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_CERTRETE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_COMPROBANTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_CONCILIACIONB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_CONSIGNA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_CONSIGNATAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_CONTABILIZACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_COTIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_COTIZACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_CRUCES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_DESENSAMBLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_DEVOLPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_DEVOLUCION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_DIFERENCIAS_CONTEO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_EGRESO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_ENSAMBLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_ENTRADA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_FACTCOMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_FACTPRO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_FACTURA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_FORMAPAGO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_LIQRUTAC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_LIQRUTAC_CONC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_LIQRUTAC_EFE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_LIQUIDACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_MANIFIESTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_NOTACRCL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_NOTACRPR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_NOTADBCL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_NOTADBPR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_ORDENCMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_ORDENINT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_ORDENINV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PARQUEADERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PEDIDO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PENDIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PLANCONCEPTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PLANILLA 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 IMPR_PLANPROD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PLANPROD_CONS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PLANREMESA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PRODUCCION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PRODUCCION_ENT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PRODUCCION_ENTRADA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_PRODUCCION_MONTAJE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_RECICAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_RECICJPAGO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_RECIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_REMESA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_REMIPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_REMISION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_RESERVA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_REVPRECIOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_RUTERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_SALIDA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_SORTEO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_TIQUETE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_TRASFERENCIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_TRASLACAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_TRASLADOBCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPR_VACACIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPUESTOS_COMPRAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE IMPUESTOS_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE INCAPACIDAD_TOTAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE INCREMENTE_NROCOPIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE INFORME_DIARIO_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE INFORME_DIARIO_VENTAS_FP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE INFORME_DIARIO_VENTAS_TERM TO PUBLIC;
GRANT EXECUTE ON PROCEDURE INF_CERTIFICADOS_RETENCION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE INSERTE_SALDO_INICIAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE INVENTARIO_Y_BALANCE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE KARDEX_ARTICULO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE KARDEX_ARTICULO_MES_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE KARDEX_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE KARDEX_DESDE_HASTA_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE KARDEX_INVENTARIO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE KARDEX_INVENTARIO_MES_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIBRO_DIARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIBRO_DIARIO_CUENTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIBRO_DIARIO_CUENTA_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIQUIDACION_APORTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIQUIDACION_EMPLEADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIQUIDACION_IMPORTACION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIQUIDA_VACACIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LIQ_PARQUEADERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LISTAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LISTAS_ARTICULO_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LISTA_LOTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LISTA_PRECIOS_CON_ESCALA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE LISTA_PRECIOS_OFFLINE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MANIFIESTOS_CONDUCTOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MANIFIESTOS_VEHICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MAXIMO_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MAX_NIVEL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MAYOR_SALDO_LOTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MAYOR_Y_BALANCE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MEDIOS_MAGNETICOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MEDIOS_MAGNETICOS2 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MERCANCIA_EN_TRANSITO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MES_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MINIMO_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_2 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_22 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_23 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_24 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_26 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_31 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_310 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_32 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_33 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_34 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_36 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_4 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MMDIST_6 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1001 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1001_9 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1002 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1003 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1005 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_10057 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1006 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_10067 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1007 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_10078 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1008 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1009 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1011 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MM_1012 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVARTI_CANTIDADES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVBANCO_NO_CONCILIADOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVER_FORMATO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTOS_ARTICULOC_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTOS_CENTRO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTOS_CENTRO_MES_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTOS_CENTRO_TERCERO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTOS_CUENTA_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTOS_CUENTA_DE_HASTA_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTOS_CUENTA_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTOS_CUENTA_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTOS_TERCERO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTOS_TERCERO_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_ARTICULOC_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_ARTICULO_ANULADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_ARTICULO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_BANCO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CAJA_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CARTERA_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CENTRO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CENTRO_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CXPAGAR_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_INVENTARIO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_NETO_CUENTA_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_NETO_CUENTA_MES_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_TERCERO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_TERCERO_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVLOTES_DESDE_HASTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOVTOS_CENTRO_TERCERO_MES_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOV_DETALLE_BANCOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE MOV_DETALLE_CAJAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOMBRES_GRUPOS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOMBRES_GRUPOS_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOMBRE_ASCII TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOMBRE_COMPANIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOMINA_SALARIOS_UGPP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOTACRCL_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOTACRPR_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOTADBCL_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOTADBPR_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOTASCRBC_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOTASDBBC_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NOVEDADESXPERIODO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NROBANCO_REF_EGRESOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NRO_COPIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NUMERO_DOCUMENTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE NUM_ENT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ORDENES_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ORDENES_ARTICULO_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ORDENES_COMPRA_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ORDENE_TARIFAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ORDEN_SUGERIDA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ORDEN_SUGERIDA_BOD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ORDEN_SUGERIDA_TOTAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PADRE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PAGO_NOMINA_XEMPL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PAGO_NOMINA_XEMPL_DETA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PEDIDOS_POR_ENTREGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PEDIDOS_WEB_POR_CONFIRMAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PEDIDOS_X_ORDENAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PENDIENTES_X_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PERFILES_EMPLEADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PERIODO_NOM_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PERIODO_NOM_FECHAF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PLANILLA_NOMINA_HORAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PLANILLA_NOMINA_NOVEDADES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PORCENTAJE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE POS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PRECIOS_UNIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PRECIOS_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PRECIOS_Y_EXISTENCIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PRECIO_CANTIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PRECIO_UNIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PRESTAMOS_EMPLEADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PRESTAMOS_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PRESTAMOS_PENDIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PRESUPUESTO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PRODUCCION_SUGERIDA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PROMEDIO_PRODUCCION_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PROMEDIO_SALIDAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PROMEDIO_TOTAL_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE PROVEEDORES_SIN_REGISTRO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RANGO_CLIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RECALCULA_APERTURA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RECALCULO_COMISIONES_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RECIBOS_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RECIBO_RECAUDO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RECONTABILICE_COSTOS_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RECONTABILICE_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RECUPERACION_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RECUPERA_FACTURAS_VEND TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RECUPERA_NUMERO_CHEQUE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RECUPERA_PEDIDOS_VEND TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REDONDEE_NOTAS_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REGISTRA_PROVISION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REGISTRE_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REGISTRE_COINCIDENCIAS_CONTEO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REGISTRE_FACTURA_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REGISTRE_ITEM_FACTURA_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REGISTRE_REGIAUTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REPARTE_SALIDA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REPORTE_IMPORTACIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ABC_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_AJUSTES_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ANALISIS_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ANALISIS_CXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_APLICACLI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_APLICAPROV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_APORTES_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ARTICULOS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ARTICULOS_CONTABIL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ARTICULOS_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ARTICULOS_PROVEEDORI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ARTICULOS_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ARTICULO_BARRAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ASOCIADOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_AUDITORIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_AUSENTISMO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CARTERA_CLIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CARTERA_CONSOLIDADA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CARTERA_NOTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CLIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CLIENTES_BIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CLIENTES_CRM TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CLIENTES_ULTVENTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPRAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPRAS_ARTICULOI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPRAS_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPRAS_PROVEEDORI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPRAS_PROVEEDOR_ANO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPRAS_RIMAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPRAS_SISMED TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPROBANTES_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPROBANTES_BANCOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPROBANTES_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPROBANTES_CAJA_ART TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPROBANTES_CAJA_DET TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPROBANTES_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPROBANTES_CMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPROBANTES_CXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPROBANTES_FAC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_COMPROBANTES_INV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONCEPTOS_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONCEP_XPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONDUCTORES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONSECUTIVOS_BANCOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONSECUTIVOS_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONSECUTIVOS_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONSECUTIVOS_CMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONSECUTIVOS_CXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONSECUTIVOS_FAC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONSECUTIVOS_IMP TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONSECUTIVOS_INV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CONSIGNACIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CRM_CLIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CRM_COMPROMISOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CRM_EVENTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CRUCES_DOCUMENTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CXPAGAR_CONSOLIDADAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_CXPAGAR_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_DECRETO1818 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_DETALLE_CERTIFICADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_DETERIORO_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_DISPONIBILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_DOCUMENTOS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_DOCUMENTOS_ENCAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_DOCUMENTOS_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_EGRESOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_EMPLEADOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ENSAMBLES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ENTREGA_FACTURAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_ESTADO_CUENTA_BANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_EXISTENCIAS_PRECIOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_FALTANTES_CLIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_FALTANTES_COMPRA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_FALTANTES_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_FALTANTES_PROVEEDORI TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_FALTANTES_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_FALTANTES_VENTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_GRUPOS_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_HISTOEMPL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_IMPORTACIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_KARDEX_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_LISTA_PRECIOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_METAS_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_MOVCAJA_DOCUMENTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_MOVIMIENTO_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_MOVIMIENTO_DIARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_MOVIMIENTO_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_MOVIMIENTO_X_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_MUNICIPIOS_BIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_NOMINA_HORASEXTRA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_NOMINA_NOVEDADES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_PEDIDOS_ENTREGA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_PLANILLA_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_PRECIOS_RIMAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_PRECIOS_SISMED TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_PRESTAMOS_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_PRODUCCION TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_PRODUCTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_PROVEEDOR_X_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_RETENCION_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_RETENCION_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_REVALID_CLIENTES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_REVALID_PRODUCTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_REVALID_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_RUTAS_BIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_RUTEROS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_SKU_BIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_SUGERIDO_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_TERCEROS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_TIPONEGOCIO_BIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_UTILIDAD_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_UTILIDAD_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_UTILIDAD_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_UTILIDAD_VENTAS_SUBG TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VACACIONES_NOMINA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VEHICULOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENDEDORES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENDEDORES_BIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTASDET_BIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTAS_ARTICULO_ANO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTAS_BIT TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTAS_CANAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTAS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTAS_CLIENTE_ANO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTAS_EVENTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTAS_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTAS_VENDEDOR_GRUPO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REP_VENTAS_VENDEDOR_RIMAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESERVAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESERVAS_ARTICULO_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESTE_EXISTENCIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_BANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_BANCO_CONF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESULTADO_ANUAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESUMEN_GERENCIAL_RIMAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESUMEN_SALDOS_BANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESUMEN_SALDOS_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RESUMEN_VENTAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RETIROS_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REVERSA_TRASLADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REVISA_PRECIOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE REVISA_PRECIOS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RUTERO_CONSOLIDADO_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE RUTERO_FACTURA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALARIO_BASE_EMPLEADO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALARIO_PROMEDIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALARIO_PROMEDIO_DETALLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALARIO_PROMEDIO_SIN_AUX TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALARIO_PROMEDIO_VACACIONES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDOS_ARTICULO_CUENTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDOS_FACTURA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_ACTIVO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_ACTIVO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_ARTICULO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_ARTICULO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_TERCERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_TERCERO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CLIENTE_FAC TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CLIENTE_SUCURSAL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTAF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_BANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_BANCO_CONF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_EN_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_EN_EFECTIVO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_FINAL_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_FINAL_CUENTA_BANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_FORMA_PAGO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_TOTAL_INV TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_LOTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_LOTE_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_PRESTAMO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_TERCEROS_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_FECHA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_BANCOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALIDAS_ANO_ANTERIOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALIDAS_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SALIDAS_SIN_CONTABILIDAD_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SELECCIONE_LOTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SERIALES_ITEM_DOCUMENTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUGERIDO_BODEGA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUGERIDO_PROVEEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUGIERE_METAS_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUGIERE_PRECIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUMA_APERTURA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUMA_DESCUENTOS_FINANCIEROS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUME_EXISTENCIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_BANCO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_BANCO_CONF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_CAJA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_CUENTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TARIFAS_ENSAMBLE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TOTAL_DOC_COMPRA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TOTAL_DOC_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TOTAL_FACTURA_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TOTAL_PAGOS_TERCERO_ANO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TOTAL_PEDIDO_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_ARTICULOS_MOVIL_OFFLINE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_ARTICULO_MOVIL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_CIUDADES_MOVIL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_CLIENTES_MOVIL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_CLIENTES_MOVIL_OFFLINE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_CLIENTE_MOVIL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_CLIENTE_WEB TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_FACTURA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_PEDIDO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_PEDIDOS_VEND TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_RECAUDO_RUTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_RUTEROS_CONDUCTOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_RUTERO_DET TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_SUCURSALES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRAE_UN_RECAUDO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRASCUENTAS_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRASLACAJAS_SIN_CONTABILIDAD TO PUBLIC;
GRANT EXECUTE ON PROCEDURE TRASLADOS_SIN_CONTABILDAD_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ULTIMA_DEPRECIACION_UNIDADES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ULTIMO_COMPROMISO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE ULTIMO_EVENTO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE UNIDADES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE UNIDADES_OFFLINE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE USUARIOS_MENSAJE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE UTILIDAD_VENTAS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_BONO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_CUENTA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_CUENTA_C TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_CUENTA_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_CUENTA_NIIF_C TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_EXISTENCIA TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_NIVEL TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_PADRE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALIDE_PADRE_NIIF TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALOR_INICIAL_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALOR_INICIAL_INVENTARIO_N TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VALOR_INVENTARIO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VARIACION_COSTOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENCIDO_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_ANUALES_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_ANUALES_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_ANUALES_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_ARTICULO_ANO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_ARTICULO_ANO1 TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_ARTICULO_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_ARTICULO_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_ARTICULO_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_CIUDAD_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_CLIENTE TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_CLIENTE_ANO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_CLIENTE_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_CLIENTE_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_POR_HORA_ARTICULO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_VENDEDOR TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_VENDEDOR_ANO TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VENTAS_VENDEDOR_MES TO PUBLIC;
GRANT EXECUTE ON PROCEDURE VER_ARTICULOS_PEDWEB TO PUBLIC;
GRANT TODOS TO PUBLIC;
GRANT EXECUTE ON PROCEDURE CONTABIL_DETERIORO TO PUCLIC;
GRANT SELECT ON PLAN_PRODUCCION TO REPL;
GRANT SELECT, INSERT, REFERENCES ON SALDO_EFECTIVO TO WILMAR;

/* Privileges of triggers */
GRANT UPDATE, REFERENCES ON AJUSTES TO TRIGGER AJUSTES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER AJUSTES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER AJUSTES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER AJUSTES_AD;
GRANT UPDATE, REFERENCES ON AJUSTES TO TRIGGER AJUSTES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER AJUSTES_AI;
GRANT UPDATE, REFERENCES ON AJUSTES TO TRIGGER AJUSTES_AU;
GRANT SELECT, UPDATE ON AJUSTES_DETALLE TO TRIGGER AJUSTES_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER AJUSTES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER AJUSTES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER AJUSTES_AU;
GRANT SELECT, UPDATE, REFERENCES ON AJUSTES TO TRIGGER AJUSTES_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER AJUSTES_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER AJUSTES_BI;
GRANT UPDATE, REFERENCES ON AJUSTES_DETALLE TO TRIGGER AJUSTES_DETALLE_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER AJUSTES_DETALLE_AD;
GRANT SELECT ON AJUSTES TO TRIGGER AJUSTES_DETALLE_AI;
GRANT UPDATE, REFERENCES ON AJUSTES_DETALLE TO TRIGGER AJUSTES_DETALLE_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER AJUSTES_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER AJUSTES_DETALLE_AI;
GRANT SELECT ON AJUSTES TO TRIGGER AJUSTES_DETALLE_AU;
GRANT UPDATE, REFERENCES ON AJUSTES_DETALLE TO TRIGGER AJUSTES_DETALLE_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER AJUSTES_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER AJUSTES_DETALLE_AU;
GRANT SELECT ON AJUSTES TO TRIGGER AJUSTES_DETALLE_BI;
GRANT UPDATE, REFERENCES ON AJUSTES_DETALLE TO TRIGGER AJUSTES_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER AJUSTES_DETALLE_BI;
GRANT UPDATE, REFERENCES ON AJUSTES_INFLACION TO TRIGGER AJUSTES_INFLACION_BD;
GRANT INSERT ON AUDITORIA TO TRIGGER AJUSTES_INFLACION_BD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER AJUSTES_INFLACION_BD;
GRANT SELECT, UPDATE, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER AJUSTES_INFLACION_BD;
GRANT UPDATE, REFERENCES ON AJUSTES_INFLACION TO TRIGGER AJUSTES_INFLACION_BI;
GRANT INSERT ON COMPROBANTE_DETALLE TO TRIGGER AJUSTES_INFLACION_BI;
GRANT INSERT ON COMPROBANTE_ENCABEZADO TO TRIGGER AJUSTES_INFLACION_BI;
GRANT SELECT, REFERENCES ON CUENTAS TO TRIGGER AJUSTES_INFLACION_BI;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_COMPROBA TO TRIGGER AJUSTES_INFLACION_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER AJUSTES_INFLACION_BI;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO TRIGGER AJUSTES_INFLACION_BI;
GRANT UPDATE, REFERENCES ON AJUSTES_INFLACION TO TRIGGER AJUSTES_INFLACION_BU;
GRANT INSERT ON AUDITORIA TO TRIGGER AJUSTES_INFLACION_BU;
GRANT SELECT, UPDATE ON COMPROBANTE_ENCABEZADO TO TRIGGER AJUSTES_INFLACION_BU;
GRANT UPDATE, REFERENCES ON ANTICIPOS_CLIENTE TO TRIGGER ANTICIPOS_CLIENTE_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER ANTICIPOS_CLIENTE_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER ANTICIPOS_CLIENTE_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER ANTICIPOS_CLIENTE_AD;
GRANT DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER ANTICIPOS_CLIENTE_AD;
GRANT SELECT, DELETE ON SALDOS_DOC_CARTERA TO TRIGGER ANTICIPOS_CLIENTE_AD;
GRANT UPDATE, REFERENCES ON ANTICIPOS_CLIENTE TO TRIGGER ANTICIPOS_CLIENTE_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER ANTICIPOS_CLIENTE_AI;
GRANT INSERT ON MOVIMIENTO_CLIENTES TO TRIGGER ANTICIPOS_CLIENTE_AI;
GRANT INSERT ON SALDOS_DOC_CARTERA TO TRIGGER ANTICIPOS_CLIENTE_AI;
GRANT UPDATE, REFERENCES ON ANTICIPOS_CLIENTE TO TRIGGER ANTICIPOS_CLIENTE_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER ANTICIPOS_CLIENTE_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER ANTICIPOS_CLIENTE_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER ANTICIPOS_CLIENTE_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER ANTICIPOS_CLIENTE_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER ANTICIPOS_CLIENTE_AU;
GRANT SELECT, UPDATE, REFERENCES ON ANTICIPOS_CLIENTE TO TRIGGER ANTICIPOS_CLIENTE_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER ANTICIPOS_CLIENTE_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER ANTICIPOS_CLIENTE_BI;
GRANT UPDATE, REFERENCES ON ANTICIPOS_PROVEEDOR TO TRIGGER ANTICIPOS_PROVEEDOR_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER ANTICIPOS_PROVEEDOR_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER ANTICIPOS_PROVEEDOR_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER ANTICIPOS_PROVEEDOR_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER ANTICIPOS_PROVEEDOR_AD;
GRANT SELECT, DELETE ON SALDOS_DOC_CXPAGAR TO TRIGGER ANTICIPOS_PROVEEDOR_AD;
GRANT UPDATE, REFERENCES ON ANTICIPOS_PROVEEDOR TO TRIGGER ANTICIPOS_PROVEEDOR_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER ANTICIPOS_PROVEEDOR_AI;
GRANT INSERT ON MOVIMIENTO_PROVEEDOR TO TRIGGER ANTICIPOS_PROVEEDOR_AI;
GRANT INSERT ON SALDOS_DOC_CXPAGAR TO TRIGGER ANTICIPOS_PROVEEDOR_AI;
GRANT UPDATE, REFERENCES ON ANTICIPOS_PROVEEDOR TO TRIGGER ANTICIPOS_PROVEEDOR_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER ANTICIPOS_PROVEEDOR_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER ANTICIPOS_PROVEEDOR_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER ANTICIPOS_PROVEEDOR_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER ANTICIPOS_PROVEEDOR_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON SALDOS_DOC_CXPAGAR TO TRIGGER ANTICIPOS_PROVEEDOR_AU;
GRANT SELECT, UPDATE, REFERENCES ON ANTICIPOS_PROVEEDOR TO TRIGGER ANTICIPOS_PROVEEDOR_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER ANTICIPOS_PROVEEDOR_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER ANTICIPOS_PROVEEDOR_BI;
GRANT UPDATE, REFERENCES ON APLICACION_CLIENTE TO TRIGGER APLICACION_CLIENTE_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER APLICACION_CLIENTE_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER APLICACION_CLIENTE_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER APLICACION_CLIENTE_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER APLICACION_CLIENTE_AD;
GRANT UPDATE, REFERENCES ON APLICACION_CLIENTE TO TRIGGER APLICACION_CLIENTE_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER APLICACION_CLIENTE_AI;
GRANT UPDATE, REFERENCES ON APLICACION_CLIENTE TO TRIGGER APLICACION_CLIENTE_AU;
GRANT SELECT, UPDATE ON APLICACION_CLIENTE_DETALLE TO TRIGGER APLICACION_CLIENTE_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER APLICACION_CLIENTE_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER APLICACION_CLIENTE_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER APLICACION_CLIENTE_AU;
GRANT SELECT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER APLICACION_CLIENTE_AU;
GRANT SELECT, UPDATE, REFERENCES ON APLICACION_CLIENTE TO TRIGGER APLICACION_CLIENTE_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER APLICACION_CLIENTE_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER APLICACION_CLIENTE_BI;
GRANT SELECT, UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER APLICACION_CLIENTE_CRUCE_AD;
GRANT SELECT, UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER APLICACION_CLIENTE_CRUCE_AD;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER APLICACION_CLIENTE_CRUCE_AI;
GRANT SELECT, INSERT, UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER APLICACION_CLIENTE_CRUCE_AI;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER APLICACION_CLIENTE_CRUCE_AU;
GRANT SELECT, INSERT, UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER APLICACION_CLIENTE_CRUCE_AU;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE TO TRIGGER APLICACION_CLIENTE_DETALLE_AD;
GRANT UPDATE, REFERENCES ON APLICACION_CLIENTE_DETALLE TO TRIGGER APLICACION_CLIENTE_DETALLE_AD;
GRANT SELECT, UPDATE, REFERENCES ON MOVIMIENTO_CLIENTES TO TRIGGER APLICACION_CLIENTE_DETALLE_AD;
GRANT SELECT, UPDATE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER APLICACION_CLIENTE_DETALLE_AD;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE TO TRIGGER APLICACION_CLIENTE_DETALLE_AI;
GRANT UPDATE, REFERENCES ON APLICACION_CLIENTE_DETALLE TO TRIGGER APLICACION_CLIENTE_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CLIENTES TO TRIGGER APLICACION_CLIENTE_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER APLICACION_CLIENTE_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER APLICACION_CLIENTE_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO TRIGGER APLICACION_CLIENTE_DETALLE_AI;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE TO TRIGGER APLICACION_CLIENTE_DETALLE_AU;
GRANT UPDATE, REFERENCES ON APLICACION_CLIENTE_DETALLE TO TRIGGER APLICACION_CLIENTE_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CLIENTES TO TRIGGER APLICACION_CLIENTE_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER APLICACION_CLIENTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER APLICACION_CLIENTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO TRIGGER APLICACION_CLIENTE_DETALLE_AU;
GRANT UPDATE, REFERENCES ON APLICACION_PROVEDOR TO TRIGGER APLICACION_PROVEDOR_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER APLICACION_PROVEDOR_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER APLICACION_PROVEDOR_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER APLICACION_PROVEDOR_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER APLICACION_PROVEDOR_AD;
GRANT UPDATE, REFERENCES ON APLICACION_PROVEDOR TO TRIGGER APLICACION_PROVEDOR_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER APLICACION_PROVEDOR_AI;
GRANT UPDATE, REFERENCES ON APLICACION_PROVEDOR TO TRIGGER APLICACION_PROVEDOR_AU;
GRANT SELECT, UPDATE ON APLICACION_PROVEEDOR_DETALLE TO TRIGGER APLICACION_PROVEDOR_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER APLICACION_PROVEDOR_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER APLICACION_PROVEDOR_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER APLICACION_PROVEDOR_AU;
GRANT SELECT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER APLICACION_PROVEDOR_AU;
GRANT SELECT, UPDATE, REFERENCES ON APLICACION_PROVEDOR TO TRIGGER APLICACION_PROVEDOR_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER APLICACION_PROVEDOR_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER APLICACION_PROVEDOR_BI;
GRANT SELECT ON APLICACION_PROVEDOR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AD;
GRANT UPDATE, REFERENCES ON APLICACION_PROVEEDOR_DETALLE TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AD;
GRANT SELECT, UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AD;
GRANT SELECT, UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AD;
GRANT SELECT ON APLICACION_PROVEDOR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AI;
GRANT UPDATE, REFERENCES ON APLICACION_PROVEEDOR_DETALLE TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AI;
GRANT SELECT ON APLICACION_PROVEDOR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AU;
GRANT UPDATE, REFERENCES ON APLICACION_PROVEEDOR_DETALLE TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO TRIGGER APLICACION_PROVEEDOR_DETALLE_AU;
GRANT UPDATE, REFERENCES ON ARTICULOS_PRODUCTO TO TRIGGER ARTICULOS_PRODUCTO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER ARTICULOS_PRODUCTO_AD;
GRANT UPDATE, REFERENCES ON ARTICULOS_PRODUCTO TO TRIGGER ARTICULOS_PRODUCTO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER ARTICULOS_PRODUCTO_AI;
GRANT UPDATE, REFERENCES ON ARTICULOS_PRODUCTO TO TRIGGER ARTICULOS_PRODUCTO_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER ARTICULOS_PRODUCTO_AU;
GRANT UPDATE, REFERENCES ON ARTICULO TO TRIGGER ARTICULO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER ARTICULO_AD;
GRANT UPDATE, REFERENCES ON ARTICULO TO TRIGGER ARTICULO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER ARTICULO_AI;
GRANT INSERT ON CONTABIL_ARTICULO TO TRIGGER ARTICULO_AI;
GRANT SELECT, REFERENCES ON GRUPO TO TRIGGER ARTICULO_AI;
GRANT SELECT, REFERENCES ON LISTA_PRECIOS TO TRIGGER ARTICULO_AI;
GRANT INSERT ON PRECIOS_ARTICULO TO TRIGGER ARTICULO_AI;
GRANT SELECT ON TARIFA_IVA TO TRIGGER ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER ARTICULO_AI;
GRANT UPDATE, REFERENCES ON ARTICULO_ALERTAS TO TRIGGER ARTICULO_ALERTAS_BI;
GRANT UPDATE, REFERENCES ON ARTICULO TO TRIGGER ARTICULO_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER ARTICULO_AU;
GRANT SELECT, UPDATE ON CONTABIL_ARTICULO TO TRIGGER ARTICULO_AU;
GRANT SELECT ON GRUPO TO TRIGGER ARTICULO_AU;
GRANT SELECT ON TARIFA_IVA TO TRIGGER ARTICULO_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER ARTICULO_AU;
GRANT UPDATE, REFERENCES ON ARTICULO TO TRIGGER ARTICULO_BD;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO TRIGGER ARTICULO_BD;
GRANT SELECT, UPDATE, REFERENCES ON ARTICULO TO TRIGGER ARTICULO_BI;
GRANT SELECT ON AJUSTES_DETALLE TO TRIGGER ARTICULO_BU;
GRANT UPDATE, REFERENCES ON ARTICULO TO TRIGGER ARTICULO_BU;
GRANT SELECT ON ARTICULOS_PRODUCTO TO TRIGGER ARTICULO_BU;
GRANT SELECT ON DESENSAMBLES_DETALLE TO TRIGGER ARTICULO_BU;
GRANT SELECT ON DEVOLUCIONES_COMPRAS_DET TO TRIGGER ARTICULO_BU;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO TRIGGER ARTICULO_BU;
GRANT SELECT ON ENSAMBLES_DETALLE TO TRIGGER ARTICULO_BU;
GRANT SELECT ON ENTRADAS_DETALLE TO TRIGGER ARTICULO_BU;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO TRIGGER ARTICULO_BU;
GRANT SELECT ON FACTURAS_DETALLE TO TRIGGER ARTICULO_BU;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO TRIGGER ARTICULO_BU;
GRANT SELECT ON ORDENINVENTARIO_DETALLE TO TRIGGER ARTICULO_BU;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO TRIGGER ARTICULO_BU;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO TRIGGER ARTICULO_BU;
GRANT SELECT ON RESERVAS_DETALLE TO TRIGGER ARTICULO_BU;
GRANT SELECT ON SALIDAS_DETALLE TO TRIGGER ARTICULO_BU;
GRANT SELECT ON TRASFERENCIAS_DETALLE TO TRIGGER ARTICULO_BU;
GRANT UPDATE, REFERENCES ON AUDITORIA TO TRIGGER AUDITORIA_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER AUTORIZACIONES_AD;
GRANT UPDATE, REFERENCES ON AUTORIZACIONES TO TRIGGER AUTORIZACIONES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER AUTORIZACIONES_AI;
GRANT UPDATE, REFERENCES ON AUTORIZACIONES TO TRIGGER AUTORIZACIONES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER AUTORIZACIONES_AU;
GRANT UPDATE, REFERENCES ON AUTORIZACIONES TO TRIGGER AUTORIZACIONES_AU;
GRANT UPDATE, REFERENCES ON AUTORIZACIONES TO TRIGGER AUTORIZACIONES_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER AUTORIZACIONES_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER BARRAS_ARTICULO_AD;
GRANT UPDATE, REFERENCES ON BARRAS_ARTICULO TO TRIGGER BARRAS_ARTICULO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER BARRAS_ARTICULO_AI;
GRANT UPDATE, REFERENCES ON BARRAS_ARTICULO TO TRIGGER BARRAS_ARTICULO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER BARRAS_ARTICULO_AU;
GRANT UPDATE, REFERENCES ON BARRAS_ARTICULO TO TRIGGER BARRAS_ARTICULO_AU;
GRANT UPDATE, REFERENCES ON CAMBIODOC_ENTRADAS TO TRIGGER CAMBIODOC_ENTRADAS_AD;
GRANT SELECT ON CAMBIO_DOCUMENTOS TO TRIGGER CAMBIODOC_ENTRADAS_AD;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CAMBIODOC_ENTRADAS_AD;
GRANT SELECT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER CAMBIODOC_ENTRADAS_AD;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER CAMBIODOC_ENTRADAS_AD;
GRANT UPDATE, REFERENCES ON CAMBIODOC_ENTRADAS TO TRIGGER CAMBIODOC_ENTRADAS_AI;
GRANT SELECT ON CAMBIO_DOCUMENTOS TO TRIGGER CAMBIODOC_ENTRADAS_AI;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CAMBIODOC_ENTRADAS_AI;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER CAMBIODOC_ENTRADAS_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER CAMBIODOC_ENTRADAS_AI;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER CAMBIODOC_ENTRADAS_AI;
GRANT UPDATE, REFERENCES ON CAMBIODOC_ENTRADAS TO TRIGGER CAMBIODOC_ENTRADAS_AU;
GRANT SELECT ON CAMBIO_DOCUMENTOS TO TRIGGER CAMBIODOC_ENTRADAS_AU;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CAMBIODOC_ENTRADAS_AU;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER CAMBIODOC_ENTRADAS_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER CAMBIODOC_ENTRADAS_AU;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER CAMBIODOC_ENTRADAS_AU;
GRANT UPDATE, REFERENCES ON CAMBIODOC_SALIDAS TO TRIGGER CAMBIODOC_SALIDAS_AD;
GRANT SELECT ON CAMBIO_DOCUMENTOS TO TRIGGER CAMBIODOC_SALIDAS_AD;
GRANT SELECT, DELETE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CAMBIODOC_SALIDAS_AD;
GRANT SELECT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER CAMBIODOC_SALIDAS_AD;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER CAMBIODOC_SALIDAS_AD;
GRANT UPDATE, REFERENCES ON CAMBIODOC_SALIDAS TO TRIGGER CAMBIODOC_SALIDAS_AI;
GRANT SELECT, REFERENCES ON CAMBIO_DOCUMENTOS TO TRIGGER CAMBIODOC_SALIDAS_AI;
GRANT INSERT ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CAMBIODOC_SALIDAS_AI;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER CAMBIODOC_SALIDAS_AI;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER CAMBIODOC_SALIDAS_AI;
GRANT UPDATE, REFERENCES ON CAMBIODOC_SALIDAS TO TRIGGER CAMBIODOC_SALIDAS_AU;
GRANT SELECT ON CAMBIO_DOCUMENTOS TO TRIGGER CAMBIODOC_SALIDAS_AU;
GRANT SELECT, INSERT, DELETE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CAMBIODOC_SALIDAS_AU;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER CAMBIODOC_SALIDAS_AU;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER CAMBIODOC_SALIDAS_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER CAMBIO_DOCUMENTOS_AD;
GRANT UPDATE, REFERENCES ON CAMBIO_DOCUMENTOS TO TRIGGER CAMBIO_DOCUMENTOS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CAMBIO_DOCUMENTOS_AI;
GRANT UPDATE, REFERENCES ON CAMBIO_DOCUMENTOS TO TRIGGER CAMBIO_DOCUMENTOS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CAMBIO_DOCUMENTOS_AU;
GRANT SELECT, UPDATE ON CAMBIODOC_ENTRADAS TO TRIGGER CAMBIO_DOCUMENTOS_AU;
GRANT SELECT, UPDATE ON CAMBIODOC_SALIDAS TO TRIGGER CAMBIO_DOCUMENTOS_AU;
GRANT UPDATE, REFERENCES ON CAMBIO_DOCUMENTOS TO TRIGGER CAMBIO_DOCUMENTOS_AU;
GRANT SELECT, UPDATE, REFERENCES ON CAMBIO_DOCUMENTOS TO TRIGGER CAMBIO_DOCUMENTOS_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER CAMBIO_DOCUMENTOS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER CAMBIO_DOCUMENTOS_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER CARGA_REMESA_AD;
GRANT UPDATE, REFERENCES ON CARGA_REMESA TO TRIGGER CARGA_REMESA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CARGA_REMESA_AI;
GRANT UPDATE, REFERENCES ON CARGA_REMESA TO TRIGGER CARGA_REMESA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CARGA_REMESA_AU;
GRANT UPDATE, REFERENCES ON CARGA_REMESA TO TRIGGER CARGA_REMESA_AU;
GRANT SELECT, UPDATE, REFERENCES ON CARGA_REMESA TO TRIGGER CARGA_REMESA_BI;
GRANT SELECT, UPDATE ON PREFIJOS TO TRIGGER CARGA_REMESA_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER CARGA_REMESA_BI;
GRANT UPDATE, REFERENCES ON CENTROS TO TRIGGER CENTROS_BD;
GRANT SELECT ON COMPROBANTE_DETALLE TO TRIGGER CENTROS_BD;
GRANT INSERT ON AUDITORIA TO TRIGGER CHEQUES_AD;
GRANT UPDATE, REFERENCES ON CHEQUES TO TRIGGER CHEQUES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER CHEQUES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER CHEQUES_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_BANCO TO TRIGGER CHEQUES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CHEQUES_AI;
GRANT UPDATE, REFERENCES ON CHEQUES TO TRIGGER CHEQUES_AI;
GRANT INSERT ON MOVIMIENTO_BANCO TO TRIGGER CHEQUES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CHEQUES_AU;
GRANT UPDATE, REFERENCES ON CHEQUES TO TRIGGER CHEQUES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER CHEQUES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER CHEQUES_AU;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_BANCO TO TRIGGER CHEQUES_AU;
GRANT SELECT, UPDATE, REFERENCES ON CHEQUES TO TRIGGER CHEQUES_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER CHEQUES_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER CHEQUES_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER CIERRE_ANUAL_AD;
GRANT UPDATE, REFERENCES ON CIERRE_ANUAL TO TRIGGER CIERRE_ANUAL_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CIERRE_ANUAL_AI;
GRANT UPDATE, REFERENCES ON CIERRE_ANUAL TO TRIGGER CIERRE_ANUAL_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CIERRE_ANUAL_AU;
GRANT UPDATE, REFERENCES ON CIERRE_ANUAL TO TRIGGER CIERRE_ANUAL_AU;
GRANT UPDATE, REFERENCES ON CIERRE_ANUAL TO TRIGGER CIERRE_ANUAL_BD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER CIERRE_ANUAL_BD;
GRANT SELECT, UPDATE, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER CIERRE_ANUAL_BD;
GRANT SELECT ON CENTROS TO TRIGGER CIERRE_ANUAL_BI;
GRANT UPDATE, REFERENCES ON CIERRE_ANUAL TO TRIGGER CIERRE_ANUAL_BI;
GRANT INSERT ON COMPROBANTE_DETALLE TO TRIGGER CIERRE_ANUAL_BI;
GRANT INSERT ON COMPROBANTE_ENCABEZADO TO TRIGGER CIERRE_ANUAL_BI;
GRANT SELECT ON CUENTAS TO TRIGGER CIERRE_ANUAL_BI;
GRANT SELECT ON TERCEROS TO TRIGGER CIERRE_ANUAL_BI;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_COMPROBA TO TRIGGER CIERRE_ANUAL_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER CIERRE_ANUAL_BI;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_TERCERO TO TRIGGER CIERRE_ANUAL_BI;
GRANT UPDATE, REFERENCES ON CIERRE_ANUAL TO TRIGGER CIERRE_ANUAL_BU;
GRANT SELECT, UPDATE ON COMPROBANTE_ENCABEZADO TO TRIGGER CIERRE_ANUAL_BU;
GRANT INSERT ON AUDITORIA TO TRIGGER CIERRE_TERCEROS_AD;
GRANT UPDATE, REFERENCES ON CIERRE_TERCEROS TO TRIGGER CIERRE_TERCEROS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CIERRE_TERCEROS_AI;
GRANT UPDATE, REFERENCES ON CIERRE_TERCEROS TO TRIGGER CIERRE_TERCEROS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CIERRE_TERCEROS_AU;
GRANT UPDATE, REFERENCES ON CIERRE_TERCEROS TO TRIGGER CIERRE_TERCEROS_AU;
GRANT UPDATE, REFERENCES ON CIERRE_TERCEROS TO TRIGGER CIERRE_TERCEROS_BD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER CIERRE_TERCEROS_BD;
GRANT SELECT, UPDATE, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER CIERRE_TERCEROS_BD;
GRANT UPDATE, REFERENCES ON CIERRE_TERCEROS TO TRIGGER CIERRE_TERCEROS_BI;
GRANT INSERT ON COMPROBANTE_DETALLE TO TRIGGER CIERRE_TERCEROS_BI;
GRANT INSERT ON COMPROBANTE_ENCABEZADO TO TRIGGER CIERRE_TERCEROS_BI;
GRANT SELECT ON TERCEROS TO TRIGGER CIERRE_TERCEROS_BI;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_COMPROBA TO TRIGGER CIERRE_TERCEROS_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER CIERRE_TERCEROS_BI;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO TO TRIGGER CIERRE_TERCEROS_BI;
GRANT UPDATE, REFERENCES ON CIERRE_TERCEROS TO TRIGGER CIERRE_TERCEROS_BU;
GRANT SELECT, UPDATE ON COMPROBANTE_ENCABEZADO TO TRIGGER CIERRE_TERCEROS_BU;
GRANT INSERT ON AUDITORIA TO TRIGGER CLIENTES_AD;
GRANT UPDATE, REFERENCES ON CLIENTES TO TRIGGER CLIENTES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CLIENTES_AI;
GRANT UPDATE, REFERENCES ON CLIENTES TO TRIGGER CLIENTES_AI;
GRANT INSERT ON CLIENTE_SUCURSALES TO TRIGGER CLIENTES_AI;
GRANT SELECT ON TERCEROS TO TRIGGER CLIENTES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CLIENTES_AU;
GRANT UPDATE, REFERENCES ON CLIENTES TO TRIGGER CLIENTES_AU;
GRANT SELECT, UPDATE ON CLIENTE_SUCURSALES TO TRIGGER CLIENTES_AU;
GRANT SELECT ON TERCEROS TO TRIGGER CLIENTES_AU;
GRANT UPDATE, REFERENCES ON CLIENTES TO TRIGGER CLIENTES_BD;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO TRIGGER CLIENTES_BD;
GRANT UPDATE, REFERENCES ON CLIENTES TO TRIGGER CLIENTES_BI;
GRANT UPDATE, REFERENCES ON CLIENTE_SUCURSALES TO TRIGGER CLIENTE_SUCURSALES_BD;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO TRIGGER CLIENTE_SUCURSALES_BD;
GRANT UPDATE, REFERENCES ON CLIENTE_SUCURSALES TO TRIGGER CLIENTE_SUCURSALES_BU;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO TRIGGER CLIENTE_SUCURSALES_BU;
GRANT INSERT ON AUDITORIA TO TRIGGER COBRADORES_AD;
GRANT UPDATE, REFERENCES ON COBRADORES TO TRIGGER COBRADORES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER COBRADORES_AI;
GRANT UPDATE, REFERENCES ON COBRADORES TO TRIGGER COBRADORES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER COBRADORES_AU;
GRANT UPDATE, REFERENCES ON COBRADORES TO TRIGGER COBRADORES_AU;
GRANT UPDATE, REFERENCES ON COBRADORES TO TRIGGER COBRADORES_BD;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO TRIGGER COBRADORES_BD;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO TRIGGER COBRADORES_BD;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER COBRADORES_BD;
GRANT SELECT, UPDATE, REFERENCES ON COMISION_COBRO TO TRIGGER COMISION_COBRO_BI;
GRANT SELECT, UPDATE, REFERENCES ON COMISION_COBRO TO TRIGGER COMISION_COBRO_BU;
GRANT UPDATE, REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT SELECT ON CUENTAS TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ACTIVO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ARTICULO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CUENTA TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AD;
GRANT UPDATE, REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT SELECT ON CUENTAS TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ACTIVO TO TRIGGER COMPROBANTE_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ARTICULO 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;
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 UPDATE, REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT SELECT ON CUENTAS TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ACTIVO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ARTICULO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CUENTA TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_TERCERO TO TRIGGER COMPROBANTE_DETALLE_AU;
GRANT UPDATE, REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT SELECT ON CUENTAS TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE EXISTE_CENTRO TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE EXISTE_TERCERO TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE VALIDE_CUENTA TO TRIGGER COMPROBANTE_DETALLE_BI;
GRANT SELECT, UPDATE, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_ENCABEZADO_BI;
GRANT SELECT, UPDATE ON PREFIJOS_CONTA TO TRIGGER COMPROBANTE_ENCABEZADO_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER COMPROBANTE_ENCABEZADO_BI;
GRANT EXECUTE ON PROCEDURE DIAS_MES TO TRIGGER COMPROBANTE_ENCABEZADO_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER COMPROBANTE_ENCABEZADO_BI;
GRANT SELECT ON COMPROBANTE_DETALLE TO TRIGGER COMPROBANTE_ENCABEZADO_BU;
GRANT UPDATE, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER COMPROBANTE_ENCABEZADO_BU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER COMPROBANTE_ENCABEZADO_BU;
GRANT UPDATE, REFERENCES ON CONCEPTOS_CUENTAS TO TRIGGER CONCEPTOS_CUENTAS_BI;
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;
GRANT INSERT ON AUDITORIA TO TRIGGER CONCILIACION_ENCABEZADO_AD;
GRANT UPDATE, REFERENCES ON CONCILIACION_ENCABEZADO TO TRIGGER CONCILIACION_ENCABEZADO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CONCILIACION_ENCABEZADO_AI;
GRANT UPDATE, REFERENCES ON CONCILIACION_ENCABEZADO TO TRIGGER CONCILIACION_ENCABEZADO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CONCILIACION_ENCABEZADO_AU;
GRANT UPDATE, REFERENCES ON CONCILIACION_ENCABEZADO TO TRIGGER CONCILIACION_ENCABEZADO_AU;
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;
GRANT INSERT ON AUDITORIA TO TRIGGER CONSIGNA_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER CONSIGNA_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER CONSIGNA_AD;
GRANT UPDATE, REFERENCES ON CONSIGNA TO TRIGGER CONSIGNA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CONSIGNA_AI;
GRANT UPDATE, REFERENCES ON CONSIGNA TO TRIGGER CONSIGNA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CONSIGNA_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER CONSIGNA_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER CONSIGNA_AU;
GRANT UPDATE, REFERENCES ON CONSIGNA TO TRIGGER CONSIGNA_AU;
GRANT SELECT, UPDATE ON CONSIGNA_DETALLE TO TRIGGER CONSIGNA_AU;
GRANT SELECT, UPDATE, REFERENCES ON CONSIGNA TO TRIGGER CONSIGNA_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER CONSIGNA_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER CONSIGNA_BI;
GRANT SELECT ON CONSIGNA TO TRIGGER CONSIGNA_DETALLE_AD;
GRANT UPDATE, REFERENCES ON CONSIGNA_DETALLE TO TRIGGER CONSIGNA_DETALLE_AD;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CONSIGNA_DETALLE_AD;
GRANT SELECT, UPDATE, REFERENCES ON MOVIMIENTO_BANCO TO TRIGGER CONSIGNA_DETALLE_AD;
GRANT SELECT, UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER CONSIGNA_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER CONSIGNA_DETALLE_AD;
GRANT SELECT, REFERENCES ON CONSIGNA TO TRIGGER CONSIGNA_DETALLE_AI;
GRANT UPDATE, REFERENCES ON CONSIGNA_DETALLE TO TRIGGER CONSIGNA_DETALLE_AI;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CONSIGNA_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_BANCO TO TRIGGER CONSIGNA_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER CONSIGNA_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER CONSIGNA_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER CONSIGNA_DETALLE_AI;
GRANT SELECT, REFERENCES ON CONSIGNA TO TRIGGER CONSIGNA_DETALLE_AU;
GRANT UPDATE, REFERENCES ON CONSIGNA_DETALLE TO TRIGGER CONSIGNA_DETALLE_AU;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CONSIGNA_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_BANCO TO TRIGGER CONSIGNA_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER CONSIGNA_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER CONSIGNA_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER CONSIGNA_DETALLE_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER CONSIGNA_TARJETAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER CONSIGNA_TARJETAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER CONSIGNA_TARJETAS_AD;
GRANT UPDATE, REFERENCES ON CONSIGNA_TARJETAS TO TRIGGER CONSIGNA_TARJETAS_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_BANCO TO TRIGGER CONSIGNA_TARJETAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CONSIGNA_TARJETAS_AI;
GRANT UPDATE, REFERENCES ON CONSIGNA_TARJETAS TO TRIGGER CONSIGNA_TARJETAS_AI;
GRANT INSERT ON MOVIMIENTO_BANCO TO TRIGGER CONSIGNA_TARJETAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CONSIGNA_TARJETAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER CONSIGNA_TARJETAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER CONSIGNA_TARJETAS_AU;
GRANT UPDATE, REFERENCES ON CONSIGNA_TARJETAS TO TRIGGER CONSIGNA_TARJETAS_AU;
GRANT SELECT, UPDATE ON CONSIGNA_TARJETAS_DET TO TRIGGER CONSIGNA_TARJETAS_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_BANCO TO TRIGGER CONSIGNA_TARJETAS_AU;
GRANT SELECT, UPDATE, REFERENCES ON CONSIGNA_TARJETAS TO TRIGGER CONSIGNA_TARJETAS_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER CONSIGNA_TARJETAS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER CONSIGNA_TARJETAS_BI;
GRANT UPDATE, REFERENCES ON CONSIGNA_TARJETAS_DET TO TRIGGER CONSIGNA_TARJETAS_DET_AD;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CONSIGNA_TARJETAS_DET_AD;
GRANT SELECT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER CONSIGNA_TARJETAS_DET_AD;
GRANT SELECT ON CONSIGNA_TARJETAS TO TRIGGER CONSIGNA_TARJETAS_DET_AI;
GRANT UPDATE, REFERENCES ON CONSIGNA_TARJETAS_DET TO TRIGGER CONSIGNA_TARJETAS_DET_AI;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CONSIGNA_TARJETAS_DET_AI;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER CONSIGNA_TARJETAS_DET_AI;
GRANT SELECT ON CONSIGNA_TARJETAS TO TRIGGER CONSIGNA_TARJETAS_DET_AU;
GRANT UPDATE, REFERENCES ON CONSIGNA_TARJETAS_DET TO TRIGGER CONSIGNA_TARJETAS_DET_AU;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER CONSIGNA_TARJETAS_DET_AU;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER CONSIGNA_TARJETAS_DET_AU;
GRANT SELECT, UPDATE, REFERENCES ON CONSOLIDADO_NOMINA TO TRIGGER CONSOLIDADO_NOMINA_BI;
GRANT UPDATE, REFERENCES ON CONSOLIDADO_NOMINA_PROV TO TRIGGER CONSOLIDADO_NOMINA_PROV_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER CONSUMOS_AD;
GRANT UPDATE, REFERENCES ON CONSUMOS TO TRIGGER CONSUMOS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CONSUMOS_AI;
GRANT UPDATE, REFERENCES ON CONSUMOS TO TRIGGER CONSUMOS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CONSUMOS_AU;
GRANT UPDATE, REFERENCES ON CONSUMOS TO TRIGGER CONSUMOS_AU;
GRANT SELECT, UPDATE ON CONSUMO_DETALLE TO TRIGGER CONSUMOS_AU;
GRANT SELECT, UPDATE, REFERENCES ON CONSUMOS TO TRIGGER CONSUMOS_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER CONSUMOS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER CONSUMOS_BI;
GRANT UPDATE, REFERENCES ON CONSUMO_DETALLE TO TRIGGER CONSUMO_DETALLE_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER CONSUMO_DETALLE_AD;
GRANT SELECT, REFERENCES ON CONSUMOS TO TRIGGER CONSUMO_DETALLE_AI;
GRANT UPDATE, REFERENCES ON CONSUMO_DETALLE TO TRIGGER CONSUMO_DETALLE_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER CONSUMO_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER CONSUMO_DETALLE_AI;
GRANT SELECT ON CONSUMOS TO TRIGGER CONSUMO_DETALLE_AU;
GRANT UPDATE, REFERENCES ON CONSUMO_DETALLE TO TRIGGER CONSUMO_DETALLE_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER CONSUMO_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER CONSUMO_DETALLE_AU;
GRANT UPDATE, REFERENCES ON CONSUMO_DETALLE TO TRIGGER CONSUMO_DETALLE_BI;
GRANT UPDATE, REFERENCES ON CONTABILIZACION_DET TO TRIGGER CONTABILIZACION_DET_BI;
GRANT SELECT ON CUENTAS TO TRIGGER CONTABILIZACION_DET_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER CONTABILIZACION_DET_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER CONTABIL_ARTICULO_AD;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO TO TRIGGER CONTABIL_ARTICULO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CONTABIL_ARTICULO_AI;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO TO TRIGGER CONTABIL_ARTICULO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CONTABIL_ARTICULO_AU;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO TO TRIGGER CONTABIL_ARTICULO_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER CONTABIL_ARTICULO_N_AD;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO_NIIF TO TRIGGER CONTABIL_ARTICULO_N_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CONTABIL_ARTICULO_N_AI;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO_NIIF TO TRIGGER CONTABIL_ARTICULO_N_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CONTABIL_ARTICULO_N_AU;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO_NIIF TO TRIGGER CONTABIL_ARTICULO_N_AU;
GRANT SELECT, UPDATE, REFERENCES ON COSTOS TO TRIGGER COSTOS_BI;
GRANT SELECT, UPDATE, REFERENCES ON COSTOS_NIIF TO TRIGGER COSTOS_NIIF_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER COTIZACIONES_AD;
GRANT UPDATE, REFERENCES ON COTIZACIONES TO TRIGGER COTIZACIONES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER COTIZACIONES_AI;
GRANT UPDATE, REFERENCES ON COTIZACIONES TO TRIGGER COTIZACIONES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER COTIZACIONES_AU;
GRANT UPDATE, REFERENCES ON COTIZACIONES TO TRIGGER COTIZACIONES_AU;
GRANT SELECT, UPDATE ON COTIZACIONES_DETALLE TO TRIGGER COTIZACIONES_AU;
GRANT SELECT, UPDATE, REFERENCES ON COTIZACIONES TO TRIGGER COTIZACIONES_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER COTIZACIONES_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER COTIZACIONES_BI;
GRANT UPDATE, REFERENCES ON COTIZACIONES_DETALLE TO TRIGGER COTIZACIONES_DETALLE_BI;
GRANT UPDATE, REFERENCES ON COTIZACIONES_PROVEEDOR_DET TO TRIGGER COTIZACIONES_PROVEEDOR_DET_AI;
GRANT SELECT ON COTIZACION_PROVEEDOR TO TRIGGER COTIZACIONES_PROVEEDOR_DET_AI;
GRANT SELECT, INSERT, UPDATE ON PROVEEDOR_ARTICULO TO TRIGGER COTIZACIONES_PROVEEDOR_DET_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER COTIZACIONES_PROVEEDOR_DET_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER COTIZACIONES_PROVEEDOR_DET_AI;
GRANT UPDATE, REFERENCES ON COTIZACIONES_PROVEEDOR_DET TO TRIGGER COTIZACIONES_PROVEEDOR_DET_AU;
GRANT SELECT ON COTIZACION_PROVEEDOR TO TRIGGER COTIZACIONES_PROVEEDOR_DET_AU;
GRANT SELECT, INSERT, UPDATE ON PROVEEDOR_ARTICULO TO TRIGGER COTIZACIONES_PROVEEDOR_DET_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER COTIZACIONES_PROVEEDOR_DET_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER COTIZACIONES_PROVEEDOR_DET_AU;
GRANT UPDATE, REFERENCES ON COTIZACIONES_PROVEEDOR_DET TO TRIGGER COTIZACIONES_PROVEEDOR_DET_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER COTIZACION_PROVEEDOR_AD;
GRANT UPDATE, REFERENCES ON COTIZACION_PROVEEDOR TO TRIGGER COTIZACION_PROVEEDOR_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER COTIZACION_PROVEEDOR_AI;
GRANT UPDATE, REFERENCES ON COTIZACION_PROVEEDOR TO TRIGGER COTIZACION_PROVEEDOR_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER COTIZACION_PROVEEDOR_AU;
GRANT SELECT, UPDATE ON COTIZACIONES_PROVEEDOR_DET TO TRIGGER COTIZACION_PROVEEDOR_AU;
GRANT UPDATE, REFERENCES ON COTIZACION_PROVEEDOR TO TRIGGER COTIZACION_PROVEEDOR_AU;
GRANT SELECT, UPDATE, REFERENCES ON COTIZACION_PROVEEDOR TO TRIGGER COTIZACION_PROVEEDOR_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER COTIZACION_PROVEEDOR_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER COTIZACION_PROVEEDOR_BI;
GRANT UPDATE, REFERENCES ON CUENTAS TO TRIGGER CUENTAS_AI;
GRANT SELECT, INSERT, DELETE, REFERENCES ON SALDOS_INICIALES TO TRIGGER CUENTAS_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER CUENTAS_AI;
GRANT EXECUTE ON PROCEDURE PADRE TO TRIGGER CUENTAS_AI;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO TRIGGER CUENTAS_AI;
GRANT SELECT ON COMPROBANTE_DETALLE TO TRIGGER CUENTAS_BD;
GRANT SELECT, UPDATE, REFERENCES ON CUENTAS TO TRIGGER CUENTAS_BD;
GRANT UPDATE, REFERENCES ON CUENTAS TO TRIGGER CUENTAS_BI;
GRANT EXECUTE ON PROCEDURE VALIDE_PADRE TO TRIGGER CUENTAS_BI;
GRANT UPDATE, REFERENCES ON CUENTAS_NIIF TO TRIGGER CUENTAS_NIIF_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER CUENTAS_NIIF_AI;
GRANT EXECUTE ON PROCEDURE PADRE TO TRIGGER CUENTAS_NIIF_AI;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO TRIGGER CUENTAS_NIIF_AI;
GRANT SELECT ON COMPROBANTE_DETALLE TO TRIGGER CUENTAS_NIIF_BD;
GRANT SELECT, UPDATE, REFERENCES ON CUENTAS_NIIF TO TRIGGER CUENTAS_NIIF_BD;
GRANT UPDATE, REFERENCES ON CUENTAS_NIIF TO TRIGGER CUENTAS_NIIF_BI;
GRANT EXECUTE ON PROCEDURE VALIDE_PADRE TO TRIGGER CUENTAS_NIIF_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER DESENSAMBLES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER DESENSAMBLES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER DESENSAMBLES_AD;
GRANT UPDATE, REFERENCES ON DESENSAMBLES TO TRIGGER DESENSAMBLES_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER DESENSAMBLES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER DESENSAMBLES_AI;
GRANT UPDATE, REFERENCES ON DESENSAMBLES TO TRIGGER DESENSAMBLES_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER DESENSAMBLES_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER DESENSAMBLES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER DESENSAMBLES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER DESENSAMBLES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER DESENSAMBLES_AU;
GRANT UPDATE, REFERENCES ON DESENSAMBLES TO TRIGGER DESENSAMBLES_AU;
GRANT SELECT, UPDATE ON DESENSAMBLES_DETALLE TO TRIGGER DESENSAMBLES_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER DESENSAMBLES_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER DESENSAMBLES_AU;
GRANT SELECT, UPDATE, REFERENCES ON DESENSAMBLES TO TRIGGER DESENSAMBLES_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER DESENSAMBLES_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER DESENSAMBLES_BI;
GRANT UPDATE, REFERENCES ON DESENSAMBLES_DETALLE TO TRIGGER DESENSAMBLES_DETALLE_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER DESENSAMBLES_DETALLE_AD;
GRANT SELECT, REFERENCES ON DESENSAMBLES TO TRIGGER DESENSAMBLES_DETALLE_AI;
GRANT UPDATE, REFERENCES ON DESENSAMBLES_DETALLE TO TRIGGER DESENSAMBLES_DETALLE_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER DESENSAMBLES_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER DESENSAMBLES_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER DESENSAMBLES_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER DESENSAMBLES_DETALLE_AI;
GRANT SELECT, REFERENCES ON DESENSAMBLES TO TRIGGER DESENSAMBLES_DETALLE_AU;
GRANT UPDATE, REFERENCES ON DESENSAMBLES_DETALLE TO TRIGGER DESENSAMBLES_DETALLE_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER DESENSAMBLES_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER DESENSAMBLES_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER DESENSAMBLES_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER DESENSAMBLES_DETALLE_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER DEVOLUCIONES_COMPRAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER DEVOLUCIONES_COMPRAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER DEVOLUCIONES_COMPRAS_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER DEVOLUCIONES_COMPRAS_AD;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_COMPRAS TO TRIGGER DEVOLUCIONES_COMPRAS_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER DEVOLUCIONES_COMPRAS_AD;
GRANT SELECT, DELETE, REFERENCES ON SALDOS_DOC_CXPAGAR TO TRIGGER DEVOLUCIONES_COMPRAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER DEVOLUCIONES_COMPRAS_AI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER DEVOLUCIONES_COMPRAS_AI;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_COMPRAS TO TRIGGER DEVOLUCIONES_COMPRAS_AI;
GRANT INSERT ON MOVIMIENTO_PROVEEDOR TO TRIGGER DEVOLUCIONES_COMPRAS_AI;
GRANT INSERT ON SALDOS_DOC_CXPAGAR TO TRIGGER DEVOLUCIONES_COMPRAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER DEVOLUCIONES_COMPRAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER DEVOLUCIONES_COMPRAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER DEVOLUCIONES_COMPRAS_AU;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER DEVOLUCIONES_COMPRAS_AU;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_COMPRAS TO TRIGGER DEVOLUCIONES_COMPRAS_AU;
GRANT SELECT, UPDATE ON DEVOLUCIONES_COMPRAS_DET TO TRIGGER DEVOLUCIONES_COMPRAS_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER DEVOLUCIONES_COMPRAS_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON SALDOS_DOC_CXPAGAR TO TRIGGER DEVOLUCIONES_COMPRAS_AU;
GRANT SELECT, UPDATE, REFERENCES ON DEVOLUCIONES_COMPRAS TO TRIGGER DEVOLUCIONES_COMPRAS_BI;
GRANT SELECT, UPDATE ON PREFIJOS TO TRIGGER DEVOLUCIONES_COMPRAS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER DEVOLUCIONES_COMPRAS_BI;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AD;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AD;
GRANT SELECT, UPDATE, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AD;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AI;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AI;
GRANT SELECT, UPDATE, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AI;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AU;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AU;
GRANT SELECT, UPDATE, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER DEVOLUCIONES_COMPRAS_DET_AU;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO TRIGGER DEVOLUCIONES_COMPRAS_DET_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER DEVOLUCIONES_VENTAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER DEVOLUCIONES_VENTAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER DEVOLUCIONES_VENTAS_AD;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_VENTAS TO TRIGGER DEVOLUCIONES_VENTAS_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER DEVOLUCIONES_VENTAS_AD;
GRANT SELECT, DELETE ON SALDOS_DOC_CARTERA TO TRIGGER DEVOLUCIONES_VENTAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER DEVOLUCIONES_VENTAS_AI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER DEVOLUCIONES_VENTAS_AI;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_VENTAS TO TRIGGER DEVOLUCIONES_VENTAS_AI;
GRANT INSERT ON MOVIMIENTO_CLIENTES TO TRIGGER DEVOLUCIONES_VENTAS_AI;
GRANT INSERT ON SALDOS_DOC_CARTERA TO TRIGGER DEVOLUCIONES_VENTAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER DEVOLUCIONES_VENTAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER DEVOLUCIONES_VENTAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER DEVOLUCIONES_VENTAS_AU;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER DEVOLUCIONES_VENTAS_AU;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_VENTAS TO TRIGGER DEVOLUCIONES_VENTAS_AU;
GRANT SELECT, UPDATE ON DEVOLUCIONES_VENTAS_DETALLE TO TRIGGER DEVOLUCIONES_VENTAS_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER DEVOLUCIONES_VENTAS_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER DEVOLUCIONES_VENTAS_AU;
GRANT SELECT ON CLIENTES TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT SELECT, UPDATE, REFERENCES ON DEVOLUCIONES_VENTAS TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT SELECT ON FACTURAS TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER DEVOLUCIONES_VENTAS_BI;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AD;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AD;
GRANT SELECT, UPDATE ON FACTURAS_DETALLE TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AD;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI;
GRANT SELECT, UPDATE ON FACTURAS_DETALLE TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AU;
GRANT SELECT, UPDATE ON FACTURAS_DETALLE TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO TRIGGER DEVOLUCIONES_VENTAS_DETALLE_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER DEVOLUCION_CHEQUES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER DEVOLUCION_CHEQUES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER DEVOLUCION_CHEQUES_AD;
GRANT SELECT, UPDATE ON CONSIGNA_DETALLE TO TRIGGER DEVOLUCION_CHEQUES_AD;
GRANT UPDATE, REFERENCES ON DEVOLUCION_CHEQUES TO TRIGGER DEVOLUCION_CHEQUES_AD;
GRANT SELECT, DELETE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER DEVOLUCION_CHEQUES_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_BANCO TO TRIGGER DEVOLUCION_CHEQUES_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_CAJA TO TRIGGER DEVOLUCION_CHEQUES_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER DEVOLUCION_CHEQUES_AD;
GRANT SELECT, DELETE ON SALDOS_DOC_CARTERA TO TRIGGER DEVOLUCION_CHEQUES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER DEVOLUCION_CHEQUES_AI;
GRANT SELECT, UPDATE ON CONSIGNA_DETALLE TO TRIGGER DEVOLUCION_CHEQUES_AI;
GRANT UPDATE, REFERENCES ON DEVOLUCION_CHEQUES TO TRIGGER DEVOLUCION_CHEQUES_AI;
GRANT INSERT ON DOCUMENTOS_PAGO_CAJA TO TRIGGER DEVOLUCION_CHEQUES_AI;
GRANT INSERT ON MOVIMIENTO_BANCO TO TRIGGER DEVOLUCION_CHEQUES_AI;
GRANT INSERT ON MOVIMIENTO_CAJA TO TRIGGER DEVOLUCION_CHEQUES_AI;
GRANT INSERT ON MOVIMIENTO_CLIENTES TO TRIGGER DEVOLUCION_CHEQUES_AI;
GRANT INSERT ON SALDOS_DOC_CARTERA TO TRIGGER DEVOLUCION_CHEQUES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER DEVOLUCION_CHEQUES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER DEVOLUCION_CHEQUES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER DEVOLUCION_CHEQUES_AU;
GRANT SELECT, UPDATE ON CONSIGNA_DETALLE TO TRIGGER DEVOLUCION_CHEQUES_AU;
GRANT UPDATE, REFERENCES ON DEVOLUCION_CHEQUES TO TRIGGER DEVOLUCION_CHEQUES_AU;
GRANT SELECT, INSERT, DELETE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER DEVOLUCION_CHEQUES_AU;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_BANCO TO TRIGGER DEVOLUCION_CHEQUES_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_CAJA TO TRIGGER DEVOLUCION_CHEQUES_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER DEVOLUCION_CHEQUES_AU;
GRANT SELECT, INSERT, DELETE ON SALDOS_DOC_CARTERA TO TRIGGER DEVOLUCION_CHEQUES_AU;
GRANT SELECT ON CLIENTES TO TRIGGER DEVOLUCION_CHEQUES_BI;
GRANT SELECT, UPDATE, REFERENCES ON DEVOLUCION_CHEQUES TO TRIGGER DEVOLUCION_CHEQUES_BI;
GRANT SELECT, UPDATE ON PREFIJOS TO TRIGGER DEVOLUCION_CHEQUES_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER DEVOLUCION_CHEQUES_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER DEVOLUCION_CHEQUES_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER DEVOLUCION_CHEQUES_BI;
GRANT SELECT, UPDATE, REFERENCES ON DOCUMENTOS_IMPORT_EMPLEADO TO TRIGGER DOCUMENTOS_IMPORT_EMPLEADO_BI;
GRANT UPDATE, REFERENCES ON DOCUMENTOS_PAGO_CAJA TO TRIGGER DOCUMENTOS_PAGO_CAJA_BD;
GRANT INSERT ON AUDITORIA TO TRIGGER EGRESOS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER EGRESOS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER EGRESOS_AD;
GRANT UPDATE, REFERENCES ON EGRESOS TO TRIGGER EGRESOS_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_CAJA TO TRIGGER EGRESOS_AD;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER EGRESOS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER EGRESOS_AI;
GRANT UPDATE, REFERENCES ON EGRESOS TO TRIGGER EGRESOS_AI;
GRANT INSERT ON MOVIMIENTO_CAJA TO TRIGGER EGRESOS_AI;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER EGRESOS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER EGRESOS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER EGRESOS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER EGRESOS_AU;
GRANT UPDATE, REFERENCES ON EGRESOS TO TRIGGER EGRESOS_AU;
GRANT SELECT, UPDATE ON EGRESOS_BANCO TO TRIGGER EGRESOS_AU;
GRANT SELECT, UPDATE ON EGRESOS_CAJA TO TRIGGER EGRESOS_AU;
GRANT SELECT, UPDATE ON EGRESOS_DETALLE TO TRIGGER EGRESOS_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_CAJA TO TRIGGER EGRESOS_AU;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER EGRESOS_AU;
GRANT SELECT, DELETE ON CHEQUES TO TRIGGER EGRESOS_BANCO_AD;
GRANT UPDATE, REFERENCES ON EGRESOS_BANCO TO TRIGGER EGRESOS_BANCO_AD;
GRANT SELECT, DELETE ON RETIROS TO TRIGGER EGRESOS_BANCO_AD;
GRANT INSERT ON CHEQUES TO TRIGGER EGRESOS_BANCO_AI;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO TRIGGER EGRESOS_BANCO_AI;
GRANT UPDATE, REFERENCES ON EGRESOS_BANCO TO TRIGGER EGRESOS_BANCO_AI;
GRANT INSERT ON RETIROS TO TRIGGER EGRESOS_BANCO_AI;
GRANT SELECT, INSERT, UPDATE, DELETE ON CHEQUES TO TRIGGER EGRESOS_BANCO_AU;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO TRIGGER EGRESOS_BANCO_AU;
GRANT UPDATE, REFERENCES ON EGRESOS_BANCO TO TRIGGER EGRESOS_BANCO_AU;
GRANT SELECT, INSERT, UPDATE, DELETE ON RETIROS TO TRIGGER EGRESOS_BANCO_AU;
GRANT SELECT, UPDATE, REFERENCES ON EGRESOS TO TRIGGER EGRESOS_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER EGRESOS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER EGRESOS_BI;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER EGRESOS_CAJA_AD;
GRANT SELECT ON EGRESOS TO TRIGGER EGRESOS_CAJA_AD;
GRANT UPDATE, REFERENCES ON EGRESOS_CAJA TO TRIGGER EGRESOS_CAJA_AD;
GRANT SELECT, UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER EGRESOS_CAJA_AD;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER EGRESOS_CAJA_AD;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER EGRESOS_CAJA_AI;
GRANT SELECT, REFERENCES ON EGRESOS TO TRIGGER EGRESOS_CAJA_AI;
GRANT UPDATE, REFERENCES ON EGRESOS_CAJA TO TRIGGER EGRESOS_CAJA_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER EGRESOS_CAJA_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EGRESOS_CAJA_AI;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER EGRESOS_CAJA_AI;
GRANT SELECT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER EGRESOS_CAJA_AU;
GRANT SELECT, REFERENCES ON EGRESOS TO TRIGGER EGRESOS_CAJA_AU;
GRANT UPDATE, REFERENCES ON EGRESOS_CAJA TO TRIGGER EGRESOS_CAJA_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER EGRESOS_CAJA_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EGRESOS_CAJA_AU;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER EGRESOS_CAJA_AU;
GRANT SELECT ON EGRESOS TO TRIGGER EGRESOS_CRUCEC_AD;
GRANT UPDATE, REFERENCES ON EGRESOS_CRUCEC TO TRIGGER EGRESOS_CRUCEC_AD;
GRANT SELECT, UPDATE ON MOVIMIENTO_CLIENTES TO TRIGGER EGRESOS_CRUCEC_AD;
GRANT SELECT, UPDATE ON SALDOS_DOC_CARTERA TO TRIGGER EGRESOS_CRUCEC_AD;
GRANT SELECT ON CLIENTE_SUCURSALES TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT SELECT ON EGRESOS TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT UPDATE, REFERENCES ON EGRESOS_CRUCEC TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_CLIENTES TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT SELECT, INSERT, UPDATE ON SALDOS_DOC_CARTERA TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO TRIGGER EGRESOS_CRUCEC_AI;
GRANT SELECT ON CLIENTE_SUCURSALES TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT SELECT ON EGRESOS TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT UPDATE, REFERENCES ON EGRESOS_CRUCEC TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_CLIENTES TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT SELECT, INSERT, UPDATE ON SALDOS_DOC_CARTERA TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO TRIGGER EGRESOS_CRUCEC_AU;
GRANT UPDATE, REFERENCES ON EGRESOS_CRUCEC TO TRIGGER EGRESOS_CRUCEC_BI;
GRANT SELECT, DELETE ON ANTICIPOS_PROVEEDOR TO TRIGGER EGRESOS_DETALLE_AD;
GRANT SELECT ON EGRESOS TO TRIGGER EGRESOS_DETALLE_AD;
GRANT UPDATE, REFERENCES ON EGRESOS_DETALLE TO TRIGGER EGRESOS_DETALLE_AD;
GRANT SELECT, UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER EGRESOS_DETALLE_AD;
GRANT SELECT, UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER EGRESOS_DETALLE_AD;
GRANT SELECT, UPDATE, REFERENCES ON ANTICIPOS_PROVEEDOR TO TRIGGER EGRESOS_DETALLE_AI;
GRANT SELECT, REFERENCES ON EGRESOS TO TRIGGER EGRESOS_DETALLE_AI;
GRANT UPDATE, REFERENCES ON EGRESOS_DETALLE TO TRIGGER EGRESOS_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_PROVEEDOR TO TRIGGER EGRESOS_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_DOC_CXPAGAR TO TRIGGER EGRESOS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EGRESOS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO TRIGGER EGRESOS_DETALLE_AI;
GRANT SELECT, UPDATE, DELETE, REFERENCES ON ANTICIPOS_PROVEEDOR TO TRIGGER EGRESOS_DETALLE_AU;
GRANT SELECT, REFERENCES ON EGRESOS TO TRIGGER EGRESOS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON EGRESOS_DETALLE TO TRIGGER EGRESOS_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_PROVEEDOR TO TRIGGER EGRESOS_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_DOC_CXPAGAR TO TRIGGER EGRESOS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EGRESOS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO TRIGGER EGRESOS_DETALLE_AU;
GRANT SELECT, REFERENCES ON EGRESOS TO TRIGGER EGRESOS_DETALLE_BI;
GRANT UPDATE, REFERENCES ON EMPLEADOS TO TRIGGER EMPLEADOS_AI;
GRANT INSERT ON PROGRAM_VACACIONES TO TRIGGER EMPLEADOS_AI;
GRANT UPDATE, REFERENCES ON EMPLEADOS TO TRIGGER EMPLEADOS_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER ENSAMBLES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER ENSAMBLES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER ENSAMBLES_AD;
GRANT UPDATE, REFERENCES ON ENSAMBLES TO TRIGGER ENSAMBLES_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER ENSAMBLES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER ENSAMBLES_AI;
GRANT UPDATE, REFERENCES ON ENSAMBLES TO TRIGGER ENSAMBLES_AI;
GRANT SELECT, REFERENCES ON ENSAMBLES_DETALLE TO TRIGGER ENSAMBLES_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER ENSAMBLES_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER ENSAMBLES_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER ENSAMBLES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER ENSAMBLES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER ENSAMBLES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER ENSAMBLES_AU;
GRANT UPDATE, REFERENCES ON ENSAMBLES TO TRIGGER ENSAMBLES_AU;
GRANT SELECT, UPDATE, REFERENCES ON ENSAMBLES_DETALLE TO TRIGGER ENSAMBLES_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER ENSAMBLES_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER ENSAMBLES_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER ENSAMBLES_AU;
GRANT SELECT, UPDATE, REFERENCES ON ENSAMBLES TO TRIGGER ENSAMBLES_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER ENSAMBLES_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER ENSAMBLES_BI;
GRANT UPDATE, REFERENCES ON ENSAMBLES_DETALLE TO TRIGGER ENSAMBLES_DETALLE_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER ENSAMBLES_DETALLE_AD;
GRANT SELECT, REFERENCES ON ENSAMBLES TO TRIGGER ENSAMBLES_DETALLE_AI;
GRANT UPDATE, REFERENCES ON ENSAMBLES_DETALLE TO TRIGGER ENSAMBLES_DETALLE_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER ENSAMBLES_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER ENSAMBLES_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER ENSAMBLES_DETALLE_AI;
GRANT SELECT, REFERENCES ON ENSAMBLES TO TRIGGER ENSAMBLES_DETALLE_AU;
GRANT UPDATE, REFERENCES ON ENSAMBLES_DETALLE TO TRIGGER ENSAMBLES_DETALLE_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER ENSAMBLES_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER ENSAMBLES_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER ENSAMBLES_DETALLE_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER ENTRADAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER ENTRADAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER ENTRADAS_AD;
GRANT UPDATE, REFERENCES ON ENTRADAS TO TRIGGER ENTRADAS_AD;
GRANT SELECT, UPDATE ON ORDENES_INVENTARIO TO TRIGGER ENTRADAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER ENTRADAS_AI;
GRANT UPDATE, REFERENCES ON ENTRADAS TO TRIGGER ENTRADAS_AI;
GRANT SELECT, UPDATE ON ORDENES_INVENTARIO TO TRIGGER ENTRADAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER ENTRADAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER ENTRADAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER ENTRADAS_AU;
GRANT UPDATE, REFERENCES ON ENTRADAS TO TRIGGER ENTRADAS_AU;
GRANT SELECT, UPDATE ON ENTRADAS_DETALLE TO TRIGGER ENTRADAS_AU;
GRANT SELECT, UPDATE ON ORDENES_INVENTARIO TO TRIGGER ENTRADAS_AU;
GRANT SELECT, UPDATE, REFERENCES ON ENTRADAS TO TRIGGER ENTRADAS_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER ENTRADAS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER ENTRADAS_BI;
GRANT UPDATE, REFERENCES ON ENTRADAS_DETALLE TO TRIGGER ENTRADAS_DETALLE_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER ENTRADAS_DETALLE_AD;
GRANT SELECT, REFERENCES ON ENTRADAS TO TRIGGER ENTRADAS_DETALLE_AI;
GRANT UPDATE, REFERENCES ON ENTRADAS_DETALLE TO TRIGGER ENTRADAS_DETALLE_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER ENTRADAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER ENTRADAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER ENTRADAS_DETALLE_AI;
GRANT SELECT, REFERENCES ON ENTRADAS TO TRIGGER ENTRADAS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON ENTRADAS_DETALLE TO TRIGGER ENTRADAS_DETALLE_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER ENTRADAS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER ENTRADAS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER ENTRADAS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON ENTRADAS_DETALLE TO TRIGGER ENTRADAS_DETALLE_BI;
GRANT UPDATE, REFERENCES ON EXISTENCIA TO TRIGGER EXISTENCIA_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EXISTENCIA_BI;
GRANT UPDATE, REFERENCES ON EXISTENCIA TO TRIGGER EXISTENCIA_BU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER EXISTENCIA_BU;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTCOMP_DETALLE_AD;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER FACTCOMP_DETALLE_AD;
GRANT SELECT ON FACTURAS_COMPRA TO TRIGGER FACTCOMP_DETALLE_AD;
GRANT UPDATE, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO TRIGGER FACTCOMP_DETALLE_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER FACTCOMP_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER FACTCOMP_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTCOMP_DETALLE_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT, UPDATE ON COSTOS TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT ON FACTURAS_COMPRA TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT UPDATE, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE, 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 EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTCOMP_DETALLE_AI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT SELECT, UPDATE ON COSTOS TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT UPDATE, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON PROVEEDOR_ARTICULO TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTCOMP_DETALLE_AU;
GRANT UPDATE, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO TRIGGER FACTCOMP_DETALLE_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER FACTURAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER FACTURAS_AD;
GRANT SELECT, DELETE, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER FACTURAS_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTURAS_AD;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO TRIGGER FACTURAS_AD;
GRANT UPDATE, REFERENCES ON FACTURAS TO TRIGGER FACTURAS_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER FACTURAS_AD;
GRANT SELECT, DELETE ON PEDIDOS TO TRIGGER FACTURAS_AD;
GRANT SELECT, DELETE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER FACTURAS_AD;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTURAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER FACTURAS_AI;
GRANT UPDATE, REFERENCES ON FACTURAS TO TRIGGER FACTURAS_AI;
GRANT SELECT ON FACTURAS_DETALLE TO TRIGGER FACTURAS_AI;
GRANT SELECT ON FORMATOS TO TRIGGER FACTURAS_AI;
GRANT INSERT ON MOVIMIENTO_CLIENTES TO TRIGGER FACTURAS_AI;
GRANT INSERT ON PEDIDOS TO TRIGGER FACTURAS_AI;
GRANT SELECT, UPDATE ON PREFIJOS TO TRIGGER FACTURAS_AI;
GRANT INSERT ON SALDOS_DOC_CARTERA TO TRIGGER FACTURAS_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTURAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER FACTURAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER FACTURAS_AU;
GRANT SELECT, DELETE, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER FACTURAS_AU;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTURAS_AU;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO TRIGGER FACTURAS_AU;
GRANT UPDATE, REFERENCES ON FACTURAS TO TRIGGER FACTURAS_AU;
GRANT SELECT, UPDATE ON FACTURAS_DETALLE TO TRIGGER FACTURAS_AU;
GRANT SELECT ON FORMATOS TO TRIGGER FACTURAS_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER FACTURAS_AU;
GRANT SELECT, INSERT, UPDATE ON PEDIDOS TO TRIGGER FACTURAS_AU;
GRANT SELECT, UPDATE ON PREFIJOS TO TRIGGER FACTURAS_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER FACTURAS_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTURAS_AU;
GRANT SELECT ON AUTORIZACIONES TO TRIGGER FACTURAS_BI;
GRANT SELECT ON CLIENTES TO TRIGGER FACTURAS_BI;
GRANT SELECT ON CLIENTE_SUCURSALES TO TRIGGER FACTURAS_BI;
GRANT SELECT ON COMISIONES TO TRIGGER FACTURAS_BI;
GRANT SELECT, UPDATE ON CONFIGURACION TO TRIGGER FACTURAS_BI;
GRANT SELECT, UPDATE, REFERENCES ON FACTURAS TO TRIGGER FACTURAS_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER FACTURAS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER FACTURAS_BI;
GRANT EXECUTE ON PROCEDURE CUPO_DISPONIBLE TO TRIGGER FACTURAS_BI;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO TRIGGER FACTURAS_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTURAS_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER FACTURAS_COMPRA_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER FACTURAS_COMPRA_AD;
GRANT SELECT, DELETE, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER FACTURAS_COMPRA_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTURAS_COMPRA_AD;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO TRIGGER FACTURAS_COMPRA_AD;
GRANT UPDATE, REFERENCES ON FACTURAS_COMPRA TO TRIGGER FACTURAS_COMPRA_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER FACTURAS_COMPRA_AD;
GRANT SELECT, DELETE, REFERENCES ON SALDOS_DOC_CXPAGAR TO TRIGGER FACTURAS_COMPRA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER FACTURAS_COMPRA_AI;
GRANT UPDATE, REFERENCES ON FACTURAS_COMPRA TO TRIGGER FACTURAS_COMPRA_AI;
GRANT INSERT ON MOVIMIENTO_PROVEEDOR TO TRIGGER FACTURAS_COMPRA_AI;
GRANT INSERT ON SALDOS_DOC_CXPAGAR TO TRIGGER FACTURAS_COMPRA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER FACTURAS_COMPRA_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER FACTURAS_COMPRA_AU;
GRANT SELECT, DELETE, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER FACTURAS_COMPRA_AU;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTURAS_COMPRA_AU;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO TRIGGER FACTURAS_COMPRA_AU;
GRANT UPDATE, REFERENCES ON FACTURAS_COMPRA TO TRIGGER FACTURAS_COMPRA_AU;
GRANT SELECT, UPDATE ON FACTURAS_COMPRAS_DETALLE TO TRIGGER FACTURAS_COMPRA_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER FACTURAS_COMPRA_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON SALDOS_DOC_CXPAGAR TO TRIGGER FACTURAS_COMPRA_AU;
GRANT SELECT, UPDATE, REFERENCES ON FACTURAS_COMPRA TO TRIGGER FACTURAS_COMPRA_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER FACTURAS_COMPRA_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER FACTURAS_COMPRA_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER FACTURAS_CONTADO_AI;
GRANT UPDATE, REFERENCES ON FACTURAS_CONTADO TO TRIGGER FACTURAS_CONTADO_AI;
GRANT UPDATE, REFERENCES ON FACTURAS_CONTADO TO TRIGGER FACTURAS_CONTADO_BI;
GRANT SELECT, UPDATE ON PREFIJOS TO TRIGGER FACTURAS_CONTADO_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER FACTURAS_CONTADO_BI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTURAS_DETALLE_AD;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER FACTURAS_DETALLE_AD;
GRANT SELECT ON FACTURAS TO TRIGGER FACTURAS_DETALLE_AD;
GRANT UPDATE, REFERENCES ON FACTURAS_DETALLE TO TRIGGER FACTURAS_DETALLE_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER FACTURAS_DETALLE_AD;
GRANT SELECT ON PEDIDOS TO TRIGGER FACTURAS_DETALLE_AD;
GRANT SELECT, DELETE ON PEDIDOS_DETALLE TO TRIGGER FACTURAS_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTURAS_DETALLE_AD;
GRANT SELECT ON ARTICULO TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON BODEGA TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON CONFIGURACION TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON CONTABILIZACION TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE ON CONTABILIZACION_DET TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON CONTABIL_ARTICULO TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON CUENTAS TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT, REFERENCES ON FACTURAS TO TRIGGER FACTURAS_DETALLE_AI;
GRANT UPDATE, REFERENCES ON FACTURAS_DETALLE TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON INTERFAZ_VENTAS TO TRIGGER FACTURAS_DETALLE_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER FACTURAS_DETALLE_AI;
GRANT INSERT ON PEDIDOS_DETALLE TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON PREFIJOS TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON TARIFA_IVA TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON TERCEROS TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT ON VENDEDORES TO TRIGGER FACTURAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER FACTURAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER FACTURAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO TRIGGER FACTURAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTURAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE REDONDEE TO TRIGGER FACTURAS_DETALLE_AI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER FACTURAS_DETALLE_AU;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER FACTURAS_DETALLE_AU;
GRANT SELECT ON FACTURAS TO TRIGGER FACTURAS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON FACTURAS_DETALLE TO TRIGGER FACTURAS_DETALLE_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER FACTURAS_DETALLE_AU;
GRANT SELECT ON PEDIDOS TO TRIGGER FACTURAS_DETALLE_AU;
GRANT SELECT, INSERT, DELETE ON PEDIDOS_DETALLE TO TRIGGER FACTURAS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER FACTURAS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTURAS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON FACTURAS_DETALLE TO TRIGGER FACTURAS_DETALLE_BI;
GRANT SELECT, REFERENCES ON FACTURAS TO TRIGGER FACTURAS_DETALLE_BU;
GRANT INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER FACTURAS_DETALLE_BU;
GRANT INSERT ON PEDIDOS_DETALLE TO TRIGGER FACTURAS_DETALLE_BU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER FACTURAS_DETALLE_BU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER FACTURAS_DETALLE_BU;
GRANT UPDATE, REFERENCES ON FORMATOS TO TRIGGER FORMATOS_BI;
GRANT UPDATE, REFERENCES ON FORMATO_DATOS TO TRIGGER FORMATO_DATOS_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_BANCOS_AD;
GRANT UPDATE, REFERENCES ON INTERFAZ_BANCOS TO TRIGGER INTERFAZ_BANCOS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_BANCOS_AI;
GRANT UPDATE, REFERENCES ON INTERFAZ_BANCOS TO TRIGGER INTERFAZ_BANCOS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_BANCOS_AU;
GRANT UPDATE, REFERENCES ON INTERFAZ_BANCOS TO TRIGGER INTERFAZ_BANCOS_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_BANCOS_NIIF_AD;
GRANT UPDATE, REFERENCES ON INTERFAZ_BANCOS_NIIF TO TRIGGER INTERFAZ_BANCOS_NIIF_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_BANCOS_NIIF_AI;
GRANT UPDATE, REFERENCES ON INTERFAZ_BANCOS_NIIF TO TRIGGER INTERFAZ_BANCOS_NIIF_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_BANCOS_NIIF_AU;
GRANT UPDATE, REFERENCES ON INTERFAZ_BANCOS_NIIF TO TRIGGER INTERFAZ_BANCOS_NIIF_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_CAJA_AD;
GRANT UPDATE, REFERENCES ON INTERFAZ_CAJA TO TRIGGER INTERFAZ_CAJA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_CAJA_AI;
GRANT UPDATE, REFERENCES ON INTERFAZ_CAJA TO TRIGGER INTERFAZ_CAJA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_CAJA_AU;
GRANT UPDATE, REFERENCES ON INTERFAZ_CAJA TO TRIGGER INTERFAZ_CAJA_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_CARTERA_AD;
GRANT UPDATE, REFERENCES ON INTERFAZ_CARTERA TO TRIGGER INTERFAZ_CARTERA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_CARTERA_AI;
GRANT UPDATE, REFERENCES ON INTERFAZ_CARTERA TO TRIGGER INTERFAZ_CARTERA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_CARTERA_AU;
GRANT UPDATE, REFERENCES ON INTERFAZ_CARTERA TO TRIGGER INTERFAZ_CARTERA_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_COMPRAS_AD;
GRANT UPDATE, REFERENCES ON INTERFAZ_COMPRAS TO TRIGGER INTERFAZ_COMPRAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_COMPRAS_AI;
GRANT UPDATE, REFERENCES ON INTERFAZ_COMPRAS TO TRIGGER INTERFAZ_COMPRAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_COMPRAS_AU;
GRANT UPDATE, REFERENCES ON INTERFAZ_COMPRAS TO TRIGGER INTERFAZ_COMPRAS_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_CXPAGAR_AD;
GRANT UPDATE, REFERENCES ON INTERFAZ_CXPAGAR TO TRIGGER INTERFAZ_CXPAGAR_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_CXPAGAR_AI;
GRANT UPDATE, REFERENCES ON INTERFAZ_CXPAGAR TO TRIGGER INTERFAZ_CXPAGAR_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_CXPAGAR_AU;
GRANT UPDATE, REFERENCES ON INTERFAZ_CXPAGAR TO TRIGGER INTERFAZ_CXPAGAR_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_INVENTARIO_AD;
GRANT UPDATE, REFERENCES ON INTERFAZ_INVENTARIO TO TRIGGER INTERFAZ_INVENTARIO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_INVENTARIO_AI;
GRANT UPDATE, REFERENCES ON INTERFAZ_INVENTARIO TO TRIGGER INTERFAZ_INVENTARIO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_INVENTARIO_AU;
GRANT UPDATE, REFERENCES ON INTERFAZ_INVENTARIO TO TRIGGER INTERFAZ_INVENTARIO_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_INVENTARIO_N_AD;
GRANT UPDATE, REFERENCES ON INTERFAZ_INVENTARIO_NIIF TO TRIGGER INTERFAZ_INVENTARIO_N_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_INVENTARIO_N_AI;
GRANT UPDATE, REFERENCES ON INTERFAZ_INVENTARIO_NIIF TO TRIGGER INTERFAZ_INVENTARIO_N_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_INVENTARIO_N_AU;
GRANT UPDATE, REFERENCES ON INTERFAZ_INVENTARIO_NIIF TO TRIGGER INTERFAZ_INVENTARIO_N_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_VENTAS_AD;
GRANT UPDATE, REFERENCES ON INTERFAZ_VENTAS TO TRIGGER INTERFAZ_VENTAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_VENTAS_AI;
GRANT UPDATE, REFERENCES ON INTERFAZ_VENTAS TO TRIGGER INTERFAZ_VENTAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_VENTAS_AU;
GRANT UPDATE, REFERENCES ON INTERFAZ_VENTAS TO TRIGGER INTERFAZ_VENTAS_AU;
GRANT SELECT, UPDATE ON EMPLEADOS TO TRIGGER LIQUIDACION_AI;
GRANT UPDATE, REFERENCES ON LIQUIDACION TO TRIGGER LIQUIDACION_AI;
GRANT INSERT ON EXISTENCIA_LOTE TO TRIGGER LOTES_AI;
GRANT UPDATE, REFERENCES ON LOTES TO TRIGGER LOTES_AI;
GRANT SELECT, DELETE ON EXISTENCIA_LOTE TO TRIGGER LOTES_BD;
GRANT UPDATE, REFERENCES ON LOTES TO TRIGGER LOTES_BD;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO TRIGGER LOTES_BI;
GRANT SELECT ON ENSAMBLES TO TRIGGER LOTES_BI;
GRANT SELECT ON ENTRADAS_DETALLE TO TRIGGER LOTES_BI;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO TRIGGER LOTES_BI;
GRANT SELECT, UPDATE, REFERENCES ON LOTES TO TRIGGER LOTES_BI;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO TRIGGER LOTES_BI;
GRANT UPDATE, REFERENCES ON LOTES TO TRIGGER LOTES_BU;
GRANT INSERT ON AUDITORIA TO TRIGGER MANIFIESTO_CARGA_AD;
GRANT UPDATE, REFERENCES ON MANIFIESTO_CARGA TO TRIGGER MANIFIESTO_CARGA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER MANIFIESTO_CARGA_AI;
GRANT UPDATE, REFERENCES ON MANIFIESTO_CARGA TO TRIGGER MANIFIESTO_CARGA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER MANIFIESTO_CARGA_AU;
GRANT SELECT, UPDATE ON MANIFIESTOS_CARGA_CONC TO TRIGGER MANIFIESTO_CARGA_AU;
GRANT UPDATE, REFERENCES ON MANIFIESTO_CARGA TO TRIGGER MANIFIESTO_CARGA_AU;
GRANT SELECT, UPDATE ON MANIFIESTO_CARGA_DET TO TRIGGER MANIFIESTO_CARGA_AU;
GRANT SELECT, UPDATE, REFERENCES ON MANIFIESTO_CARGA TO TRIGGER MANIFIESTO_CARGA_BI;
GRANT SELECT, UPDATE ON PREFIJOS TO TRIGGER MANIFIESTO_CARGA_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER MANIFIESTO_CARGA_BI;
GRANT SELECT, UPDATE ON CARGA_REMESA TO TRIGGER MANIFIESTO_CARGA_DET_AD;
GRANT UPDATE, REFERENCES ON MANIFIESTO_CARGA_DET TO TRIGGER MANIFIESTO_CARGA_DET_AD;
GRANT SELECT, UPDATE ON CARGA_REMESA TO TRIGGER MANIFIESTO_CARGA_DET_AI;
GRANT UPDATE, REFERENCES ON MANIFIESTO_CARGA_DET TO TRIGGER MANIFIESTO_CARGA_DET_AI;
GRANT SELECT, UPDATE ON CARGA_REMESA TO TRIGGER MANIFIESTO_CARGA_DET_AU;
GRANT UPDATE, REFERENCES ON MANIFIESTO_CARGA_DET TO TRIGGER MANIFIESTO_CARGA_DET_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER MARCAS_AD;
GRANT UPDATE, REFERENCES ON MARCAS TO TRIGGER MARCAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER MARCAS_AI;
GRANT UPDATE, REFERENCES ON MARCAS TO TRIGGER MARCAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER MARCAS_AU;
GRANT UPDATE, REFERENCES ON MARCAS TO TRIGGER MARCAS_AU;
GRANT SELECT ON ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_AD;
GRANT SELECT, UPDATE, DELETE ON LOTES TO TRIGGER MOVIMIENTO_ARTICULO_AD;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_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 RESTE_EXISTENCIA TO TRIGGER MOVIMIENTO_ARTICULO_AD;
GRANT EXECUTE ON PROCEDURE SUME_EXISTENCIA TO TRIGGER MOVIMIENTO_ARTICULO_AD;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT UPDATE ON EXISTENCIA TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON EXISTENCIA_LOTE TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT SELECT, INSERT, UPDATE ON LOTES TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_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 LEE_CONFIGURACION TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE RESTE_EXISTENCIA TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE SUME_EXISTENCIA TO TRIGGER MOVIMIENTO_ARTICULO_AI;
GRANT SELECT ON ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_BI;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_ARTICULO TO TRIGGER MOVIMIENTO_ARTICULO_BI;
GRANT EXECUTE ON PROCEDURE SELECCIONE_LOTE TO TRIGGER MOVIMIENTO_ARTICULO_BI;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_BANCO TO TRIGGER MOVIMIENTO_BANCO_AD;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_BANCO TO TRIGGER MOVIMIENTO_BANCO_AD;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_BANCO TO TRIGGER MOVIMIENTO_BANCO_AD;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_BANCO TO TRIGGER MOVIMIENTO_BANCO_AI;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_BANCO TO TRIGGER MOVIMIENTO_BANCO_AI;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_BANCO TO TRIGGER MOVIMIENTO_BANCO_AI;
GRANT SELECT, UPDATE, DELETE, REFERENCES ON MOVIMIENTO_BANCO TO TRIGGER MOVIMIENTO_BANCO_AU;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_BANCO TO TRIGGER MOVIMIENTO_BANCO_AU;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_BANCO TO TRIGGER MOVIMIENTO_BANCO_AU;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER MOVIMIENTO_CAJA_AD;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_CAJA TO TRIGGER MOVIMIENTO_CAJA_AD;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_CAJA TO TRIGGER MOVIMIENTO_CAJA_AD;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER MOVIMIENTO_CAJA_AI;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_CAJA TO TRIGGER MOVIMIENTO_CAJA_AI;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_CAJA TO TRIGGER MOVIMIENTO_CAJA_AI;
GRANT SELECT, UPDATE, DELETE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER MOVIMIENTO_CAJA_AU;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_CAJA TO TRIGGER MOVIMIENTO_CAJA_AU;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_CAJA TO TRIGGER MOVIMIENTO_CAJA_AU;
GRANT SELECT ON APLICACION_CLIENTE TO TRIGGER MOVIMIENTO_CLIENTES_AU;
GRANT SELECT, UPDATE, DELETE, REFERENCES ON MOVIMIENTO_CLIENTES TO TRIGGER MOVIMIENTO_CLIENTES_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER MOVIMIENTO_CLIENTES_AU;
GRANT SELECT ON CAJAS TO TRIGGER MOVIMIENTO_CLIENTES_BI;
GRANT SELECT ON DEVOLUCION_CHEQUES TO TRIGGER MOVIMIENTO_CLIENTES_BI;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_CLIENTES TO TRIGGER MOVIMIENTO_CLIENTES_BI;
GRANT SELECT ON PREFIJOS TO TRIGGER MOVIMIENTO_CLIENTES_BI;
GRANT SELECT ON APLICACION_PROVEDOR TO TRIGGER MOVIMIENTO_PROVEEDOR_AU;
GRANT SELECT, UPDATE, DELETE, REFERENCES ON MOVIMIENTO_PROVEEDOR TO TRIGGER MOVIMIENTO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER MOVIMIENTO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE SALDO_PROVEEDOR TO TRIGGER MOVIMIENTO_PROVEEDOR_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER NOMINA_AI;
GRANT UPDATE, REFERENCES ON NOMINA TO TRIGGER NOMINA_AI;
GRANT SELECT, UPDATE, REFERENCES ON NOMINA_COMISIONES TO TRIGGER NOMINA_COMISIONES_BI;
GRANT UPDATE, REFERENCES ON NOMINA_CONCEPTOS_PROV TO TRIGGER NOMINA_CONCEPTOS_PROV_BU;
GRANT SELECT, UPDATE, REFERENCES ON NOMINA_DEPARTAMENTO TO TRIGGER NOMINA_DEPARTAMENTO_BI;
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;
GRANT UPDATE, REFERENCES ON NOMINA_HORASEXT TO TRIGGER NOMINA_HORASEXT_BI;
GRANT UPDATE, REFERENCES ON NOTAS_CLIENTES TO TRIGGER NOTAS_CLIENTES_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_CREDITO_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_CREDITO_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_CREDITO_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_BANCO TO TRIGGER NOTAS_CREDITO_AD;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO TO TRIGGER NOTAS_CREDITO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_CREDITO_AI;
GRANT INSERT ON MOVIMIENTO_BANCO TO TRIGGER NOTAS_CREDITO_AI;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO TO TRIGGER NOTAS_CREDITO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_CREDITO_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_CREDITO_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_CREDITO_AU;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_BANCO TO TRIGGER NOTAS_CREDITO_AU;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO TO TRIGGER NOTAS_CREDITO_AU;
GRANT SELECT, UPDATE, REFERENCES ON NOTAS_CREDITO TO TRIGGER NOTAS_CREDITO_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER NOTAS_CREDITO_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER NOTAS_CREDITO_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_CREDITO_CLIENTES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_CREDITO_CLIENTES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_CREDITO_CLIENTES_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER NOTAS_CREDITO_CLIENTES_AD;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO_CLIENTES TO TRIGGER NOTAS_CREDITO_CLIENTES_AD;
GRANT SELECT, DELETE ON SALDOS_DOC_CARTERA TO TRIGGER NOTAS_CREDITO_CLIENTES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_CREDITO_CLIENTES_AI;
GRANT INSERT ON MOVIMIENTO_CLIENTES TO TRIGGER NOTAS_CREDITO_CLIENTES_AI;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO_CLIENTES TO TRIGGER NOTAS_CREDITO_CLIENTES_AI;
GRANT INSERT ON SALDOS_DOC_CARTERA TO TRIGGER NOTAS_CREDITO_CLIENTES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_CREDITO_CLIENTES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_CREDITO_CLIENTES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_CREDITO_CLIENTES_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER NOTAS_CREDITO_CLIENTES_AU;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO_CLIENTES TO TRIGGER NOTAS_CREDITO_CLIENTES_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER NOTAS_CREDITO_CLIENTES_AU;
GRANT SELECT ON CLIENTES TO TRIGGER NOTAS_CREDITO_CLIENTES_BI;
GRANT SELECT, UPDATE, REFERENCES ON NOTAS_CREDITO_CLIENTES TO TRIGGER NOTAS_CREDITO_CLIENTES_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER NOTAS_CREDITO_CLIENTES_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER NOTAS_CREDITO_CLIENTES_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AD;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AD;
GRANT SELECT, DELETE, REFERENCES ON SALDOS_DOC_CXPAGAR TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AI;
GRANT SELECT, REFERENCES ON EXISTENCIA TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AI;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AI;
GRANT INSERT ON MOVIMIENTO_PROVEEDOR TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AI;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AI;
GRANT INSERT ON SALDOS_DOC_CXPAGAR TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT SELECT, REFERENCES ON EXISTENCIA TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON SALDOS_DOC_CXPAGAR TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO TRIGGER NOTAS_CREDITO_PROVEEDOR_AU;
GRANT SELECT, UPDATE, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO TRIGGER NOTAS_CREDITO_PROVEEDOR_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER NOTAS_CREDITO_PROVEEDOR_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER NOTAS_CREDITO_PROVEEDOR_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_DEBITO_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_DEBITO_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_BANCO TO TRIGGER NOTAS_DEBITO_AD;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO TO TRIGGER NOTAS_DEBITO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_AI;
GRANT INSERT ON MOVIMIENTO_BANCO TO TRIGGER NOTAS_DEBITO_AI;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO TO TRIGGER NOTAS_DEBITO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_DEBITO_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_DEBITO_AU;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_BANCO TO TRIGGER NOTAS_DEBITO_AU;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO TO TRIGGER NOTAS_DEBITO_AU;
GRANT SELECT, UPDATE, REFERENCES ON NOTAS_DEBITO TO TRIGGER NOTAS_DEBITO_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER NOTAS_DEBITO_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER NOTAS_DEBITO_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_CLIENTES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_DEBITO_CLIENTES_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_DEBITO_CLIENTES_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER NOTAS_DEBITO_CLIENTES_AD;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO_CLIENTES TO TRIGGER NOTAS_DEBITO_CLIENTES_AD;
GRANT SELECT, DELETE ON SALDOS_DOC_CARTERA TO TRIGGER NOTAS_DEBITO_CLIENTES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_CLIENTES_AI;
GRANT INSERT ON MOVIMIENTO_CLIENTES TO TRIGGER NOTAS_DEBITO_CLIENTES_AI;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO_CLIENTES TO TRIGGER NOTAS_DEBITO_CLIENTES_AI;
GRANT INSERT ON SALDOS_DOC_CARTERA TO TRIGGER NOTAS_DEBITO_CLIENTES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_CLIENTES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_DEBITO_CLIENTES_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_DEBITO_CLIENTES_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_CLIENTES TO TRIGGER NOTAS_DEBITO_CLIENTES_AU;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO_CLIENTES TO TRIGGER NOTAS_DEBITO_CLIENTES_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER NOTAS_DEBITO_CLIENTES_AU;
GRANT SELECT ON CLIENTES TO TRIGGER NOTAS_DEBITO_CLIENTES_BI;
GRANT SELECT, UPDATE, REFERENCES ON NOTAS_DEBITO_CLIENTES TO TRIGGER NOTAS_DEBITO_CLIENTES_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER NOTAS_DEBITO_CLIENTES_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER NOTAS_DEBITO_CLIENTES_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT SELECT, DELETE ON SALDOS_DOC_CXPAGAR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT SELECT ON EXISTENCIA TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT SELECT, INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT INSERT ON MOVIMIENTO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
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 EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT ON EXISTENCIA TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT, INSERT, DELETE ON SALDOS_DOC_CXPAGAR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO TRIGGER NOTAS_DEBITO_PROVEEDOR_AU;
GRANT SELECT, UPDATE, REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO TRIGGER NOTAS_DEBITO_PROVEEDOR_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER NOTAS_DEBITO_PROVEEDOR_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER NOTAS_DEBITO_PROVEEDOR_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER ORDENES_COMPRA_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER ORDENES_COMPRA_AD;
GRANT UPDATE, REFERENCES ON ORDENES_COMPRA TO TRIGGER ORDENES_COMPRA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER ORDENES_COMPRA_AI;
GRANT UPDATE, REFERENCES ON ORDENES_COMPRA TO TRIGGER ORDENES_COMPRA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER ORDENES_COMPRA_AU;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER ORDENES_COMPRA_AU;
GRANT UPDATE, REFERENCES ON ORDENES_COMPRA TO TRIGGER ORDENES_COMPRA_AU;
GRANT SELECT, UPDATE ON ORDENES_COMPRA_DETALLE TO TRIGGER ORDENES_COMPRA_AU;
GRANT SELECT, UPDATE, REFERENCES ON ORDENES_COMPRA TO TRIGGER ORDENES_COMPRA_BI;
GRANT SELECT, UPDATE ON PREFIJOS TO TRIGGER ORDENES_COMPRA_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER ORDENES_COMPRA_BI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER ORDENES_COMPRA_DETALLE_AD;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER ORDENES_COMPRA_DETALLE_AD;
GRANT SELECT ON ORDENES_COMPRA TO TRIGGER ORDENES_COMPRA_DETALLE_AD;
GRANT UPDATE, REFERENCES ON ORDENES_COMPRA_DETALLE TO TRIGGER ORDENES_COMPRA_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER ORDENES_COMPRA_DETALLE_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER ORDENES_COMPRA_DETALLE_AI;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER ORDENES_COMPRA_DETALLE_AI;
GRANT SELECT ON ORDENES_COMPRA TO TRIGGER ORDENES_COMPRA_DETALLE_AI;
GRANT UPDATE, REFERENCES ON ORDENES_COMPRA_DETALLE TO TRIGGER ORDENES_COMPRA_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE ON PROVEEDOR_ARTICULO TO TRIGGER ORDENES_COMPRA_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER ORDENES_COMPRA_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER ORDENES_COMPRA_DETALLE_AI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER ORDENES_COMPRA_DETALLE_AU;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER ORDENES_COMPRA_DETALLE_AU;
GRANT SELECT ON ORDENES_COMPRA TO TRIGGER ORDENES_COMPRA_DETALLE_AU;
GRANT UPDATE, REFERENCES ON ORDENES_COMPRA_DETALLE TO TRIGGER ORDENES_COMPRA_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE ON PROVEEDOR_ARTICULO TO TRIGGER ORDENES_COMPRA_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER ORDENES_COMPRA_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER ORDENES_COMPRA_DETALLE_AU;
GRANT UPDATE, REFERENCES ON ORDENES_COMPRA_DETALLE TO TRIGGER ORDENES_COMPRA_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER ORDENES_COMPRA_DETALLE_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER ORDENES_INVENTARIO_AD;
GRANT UPDATE, REFERENCES ON ORDENES_INVENTARIO TO TRIGGER ORDENES_INVENTARIO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER ORDENES_INVENTARIO_AI;
GRANT UPDATE, REFERENCES ON ORDENES_INVENTARIO TO TRIGGER ORDENES_INVENTARIO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER ORDENES_INVENTARIO_AU;
GRANT UPDATE, REFERENCES ON ORDENES_INVENTARIO TO TRIGGER ORDENES_INVENTARIO_AU;
GRANT SELECT, UPDATE, REFERENCES ON ORDENES_INVENTARIO TO TRIGGER ORDENES_INVENTARIO_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER ORDENES_INVENTARIO_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER ORDENES_INVENTARIO_BI;
GRANT UPDATE, REFERENCES ON ORDENINVENTARIO_DETALLE TO TRIGGER ORDENINVENTARIO_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER ORDENINVENTARIO_DETALLE_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER ORDEN_EMBARQUE_AI;
GRANT INSERT ON MOVIMIENTO_PROVEEDOR TO TRIGGER ORDEN_EMBARQUE_AI;
GRANT UPDATE, REFERENCES ON ORDEN_EMBARQUE TO TRIGGER ORDEN_EMBARQUE_AI;
GRANT INSERT ON SALDOS_DOC_CXPAGAR TO TRIGGER ORDEN_EMBARQUE_AI;
GRANT UPDATE, REFERENCES ON ORDEN_EMBARQUE TO TRIGGER ORDEN_EMBARQUE_BI;
GRANT SELECT ON PROVEEDORES TO TRIGGER ORDEN_EMBARQUE_BI;
GRANT SELECT ON TERCEROS TO TRIGGER ORDEN_EMBARQUE_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER PEDIDOS_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER PEDIDOS_AD;
GRANT UPDATE, REFERENCES ON PEDIDOS TO TRIGGER PEDIDOS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER PEDIDOS_AI;
GRANT UPDATE, REFERENCES ON PEDIDOS TO TRIGGER PEDIDOS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER PEDIDOS_AU;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER PEDIDOS_AU;
GRANT UPDATE, REFERENCES ON PEDIDOS TO TRIGGER PEDIDOS_AU;
GRANT SELECT, UPDATE ON PEDIDOS_DETALLE TO TRIGGER PEDIDOS_AU;
GRANT SELECT, UPDATE, REFERENCES ON PEDIDOS TO TRIGGER PEDIDOS_BI;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER PEDIDOS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER PEDIDOS_BI;
GRANT EXECUTE ON PROCEDURE CUPO_DISPONIBLE TO TRIGGER PEDIDOS_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER PEDIDOS_BI;
GRANT UPDATE ON PEDIDOS_DETALLE TO TRIGGER PEDIDOS_BU;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER PEDIDOS_DETALLE_AI;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER PEDIDOS_DETALLE_AI;
GRANT SELECT ON PEDIDOS TO TRIGGER PEDIDOS_DETALLE_AI;
GRANT UPDATE, REFERENCES ON PEDIDOS_DETALLE TO TRIGGER PEDIDOS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER PEDIDOS_DETALLE_AI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER PEDIDOS_DETALLE_AU;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER PEDIDOS_DETALLE_AU;
GRANT SELECT ON PEDIDOS TO TRIGGER PEDIDOS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON PEDIDOS_DETALLE TO TRIGGER PEDIDOS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER PEDIDOS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON PEDIDOS_DETALLE TO TRIGGER PEDIDOS_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER PEDIDOS_DETALLE_BI;
GRANT SELECT, UPDATE, REFERENCES ON PERIODO_PAGO_NOMBRE TO TRIGGER PERIODO_PAGO_NOMBRE_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER PLANILLA_PASAJEROS_AD;
GRANT UPDATE, REFERENCES ON PLANILLA_PASAJEROS TO TRIGGER PLANILLA_PASAJEROS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER PLANILLA_PASAJEROS_AI;
GRANT UPDATE, REFERENCES ON PLANILLA_PASAJEROS TO TRIGGER PLANILLA_PASAJEROS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER PLANILLA_PASAJEROS_AU;
GRANT UPDATE, REFERENCES ON PLANILLA_PASAJEROS TO TRIGGER PLANILLA_PASAJEROS_AU;
GRANT SELECT, UPDATE ON PLANILLA_PASAJEROS_CON TO TRIGGER PLANILLA_PASAJEROS_AU;
GRANT SELECT, UPDATE ON PLANILLA_PASAJEROS_DET TO TRIGGER PLANILLA_PASAJEROS_AU;
GRANT SELECT, UPDATE ON PLANILLA_PASAJEROS_REM TO TRIGGER PLANILLA_PASAJEROS_AU;
GRANT SELECT, UPDATE, REFERENCES ON PLANILLA_PASAJEROS TO TRIGGER PLANILLA_PASAJEROS_BI;
GRANT SELECT, UPDATE ON PREFIJOS TO TRIGGER PLANILLA_PASAJEROS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER PLANILLA_PASAJEROS_BI;
GRANT UPDATE, REFERENCES ON PLANILLA_PASAJEROS_DET TO TRIGGER PLANILLA_PASAJEROS_DET_AD;
GRANT SELECT, UPDATE ON TIQUETE_PASAJERO TO TRIGGER PLANILLA_PASAJEROS_DET_AD;
GRANT UPDATE, REFERENCES ON PLANILLA_PASAJEROS_DET TO TRIGGER PLANILLA_PASAJEROS_DET_AI;
GRANT SELECT, UPDATE ON TIQUETE_PASAJERO TO TRIGGER PLANILLA_PASAJEROS_DET_AI;
GRANT UPDATE, REFERENCES ON PLANILLA_PASAJEROS_DET TO TRIGGER PLANILLA_PASAJEROS_DET_AU;
GRANT SELECT, UPDATE ON TIQUETE_PASAJERO TO TRIGGER PLANILLA_PASAJEROS_DET_AU;
GRANT SELECT, UPDATE ON CARGA_REMESA TO TRIGGER PLANILLA_PASAJEROS_REM_AD;
GRANT UPDATE, REFERENCES ON PLANILLA_PASAJEROS_REM TO TRIGGER PLANILLA_PASAJEROS_REM_AD;
GRANT SELECT, UPDATE ON CARGA_REMESA TO TRIGGER PLANILLA_PASAJEROS_REM_AI;
GRANT UPDATE, REFERENCES ON PLANILLA_PASAJEROS_REM TO TRIGGER PLANILLA_PASAJEROS_REM_AI;
GRANT SELECT, UPDATE ON CARGA_REMESA TO TRIGGER PLANILLA_PASAJEROS_REM_AU;
GRANT UPDATE, REFERENCES ON PLANILLA_PASAJEROS_REM TO TRIGGER PLANILLA_PASAJEROS_REM_AU;
GRANT SELECT ON CUENTAS TO TRIGGER PLANTILLA_DETALLE_BI;
GRANT UPDATE, REFERENCES ON PLANTILLA_DETALLE TO TRIGGER PLANTILLA_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE EXISTE_CENTRO TO TRIGGER PLANTILLA_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE EXISTE_TERCERO TO TRIGGER PLANTILLA_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER PLANTILLA_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE VALIDE_CUENTA TO TRIGGER PLANTILLA_DETALLE_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER PLANTILLA_ENCABEZADO_AD;
GRANT UPDATE, REFERENCES ON PLANTILLA_ENCABEZADO TO TRIGGER PLANTILLA_ENCABEZADO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER PLANTILLA_ENCABEZADO_AI;
GRANT UPDATE, REFERENCES ON PLANTILLA_ENCABEZADO TO TRIGGER PLANTILLA_ENCABEZADO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER PLANTILLA_ENCABEZADO_AU;
GRANT UPDATE, REFERENCES ON PLANTILLA_ENCABEZADO TO TRIGGER PLANTILLA_ENCABEZADO_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER PRECIOS_ARTICULO_AD;
GRANT UPDATE, REFERENCES ON PRECIOS_ARTICULO TO TRIGGER PRECIOS_ARTICULO_AD;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER PRECIOS_ARTICULO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER PRECIOS_ARTICULO_AI;
GRANT SELECT, REFERENCES ON LISTA_PRECIOS TO TRIGGER PRECIOS_ARTICULO_AI;
GRANT UPDATE, REFERENCES ON PRECIOS_ARTICULO TO TRIGGER PRECIOS_ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER PRECIOS_ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER PRECIOS_ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER PRECIOS_ARTICULO_AI;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO TRIGGER PRECIOS_ARTICULO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER PRECIOS_ARTICULO_AU;
GRANT UPDATE, REFERENCES ON PRECIOS_ARTICULO TO TRIGGER PRECIOS_ARTICULO_AU;
GRANT SELECT ON ARTICULO TO TRIGGER PRECIOS_ARTICULO_BI;
GRANT SELECT ON LISTA_PRECIOS TO TRIGGER PRECIOS_ARTICULO_BI;
GRANT UPDATE, REFERENCES ON PRECIOS_ARTICULO TO TRIGGER PRECIOS_ARTICULO_BI;
GRANT SELECT ON TARIFA_IVA TO TRIGGER PRECIOS_ARTICULO_BI;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER PRECIOS_ARTICULO_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER PRECIOS_ARTICULO_BI;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO TRIGGER PRECIOS_ARTICULO_BI;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER PRECIOS_ARTICULO_BU;
GRANT SELECT, REFERENCES ON LISTA_PRECIOS TO TRIGGER PRECIOS_ARTICULO_BU;
GRANT UPDATE, REFERENCES ON PRECIOS_ARTICULO TO TRIGGER PRECIOS_ARTICULO_BU;
GRANT SELECT ON TARIFA_IVA TO TRIGGER PRECIOS_ARTICULO_BU;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER PRECIOS_ARTICULO_BU;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO TRIGGER PRECIOS_ARTICULO_BU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER PRECIOS_ARTICULO_BU;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO TRIGGER PRECIOS_ARTICULO_BU;
GRANT INSERT ON AUDITORIA TO TRIGGER PREFIJOS_AD;
GRANT UPDATE, REFERENCES ON PREFIJOS TO TRIGGER PREFIJOS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER PREFIJOS_AI;
GRANT UPDATE, REFERENCES ON PREFIJOS TO TRIGGER PREFIJOS_AI;
GRANT SELECT, INSERT ON PREFIJOS_CONTA TO TRIGGER PREFIJOS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER PREFIJOS_AU;
GRANT UPDATE, REFERENCES ON PREFIJOS TO TRIGGER PREFIJOS_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER PREFIJOS_BANCOS_AD;
GRANT UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER PREFIJOS_BANCOS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER PREFIJOS_BANCOS_AI;
GRANT UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER PREFIJOS_BANCOS_AI;
GRANT SELECT, INSERT ON PREFIJOS_CONTA TO TRIGGER PREFIJOS_BANCOS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER PREFIJOS_BANCOS_AU;
GRANT UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER PREFIJOS_BANCOS_AU;
GRANT UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER PREFIJOS_BANCOS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER PREFIJOS_BANCOS_BI;
GRANT UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER PREFIJOS_BANCOS_BU;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER PREFIJOS_BANCOS_BU;
GRANT UPDATE, REFERENCES ON PREFIJOS TO TRIGGER PREFIJOS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER PREFIJOS_BI;
GRANT UPDATE, REFERENCES ON PREFIJOS TO TRIGGER PREFIJOS_BU;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER PREFIJOS_BU;
GRANT INSERT ON AUDITORIA TO TRIGGER PREFIJOS_CONTA_AD;
GRANT UPDATE, REFERENCES ON PREFIJOS_CONTA TO TRIGGER PREFIJOS_CONTA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER PREFIJOS_CONTA_AI;
GRANT UPDATE, REFERENCES ON PREFIJOS_CONTA TO TRIGGER PREFIJOS_CONTA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER PREFIJOS_CONTA_AU;
GRANT UPDATE, REFERENCES ON PREFIJOS_CONTA TO TRIGGER PREFIJOS_CONTA_AU;
GRANT UPDATE, REFERENCES ON PREFIJOS_CONTA TO TRIGGER PREFIJOS_CONTA_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER PREFIJOS_CONTA_BI;
GRANT UPDATE, REFERENCES ON PREFIJOS_CONTA TO TRIGGER PREFIJOS_CONTA_BU;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER PREFIJOS_CONTA_BU;
GRANT UPDATE, REFERENCES ON PRESTAMO_CUOTAS TO TRIGGER PRESTAMO_CUOTAS_BI;
GRANT SELECT, UPDATE, REFERENCES ON PRESUPUESTO TO TRIGGER PRESUPUESTO_AD;
GRANT EXECUTE ON PROCEDURE PADRE TO TRIGGER PRESUPUESTO_AD;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON PRESUPUESTO TO TRIGGER PRESUPUESTO_AI;
GRANT EXECUTE ON PROCEDURE PADRE TO TRIGGER PRESUPUESTO_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON PRESUPUESTO TO TRIGGER PRESUPUESTO_AU;
GRANT EXECUTE ON PROCEDURE PADRE TO TRIGGER PRESUPUESTO_AU;
GRANT SELECT, UPDATE, REFERENCES ON PROGRAM_VACACIONES TO TRIGGER PROGRAM_VACACIONES_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER PROVEEDORES_AD;
GRANT UPDATE, REFERENCES ON PROVEEDORES TO TRIGGER PROVEEDORES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER PROVEEDORES_AI;
GRANT UPDATE, REFERENCES ON PROVEEDORES TO TRIGGER PROVEEDORES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER PROVEEDORES_AU;
GRANT UPDATE, REFERENCES ON PROVEEDORES TO TRIGGER PROVEEDORES_AU;
GRANT SELECT ON MOVIMIENTO_PROVEEDOR TO TRIGGER PROVEEDORES_BD;
GRANT UPDATE, REFERENCES ON PROVEEDORES TO TRIGGER PROVEEDORES_BD;
GRANT SELECT, DELETE ON PROVEEDOR_ARTICULO TO TRIGGER PROVEEDORES_BD;
GRANT SELECT ON GRUPOS_PROVEEDORES TO TRIGGER PROVEEDORES_BI;
GRANT UPDATE, REFERENCES ON PROVEEDORES TO TRIGGER PROVEEDORES_BI;
GRANT SELECT, UPDATE, REFERENCES ON PUNTOS_VENDEDOR TO TRIGGER PUNTOS_VENDEDOR_BI;
GRANT DELETE ON PUNTOS_VENDEDOR TO TRIGGER PUNTOS_VEND_REDENCION_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 UPDATE, REFERENCES ON PUNTO_VENTA TO TRIGGER PUNTO_VENTA_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER RECIBOS_CAJA_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER RECIBOS_CAJA_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER RECIBOS_CAJA_AD;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_AD;
GRANT SELECT, UPDATE ON RECIBO_PROVISIONAL TO TRIGGER RECIBOS_CAJA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER RECIBOS_CAJA_AI;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_AI;
GRANT SELECT, UPDATE ON RECIBO_PROVISIONAL TO TRIGGER RECIBOS_CAJA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER RECIBOS_CAJA_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER RECIBOS_CAJA_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER RECIBOS_CAJA_AU;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_AU;
GRANT SELECT, UPDATE ON RECIBOS_CAJA_DETALLE TO TRIGGER RECIBOS_CAJA_AU;
GRANT SELECT, UPDATE ON RECIBOS_CAJA_PAGO TO TRIGGER RECIBOS_CAJA_AU;
GRANT SELECT, UPDATE ON RECIBO_PROVISIONAL TO TRIGGER RECIBOS_CAJA_AU;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER RECIBOS_CAJA_BI;
GRANT SELECT, UPDATE, REFERENCES ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER RECIBOS_CAJA_BI;
GRANT SELECT, UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER RECIBOS_CAJA_CRUCEC_AD;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_CRUCEC_AD;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_CRUCEC TO TRIGGER RECIBOS_CAJA_CRUCEC_AD;
GRANT SELECT, UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER RECIBOS_CAJA_CRUCEC_AD;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_CRUCEC TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT SELECT, INSERT, UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO TRIGGER RECIBOS_CAJA_CRUCEC_AI;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_PROVEEDOR TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_CRUCEC TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT SELECT, INSERT, UPDATE ON SALDOS_DOC_CXPAGAR TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO TRIGGER RECIBOS_CAJA_CRUCEC_AU;
GRANT SELECT, DELETE ON ANTICIPOS_CLIENTE TO TRIGGER RECIBOS_CAJA_DETALLE_AD;
GRANT SELECT, UPDATE ON MOVIMIENTO_CLIENTES TO TRIGGER RECIBOS_CAJA_DETALLE_AD;
GRANT DELETE ON PUNTOS_VENDEDOR TO TRIGGER RECIBOS_CAJA_DETALLE_AD;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_DETALLE_AD;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_DETALLE TO TRIGGER RECIBOS_CAJA_DETALLE_AD;
GRANT SELECT, UPDATE ON SALDOS_DOC_CARTERA TO TRIGGER RECIBOS_CAJA_DETALLE_AD;
GRANT SELECT, UPDATE, REFERENCES ON ANTICIPOS_CLIENTE TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT SELECT ON COMISIONES_PUNTOS TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CLIENTES TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT INSERT ON PUNTOS_VENDEDOR TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_DETALLE TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO TRIGGER RECIBOS_CAJA_DETALLE_AI;
GRANT SELECT, UPDATE, DELETE, REFERENCES ON ANTICIPOS_CLIENTE TO TRIGGER RECIBOS_CAJA_DETALLE_AU;
GRANT SELECT ON COMISIONES_PUNTOS TO TRIGGER RECIBOS_CAJA_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CLIENTES TO TRIGGER RECIBOS_CAJA_DETALLE_AU;
GRANT INSERT, DELETE ON PUNTOS_VENDEDOR TO TRIGGER RECIBOS_CAJA_DETALLE_AU;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_DETALLE_AU;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_DETALLE TO TRIGGER RECIBOS_CAJA_DETALLE_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_DOC_CARTERA TO TRIGGER RECIBOS_CAJA_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER RECIBOS_CAJA_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO TRIGGER RECIBOS_CAJA_DETALLE_AU;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_DETALLE_BI;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_DETALLE TO TRIGGER RECIBOS_CAJA_DETALLE_BI;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_DETALLE TO TRIGGER RECIBOS_CAJA_DETALLE_BU;
GRANT SELECT, DELETE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER RECIBOS_CAJA_PAGO_AD;
GRANT SELECT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER RECIBOS_CAJA_PAGO_AD;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_PAGO_AD;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_PAGO TO TRIGGER RECIBOS_CAJA_PAGO_AD;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER RECIBOS_CAJA_PAGO_AD;
GRANT INSERT ON DOCUMENTOS_PAGO_CAJA TO TRIGGER RECIBOS_CAJA_PAGO_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER RECIBOS_CAJA_PAGO_AI;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_PAGO_AI;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_PAGO TO TRIGGER RECIBOS_CAJA_PAGO_AI;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER RECIBOS_CAJA_PAGO_AI;
GRANT SELECT, INSERT, DELETE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER RECIBOS_CAJA_PAGO_AU;
GRANT SELECT, INSERT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER RECIBOS_CAJA_PAGO_AU;
GRANT SELECT ON RECIBOS_CAJA TO TRIGGER RECIBOS_CAJA_PAGO_AU;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_PAGO TO TRIGGER RECIBOS_CAJA_PAGO_AU;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER RECIBOS_CAJA_PAGO_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER RECIBO_PROVISIONAL_AD;
GRANT UPDATE, REFERENCES ON RECIBO_PROVISIONAL TO TRIGGER RECIBO_PROVISIONAL_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER RECIBO_PROVISIONAL_AI;
GRANT UPDATE, REFERENCES ON RECIBO_PROVISIONAL TO TRIGGER RECIBO_PROVISIONAL_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER RECIBO_PROVISIONAL_AU;
GRANT UPDATE, REFERENCES ON RECIBO_PROVISIONAL TO TRIGGER RECIBO_PROVISIONAL_AU;
GRANT SELECT, UPDATE ON RECIBO_PROVISIONAL_DETALLE TO TRIGGER RECIBO_PROVISIONAL_AU;
GRANT SELECT, UPDATE ON RECIBO_PROVISIONAL_PAGO TO TRIGGER RECIBO_PROVISIONAL_AU;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER RECIBO_PROVISIONAL_BI;
GRANT SELECT, UPDATE, REFERENCES ON RECIBO_PROVISIONAL TO TRIGGER RECIBO_PROVISIONAL_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER RECIBO_PROVISIONAL_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER REMISIONES_VENTA_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER REMISIONES_VENTA_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER REMISIONES_VENTA_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER REMISIONES_VENTA_AD;
GRANT UPDATE, REFERENCES ON REMISIONES_VENTA TO TRIGGER REMISIONES_VENTA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER REMISIONES_VENTA_AI;
GRANT UPDATE, REFERENCES ON REMISIONES_VENTA TO TRIGGER REMISIONES_VENTA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER REMISIONES_VENTA_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER REMISIONES_VENTA_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER REMISIONES_VENTA_AU;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER REMISIONES_VENTA_AU;
GRANT UPDATE, REFERENCES ON REMISIONES_VENTA TO TRIGGER REMISIONES_VENTA_AU;
GRANT SELECT, UPDATE ON REMISIONES_VENTA_DETALLE TO TRIGGER REMISIONES_VENTA_AU;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER REMISIONES_VENTA_BI;
GRANT SELECT, UPDATE, REFERENCES ON REMISIONES_VENTA TO TRIGGER REMISIONES_VENTA_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER REMISIONES_VENTA_BI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER REMISIONES_VENTA_DETALLE_AD;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER REMISIONES_VENTA_DETALLE_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER REMISIONES_VENTA_DETALLE_AD;
GRANT SELECT ON REMISIONES_VENTA TO TRIGGER REMISIONES_VENTA_DETALLE_AD;
GRANT UPDATE, REFERENCES ON REMISIONES_VENTA_DETALLE TO TRIGGER REMISIONES_VENTA_DETALLE_AD;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER REMISIONES_VENTA_DETALLE_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER REMISIONES_VENTA_DETALLE_AI;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER REMISIONES_VENTA_DETALLE_AI;
GRANT SELECT, INSERT, REFERENCES ON MOVIMIENTO_ARTICULO TO TRIGGER REMISIONES_VENTA_DETALLE_AI;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO TRIGGER REMISIONES_VENTA_DETALLE_AI;
GRANT UPDATE, REFERENCES ON REMISIONES_VENTA_DETALLE TO TRIGGER REMISIONES_VENTA_DETALLE_AI;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DOCRELA TO TRIGGER REMISIONES_VENTA_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER REMISIONES_VENTA_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER REMISIONES_VENTA_DETALLE_AI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER REMISIONES_VENTA_DETALLE_AU;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER REMISIONES_VENTA_DETALLE_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON MOVIMIENTO_ARTICULO TO TRIGGER REMISIONES_VENTA_DETALLE_AU;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO TRIGGER REMISIONES_VENTA_DETALLE_AU;
GRANT UPDATE, REFERENCES ON REMISIONES_VENTA_DETALLE TO TRIGGER REMISIONES_VENTA_DETALLE_AU;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DOCRELA TO TRIGGER REMISIONES_VENTA_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER REMISIONES_VENTA_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER REMISIONES_VENTA_DETALLE_AU;
GRANT UPDATE, REFERENCES ON REMISIONES_VENTA_DETALLE TO TRIGGER REMISIONES_VENTA_DETALLE_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER REMISION_PROVEEDOR_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER REMISION_PROVEEDOR_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER REMISION_PROVEEDOR_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER REMISION_PROVEEDOR_AD;
GRANT UPDATE, REFERENCES ON REMISION_PROVEEDOR TO TRIGGER REMISION_PROVEEDOR_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER REMISION_PROVEEDOR_AI;
GRANT UPDATE, REFERENCES ON REMISION_PROVEEDOR TO TRIGGER REMISION_PROVEEDOR_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER REMISION_PROVEEDOR_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER REMISION_PROVEEDOR_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER REMISION_PROVEEDOR_AU;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER REMISION_PROVEEDOR_AU;
GRANT UPDATE, REFERENCES ON REMISION_PROVEEDOR TO TRIGGER REMISION_PROVEEDOR_AU;
GRANT SELECT, UPDATE ON REMISION_PROVEEDOR_DET TO TRIGGER REMISION_PROVEEDOR_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER REMISION_PROVEEDOR_AUA;
GRANT UPDATE, REFERENCES ON REMISION_PROVEEDOR TO TRIGGER REMISION_PROVEEDOR_AUA;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER REMISION_PROVEEDOR_BI;
GRANT SELECT, UPDATE, REFERENCES ON REMISION_PROVEEDOR TO TRIGGER REMISION_PROVEEDOR_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER REMISION_PROVEEDOR_BI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER REMISION_PROVEEDOR_DET_AD;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER REMISION_PROVEEDOR_DET_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER REMISION_PROVEEDOR_DET_AD;
GRANT SELECT ON REMISION_PROVEEDOR TO TRIGGER REMISION_PROVEEDOR_DET_AD;
GRANT UPDATE, REFERENCES ON REMISION_PROVEEDOR_DET TO TRIGGER REMISION_PROVEEDOR_DET_AD;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER REMISION_PROVEEDOR_DET_AD;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER REMISION_PROVEEDOR_DET_AI;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER REMISION_PROVEEDOR_DET_AI;
GRANT SELECT, INSERT, REFERENCES ON MOVIMIENTO_ARTICULO TO TRIGGER REMISION_PROVEEDOR_DET_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON PROVEEDOR_ARTICULO TO TRIGGER REMISION_PROVEEDOR_DET_AI;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR TO TRIGGER REMISION_PROVEEDOR_DET_AI;
GRANT UPDATE, REFERENCES ON REMISION_PROVEEDOR_DET TO TRIGGER REMISION_PROVEEDOR_DET_AI;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR_DOCRELA TO TRIGGER REMISION_PROVEEDOR_DET_AI;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER REMISION_PROVEEDOR_DET_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER REMISION_PROVEEDOR_DET_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER REMISION_PROVEEDOR_DET_AI;
GRANT SELECT, UPDATE ON CONSOLIDADO_FALTANTES TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT SELECT ON CONSOLIDE_FALTANTES TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT SELECT ON FACTURAS_COMPRA TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT SELECT, INSERT, DELETE, REFERENCES ON MOVIMIENTO_ARTICULO TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON PROVEEDOR_ARTICULO TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT UPDATE, REFERENCES ON REMISION_PROVEEDOR_DET TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR_DOCRELA TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER REMISION_PROVEEDOR_DET_AU;
GRANT UPDATE, REFERENCES ON REMISION_PROVEEDOR_DET TO TRIGGER REMISION_PROVEEDOR_DET_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER RESERVAS_AD;
GRANT UPDATE, REFERENCES ON RESERVAS TO TRIGGER RESERVAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER RESERVAS_AI;
GRANT UPDATE, REFERENCES ON RESERVAS TO TRIGGER RESERVAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER RESERVAS_AU;
GRANT UPDATE, REFERENCES ON RESERVAS TO TRIGGER RESERVAS_AU;
GRANT SELECT, UPDATE ON RESERVAS_DETALLE TO TRIGGER RESERVAS_AU;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER RESERVAS_BI;
GRANT SELECT, UPDATE, REFERENCES ON RESERVAS TO TRIGGER RESERVAS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER RESERVAS_BI;
GRANT UPDATE, REFERENCES ON RESERVAS_DETALLE TO TRIGGER RESERVAS_DETALLE_BI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER RESERVAS_DETALLE_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER RETIROS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER RETIROS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER RETIROS_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_BANCO TO TRIGGER RETIROS_AD;
GRANT SELECT, DELETE ON NOTAS_DEBITO TO TRIGGER RETIROS_AD;
GRANT UPDATE, REFERENCES ON RETIROS TO TRIGGER RETIROS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER RETIROS_AI;
GRANT INSERT ON MOVIMIENTO_BANCO TO TRIGGER RETIROS_AI;
GRANT INSERT ON NOTAS_DEBITO TO TRIGGER RETIROS_AI;
GRANT UPDATE, REFERENCES ON RETIROS TO TRIGGER RETIROS_AI;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOTA_DB_BANCO TO TRIGGER RETIROS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER RETIROS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER RETIROS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER RETIROS_AU;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_BANCO TO TRIGGER RETIROS_AU;
GRANT SELECT, INSERT, DELETE ON NOTAS_DEBITO TO TRIGGER RETIROS_AU;
GRANT UPDATE, REFERENCES ON RETIROS TO TRIGGER RETIROS_AU;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOTA_DB_BANCO TO TRIGGER RETIROS_AU;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER RETIROS_BI;
GRANT SELECT, UPDATE, REFERENCES ON RETIROS TO TRIGGER RETIROS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER RETIROS_BI;
GRANT UPDATE ON SALDOS_CUENTAS TO TRIGGER SALDOS_CUENTAS_BD;
GRANT EXECUTE ON PROCEDURE PADRE TO TRIGGER SALDOS_CUENTAS_BD;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_CUENTAS TO TRIGGER SALDOS_CUENTAS_BU;
GRANT EXECUTE ON PROCEDURE PADRE TO TRIGGER SALDOS_CUENTAS_BU;
GRANT SELECT, UPDATE ON SALDOS_CENTROS TO TRIGGER SALDOS_INICIALES_AD;
GRANT SELECT, UPDATE ON SALDOS_CUENTAS TO TRIGGER SALDOS_INICIALES_AD;
GRANT UPDATE, REFERENCES ON SALDOS_INICIALES TO TRIGGER SALDOS_INICIALES_AD;
GRANT SELECT, UPDATE ON SALDOS_TERCEROS TO TRIGGER SALDOS_INICIALES_AD;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER SALDOS_INICIALES_AD;
GRANT EXECUTE ON PROCEDURE PADRE TO TRIGGER SALDOS_INICIALES_AD;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_ARTICULO TO TRIGGER SALDOS_INICIALES_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_CENTROS TO TRIGGER SALDOS_INICIALES_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_CUENTAS TO TRIGGER SALDOS_INICIALES_AI;
GRANT UPDATE, REFERENCES ON SALDOS_INICIALES TO TRIGGER SALDOS_INICIALES_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_TERCEROS TO TRIGGER SALDOS_INICIALES_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER SALDOS_INICIALES_AI;
GRANT EXECUTE ON PROCEDURE PADRE TO TRIGGER SALDOS_INICIALES_AI;
GRANT SELECT, INSERT, UPDATE ON SALDOS_CENTROS TO TRIGGER SALDOS_INICIALES_AU;
GRANT SELECT, INSERT, UPDATE ON SALDOS_CUENTAS TO TRIGGER SALDOS_INICIALES_AU;
GRANT UPDATE, REFERENCES ON SALDOS_INICIALES TO TRIGGER SALDOS_INICIALES_AU;
GRANT SELECT, INSERT, UPDATE ON SALDOS_TERCEROS TO TRIGGER SALDOS_INICIALES_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER SALDOS_INICIALES_AU;
GRANT EXECUTE ON PROCEDURE PADRE TO TRIGGER SALDOS_INICIALES_AU;
GRANT SELECT ON CUENTAS TO TRIGGER SALDOS_INICIALES_BI;
GRANT UPDATE, REFERENCES ON SALDOS_INICIALES TO TRIGGER SALDOS_INICIALES_BI;
GRANT EXECUTE ON PROCEDURE EXISTE_CENTRO TO TRIGGER SALDOS_INICIALES_BI;
GRANT EXECUTE ON PROCEDURE EXISTE_TERCERO TO TRIGGER SALDOS_INICIALES_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER SALDOS_INICIALES_BI;
GRANT EXECUTE ON PROCEDURE VALIDE_CUENTA TO TRIGGER SALDOS_INICIALES_BI;
GRANT SELECT, UPDATE, DELETE, REFERENCES ON SALDO_BANCOS TO TRIGGER SALDO_BANCOS_AU;
GRANT SELECT, UPDATE, DELETE, REFERENCES ON SALDO_BANCOS_CONF TO TRIGGER SALDO_BANCOS_CONF_AU;
GRANT SELECT, UPDATE, DELETE, REFERENCES ON SALDO_CAJA TO TRIGGER SALDO_CAJA_AU;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER SALDO_CAJA_BI;
GRANT UPDATE, REFERENCES ON SALDO_CAJA TO TRIGGER SALDO_CAJA_BI;
GRANT UPDATE, REFERENCES ON SALDO_EFECTIVO TO TRIGGER SALDO_EFECTIVO_BI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER SALDO_EFECTIVO_BI;
GRANT UPDATE, REFERENCES ON SALDO_EFECTIVO TO TRIGGER SALDO_EFECTIVO_BU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER SALDO_EFECTIVO_BU;
GRANT INSERT ON AUDITORIA TO TRIGGER SALIDAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER SALIDAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER SALIDAS_AD;
GRANT SELECT, UPDATE ON RESERVAS TO TRIGGER SALIDAS_AD;
GRANT UPDATE, REFERENCES ON SALIDAS TO TRIGGER SALIDAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER SALIDAS_AI;
GRANT SELECT, UPDATE ON RESERVAS TO TRIGGER SALIDAS_AI;
GRANT UPDATE, REFERENCES ON SALIDAS TO TRIGGER SALIDAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER SALIDAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER SALIDAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER SALIDAS_AU;
GRANT SELECT, UPDATE ON RESERVAS TO TRIGGER SALIDAS_AU;
GRANT UPDATE, REFERENCES ON SALIDAS TO TRIGGER SALIDAS_AU;
GRANT SELECT, UPDATE ON SALIDAS_DETALLE TO TRIGGER SALIDAS_AU;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER SALIDAS_BI;
GRANT SELECT, UPDATE, REFERENCES ON SALIDAS TO TRIGGER SALIDAS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER SALIDAS_BI;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER SALIDAS_DETALLE_AD;
GRANT UPDATE, REFERENCES ON SALIDAS_DETALLE TO TRIGGER SALIDAS_DETALLE_AD;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER SALIDAS_DETALLE_AI;
GRANT SELECT ON SALIDAS TO TRIGGER SALIDAS_DETALLE_AI;
GRANT UPDATE, REFERENCES ON SALIDAS_DETALLE TO TRIGGER SALIDAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER SALIDAS_DETALLE_AI;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER SALIDAS_DETALLE_AU;
GRANT SELECT, REFERENCES ON SALIDAS TO TRIGGER SALIDAS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON SALIDAS_DETALLE TO TRIGGER SALIDAS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER SALIDAS_DETALLE_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER SOLICITUD_IMPORTACION_AI;
GRANT INSERT ON MOVIMIENTO_PROVEEDOR TO TRIGGER SOLICITUD_IMPORTACION_AI;
GRANT INSERT ON SALDOS_DOC_CXPAGAR TO TRIGGER SOLICITUD_IMPORTACION_AI;
GRANT UPDATE, REFERENCES ON SOLICITUD_IMPORTACION TO TRIGGER SOLICITUD_IMPORTACION_AI;
GRANT SELECT, UPDATE, REFERENCES ON TASA_CAMBIO_MONEDA TO TRIGGER TASA_CAMBIO_MONEDA_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER TERCEROS_AD;
GRANT UPDATE, REFERENCES ON TERCEROS TO TRIGGER TERCEROS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER TERCEROS_AI;
GRANT UPDATE, REFERENCES ON TERCEROS TO TRIGGER TERCEROS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER TERCEROS_AU;
GRANT UPDATE, REFERENCES ON TERCEROS TO TRIGGER TERCEROS_AU;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO TRIGGER TERCEROS_BD;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO TRIGGER TERCEROS_BU;
GRANT SELECT ON MOVIMIENTO_PROVEEDOR TO TRIGGER TERCEROS_BU;
GRANT UPDATE, REFERENCES ON TERCEROS TO TRIGGER TERCEROS_BU;
GRANT INSERT ON AUDITORIA TO TRIGGER TIQUETE_PASAJERO_AD;
GRANT UPDATE, REFERENCES ON TIQUETE_PASAJERO TO TRIGGER TIQUETE_PASAJERO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER TIQUETE_PASAJERO_AI;
GRANT UPDATE, REFERENCES ON TIQUETE_PASAJERO TO TRIGGER TIQUETE_PASAJERO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER TIQUETE_PASAJERO_AU;
GRANT UPDATE, REFERENCES ON TIQUETE_PASAJERO TO TRIGGER TIQUETE_PASAJERO_AU;
GRANT UPDATE, REFERENCES ON TIQUETE_PASAJERO TO TRIGGER TIQUETE_PASAJERO_BD;
GRANT SELECT, UPDATE ON PREFIJOS TO TRIGGER TIQUETE_PASAJERO_BI;
GRANT SELECT, UPDATE, REFERENCES ON TIQUETE_PASAJERO TO TRIGGER TIQUETE_PASAJERO_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER TIQUETE_PASAJERO_BI;
GRANT UPDATE, REFERENCES ON TIQUETE_PASAJERO TO TRIGGER TIQUETE_PASAJERO_BU;
GRANT UPDATE, REFERENCES ON AJUSTES TO TRIGGER TI_AJUSTES;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_AJUSTES;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_AJUSTES;
GRANT SELECT, REFERENCES ON AJUSTES TO TRIGGER TI_AJUSTES_DETALLE;
GRANT UPDATE, REFERENCES ON AJUSTES_DETALLE TO TRIGGER TI_AJUSTES_DETALLE;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_AJUSTES_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_AJUSTES_DETALLE;
GRANT UPDATE, REFERENCES ON ANTICIPOS_CLIENTE TO TRIGGER TI_ANTICIPOS_CLIENTE;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_ANTICIPOS_CLIENTE;
GRANT SELECT, REFERENCES ON COBRADORES TO TRIGGER TI_ANTICIPOS_CLIENTE;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_ANTICIPOS_CLIENTE;
GRANT UPDATE, REFERENCES ON ANTICIPOS_PROVEEDOR TO TRIGGER TI_ANTICIPOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_ANTICIPOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_ANTICIPOS_PROVEEDOR;
GRANT UPDATE, REFERENCES ON APLICACION_CLIENTE TO TRIGGER TI_APLICACION_CLIENTE;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_APLICACION_CLIENTE;
GRANT SELECT, REFERENCES ON COBRADORES TO TRIGGER TI_APLICACION_CLIENTE;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_APLICACION_CLIENTE;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE TO TRIGGER TI_APLICACION_CLIENTE_DETALLE;
GRANT UPDATE, REFERENCES ON APLICACION_CLIENTE_DETALLE TO TRIGGER TI_APLICACION_CLIENTE_DETALLE;
GRANT UPDATE, REFERENCES ON APLICACION_PROVEDOR TO TRIGGER TI_APLICACION_PROVEDOR;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_APLICACION_PROVEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_APLICACION_PROVEDOR;
GRANT SELECT, REFERENCES ON APLICACION_PROVEDOR TO TRIGGER TI_APLICACION_PROVEEDOR_DETALLE;
GRANT UPDATE, REFERENCES ON APLICACION_PROVEEDOR_DETALLE TO TRIGGER TI_APLICACION_PROVEEDOR_DETALLE;
GRANT UPDATE, REFERENCES ON ARTICULO TO TRIGGER TI_ARTICULO;
GRANT SELECT, REFERENCES ON MARCAS TO TRIGGER TI_ARTICULO;
GRANT SELECT, REFERENCES ON SUBGRUPO TO TRIGGER TI_ARTICULO;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_ARTICULOS_PRODUCTO;
GRANT UPDATE, REFERENCES ON ARTICULOS_PRODUCTO TO TRIGGER TI_ARTICULOS_PRODUCTO;
GRANT UPDATE, REFERENCES ON AUTORIZACIONES TO TRIGGER TI_AUTORIZACIONES;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_AUTORIZACIONES;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_BARRAS_ARTICULO;
GRANT UPDATE, REFERENCES ON BARRAS_ARTICULO TO TRIGGER TI_BARRAS_ARTICULO;
GRANT UPDATE, REFERENCES ON CAMBIODOC_ENTRADAS TO TRIGGER TI_CAMBIODOC_ENTRADAS;
GRANT SELECT, REFERENCES ON CAMBIO_DOCUMENTOS TO TRIGGER TI_CAMBIODOC_ENTRADAS;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO TRIGGER TI_CAMBIODOC_ENTRADAS;
GRANT UPDATE, REFERENCES ON CAMBIODOC_SALIDAS TO TRIGGER TI_CAMBIODOC_SALIDAS;
GRANT SELECT, REFERENCES ON CAMBIO_DOCUMENTOS TO TRIGGER TI_CAMBIODOC_SALIDAS;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO TRIGGER TI_CAMBIODOC_SALIDAS;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_CAMBIO_DOCUMENTOS;
GRANT UPDATE, REFERENCES ON CAMBIO_DOCUMENTOS TO TRIGGER TI_CAMBIO_DOCUMENTOS;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_CAMBIO_DOCUMENTOS;
GRANT UPDATE, REFERENCES ON CENTROS TO TRIGGER TI_CENTROS;
GRANT SELECT, REFERENCES ON PROYECTOS TO TRIGGER TI_CENTROS;
GRANT UPDATE, REFERENCES ON CHEQUERA TO TRIGGER TI_CHEQUERA;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO TRIGGER TI_CHEQUERA;
GRANT UPDATE, REFERENCES ON CHEQUES TO TRIGGER TI_CHEQUES;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER TI_CHEQUES;
GRANT UPDATE, REFERENCES ON CLIENTES TO TRIGGER TI_CLIENTES;
GRANT SELECT, REFERENCES ON COBRADORES TO TRIGGER TI_CLIENTES;
GRANT SELECT, REFERENCES ON TERCEROS TO TRIGGER TI_CLIENTES;
GRANT SELECT, REFERENCES ON VENDEDORES TO TRIGGER TI_CLIENTES;
GRANT UPDATE, REFERENCES ON COMISIONES TO TRIGGER TI_COMISIONES;
GRANT SELECT, REFERENCES ON VENDEDORES TO TRIGGER TI_COMISIONES;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT SELECT, REFERENCES ON CENTROS TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT UPDATE, REFERENCES ON COMPROBANTE_DETALLE TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT SELECT, REFERENCES ON CUENTAS TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT SELECT, REFERENCES ON PROYECTOS TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT SELECT, REFERENCES ON TERCEROS TO TRIGGER TI_COMPROBANTE_DETALLE;
GRANT UPDATE, REFERENCES ON COMPROBANTE_ENCABEZADO TO TRIGGER TI_COMPROBANTE_ENCABEZADO;
GRANT SELECT ON PREFIJOS_CONTA TO TRIGGER TI_COMPROBANTE_ENCABEZADO;
GRANT SELECT, REFERENCES ON CONCEPTOS TO TRIGGER TI_CONCEPTOS_CUENTAS;
GRANT UPDATE, REFERENCES ON CONCEPTOS_CUENTAS TO TRIGGER TI_CONCEPTOS_CUENTAS;
GRANT SELECT, REFERENCES ON CUENTAS TO TRIGGER TI_CONCEPTOS_CUENTAS;
GRANT UPDATE, REFERENCES ON CONSIGNA TO TRIGGER TI_CONSIGNA;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER TI_CONSIGNA;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_CONSIGNA_DETALLE;
GRANT SELECT, REFERENCES ON CONSIGNA TO TRIGGER TI_CONSIGNA_DETALLE;
GRANT UPDATE, REFERENCES ON CONSIGNA_DETALLE TO TRIGGER TI_CONSIGNA_DETALLE;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO TRIGGER TI_CONSIGNA_DETALLE;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_CONSIGNA_TARJETAS;
GRANT UPDATE, REFERENCES ON CONSIGNA_TARJETAS TO TRIGGER TI_CONSIGNA_TARJETAS;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_CONSIGNA_TARJETAS;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_CONSIGNA_TARJETAS_DET;
GRANT SELECT, REFERENCES ON CONSIGNA_TARJETAS TO TRIGGER TI_CONSIGNA_TARJETAS_DET;
GRANT UPDATE, REFERENCES ON CONSIGNA_TARJETAS_DET TO TRIGGER TI_CONSIGNA_TARJETAS_DET;
GRANT SELECT, REFERENCES ON TARJETAS TO TRIGGER TI_CONSIGNA_TARJETAS_DET;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_CONSUMOS;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_CONSUMOS;
GRANT UPDATE, REFERENCES ON CONSUMOS TO TRIGGER TI_CONSUMOS;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_CONSUMOS;
GRANT SELECT, REFERENCES ON VENDEDORES TO TRIGGER TI_CONSUMOS;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_CONSUMO_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_CONSUMO_DETALLE;
GRANT SELECT, REFERENCES ON CONSUMOS TO TRIGGER TI_CONSUMO_DETALLE;
GRANT UPDATE, REFERENCES ON CONSUMO_DETALLE TO TRIGGER TI_CONSUMO_DETALLE;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_CONTABIL_ARTICULO;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO TO TRIGGER TI_CONTABIL_ARTICULO;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_CONTABIL_ARTICULO_N;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO_NIIF TO TRIGGER TI_CONTABIL_ARTICULO_N;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_COSTOS;
GRANT UPDATE, REFERENCES ON COSTOS TO TRIGGER TI_COSTOS;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_COSTOS_NIIF;
GRANT UPDATE, REFERENCES ON COSTOS_NIIF TO TRIGGER TI_COSTOS_NIIF;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_COTIZACIONES;
GRANT UPDATE, REFERENCES ON COTIZACIONES TO TRIGGER TI_COTIZACIONES;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_COTIZACIONES;
GRANT SELECT, REFERENCES ON VENDEDORES TO TRIGGER TI_COTIZACIONES;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_COTIZACIONES_DETALLE;
GRANT SELECT, REFERENCES ON COTIZACIONES TO TRIGGER TI_COTIZACIONES_DETALLE;
GRANT UPDATE, REFERENCES ON COTIZACIONES_DETALLE TO TRIGGER TI_COTIZACIONES_DETALLE;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_COTIZACIONES_PROVEEDOR_DET;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_COTIZACIONES_PROVEEDOR_DET;
GRANT UPDATE, REFERENCES ON COTIZACIONES_PROVEEDOR_DET TO TRIGGER TI_COTIZACIONES_PROVEEDOR_DET;
GRANT SELECT, REFERENCES ON COTIZACION_PROVEEDOR TO TRIGGER TI_COTIZACIONES_PROVEEDOR_DET;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_COTIZACION_PROVEEDOR;
GRANT UPDATE, REFERENCES ON COTIZACION_PROVEEDOR TO TRIGGER TI_COTIZACION_PROVEEDOR;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_COTIZACION_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_COTIZACION_PROVEEDOR;
GRANT SELECT, REFERENCES ON BANCOS TO TRIGGER TI_CUENTAS_BANCO;
GRANT UPDATE, REFERENCES ON CUENTAS_BANCO TO TRIGGER TI_CUENTAS_BANCO;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_DESENSAMBLES;
GRANT UPDATE, REFERENCES ON DESENSAMBLES TO TRIGGER TI_DESENSAMBLES;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_DESENSAMBLES;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_DESENSAMBLES_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_DESENSAMBLES_DETALLE;
GRANT SELECT, REFERENCES ON DESENSAMBLES TO TRIGGER TI_DESENSAMBLES_DETALLE;
GRANT UPDATE, REFERENCES ON DESENSAMBLES_DETALLE TO TRIGGER TI_DESENSAMBLES_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_DEVOLUCIONES_COMPRAS;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_COMPRAS TO TRIGGER TI_DEVOLUCIONES_COMPRAS;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_DEVOLUCIONES_COMPRAS;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_DEVOLUCIONES_COMPRAS;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_DEVOLUCIONES_COMPRAS_DET;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_DEVOLUCIONES_COMPRAS_DET;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO TRIGGER TI_DEVOLUCIONES_COMPRAS_DET;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO TRIGGER TI_DEVOLUCIONES_COMPRAS_DET;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_DEVOLUCIONES_VENTAS;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_VENTAS TO TRIGGER TI_DEVOLUCIONES_VENTAS;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_DEVOLUCIONES_VENTAS;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO TRIGGER TI_DEVOLUCIONES_VENTAS;
GRANT SELECT, REFERENCES ON VENDEDORES TO TRIGGER TI_DEVOLUCIONES_VENTAS;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_DEVOLUCIONES_VENTAS_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_DEVOLUCIONES_VENTAS_DETALLE;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO TRIGGER TI_DEVOLUCIONES_VENTAS_DETALLE;
GRANT UPDATE, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO TRIGGER TI_DEVOLUCIONES_VENTAS_DETALLE;
GRANT UPDATE, REFERENCES ON DEVOLUCION_CHEQUES TO TRIGGER TI_DEVOLUCION_CHEQUES;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER TI_DEVOLUCION_CHEQUES;
GRANT SELECT, REFERENCES ON TERCEROS TO TRIGGER TI_DEVOLUCION_CHEQUES;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_DOCUMENTOS_PAGO_CAJA;
GRANT UPDATE, REFERENCES ON DOCUMENTOS_PAGO_CAJA TO TRIGGER TI_DOCUMENTOS_PAGO_CAJA;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO TRIGGER TI_DOCUMENTOS_PAGO_CAJA;
GRANT UPDATE, REFERENCES ON EGRESOS TO TRIGGER TI_EGRESOS;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_EGRESOS;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO TRIGGER TI_EGRESOS_BANCO;
GRANT SELECT, REFERENCES ON EGRESOS TO TRIGGER TI_EGRESOS_BANCO;
GRANT UPDATE, REFERENCES ON EGRESOS_BANCO TO TRIGGER TI_EGRESOS_BANCO;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_EGRESOS_CAJA;
GRANT SELECT, REFERENCES ON EGRESOS TO TRIGGER TI_EGRESOS_CAJA;
GRANT UPDATE, REFERENCES ON EGRESOS_CAJA TO TRIGGER TI_EGRESOS_CAJA;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO TRIGGER TI_EGRESOS_CAJA;
GRANT SELECT, REFERENCES ON CUENTAS TO TRIGGER TI_EGRESOS_CONTABILIDAD;
GRANT SELECT, REFERENCES ON EGRESOS TO TRIGGER TI_EGRESOS_CONTABILIDAD;
GRANT UPDATE, REFERENCES ON EGRESOS_CONTABILIDAD TO TRIGGER TI_EGRESOS_CONTABILIDAD;
GRANT SELECT ON EGRESOS TO TRIGGER TI_EGRESOS_DETALLE;
GRANT UPDATE, REFERENCES ON EGRESOS_DETALLE TO TRIGGER TI_EGRESOS_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_ENSAMBLES;
GRANT UPDATE, REFERENCES ON ENSAMBLES TO TRIGGER TI_ENSAMBLES;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_ENSAMBLES;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_ENSAMBLES_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_ENSAMBLES_DETALLE;
GRANT SELECT, REFERENCES ON ENSAMBLES TO TRIGGER TI_ENSAMBLES_DETALLE;
GRANT UPDATE, REFERENCES ON ENSAMBLES_DETALLE TO TRIGGER TI_ENSAMBLES_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_ENTRADAS;
GRANT UPDATE, REFERENCES ON ENTRADAS TO TRIGGER TI_ENTRADAS;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_ENTRADAS;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_ENTRADAS_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_ENTRADAS_DETALLE;
GRANT SELECT, REFERENCES ON ENTRADAS TO TRIGGER TI_ENTRADAS_DETALLE;
GRANT UPDATE, REFERENCES ON ENTRADAS_DETALLE TO TRIGGER TI_ENTRADAS_DETALLE;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_EXISTENCIA;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_EXISTENCIA;
GRANT UPDATE, REFERENCES ON EXISTENCIA TO TRIGGER TI_EXISTENCIA;
GRANT UPDATE, REFERENCES ON EXISTENCIA_LOTE TO TRIGGER TI_EXISTENCIA_LOTE;
GRANT SELECT, REFERENCES ON LOTES TO TRIGGER TI_EXISTENCIA_LOTE;
GRANT SELECT, REFERENCES ON AUTORIZACIONES TO TRIGGER TI_FACTURAS;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_FACTURAS;
GRANT UPDATE, REFERENCES ON FACTURAS TO TRIGGER TI_FACTURAS;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO TRIGGER TI_FACTURAS;
GRANT SELECT, REFERENCES ON VENDEDORES TO TRIGGER TI_FACTURAS;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_FACTURAS_COMPRA;
GRANT UPDATE, REFERENCES ON FACTURAS_COMPRA TO TRIGGER TI_FACTURAS_COMPRA;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_FACTURAS_COMPRA;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_FACTURAS_COMPRA;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_FACTURAS_COMPRAS_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_FACTURAS_COMPRAS_DETALLE;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO TRIGGER TI_FACTURAS_COMPRAS_DETALLE;
GRANT UPDATE, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO TRIGGER TI_FACTURAS_COMPRAS_DETALLE;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_FACTURAS_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_FACTURAS_DETALLE;
GRANT SELECT, REFERENCES ON FACTURAS TO TRIGGER TI_FACTURAS_DETALLE;
GRANT UPDATE, REFERENCES ON FACTURAS_DETALLE TO TRIGGER TI_FACTURAS_DETALLE;
GRANT UPDATE, REFERENCES ON LISTAPREC_VENDEDOR TO TRIGGER TI_LISTAPREC_VENDEDOR;
GRANT SELECT, REFERENCES ON LISTA_PRECIOS TO TRIGGER TI_LISTAPREC_VENDEDOR;
GRANT SELECT, REFERENCES ON VENDEDORES TO TRIGGER TI_LISTAPREC_VENDEDOR;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_LOTES;
GRANT UPDATE, REFERENCES ON LOTES TO TRIGGER TI_LOTES;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_MOVIMIENTO_ARTICULO;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_MOVIMIENTO_ARTICULO;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_ARTICULO TO TRIGGER TI_MOVIMIENTO_ARTICULO;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO TRIGGER TI_MOVIMIENTO_BANCO;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_BANCO TO TRIGGER TI_MOVIMIENTO_BANCO;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_MOVIMIENTO_CAJA;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER TI_MOVIMIENTO_CAJA;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_MOVIMIENTO_CLIENTES;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_CLIENTES TO TRIGGER TI_MOVIMIENTO_CLIENTES;
GRANT UPDATE, REFERENCES ON MOVIMIENTO_PROVEEDOR TO TRIGGER TI_MOVIMIENTO_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_MOVIMIENTO_PROVEEDOR;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO TO TRIGGER TI_NOTAS_CREDITO;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER TI_NOTAS_CREDITO;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_NOTAS_CREDITO_CLIENTES;
GRANT SELECT, REFERENCES ON COBRADORES TO TRIGGER TI_NOTAS_CREDITO_CLIENTES;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO_CLIENTES TO TRIGGER TI_NOTAS_CREDITO_CLIENTES;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_NOTAS_CREDITO_CLIENTES;
GRANT UPDATE, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO TRIGGER TI_NOTAS_CREDITO_PROVEEDOR;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_NOTAS_CREDITO_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_NOTAS_CREDITO_PROVEEDOR;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO TO TRIGGER TI_NOTAS_DEBITO;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER TI_NOTAS_DEBITO;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_NOTAS_DEBITO_CLIENTES;
GRANT SELECT, REFERENCES ON COBRADORES TO TRIGGER TI_NOTAS_DEBITO_CLIENTES;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO_CLIENTES TO TRIGGER TI_NOTAS_DEBITO_CLIENTES;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_NOTAS_DEBITO_CLIENTES;
GRANT UPDATE, REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO TRIGGER TI_NOTAS_DEBITO_PROVEEDOR;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_NOTAS_DEBITO_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_NOTAS_DEBITO_PROVEEDOR;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_ORDENES_COMPRA;
GRANT UPDATE, REFERENCES ON ORDENES_COMPRA TO TRIGGER TI_ORDENES_COMPRA;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_ORDENES_COMPRA;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_ORDENES_COMPRA;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_ORDENES_COMPRA_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_ORDENES_COMPRA_DETALLE;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA TO TRIGGER TI_ORDENES_COMPRA_DETALLE;
GRANT UPDATE, REFERENCES ON ORDENES_COMPRA_DETALLE TO TRIGGER TI_ORDENES_COMPRA_DETALLE;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_PEDIDOS;
GRANT UPDATE, REFERENCES ON PEDIDOS TO TRIGGER TI_PEDIDOS;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_PEDIDOS;
GRANT SELECT, REFERENCES ON VENDEDORES TO TRIGGER TI_PEDIDOS;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_PEDIDOS_DETALLE;
GRANT SELECT, REFERENCES ON PEDIDOS TO TRIGGER TI_PEDIDOS_DETALLE;
GRANT UPDATE, REFERENCES ON PEDIDOS_DETALLE TO TRIGGER TI_PEDIDOS_DETALLE;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_PLANTILLA_DETALLE;
GRANT SELECT, REFERENCES ON CENTROS TO TRIGGER TI_PLANTILLA_DETALLE;
GRANT SELECT, REFERENCES ON CUENTAS TO TRIGGER TI_PLANTILLA_DETALLE;
GRANT UPDATE, REFERENCES ON PLANTILLA_DETALLE TO TRIGGER TI_PLANTILLA_DETALLE;
GRANT SELECT, REFERENCES ON PLANTILLA_ENCABEZADO TO TRIGGER TI_PLANTILLA_DETALLE;
GRANT SELECT, REFERENCES ON PROYECTOS TO TRIGGER TI_PLANTILLA_DETALLE;
GRANT SELECT, REFERENCES ON TERCEROS TO TRIGGER TI_PLANTILLA_DETALLE;
GRANT UPDATE, REFERENCES ON PLANTILLA_ENCABEZADO TO TRIGGER TI_PLANTILLA_ENCABEZADO;
GRANT SELECT, REFERENCES ON PREFIJOS_CONTA TO TRIGGER TI_PLANTILLA_ENCABEZADO;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_PRECIOS_ARTICULO;
GRANT SELECT, REFERENCES ON LISTA_PRECIOS TO TRIGGER TI_PRECIOS_ARTICULO;
GRANT UPDATE, REFERENCES ON PRECIOS_ARTICULO TO TRIGGER TI_PRECIOS_ARTICULO;
GRANT UPDATE, REFERENCES ON PREFIJOS TO TRIGGER TI_PREFIJOS;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO TRIGGER TI_PREFIJOS;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO TRIGGER TI_PREFIJOS_BANCOS;
GRANT UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER TI_PREFIJOS_BANCOS;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO TRIGGER TI_PREFIJOS_BANCOS;
GRANT UPDATE, REFERENCES ON PREFIJOS_CONTA TO TRIGGER TI_PREFIJOS_CONTA;
GRANT SELECT, REFERENCES ON TIPO_COMPROBANTE TO TRIGGER TI_PREFIJOS_CONTA;
GRANT SELECT, REFERENCES ON GRUPOS_PROVEEDORES TO TRIGGER TI_PROVEEDORES;
GRANT UPDATE, REFERENCES ON PROVEEDORES TO TRIGGER TI_PROVEEDORES;
GRANT SELECT, REFERENCES ON TERCEROS TO TRIGGER TI_PROVEEDORES;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_PROVEEDOR_ARTICULO;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_PROVEEDOR_ARTICULO;
GRANT UPDATE, REFERENCES ON PROVEEDOR_ARTICULO TO TRIGGER TI_PROVEEDOR_ARTICULO;
GRANT UPDATE, REFERENCES ON PUC TO TRIGGER TI_PUC;
GRANT SELECT ON TIPO_PUC TO TRIGGER TI_PUC;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_PUNTO_VENTA;
GRANT UPDATE, REFERENCES ON PUNTO_VENTA TO TRIGGER TI_PUNTO_VENTA;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_RECIBOS_CAJA;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_RECIBOS_CAJA;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA TO TRIGGER TI_RECIBOS_CAJA;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO TRIGGER TI_RECIBOS_CAJA_PAGO;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO TRIGGER TI_RECIBOS_CAJA_PAGO;
GRANT UPDATE, REFERENCES ON RECIBOS_CAJA_PAGO TO TRIGGER TI_RECIBOS_CAJA_PAGO;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_RECIBO_PROVISIONAL;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_RECIBO_PROVISIONAL;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_RECIBO_PROVISIONAL;
GRANT UPDATE, REFERENCES ON RECIBO_PROVISIONAL TO TRIGGER TI_RECIBO_PROVISIONAL;
GRANT SELECT ON TERCEROS TO TRIGGER TI_RECIBO_PROVISIONAL;
GRANT SELECT, REFERENCES ON VENDEDORES TO TRIGGER TI_RECIBO_PROVISIONAL;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL TO TRIGGER TI_RECIBO_PROVISIONAL_DETALLE;
GRANT UPDATE, REFERENCES ON RECIBO_PROVISIONAL_DETALLE TO TRIGGER TI_RECIBO_PROVISIONAL_DETALLE;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO TRIGGER TI_RECIBO_PROVISIONAL_PAGO;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL TO TRIGGER TI_RECIBO_PROVISIONAL_PAGO;
GRANT UPDATE, REFERENCES ON RECIBO_PROVISIONAL_PAGO TO TRIGGER TI_RECIBO_PROVISIONAL_PAGO;
GRANT SELECT ON CONCEPTOS TO TRIGGER TI_REGISTRO_CONCEPTOS;
GRANT SELECT ON REGISTRO_AUTOMATICO TO TRIGGER TI_REGISTRO_CONCEPTOS;
GRANT UPDATE, REFERENCES ON REGISTRO_CONCEPTOS TO TRIGGER TI_REGISTRO_CONCEPTOS;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_REMISIONES_VENTA;
GRANT SELECT, REFERENCES ON CLIENTES TO TRIGGER TI_REMISIONES_VENTA;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_REMISIONES_VENTA;
GRANT UPDATE, REFERENCES ON REMISIONES_VENTA TO TRIGGER TI_REMISIONES_VENTA;
GRANT SELECT, REFERENCES ON VENDEDORES TO TRIGGER TI_REMISIONES_VENTA;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_REMISIONES_VENTA_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_REMISIONES_VENTA_DETALLE;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO TRIGGER TI_REMISIONES_VENTA_DETALLE;
GRANT UPDATE, REFERENCES ON REMISIONES_VENTA_DETALLE TO TRIGGER TI_REMISIONES_VENTA_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_REMISION_PROVEEDOR;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_REMISION_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO TRIGGER TI_REMISION_PROVEEDOR;
GRANT UPDATE, REFERENCES ON REMISION_PROVEEDOR TO TRIGGER TI_REMISION_PROVEEDOR;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_REMISION_PROVEEDOR_DET;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_REMISION_PROVEEDOR_DET;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR TO TRIGGER TI_REMISION_PROVEEDOR_DET;
GRANT UPDATE, REFERENCES ON REMISION_PROVEEDOR_DET TO TRIGGER TI_REMISION_PROVEEDOR_DET;
GRANT UPDATE, REFERENCES ON RESPUESTA_TIPOCUENTA TO TRIGGER TI_RESPUESTA_TIPOCUENTA;
GRANT SELECT ON TIPO_CUENTAS TO TRIGGER TI_RESPUESTA_TIPOCUENTA;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER TI_RETIROS;
GRANT UPDATE, REFERENCES ON RETIROS TO TRIGGER TI_RETIROS;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_SALDOS_ARTICULO;
GRANT UPDATE, REFERENCES ON SALDOS_ARTICULO TO TRIGGER TI_SALDOS_ARTICULO;
GRANT SELECT, REFERENCES ON SALDOS_CUENTAS TO TRIGGER TI_SALDOS_ARTICULO;
GRANT SELECT, REFERENCES ON CENTROS TO TRIGGER TI_SALDOS_CENTROS;
GRANT UPDATE, REFERENCES ON SALDOS_CENTROS TO TRIGGER TI_SALDOS_CENTROS;
GRANT SELECT, REFERENCES ON SALDOS_CUENTAS TO TRIGGER TI_SALDOS_CENTROS;
GRANT SELECT, REFERENCES ON SALDOS_CENTROS TO TRIGGER TI_SALDOS_CENTROS_TERCERO;
GRANT UPDATE, REFERENCES ON SALDOS_CENTROS_TERCERO TO TRIGGER TI_SALDOS_CENTROS_TERCERO;
GRANT SELECT, REFERENCES ON TERCEROS TO TRIGGER TI_SALDOS_CENTROS_TERCERO;
GRANT SELECT, REFERENCES ON CUENTAS TO TRIGGER TI_SALDOS_CUENTAS;
GRANT UPDATE, REFERENCES ON SALDOS_CUENTAS TO TRIGGER TI_SALDOS_CUENTAS;
GRANT SELECT, REFERENCES ON SALDOS_CUENTAS TO TRIGGER TI_SALDOS_TERCEROS;
GRANT UPDATE, REFERENCES ON SALDOS_TERCEROS TO TRIGGER TI_SALDOS_TERCEROS;
GRANT SELECT, REFERENCES ON TERCEROS TO TRIGGER TI_SALDOS_TERCEROS;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO TRIGGER TI_SALDO_BANCOS;
GRANT UPDATE, REFERENCES ON SALDO_BANCOS TO TRIGGER TI_SALDO_BANCOS;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO TRIGGER TI_SALDO_BANCOS_CONF;
GRANT UPDATE, REFERENCES ON SALDO_BANCOS TO TRIGGER TI_SALDO_BANCOS_CONF;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_SALDO_EFECTIVO;
GRANT UPDATE, REFERENCES ON SALDO_EFECTIVO TO TRIGGER TI_SALDO_EFECTIVO;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_SALIDAS;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_SALIDAS;
GRANT UPDATE, REFERENCES ON SALIDAS TO TRIGGER TI_SALIDAS;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_SALIDAS_DETALLE;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_SALIDAS_DETALLE;
GRANT SELECT, REFERENCES ON SALIDAS TO TRIGGER TI_SALIDAS_DETALLE;
GRANT UPDATE, REFERENCES ON SALIDAS_DETALLE TO TRIGGER TI_SALIDAS_DETALLE;
GRANT SELECT, REFERENCES ON GRUPO TO TRIGGER TI_SUBGRUPO;
GRANT UPDATE, REFERENCES ON SUBGRUPO TO TRIGGER TI_SUBGRUPO;
GRANT SELECT ON CIUDADES TO TRIGGER TI_TERCEROS;
GRANT UPDATE, REFERENCES ON TERCEROS TO TRIGGER TI_TERCEROS;
GRANT SELECT, REFERENCES ON BODEGA TO TRIGGER TI_TRASFERENCIAS;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_TRASFERENCIAS;
GRANT UPDATE, REFERENCES ON TRASFERENCIAS TO TRIGGER TI_TRASFERENCIAS;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_TRASFERENCIAS_DETALLE;
GRANT SELECT, REFERENCES ON TRASFERENCIAS TO TRIGGER TI_TRASFERENCIAS_DETALLE;
GRANT UPDATE, REFERENCES ON TRASFERENCIAS_DETALLE TO TRIGGER TI_TRASFERENCIAS_DETALLE;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER TI_TRASLADOS;
GRANT UPDATE, REFERENCES ON TRASLADOS TO TRIGGER TI_TRASLADOS;
GRANT SELECT, REFERENCES ON CAJAS TO TRIGGER TI_TRASLADO_CAJA;
GRANT SELECT, REFERENCES ON PREFIJOS TO TRIGGER TI_TRASLADO_CAJA;
GRANT UPDATE, REFERENCES ON TRASLADOS_CAJA TO TRIGGER TI_TRASLADO_CAJA;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_UNIDAD_ARTICULO;
GRANT UPDATE, REFERENCES ON UNIDAD_ARTICULO TO TRIGGER TI_UNIDAD_ARTICULO;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASFERENCIAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER TRASFERENCIAS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER TRASFERENCIAS_AD;
GRANT SELECT, UPDATE ON ORDENES_INVENTARIO TO TRIGGER TRASFERENCIAS_AD;
GRANT UPDATE, REFERENCES ON TRASFERENCIAS TO TRIGGER TRASFERENCIAS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASFERENCIAS_AI;
GRANT SELECT, UPDATE ON ORDENES_INVENTARIO TO TRIGGER TRASFERENCIAS_AI;
GRANT UPDATE, REFERENCES ON TRASFERENCIAS TO TRIGGER TRASFERENCIAS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASFERENCIAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER TRASFERENCIAS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER TRASFERENCIAS_AU;
GRANT SELECT, UPDATE ON ORDENES_INVENTARIO TO TRIGGER TRASFERENCIAS_AU;
GRANT UPDATE, REFERENCES ON TRASFERENCIAS TO TRIGGER TRASFERENCIAS_AU;
GRANT SELECT, UPDATE ON TRASFERENCIAS_DETALLE TO TRIGGER TRASFERENCIAS_AU;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER TRASFERENCIAS_BI;
GRANT SELECT, UPDATE, REFERENCES ON TRASFERENCIAS TO TRIGGER TRASFERENCIAS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER TRASFERENCIAS_BI;
GRANT SELECT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER TRASFERENCIAS_DETALLE_AD;
GRANT UPDATE, REFERENCES ON TRASFERENCIAS_DETALLE TO TRIGGER TRASFERENCIAS_DETALLE_AD;
GRANT INSERT ON MOVIMIENTO_ARTICULO TO TRIGGER TRASFERENCIAS_DETALLE_AI;
GRANT SELECT, REFERENCES ON TRASFERENCIAS TO TRIGGER TRASFERENCIAS_DETALLE_AI;
GRANT UPDATE, REFERENCES ON TRASFERENCIAS_DETALLE TO TRIGGER TRASFERENCIAS_DETALLE_AI;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER TRASFERENCIAS_DETALLE_AI;
GRANT SELECT, INSERT, DELETE ON MOVIMIENTO_ARTICULO TO TRIGGER TRASFERENCIAS_DETALLE_AU;
GRANT SELECT, REFERENCES ON TRASFERENCIAS TO TRIGGER TRASFERENCIAS_DETALLE_AU;
GRANT UPDATE, REFERENCES ON TRASFERENCIAS_DETALLE TO TRIGGER TRASFERENCIAS_DETALLE_AU;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO TRIGGER TRASFERENCIAS_DETALLE_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASLADOS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER TRASLADOS_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER TRASLADOS_AD;
GRANT SELECT, DELETE ON MOVIMIENTO_BANCO TO TRIGGER TRASLADOS_AD;
GRANT SELECT, DELETE ON NOTAS_DEBITO TO TRIGGER TRASLADOS_AD;
GRANT UPDATE, REFERENCES ON TRASLADOS TO TRIGGER TRASLADOS_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASLADOS_AI;
GRANT INSERT ON MOVIMIENTO_BANCO TO TRIGGER TRASLADOS_AI;
GRANT INSERT ON NOTAS_DEBITO TO TRIGGER TRASLADOS_AI;
GRANT UPDATE, REFERENCES ON TRASLADOS TO TRIGGER TRASLADOS_AI;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOTA_DB_BANCO TO TRIGGER TRASLADOS_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASLADOS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER TRASLADOS_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER TRASLADOS_AU;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_BANCO TO TRIGGER TRASLADOS_AU;
GRANT SELECT, INSERT, DELETE ON NOTAS_DEBITO TO TRIGGER TRASLADOS_AU;
GRANT UPDATE, REFERENCES ON TRASLADOS TO TRIGGER TRASLADOS_AU;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_NOTA_DB_BANCO TO TRIGGER TRASLADOS_AU;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS_BANCOS TO TRIGGER TRASLADOS_BI;
GRANT SELECT, UPDATE, REFERENCES ON TRASLADOS TO TRIGGER TRASLADOS_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER TRASLADOS_BI;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASLADOS_CAJA_AD;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER TRASLADOS_CAJA_AD;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER TRASLADOS_CAJA_AD;
GRANT UPDATE, REFERENCES ON TRASLADOS_CAJA TO TRIGGER TRASLADOS_CAJA_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASLADOS_CAJA_AI;
GRANT UPDATE, REFERENCES ON TRASLADOS_CAJA TO TRIGGER TRASLADOS_CAJA_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER TRASLADOS_CAJA_AU;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO TRIGGER TRASLADOS_CAJA_AU;
GRANT SELECT, DELETE ON COMPROBANTE_ENCABEZADO TO TRIGGER TRASLADOS_CAJA_AU;
GRANT UPDATE, REFERENCES ON TRASLADOS_CAJA TO TRIGGER TRASLADOS_CAJA_AU;
GRANT SELECT, UPDATE ON TRASLADOS_CAJA_DET TO TRIGGER TRASLADOS_CAJA_AU;
GRANT SELECT, UPDATE, REFERENCES ON PREFIJOS TO TRIGGER TRASLADOS_CAJA_BI;
GRANT SELECT, UPDATE, REFERENCES ON TRASLADOS_CAJA TO TRIGGER TRASLADOS_CAJA_BI;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO TRIGGER TRASLADOS_CAJA_BI;
GRANT SELECT, UPDATE, DELETE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER TRASLADOS_CAJA_DET_AD;
GRANT SELECT, UPDATE ON MOVIMIENTO_CAJA TO TRIGGER TRASLADOS_CAJA_DET_AD;
GRANT SELECT ON TRASLADOS_CAJA TO TRIGGER TRASLADOS_CAJA_DET_AD;
GRANT UPDATE, REFERENCES ON TRASLADOS_CAJA_DET TO TRIGGER TRASLADOS_CAJA_DET_AD;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER TRASLADOS_CAJA_DET_AD;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER TRASLADOS_CAJA_DET_AD;
GRANT SELECT, INSERT, UPDATE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER TRASLADOS_CAJA_DET_AI;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER TRASLADOS_CAJA_DET_AI;
GRANT SELECT, REFERENCES ON TRASLADOS_CAJA TO TRIGGER TRASLADOS_CAJA_DET_AI;
GRANT UPDATE, REFERENCES ON TRASLADOS_CAJA_DET TO TRIGGER TRASLADOS_CAJA_DET_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER TRASLADOS_CAJA_DET_AI;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER TRASLADOS_CAJA_DET_AI;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER TRASLADOS_CAJA_DET_AI;
GRANT SELECT, INSERT, UPDATE, DELETE ON DOCUMENTOS_PAGO_CAJA TO TRIGGER TRASLADOS_CAJA_DET_AU;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON MOVIMIENTO_CAJA TO TRIGGER TRASLADOS_CAJA_DET_AU;
GRANT SELECT, REFERENCES ON TRASLADOS_CAJA TO TRIGGER TRASLADOS_CAJA_DET_AU;
GRANT UPDATE, REFERENCES ON TRASLADOS_CAJA_DET TO TRIGGER TRASLADOS_CAJA_DET_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER TRASLADOS_CAJA_DET_AU;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO TRIGGER TRASLADOS_CAJA_DET_AU;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO TRIGGER TRASLADOS_CAJA_DET_AU;
GRANT INSERT ON AUDITORIA TO TRIGGER UNIDAD_ARTICULO_AD;
GRANT UPDATE, REFERENCES ON UNIDAD_ARTICULO TO TRIGGER UNIDAD_ARTICULO_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER UNIDAD_ARTICULO_AI;
GRANT UPDATE, REFERENCES ON UNIDAD_ARTICULO TO TRIGGER UNIDAD_ARTICULO_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER UNIDAD_ARTICULO_AU;
GRANT UPDATE, REFERENCES ON UNIDAD_ARTICULO TO TRIGGER UNIDAD_ARTICULO_AU;
GRANT SELECT ON AJUSTES_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON DESENSAMBLES_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON DEVOLUCIONES_COMPRAS_DET TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON ENSAMBLES_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON ENTRADAS_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON FACTURAS_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON ORDENINVENTARIO_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON RESERVAS_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON SALIDAS_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT SELECT ON TRASFERENCIAS_DETALLE TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT UPDATE, REFERENCES ON UNIDAD_ARTICULO TO TRIGGER UNIDAD_ARTICULO_BU;
GRANT INSERT ON NOMINA_NOVEDADES TO TRIGGER VACACIONES_AI;
GRANT UPDATE, REFERENCES ON VACACIONES TO TRIGGER VACACIONES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER VENDEDORES_AD;
GRANT SELECT, DELETE ON COBRADORES TO TRIGGER VENDEDORES_AD;
GRANT UPDATE, REFERENCES ON VENDEDORES TO TRIGGER VENDEDORES_AD;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER VENDEDORES_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER VENDEDORES_AI;
GRANT SELECT, INSERT ON COBRADORES TO TRIGGER VENDEDORES_AI;
GRANT UPDATE, REFERENCES ON VENDEDORES TO TRIGGER VENDEDORES_AI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER VENDEDORES_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER VENDEDORES_AU;
GRANT SELECT, INSERT, UPDATE ON COBRADORES TO TRIGGER VENDEDORES_AU;
GRANT UPDATE, REFERENCES ON VENDEDORES TO TRIGGER VENDEDORES_AU;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO TRIGGER VENDEDORES_AU;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO TRIGGER VENDEDORES_BD;
GRANT SELECT ON FACTURAS TO TRIGGER VENDEDORES_BD;
GRANT UPDATE, REFERENCES ON VENDEDORES TO TRIGGER VENDEDORES_BD;

/* Privileges of procedures */
GRANT SELECT ON PLAN_PRODUCCION TO REP_VENTAS_CLIENTE_ANO;
GRANT EXECUTE ON PROCEDURE VENTAS_CLIENTE_ANO TO REP_VENTAS_CLIENTE_ANO;
GRANT SELECT ON APLICACION_CLIENTE TO PROCEDURE ABONOS_DOCUMENTO_CARTERA;
GRANT SELECT ON APLICACION_CLIENTE_DETALLE TO PROCEDURE ABONOS_DOCUMENTO_CARTERA;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE ABONOS_DOCUMENTO_CARTERA;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE ABONOS_DOCUMENTO_CARTERA;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE ABONOS_DOCUMENTO_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEEDOR_DETALLE TO PROCEDURE ABONOS_DOCUMENTO_CXPAGAR;
GRANT SELECT ON EGRESOS TO PROCEDURE ABONOS_DOCUMENTO_CXPAGAR;
GRANT SELECT ON EGRESOS_DETALLE TO PROCEDURE ABONOS_DOCUMENTO_CXPAGAR;
GRANT SELECT ON ARTICULO TO PROCEDURE ACTUALICE_COSTO;
GRANT SELECT, INSERT, DELETE ON COSTOS TO PROCEDURE ACTUALICE_COSTO;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE ACTUALICE_COSTO;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE ACTUALICE_COSTO;
GRANT SELECT, INSERT, UPDATE ON SALDOS_ACTIVO TO PROCEDURE ACTUALICE_SALDO_ACTIVO;
GRANT EXECUTE ON PROCEDURE SALDO_ACTIVO TO PROCEDURE ACTUALICE_SALDO_ACTIVO;
GRANT SELECT, INSERT, UPDATE ON SALDOS_ARTICULO TO PROCEDURE ACTUALICE_SALDO_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_ARTICULO TO PROCEDURE ACTUALICE_SALDO_ARTICULO;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_CENTROS TO PROCEDURE ACTUALICE_SALDO_CENTRO;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO TO PROCEDURE ACTUALICE_SALDO_CENTRO;
GRANT SELECT, INSERT, UPDATE ON SALDOS_CENTROS_TERCERO TO PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_TERCERO TO PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDOS_CUENTAS TO PROCEDURE ACTUALICE_SALDO_CUENTA;
GRANT EXECUTE ON PROCEDURE ES_AFECTABLE TO PROCEDURE ACTUALICE_SALDO_CUENTA;
GRANT EXECUTE ON PROCEDURE PADRE TO PROCEDURE ACTUALICE_SALDO_CUENTA;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA TO PROCEDURE ACTUALICE_SALDO_CUENTA;
GRANT ALL ON SALDOS_TERCEROS TO PROCEDURE ACTUALICE_SALDO_TERCERO;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO TO PROCEDURE ACTUALICE_SALDO_TERCERO;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON FACTURAS TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON HISTORICO_VENTAS TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON PRESUPUESTO_VENTAS TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON PRESUPUESTO_VENTAS_MESES TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON SUCURSALES TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT SELECT ON VENDEDORES TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE ANALISIS_VENTAS_VENDEDOR;
GRANT ALL ON MOVIMIENTO_CAJA TO PROCEDURE ARREGLA_MOV_CAJA_RC;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE ARREGLA_MOV_CAJA_RC;
GRANT SELECT ON RECIBOS_CAJA_PAGO TO PROCEDURE ARREGLA_MOV_CAJA_RC;
GRANT SELECT ON ANTICIPOS_CLIENTE TO PROCEDURE ASIGNA_COBRADOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE ASIGNA_COBRADOR;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE ASIGNA_COBRADOR;
GRANT SELECT ON FACTURAS TO PROCEDURE ASIGNA_COBRADOR;
GRANT SELECT, UPDATE ON MOVIMIENTO_CLIENTES TO PROCEDURE ASIGNA_COBRADOR;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE ASIGNA_COBRADOR;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE ASIGNA_COBRADOR;
GRANT SELECT ON FACTURAS TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT SELECT ON PREFIJOS 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 SELECT ON RUTERO_FAC TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE ASIGNA_RUTERO_FAC;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE AUXILIAR_ARTICULO_MES;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE AUXILIAR_ARTICULO_MES;
GRANT SELECT, REFERENCES ON CENTROS TO PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA;
GRANT SELECT, REFERENCES ON PROYECTOS TO PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA;
GRANT SELECT ON SALDOS_CENTROS TO PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA;
GRANT SELECT ON TERCEROS TO PROCEDURE AUXILIAR_CENTRO_DESDE_HASTA;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE AUXILIAR_CENTRO_MES;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE AUXILIAR_CENTRO_MES;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE AUXILIAR_CUENTA_MES;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE AUXILIAR_CUENTA_MES;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE AUXILIAR_DESDE_HASTA;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE AUXILIAR_DESDE_HASTA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE AUXILIAR_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA TO PROCEDURE AUXILIAR_DESDE_HASTA;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA;
GRANT SELECT, REFERENCES ON SALDOS_TERCEROS TO PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA TO PROCEDURE AUXILIAR_TERCERO_DESDE_HASTA;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE AUXILIAR_TERCERO_MES;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE AUXILIAR_TERCERO_MES;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE BALANCE_ANUAL;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_MES TO PROCEDURE BALANCE_ANUAL;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE BALANCE_ANUAL;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE BALANCE_ANUAL;
GRANT SELECT ON ARTICULO TO PROCEDURE BALANCE_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_ARTICULOC_MES TO PROCEDURE BALANCE_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE SALDO_ARTICULO_MES TO PROCEDURE BALANCE_ARTICULO_MES;
GRANT SELECT ON CENTROS TO PROCEDURE BALANCE_CENTRO_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CENTRO_MES TO PROCEDURE BALANCE_CENTRO_MES;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_MES TO PROCEDURE BALANCE_CENTRO_MES;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE BALANCE_COMPARATIVO;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE BALANCE_COMPARATIVO;
GRANT EXECUTE ON PROCEDURE ES_AFECTABLE TO PROCEDURE BALANCE_COMPARATIVO;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_MES TO PROCEDURE BALANCE_COMPARATIVO;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_TERCERO_MES TO PROCEDURE BALANCE_COMPARATIVO;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE BALANCE_COMPARATIVO;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES TO PROCEDURE BALANCE_COMPARATIVO;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE BALANCE_COMPARATIVO;
GRANT SELECT, REFERENCES ON CENTROS TO PROCEDURE BALANCE_CON_CENTROS_MES;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE BALANCE_CON_CENTROS_MES;
GRANT SELECT ON PROYECTOS TO PROCEDURE BALANCE_CON_CENTROS_MES;
GRANT EXECUTE ON PROCEDURE ES_AFECTABLE TO PROCEDURE BALANCE_CON_CENTROS_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CENTRO_MES TO PROCEDURE BALANCE_CON_CENTROS_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_MES TO PROCEDURE BALANCE_CON_CENTROS_MES;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_MES TO PROCEDURE BALANCE_CON_CENTROS_MES;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE BALANCE_CON_CENTROS_MES;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE BALANCE_CON_CENTROS_MES;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE BALANCE_CON_TERCEROS_MES;
GRANT SELECT, REFERENCES ON SALDOS_TERCEROS TO PROCEDURE BALANCE_CON_TERCEROS_MES;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE BALANCE_CON_TERCEROS_MES;
GRANT EXECUTE ON PROCEDURE ES_AFECTABLE TO PROCEDURE BALANCE_CON_TERCEROS_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_MES TO PROCEDURE BALANCE_CON_TERCEROS_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_TERCERO_MES TO PROCEDURE BALANCE_CON_TERCEROS_MES;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE BALANCE_CON_TERCEROS_MES;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES TO PROCEDURE BALANCE_CON_TERCEROS_MES;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE BALANCE_CON_TERCEROS_MES;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE BALANCE_MES;
GRANT EXECUTE ON PROCEDURE DIGITOS_NIVEL TO PROCEDURE BALANCE_MES;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE BALANCE_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_MES TO PROCEDURE BALANCE_MES;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE BALANCE_MES;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE BALANCE_MES;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE BALANCE_PRUEBA_ACUMULADO;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA TO PROCEDURE BALANCE_PRUEBA_ACUMULADO;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE BALANCE_PRUEBA_ACUMULADO;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE BALANCE_PRUEBA_ACUMULADO;
GRANT SELECT ON TERCEROS TO PROCEDURE BALANCE_TERCERO_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_TERCERO_MES TO PROCEDURE BALANCE_TERCERO_MES;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES TO PROCEDURE BALANCE_TERCERO_MES;
GRANT SELECT, DELETE ON COMPROBANTE_DETALLE TO PROCEDURE BORRE_CONTABIL_FACTURA;
GRANT SELECT, DELETE, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE BORRE_CONTABIL_FACTURA;
GRANT SELECT ON AJUSTES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON ANTICIPOS_CLIENTE TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON ANTICIPOS_PROVEEDOR TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON APLICACION_CLIENTE TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON CHEQUES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON CONSIGNA TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON CONSIGNA_TARJETAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON DESENSAMBLES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON EGRESOS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON ENSAMBLES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON ENTRADAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON FACTURAS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_CREDITO TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_DEBITO TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON RETIROS 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 TRASLADOS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT ON TRASLADOS_CAJA TO PROCEDURE BUSCA_ID_DOC;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO PROCEDURE BUSCA_ID_DOC;
GRANT SELECT, REFERENCES ON ANTICIPOS_CLIENTE TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT SELECT, REFERENCES ON DEVOLUCION_CHEQUES TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_CLIENTES TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_CLIENTES TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CARTERA TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE BUSCA_ID_DOC_CARTERA;
GRANT SELECT, REFERENCES ON ANTICIPOS_PROVEEDOR TO PROCEDURE BUSCA_ID_DOC_CXPAGAR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE BUSCA_ID_DOC_CXPAGAR;
GRANT SELECT ON EGRESOS_DETALLE TO PROCEDURE BUSCA_ID_DOC_CXPAGAR;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE BUSCA_ID_DOC_CXPAGAR;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE BUSCA_ID_DOC_CXPAGAR;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE BUSCA_ID_DOC_CXPAGAR;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CXPAGAR TO PROCEDURE BUSCA_ID_DOC_CXPAGAR;
GRANT EXECUTE ON PROCEDURE COMPLETA_CEROS TO PROCEDURE BUSCA_ID_DOC_CXPAGAR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE BUSCA_ID_DOC_CXPAGAR;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO PROCEDURE BUSCA_ID_DOC_CXPAGAR;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE CALCULA_PRECIOS;
GRANT SELECT, REFERENCES ON LISTA_PRECIOS TO PROCEDURE CALCULA_PRECIOS;
GRANT SELECT, UPDATE, REFERENCES ON PRECIOS_ARTICULO TO PROCEDURE CALCULA_PRECIOS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CALCULA_PRECIOS;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE CALCULA_PRECIOS;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CALCULA_PRECIOS;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CALCULA_PRECIOS;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE CALCULA_PRECIOS;
GRANT SELECT, UPDATE ON TERCEROS TO PROCEDURE CALCULE_DV;
GRANT EXECUTE ON PROCEDURE DV TO PROCEDURE CALCULE_DV;
GRANT SELECT ON ANTICIPOS_CLIENTE TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT ON APLICACION_CLIENTE TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT ON APLICACION_CLIENTE_DETALLE TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT ON FACTURAS TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_CLIENTES TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT, INSERT, UPDATE, DELETE ON SALDOS_DOC_CARTERA TO PROCEDURE CAMBIA_CLIENTE;
GRANT SELECT ON ARTICULO TO PROCEDURE CAMBIA_CTAS_ARTI;
GRANT SELECT, UPDATE ON CONTABIL_ARTICULO TO PROCEDURE CAMBIA_CTAS_ARTI;
GRANT SELECT ON GRUPO TO PROCEDURE CAMBIA_CTAS_ARTI;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CAMBIA_CTAS_ARTI;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CAMBIA_CTAS_ARTI;
GRANT SELECT, UPDATE ON FACTURAS TO PROCEDURE CAMBIA_IVA;
GRANT SELECT, UPDATE ON FACTURAS_DETALLE TO PROCEDURE CAMBIA_IVA;
GRANT SELECT ON AJUSTES TO PROCEDURE CAMBIE_ID_AJUSTEINV;
GRANT SELECT ON AJUSTES_INFLACION TO PROCEDURE CAMBIE_ID_AJUSTESINF;
GRANT SELECT ON ANTICIPOS_CLIENTE TO PROCEDURE CAMBIE_ID_ANTICLIE;
GRANT SELECT ON ANTICIPOS_PROVEEDOR TO PROCEDURE CAMBIE_ID_ANTIPROV;
GRANT SELECT ON APLICACION_CLIENTE TO PROCEDURE CAMBIE_ID_APLICLIE;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE CAMBIE_ID_APLIPROV;
GRANT SELECT ON ARQUEO_CAJA TO PROCEDURE CAMBIE_ID_ARQUEO;
GRANT SELECT ON CAMBIO_DOCUMENTOS TO PROCEDURE CAMBIE_ID_CAMBDOCU;
GRANT SELECT ON CRM_CAMPANA TO PROCEDURE CAMBIE_ID_CAMPANA;
GRANT SELECT ON CHEQUES TO PROCEDURE CAMBIE_ID_CHEQUE;
GRANT SELECT ON CIERRE_ANUAL TO PROCEDURE CAMBIE_ID_CIERANUAL;
GRANT SELECT ON CIERRE_TERCEROS TO PROCEDURE CAMBIE_ID_CIERTERC;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE CAMBIE_ID_COMPRAS;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE CAMBIE_ID_COMPROBA;
GRANT SELECT ON CONCILIACION_BANCARIA TO PROCEDURE CAMBIE_ID_CONCILIAB;
GRANT SELECT ON CONSIGNA TO PROCEDURE CAMBIE_ID_CONSIGNA;
GRANT SELECT ON CONSIGNA_TARJETAS TO PROCEDURE CAMBIE_ID_CONSIGNATAR;
GRANT SELECT, UPDATE ON CONSUMOS TO PROCEDURE CAMBIE_ID_CONSUMO;
GRANT SELECT ON COTIZACION_PROVEEDOR TO PROCEDURE CAMBIE_ID_COTICOMP;
GRANT SELECT ON COTIZACIONES TO PROCEDURE CAMBIE_ID_COTIZACI;
GRANT SELECT ON DESENSAMBLES TO PROCEDURE CAMBIE_ID_DESENSAMBLE;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE CAMBIE_ID_DEVOLCLIE;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE CAMBIE_ID_DEVOLPROV;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE CAMBIE_ID_DEV_CHEQUES;
GRANT SELECT, UPDATE ON EGRESOS TO PROCEDURE CAMBIE_ID_EGRESO;
GRANT SELECT ON ENSAMBLES TO PROCEDURE CAMBIE_ID_ENSAMBLE;
GRANT SELECT ON ENTRADAS TO PROCEDURE CAMBIE_ID_ENTRADA;
GRANT SELECT ON FACTURAS TO PROCEDURE CAMBIE_ID_FACTURA;
GRANT UPDATE ON INTERFAZ_BANCOS TO PROCEDURE CAMBIE_ID_INTERBANCO;
GRANT UPDATE ON INTERFAZ_COMPRAS TO PROCEDURE CAMBIE_ID_INTERCMP;
GRANT UPDATE ON INTERFAZ_INVENTARIO TO PROCEDURE CAMBIE_ID_INTINVENTARIO;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE CAMBIE_ID_NOTACRCLIE;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE CAMBIE_ID_NOTACRPROV;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE CAMBIE_ID_NOTADBCLIE;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE CAMBIE_ID_NOTADBPROV;
GRANT SELECT ON NOTAS_CREDITO TO PROCEDURE CAMBIE_ID_NOTA_CR_BANCO;
GRANT SELECT ON NOTAS_DEBITO TO PROCEDURE CAMBIE_ID_NOTA_DB_BANCO;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE CAMBIE_ID_ORDENCOMP;
GRANT SELECT ON ORDENES_INVENTARIO TO PROCEDURE CAMBIE_ID_ORDENMCIA;
GRANT SELECT ON PEDIDOS TO PROCEDURE CAMBIE_ID_PEDIDO;
GRANT SELECT ON PLANTILLA_ENCABEZADO TO PROCEDURE CAMBIE_ID_PLANTILLA;
GRANT SELECT, UPDATE ON RECIBOS_CAJA TO PROCEDURE CAMBIE_ID_RECICAJA;
GRANT SELECT, UPDATE ON RECIBO_PROVISIONAL TO PROCEDURE CAMBIE_ID_RECIPROV;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE CAMBIE_ID_REMICLIE;
GRANT SELECT ON REMISION_PROVEEDOR TO PROCEDURE CAMBIE_ID_REMIPROV;
GRANT SELECT ON RESERVAS TO PROCEDURE CAMBIE_ID_RESERVA;
GRANT SELECT ON RETIROS TO PROCEDURE CAMBIE_ID_RETIRO;
GRANT SELECT ON SALIDAS TO PROCEDURE CAMBIE_ID_SALIDA;
GRANT SELECT ON SOLICITUD_IMPORTACION TO PROCEDURE CAMBIE_ID_SOLIMP;
GRANT SELECT ON TRASFERENCIAS TO PROCEDURE CAMBIE_ID_TRANSFER;
GRANT SELECT ON TRASLADOS_CAJA TO PROCEDURE CAMBIE_ID_TRASLACAJA;
GRANT SELECT ON TRASLADOS TO PROCEDURE CAMBIE_ID_TRASLADO;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE CAMBIOS_PATRIMONIO;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE CAMBIOS_PATRIMONIO;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE CAMBIOS_PATRIMONIO;
GRANT SELECT, REFERENCES ON CAMBIO_SITUACION TO PROCEDURE CAMBIOS_SITUACION;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE CAMBIOS_SITUACION;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CAMBIOS_SITUACION;
GRANT SELECT, UPDATE ON COMPROBANTE_ENCABEZADO TO PROCEDURE CAMBIO_ANO_CONTA;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE CAMBIO_PRECIOS;
GRANT EXECUTE ON PROCEDURE CALCULA_PRECIOS TO PROCEDURE CAMBIO_PRECIOS;
GRANT SELECT ON ARTICULO TO PROCEDURE CANTIDAD_POR_FACTOR;
GRANT SELECT ON UNIDAD_ARTICULO TO PROCEDURE CANTIDAD_POR_FACTOR;
GRANT SELECT, REFERENCES ON ANTICIPOS_CLIENTE TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CLIENTES TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON NOTAS_CLIENTES TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_CLIENTES TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_CLIENTES TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON RECIBO_PROVISIONAL_DETALLE TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CARTERA TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE CARTERA_CLIENTE;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CARTERA_CLIENTE;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE CARTERA_CLIENTE;
GRANT SELECT ON FACTURAS TO PROCEDURE CARTERA_PUNTO_DIA;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE CARTERA_PUNTO_DIA;
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 SELECT, INSERT ON NOMINA TO PROCEDURE CAUSA_NOMINA;
GRANT SELECT ON NOMINA_COMISIONES 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 NOMINA_HORASEXT TO PROCEDURE CAUSA_NOMINA;
GRANT SELECT ON NOMINA_NOVEDADES TO PROCEDURE CAUSA_NOMINA;
GRANT SELECT ON PARAMETROS_ANO TO PROCEDURE CAUSA_NOMINA;
GRANT SELECT, UPDATE ON PRESTAMO_CUOTAS TO PROCEDURE CAUSA_NOMINA;
GRANT SELECT ON PRESTAMO_NOMINA 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 LEE_CONFIGURACION TO PROCEDURE CAUSA_NOMINA;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CAUSA_NOMINA;
GRANT SELECT ON CONCEPTOS_NOMINA TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON DEPARTAMENTO TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON EMPLEADOS TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON EMPLEADO_CONCEPTOS TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON FODO_SOL_PENSIONAL TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON NOMINA_CARTERA TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT, UPDATE ON NOMINA_CONCEPTOS TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON NOMINA_VALOR_PREDET TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON PARAMETROS_ANO TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON RETENCIONES TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON SECCION TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON VACACIONES TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON VACACIONES_DETALLE TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT EXECUTE ON PROCEDURE IBC_EMPLEADO TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT EXECUTE ON PROCEDURE PERIODO_NOM_FECHA TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CAUSA_NOMINA_VACACIONES;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE CERTIFICADOS_RETENCION;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE CERTIFICADOS_RETENCION;
GRANT SELECT ON CUENTAS TO PROCEDURE CERTIFICADOS_RETENCION;
GRANT SELECT ON TERCEROS TO PROCEDURE CERTIFICADOS_RETENCION;
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 SELECT ON TERCEROS TO PROCEDURE CERTIFICADOS_RETENCION_LABORAL;
GRANT EXECUTE ON PROCEDURE DV TO PROCEDURE CERTIFICADOS_RETENCION_LABORAL;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CERTIFICADOS_RETENCION_LABORAL;
GRANT SELECT, UPDATE ON MOVIMIENTO_PROVEEDOR TO PROCEDURE CHEQUEA_VENCIMIENTOS_CARGOS;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE CHEQUEA_VENCIMIENTOS_CARGOS;
GRANT SELECT, DELETE ON COSTOS TO PROCEDURE CHEQUEO_COSTOS;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE CHEQUEO_COSTOS;
GRANT EXECUTE ON PROCEDURE ACTUALICE_COSTO TO PROCEDURE CHEQUEO_COSTOS;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT SELECT, DELETE ON COSTOS TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT SELECT, DELETE ON EXISTENCIA TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT ALL ON EXISTENCIA_LOTE TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT SELECT, INSERT, UPDATE, DELETE ON LOTES TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT SELECT, UPDATE, REFERENCES ON MOVIMIENTO_ARTICULO TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT EXECUTE ON PROCEDURE ACTUALICE_COSTO TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT EXECUTE ON PROCEDURE RESTE_EXISTENCIA TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT EXECUTE ON PROCEDURE SUME_EXISTENCIA TO PROCEDURE CHEQUEO_INVENTARIO;
GRANT SELECT, DELETE ON ANTICIPOS_CLIENTE TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT ON APLICACION_CLIENTE TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT ON APLICACION_CLIENTE_DETALLE TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT ON FACTURAS TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_CLIENTES TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT, DELETE ON SALDOS_DOC_CARTERA TO PROCEDURE CHEQUEO_MOVIMIENTO_CLIENTES;
GRANT SELECT, DELETE ON ANTICIPOS_PROVEEDOR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEEDOR_DETALLE TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON EGRESOS TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON EGRESOS_DETALLE TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_PROVEEDOR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT, DELETE ON SALDOS_DOC_CXPAGAR TO PROCEDURE CHEQUEO_MOVIMIENTO_CXPAGAR;
GRANT SELECT ON PUNTOS_VENDEDOR TO PROCEDURE CHEQUEO_PUNTOS_VENDEDOR;
GRANT SELECT, REFERENCES ON MOVIMIENTO_BANCO TO PROCEDURE CHEQUEO_SALDOS_BANCOS;
GRANT SELECT, DELETE ON SALDO_BANCOS TO PROCEDURE CHEQUEO_SALDOS_BANCOS;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_BANCO TO PROCEDURE CHEQUEO_SALDOS_BANCOS;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_BANCO TO PROCEDURE CHEQUEO_SALDOS_BANCOS;
GRANT SELECT, DELETE ON ANTICIPOS_CLIENTE TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT, DELETE ON ANTICIPOS_PROVEEDOR TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON CAMBIODOC_ENTRADAS TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON CAMBIODOC_SALIDAS TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON CAMBIO_DOCUMENTOS TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON CONSIGNA TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON CONSIGNA_DETALLE TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT ALL ON DOCUMENTOS_PAGO_CAJA TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON EGRESOS TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON EGRESOS_CAJA TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT ALL ON MOVIMIENTO_CAJA TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON RECIBOS_CAJA_PAGO TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT, DELETE ON SALDO_CAJA TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT ALL ON SALDO_EFECTIVO TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON TRASLADOS_CAJA TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON TRASLADOS_CAJA_DET TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT EXECUTE ON PROCEDURE RESTE_SALDO_EFECTIVO TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT EXECUTE ON PROCEDURE SUME_SALDO_EFECTIVO TO PROCEDURE CHEQUEO_SALDOS_CAJAS;
GRANT SELECT ON AJUSTES TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON CHEQUES TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT, UPDATE, DELETE, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT, DELETE, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON CONSIGNA TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON CONSIGNA_TARJETAS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON DESENSAMBLES TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON EGRESOS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON ENSAMBLES TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON ENTRADAS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON FACTURAS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON NOTAS_CREDITO TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON NOTAS_DEBITO TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON RETIROS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT ALL ON SALDOS_ARTICULO TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT ALL ON SALDOS_CENTROS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT ALL ON SALDOS_CENTROS_TERCERO TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT ALL ON SALDOS_CUENTAS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT, REFERENCES ON SALDOS_INICIALES TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT ALL ON SALDOS_TERCEROS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON SALIDAS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON TRASLADOS TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT ON TRASLADOS_CAJA TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_ARTICULO TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_CUENTA TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT EXECUTE ON PROCEDURE ACTUALICE_SALDO_TERCERO TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT EXECUTE ON PROCEDURE PADRE TO PROCEDURE CHEQUEO_SALDOS_CONTA;
GRANT SELECT, DELETE ON ANTICIPOS_CLIENTE TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT ON APLICACION_CLIENTE TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT ON APLICACION_CLIENTE_DETALLE TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT ON FACTURAS TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT, INSERT, UPDATE, DELETE ON SALDOS_DOC_CARTERA TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE CHEQUEO_SALDOS_DOC_CARTERA;
GRANT SELECT, DELETE ON ANTICIPOS_PROVEEDOR TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEEDOR_DETALLE TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT ON EGRESOS TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT ON EGRESOS_DETALLE TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT, INSERT, UPDATE, DELETE ON MOVIMIENTO_PROVEEDOR TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT, INSERT, UPDATE, DELETE ON SALDOS_DOC_CXPAGAR TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO PROCEDURE CHEQUEO_SALDOS_DOC_CXPAGAR;
GRANT SELECT ON CHEQUES TO PROCEDURE CHEQUES_SIN_CONTABILIDAD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE CHEQUES_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_BANCOS TO PROCEDURE CHEQUES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE CHEQUES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_CHEQUE TO PROCEDURE CHEQUES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CHEQUES_SIN_CONTABILIDAD;
GRANT SELECT, INSERT ON AUDITORIA TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON AUTORIZACIONES TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON FACTURAS TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON RECIBOS_CAJA_PAGO TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON VENDEDORES TO PROCEDURE CIERRE_FACTURACION;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE CLASIFICA_INVENTARIO;
GRANT SELECT, INSERT ON CLIENTES TO PROCEDURE CLIENTES_SIN_REGISTRO;
GRANT SELECT ON TERCEROS TO PROCEDURE CLIENTES_SIN_REGISTRO;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE COBRADOR_NOTAS;
GRANT SELECT, UPDATE ON NOTAS_DEBITO_CLIENTES TO PROCEDURE COBRADOR_NOTAS;
GRANT SELECT ON ARTICULO TO PROCEDURE COMISIONES_ARTICULO;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE COMISIONES_ARTICULO;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE COMISIONES_ARTICULO;
GRANT SELECT ON FACTURAS TO PROCEDURE COMISIONES_ARTICULO;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE COMISIONES_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE COMISIONES_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE COMISIONES_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE COMISIONES_ARTICULO;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE COMISIONES_ARTICULO;
GRANT SELECT ON VENDEDORES TO PROCEDURE COMISIONES_ARTICULO;
GRANT SELECT ON ARTICULO TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON CLIENTES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON COBRADORES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON COMISION_COBRO 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 DEVOLUCION_CHEQUES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON EGRESOS TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON EGRESOS_CRUCEC TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON FACTURAS TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES 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 EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE COMISIONES_COBRO;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE COMISIONES_COBRO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE COMISIONES_DOCUMENTO;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE COMISIONES_DOCUMENTO;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE COMISIONES_DOCUMENTO;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE COMISIONES_DOCUMENTO;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE COMISIONES_DOCUMENTO;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE COMISIONES_DOCUMENTO;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE COMISIONES_DOCUMENTO;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE COMISIONES_DOCUMENTO;
GRANT SELECT ON CUENTAS TO PROCEDURE COMPARA_CENTROS;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CENTRO_MES TO PROCEDURE COMPARA_CENTROS;
GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_MES TO PROCEDURE COMPARA_CENTROS;
GRANT SELECT ON ARTICULO TO PROCEDURE COMPARA_MOVIMIENTO_ARTICULO;
GRANT SELECT ON BODEGA TO PROCEDURE COMPARA_MOVIMIENTO_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE COMPARA_MOVIMIENTO_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE COMPARA_MOVIMIENTO_ARTICULO;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE COMPARA_MOVIMIENTO_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE COMPARA_MOVIMIENTO_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE COMPARA_MOVIMIENTO_ARTICULO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE COMPRAS_ARTICULO;
GRANT SELECT ON PREFIJOS TO PROCEDURE COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES 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 COMPONE_FECHA TO PROCEDURE COMPRAS_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE COMPRAS_ARTICULO TO PROCEDURE COMPRAS_ARTICULO_MES;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE COMPRAS_PROVEEDOR;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE COMPRAS_PROVEEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE COMPRAS_PROVEEDOR;
GRANT SELECT ON TERCEROS TO PROCEDURE COMPRAS_PROVEEDOR_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE COMPRAS_PROVEEDOR_MES;
GRANT EXECUTE ON PROCEDURE COMPRAS_PROVEEDOR TO PROCEDURE COMPRAS_PROVEEDOR_MES;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE COMPROBANTES_ACTIVO;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE COMPROBANTES_ACTIVO;
GRANT SELECT ON CUENTAS TO PROCEDURE COMPROBANTES_ACTIVO;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE COMPROBANTES_DIARIO;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE COMPROBANTES_DIARIO;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE COMPROBANTES_TERCERO;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE COMPROBANTES_TERCERO;
GRANT SELECT ON CUENTAS TO PROCEDURE CONCILIACION_PATRIMONIAL;
GRANT SELECT ON CUENTAS_NIIF TO PROCEDURE CONCILIACION_PATRIMONIAL;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE CONCILIACION_PATRIMONIAL;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES_NIIF TO PROCEDURE CONCILIACION_PATRIMONIAL;
GRANT SELECT, INSERT, UPDATE ON CONCILIACION_BANCARIA TO PROCEDURE CONCILIA_BANCO;
GRANT SELECT ON CONCILIACION_ENCABEZADO TO PROCEDURE CONCILIA_BANCO;
GRANT SELECT ON MOVIMIENTO_BANCO TO PROCEDURE CONCILIA_BANCO;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE CONCILIA_BANCO;
GRANT SELECT ON FACTURAS TO PROCEDURE CONFIRMA_RUTERO_FAC;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE CONFIRMA_RUTERO_FAC;
GRANT SELECT ON RUTERO_FAC TO PROCEDURE CONFIRMA_RUTERO_FAC;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE CONSECUTIVOS_CONTA;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE CONSECUTIVOS_CONTA;
GRANT SELECT, REFERENCES ON TIPO_COMPROBANTE TO PROCEDURE CONSECUTIVOS_CONTA;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE CONSIGNA_SIN_CONTABILIDAD;
GRANT SELECT ON CONSIGNA TO PROCEDURE CONSIGNA_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_BANCOS TO PROCEDURE CONSIGNA_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE CONSIGNA_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_CONSIGNA TO PROCEDURE CONSIGNA_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONSIGNA_SIN_CONTABILIDAD;
GRANT INSERT ON CONSOLIDADO_FALTANTES TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT SELECT ON CONSOLIDE_FALTANTES TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT SELECT ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE CONSOLIDE_PENDIENTES;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE CONSULTA_ARTICULOS;
GRANT SELECT, REFERENCES ON GRUPO TO PROCEDURE CONSULTA_ARTICULOS;
GRANT SELECT, REFERENCES ON MARCAS TO PROCEDURE CONSULTA_ARTICULOS;
GRANT SELECT, REFERENCES ON PRECIOS_ARTICULO TO PROCEDURE CONSULTA_ARTICULOS;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE CONSULTA_ARTICULOS;
GRANT SELECT ON ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT SELECT ON GRUPO TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT SELECT ON LISTA_PRECIOS TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT SELECT ON MARCAS TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT SELECT ON SUBGRUPO TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT SELECT ON UNIDAD_ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT SELECT ON USUARIO TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO PROCEDURE CONSULTA_ARTICULOS_MOVIL;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT, REFERENCES ON ESTADO_ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT, REFERENCES ON GRUPO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT, REFERENCES ON PRECIOS_ARTICULO TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONSULTA_ARTICULOS_VTAS;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION 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;
GRANT SELECT ON CLIENTES TO PROCEDURE CONSULTA_CLIENTES;
GRANT SELECT ON COBRADORES TO PROCEDURE CONSULTA_CLIENTES;
GRANT SELECT ON TERCEROS TO PROCEDURE CONSULTA_CLIENTES;
GRANT SELECT ON VENDEDORES TO PROCEDURE CONSULTA_CLIENTES;
GRANT SELECT ON ZONAS TO PROCEDURE CONSULTA_CLIENTES;
GRANT SELECT ON PUNTOS_VENDEDOR TO PROCEDURE CONSULTA_PUNTOS_VENDEDOR;
GRANT SELECT ON ARTICULO TO PROCEDURE CONSUMO_PRECIOS;
GRANT SELECT, UPDATE ON PRECIOS_ARTICULO TO PROCEDURE CONSUMO_PRECIOS;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE CONTABILICE_COMP_SIMPLIFICADO;
GRANT SELECT ON PROVEEDORES TO PROCEDURE CONTABILICE_COMP_SIMPLIFICADO;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTCOMP TO PROCEDURE CONTABILICE_COMP_SIMPLIFICADO;
GRANT SELECT ON BODEGA TO PROCEDURE CONTABILICE_COSTO_VENTAS;
GRANT SELECT, INSERT, UPDATE ON COMPROBANTE_DETALLE TO PROCEDURE CONTABILICE_COSTO_VENTAS;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE CONTABILICE_COSTO_VENTAS;
GRANT SELECT ON COSTO_VENTAS TO PROCEDURE CONTABILICE_COSTO_VENTAS;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABILICE_COSTO_VENTAS;
GRANT SELECT ON FACTURAS TO PROCEDURE CONTABILICE_COSTO_VENTAS;
GRANT SELECT ON INTERFAZ_VENTAS TO PROCEDURE CONTABILICE_COSTO_VENTAS;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE CONTABILICE_COSTO_VENTAS;
GRANT EXECUTE ON PROCEDURE COSTO_EN_VENTAS TO PROCEDURE CONTABILICE_COSTO_VENTAS;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABILICE_COSTO_VENTAS;
GRANT INSERT ON COMPROBANTE_DETALLE TO PROCEDURE CONTABILIZA_PENDIENTE;
GRANT INSERT ON COMPROBANTE_ENCABEZADO TO PROCEDURE CONTABILIZA_PENDIENTE;
GRANT SELECT, UPDATE, REFERENCES ON CONTABILIZACION TO PROCEDURE CONTABILIZA_PENDIENTE;
GRANT SELECT, REFERENCES ON CONTABILIZACION_DET TO PROCEDURE CONTABILIZA_PENDIENTE;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_COMPROBA TO PROCEDURE CONTABILIZA_PENDIENTE;
GRANT SELECT ON AJUSTES TO PROCEDURE CONTABIL_AJUSTE;
GRANT SELECT ON AJUSTES_DETALLE TO PROCEDURE CONTABIL_AJUSTE;
GRANT SELECT ON ARTICULO TO PROCEDURE CONTABIL_AJUSTE;
GRANT SELECT ON BODEGA TO PROCEDURE CONTABIL_AJUSTE;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_AJUSTE;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_AJUSTE;
GRANT SELECT ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_AJUSTE;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_AJUSTE;
GRANT SELECT ON INTERFAZ_INVENTARIO TO PROCEDURE CONTABIL_AJUSTE;
GRANT SELECT ON INTERFAZ_INVENTARIO_CTAS TO PROCEDURE CONTABIL_AJUSTE;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_AJUSTE;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_AJUSTE;
GRANT SELECT, REFERENCES ON CHEQUES TO PROCEDURE CONTABIL_CHEQUE;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_CHEQUE;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_CHEQUE;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_CHEQUE;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE CONTABIL_CHEQUE;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS TO PROCEDURE CONTABIL_CHEQUE;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS_CTAS TO PROCEDURE CONTABIL_CHEQUE;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO PROCEDURE CONTABIL_CHEQUE;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_CHEQUE;
GRANT SELECT ON BANCOS TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON CONSIGNA TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON CONSIGNA_DETALLE TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_CONSIGNA;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS_CTAS TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO PROCEDURE CONTABIL_CONSIGNA;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_CONSIGNA;
GRANT SELECT ON CAJAS TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT SELECT ON CONSIGNA_TARJETAS TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT SELECT ON CUENTAS_BANCO TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT SELECT ON INTERFAZ_CAJA TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT SELECT ON INTERFAZ_CAJA_CTAS TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONTABIL_CONSIGNATAR;
GRANT SELECT ON ARTICULO TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT SELECT ON BODEGA TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT SELECT ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT SELECT ON DESENSAMBLES TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT SELECT ON DESENSAMBLES_DETALLE TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT SELECT ON INTERFAZ_INVENTARIO TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT SELECT ON INTERFAZ_INVENTARIO_CTAS TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONTABIL_DESENSAMBLE;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT SELECT, REFERENCES ON CHEQUES TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT SELECT, REFERENCES ON DEVOLUCION_CHEQUES TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS_CTAS TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_DEVOLCHEQ;
GRANT SELECT ON ARTICULO TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON BODEGA TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON CAJAS TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON CONFIGURACION TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON COSTO_VENTAS TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON INTERFAZ_VENTAS TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON INTERFAZ_VENTAS_CTAS TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON TERCEROS TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON VENDEDORES TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT EXECUTE ON PROCEDURE COSTO_EN_VENTAS TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CONTABIL_DEVOLCLI;
GRANT SELECT ON ARTICULO TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON BODEGA TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON INTERFAZ_COMPRAS TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON INTERFAZ_COMPRAS_CTAS TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON PROVEEDORES TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT ON TERCEROS TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONTABIL_DEVOLCOMP;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_EGRESO;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON EGRESOS TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON EGRESOS_BANCO TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON EGRESOS_CAJA TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON EGRESOS_CONTABILIDAD TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON INTERFAZ_CAJA TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON INTERFAZ_CAJA_CTAS TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON PREFIJOS TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_DETALLE TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_EGRESO;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_EGRESO;
GRANT SELECT ON ARTICULO TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT SELECT ON BODEGA TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT SELECT ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT SELECT ON ENSAMBLES TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT SELECT ON ENSAMBLES_DETALLE TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT SELECT ON INTERFAZ_INVENTARIO TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT SELECT ON INTERFAZ_INVENTARIO_CTAS TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONTABIL_ENSAMBLE;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE CONTABIL_ENTRADA;
GRANT INSERT ON COMPROBANTE_DETALLE TO PROCEDURE CONTABIL_ENTRADA;
GRANT INSERT ON COMPROBANTE_ENCABEZADO TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_ENTRADA;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT, REFERENCES ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT, REFERENCES ON ENTRADAS TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT, REFERENCES ON ENTRADAS_DETALLE TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT, REFERENCES ON INTERFAZ_INVENTARIO TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT ON INTERFAZ_INVENTARIO_CTAS TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT ON PROVEEDORES TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_ENTRADA;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_ENTRADA;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE CONTABIL_FACTCOMP;
GRANT INSERT ON COMPROBANTE_DETALLE TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT ON CONFIGURACION TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_FACTCOMP;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, REFERENCES ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, REFERENCES ON INTERFAZ_COMPRAS TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, REFERENCES ON INTERFAZ_COMPRAS_CTAS TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_FACTCOMP;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_FACTCOMP;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONTABIL_FACTCOMP;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CONTABIL_FACTCOMP;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT ON CAJAS TO PROCEDURE CONTABIL_FACTURA;
GRANT INSERT ON COMPROBANTE_DETALLE TO PROCEDURE CONTABIL_FACTURA;
GRANT INSERT ON COMPROBANTE_ENCABEZADO TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT ON CONFIGURACION TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_FACTURA;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, REFERENCES ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, REFERENCES ON COSTO_VENTAS TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, REFERENCES ON INTERFAZ_VENTAS TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, REFERENCES ON INTERFAZ_VENTAS_CTAS TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT ON VENDEDORES TO PROCEDURE CONTABIL_FACTURA;
GRANT EXECUTE ON PROCEDURE COSTO_EN_VENTAS TO PROCEDURE CONTABIL_FACTURA;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_FACTURA;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CONTABIL_FACTURA;
GRANT SELECT ON ARTICULO TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON BODEGA TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON CAJAS TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON CONFIGURACION TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON COSTO_VENTAS TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON FACTURAS TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON INTERFAZ_VENTAS TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON INTERFAZ_VENTAS_CTAS TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON TERCEROS TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON VENDEDORES TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT EXECUTE ON PROCEDURE COSTO_EN_VENTAS_CONTADO TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CONTABIL_FACTURAS_CONTADO;
GRANT SELECT ON CARGA_REMESA TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON CONCEPTOS_PLANILLA TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON FORMA_PAGO_REMESA TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON INTERFAZ_TRANSPORTE TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON MANIFIESTOS_CARGA_CONC TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON MANIFIESTO_CARGA TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON MANIFIESTO_CARGA_DET TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON TERCEROS TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON VEHICULOS TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONTABIL_MANIFIESTO;
GRANT SELECT ON BANCOS TO PROCEDURE CONTABIL_NOTACRBC;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_NOTACRBC;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_NOTACRBC;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_NOTACRBC;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE CONTABIL_NOTACRBC;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS TO PROCEDURE CONTABIL_NOTACRBC;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS_CTAS TO PROCEDURE CONTABIL_NOTACRBC;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO TO PROCEDURE CONTABIL_NOTACRBC;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO PROCEDURE CONTABIL_NOTACRBC;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_NOTACRBC;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_NOTACRCL;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_NOTACRCL;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_NOTACRCL;
GRANT SELECT, REFERENCES ON INTERFAZ_CARTERA TO PROCEDURE CONTABIL_NOTACRCL;
GRANT SELECT ON INTERFAZ_CARTERA_CTAS TO PROCEDURE CONTABIL_NOTACRCL;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_CLIENTES TO PROCEDURE CONTABIL_NOTACRCL;
GRANT SELECT, REFERENCES ON PREFIJOS TO PROCEDURE CONTABIL_NOTACRCL;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_NOTACRCL;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_NOTACRCL;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_NOTACRPR;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_NOTACRPR;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_NOTACRPR;
GRANT SELECT, REFERENCES ON INTERFAZ_CXPAGAR TO PROCEDURE CONTABIL_NOTACRPR;
GRANT SELECT, REFERENCES ON INTERFAZ_CXPAGAR_CTAS TO PROCEDURE CONTABIL_NOTACRPR;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE CONTABIL_NOTACRPR;
GRANT SELECT, REFERENCES ON PREFIJOS TO PROCEDURE CONTABIL_NOTACRPR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE CONTABIL_NOTACRPR;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_NOTACRPR;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_NOTACRPR;
GRANT SELECT ON BANCOS TO PROCEDURE CONTABIL_NOTADBBC;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_NOTADBBC;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_NOTADBBC;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_NOTADBBC;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE CONTABIL_NOTADBBC;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS TO PROCEDURE CONTABIL_NOTADBBC;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS_CTAS TO PROCEDURE CONTABIL_NOTADBBC;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO TO PROCEDURE CONTABIL_NOTADBBC;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO PROCEDURE CONTABIL_NOTADBBC;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_NOTADBBC;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_NOTADBCL;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_NOTADBCL;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_NOTADBCL;
GRANT SELECT, REFERENCES ON INTERFAZ_CARTERA TO PROCEDURE CONTABIL_NOTADBCL;
GRANT SELECT ON INTERFAZ_CARTERA_CTAS TO PROCEDURE CONTABIL_NOTADBCL;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_CLIENTES TO PROCEDURE CONTABIL_NOTADBCL;
GRANT SELECT, REFERENCES ON PREFIJOS TO PROCEDURE CONTABIL_NOTADBCL;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_NOTADBCL;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_NOTADBCL;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_NOTADBPR;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_NOTADBPR;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_NOTADBPR;
GRANT INSERT ON ERRORES TO PROCEDURE CONTABIL_NOTADBPR;
GRANT SELECT, REFERENCES ON INTERFAZ_CXPAGAR TO PROCEDURE CONTABIL_NOTADBPR;
GRANT SELECT, REFERENCES ON INTERFAZ_CXPAGAR_CTAS TO PROCEDURE CONTABIL_NOTADBPR;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE CONTABIL_NOTADBPR;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE CONTABIL_NOTADBPR;
GRANT SELECT, REFERENCES ON PREFIJOS TO PROCEDURE CONTABIL_NOTADBPR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE CONTABIL_NOTADBPR;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_NOTADBPR;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_NOTADBPR;
GRANT SELECT ON CAJAS TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON CARGA_REMESA TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON CONCEPTOS_PLANILLA TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_PLANILLA;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON FORMA_PAGO_REMESA TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON INTERFAZ_TRANSPORTE TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON PLANILLA_PASAJEROS TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON PLANILLA_PASAJEROS_CON TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON PLANILLA_PASAJEROS_DET TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON PLANILLA_PASAJEROS_REM TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON TERCEROS TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON TIQUETE_PASAJERO TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON VEHICULOS TO PROCEDURE CONTABIL_PLANILLA;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_PLANILLA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONTABIL_PLANILLA;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE CONTABIL_PLANILLA;
GRANT SELECT ON CLIENTES TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_RECICAJA;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT, REFERENCES ON INTERFAZ_CAJA TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT, REFERENCES ON INTERFAZ_CAJA_CTAS TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT, REFERENCES ON PREFIJOS TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_DETALLE TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_PAGO TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_RECICAJA;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_RECICAJA;
GRANT SELECT ON CAJAS TO PROCEDURE CONTABIL_REMESA;
GRANT SELECT ON CARGA_REMESA TO PROCEDURE CONTABIL_REMESA;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_REMESA;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_REMESA;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_REMESA;
GRANT SELECT ON FORMA_PAGO_REMESA TO PROCEDURE CONTABIL_REMESA;
GRANT SELECT ON INTERFAZ_TRANSPORTE TO PROCEDURE CONTABIL_REMESA;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_REMESA;
GRANT SELECT ON TERCEROS TO PROCEDURE CONTABIL_REMESA;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_REMESA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONTABIL_REMESA;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_RETIRO;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_RETIRO;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_RETIRO;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE CONTABIL_RETIRO;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS TO PROCEDURE CONTABIL_RETIRO;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS_CTAS TO PROCEDURE CONTABIL_RETIRO;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO PROCEDURE CONTABIL_RETIRO;
GRANT SELECT, REFERENCES ON RETIROS TO PROCEDURE CONTABIL_RETIRO;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_RETIRO;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_SALIDA;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT, REFERENCES ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT, REFERENCES ON INTERFAZ_INVENTARIO TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT ON INTERFAZ_INVENTARIO_CTAS TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT ON PROVEEDORES TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT, REFERENCES ON SALIDAS TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT, REFERENCES ON SALIDAS_DETALLE TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CONTABIL_SALIDA;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_SALIDA;
GRANT SELECT ON BANCOS TO PROCEDURE CONTABIL_TRASCUENTA;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_TRASCUENTA;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_TRASCUENTA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE CONTABIL_TRASCUENTA;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE CONTABIL_TRASCUENTA;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS TO PROCEDURE CONTABIL_TRASCUENTA;
GRANT SELECT, REFERENCES ON INTERFAZ_BANCOS_CTAS TO PROCEDURE CONTABIL_TRASCUENTA;
GRANT SELECT, REFERENCES ON PREFIJOS_BANCOS TO PROCEDURE CONTABIL_TRASCUENTA;
GRANT SELECT, REFERENCES ON TRASLADOS TO PROCEDURE CONTABIL_TRASCUENTA;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_TRASCUENTA;
GRANT SELECT ON CAJAS TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT SELECT, INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT SELECT ON INTERFAZ_CAJA TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT SELECT ON INTERFAZ_CAJA_CTAS TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT SELECT ON TRASLADOS_CAJA TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT SELECT ON TRASLADOS_CAJA_DET TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONTABIL_TRASLACAJA;
GRANT SELECT ON ARTICULO TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON BODEGA TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT INSERT, DELETE ON CONTABILIZACION TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT INSERT ON CONTABILIZACION_DET TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON CONTABIL_ARTICULO TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON CUENTAS TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON INTERFAZ_INVENTARIO TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON INTERFAZ_INVENTARIO_CTAS TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON PREFIJOS TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON PROVEEDORES TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON TERCEROS TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON TRASFERENCIAS TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT ON TRASFERENCIAS_DETALLE TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CONTABIL_TRASLAMERCANCIA;
GRANT SELECT, INSERT ON INTERFAZ_BANCOS TO PROCEDURE COPIA_INTERFAZ_BANCOS;
GRANT SELECT ON PREFIJOS_BANCOS TO PROCEDURE COPIA_INTERFAZ_BANCOS;
GRANT SELECT, INSERT, DELETE ON LISTA_PRECIOS TO PROCEDURE COPIA_LISTA_PRECIOS;
GRANT SELECT, INSERT, DELETE ON PRECIOS_ARTICULO TO PROCEDURE COPIA_LISTA_PRECIOS;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE COSTO_EN_VENTAS;
GRANT SELECT, REFERENCES ON CONTABIL_ARTICULO TO PROCEDURE COSTO_EN_VENTAS;
GRANT SELECT, INSERT, DELETE ON COSTO_VENTAS TO PROCEDURE COSTO_EN_VENTAS;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE COSTO_EN_VENTAS;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE COSTO_EN_VENTAS;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE COSTO_EN_VENTAS;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE COSTO_EN_VENTAS;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE COSTO_EN_VENTAS;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE COSTO_EN_VENTAS;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE COSTO_EN_VENTAS;
GRANT SELECT ON ARTICULO TO PROCEDURE COSTO_EN_VENTAS_CONTADO;
GRANT SELECT ON CONTABIL_ARTICULO TO PROCEDURE COSTO_EN_VENTAS_CONTADO;
GRANT SELECT, INSERT, DELETE ON COSTO_VENTAS TO PROCEDURE COSTO_EN_VENTAS_CONTADO;
GRANT SELECT ON FACTURAS TO PROCEDURE COSTO_EN_VENTAS_CONTADO;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE COSTO_EN_VENTAS_CONTADO;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE COSTO_EN_VENTAS_CONTADO;
GRANT SELECT ON COSTOS TO PROCEDURE COSTO_PROMEDIO;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE COSTO_PROMEDIO_UNIDAD;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO PROCEDURE COSTO_PROMEDIO_UNIDAD;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE COSTO_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDOR_ARTICULO TO PROCEDURE COSTO_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE COSTO_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE COSTO_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE COSTO_PROVEEDOR;
GRANT SELECT, INSERT ON CUENTAS TO PROCEDURE CREE_CUENTA_PUC;
GRANT SELECT ON PUC TO PROCEDURE CREE_CUENTA_PUC;
GRANT EXECUTE ON PROCEDURE CREE_CUENTA_PUC TO PROCEDURE CREE_CUENTA_PUC;
GRANT EXECUTE ON PROCEDURE PADRE TO PROCEDURE CREE_CUENTA_PUC;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE CREE_CUENTA_PUC;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE CRONOLOGICO_CONTA;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE CRONOLOGICO_CONTA;
GRANT SELECT, REFERENCES ON TIPO_COMPROBANTE TO PROCEDURE CRONOLOGICO_CONTA;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE CUENTAS_ARTICULOS;
GRANT INSERT ON CONTABIL_ARTICULO TO PROCEDURE CUENTAS_ARTICULOS;
GRANT SELECT, REFERENCES ON GRUPO TO PROCEDURE CUENTAS_ARTICULOS;
GRANT SELECT ON CUENTAS TO PROCEDURE CUENTA_AFECTABLE;
GRANT EXECUTE ON PROCEDURE VALIDE_NIVEL TO PROCEDURE CUENTA_AFECTABLE;
GRANT SELECT ON CUENTAS_NIIF TO PROCEDURE CUENTA_INTERFAZ_NIIF;
GRANT EXECUTE ON PROCEDURE ERRORINT TO PROCEDURE CUENTA_INTERFAZ_NIIF;
GRANT SELECT, UPDATE ON CUENTAS TO PROCEDURE CUENTA_MAL_AFECTABLE;
GRANT SELECT ON CLIENTES TO PROCEDURE CUPO_DISPONIBLE;
GRANT EXECUTE ON PROCEDURE VENCIDO_CLIENTE TO PROCEDURE CUPO_DISPONIBLE;
GRANT SELECT, REFERENCES ON ANTICIPOS_PROVEEDOR TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT SELECT ON EGRESOS_DETALLE TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON MOVIMIENTO_PROVEEDOR TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CXPAGAR TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO PROCEDURE CXPAGAR_PROVEEDOR;
GRANT SELECT ON TERCEROS TO PROCEDURE DATOS_VEHICULO;
GRANT SELECT ON TIPO_VEHICULO TO PROCEDURE DATOS_VEHICULO;
GRANT SELECT ON VEHICULOS TO PROCEDURE DATOS_VEHICULO;
GRANT SELECT ON VEHICULO_CARROCERIA TO PROCEDURE DATOS_VEHICULO;
GRANT SELECT ON VEHICULO_LINEA TO PROCEDURE DATOS_VEHICULO;
GRANT SELECT ON VEHICULO_MARCA TO PROCEDURE DATOS_VEHICULO;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE DESENSAMBLES_SIN_CONTABILIDAD;
GRANT SELECT ON DESENSAMBLES TO PROCEDURE DESENSAMBLES_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_INVENTARIO TO PROCEDURE DESENSAMBLES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE DESENSAMBLES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_DESENSAMBLE TO PROCEDURE DESENSAMBLES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE DESENSAMBLES_SIN_CONTABILIDAD;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE DETALLE_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE DETALLE_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE DETALLE_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE DETALLE_COMPRAS_ARTICULO;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE DETALLE_COMPRAS_PROVEEDOR;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE DETALLE_COMPRAS_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE TOTAL_DOC_COMPRA TO PROCEDURE DETALLE_COMPRAS_PROVEEDOR;
GRANT SELECT ON ARTICULO TO PROCEDURE DETALLE_DEVOLUCIONES_POS;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE DETALLE_DEVOLUCIONES_POS;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE DETALLE_DEVOLUCIONES_POS;
GRANT SELECT ON FACTURAS TO PROCEDURE DETALLE_DEVOLUCIONES_POS;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE DETALLE_DEVOLUCIONES_POS;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE DETALLE_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE DETALLE_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE DETALLE_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE DETALLE_VENTAS_ARTICULO;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE DETALLE_VENTAS_ARTICULO;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE DETALLE_VENTAS_ARTICULO_VEND;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE DETALLE_VENTAS_ARTICULO_VEND;
GRANT SELECT ON FACTURAS TO PROCEDURE DETALLE_VENTAS_ARTICULO_VEND;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE DETALLE_VENTAS_ARTICULO_VEND;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE DETALLE_VENTAS_CLIENTE;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE DETALLE_VENTAS_CLIENTE;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE DETALLE_VENTAS_CLIENTE;
GRANT EXECUTE ON PROCEDURE TOTAL_DOC_VENTAS TO PROCEDURE DETALLE_VENTAS_CLIENTE;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE DETALLE_VENTAS_VENDEDOR;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE DETALLE_VENTAS_VENDEDOR;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE DETALLE_VENTAS_VENDEDOR;
GRANT EXECUTE ON PROCEDURE TOTAL_DOC_VENTAS TO PROCEDURE DETALLE_VENTAS_VENDEDOR;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_COMPRAS TO PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_DEVOLCOMP TO PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_VENTAS TO PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_DEVOLCLI TO PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD;
GRANT SELECT ON AJUSTES TO PROCEDURE DIFERENCIAS_CONTEO;
GRANT SELECT ON AJUSTES_DETALLE TO PROCEDURE DIFERENCIAS_CONTEO;
GRANT SELECT ON ARTICULO TO PROCEDURE DIFERENCIAS_CONTEO;
GRANT SELECT ON ESTRUCTURA TO PROCEDURE DIGITOS_NIVEL;
GRANT EXECUTE ON PROCEDURE PROMEDIO_SALIDAS_ARTICULO TO PROCEDURE DISPONIBILIDAD_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE DISPONIBILIDAD_ARTICULO;
GRANT EXECUTE ON PROCEDURE PROMEDIO_TOTAL_ARTICULO TO PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO;
GRANT SELECT ON CONFIRMACION_DEPOSITO TO PROCEDURE DOCCOMPRA_X_IMPORT;
GRANT SELECT ON ORDEN_EMBARQUE TO PROCEDURE DOCCOMPRA_X_IMPORT;
GRANT SELECT ON SOLICITUD_IMPORTACION TO PROCEDURE DOCCOMPRA_X_IMPORT;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE DOCCOMPRA_X_IMPORT;
GRANT EXECUTE ON PROCEDURE TOTAL_DOC_IMPORT TO PROCEDURE DOCCOMPRA_X_IMPORT;
GRANT SELECT ON CONSOLIDE_FALTANTES TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT SELECT ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT SELECT, REFERENCES ON COTIZACION_PROVEEDOR TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE TOTAL_DOC_COMPRA TO PROCEDURE DOCCOMPRA_X_PROVEEDOR;
GRANT SELECT ON AJUSTES TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON CONSIGNA TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON CONSIGNA_TARJETAS TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON DESENSAMBLES TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON EGRESOS TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON ENSAMBLES TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON ENTRADAS TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON FACTURAS TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON NOTAS_CREDITO TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON NOTAS_DEBITO TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON SALIDAS TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON TRASLADOS TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON TRASLADOS_CAJA TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE DOCUMENTOS_SIN_CONTABILIZAR;
GRANT SELECT ON CONSOLIDE_FALTANTES TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT EXECUTE ON PROCEDURE TOTAL_DOC_VENTAS TO PROCEDURE DOCVENTAS_X_CLIENTE;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE EGRESOS_SIN_CONTABILIDAD;
GRANT SELECT ON EGRESOS TO PROCEDURE EGRESOS_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_CAJA TO PROCEDURE EGRESOS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE EGRESOS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_EGRESO TO PROCEDURE EGRESOS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE EGRESOS_SIN_CONTABILIDAD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE ENSAMBLES_SIN_CONTABILIDAD;
GRANT SELECT ON ENSAMBLES TO PROCEDURE ENSAMBLES_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_INVENTARIO TO PROCEDURE ENSAMBLES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE ENSAMBLES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_ENSAMBLE TO PROCEDURE ENSAMBLES_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE ENSAMBLES_SIN_CONTABILIDAD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE ENTRADAS_SIN_CONTABILIDAD;
GRANT SELECT ON ENTRADAS TO PROCEDURE ENTRADAS_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_INVENTARIO TO PROCEDURE ENTRADAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE ENTRADAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_ENTRADA TO PROCEDURE ENTRADAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE ENTRADAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_ANO;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT ON DEVOLUCION_CHEQUES TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT ON FACTURAS TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT ON PREFIJOS TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT ON SUCURSALES TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT ON VENDEDORES TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE ESTADISTICA_VENTAS_VENDEDOR_MES;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE ESTADO_FLUJO_EFECTIVO;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE ESTADO_FLUJO_EFECTIVO;
GRANT SELECT, REFERENCES ON FLUJO_EFECTIVO TO PROCEDURE ESTADO_FLUJO_EFECTIVO;
GRANT SELECT ON CUENTAS TO PROCEDURE ES_AFECTABLE;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE EXISTENCIAS;
GRANT SELECT, REFERENCES ON EXISTENCIA TO PROCEDURE EXISTENCIAS;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE EXISTENCIAS;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE EXISTENCIAS_BAJO_MINIMO;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE EXISTENCIAS_BAJO_MINIMO;
GRANT SELECT, REFERENCES ON EXISTENCIA TO PROCEDURE EXISTENCIAS_BAJO_MINIMO;
GRANT SELECT ON GRUPO TO PROCEDURE EXISTENCIAS_BAJO_MINIMO;
GRANT SELECT ON MARCAS TO PROCEDURE EXISTENCIAS_BAJO_MINIMO;
GRANT SELECT, REFERENCES ON MOVIMIENTO_ARTICULO TO PROCEDURE EXISTENCIAS_BAJO_MINIMO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE EXISTENCIAS_BAJO_MINIMO;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE EXISTENCIAS_BAJO_MINIMO;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE EXISTENCIAS_BAJO_MINIMO;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT, REFERENCES ON EXISTENCIA TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT, REFERENCES ON ORDENES_INVENTARIO TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT, REFERENCES ON ORDENINVENTARIO_DETALLE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON PEDIDOS TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT, REFERENCES ON RESERVAS TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT, REFERENCES ON RESERVAS_DETALLE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE PROMEDIO_SALIDAS_ARTICULO TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT EXECUTE ON PROCEDURE VENTAS_ARTICULO TO PROCEDURE EXISTENCIAS_COMPRAS;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON EXISTENCIA TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON GRUPO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON LOTES TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON MARCAS TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON MOVIMIENTO_ARTICULO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA_DETALLE TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON ORDENES_INVENTARIO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON ORDENINVENTARIO_DETALLE TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON RESERVAS TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON RESERVAS_DETALLE TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON SUBGRUPO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO_UNIDAD TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_TOTAL_INV TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE VALOR_INICIAL_INVENTARIO TO PROCEDURE EXISTENCIAS_DESDE_HASTA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT, REFERENCES ON EXISTENCIA TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT, REFERENCES ON ORDENES_INVENTARIO TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT, REFERENCES ON ORDENINVENTARIO_DETALLE TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT ON PEDIDOS TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT, REFERENCES ON RESERVAS TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT, REFERENCES ON RESERVAS_DETALLE TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE EXISTENCIAS_UNIDAD;
GRANT SELECT ON CENTROS TO PROCEDURE EXISTE_CENTRO;
GRANT SELECT ON CUENTAS TO PROCEDURE EXISTE_CUENTA;
GRANT SELECT ON TERCEROS TO PROCEDURE EXISTE_TERCERO;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE EXPORTA_FACTURAS;
GRANT SELECT, REFERENCES ON CONTABIL_ARTICULO TO PROCEDURE EXPORTA_FACTURAS;
GRANT SELECT, REFERENCES ON COSTO_VENTAS TO PROCEDURE EXPORTA_FACTURAS;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE EXPORTA_FACTURAS;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE EXPORTA_FACTURAS;
GRANT SELECT, REFERENCES ON INTERFAZ_VENTAS TO PROCEDURE EXPORTA_FACTURAS;
GRANT SELECT, REFERENCES ON PREFIJOS TO PROCEDURE EXPORTA_FACTURAS;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE EXPORTA_FACTURAS;
GRANT EXECUTE ON PROCEDURE COSTO_EN_VENTAS TO PROCEDURE EXPORTA_FACTURAS;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE EXPORTA_FACTURAS;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE FACTCOMP_SIN_CONTABILIDAD;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE FACTCOMP_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_COMPRAS TO PROCEDURE FACTCOMP_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE FACTCOMP_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTCOMP TO PROCEDURE FACTCOMP_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE FACTCOMP_SIN_CONTABILIDAD;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE FACTOR_UNIDAD_CANT;
GRANT INSERT ON ERRORES TO PROCEDURE FACTOR_UNIDAD_CANT;
GRANT SELECT, REFERENCES ON UNIDAD_ARTICULO TO PROCEDURE FACTOR_UNIDAD_CANT;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE FACTOR_UNIDAD_PRE;
GRANT SELECT, REFERENCES ON UNIDAD_ARTICULO TO PROCEDURE FACTOR_UNIDAD_PRE;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE FACTURAS_SIN_CONTABILIDAD;
GRANT SELECT ON FACTURAS TO PROCEDURE FACTURAS_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_VENTAS TO PROCEDURE FACTURAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE FACTURAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_FACTURA TO PROCEDURE FACTURAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE FACTURAS_SIN_CONTABILIDAD;
GRANT SELECT, UPDATE ON FACTURAS_DETALLE TO PROCEDURE FACTURAS_SIN_MOV;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE FACTURAS_SIN_MOV;
GRANT SELECT ON CONSOLIDADO_FALTANTES TO PROCEDURE FALTANTE;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE FALTANTE;
GRANT SELECT ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE FALTANTE;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE FALTANTE;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE FALTANTE;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE FALTANTE;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE FALTANTE;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE FALTANTE;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO PROCEDURE FALTANTE;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON COTIZACION_PROVEEDOR TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA_DETALLE TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT ON PREFIJOS TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR_DET TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE FALTANTES_COMPRAS_ARTICULO;
GRANT SELECT ON ARTICULO TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON COTIZACIONES TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON FACTURAS TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON FACTURAS_DETALLE 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 PEDIDOS TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON PREFIJOS TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE FALTANTES_VENTAS_ARTICULO;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE FALTANTE_DOCUMENTO;
GRANT SELECT ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE FALTANTE_DOCUMENTO;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE FALTANTE_DOCUMENTO;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE FALTANTE_DOCUMENTO;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE FALTANTE_DOCUMENTO;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE FALTANTE_DOCUMENTO;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE FALTANTE_DOCUMENTO;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO PROCEDURE FALTANTE_DOCUMENTO;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE FALTANTE_DOCUMENTO;
GRANT SELECT ON LOTES TO PROCEDURE FECHAS_ANTERIORES_LOTE;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE FECHA_Y_NUMERO_CONTA;
GRANT EXECUTE ON PROCEDURE DIAS_MES TO PROCEDURE FECHA_Y_NUMERO_CONTA;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE FIN_DE_MES;
GRANT EXECUTE ON PROCEDURE DIAS_MES TO PROCEDURE FIN_DE_MES;
GRANT SELECT ON ARTICULO TO PROCEDURE FORMULA_PRECIOS;
GRANT SELECT ON LISTA_PRECIOS TO PROCEDURE FORMULA_PRECIOS;
GRANT SELECT, UPDATE ON PRECIOS_ARTICULO TO PROCEDURE FORMULA_PRECIOS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE FORMULA_PRECIOS;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE FORMULA_PRECIOS;
GRANT SELECT, REFERENCES ON AJUSTES TO PROCEDURE IMPR_AJUSTE;
GRANT SELECT, REFERENCES ON AJUSTES_DETALLE TO PROCEDURE IMPR_AJUSTE;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_AJUSTE;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_AJUSTE;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE IMPR_AJUSTE;
GRANT SELECT, REFERENCES ON ANTICIPOS_CLIENTE TO PROCEDURE IMPR_ANTICLIE;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE IMPR_ANTICLIE;
GRANT SELECT, REFERENCES ON COBRADORES TO PROCEDURE IMPR_ANTICLIE;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_ANTICLIE;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE IMPR_ANTICLIE;
GRANT SELECT ON ANTICIPOS_PROVEEDOR TO PROCEDURE IMPR_ANTIPROV;
GRANT SELECT ON PROVEEDORES TO PROCEDURE IMPR_ANTIPROV;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_ANTIPROV;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE TO PROCEDURE IMPR_APLICLIE;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE_DETALLE TO PROCEDURE IMPR_APLICLIE;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE IMPR_APLICLIE;
GRANT SELECT, REFERENCES ON COBRADORES TO PROCEDURE IMPR_APLICLIE;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_APLICLIE;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE IMPR_APLICLIE;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE IMPR_APLICLIE;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE IMPR_APLICLIE;
GRANT SELECT, REFERENCES ON APLICACION_PROVEDOR TO PROCEDURE IMPR_APLIPROV;
GRANT SELECT, REFERENCES ON APLICACION_PROVEEDOR_DETALLE TO PROCEDURE IMPR_APLIPROV;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE IMPR_APLIPROV;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_APLIPROV;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE IMPR_APLIPROV;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE IMPR_APLIPROV;
GRANT SELECT ON ARQUEO_CAJA TO PROCEDURE IMPR_ARQUEO;
GRANT SELECT ON ARQUEO_CAJA_DET TO PROCEDURE IMPR_ARQUEO;
GRANT SELECT ON DENOMINACIONES TO PROCEDURE IMPR_ARQUEO;
GRANT SELECT ON CAJAS TO PROCEDURE IMPR_CAMBDOCU;
GRANT SELECT ON CAMBIODOC_ENTRADAS TO PROCEDURE IMPR_CAMBDOCU;
GRANT SELECT ON CAMBIO_DOCUMENTOS TO PROCEDURE IMPR_CAMBDOCU;
GRANT SELECT ON FORMAS_PAGO TO PROCEDURE IMPR_CAMBDOCU;
GRANT SELECT ON ACTIVOS_FIJOS TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON ARTICULO TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT, REFERENCES ON CENTROS TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT, REFERENCES ON PROYECTOS TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT, REFERENCES ON TIPO_COMPROBANTE TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE IMPR_COMPROBANTE;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_COMPROBANTE;
GRANT SELECT, REFERENCES ON BANCOS TO PROCEDURE IMPR_CONSIGNA;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE IMPR_CONSIGNA;
GRANT SELECT, REFERENCES ON CONSIGNA TO PROCEDURE IMPR_CONSIGNA;
GRANT SELECT, REFERENCES ON CONSIGNA_DETALLE TO PROCEDURE IMPR_CONSIGNA;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE IMPR_CONSIGNA;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE IMPR_CONSIGNA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_CONSIGNA;
GRANT SELECT ON BANCOS TO PROCEDURE IMPR_CONSIGNATAR;
GRANT SELECT ON CAJAS TO PROCEDURE IMPR_CONSIGNATAR;
GRANT SELECT ON CONSIGNA_TARJETAS TO PROCEDURE IMPR_CONSIGNATAR;
GRANT SELECT ON CONSIGNA_TARJETAS_DET TO PROCEDURE IMPR_CONSIGNATAR;
GRANT SELECT ON CUENTAS_BANCO TO PROCEDURE IMPR_CONSIGNATAR;
GRANT SELECT ON FORMAS_PAGO TO PROCEDURE IMPR_CONSIGNATAR;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE IMPR_CONTABILIZACION;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE IMPR_CONTABILIZACION;
GRANT SELECT ON CONTABILIZACION TO PROCEDURE IMPR_CONTABILIZACION;
GRANT SELECT ON CONTABILIZACION_DET TO PROCEDURE IMPR_CONTABILIZACION;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_COTIPROV;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_COTIPROV;
GRANT SELECT, REFERENCES ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE IMPR_COTIPROV;
GRANT SELECT, REFERENCES ON COTIZACION_PROVEEDOR TO PROCEDURE IMPR_COTIPROV;
GRANT SELECT, REFERENCES ON GRUPOS_PROVEEDORES TO PROCEDURE IMPR_COTIPROV;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE IMPR_COTIPROV;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPR_COTIPROV;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_COTIPROV;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_COTIZACION;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE IMPR_COTIZACION;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE IMPR_COTIZACION;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE IMPR_COTIZACION;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO PROCEDURE IMPR_COTIZACION;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPR_COTIZACION;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_COTIZACION;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE IMPR_COTIZACION;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE IMPR_COTIZACION;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_COTIZACION;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_DESENSAMBLE;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_DESENSAMBLE;
GRANT SELECT, REFERENCES ON DESENSAMBLES TO PROCEDURE IMPR_DESENSAMBLE;
GRANT SELECT, REFERENCES ON DESENSAMBLES_DETALLE TO PROCEDURE IMPR_DESENSAMBLE;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_DEVOLPROV;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_DEVOLPROV;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE IMPR_DEVOLPROV;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE IMPR_DEVOLPROV;
GRANT SELECT, REFERENCES ON GRUPOS_PROVEEDORES TO PROCEDURE IMPR_DEVOLPROV;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE IMPR_DEVOLPROV;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPR_DEVOLPROV;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_DEVOLPROV;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_DEVOLUCION;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_DEVOLUCION;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE IMPR_DEVOLUCION;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE IMPR_DEVOLUCION;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE IMPR_DEVOLUCION;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO PROCEDURE IMPR_DEVOLUCION;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPR_DEVOLUCION;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_DEVOLUCION;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE IMPR_DEVOLUCION;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE IMPR_DEVOLUCION;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_DEVOLUCION;
GRANT SELECT ON AJUSTES TO PROCEDURE IMPR_DIFERENCIAS_CONTEO;
GRANT SELECT ON AJUSTES_DETALLE TO PROCEDURE IMPR_DIFERENCIAS_CONTEO;
GRANT SELECT ON ARTICULO TO PROCEDURE IMPR_DIFERENCIAS_CONTEO;
GRANT SELECT ON BODEGA TO PROCEDURE IMPR_DIFERENCIAS_CONTEO;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE IMPR_DIFERENCIAS_CONTEO;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE IMPR_EGRESO;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE IMPR_EGRESO;
GRANT SELECT, REFERENCES ON EGRESOS TO PROCEDURE IMPR_EGRESO;
GRANT SELECT, REFERENCES ON EGRESOS_BANCO TO PROCEDURE IMPR_EGRESO;
GRANT SELECT, REFERENCES ON EGRESOS_CAJA TO PROCEDURE IMPR_EGRESO;
GRANT SELECT, REFERENCES ON EGRESOS_DETALLE TO PROCEDURE IMPR_EGRESO;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE IMPR_EGRESO;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE IMPR_EGRESO;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE IMPR_EGRESO;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_EGRESO;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE IMPR_EGRESO;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO PROCEDURE IMPR_EGRESO;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_ENSAMBLE;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_ENSAMBLE;
GRANT SELECT, REFERENCES ON ENSAMBLES TO PROCEDURE IMPR_ENSAMBLE;
GRANT SELECT, REFERENCES ON ENSAMBLES_DETALLE TO PROCEDURE IMPR_ENSAMBLE;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_ENTRADA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_ENTRADA;
GRANT SELECT, REFERENCES ON ENTRADAS TO PROCEDURE IMPR_ENTRADA;
GRANT SELECT, REFERENCES ON ENTRADAS_DETALLE TO PROCEDURE IMPR_ENTRADA;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE IMPR_ENTRADA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_ENTRADA;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_FACTCOMP;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_FACTCOMP;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE IMPR_FACTCOMP;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE IMPR_FACTCOMP;
GRANT SELECT, REFERENCES ON GRUPOS_PROVEEDORES TO PROCEDURE IMPR_FACTCOMP;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE IMPR_FACTCOMP;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPR_FACTCOMP;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_FACTCOMP;
GRANT SELECT ON ARTICULO TO PROCEDURE IMPR_FACTPRO;
GRANT SELECT ON BODEGA TO PROCEDURE IMPR_FACTPRO;
GRANT SELECT ON FACTURA_PROFORMA TO PROCEDURE IMPR_FACTPRO;
GRANT SELECT ON FACTURA_PROFORMA_DET TO PROCEDURE IMPR_FACTPRO;
GRANT SELECT ON GRUPOS_PROVEEDORES TO PROCEDURE IMPR_FACTPRO;
GRANT SELECT ON PROVEEDORES TO PROCEDURE IMPR_FACTPRO;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_FACTPRO;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_FACTPRO;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON AUDITORIA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE IMPR_FACTURA;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON FORMAS_PAGO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON GRUPO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON LOTES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON MARCAS TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON NOMBRES_COPIAS TO PROCEDURE IMPR_FACTURA;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON RECIBOS_CAJA_PAGO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT ON SUBGRUPO TO PROCEDURE IMPR_FACTURA;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPR_FACTURA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_FACTURA;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE IMPR_FACTURA;
GRANT SELECT, REFERENCES ON ZONAS 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 EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_FACTURA;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT ON CAMBIODOC_SALIDAS TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT ON CAMBIO_DOCUMENTOS TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT, REFERENCES ON EGRESOS TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT, REFERENCES ON EGRESOS_BANCO TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT, REFERENCES ON EGRESOS_CAJA TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_PAGO TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT ON RECIBO_PROVISIONAL TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT ON RECIBO_PROVISIONAL_PAGO TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE IMPR_FORMAPAGO;
GRANT SELECT ON CARGA_REMESA TO PROCEDURE IMPR_MANIFIESTO;
GRANT SELECT ON CIUDADES TO PROCEDURE IMPR_MANIFIESTO;
GRANT SELECT ON MANIFIESTO_CARGA TO PROCEDURE IMPR_MANIFIESTO;
GRANT SELECT ON MANIFIESTO_CARGA_DET TO PROCEDURE IMPR_MANIFIESTO;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_MANIFIESTO;
GRANT SELECT ON VEHICULOS TO PROCEDURE IMPR_MANIFIESTO;
GRANT SELECT ON APLICACION_CLIENTE_DETALLE TO PROCEDURE IMPR_NOTACRCL;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE IMPR_NOTACRCL;
GRANT SELECT, REFERENCES ON COBRADORES TO PROCEDURE IMPR_NOTACRCL;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_CLIENTES TO PROCEDURE IMPR_NOTACRCL;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_NOTACRCL;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE IMPR_NOTACRCL;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE IMPR_NOTACRCL;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE IMPR_NOTACRPR;
GRANT SELECT ON PROVEEDORES TO PROCEDURE IMPR_NOTACRPR;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_NOTACRPR;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE IMPR_NOTADBCL;
GRANT SELECT, REFERENCES ON COBRADORES TO PROCEDURE IMPR_NOTADBCL;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_CLIENTES TO PROCEDURE IMPR_NOTADBCL;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_NOTADBCL;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE IMPR_NOTADBCL;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE IMPR_NOTADBPR;
GRANT SELECT ON PROVEEDORES TO PROCEDURE IMPR_NOTADBPR;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_NOTADBPR;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_ORDENCMP;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_ORDENCMP;
GRANT SELECT, REFERENCES ON GRUPOS_PROVEEDORES TO PROCEDURE IMPR_ORDENCMP;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA TO PROCEDURE IMPR_ORDENCMP;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA_DETALLE TO PROCEDURE IMPR_ORDENCMP;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE IMPR_ORDENCMP;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPR_ORDENCMP;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_ORDENCMP;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_ORDENINV;
GRANT SELECT ON BODEGA TO PROCEDURE IMPR_ORDENINV;
GRANT SELECT, REFERENCES ON ORDENES_INVENTARIO TO PROCEDURE IMPR_ORDENINV;
GRANT SELECT, REFERENCES ON ORDENINVENTARIO_DETALLE TO PROCEDURE IMPR_ORDENINV;
GRANT SELECT ON PARQUEADERO TO PROCEDURE IMPR_PARQUEADERO;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_PARQUEADERO;
GRANT SELECT ON TIPO_VEHICULO TO PROCEDURE IMPR_PARQUEADERO;
GRANT SELECT ON VEHICULOS TO PROCEDURE IMPR_PARQUEADERO;
GRANT SELECT ON VEHICULO_LINEA TO PROCEDURE IMPR_PARQUEADERO;
GRANT SELECT ON VEHICULO_MARCA TO PROCEDURE IMPR_PARQUEADERO;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_PEDIDO;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE IMPR_PEDIDO;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE IMPR_PEDIDO;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE IMPR_PEDIDO;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO PROCEDURE IMPR_PEDIDO;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPR_PEDIDO;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_PEDIDO;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE IMPR_PEDIDO;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE IMPR_PEDIDO;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_PEDIDO;
GRANT SELECT ON CONCEPTOS_PLANILLA TO PROCEDURE IMPR_PLANCONCEPTO;
GRANT SELECT ON PLANILLA_PASAJEROS_CON TO PROCEDURE IMPR_PLANCONCEPTO;
GRANT SELECT ON PLANILLA_PASAJEROS TO PROCEDURE IMPR_PLANILLA;
GRANT SELECT ON PLANILLA_PASAJEROS_DET TO PROCEDURE IMPR_PLANILLA;
GRANT SELECT ON RUTA_PASAJEROS TO PROCEDURE IMPR_PLANILLA;
GRANT SELECT ON TERCEROS TO PROCEDURE IMPR_PLANILLA;
GRANT SELECT ON TIPO_VEHICULO TO PROCEDURE IMPR_PLANILLA;
GRANT SELECT ON TIQUETE_PASAJERO TO PROCEDURE IMPR_PLANILLA;
GRANT SELECT ON VEHICULOS TO PROCEDURE IMPR_PLANILLA;
GRANT SELECT ON VENDEDORES TO PROCEDURE IMPR_PLANILLA;
GRANT SELECT ON CARGA_REMESA TO PROCEDURE IMPR_PLANREMESA;
GRANT SELECT ON CIUDADES TO PROCEDURE IMPR_PLANREMESA;
GRANT SELECT ON PLANILLA_PASAJEROS_REM TO PROCEDURE IMPR_PLANREMESA;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE IMPR_RECICAJA;
GRANT SELECT, REFERENCES ON COBRADORES TO PROCEDURE IMPR_RECICAJA;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE IMPR_RECICAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO PROCEDURE IMPR_RECICAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_DETALLE TO PROCEDURE IMPR_RECICAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_PAGO TO PROCEDURE IMPR_RECICAJA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_RECICAJA;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE IMPR_RECICAJA;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE IMPR_RECICAJA;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE IMPR_RECICJPAGO;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_PAGO TO PROCEDURE IMPR_RECICJPAGO;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE IMPR_RECIPROV;
GRANT SELECT, REFERENCES ON COBRADORES TO PROCEDURE IMPR_RECIPROV;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL TO PROCEDURE IMPR_RECIPROV;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL_DETALLE TO PROCEDURE IMPR_RECIPROV;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_RECIPROV;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE IMPR_RECIPROV;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE IMPR_RECIPROV;
GRANT SELECT ON CARGA_PRODUCTOS TO PROCEDURE IMPR_REMESA;
GRANT SELECT ON CARGA_REMESA TO PROCEDURE IMPR_REMESA;
GRANT SELECT ON CIUDADES TO PROCEDURE IMPR_REMESA;
GRANT SELECT ON TIPO_VEHICULO TO PROCEDURE IMPR_REMESA;
GRANT SELECT ON VEHICULOS TO PROCEDURE IMPR_REMESA;
GRANT SELECT ON VENDEDORES TO PROCEDURE IMPR_REMESA;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_REMIPROV;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_REMIPROV;
GRANT SELECT, REFERENCES ON GRUPOS_PROVEEDORES TO PROCEDURE IMPR_REMIPROV;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE IMPR_REMIPROV;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR TO PROCEDURE IMPR_REMIPROV;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR_DET TO PROCEDURE IMPR_REMIPROV;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPR_REMIPROV;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_REMIPROV;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE IMPR_REMISION;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_REMISION;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON GRUPO TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON LOTES TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON MARCAS TO PROCEDURE IMPR_REMISION;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO PROCEDURE IMPR_REMISION;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE IMPR_REMISION;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE IMPR_REMISION;
GRANT SELECT ON SUBGRUPO TO PROCEDURE IMPR_REMISION;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPR_REMISION;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPR_REMISION;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE IMPR_REMISION;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE IMPR_REMISION;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_REMISION;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_RESERVA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_RESERVA;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE IMPR_RESERVA;
GRANT SELECT, REFERENCES ON RESERVAS TO PROCEDURE IMPR_RESERVA;
GRANT SELECT, REFERENCES ON RESERVAS_DETALLE TO PROCEDURE IMPR_RESERVA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_RESERVA;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_SALIDA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_SALIDA;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE IMPR_SALIDA;
GRANT SELECT, REFERENCES ON SALIDAS TO PROCEDURE IMPR_SALIDA;
GRANT SELECT, REFERENCES ON SALIDAS_DETALLE TO PROCEDURE IMPR_SALIDA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_SALIDA;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE IMPR_SALIDA;
GRANT SELECT ON RUTA_PASAJEROS TO PROCEDURE IMPR_TIQUETE;
GRANT SELECT ON TIPO_VEHICULO TO PROCEDURE IMPR_TIQUETE;
GRANT SELECT ON TIQUETE_PASAJERO TO PROCEDURE IMPR_TIQUETE;
GRANT SELECT ON VEHICULOS TO PROCEDURE IMPR_TIQUETE;
GRANT SELECT ON VENDEDORES TO PROCEDURE IMPR_TIQUETE;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE IMPR_TRASFERENCIA;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE IMPR_TRASFERENCIA;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE IMPR_TRASFERENCIA;
GRANT SELECT, REFERENCES ON TRASFERENCIAS TO PROCEDURE IMPR_TRASFERENCIA;
GRANT SELECT, REFERENCES ON TRASFERENCIAS_DETALLE TO PROCEDURE IMPR_TRASFERENCIA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE IMPR_TRASFERENCIA;
GRANT SELECT ON CAJAS TO PROCEDURE IMPR_TRASLACAJA;
GRANT SELECT ON FORMAS_PAGO TO PROCEDURE IMPR_TRASLACAJA;
GRANT SELECT ON TRASLADOS_CAJA TO PROCEDURE IMPR_TRASLACAJA;
GRANT SELECT ON TRASLADOS_CAJA_DET TO PROCEDURE IMPR_TRASLACAJA;
GRANT SELECT ON BANCOS TO PROCEDURE IMPR_TRASLADOBCO;
GRANT SELECT ON CUENTAS_BANCO TO PROCEDURE IMPR_TRASLADOBCO;
GRANT SELECT ON TRASLADOS TO PROCEDURE IMPR_TRASLADOBCO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE IMPUESTOS_COMPRAS;
GRANT SELECT ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE IMPUESTOS_COMPRAS;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE IMPUESTOS_COMPRAS;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE IMPUESTOS_COMPRAS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE IMPUESTOS_COMPRAS;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE IMPUESTOS_COMPRAS;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE IMPUESTOS_COMPRAS;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE IMPUESTOS_VENTAS;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE IMPUESTOS_VENTAS;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE IMPUESTOS_VENTAS;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE IMPUESTOS_VENTAS;
GRANT SELECT, REFERENCES ON TARIFA_IVA TO PROCEDURE IMPUESTOS_VENTAS;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE IMPUESTOS_VENTAS;
GRANT INSERT ON SALDOS_INICIALES TO PROCEDURE INSERTE_SALDO_INICIAL;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE INVENTARIO_Y_BALANCE;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE INVENTARIO_Y_BALANCE;
GRANT EXECUTE ON PROCEDURE ES_AFECTABLE TO PROCEDURE INVENTARIO_Y_BALANCE;
GRANT EXECUTE ON PROCEDURE SALDO_ARTICULO_MES TO PROCEDURE INVENTARIO_Y_BALANCE;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE INVENTARIO_Y_BALANCE;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE INVENTARIO_Y_BALANCE;
GRANT SELECT, REFERENCES ON COSTOS TO PROCEDURE KARDEX_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE KARDEX_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE VALOR_INICIAL_INVENTARIO TO PROCEDURE KARDEX_ARTICULO_MES;
GRANT SELECT, REFERENCES ON COSTOS TO PROCEDURE KARDEX_DESDE_HASTA;
GRANT SELECT, REFERENCES ON MOVIMIENTO_ARTICULO TO PROCEDURE KARDEX_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_TOTAL_INV TO PROCEDURE KARDEX_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE VALOR_INICIAL_INVENTARIO TO PROCEDURE KARDEX_DESDE_HASTA;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE KARDEX_INVENTARIO_MES;
GRANT EXECUTE ON PROCEDURE KARDEX_ARTICULO_MES TO PROCEDURE KARDEX_INVENTARIO_MES;
GRANT SELECT ON CONFIGURACION TO PROCEDURE LEE_CONFIGURACION;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE LIBRO_DIARIO;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE LIBRO_DIARIO;
GRANT SELECT ON CUENTAS TO PROCEDURE LIBRO_DIARIO;
GRANT SELECT ON TIPO_COMPROBANTE TO PROCEDURE LIBRO_DIARIO;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE LIBRO_DIARIO;
GRANT EXECUTE ON PROCEDURE DIGITOS_NIVEL TO PROCEDURE LIBRO_DIARIO;
GRANT EXECUTE ON PROCEDURE FIN_DE_MES TO PROCEDURE LIBRO_DIARIO;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE LIBRO_DIARIO;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE LIBRO_DIARIO_CUENTA;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE LIBRO_DIARIO_CUENTA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE LIBRO_DIARIO_CUENTA;
GRANT SELECT, REFERENCES ON TIPO_COMPROBANTE TO PROCEDURE LIBRO_DIARIO_CUENTA;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE LIBRO_DIARIO_CUENTA;
GRANT EXECUTE ON PROCEDURE FIN_DE_MES TO PROCEDURE LIBRO_DIARIO_CUENTA;
GRANT SELECT ON PARQUEADERO TO PROCEDURE LIQ_PARQUEADERO;
GRANT SELECT ON TIPO_VEHICULO TO PROCEDURE LIQ_PARQUEADERO;
GRANT SELECT, REFERENCES ON LISTA_PRECIOS TO PROCEDURE LISTAS_ARTICULO;
GRANT SELECT, REFERENCES ON PRECIOS_ARTICULO TO PROCEDURE LISTAS_ARTICULO;
GRANT SELECT ON LOTES TO PROCEDURE LISTA_LOTES;
GRANT SELECT ON ESTRUCTURA TO PROCEDURE MAX_NIVEL;
GRANT SELECT ON LOTES TO PROCEDURE MAYOR_SALDO_LOTE;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE MAYOR_Y_BALANCE;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_MES TO PROCEDURE MAYOR_Y_BALANCE;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE MAYOR_Y_BALANCE;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE MAYOR_Y_BALANCE;
GRANT SELECT, REFERENCES ON CIUDADES TO PROCEDURE MEDIOS_MAGNETICOS;
GRANT SELECT, REFERENCES ON COMPROBANTE_DETALLE TO PROCEDURE MEDIOS_MAGNETICOS;
GRANT SELECT, REFERENCES ON COMPROBANTE_ENCABEZADO TO PROCEDURE MEDIOS_MAGNETICOS;
GRANT SELECT, REFERENCES ON CONFIGURA_MEDIOSMAG TO PROCEDURE MEDIOS_MAGNETICOS;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE MEDIOS_MAGNETICOS;
GRANT SELECT, REFERENCES ON SALDOS_TERCEROS TO PROCEDURE MEDIOS_MAGNETICOS;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE MEDIOS_MAGNETICOS;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE MEDIOS_MAGNETICOS;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES TO PROCEDURE MEDIOS_MAGNETICOS;
GRANT SELECT, REFERENCES ON CIUDADES TO PROCEDURE MEDIOS_MAGNETICOS2;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE MEDIOS_MAGNETICOS2;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE MEDIOS_MAGNETICOS2;
GRANT EXECUTE ON PROCEDURE ES_AFECTABLE TO PROCEDURE MEDIOS_MAGNETICOS2;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE MEDIOS_MAGNETICOS2;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA TO PROCEDURE MEDIOS_MAGNETICOS2;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE MEDIOS_MAGNETICOS2;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES TO PROCEDURE MEDIOS_MAGNETICOS2;
GRANT SELECT ON ARTICULO TO PROCEDURE MERCANCIA_EN_TRANSITO;
GRANT SELECT ON BODEGA TO PROCEDURE MERCANCIA_EN_TRANSITO;
GRANT SELECT ON GRUPO TO PROCEDURE MERCANCIA_EN_TRANSITO;
GRANT SELECT ON MARCAS TO PROCEDURE MERCANCIA_EN_TRANSITO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE MERCANCIA_EN_TRANSITO;
GRANT SELECT ON TRASFERENCIAS TO PROCEDURE MERCANCIA_EN_TRANSITO;
GRANT SELECT ON TRASFERENCIAS_DETALLE TO PROCEDURE MERCANCIA_EN_TRANSITO;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE MINIMO_ARTICULO;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE MINIMO_ARTICULO;
GRANT EXECUTE ON PROCEDURE PROMEDIO_SALIDAS_ARTICULO TO PROCEDURE MINIMO_ARTICULO;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE MM_1001;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE MM_1001;
GRANT SELECT ON CONFIGURA_MEDIOSMAG TO PROCEDURE MM_1001;
GRANT INSERT ON MEDIOS_MAGNETICOS_DATOS TO PROCEDURE MM_1001;
GRANT SELECT ON TERCEROS TO PROCEDURE MM_1001;
GRANT SELECT ON TIPO_ID TO PROCEDURE MM_1001;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE MM_1002;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE MM_1002;
GRANT SELECT ON CONFIGURA_MEDIOSMAG TO PROCEDURE MM_1002;
GRANT INSERT ON MEDIOS_MAGNETICOS_DATOS TO PROCEDURE MM_1002;
GRANT SELECT ON TERCEROS TO PROCEDURE MM_1002;
GRANT SELECT ON TIPO_ID TO PROCEDURE MM_1002;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE MM_1003;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE MM_1003;
GRANT SELECT ON CONFIGURA_MEDIOSMAG TO PROCEDURE MM_1003;
GRANT INSERT ON MEDIOS_MAGNETICOS_DATOS TO PROCEDURE MM_1003;
GRANT SELECT ON TERCEROS TO PROCEDURE MM_1003;
GRANT SELECT ON TIPO_ID TO PROCEDURE MM_1003;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE MM_1005;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE MM_1005;
GRANT INSERT ON MEDIOS_MAGNETICOS_DATOS TO PROCEDURE MM_1005;
GRANT SELECT ON TERCEROS TO PROCEDURE MM_1005;
GRANT SELECT ON TIPO_ID TO PROCEDURE MM_1005;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE MM_1006;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE MM_1006;
GRANT INSERT ON MEDIOS_MAGNETICOS_DATOS TO PROCEDURE MM_1006;
GRANT SELECT ON TERCEROS TO PROCEDURE MM_1006;
GRANT SELECT ON TIPO_ID TO PROCEDURE MM_1006;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE MM_1007;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE MM_1007;
GRANT SELECT ON CONFIGURA_MEDIOSMAG TO PROCEDURE MM_1007;
GRANT INSERT ON MEDIOS_MAGNETICOS_DATOS TO PROCEDURE MM_1007;
GRANT SELECT ON TERCEROS TO PROCEDURE MM_1007;
GRANT SELECT ON TIPO_ID TO PROCEDURE MM_1007;
GRANT SELECT ON CONFIGURA_MEDIOSMAG TO PROCEDURE MM_1008;
GRANT INSERT ON MEDIOS_MAGNETICOS_DATOS TO PROCEDURE MM_1008;
GRANT SELECT, REFERENCES ON SALDOS_TERCEROS TO PROCEDURE MM_1008;
GRANT SELECT ON TERCEROS TO PROCEDURE MM_1008;
GRANT SELECT ON TIPO_ID TO PROCEDURE MM_1008;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES TO PROCEDURE MM_1008;
GRANT SELECT ON CONFIGURA_MEDIOSMAG TO PROCEDURE MM_1009;
GRANT INSERT ON MEDIOS_MAGNETICOS_DATOS TO PROCEDURE MM_1009;
GRANT SELECT, REFERENCES ON SALDOS_TERCEROS TO PROCEDURE MM_1009;
GRANT SELECT ON TERCEROS TO PROCEDURE MM_1009;
GRANT SELECT ON TIPO_ID TO PROCEDURE MM_1009;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES TO PROCEDURE MM_1009;
GRANT SELECT ON CONFIGURA_MEDIOSMAG TO PROCEDURE MM_1011;
GRANT INSERT ON MEDIOS_MAGNETICOS_DATOS TO PROCEDURE MM_1011;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA TO PROCEDURE MM_1011;
GRANT SELECT ON CONFIGURA_MEDIOSMAG TO PROCEDURE MM_1012;
GRANT INSERT ON MEDIOS_MAGNETICOS_DATOS TO PROCEDURE MM_1012;
GRANT SELECT, REFERENCES ON SALDOS_TERCEROS TO PROCEDURE MM_1012;
GRANT SELECT ON TERCEROS TO PROCEDURE MM_1012;
GRANT SELECT ON TIPO_ID TO PROCEDURE MM_1012;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA TO PROCEDURE MM_1012;
GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES TO PROCEDURE MM_1012;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE MOVARTI_CANTIDADES;
GRANT SELECT ON PREFIJOS TO PROCEDURE MOVARTI_CANTIDADES;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE MOVARTI_CANTIDADES;
GRANT SELECT ON SALDOS_ARTICULO TO PROCEDURE MOVIMIENTO_ARTICULOC_MES;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE MOVIMIENTO_ARTICULO_DESDE_HASTA;
GRANT SELECT, REFERENCES 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, REFERENCES ON MOVIMIENTO_ARTICULO 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_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE MOVIMIENTO_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE MOVIMIENTO_ARTICULO_MES;
GRANT SELECT, REFERENCES ON MOVIMIENTO_BANCO TO PROCEDURE MOVIMIENTO_BANCO_MES;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE MOVIMIENTO_BANCO_MES;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_BANCO TO PROCEDURE MOVIMIENTO_BANCO_MES;
GRANT SELECT, REFERENCES ON EGRESOS TO PROCEDURE MOVIMIENTO_CAJA_MES;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CAJA TO PROCEDURE MOVIMIENTO_CAJA_MES;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO PROCEDURE MOVIMIENTO_CAJA_MES;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE MOVIMIENTO_CAJA_MES;
GRANT EXECUTE ON PROCEDURE SALDO_EN_CAJA TO PROCEDURE MOVIMIENTO_CAJA_MES;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA;
GRANT SELECT ON RECIBO_PROVISIONAL_DETALLE TO PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA;
GRANT SELECT ON TERCEROS TO PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE MOVIMIENTO_CARTERA_DESDE_HASTA;
GRANT SELECT ON AUTORIZACIONES TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CLIENTES TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE MOVIMIENTO_CARTERA_MES;
GRANT SELECT ON SALDOS_CENTROS TO PROCEDURE MOVIMIENTO_CENTRO_MES;
GRANT EXECUTE ON PROCEDURE CADENA_MES TO PROCEDURE MOVIMIENTO_CENTRO_MES;
GRANT SELECT ON SALDOS_CUENTAS TO PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE DIAS_MES TO PROCEDURE MOVIMIENTO_CUENTA_DESDE_HASTA;
GRANT SELECT ON SALDOS_CUENTAS TO PROCEDURE MOVIMIENTO_CUENTA_MES;
GRANT EXECUTE ON PROCEDURE CADENA_MES TO PROCEDURE MOVIMIENTO_CUENTA_MES;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA;
GRANT SELECT ON MOVIMIENTO_PROVEEDOR TO PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA;
GRANT SELECT ON TERCEROS TO PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA;
GRANT EXECUTE ON PROCEDURE SALDO_PROVEEDOR TO PROCEDURE MOVIMIENTO_CXPAGAR_DESDE_HASTA;
GRANT SELECT ON MOVIMIENTO_PROVEEDOR TO PROCEDURE MOVIMIENTO_CXPAGAR_MES;
GRANT SELECT ON TERCEROS TO PROCEDURE MOVIMIENTO_CXPAGAR_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE MOVIMIENTO_CXPAGAR_MES;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE MOVIMIENTO_CXPAGAR_MES;
GRANT EXECUTE ON PROCEDURE SALDO_PROVEEDOR TO PROCEDURE MOVIMIENTO_CXPAGAR_MES;
GRANT SELECT ON ARTICULO TO PROCEDURE MOVIMIENTO_INVENTARIO_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES TO PROCEDURE MOVIMIENTO_INVENTARIO_MES;
GRANT SELECT ON SALDOS_CUENTAS TO PROCEDURE MOVIMIENTO_NETO_CUENTA_MES;
GRANT SELECT, REFERENCES ON SALDOS_TERCEROS TO PROCEDURE MOVIMIENTO_TERCERO_MES;
GRANT SELECT ON BODEGA TO PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_ARTICULO_MES TO PROCEDURE MOVIMIENTO_TOTAL_ARTICULO_MES;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE MOVLOTES_DESDE_HASTA;
GRANT SELECT ON PREFIJOS TO PROCEDURE MOVLOTES_DESDE_HASTA;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE MOVLOTES_DESDE_HASTA;
GRANT SELECT, REFERENCES ON CHEQUES TO PROCEDURE MOV_DETALLE_BANCOS;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE MOV_DETALLE_BANCOS;
GRANT SELECT, REFERENCES ON MOVIMIENTO_BANCO TO PROCEDURE MOV_DETALLE_BANCOS;
GRANT SELECT, REFERENCES ON RETIROS TO PROCEDURE MOV_DETALLE_BANCOS;
GRANT SELECT, REFERENCES ON SALDO_BANCOS TO PROCEDURE MOV_DETALLE_BANCOS;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE MOV_DETALLE_BANCOS;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_BANCO TO PROCEDURE MOV_DETALLE_BANCOS;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT, REFERENCES ON CAMBIODOC_ENTRADAS TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT, REFERENCES ON CAMBIODOC_SALIDAS TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT, REFERENCES ON CONSIGNA_DETALLE TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT ON EGRESOS TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT, REFERENCES ON EGRESOS_CAJA TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CAJA TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_PAGO TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT ON RECIBO_PROVISIONAL TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL_PAGO TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT, REFERENCES ON SALDO_CAJA TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT ON TERCEROS TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT, REFERENCES ON TRASLADOS_CAJA_DET TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT EXECUTE ON PROCEDURE SALDO_EN_CAJA TO PROCEDURE MOV_DETALLE_CAJAS;
GRANT SELECT ON CONFIGURACION TO PROCEDURE NOMBRE_COMPANIA;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE NOTACRCL_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_CARTERA TO PROCEDURE NOTACRCL_SIN_CONTABILIDAD;
GRANT SELECT ON NOTAS_CREDITO_CLIENTES TO PROCEDURE NOTACRCL_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE NOTACRCL_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTACRCL TO PROCEDURE NOTACRCL_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE NOTACRCL_SIN_CONTABILIDAD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE NOTACRPR_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_CARTERA TO PROCEDURE NOTACRPR_SIN_CONTABILIDAD;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE NOTACRPR_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE NOTACRPR_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTACRPR TO PROCEDURE NOTACRPR_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE NOTACRPR_SIN_CONTABILIDAD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE NOTADBCL_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_CARTERA TO PROCEDURE NOTADBCL_SIN_CONTABILIDAD;
GRANT SELECT ON NOTAS_DEBITO_CLIENTES TO PROCEDURE NOTADBCL_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE NOTADBCL_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTADBCL TO PROCEDURE NOTADBCL_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE NOTADBCL_SIN_CONTABILIDAD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE NOTADBPR_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_CARTERA TO PROCEDURE NOTADBPR_SIN_CONTABILIDAD;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE NOTADBPR_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE NOTADBPR_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTADBPR TO PROCEDURE NOTADBPR_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE NOTADBPR_SIN_CONTABILIDAD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE NOTASCRBC_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_BANCOS TO PROCEDURE NOTASCRBC_SIN_CONTABILIDAD;
GRANT SELECT ON NOTAS_CREDITO TO PROCEDURE NOTASCRBC_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE NOTASCRBC_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTACRBC TO PROCEDURE NOTASCRBC_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE NOTASCRBC_SIN_CONTABILIDAD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE NOTASDBBC_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_BANCOS TO PROCEDURE NOTASDBBC_SIN_CONTABILIDAD;
GRANT SELECT ON NOTAS_DEBITO TO PROCEDURE NOTASDBBC_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE NOTASDBBC_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_NOTADBBC TO PROCEDURE NOTASDBBC_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE NOTASDBBC_SIN_CONTABILIDAD;
GRANT SELECT, UPDATE ON COMPROBANTE_DETALLE TO PROCEDURE NROBANCO_REF_EGRESOS;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE NROBANCO_REF_EGRESOS;
GRANT SELECT ON EGRESOS_BANCO TO PROCEDURE NROBANCO_REF_EGRESOS;
GRANT SELECT ON ENTRADAS TO PROCEDURE NUM_ENT;
GRANT SELECT, UPDATE ON MOVIMIENTO_ARTICULO TO PROCEDURE NUM_ENT;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE ORDENES_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE ORDENES_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE ORDENES_ARTICULO;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA TO PROCEDURE ORDENES_ARTICULO;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA_DETALLE TO PROCEDURE ORDENES_ARTICULO;
GRANT SELECT, REFERENCES ON ORDENES_INVENTARIO TO PROCEDURE ORDENES_ARTICULO;
GRANT SELECT, REFERENCES ON ORDENINVENTARIO_DETALLE TO PROCEDURE ORDENES_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE ORDENES_ARTICULO;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE ORDENES_ARTICULO;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE ORDENES_ARTICULO;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE ORDENES_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO PROCEDURE ORDENES_ARTICULO;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE ORDENES_ARTICULO_FECHA;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE ORDENES_ARTICULO_FECHA;
GRANT SELECT, REFERENCES ON ORDENES_INVENTARIO TO PROCEDURE ORDENES_ARTICULO_FECHA;
GRANT SELECT, REFERENCES ON ORDENINVENTARIO_DETALLE TO PROCEDURE ORDENES_ARTICULO_FECHA;
GRANT SELECT ON TERCEROS TO PROCEDURE ORDENES_ARTICULO_FECHA;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE ORDENES_ARTICULO_FECHA;
GRANT SELECT ON ARTICULO TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON BODEGA TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON EXISTENCIA TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON ORDENES_INVENTARIO TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON ORDENINVENTARIO_DETALLE TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON PEDIDOS TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON PROVEEDOR_ARTICULO TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON RESERVAS TO PROCEDURE ORDEN_SUGERIDA;
GRANT SELECT ON RESERVAS_DETALLE TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE PROMEDIO_SALIDAS_ARTICULO TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE VENTAS_ARTICULO TO PROCEDURE ORDEN_SUGERIDA;
GRANT EXECUTE ON PROCEDURE DIGITOS_NIVEL TO PROCEDURE PADRE;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE PADRE;
GRANT SELECT, REFERENCES ON PRECIOS_ARTICULO TO PROCEDURE PRECIOS_UNIDAD;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_PRE TO PROCEDURE PRECIOS_UNIDAD;
GRANT SELECT, REFERENCES ON PRECIOS_ARTICULO TO PROCEDURE PRECIOS_Y_EXISTENCIA;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE PRECIOS_Y_EXISTENCIA;
GRANT SELECT, REFERENCES ON CUENTAS TO PROCEDURE PRESUPUESTO_MES;
GRANT SELECT, REFERENCES ON PRESUPUESTO TO PROCEDURE PRESUPUESTO_MES;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_MES TO PROCEDURE PRESUPUESTO_MES;
GRANT SELECT ON ARTICULO TO PROCEDURE PROMEDIO_SALIDAS_ARTICULO;
GRANT SELECT, REFERENCES ON MOVIMIENTO_ARTICULO TO PROCEDURE PROMEDIO_SALIDAS_ARTICULO;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE PROMEDIO_SALIDAS_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE PROMEDIO_SALIDAS_ARTICULO;
GRANT SELECT, REFERENCES ON MOVIMIENTO_ARTICULO TO PROCEDURE PROMEDIO_TOTAL_ARTICULO;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE PROMEDIO_TOTAL_ARTICULO;
GRANT SELECT, INSERT ON PROVEEDORES TO PROCEDURE PROVEEDORES_SIN_REGISTRO;
GRANT SELECT ON TERCEROS TO PROCEDURE PROVEEDORES_SIN_REGISTRO;
GRANT SELECT ON COMISIONES TO PROCEDURE RECALCULO_COMISIONES_VENTAS;
GRANT SELECT, UPDATE ON FACTURAS TO PROCEDURE RECALCULO_COMISIONES_VENTAS;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE RECALCULO_COMISIONES_VENTAS;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE RECIBOS_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_CAJA TO PROCEDURE RECIBOS_SIN_CONTABILIDAD;
GRANT SELECT ON RECIBOS_CAJA TO PROCEDURE RECIBOS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE RECIBOS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_RECICAJA TO PROCEDURE RECIBOS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE RECIBOS_SIN_CONTABILIDAD;
GRANT SELECT ON FACTURAS TO PROCEDURE RECONTABILICE_COSTOS_VENTAS;
GRANT SELECT ON INTERFAZ_VENTAS TO PROCEDURE RECONTABILICE_COSTOS_VENTAS;
GRANT EXECUTE ON PROCEDURE CONTABILICE_COSTO_VENTAS TO PROCEDURE RECONTABILICE_COSTOS_VENTAS;
GRANT SELECT ON CIUDADES TO PROCEDURE RECUPERACION_CARTERA;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE RECUPERACION_CARTERA;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE RECUPERACION_CARTERA;
GRANT SELECT ON COBRADORES TO PROCEDURE RECUPERACION_CARTERA;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CLIENTES TO PROCEDURE RECUPERACION_CARTERA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE RECUPERACION_CARTERA;
GRANT SELECT ON ZONAS TO PROCEDURE RECUPERACION_CARTERA;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE RECUPERACION_CARTERA;
GRANT SELECT, UPDATE ON CHEQUES TO PROCEDURE RECUPERA_NUMERO_CHEQUE;
GRANT SELECT ON MOVIMIENTO_BANCO TO PROCEDURE RECUPERA_NUMERO_CHEQUE;
GRANT SELECT, UPDATE ON MOVIMIENTO_PROVEEDOR TO PROCEDURE REDONDEE_NOTAS_PROVEEDOR;
GRANT SELECT, UPDATE ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE REDONDEE_NOTAS_PROVEEDOR;
GRANT SELECT, UPDATE ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE REDONDEE_NOTAS_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REDONDEE_NOTAS_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE REDONDEE_NOTAS_PROVEEDOR;
GRANT INSERT ON COMPROBANTE_DETALLE TO PROCEDURE REGISTRE_REGIAUTO;
GRANT INSERT ON COMPROBANTE_ENCABEZADO TO PROCEDURE REGISTRE_REGIAUTO;
GRANT SELECT ON CONCEPTOS TO PROCEDURE REGISTRE_REGIAUTO;
GRANT SELECT ON CONCEPTOS_CUENTAS TO PROCEDURE REGISTRE_REGIAUTO;
GRANT SELECT ON REGISTRO_AUTOMATICO TO PROCEDURE REGISTRE_REGIAUTO;
GRANT SELECT ON REGISTRO_CONCEPTOS TO PROCEDURE REGISTRE_REGIAUTO;
GRANT EXECUTE ON PROCEDURE CAMBIE_ID_COMPROBA TO PROCEDURE REGISTRE_REGIAUTO;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE REGISTRE_REGIAUTO;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_CUENTA_MES TO PROCEDURE REGISTRE_REGIAUTO;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE REGISTRE_REGIAUTO;
GRANT SELECT, INSERT, DELETE ON ANALISIS_ABCINVEN TO PROCEDURE REP_ABC_INVENTARIO;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_ABC_INVENTARIO;
GRANT SELECT ON GRUPO TO PROCEDURE REP_ABC_INVENTARIO;
GRANT SELECT ON MARCAS TO PROCEDURE REP_ABC_INVENTARIO;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE REP_ABC_INVENTARIO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_ABC_INVENTARIO;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_ABC_INVENTARIO;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE REP_ABC_INVENTARIO;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT ON COBRADORES TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT ON GRUPO_CARTERA TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CLIENTES TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT ON RECIBO_PROVISIONAL TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT ON RECIBO_PROVISIONAL_PAGO TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CARTERA TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT ON ZONAS TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE REP_ANALISIS_CARTERA;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE REP_ANALISIS_CXPAGAR;
GRANT SELECT ON GRUPOS_PROVEEDORES TO PROCEDURE REP_ANALISIS_CXPAGAR;
GRANT SELECT, REFERENCES ON MOVIMIENTO_PROVEEDOR TO PROCEDURE REP_ANALISIS_CXPAGAR;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE REP_ANALISIS_CXPAGAR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE REP_ANALISIS_CXPAGAR;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CXPAGAR TO PROCEDURE REP_ANALISIS_CXPAGAR;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_ANALISIS_CXPAGAR;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_ANALISIS_CXPAGAR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_ANALISIS_CXPAGAR;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO PROCEDURE REP_ANALISIS_CXPAGAR;
GRANT SELECT ON APLICACION_CLIENTE TO PROCEDURE REP_APLICACLI;
GRANT SELECT ON APLICACION_CLIENTE_DETALLE TO PROCEDURE REP_APLICACLI;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_APLICACLI;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE REP_APLICAPROV;
GRANT SELECT ON APLICACION_PROVEEDOR_DETALLE TO PROCEDURE REP_APLICAPROV;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_APLICAPROV;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT ON GRUPO TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT ON MARCAS TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT ON ZONAS TO PROCEDURE REP_ARTICULOS_CLIENTE;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON COTIZACION_PROVEEDOR TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT ON GRUPO TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT ON GRUPOS_PROVEEDORES TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT ON MARCAS TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA_DETALLE TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR_DET TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_ARTICULOS_PROVEEDOR;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON CLIENTES TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE 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, REFERENCES ON PEDIDOS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON ZONAS TO PROCEDURE REP_ARTICULOS_VENDEDOR;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_ARTICULO_BARRAS;
GRANT SELECT ON BARRAS_ARTICULO TO PROCEDURE REP_ARTICULO_BARRAS;
GRANT SELECT ON GRUPO TO PROCEDURE REP_ARTICULO_BARRAS;
GRANT SELECT ON MARCAS TO PROCEDURE REP_ARTICULO_BARRAS;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_ARTICULO_BARRAS;
GRANT SELECT, REFERENCES ON ANTICIPOS_CLIENTE TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON CIUDADES TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON COBRADORES TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT ON GRUPO_CARTERA TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CLIENTES TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT ON NOTAS_CLIENTES TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_CLIENTES TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_CLIENTES TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT ON RECIBO_PROVISIONAL TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT ON RECIBO_PROVISIONAL_PAGO TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CARTERA TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE REP_CARTERA_CLIENTES;
GRANT SELECT, REFERENCES ON ANTICIPOS_CLIENTE TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON CIUDADES TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON COBRADORES TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT ON GRUPO_CARTERA TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CLIENTES TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_CLIENTES TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_CLIENTES TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT ON RECIBOS_CAJA_DETALLE TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT ON RECIBO_PROVISIONAL TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CARTERA TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE REP_CARTERA_CONSOLIDADA;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON CLIENTES TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON COBRADORES TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON GRUPO_CARTERA TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON NOTAS_CLIENTES TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON RECIBO_PROVISIONAL TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON ZONAS TO PROCEDURE REP_CARTERA_NOTAS;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE REP_CARTERA_NOTAS;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON CLIENTES TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON COBRADORES TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON LISTA_PRECIOS TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON VENDEDORES TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON ZONAS TO PROCEDURE REP_CLIENTES;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON COTIZACION_PROVEEDOR TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON REMISION_PROVEEDOR TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_COMPRAS_ARTICULO;
GRANT SELECT, REFERENCES ON COTIZACION_PROVEEDOR TO PROCEDURE REP_COMPRAS_PROVEEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE REP_COMPRAS_PROVEEDOR;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE REP_COMPRAS_PROVEEDOR;
GRANT SELECT ON GRUPOS_PROVEEDORES TO PROCEDURE REP_COMPRAS_PROVEEDOR;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA TO PROCEDURE REP_COMPRAS_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE REP_COMPRAS_PROVEEDOR;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR TO PROCEDURE REP_COMPRAS_PROVEEDOR;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_COMPRAS_PROVEEDOR;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_COMPRAS_PROVEEDOR;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_COMPROBANTES_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE REP_COMPROBANTES_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE REP_COMPROBANTES_ARTICULO;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE REP_COMPROBANTES_ARTICULO;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_COMPROBANTES_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_COMPROBANTES_ARTICULO;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_COMPROBANTES_ARTICULO;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_COMPROBANTES_ARTICULO;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REP_COMPROBANTES_ARTICULO;
GRANT SELECT, REFERENCES ON CHEQUES TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON CONSIGNA TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON CONSIGNA_DETALLE TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON DEVOLUCION_CHEQUES TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON RETIROS TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON TRASLADOS TO PROCEDURE REP_COMPROBANTES_BANCOS;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON CAMBIODOC_ENTRADAS TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON CAMBIODOC_SALIDAS TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON CAMBIO_DOCUMENTOS TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON CONSIGNA_TARJETAS TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON CONSIGNA_TARJETAS_DET TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON EGRESOS TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON EGRESOS_BANCO TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON EGRESOS_CAJA TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_PAGO TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL_PAGO TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON TRASLADOS_CAJA TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON TRASLADOS_CAJA_DET TO PROCEDURE REP_COMPROBANTES_CAJA;
GRANT SELECT, REFERENCES ON ANTICIPOS_CLIENTE TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE_DETALLE TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT, REFERENCES ON COBRADORES TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_CLIENTES TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_CLIENTES TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE REP_COMPROBANTES_CARTERA;
GRANT SELECT ON BODEGA TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON COTIZACION_PROVEEDOR TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON REMISION_PROVEEDOR TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_COMPROBANTES_CMP;
GRANT SELECT ON ANTICIPOS_PROVEEDOR TO PROCEDURE REP_COMPROBANTES_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE REP_COMPROBANTES_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEEDOR_DETALLE TO PROCEDURE REP_COMPROBANTES_CXPAGAR;
GRANT SELECT ON GRUPOS_PROVEEDORES TO PROCEDURE REP_COMPROBANTES_CXPAGAR;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE REP_COMPROBANTES_CXPAGAR;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE REP_COMPROBANTES_CXPAGAR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_COMPROBANTES_CXPAGAR;
GRANT SELECT ON PROVEEDORES TO PROCEDURE REP_COMPROBANTES_CXPAGAR;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_COMPROBANTES_CXPAGAR;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_COMPROBANTES_CXPAGAR;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE REP_COMPROBANTES_FAC;
GRANT SELECT ON AJUSTES TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON AJUSTES_DETALLE TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON BODEGA TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON DESENSAMBLES TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON DESENSAMBLES_DETALLE TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON ENSAMBLES TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON ENSAMBLES_DETALLE TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON ENTRADAS TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON ENTRADAS_DETALLE TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON ORDENES_INVENTARIO TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON ORDENINVENTARIO_DETALLE TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON RESERVAS TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON RESERVAS_DETALLE TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON SALIDAS TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON SALIDAS_DETALLE TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON TRASFERENCIAS TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT ON TRASFERENCIAS_DETALLE TO PROCEDURE REP_COMPROBANTES_INV;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REP_COMPROBANTES_INV;
GRANT SELECT, REFERENCES ON CHEQUES TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON CONSIGNA TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON CONSIGNA_DETALLE TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON DEVOLUCION_CHEQUES TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON RETIROS TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON TRASLADOS TO PROCEDURE REP_CONSECUTIVOS_BANCOS;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON CAMBIODOC_ENTRADAS TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON CAMBIODOC_SALIDAS TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON CAMBIO_DOCUMENTOS TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON CONSIGNA_TARJETAS TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON CONSIGNA_TARJETAS_DET TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON EGRESOS TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON EGRESOS_BANCO TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON EGRESOS_CAJA TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_PAGO TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL_PAGO TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON TRASLADOS_CAJA TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON TRASLADOS_CAJA_DET TO PROCEDURE REP_CONSECUTIVOS_CAJA;
GRANT SELECT, REFERENCES ON ANTICIPOS_CLIENTE TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE_DETALLE TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT, REFERENCES ON COBRADORES TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_CLIENTES TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_CLIENTES TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT, REFERENCES ON ZONAS TO PROCEDURE REP_CONSECUTIVOS_CARTERA;
GRANT SELECT ON BODEGA TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON COTIZACION_PROVEEDOR TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON DEVOLUCIONES_COMPRAS TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON REMISION_PROVEEDOR TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_CONSECUTIVOS_CMP;
GRANT SELECT ON ANTICIPOS_PROVEEDOR TO PROCEDURE REP_CONSECUTIVOS_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE REP_CONSECUTIVOS_CXPAGAR;
GRANT SELECT ON APLICACION_PROVEEDOR_DETALLE TO PROCEDURE REP_CONSECUTIVOS_CXPAGAR;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE REP_CONSECUTIVOS_CXPAGAR;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE REP_CONSECUTIVOS_CXPAGAR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_CONSECUTIVOS_CXPAGAR;
GRANT SELECT ON PROVEEDORES TO PROCEDURE REP_CONSECUTIVOS_CXPAGAR;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_CONSECUTIVOS_CXPAGAR;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_CONSECUTIVOS_CXPAGAR;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON PUNTO_VENTA TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE REP_CONSECUTIVOS_FAC;
GRANT SELECT, REFERENCES ON AJUSTES TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON AJUSTES_DETALLE TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON DESENSAMBLES TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON DESENSAMBLES_DETALLE TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON ENSAMBLES TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON ENSAMBLES_DETALLE TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON ENTRADAS TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON ENTRADAS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON ORDENES_INVENTARIO TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON ORDENINVENTARIO_DETALLE TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON RESERVAS TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON RESERVAS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON SALIDAS TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON SALIDAS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON TRASFERENCIAS TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON TRASFERENCIAS_DETALLE TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REP_CONSECUTIVOS_INV;
GRANT SELECT, REFERENCES ON BANCOS TO PROCEDURE REP_CONSIGNACIONES;
GRANT SELECT, REFERENCES ON CONSIGNA TO PROCEDURE REP_CONSIGNACIONES;
GRANT SELECT, REFERENCES ON CONSIGNA_DETALLE TO PROCEDURE REP_CONSIGNACIONES;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE REP_CONSIGNACIONES;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE REP_CONSIGNACIONES;
GRANT SELECT, REFERENCES ON ANTICIPOS_PROVEEDOR TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON CIUDADES TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT ON EGRESOS_DETALLE TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON GRUPOS_PROVEEDORES TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON MOVIMIENTO_PROVEEDOR TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CXPAGAR TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO PROCEDURE REP_CXPAGAR_CONSOLIDADAS;
GRANT SELECT, REFERENCES ON ANTICIPOS_PROVEEDOR TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT ON EGRESOS_DETALLE TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT ON GRUPOS_PROVEEDORES TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON MOVIMIENTO_PROVEEDOR TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CXPAGAR TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CXPAGAR TO PROCEDURE REP_CXPAGAR_PROVEEDOR;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_DISPONIBILIDAD;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE REP_DISPONIBILIDAD;
GRANT SELECT ON FACTURAS_COMPRA TO PROCEDURE REP_DISPONIBILIDAD;
GRANT SELECT ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE REP_DISPONIBILIDAD;
GRANT SELECT, REFERENCES ON GRUPO TO PROCEDURE REP_DISPONIBILIDAD;
GRANT SELECT, REFERENCES ON MARCAS TO PROCEDURE REP_DISPONIBILIDAD;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE REP_DISPONIBILIDAD;
GRANT SELECT, REFERENCES ON SUBGRUPO TO PROCEDURE REP_DISPONIBILIDAD;
GRANT EXECUTE ON PROCEDURE DISPONIBILIDAD_ARTICULO TO PROCEDURE REP_DISPONIBILIDAD;
GRANT EXECUTE ON PROCEDURE DISPONIBILIDAD_TOTAL_ARTICULO TO PROCEDURE REP_DISPONIBILIDAD;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE REP_DISPONIBILIDAD;
GRANT SELECT, REFERENCES ON ANTICIPOS_CLIENTE TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT, REFERENCES ON APLICACION_CLIENTE_DETALLE TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT ON COBRADORES TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_CLIENTES TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_CLIENTES TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT ON ZONAS TO PROCEDURE REP_DOCUMENTOS_CLIENTE;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE REP_DOCUMENTOS_ENCAJA;
GRANT SELECT, REFERENCES ON DEVOLUCION_CHEQUES TO PROCEDURE REP_DOCUMENTOS_ENCAJA;
GRANT SELECT, REFERENCES ON DOCUMENTOS_PAGO_CAJA TO PROCEDURE REP_DOCUMENTOS_ENCAJA;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE REP_DOCUMENTOS_ENCAJA;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA TO PROCEDURE REP_DOCUMENTOS_ENCAJA;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL TO PROCEDURE REP_DOCUMENTOS_ENCAJA;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_DOCUMENTOS_ENCAJA;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_DOCUMENTOS_ENCAJA;
GRANT EXECUTE ON PROCEDURE SALDO_EN_EFECTIVO TO PROCEDURE REP_DOCUMENTOS_ENCAJA;
GRANT SELECT ON ANTICIPOS_PROVEEDOR TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON APLICACION_PROVEDOR TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON APLICACION_PROVEEDOR_DETALLE TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON GRUPOS_PROVEEDORES TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON NOTAS_CREDITO_PROVEEDOR TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON NOTAS_DEBITO_PROVEEDOR TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON PROVEEDORES TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_DOCUMENTOS_PROVEEDOR;
GRANT SELECT ON CLASE_EGRESO TO PROCEDURE REP_EGRESOS;
GRANT SELECT ON BANCOS TO PROCEDURE REP_ESTADO_CUENTA_BANCO;
GRANT SELECT, REFERENCES ON CUENTAS_BANCO TO PROCEDURE REP_ESTADO_CUENTA_BANCO;
GRANT SELECT, REFERENCES ON MOVIMIENTO_BANCO TO PROCEDURE REP_ESTADO_CUENTA_BANCO;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_ESTADO_CUENTA_BANCO;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_BANCO TO PROCEDURE REP_ESTADO_CUENTA_BANCO;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT SELECT, REFERENCES ON BODEGA TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT SELECT, REFERENCES ON GRUPO TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT SELECT, REFERENCES ON LISTA_PRECIOS TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT SELECT, REFERENCES ON MARCAS TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT SELECT, REFERENCES ON PRECIOS_ARTICULO TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT SELECT, REFERENCES ON SUBGRUPO TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_TOTAL_INV TO PROCEDURE REP_EXISTENCIAS_PRECIOS;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE 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, REFERENCES ON PEDIDOS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON ZONAS TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE REP_FALTANTES_CLIENTES;
GRANT SELECT ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE REP_FALTANTES_COMPRA;
GRANT SELECT ON COTIZACION_PROVEEDOR TO PROCEDURE REP_FALTANTES_COMPRA;
GRANT SELECT ON ORDENES_COMPRA TO PROCEDURE REP_FALTANTES_COMPRA;
GRANT SELECT ON ORDENES_COMPRA_DETALLE TO PROCEDURE REP_FALTANTES_COMPRA;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_FALTANTES_COMPRA;
GRANT SELECT ON REMISION_PROVEEDOR TO PROCEDURE REP_FALTANTES_COMPRA;
GRANT SELECT ON REMISION_PROVEEDOR_DET TO PROCEDURE REP_FALTANTES_COMPRA;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_FALTANTES_COMPRA;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE REP_FALTANTES_COMPRA;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON COTIZACION_PROVEEDOR TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRA TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT ON GRUPO TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON GRUPOS_PROVEEDORES TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT ON MARCAS TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA_DETALLE TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON PROVEEDORES TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR_DET TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE REP_FALTANTES_PROVEEDOR;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE 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, REFERENCES ON PEDIDOS TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE REP_FALTANTES_VENDEDOR;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_FALTANTES_VENTA;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE REP_FALTANTES_VENTA;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_KARDEX_ARTICULO;
GRANT SELECT ON COSTOS TO PROCEDURE REP_KARDEX_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE REP_KARDEX_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE REP_KARDEX_ARTICULO;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE REP_KARDEX_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_KARDEX_ARTICULO;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_KARDEX_ARTICULO;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REP_KARDEX_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_TOTAL_INV TO PROCEDURE REP_KARDEX_ARTICULO;
GRANT EXECUTE ON PROCEDURE VALOR_INICIAL_INVENTARIO TO PROCEDURE REP_KARDEX_ARTICULO;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_LISTA_PRECIOS;
GRANT SELECT, REFERENCES ON GRUPO TO PROCEDURE REP_LISTA_PRECIOS;
GRANT SELECT, REFERENCES ON LISTA_PRECIOS TO PROCEDURE REP_LISTA_PRECIOS;
GRANT SELECT, REFERENCES ON MARCAS TO PROCEDURE REP_LISTA_PRECIOS;
GRANT SELECT, REFERENCES ON PRECIOS_ARTICULO TO PROCEDURE REP_LISTA_PRECIOS;
GRANT SELECT, REFERENCES ON SUBGRUPO TO PROCEDURE REP_LISTA_PRECIOS;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE REP_LISTA_PRECIOS;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_LISTA_PRECIOS;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON CAMBIODOC_ENTRADAS TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON CAMBIODOC_SALIDAS TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT ON CONSIGNA_DETALLE TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON DEVOLUCION_CHEQUES TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT ON EGRESOS TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON EGRESOS_CAJA TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON FORMAS_PAGO TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CAJA TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON RECIBOS_CAJA_PAGO TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON RECIBO_PROVISIONAL_PAGO TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON TRASLADOS_CAJA TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT, REFERENCES ON TRASLADOS_CAJA_DET TO PROCEDURE REP_MOVCAJA_DOCUMENTOS;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT, REFERENCES 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, REFERENCES ON MOVIMIENTO_CLIENTES TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT ON ZONAS TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE REP_MOVIMIENTO_CLIENTE;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_MOVIMIENTO_PROVEEDOR;
GRANT SELECT ON GRUPOS_PROVEEDORES TO PROCEDURE REP_MOVIMIENTO_PROVEEDOR;
GRANT SELECT ON MOVIMIENTO_PROVEEDOR TO PROCEDURE REP_MOVIMIENTO_PROVEEDOR;
GRANT SELECT ON PROVEEDORES TO PROCEDURE REP_MOVIMIENTO_PROVEEDOR;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_MOVIMIENTO_PROVEEDOR;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_MOVIMIENTO_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_MOVIMIENTO_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE SALDO_PROVEEDOR TO PROCEDURE REP_MOVIMIENTO_PROVEEDOR;
GRANT SELECT ON ARTICULO 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 SELECT ON GRUPO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON LOTES TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON MOVIMIENTO_ARTICULO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT EXECUTE ON PROCEDURE MOVLOTES_DESDE_HASTA TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE REP_MOVIMIENTO_X_ARTICULO;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_PRODUCTOS;
GRANT SELECT ON ARTICULOS_PRODUCTO TO PROCEDURE REP_PRODUCTOS;
GRANT SELECT ON ESTADO_ARTICULO TO PROCEDURE REP_PRODUCTOS;
GRANT SELECT ON GRUPO TO PROCEDURE REP_PRODUCTOS;
GRANT SELECT ON MARCAS TO PROCEDURE REP_PRODUCTOS;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_PRODUCTOS;
GRANT EXECUTE ON PROCEDURE CANTIDAD_POR_FACTOR TO PROCEDURE REP_PRODUCTOS;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REP_PRODUCTOS;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_RETENCION_CLIENTE;
GRANT SELECT ON CLIENTES TO PROCEDURE REP_RETENCION_CLIENTE;
GRANT SELECT ON CLIENTE_SUCURSALES TO PROCEDURE REP_RETENCION_CLIENTE;
GRANT SELECT ON COBRADORES TO PROCEDURE REP_RETENCION_CLIENTE;
GRANT SELECT ON MOVIMIENTO_CLIENTES TO PROCEDURE REP_RETENCION_CLIENTE;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_RETENCION_CLIENTE;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_RETENCION_CLIENTE;
GRANT SELECT ON ZONAS TO PROCEDURE REP_RETENCION_CLIENTE;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_RETENCION_CLIENTE;
GRANT SELECT ON CIUDADES TO PROCEDURE REP_RETENCION_PROVEEDOR;
GRANT SELECT ON GRUPOS_PROVEEDORES TO PROCEDURE REP_RETENCION_PROVEEDOR;
GRANT SELECT ON MOVIMIENTO_PROVEEDOR TO PROCEDURE REP_RETENCION_PROVEEDOR;
GRANT SELECT ON PROVEEDORES TO PROCEDURE REP_RETENCION_PROVEEDOR;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_RETENCION_PROVEEDOR;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_RETENCION_PROVEEDOR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_RETENCION_PROVEEDOR;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_TERCEROS;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON CLIENTES TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON FACTURAS TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON GRUPO TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON MARCAS TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON TERCEROS TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON ZONAS TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REP_UTILIDAD_CLIENTE;
GRANT SELECT ON ARTICULO TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON FACTURAS TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON GRUPO TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON MARCAS TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT ON VENDEDORES TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REP_UTILIDAD_VENDEDOR;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON COSTOS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE 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 MOVIMIENTO_ARTICULO TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, INSERT, DELETE ON REPORTES_AUX TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE REP_UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE REP_VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON CLIENTES TO PROCEDURE REP_VENTAS_CLIENTE;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE REP_VENTAS_CLIENTE;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_VENTAS_CLIENTE;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE REP_VENTAS_CLIENTE;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE REP_VENTAS_CLIENTE;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_VENTAS_CLIENTE;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE REP_VENTAS_CLIENTE;
GRANT SELECT, REFERENCES ON TERCEROS TO PROCEDURE REP_VENTAS_CLIENTE;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE REP_VENTAS_CLIENTE;
GRANT SELECT ON ZONAS TO PROCEDURE REP_VENTAS_CLIENTE;
GRANT SELECT ON COTIZACIONES TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON FACTURAS TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON PEDIDOS TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON REMISIONES_VENTA TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON TIPO_DOCUMENTO TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT ON VENDEDORES TO PROCEDURE REP_VENTAS_VENDEDOR;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE RESERVAS_ARTICULO;
GRANT SELECT ON GRUPO TO PROCEDURE RESERVAS_ARTICULO;
GRANT SELECT ON MARCAS TO PROCEDURE RESERVAS_ARTICULO;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE RESERVAS_ARTICULO;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE RESERVAS_ARTICULO;
GRANT SELECT, REFERENCES ON RESERVAS TO PROCEDURE RESERVAS_ARTICULO;
GRANT SELECT, REFERENCES ON RESERVAS_DETALLE TO PROCEDURE RESERVAS_ARTICULO;
GRANT SELECT ON SUBGRUPO TO PROCEDURE RESERVAS_ARTICULO;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE RESERVAS_ARTICULO;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE RESERVAS_ARTICULO;
GRANT EXECUTE ON PROCEDURE SALDO_TOTAL_INVENTARIO TO PROCEDURE RESERVAS_ARTICULO;
GRANT SELECT ON PEDIDOS TO PROCEDURE RESERVAS_ARTICULO_FECHA;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE RESERVAS_ARTICULO_FECHA;
GRANT SELECT, REFERENCES ON RESERVAS TO PROCEDURE RESERVAS_ARTICULO_FECHA;
GRANT SELECT, REFERENCES ON RESERVAS_DETALLE TO PROCEDURE RESERVAS_ARTICULO_FECHA;
GRANT EXECUTE ON PROCEDURE FALTANTE TO PROCEDURE RESERVAS_ARTICULO_FECHA;
GRANT SELECT ON ARTICULO TO PROCEDURE RESTE_EXISTENCIA;
GRANT SELECT, INSERT, UPDATE ON EXISTENCIA TO PROCEDURE RESTE_EXISTENCIA;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE RESTE_EXISTENCIA;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDO_BANCOS TO PROCEDURE RESTE_SALDO_BANCO;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_BANCO TO PROCEDURE RESTE_SALDO_BANCO;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDO_CAJA TO PROCEDURE RESTE_SALDO_CAJA;
GRANT SELECT ON SALDO_EFECTIVO TO PROCEDURE RESTE_SALDO_CAJA;
GRANT EXECUTE ON PROCEDURE SALDO_EN_CAJA TO PROCEDURE RESTE_SALDO_CAJA;
GRANT ALL ON SALDO_EFECTIVO TO PROCEDURE RESTE_SALDO_EFECTIVO;
GRANT EXECUTE ON PROCEDURE SALDO_EN_EFECTIVO TO PROCEDURE RESTE_SALDO_EFECTIVO;
GRANT SELECT ON CUENTAS_BANCOS TO PROCEDURE RESUMEN_SALDOS_BANCO;
GRANT SELECT, REFERENCES ON MOVIMIENTO_BANCO TO PROCEDURE RESUMEN_SALDOS_BANCO;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_BANCO TO PROCEDURE RESUMEN_SALDOS_BANCO;
GRANT EXECUTE ON PROCEDURE SALDO_FINAL_CUENTA_BANCO TO PROCEDURE RESUMEN_SALDOS_BANCO;
GRANT SELECT, REFERENCES ON CAJAS TO PROCEDURE RESUMEN_SALDOS_CAJA;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CAJA TO PROCEDURE RESUMEN_SALDOS_CAJA;
GRANT EXECUTE ON PROCEDURE SALDO_EN_CAJA TO PROCEDURE RESUMEN_SALDOS_CAJA;
GRANT EXECUTE ON PROCEDURE SALDO_FINAL_CAJA TO PROCEDURE RESUMEN_SALDOS_CAJA;
GRANT SELECT ON FACTURAS TO PROCEDURE RESUMEN_VENTAS_ARTICULO;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE RESUMEN_VENTAS_ARTICULO;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE RETIROS_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_BANCOS TO PROCEDURE RETIROS_SIN_CONTABILIDAD;
GRANT SELECT ON RETIROS TO PROCEDURE RETIROS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE RETIROS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_RETIRO TO PROCEDURE RETIROS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE RETIROS_SIN_CONTABILIDAD;
GRANT SELECT ON ARTICULO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON LISTA_PRECIOS TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON PRECIOS_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 LEE_CONFIGURACION TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE REVISA_PRECIOS;
GRANT EXECUTE ON PROCEDURE ULTIMO_COSTO TO PROCEDURE REVISA_PRECIOS;
GRANT SELECT ON CUENTAS TO PROCEDURE SALDOS_ARTICULO_CUENTA;
GRANT EXECUTE ON PROCEDURE MOVIMIENTO_ARTICULOC_MES TO PROCEDURE SALDOS_ARTICULO_CUENTA;
GRANT EXECUTE ON PROCEDURE SALDO_ARTICULO_MES TO PROCEDURE SALDOS_ARTICULO_CUENTA;
GRANT SELECT ON SALDOS_ACTIVO TO PROCEDURE SALDO_ACTIVO;
GRANT SELECT ON SALDOS_ARTICULO TO PROCEDURE SALDO_ARTICULO;
GRANT SELECT ON SALDOS_ARTICULO TO PROCEDURE SALDO_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE SALDO_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE FECHA_Y_NUMERO_CONTA TO PROCEDURE SALDO_ARTICULO_MES;
GRANT SELECT, REFERENCES ON SALDOS_CENTROS TO PROCEDURE SALDO_CENTRO;
GRANT SELECT ON SALDOS_CENTROS TO PROCEDURE SALDO_CENTRO_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE SALDO_CENTRO_MES;
GRANT EXECUTE ON PROCEDURE FECHA_Y_NUMERO_CONTA TO PROCEDURE SALDO_CENTRO_MES;
GRANT SELECT ON SALDOS_CENTROS_TERCERO TO PROCEDURE SALDO_CENTRO_TERCERO;
GRANT SELECT ON SALDOS_CUENTAS TO PROCEDURE SALDO_CUENTA;
GRANT SELECT, REFERENCES ON SALDO_BANCOS TO PROCEDURE SALDO_CUENTA_BANCO;
GRANT SELECT, REFERENCES ON SALDOS_CUENTAS TO PROCEDURE SALDO_CUENTA_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE SALDO_CUENTA_MES;
GRANT EXECUTE ON PROCEDURE FECHA_Y_NUMERO_CONTA TO PROCEDURE SALDO_CUENTA_MES;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CARTERA TO PROCEDURE SALDO_DOC_CARTERA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE SALDO_DOC_CARTERA;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CXPAGAR TO PROCEDURE SALDO_DOC_CXPAGAR;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE SALDO_DOC_CXPAGAR;
GRANT SELECT, REFERENCES ON SALDO_CAJA TO PROCEDURE SALDO_EN_CAJA;
GRANT SELECT, REFERENCES ON SALDO_EFECTIVO TO PROCEDURE SALDO_EN_EFECTIVO;
GRANT SELECT, REFERENCES ON SALDO_CAJA TO PROCEDURE SALDO_FINAL_CAJA;
GRANT SELECT ON SALDO_BANCOS TO PROCEDURE SALDO_FINAL_CUENTA_BANCO;
GRANT SELECT ON EXISTENCIA TO PROCEDURE SALDO_INICIAL_INVENTARIO;
GRANT SELECT ON BODEGA TO PROCEDURE SALDO_INICIAL_TOTAL_INV;
GRANT EXECUTE ON PROCEDURE SALDO_INICIAL_INVENTARIO TO PROCEDURE SALDO_INICIAL_TOTAL_INV;
GRANT SELECT ON EXISTENCIA TO PROCEDURE SALDO_INVENTARIO;
GRANT SELECT ON LOTES TO PROCEDURE SALDO_LOTE;
GRANT SELECT, REFERENCES ON SALDOS_TERCEROS TO PROCEDURE SALDO_TERCERO;
GRANT SELECT, REFERENCES ON SALDOS_TERCEROS TO PROCEDURE SALDO_TERCERO_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA_CONTA TO PROCEDURE SALDO_TERCERO_MES;
GRANT EXECUTE ON PROCEDURE FECHA_Y_NUMERO_CONTA TO PROCEDURE SALDO_TERCERO_MES;
GRANT SELECT ON BODEGA TO PROCEDURE SALDO_TOTAL_INVENTARIO;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE SALDO_TOTAL_INVENTARIO;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE SALIDAS_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_INVENTARIO TO PROCEDURE SALIDAS_SIN_CONTABILIDAD;
GRANT SELECT ON SALIDAS TO PROCEDURE SALIDAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE SALIDAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_SALIDA TO PROCEDURE SALIDAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE SALIDAS_SIN_CONTABILIDAD;
GRANT SELECT ON LOTES TO PROCEDURE SELECCIONE_LOTE;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE SELECCIONE_LOTE;
GRANT SELECT ON ARTICULO TO PROCEDURE SUME_EXISTENCIA;
GRANT SELECT, INSERT, UPDATE ON EXISTENCIA TO PROCEDURE SUME_EXISTENCIA;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE SUME_EXISTENCIA;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDO_BANCOS TO PROCEDURE SUME_SALDO_BANCO;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_BANCO TO PROCEDURE SUME_SALDO_BANCO;
GRANT SELECT, INSERT, UPDATE, REFERENCES ON SALDO_CAJA TO PROCEDURE SUME_SALDO_CAJA;
GRANT EXECUTE ON PROCEDURE SALDO_EN_CAJA TO PROCEDURE SUME_SALDO_CAJA;
GRANT ALL ON SALDO_EFECTIVO TO PROCEDURE SUME_SALDO_EFECTIVO;
GRANT EXECUTE ON PROCEDURE SALDO_EN_EFECTIVO TO PROCEDURE SUME_SALDO_EFECTIVO;
GRANT SELECT ON ARTICULO TO PROCEDURE TARIFAS_ENSAMBLE;
GRANT SELECT ON ARTICULOS_PRODUCTO 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 SELECT, REFERENCES ON COTIZACIONES_PROVEEDOR_DET TO PROCEDURE TOTAL_DOC_COMPRA;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_COMPRAS_DET TO PROCEDURE TOTAL_DOC_COMPRA;
GRANT SELECT, REFERENCES ON FACTURAS_COMPRAS_DETALLE TO PROCEDURE TOTAL_DOC_COMPRA;
GRANT SELECT, REFERENCES ON ORDENES_COMPRA_DETALLE TO PROCEDURE TOTAL_DOC_COMPRA;
GRANT SELECT, REFERENCES ON REMISION_PROVEEDOR_DET TO PROCEDURE TOTAL_DOC_COMPRA;
GRANT SELECT ON COTIZACIONES_DETALLE TO PROCEDURE TOTAL_DOC_VENTAS;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE TOTAL_DOC_VENTAS;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE TOTAL_DOC_VENTAS;
GRANT SELECT ON PEDIDOS_DETALLE TO PROCEDURE TOTAL_DOC_VENTAS;
GRANT SELECT ON REMISIONES_VENTA_DETALLE TO PROCEDURE TOTAL_DOC_VENTAS;
GRANT SELECT ON ARTICULO TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON CLIENTES TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON GRUPO TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON LISTA_PRECIOS TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON MARCAS TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON PRECIOS_ARTICULO TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON PUNTO_VENTA TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON SUBGRUPO TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON TARIFA_IVA TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON UNIDAD_ARTICULO TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON USUARIO TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON VENDEDORES TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT EXECUTE ON PROCEDURE REDONDEE TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE TRAE_ARTICULO_MOVIL;
GRANT SELECT ON PEDIDOS TO PROCEDURE TRAE_PEDIDOS_VEND;
GRANT EXECUTE ON PROCEDURE NOMBRE_ASCII TO PROCEDURE TRAE_PEDIDOS_VEND;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE TRASCUENTAS_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_BANCOS TO PROCEDURE TRASCUENTAS_SIN_CONTABILIDAD;
GRANT SELECT ON TRASLADOS TO PROCEDURE TRASCUENTAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE TRASCUENTAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_TRASCUENTA TO PROCEDURE TRASCUENTAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE TRASCUENTAS_SIN_CONTABILIDAD;
GRANT SELECT ON COMPROBANTE_ENCABEZADO TO PROCEDURE TRASLACAJAS_SIN_CONTABILIDAD;
GRANT SELECT ON INTERFAZ_CAJA TO PROCEDURE TRASLACAJAS_SIN_CONTABILIDAD;
GRANT SELECT ON TRASLADOS_CAJA TO PROCEDURE TRASLACAJAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABILIZA_PENDIENTE TO PROCEDURE TRASLACAJAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE CONTABIL_TRASLACAJA TO PROCEDURE TRASLACAJAS_SIN_CONTABILIDAD;
GRANT EXECUTE ON PROCEDURE FECHA_A_CONTA TO PROCEDURE TRASLACAJAS_SIN_CONTABILIDAD;
GRANT SELECT ON COSTOS TO PROCEDURE ULTIMO_COSTO;
GRANT EXECUTE ON PROCEDURE FACTOR_UNIDAD_CANT TO PROCEDURE ULTIMO_COSTO;
GRANT SELECT ON ARTICULO TO PROCEDURE UNIDADES;
GRANT SELECT ON UNIDAD_ARTICULO TO PROCEDURE UNIDADES;
GRANT SELECT, REFERENCES ON COTIZACIONES TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON COTIZACIONES_DETALLE TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON PEDIDOS TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON PEDIDOS_DETALLE TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT ON PREFIJOS TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON REMISIONES_VENTA_DETALLE TO PROCEDURE UTILIDAD_VENTAS;
GRANT EXECUTE ON PROCEDURE COSTO_PROMEDIO TO PROCEDURE UTILIDAD_VENTAS;
GRANT SELECT, REFERENCES ON ARTICULO TO PROCEDURE VALIDE_ARTICULO;
GRANT SELECT, REFERENCES ON BARRAS_ARTICULO TO PROCEDURE VALIDE_ARTICULO;
GRANT EXECUTE ON PROCEDURE CUENTA_AFECTABLE TO PROCEDURE VALIDE_CUENTA;
GRANT EXECUTE ON PROCEDURE EXISTE_CUENTA TO PROCEDURE VALIDE_CUENTA;
GRANT SELECT ON CUENTAS TO PROCEDURE VALIDE_CUENTA_C;
GRANT SELECT ON ESTRUCTURA TO PROCEDURE VALIDE_CUENTA_C;
GRANT EXECUTE ON PROCEDURE EXISTE_CUENTA TO PROCEDURE VALIDE_CUENTA_C;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE VALIDE_CUENTA_C;
GRANT SELECT ON ESTRUCTURA TO PROCEDURE VALIDE_ESTRUCTURA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE VALIDE_EXISTENCIA;
GRANT EXECUTE ON PROCEDURE SALDO_INVENTARIO TO PROCEDURE VALIDE_EXISTENCIA;
GRANT EXECUTE ON PROCEDURE LEE_CONFIGURACION TO PROCEDURE VALIDE_NIVEL;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE VALIDE_NIVEL;
GRANT SELECT ON COMPROBANTE_DETALLE TO PROCEDURE VALIDE_PADRE;
GRANT EXECUTE ON PROCEDURE DIGITOS_NIVEL TO PROCEDURE VALIDE_PADRE;
GRANT EXECUTE ON PROCEDURE EXISTE_CUENTA TO PROCEDURE VALIDE_PADRE;
GRANT EXECUTE ON PROCEDURE VALIDE_ESTRUCTURA TO PROCEDURE VALIDE_PADRE;
GRANT SELECT, REFERENCES ON COSTOS TO PROCEDURE VALOR_INICIAL_INVENTARIO;
GRANT SELECT, REFERENCES ON ANTICIPOS_CLIENTE TO PROCEDURE VENCIDO_CLIENTE;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE VENCIDO_CLIENTE;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE VENCIDO_CLIENTE;
GRANT SELECT, REFERENCES ON MOVIMIENTO_CLIENTES TO PROCEDURE VENCIDO_CLIENTE;
GRANT SELECT, REFERENCES ON NOTAS_CREDITO_CLIENTES TO PROCEDURE VENCIDO_CLIENTE;
GRANT SELECT, REFERENCES ON NOTAS_DEBITO_CLIENTES TO PROCEDURE VENCIDO_CLIENTE;
GRANT SELECT, REFERENCES ON SALDOS_DOC_CARTERA TO PROCEDURE VENCIDO_CLIENTE;
GRANT SELECT, REFERENCES ON TIPO_DOCUMENTO TO PROCEDURE VENCIDO_CLIENTE;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE VENCIDO_CLIENTE;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE VENTAS_ARTICULO;
GRANT SELECT, REFERENCES ON FACTURAS_DETALLE TO PROCEDURE VENTAS_ARTICULO;
GRANT SELECT ON PREFIJOS TO PROCEDURE VENTAS_ARTICULO;
GRANT SELECT ON ARTICULO TO PROCEDURE VENTAS_ARTICULO_CLIENTE;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE VENTAS_ARTICULO_CLIENTE;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE VENTAS_ARTICULO_CLIENTE;
GRANT SELECT ON FACTURAS TO PROCEDURE VENTAS_ARTICULO_CLIENTE;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE VENTAS_ARTICULO_CLIENTE;
GRANT SELECT ON GRUPO TO PROCEDURE VENTAS_ARTICULO_CLIENTE;
GRANT SELECT ON MARCAS TO PROCEDURE VENTAS_ARTICULO_CLIENTE;
GRANT SELECT ON PREFIJOS TO PROCEDURE VENTAS_ARTICULO_CLIENTE;
GRANT SELECT ON SUBGRUPO TO PROCEDURE VENTAS_ARTICULO_CLIENTE;
GRANT SELECT, REFERENCES ON ARTICULO 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;
GRANT SELECT ON FACTURAS TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON FACTURAS_DETALLE 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 PREFIJOS TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON SUBGRUPO TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT EXECUTE ON PROCEDURE VENTAS_ARTICULO TO PROCEDURE VENTAS_ARTICULO_MES;
GRANT SELECT ON ARTICULO TO PROCEDURE VENTAS_ARTICULO_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE VENTAS_ARTICULO_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE VENTAS_ARTICULO_VENDEDOR;
GRANT SELECT ON FACTURAS TO PROCEDURE VENTAS_ARTICULO_VENDEDOR;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE VENTAS_ARTICULO_VENDEDOR;
GRANT SELECT ON GRUPO TO PROCEDURE VENTAS_ARTICULO_VENDEDOR;
GRANT SELECT ON MARCAS TO PROCEDURE VENTAS_ARTICULO_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE VENTAS_ARTICULO_VENDEDOR;
GRANT SELECT ON SUBGRUPO TO PROCEDURE VENTAS_ARTICULO_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE VENTAS_CLIENTE;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE VENTAS_CLIENTE;
GRANT SELECT ON FACTURAS TO PROCEDURE VENTAS_CLIENTE;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE VENTAS_CLIENTE;
GRANT SELECT ON PREFIJOS TO PROCEDURE VENTAS_CLIENTE;
GRANT SELECT ON TERCEROS TO PROCEDURE VENTAS_CLIENTE_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE VENTAS_CLIENTE_MES;
GRANT EXECUTE ON PROCEDURE VENTAS_CLIENTE TO PROCEDURE VENTAS_CLIENTE_MES;
GRANT SELECT ON DEVOLUCIONES_VENTAS TO PROCEDURE VENTAS_CLIENTE_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE VENTAS_CLIENTE_VENDEDOR;
GRANT SELECT ON FACTURAS TO PROCEDURE VENTAS_CLIENTE_VENDEDOR;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE VENTAS_CLIENTE_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE VENTAS_CLIENTE_VENDEDOR;
GRANT SELECT, REFERENCES ON DEVOLUCIONES_VENTAS TO PROCEDURE VENTAS_VENDEDOR;
GRANT SELECT ON DEVOLUCIONES_VENTAS_DETALLE TO PROCEDURE VENTAS_VENDEDOR;
GRANT SELECT, REFERENCES ON FACTURAS TO PROCEDURE VENTAS_VENDEDOR;
GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE VENTAS_VENDEDOR;
GRANT SELECT ON PREFIJOS TO PROCEDURE VENTAS_VENDEDOR;
GRANT SELECT, REFERENCES ON VENDEDORES TO PROCEDURE VENTAS_VENDEDOR_MES;
GRANT EXECUTE ON PROCEDURE COMPONE_FECHA TO PROCEDURE VENTAS_VENDEDOR_MES;
GRANT EXECUTE ON PROCEDURE VENTAS_VENDEDOR TO PROCEDURE VENTAS_VENDEDOR_MES;
