// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     SALDOS POR CLIENTE     SaldosCteProv.rpt 
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: Este reporte despliega los Documentos del Cliente en un rango
//              de Fechas seleccionados, en orden de acuerdo a la serie-folio.
// Consideraciones :
// Creación  :  Daniel Robles de Alba.   03/septiembre/2002
// Revisiones : 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 03/09/2002   DRdA    N.D.1102    Implementación inicial.
// 29/10/2002   LAP     N.D.1453    Los abonos no asociados deben de acumular al
//                                  saldo en negativo.
//                                  - fCalculaSaldoUtPerCambiaria
//                                  - fImprimeDocumento
// 08/09/2004   LAP     N.D.2787    Imprimir Totales del cliente y generales por 
//                                  moneda.
//                                  - Definición de columnas y atributos generales
//                                  - mAcumulaCliente (Nuevo)
//                                  - fCalculaSaldoUtPerCambiaria
//                                  - fImprimeTotalesMoneda
//                                  - Cuerpo del reporte
// 13/12/2011   ALRH    N.D.7509    No se acumulan abonos al Cliente.
//                                  - mAcumulaCliente
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



//******************************************************************************
//Funciones de librería.

  Incluye LibAdminPaq.rpt
  Incluye LibCliProv.rpt

//******************************************************************************
//Parámetros.
    
  Parametro pFechaCorte     = '20021231'
  Parametro pDeLaFecha      = '20020101'
  Parametro pAlaFecha       = '20021231'
  Parametro pDelCliente     = ' '      // Espacio en blanco, clave del primer cliente en el rango
  Parametro pAlCliente      = ' '      // Espacio en blanco, clave del ultimo cliente en el rango
  Parametro pDoctosModelo   = 0        // 0 = Todos, 1 = Seleccionado.
  Parametro pIdDoctoModelo  = 4        // 0 = Todos, 4 = Factura, etc.
  Parametro pSoloConSaldo   = 0        // 0 = todos, 1 = Sólo con saldo  
  Parametro pCualesClientes = 0        // 0 = todos, 1 = Activos, 2 = InActivos
  Parametro pMonedas        = 0        // 0 = Todas, 1 = Seleccionada.
  Parametro pIdMoneda       = 0        // 0 = Todas, 1 = ID moneda Peso mexicano, etc.
  Parametro pQueTipo        = 0        // 0 = Clientes , 1 = Proveedores
  Parametro pConDoctosNoAfectados = 0  // 0 = No, 1 = Si
  Parametro pIdClase1       = 0        // Por omisión deben recibir 0 =  ninguna
  Parametro pIdClase2       = 0
  Parametro pIdClase3       = 0
  Parametro pIdClase4       = 0        // Deben ser los ID´s de los valores de las clases seleccionadas
  Parametro pIdClase5       = 0        // Para cada tipo de clasificación.
  Parametro pIdClase6       = 0        // Por omisión deben recibir 0 =  ninguna

//******************************************************************************
//Definición de columnas y atributos generales.

// N.D 4951 JAAM Inicio
// Se hicieron mas anchas las columnas Cargo (C14), Abono (C1)6 y Saldo (C18).
                    //Nombre                         Fecha     Fecha     Dias    Importe                                 Utilidad
            //Código  Cliente    Serie     Folio     Docto  Vencimiento Vencido  Factura    Abonos    Saldo     Moneda   ó Perdida
            // C0       C2        C4        C6        C8        C10       C12      C14       C16       C18       C20       C22
  Columnas 23;2.55,0.15,4.35,0.15,0.75,0.15,1.65,0.15,1.65,0.15,1.65,0.15,1.3,0.15,2.25,0.15,2.25,0.15,2.25,0.15,2.70,0.15,1.95
  UsaLetra 'Arial'
  Altura 9
  [C6].Decimales 0
  [C12].Coma
  [C12].Decimales 2
  [C14..C18].Coma
  [C22].Corchete True

  UsaEmpresa tEmpresa;'AdminpaqW'
  gBienParametros = 0

  // Revisa si están bien definidos los parámetros

  Si (pDeLaFecha <= pFechaCorte) Y (@Len(pDeLaFecha) = 8)
    gBienParametros = 1
  FinSi

  Si (pAlaFecha >= pDeLaFecha) Y (pAlaFecha <= pFechaCorte) Y (@Len(pAlaFecha) = 8)
    gBienParametros = 1
  FinSi

  //Documentos modelo. 
  //Índice: primario.
  UsaTabla tDoctosModelo = tEmpresa['mgw10007']
  tDoctosModelo.Usaindice['']

  // Si se solicitó todos los documentos
  Si pDoctosModelo = 0
    pIdDoctoModelo = 0
  FinSi

  tDoctosModelo.BUSCA[@Str(pIdDoctoModelo;0)]
  Si tDoctosModelo->ENCONTRO
    Si (tDoctosModelo(cNaturaleza) < 2) Y (pQueTipo = tDoctosModelo(cNaturaleza) Y ((pQueTipo = 0 Y tDoctosModelo(cUsaCliente)) O (pQueTipo = 1 Y tDoctosModelo(cUsaProveedor))))
      gBienParametros = 1
    FinSi
  FinSi

  //Monedas. 
  //Índice: primario.
  UsaTabla tMonedas = tEmpresa['mgw10034']          
  tMonedas.Usaindice['']

  // Si se solicitó todas las monedas
  Si pMonedas = 0
    pIdMoneda = 0
  FinSi

  // Los valores de loa monedas se van a guardar en la hoja interna de memoria
  // por que pueden ser varias y además se van ir llevando totales en ellas

  // Indice inicial de la malla
  gIdRenIni = 1
  // Indice final de la malla
  gIdRenFin = gIdRenIni

  tMonedas.Busca Primero
  gMonedas = 'Todas'

  Mientras tMonedas->Encontro
    // Col 0 Id de la moneda
    {gIdRenFin}[0] = tMonedas(cIdMoneda)
    // Col 1 Nombre de la moneda
    {gIdRenFin}[1] = tMonedas(cNombreMoneda)
    // Col 2 Decimales de la moneda
    {gIdRenFin}[2] = tMonedas(cDecimalesMoneda)

    gMonedas = gMonedas & ',' & @Col({gIdRenFin};1)

    // Col 3 Cantidaes mínimas de la moneda
    Escoge tMonedas(cDecimalesMoneda)
      Caso 0
        {gIdRenFin}[3] = 0.1
      FinCaso
      Caso 1
        {gIdRenFin}[3] = 0.01
      FinCaso
      Caso 2
        {gIdRenFin}[3] = 0.001
      FinCaso
      Caso 3
        {gIdRenFin}[3] = 0.0001
      FinCaso
      Caso 4
        {gIdRenFin}[3] = 0.00001
      FinCaso
      Caso 5
        {gIdRenFin}[3] = 0.000001
      FinCaso
    FinEscoge
    // Col 4 indica si ya se guardó algun total en la moneda
    {gIdRenFin}[4] = 0
    // Col 5 Total de la columna 'Importe Cargo'
    {gIdRenFin}[5] = 0.0
    // Col 6 Total de la columna 'Abonos/Cargos'
    {gIdRenFin}[6] = 0.0
    // Col 7 Total de la columna 'Saldo'
    {gIdRenFin}[7] = 0.0
    // Col 8 Total de un docto de la naturaleza del reporte
    {gIdRenFin}[8] = 0.0
    // Col 9 indica se ya se guardó algún 'Abonos/Cargos' en la moneda
    {gIdRenFin}[9] = 0.0
    // Col 10 importe 'Abonos/Cargos' en la moneda que después se suma al total
    {gIdRenFin}[10] = 0.0

    gIdRenFin = gIdRenFin + 1

    tMonedas.SaltaReg[1]
  FinMientras

  // N.D.2787 Inicio
  // Adicionar una malla adicional para guardar los Totales del cliente actual.
  // Esta malla es identica a la de los Totales generales del reporte
  gNumMonedas = gIdRenFin - gIdRenIni
  gRenIniCliente = gIdRenFin
  lRenglon = gRenIniCliente

  Mientras lRenglon < (gRenIniCliente + gNumMonedas)
    // Calcula la posición del Total general del cual se copiaran los datos al 
    //  Total del cliente
    lIndice = gIdRenIni + (lRenglon - gRenIniCliente)

    // Copia el renglon del Total general al Total del cliente
    {lRenglon} = {lIndice}

    // Siguiente renglon
    lRenglon = lRenglon + 1
  FinMientras
  // N.D.2787 Fin

  [C22].Decimales @Col({gIdRenIni};2)
  gDecimalesMonedaReporte = @Col({gIdRenIni};2)

//******************************************************************************
//Apertura de tablas.

//Nombres terminados en Lib, indican que la tabla fue abierta explícitamente 
//para alguna Fx de librería

//!  UsaEmpresa tEmpresa;'AdminpaqW'               

  //Periodos. 
  //Índice: cNumeroEjercicio
  UsaTabla tPeriodos = tEmpresa['mgw10031']
  tPeriodos.UsaIndice['cNumeroEjercicio']

  //Parametros de la empresa. 
  //Índice: primario.
  UsaTabla tParametros = tEmpresa['mgw10000']                        

  //Tipos de cambio. 
  //Índice: cIdMoneda + cFecha.
  Usatabla tTiposCambio = tEmpresa['mgw10035']
  tTiposCambio.Usaindice['iMonedaFecha']                                  

  //Documentos. 
  //Índice: IdClienteProveedor + cFecha + cSerie + cFolio.
  //Esta tabla se usa para que no se pierda el puntero del recorrido principal.
  UsaTabla tDocumentos = tEmpresa['mgw10008'] Alias 'tDoctos1'  
  tDocumentos.Usaindice['iClienteProveedorFecha']   //

  //Documentos. 
  //Índice: primario.
  UsaTabla tDoctosLib2 = tEmpresa['mgw10008'] Alias 'tDoctos3'               
  tDoctosLib2.Usaindice['']

  //Clientes y Provedores. 
  //Índice: cCodigoCliente + cTipoCliente.
  UsaTabla tClientes = tEmpresa['mgw10002']
  tClientes.Usaindice['iCodigoTipo']                            

  //Cargos y Abonos. 
  //Índice: IDDoctoCargo + IDDoctoAbono.
  UsaTabla tCargosAbonosLib = tEmpresa['mgw10009']   
  tCargosAbonosLib.UsaIndice['iDoctoCargoAbono']

  //Conceptos de documento. 
  //Índice: cIdConceptoDocumento.
  UsaTabla tConceptos = tEmpresa['mgw10006']     
  tConceptos.UsaIndice['cIdConceptoDocumento']    

  //Monedas. 
  //Índice: primario.
//!  UsaTabla tMonedas = tEmpresa['mgw10034']          
//!  tMonedas.Usaindice['']                        

  //Valores de clasificación. 
  //Índice: primario.
  UsaTabla tValoresDeClasif = tEmpresa['mgw10020']
  tValoresDeClasif.UsaIndice['']



//******************************************************************************
//Declaración de variables globales.
  
  gHoy = fFormateaFecha(@Hoy();0)
  gDelaFecha = ''
  gAlaFecha  = ''
  gFechaCorte = ''
  gPeriodo   = 0
  gIdEjercicio = 0 
  gSaldoDocto   = 0.0
  gSoloConSaldo = 0 
  gSaldoInicialCliente = 0.0
  gTotalCargosCliente = 0.0
  gTotalAbonosCliente = 0.0
  gTotalSaldosCliente = 0.0
  gTotalCargosGral = 0.0
  gTotalAbonosGral = 0.0
  gTotalSaldosGral = 0.0
  gNombreMoneda = ''
  gNumDeClases = 0
  gRangoValido = 0
  gFechaBusqueda = ''
  gUtPerCambiaria = 0
  gTotUtPerCambiaria = 0



//******************************************************************************
//Funciones.

// ==========================================================================================
// fGetValorHoja (Funcion)
// Descripcion: Regresa el valor solicitado de la hoja en base a la columna cero que
//              funciona como un índice, lo que indica que solo devuelve valores de
//              la columnas a partir de la uno.
//
// Entrada:
// - aIdBuscar = Identificador con el que se quiere buscar en un renglon de la hoja
// - aColumna = Columna de la cual se quiere leer.
//
// Salida: 
//
// Historia de modificaciones
// Fecha        Nombre   IDLotus   Descripcion
// 05/09/2002   DRdA     N.C.1102  Implementación inicial.
// ==========================================================================================
Deffunc fGetValorHoja(aIdBuscar; aColumna)
Local lCiclo

  Mientras [lCiclo = gIdRenIni; lCiclo < gIdRenFin; lCiclo = lCiclo + 1]
    Si @Col({lCiclo};0) = aIdBuscar
      FinCiclo
    FinSi
  FinMientras
  Si lCiclo < gIdRenFin
    Retorna @Col({lCiclo};aColumna)
  SiNo
    Retorna 0
  FinSi
FinFunc


// ==========================================================================================
// fSetValorHoja (Procedimiento)
// Descripcion: Escribe el valor enviado a la hoja en base a la columna cero que
//              funciona como un índice, lo que indica que solo escribe valores de
//              la columnas a partir de la uno.
//
// Entrada:
// - aIdBuscar = Identificador con el que se quiere buscar en un renglon de la hoja
// - aColumna = Columna en la cual se quiere escribir.
// - aValor = Datos a escribir
//
// Salida: 
//
// Consideraciones: Cuando el valor de aIdBuscar es cero el valor de entrada se 
// deposita en todos los renglones válidos de la hoja en la columna seleccionada
//
// Historia de modificaciones
// Fecha        Nombre   IDLotus   Descripcion
// 05/09/2002   DRdA     N.C.1102  Implementación inicial.
// ==========================================================================================
Deffunc fSetValorHoja(aIdBuscar; aColumna; aValor)
Local lCiclo

  Mientras [lCiclo = gIdRenIni; lCiclo < gIdRenFin; lCiclo = lCiclo + 1]
    Si (aIdBuscar > 0) Y (@Col({lCiclo};0) = aIdBuscar)
      FinCiclo
    FinSi
    Si (aIdBuscar = 0)
      // Se quiere escribir sobre toda la columna
      {lCiclo}[aColumna] = aValor
    FinSi
  FinMientras
  Si (aIdBuscar > 0) Y (lCiclo < gIdRenFin)
    {lCiclo}[aColumna] = aValor
  FinSi
FinFunc


// ==========================================================================================
// mAcumulaCliente 
// Descripcion: Acumula, a la malla de Totales del cliente, el importe enviado a 
//              la hoja en base a la columna cero que funciona como un índice, 
//              lo que indica que solo escribe valores de la columnas a partir 
//              de la uno.
//
// Entrada:
// - aIdMoneda  = Identificador con el que se quiere buscar en un renglon de la hoja
// - aColumna   = Columna en la cual se quiere acumular el importe.
// - aImporte   = Importe a acumular a la columna aColumna
//
// Salida: 
//
// Consideraciones: Cuando el valor de aIdBuscar es cero el valor de entrada se 
// deposita en todos los renglones válidos de la hoja en la columna seleccionada
//
// Historia de modificaciones
// Fecha        Nombre   IDLotus   Descripcion
// 08/09/2004   LAP      N.D.2787  Implementación inicial.
// 13/12/2011   ALRH     N.D.7509  Se eliminó la condición para ignorar importes negativos.
// ==========================================================================================
DefFunc mAcumulaCliente(aIdMoneda; aColumna; aImporte)
Local lCiclo

	// N.D.7509 ALRH Se quitó la condición de si aImporte es menor a 0
	// Porque descarta saldos a favor, que se reciben como negativos
    Mientras [lCiclo = gRenIniCliente; lCiclo < (gRenIniCliente + gNumMonedas); lCiclo = lCiclo + 1]
      Si (aIdMoneda > 0) Y (@Col({lCiclo}; 0) = aIdMoneda)
        FinCiclo
      FinSi
      Si (aIdMoneda = 0)
        // Se quiere escribir sobre toda la columna
        {lCiclo}[aColumna] = @Col({lCiclo}; aColumna) + aImporte
        {lCiclo}[4] = 1
      FinSi
    FinMientras
    Si (aIdMoneda > 0) Y (lCiclo < (gRenIniCliente + gNumMonedas))
      {lCiclo}[aColumna] = @Col({lCiclo}; aColumna) + aImporte
      {lCiclo}[4] = 1
    FinSi
FinFunc


// ==========================================================================================
// fColumnas (Procedimiento)
// Descripcion: Establece la configuración atipo de columnas que se utilizan en el reporte.
//
// Entrada:
// - atipo = Número de configuración.
//
// Salida: 
//
// Historia de modificaciones
// Fecha        Nombre   IDLotus   Descripcion
// 04/09/2002   DRdA     N.C.1102  Implementación inicial.
// ==========================================================================================
Deffunc fColumnas(atipo)
  Si atipo = 1
  // N.D 4951 JAAM Inicio
// Se modifico el ancho de las columnas Cargo(C14), Abono (C1)6 y Saldo (C18).
              // C0       C2        C4        C6        C8        C10       C12      C14       C16       C18       C20       C22
    Columnas 23;2.55,0.15,4.35,0.15,0.75,0.15,1.65,0.15,1.65,0.15,1.65,0.15,1.3,0.15,2.25,0.15,2.25,0.15,2.25,0.15,2.70,0.15,1.95
  Sino 
            // C0       C2        C4        C6
    Columnas 8;3.0,0.15,1.95,0.15,1.95,0.15,1.95,0.15
  Finsi
FinFunc


// ==========================================================================================
Deffunc fNaturaleza(atDocto:TABLA)
  Local lNaturaleza
    
  // Se verifica la naturaleza por aquellos doctos de Utilidad ó Perdida Cambiaria
  lNaturaleza = atDocto(cNaturaleza)
    // 28. Utilidad Cambiaria Cliente (cargo)
    // 29. Perdida Cambiaria  Cliente (abono)
    // 30. Utilidad Cambiaria Provedor(cargo)
    // 31. Perdida Cambiaria Proveedor(abono)
  Si atDocto(cIdDocumentoDe) = 28 O atDocto(cIdDocumentoDe) = 30
    lNaturaleza = 0 // son cargos
  FinSi
  Si atDocto(cIdDocumentoDe) = 29 O atDocto(cIdDocumentoDe) = 31
    lNaturaleza = 1 // son abonos
  FinSi

  Retorna lNaturaleza
FinFunc


// ==========================================================================================
// fImprimeDocumento (Procedimiento)
// Descripcion : 
// Entrada :La tabla de clientes, con el cliente a imprimir abierto
// Salida  :aTblDocto  = Documento que se va a imprimir 
//          aTblCliente = de donde se toman el código y el nombre del cliente
//          gSaldoDocto = Saldo del documento a la fecha de corte del reporte
//          aUtPerCambiaria = Utilidad o perdida cambiaria por cambio de moneda
//                            entre el documento origen y el destino
//
// Historia de modificaciones
// Fecha        Nombre   IDLotus   Descripcion
// 05/09/2002   DRdA     N.D.1102  Implementación inicial.
// 29/10/2002   LAP     N.D.1453    Los abonos no asociados deben de acumular al
//                                  saldo en negativo.
// ==========================================================================================
DEFFUNC fImprimeDocumento(aTblDocto:TABLA; aTblCliente:TABLA; aSaldoDocto; aUtPerCambiaria)
  Local lRenglon
  Local lFechaCorteJul
  Local lFechaVenciJul

  lRenglon = ''[C0..C20]

  lRenglon[0] = fMascarilla(aTblCliente(cCodigoCliente);tParametros(cMascarillaClientes))
  lRenglon = aTblCliente(cRazonSocial)[C2]
  lRenglon = aTblDocto(cSerieDocumento)[C4]
  lRenglon = aTblDocto(cFolio)[C6]
  lRenglon[8] = fFormateaFecha(aTblDocto(cFecha);0)
  lRenglon[10] = fFormateaFecha(aTblDocto(cFechaVencimiento);0)
  lFechaVenciJul = fConvJul(aTblDocto(cFechaVencimiento))
  lFechaCorteJul = fConvJul(pFechaCorte)
  Si (lFechaCorteJul - lFechaVenciJul) > 0
    lRenglon[12] = lFechaCorteJul - lFechaVenciJul
  FinSi
  // Si la nutaraleza del docto es igual a la del reporte se imprime normal
  Si pQueTipo = aTblDocto(cNaturaleza)
    lRenglon = aTblDocto(cTotal)[C14]
    lRenglon[16] = aTblDocto(cTotal) - aSaldoDocto
    lRenglon[22] = aUtPerCambiaria
    lRenglon[18] = aSaldoDocto
  SiNo // El docto es de naturaleza contraria y solo se considera como un abono o cargo no aplicado
    lRenglon = 0.0[C14]
    lRenglon[16] = aSaldoDocto
    lRenglon = 0.0[C22]
    // N.D.1453 Inicio
    // Acumula al saldo en negativo
    lRenglon[18] = -aSaldoDocto
    // N.D.1453 Fin
  FinSi
  lRenglon[20] = fGetValorHoja(aTblDocto(cIdMoneda);1)
  
  Imprime lRenglon
Finfunc


// ==========================================================================================
// fCalculaSaldoUtPerCambiaria (Procedimiento)
// Descripcion : Imprime los abonos asociados a un documento de cargo
// Entrada :aTblDoctoActivo = Es el documento para el cual se buscaran sus abonos/Cargos relacionados
//          aTblDoctosTmp  = Tabla de documentos sobre la que se buscaran sus abonos/Cargos
//          aTblCargos = la Tabla de asociación de Documentos -> Documentos
// Salida  :Calcula el saldo pendiente que es que regresa como valor de retorno y la utilidad
//          o pérdida cambiaria la regresa por referencia.
// ==========================================================================================
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 29/10/2002   LAP     N.D.1453    Los abonos no asociados deben de acumular al
//                                  saldo en negativo.
//                                  - fCalculaSaldoUtPerCambiaria
//                                  - Cuerpo del reporte
// 08/09/2004   LAP     N.D.2787    Acumula a la malla de Totales del cliente 
//                                  los cargos, abonos, saldo y la utilidad / 
//                                  perdida cambiaria
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DefFunc fCalculaSaldoUtPerCambiaria(aTblDoctoActivo:TABLA;aTblDoctosTmp:TABLA;aTblCargos:TABLA;aUtPerCambiaria)
  Local lTotal
  Local lImporteOrigen
  Local lImporteDestino
  Local lTotalHoja
  Local lIdMonedaOrigen
  Local lIdMonedaDestino
  Local lCiclo

  lIdMonedaOrigen = aTblDoctoActivo(cIdMoneda)

  lTotal = aTblDoctoActivo(cTotal)
  aUtPerCambiaria = 0.0

  // Se trabaja sobre posiciones diferentes de la hoja por si el el documento
  // no tiene saldo y se quiere filtrar estos doctos para no acumular a los
  // totales originales

  // Col 8 para el total del docto
  fSetValorHoja(lIdMonedaOrigen;8;lTotal)
  // Col 9 para el indicar si hubo abonos en la moneda
  fSetValorHoja(0;9;0)
  // Col 10 para los abonos relacionados
  fSetValorHoja(0;10;0)

  // Documentos de Cargo
  SI aTblDoctoActivo(cNaturaleza) = 0
    aTblCargos.UsaIndice['iDoctoCargoAbono']
    aTblCargos.Busca Primero
  Sino
    aTblCargos.UsaIndice['' ]  // el indice por omisión es el de iDoctoAbono+IDDoctoCargo
    aTblCargos.Busca Primero    
  Finsi

  // Calcula el Saldo del Documento de Cargo, se busca en la tabla relaciones para recuperar 
  // los importes abonados a este documento, los cuales estan expresados en la misma moneda
  aTblCargos.BUSCA[@Str(aTblDoctoActivo(cIdDocumento);0)]
  Mientras aTblCargos->ENCONTRO  

    Si aTblDoctoActivo(cNaturaleza) = 0
      // busca el documento de abono asociado, para obtener la fecha del docto, no la del abono
      aTblDoctosTmp.BUSCA[@Str(aTblCargos(cIdDocumentoAbono);0)]
    Sino
      // busca el documento de cargo asociado, para obtener la fecha del docto, no la del abono
      aTblDoctosTmp.BUSCA[@Str(aTblCargos(cIdDocumentoCargo);0)]
    Finsi

    Si aTblDoctosTmp->Encontro
      // Va restando el importe abonado o cargado a el documento, ya que el Importe Total puede estár 
      // divido en varios abonos/cargos a doctos diferentes.
      // Para clientes toma el importe cargo ;ya que es un abono asoc. a un cargo
      // Para Proveedores toma el importe de abono;ya que es un cargo asoc. a un abono
      //  -dicho importe está reflejado en la moneda del docto de la tabla aTblDoctoActivo-
      //  - el otro importe está reflejado en la moneda del docto de la tabla aTblDoctosTmp-

      Si (pConDoctosNoAfectados = 1) O (pConDoctosNoAfectados = 0 Y aTblDoctosTmp(cAfectado) = 1)
        // Valida la fecha que este dentro del rango, o que solo se busquen a una fecha de corte
        Si (pDeLaFecha = '' O aTblDoctosTmp(cFecha) >= pDeLaFecha) Y (aTblDoctosTmp(cFecha) <= pFechaCorte)
          // Calcula el saldo pendiente
          Si aTblDoctoActivo(cNaturaleza) = 0
            lImporteOrigen = aTblCargos(cImporteCargo)
            lImporteDestino = aTblCargos(cImporteAbono)
            lTotal = lTotal - lImporteOrigen	// El importe Cargo esta en la misma moneda
          Sino                               // del docto activo que es cargo
            lImporteOrigen = aTblCargos(cImporteAbono)
            lImporteDestino = aTblCargos(cImporteCargo)
            lTotal = lTotal - lImporteOrigen	// El importe Cargo esta en la misma moneda          
          Finsi                              // del docto activo que es abono

          lIdMonedaDestino = aTblDoctosTmp(cIdMoneda)

          Si pQueTipo = aTblDoctoActivo(cNaturaleza)
            // Acumula al total 'Abonos' de su moneda
            lTotalHoja = fGetValorHoja(lIdMonedaOrigen;10)
            lTotalHoja = lTotalHoja + lImporteOrigen
            fSetValorHoja(lIdMonedaOrigen;10;lTotalHoja)
            fSetValorHoja(lIdMonedaOrigen;9;1)
            Si lIdMonedaOrigen != lIdMonedaDestino
              lTotalHoja = fGetValorHoja(lIdMonedaDestino;10)
              lTotalHoja = lTotalHoja + lImporteDestino
              fSetValorHoja(lIdMonedaDestino;10;lTotalHoja)
              fSetValorHoja(lIdMonedaDestino;9;1)
            FinSi
          FinSi

          // Calcula la utilidad o perdida cambiaria en la moneda base

          // Convierte el origen a la moneda base
          Si lIdMonedaOrigen != 1
            Si (lIdMonedaOrigen != 1) Y (lIdMonedaDestino = 1)
              lImporteOrigen = (lImporteDestino / fTipoCambio(aTblDoctosTmp(cFecha);lIdMonedaOrigen;tTiposCambio)) * aTblDoctoActivo(cTipoCambio)
            SiNo
              lImporteOrigen = lImporteOrigen * aTblDoctoActivo(cTipoCambio)
            FinSi
          FinSi
          // Convierte el destino a la moneda base
          Si lIdMonedaDestino != 1
            lImporteDestino = lImporteDestino * aTblDoctosTmp(cTipoCambio)
          FinSi

          // La utilidad o perdida cambiaria es el destino menos el origen,
          // si la diferencia es positiva se considera utilidad, pero si
          // es negativa se considera pérdida
          aUtPerCambiaria = aUtPerCambiaria + (lImporteDestino - lImporteOrigen)
          // N.D.3238 Redondear los importes antes de mostrarlos
          aUtPerCambiaria = fRedondeaImporteLib(aUtPerCambiaria; gDecimalesMonedaReporte)
        Finsi
      FinSi
    Finsi

    aTblCargos.BUSCA SIGUIENTE[1]
  FinMientras

  // N.D.3238/4362 Redondear los importes antes de mostrarlos
  lTotal = fRedondeaImporteLib(lTotal; fGetValorHoja(aTblDoctoActivo(cIdMoneda);2))

  Si lTotal < fGetValorHoja(lIdMonedaOrigen;3)
    lTotal = 0.0
  FinSi

  Si pQueTipo = aTblDoctoActivo(cNaturaleza)
    Si (pSoloConSaldo = 0) O ((pSoloConSaldo = 1) Y (lTotal > 0.0))
      // N.D.2787 Inicio
      // Acumula al Total del Cliente la "Utilidad / perdida cambiaria"
      mAcumulaCliente(1; 22; lImporteDestino - lImporteOrigen)

      // Acumula al Total del Cliente de 'Cargo' de su moneda
      mAcumulaCliente(lIdMonedaOrigen; 5; fGetValorHoja(lIdMonedaOrigen;8))

      // Acumula al Total General de 'Cargo' de su moneda
      lTotalHoja = fGetValorHoja(lIdMonedaOrigen;5)
      lTotalHoja = lTotalHoja + fGetValorHoja(lIdMonedaOrigen;8)
      fSetValorHoja(lIdMonedaOrigen;5;lTotalHoja)
      fSetValorHoja(lIdMonedaOrigen;4;1)

      // Acumula al Total del Cliente de 'Abonos' de su moneda
      mAcumulaCliente(lIdMonedaOrigen; 6; fGetValorHoja(lIdMonedaOrigen;10))

      // Acumula al Total General de 'Abonos' de su moneda
      lTotalHoja = fGetValorHoja(lIdMonedaOrigen;6)
      lTotalHoja = lTotalHoja + fGetValorHoja(lIdMonedaOrigen;10)
      fSetValorHoja(lIdMonedaOrigen;6;lTotalHoja)
      fSetValorHoja(lIdMonedaOrigen;4;1)

      // Acumula al Total del Cliente de 'Saldo' de su moneda
      mAcumulaCliente(lIdMonedaOrigen; 7; lTotal)

      // Acumula al Total General de 'Saldo' de su moneda
      lTotalHoja = fGetValorHoja(lIdMonedaOrigen;7)
      lTotalHoja = lTotalHoja + lTotal
      fSetValorHoja(lIdMonedaOrigen;7;lTotalHoja)
      fSetValorHoja(lIdMonedaOrigen;4;1)
      // N.D.2787 Fin
    FinSi
  SiNo // Los saldos no aplicados quedan como abonos
    Si lTotal > fGetValorHoja(lIdMonedaOrigen;3)
      // N.D.2787 Inicio
      // Acumula al Total del Cliente de 'Abonos' de su moneda
      mAcumulaCliente(lIdMonedaOrigen; 6; lTotal)

      // Acumula al Total General de 'Abonos' de su moneda
      lTotalHoja = fGetValorHoja(lIdMonedaOrigen;6)
      lTotalHoja = lTotalHoja + lTotal
      fSetValorHoja(lIdMonedaOrigen;6;lTotalHoja)
      fSetValorHoja(lIdMonedaOrigen;4;1)

      // Acumula al Total del Cliente de 'Saldo' de su moneda
      mAcumulaCliente(lIdMonedaOrigen; 7; -lTotal)

      // N.D.1453 Inicio
      // Acumula al Total General de 'Saldo' de su moneda
      lTotalHoja = fGetValorHoja(lIdMonedaOrigen;7)
      lTotalHoja = lTotalHoja - lTotal
      fSetValorHoja(lIdMonedaOrigen;7;lTotalHoja)
      fSetValorHoja(lIdMonedaOrigen;4;1)
      // N.D.1453 Fin
      // N.D.2787 Fin
    FinSi
  FinSi

  Retorna lTotal
FinFunc


// ==========================================================================================
// fImprimeTotalesMoneda (Procedimiento)
// Descripcion : Imprime los Totales Generales del reporte
// Comentarios : asume la misma distribucion de columnas que el cuerpo principal del reporte
// Entradas:
//          aNivel  - 0 Si se imprimen los Totales generales
//                    1 Si se imprimen los Totales del cliente
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 08/09/2004   LAP     N.D.2787    Imprimir Totales del Cliente o Generales del reporte
//                                  por moneda.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// ==========================================================================================
Deffunc fImprimeTotalesMoneda(aNivel)
Local lRenglon
Local lTexto
Local lCiclo, lInicioCiclo, lFinCiclo
//  N.D.4119 Impresión de la línea de división sólo si existen importes  
Local lSeImprimioSeparacion

  // N.D.2787 Inicio
  NEGRITAS True

  // Determina el renglón inicial y el final que va a recorrer para imprimir los
  //  totales
  Si aNivel = 0
    lInicioCiclo = gIdRenIni
    // N.D.4119 lTexto = ''
    // N.D.4119 Imprime lTexto
  Sino
    lInicioCiclo = gRenIniCliente
  FinSi
  lFinCiclo = lInicioCiclo + gNumMonedas

  //  N.D.4119 Impresión de la línea de división sólo si existen importes  
  lSeImprimioSeparacion = 0

  // Impresión de los Totales de cada moneda
  Mientras[lCiclo = lInicioCiclo; lCiclo < lFinCiclo; lCiclo = lCiclo + 1]
    lRenglon = ''
    // Si se actualizó algún total de la moneda se imprime
    Si @Col({lCiclo};4) = 1
      //  N.D.4119 Impresión de la línea de división sólo si existen importes  
      Si lSeImprimioSeparacion = 0
        lTexto = '================='[C10,C11,C12,C14,C16,C18,C20,C22]
        Imprime lTexto
        lSeImprimioSeparacion = 1
      FinSi
      Si aNivel = 0
        lRenglon[10] = 'Total general'
      Sino
        lRenglon[10] = 'Total cliente'
      FinSi
      // Cargos
      lRenglon[14] = @Col({lCiclo};5)
      // Abonos
      lRenglon[16] = @Col({lCiclo};6)
      // Saldo
      lRenglon[18] = @Col({lCiclo};7)
      // Indicar la moneda en la que se imprimen los Totales
      lRenglon[20] = @Col({lCiclo};1)
      // Utilidad / perdida cambiaria solo para la Moneda base
      Si @Col({lCiclo};0) = 1
        Si aNivel = 0
          lRenglon[22] = gTotUtPerCambiaria
        Sino
          lRenglon[22] = @Col({lCiclo};22)
        FinSi
      FinSi
      // Impresión del Total
      Imprime lRenglon
    FinSi
  FinMientras

  //  N.D.4119 Impresión de la línea de división sólo si existen importes  
  Si lSeImprimioSeparacion = 1
    // Impresión de un renglon de separación
    lSubRaya = ''[C14,C16,C18,C20,C22]
    Imprime lSubRaya
  FinSi

  NEGRITAS FALSE

  // Inicialización de los Totales del cliente de cada moneda
  Si aNivel != 0
    Mientras[lCiclo = lInicioCiclo; lCiclo < lFinCiclo; lCiclo = lCiclo + 1]
      {lCiclo}[4] = 0
      {lCiclo}[5] = 0
      {lCiclo}[6] = 0
      {lCiclo}[7] = 0
      {lCiclo}[22] = 0
    FinMientras
  FinSi
  // N.D.2787 Fin
FinFunc


// ==========================================================================================
// fBuscaAlgunReg
// Descripcion : Busca algun registro que coincida con el campo aIDBuscado, y alguna de las 
//               fechas que sea menor o igual que aFechaFin.
// Salida : modifica el argumento aFechaIni, para regresar la fecha en que se encontro el 1er.
//          registro que coincide
// ==========================================================================================
Deffunc BuscaAlgunReg(aFechaIni;aFechaFin;aIdBuscado;aTblDeBusqueda:TABLA)

  Mientras aFechaIni <= aFechaFin Y !aTblDeBusqueda->ENCONTRO 
    aTblDeBusqueda.BUSCA[aIdBuscado &':'&aFechaIni]
    Si !aTblDeBusqueda->Encontro
      aFechaIni = fFechaSiguiente(aFechaIni)
    Finsi
  FinMientras

Finfunc



// ==========================================================================================
// fDiscriminaCliente()
// Salidas:  1 = indica que el cliente no aplica, debe descartarse
//           0 = indica que el cliente no debe descartarse.
// ==========================================================================================
DefFunc fDiscriminaCliente(aCliente:TABLA)
  Local lRegresa
    
  lRegresa = 0

  // Se salta el Cliente NINGUNO
  Si aCliente(cIdClienteProveedor) = 0
    lRegresa = 1
  Finsi
  // Si se requieren los clientes y no se trata de un cliente:(1=cliente,2=cliente/provedor,3= proveedor)
  Si  pQueTipo = 0 Y (aCliente(cTipoCliente) > 2) 
    lRegresa = 1
  Finsi
  // Si se requieren los Proveedores y no se trata de un Proveedor
  Si  pQueTipo = 1 Y (aCliente(cTipoCliente) < 2) 
    lRegresa = 1
  Finsi
  // Si Estado solicitado no es Todos y No Coincide el tipo de cliente con el parametro 
  // pCualesClientes = 2(inactivos) aplicando %2 = 0, 0 = inactivos en la tabla de clientes
  Si (pCualesClientes != 0) Y (aCliente(cEstatus) != pCualesClientes%2)
    lRegresa = 1
  Finsi
  // Se Revisan las CLASIFICACIONES, solo en el caso de haber seleccionado al menos una 
  Si gNumDeClases > 0
    Si !fMiembroDeUnaClase(aCliente;gNumDeClases;gListIdDeClases;pQueTipo)
     // Sa salta el cliente actual, por no pertenecer a alguna de las clasificaciones
      lRegresa = 1
    Finsi
  Finsi

  Retorna lRegresa
FinFunc



// =============================================================================
// fDiscriminaDocto()
// Salidas:  1 = indica que el Docto no aplica, debe descartarse
//           0 = indica que el Docto no debe descartarse.
//  Historia de revisiones:
//
//  Fecha         ID-LOTUS         Descripción
// -----------------------------------------------------------------------------
// =============================================================================
DefFunc fDiscriminaDocto(atDocumento:TABLA)
  Local lRegresa

  lRegresa = 0

  // si no es cargo o abono  
  Si atDocumento(cNaturaleza) = 2 
    lRegresa = 1
  Finsi

  // Si el reporte es para clientes los doctos de su naturaleza solo entran hasta
  // la fecha final, pero los de diferente naturaleza hasta la fecha de corte
  Si (lRegresa = 0) Y (pQueTipo = atDocumento(cNaturaleza)) Y (atDocumento(cFecha) > pAlaFecha)
    lRegresa = 1
  FinSi

  // Si se despliegan Doctos. sin afectar, verificar que el Docto. no esté cancelado.
  Si (lRegresa = 0) Y (pConDoctosNoAfectados = 1)
    Si atDocumento(cCancelado) = 1
      lRegresa = 1
    FinSi
  FinSi

  // Si no esta afectado se lo brinca. Solo cuando pConDoctosNoAfectados = 0.
  Si (lRegresa = 0) Y (pConDoctosNoAfectados = 0)
    Si atDocumento(cAfectado) != 1
      lRegresa = 1
    Finsi
  FinSi

  Si (lRegresa = 0) Y (pQueTipo = atDocumento(cNaturaleza)) Y (pIdDoctoModelo > 0)
    Si atDocumento(cIdDocumentoDe) != pIdDoctoModelo
      lRegresa = 1
    FinSi
  FinSi

  Si (lRegresa = 0) Y (pIdMoneda > 0)
    Si atDocumento(cIdMoneda) != pIdMoneda
      lRegresa = 1
    FinSi
  FinSi

  // CASO Clientes/Proveedores : se descartan los cargos que no son de clientes y los abonos
  // que no son de proveedores, solo imprime los doctos de acuerdo a el tipo de reporte pedido
  Si (lRegresa = 0) Y (pQueTipo = 0) Y (atDocumento(cUsaCliente) = 0) // cargo pero no es docto de cliente
    lRegresa = 1
  Finsi
  Si (lRegresa = 0) Y (pQueTipo = 1) Y (atDocumento(cUsaProveedor) = 0) // abono pero no es docto de proveedor
    lRegresa = 1
  Finsi

  Retorna lRegresa

FinFunc


//******************************************************************************
//Encabezado.

  Encab

    Texto '@TC{255,0,0}@S{8}AdminPAQ' 
 	  Hoja '"@TC{0,0,0}@S{8}Hoja: ' 
    Imprime 
    Si pIdMoneda > 0
      Texto '@TC{0,0,0}@S{8}Moneda: ' & fGetValorHoja(pIdMoneda;1)
    FinSi
    Texto '"@TC{0,0,0}@S{8}Fecha: ' & gHoy
    Imprime
    Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
    Imprime
    Si pQueTipo = 0
      Texto '^@TC{0,0,0}@S{16}' & 'SALDOS DE DOCUMENTOS POR CLIENTE '
    SiNo
      Texto '^@TC{0,0,0}@S{16}' & 'SALDOS DE DOCUMENTOS POR PROVEEDOR '
    FinSi
    Imprime

    gDelaFecha = fFormateaFecha(pDeLaFecha;0)
    gAlaFecha  = fFormateaFecha(pAlaFecha;0)
    gFechaCorte = fFormateaFecha(pFechaCorte;0)
    Texto '^@TC{0,0,0}@S{16}'& 'Del: ' & gDelaFecha & ' Al: ' & gAlaFecha & ' con Fecha de Corte Al: ' & gFechaCorte
    Imprime 

    // ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
    fRevisaClases(tValoresDeClasif)
    // ===== Fin de la revision de clasificaciones

    NEGRITAS TRUE
      fColumnas(1)   
      Altura 9
      Texto '@TC{0,0,0}@L{-1}'
      Imprime 
      Texto C8;'^Fecha'
      Texto C10;'^Fecha'
      Texto C12;'^Dias'
      Texto C14;'^Importe'
      Texto C22;'^Ut. ó Per.'

      Imprime
      Texto C0;'^Codigo'
      Si pQueTipo = 0
        Texto C2;'^Nombre Cliente'
      SiNo
        Texto C2;'^Nombre Proveedor'
      FinSi
      Texto C4;'^Serie'
      Texto C6;'^Folio'
      Texto C8;'^Docto'
      Texto C10;'^Vencimiento'
      Texto C12;'^Vencidos'
      Si pQueTipo = 0
        Texto C14;'^Cargo'
        Texto C16;'^Abonos'
      SiNo
        Texto C14;'^Abono'
        Texto C16;'^Cargos'
      FinSi
      Texto C18;'^Saldo'
      Texto C20;'^Moneda'
      Texto C22;'^Cambiaria'
      Imprime 1
      Texto '@TC{0,0,0}@L{-1}'
      Imprime 
    NEGRITAS FALSE
   
  FinEncab


//******************************************************************************
//Cuerpo principal.

// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 04/09/2002   DRdA    N.D.1102    Implementación inicial.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  // Si están bien todos los paraámetros procesa el reporte
  Si gBienParametros = 1

    Si pDelCliente = ' '
      tClientes.Busca Primero
      pDelCliente = tClientes(cCodigoCliente)
    Finsi
  
    Si pAlCliente = ' '
      tClientes.Busca Ultimo
      pAlCliente =  tClientes(cCodigoCliente)  
    Finsi

    tParametros.Busca Primero   

    // Obtener el Ejercicio y el Periodo que le corresponde a pFechaIni, para calcular saldo inicial  
    // Se calculan al inicio y se pasan como referencia, para calcularlos solo una vez.
    fEjercicioPeriodo(pDeLaFecha;&gPeriodo;&gIdEjercicio;tPeriodos)  
    // Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunos valores
    // Globales para la biblioteca LibAdminPAQ.rpt
    fIniFechasHistoria(tPeriodos)

    gRangoValido = pDeLaFecha <= pAlaFecha ? 1:0
    Mientras [tClientes.Busca[pDelCliente & '..'  & pAlCliente ];(gRangoValido Y tClientes->Encontro) ; tClientes.Busca Siguiente[1]]

      Si fDiscriminaCliente(tClientes) = 1
        Continua
      Finsi

      // Se inicializa la fecha con la que se realizaran las busquedas en el rango de fechas
      gFechaBusqueda = pDeLaFecha  

      // busca Algun docto , debe estar afectado y dentro del rango, OJO: el campo afecta no existe
      // Si encontro tDocumentos queda en el registro encontrado y gFechaBusqueda en la fecha en que se encontro
      BuscaAlgunReg(&gFechaBusqueda;pAlaFecha;tClientes(cIdClienteProveedor);&tDocumentos)

      // El Cliente si tiene Doctos
      Si tDocumentos->ENCONTRO
        Mientras gFechaBusqueda <= pFechaCorte
          // Ahora si barre todos los documentos a partir del primero que ya habia encontrado       
          Mientras [tDocumentos.BUSCA[@Str(tClientes(cIdClienteProveedor);0) &':'& gFechaBusqueda]; tDocumentos->ENCONTRO; tDocumentos.BUSCA SIGUIENTE[2]]
            Si fDiscriminaDocto(tDocumentos) = 1
              Continua
            Finsi

						//nd 5055 (JAAM)
            [C14..C18].Decimales 2//fGetValorHoja(tDocumentos(cIdMoneda);2)
         
            // Calcula el Saldo del Documento es igual tanto para cargos, como para abonos
            gSaldoDocto = fCalculaSaldoUtPerCambiaria(tDocumentos;tDoctosLib2;tCargosAbonosLib;&gUtPerCambiaria)

            // Se verifica para no imprimir documentos saldados.  
            Si ( pSoloConSaldo = 1 ) Y ( gSaldoDocto < fGetValorHoja(tDocumentos(cIdMoneda);3) )
              Continua
            Finsi

            // Si el documento es de la misma naturaleza del reporte, entonces manda imprimirlo
            // calculando su saldo y la ut/per cambiaria
            Si pQueTipo = tDocumentos(cNaturaleza)
              gTotUtPerCambiaria = gTotUtPerCambiaria + gUtPerCambiaria
              fImprimeDocumento(tDocumentos; tClientes; gSaldoDocto; gUtPerCambiaria)
            Sino 
              // El documento es de naturaleza contraria solo lo imprime como un saldo
              Si gSaldoDocto > fGetValorHoja(tDocumentos(cIdMoneda);3)
                fImprimeDocumento(tDocumentos; tClientes; gSaldoDocto; 0.0)
      		    Finsi 
            Finsi
          FinMientras                      
          // Fin del mientras Documentos.busca
          gFechaBusqueda = fFechaSiguiente(gFechaBusqueda)
        FinMientras                         
        // Fin Mientras la fecha es menor      
      FinSi                                
      // Fin del tDocumentos->encontro

      // N.D.2787
      // Imprimir los Totales del Cliente por Moneda
      fImprimeTotalesMoneda( 1 )
    FinMientras                            
    // Fin del mientras tClientes.busca
   
    // N.D.2787
    // Imprimir los Totales Generales por Moneda
    fImprimeTotalesMoneda( 0 )
    //  FIN DEL REPORTE

  FinSi
  // Si gBienParametros = 1

