// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     RESUMEN DEL ESTADO DE CUENTA DE CLIENTES/PROVEEDORES    ResEdoCta.rpt
//
// Sistema:     ADMINPAQ  Versión v1.1.8 Windows
//
// Descripcion: Presenta un listado de clientes con su saldo inicial, cargos,
//              abonos y saldo final en un sólo renglón. Este reporte es 
//              similar al reporte Anexos del Catálo de ContPAQ
//
// Consideraciones :
// Creación  :  Ricardo Paláu.   20/septiembre/2002
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 29/10/2002   LAP     N.D.1423    En el filtro "Solo con documentos" no debe de imprimir los 
//                                  clientes que no tienen documentos alguno.
//                                  - Cuerpo del reporte
// 07/05/2005   RPC     N.D.2100    El reporte no toma en cuenta la utilidad o perdida cambiaria
// 16/03/2005   HAV     N.D.3023    Saldos bimonedas con revision colegas
// 20/04/2005   LAP     N.D.3023    Incluir los documentos de utilidad / perdida cambiaria siempre y 
//                                  cuando correspondan a la moneda del reporte.
//                                  - fDiscriminaDocto
//                                  Expresar los importes de los documentos en la moneda del reporte. 
//                                  Considerando que los documentos en moneda base tienen el tipo de 
//                                  cambio de la moneda del cliente a la moneda base. Utilizar 
//                                  fCambiarMonedaDoctoAReporte de LibAdminPAQ.rpt
//                                  - Cuerpo del reporte
// 06/07/2005   LAP     N.D.3346    Determinar correctamente la naturaleza de los documentos de 
//                                  utilidad / perdida cambiaria en el caso de proveedores. (LAP)
//                                  - fNaturaleza
// 02/12/2005  LAP    N.D.3010      Nuevo esquema de búsquedas parciales para agilizar los reportes
//                                  - Cuerpo del reporte
//                                  - BuscaAlgunReg (ELIMINADO)
// 17/08/2006  LAP    N.D.3872      No incluir las utilidades / perdidas cambiarias que no correspondan
//                                  a la naturaleza del cliente / proveedor
//                                  - fDiscriminaDocto
// 27/02/2009  ELVS    N.D.5683     ERROR NO SE MUESTRA INFORMACION DE UN CLIENTE QUE TIENE MONEDA
//                                  DOLARES AL EJECUTAR EL REPORTE DE ESTADO DE CUENTA SELECIONANDO
//                                  MONEDA EN PESO MEXICANO.
//                                  Donde consideraba el pIdMoneda ahora será sustituido por el pIdMoneda1
//                                  excepto para el caso del filtro de moneda del cliente. 
// 19/01/2010  ELVS    N.D.6173     Reportes - ERROR NO RESPETA LOS FILTROS SELECCIONADOS EN EL ESTADO
//                                  DE CUENTA RESUMEN CUANDO SE EJECUTA EN DOLARES Y SE DA CLIC EN EL
//                                  AREA AMARILLA SENSIBLE A CONTEXTO Y LLAMA EL REPORTE ESTADO DE 
//                                  CUENTA PERO MUESTRA INFORMACION EN PESOS. 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


//**************************************************************************************************
//Funciones de librería.
  Incluye LibAdminPaq.rpt
  Incluye LibCliProv.rpt
  

//**************************************************************************************************
//Parámetros.    
//**************************************************************************************************
  Parametro pDeLaFecha      = '20020901'
  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 pSoloConDoctos  = 0        // 1 = Si, 0 = No
  Parametro pCualesClientes = 0        // 0 = todos, 1 = Activos, 2 = InActivos
  Parametro pIdMoneda       = 1        // 1 = ID moneda Peso mexicano 
  																		 // N.D.5683 Este parámetro solo mostrará los proveedores o clientes
  																		 // que en el catálogo tengan definida esta moneda en moneda 
  																		 // del cliente o proveedor.
  Parametro pQueTipo        = 1        // 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
  Parametro pIdMoneda1			= 1				 // N.D.5683 Este parámetro de moneda mostrará en que 
  																		 // moneda se visualizará el estado de cuenta.	

//**************************************************************************************************
//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 tTiposCambioLib = tEmpresa['mgw10035']
  tTiposCambioLib.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: IdClienteProveedor + cFecha + cSerie + cFolio.
  UsaTabla tDoctosLib1 = tEmpresa['mgw10008'] Alias 'tDoctos2' 
  tDoctosLib1.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']                            

  //Acumulados por periodo. 
  //Índice: cIdTipoAcumulado + Importe modelo + cIdOwner1 + cIdOwner2  + cIdEjercicio + cIdMoneda
  UsaTabla tAcumuladosLib = tEmpresa['mgw10018']
  tAcumuladosLib.Usaindice['iAcumImpteOwnerEjerMoneda']

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

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

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


//**************************************************************************************************
// Definiciones y asumidos globales para el reporte
//**************************************************************************************************
// Ancho de columnas = caracteres / 17 * 2.54
// Se consideran columnas intermedias de un espacio
// C0 (Código Cliente/Proveedor) = 25 caracteres
// C2 (Nombre Cliente/Proveedor) = 30 caracteres
// C4 (Saldo Inicial) = 17 caracteres
// C6 (Cargos) = 17 caracteres
// C8 (Abonos) = 17 caracteres
// C10 (Saldo Final) = 17 caracteres
Columnas 12;3.74,0.15,4.48,0.15,2.54,0.15,2.54,0.15,2.54,0.15,2.54,0.15


Usaletra 'Arial'
Altura 9
tMonedas.Busca[@Str(pIdMoneda1;0)] //N.D.5683
gDecimales = tMonedas(cDecimalesMoneda)
[C4,C6,C8,C10].Coma
[C4,C6,C8,C10].Blanco ''
[C4,C6,C8,C10].Decimales gDecimales
[C4,C6,C8,C10].Blanco '0.00'
[C4,C6,C8,C10].Corchete True


//**************************************************************************************************
//Declaración de variables globales.
//**************************************************************************************************
  gHoy = fFormateaFecha(@Hoy();0)
  gDelaFecha = ''
  gAlaFecha  = '' 
  gPeriodo   = 0
  gIdEjercicio = 0 
  gSaldoIniCte = 0
  gTipoCambioRpt = 0
  gTotalDocumento = 0
  gTotalSaldoIni = 0.0
  gCargosCte = 0
  gAbonosCte = 0
  gSaldoCte = 0.0
  gTotalCargos = 0.0
  gTotalAbonos = 0.0
  gTotalSaldos = 0.0

  gNombreMoneda = tMonedas(cNombreMoneda)


//**************************************************************************************************
//Funciones.
//**************************************************************************************************
// =================================================================================================
// Función área sensible al contexto
// =================================================================================================
DefFunc ContextoDetalleCliente(aNumeroColumna; aValor)
		//N.D.6173 Se agrega el parámetro de Moneda del Reporte
		//N.D.5683 
    EJECUTA tEmpresa->SysDirDatos & '\Reportes\AdminPAQ\EDODECTA.RTW';pDeLaFecha,pAlaFecha,aValor,aValor,pSoloConDoctos,0,pCualesClientes,pIdMoneda,1,pQueTipo,pConDoctosNoAfectados,pIdClase1,pIdClase2,pIdClase3,pIdClase4,pIdClase5,pIdClase6,pIdMoneda1;tEmpresa->Directorio 
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 modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 20/04/2005   LAP     N.D.3023    Incluir los documentos de utilidad / perdida cambiaria siempre y 
//                                  cuando correspondan a la moneda del reporte.
// =================================================================================================
DefFunc fDiscriminaDocto(atDocumento:TABLA)
Local lRegresa

  lRegresa = 0

  // N.D.3023 Inicio
  // Si no es cargo o abono y no es docto de utilidad o perdida cambiaria)
  Si atDocumento(cNaturaleza) = 2 Y !(atDocumento(cIDDocumentoDe) >= 28 Y atDocumento(cIDDocumentoDe) <= 31) 
    lRegresa =1
  Finsi

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

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

  // Los documentos de utilidad perdida cambiaria solo se incluyen si su moneda corresponde
  //  a la del reporte
  Si atDocumento(cIdDocumentoDe) >= 28 Y atDocumento(cIdDocumentoDe) <= 31 
    Si atDocumento(cIdMoneda) != pIdMoneda1 //N.D.5683
      lRegresa = 1
    FinSi
    // N.D.3872 Los documentos modelo 28 y 29 corresponden a clientes y los documentos 30 y 31 1 a proveedores
    // N.D.3872 pQueTipo igual a cero cuando es de clientes y 1 cuando es de proveedores
    Si pQueTipo = 0 y (atDocumento(cIdDocumentoDe) = 30 O atDocumento(cIdDocumentoDe) = 31)
      lRegresa = 1
    FinSi
    Si pQueTipo = 1 y (atDocumento(cIdDocumentoDe) = 28 O atDocumento(cIdDocumentoDe) = 29)
      lRegresa = 1
    FinSi
  FinSi
  // N.D.3023 Fin

  // 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 pQueTipo = 0 y atDocumento(cUsaCliente) = 0 // cargo pero no es docto de cliente
    lRegresa = 1
  Finsi
  Si pQueTipo = 1 y atDocumento(cUsaProveedor) = 0 // abono pero no es docto de proveedor
    lRegresa = 1
  Finsi

  Retorna lRegresa
FinFunc


// =================================================================================================
// fNaturaleza ()
// Descripcion : Determina la naturaleza de un documento, en el caso de utilidades o
//               perdidas cambiarias determina si deben tomarse como abonos o cargos
// Comentarios : 
// RPC - ND 2100
// 06/07/2005   LAP     N.D.3346    Determinar correctamente la naturaleza de los documentos de 
//                                  utilidad / perdida cambiaria en el caso de proveedores. (LAP)
// =================================================================================================
Deffunc fNaturaleza(atDocto:TABLA)
  Local lNaturaleza
    
  // Se verifica la naturaleza por aquellos doctos de Utilidad O 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


// =================================================================================================
// fImprimeGranTotal ()
// Descripcion : Imprime los totales generales del reporte
// Comentarios : asume la misma distribucion de columnas que el cuerpo principal del reporte
// =================================================================================================
Deffunc fImprimeGranTotal()
Local lRenglon, lSubRaya

  lRenglon[4]  = @Col(gTotalSaldoIni;0)
  lRenglon[6]  = @Col(gTotalCargos;0)
  lRenglon[8]  = @Col(gTotalAbonos;0)
  lRenglon[10] = @Col(gTotalSaldos;0)
  lSubRaya = ''
  lSubRaya = '==================='[C4,C6,C8,C10]

  Imprime lSubRaya
  Imprime lRenglon
FinFunc


//**************************************************************************************************
//Encabezado.
//**************************************************************************************************
Encab
  Texto '@TC{255,0,0}@S{8}AdminPAQ' 
  Hoja '"@TC{0,0,0}@S{8}Hoja: ' 
  Imprime 
  Texto '@TC{0,0,0}@S{8}Moneda: ' & gNombreMoneda
  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}' & 'RESUMEN DEL ESTADO DE CUENTA DE CLIENTES'
  SiNo
    Texto '^@TC{0,0,0}@S{16}' & 'RESUMEN DEL ESTADO DE CUENTA DE PROVEEDORES'
  FinSi
  Imprime

  gDelaFecha = fFormateaFecha(pDelaFecha;0)
  gAlaFecha  = fFormateaFecha(pAlaFecha;0)
  Texto '^@TC{0,0,0}@S{16}'& 'Del: ' & gDelaFecha & ' Al: ' & gAlaFecha 
  Imprime 

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

  NEGRITAS TRUE
  Altura 9
  Texto '@TC{0,0,0}@L{-1}'
  Imprime 
  Texto C0; '^Código'
  Si pQueTipo = 0
    Texto C2; 'Nombre Cliente'
  SiNo
    Texto C2; 'Nombre Proveedor'
  FinSi
  Texto C4; '"Saldo Inicial'
  Texto C6; '"Cargos'
  Texto C8; '"Abonos'
  Texto C10;'"Saldo Final'
  Imprime 
  Texto '@TC{0,0,0}@L{-1}'
  Imprime 
  NEGRITAS FALSE
 FinEncab


//**************************************************************************************************
//Cuerpo principal.
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// 29/10/2002   LAP     N.D.1423    En el filtro "Solo con documentos" no debe de imprimir los 
//                                  clientes que no tienen documentos alguno.
// 20/04/2005   LAP     N.D.3023    Expresar los importes de los documentos en la moneda 
//                                  del reporte. Considerando que los documentos en moneda 
//                                  base tienen el tipo de cambio de la moneda del cliente 
//                                  a la moneda base. Utilizar fCambiarMonedaDoctoAReporte de
//                                  LibAdminPAQ.rpt
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
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 algunas valores
// Globales para la biblioteca LibAdminPAQ.rpt
fIniFechasHistoria(tPeriodos)

gRangoValido = pDeLaFecha <= pAlaFecha ? 1:0
Mientras[tClientes.Busca[pDelCliente & '..'  & pAlCliente]; tClientes->Encontro; tClientes.Busca Siguiente[1]]
  Si fDiscriminaCliente(tClientes) = 1
    Continua
  Finsi
  
  //N.D.5683 Este código queda igual solo se hace la observación que este pIdMoneda es el filtro
  //solo para mostrar los que clientes o proveedores que tengan definida esta moneda en el catálogo.
  //Si pIdMoneda != 1 Y pIdMoneda != tClientes(cIdMoneda)
  Si pIdMoneda != tClientes(cIdMoneda) //RCVG ND 5384    	
    Continua
  FinSi
    
  //Si la moneda del cliente es pesos y requiere un reporte en moneda extranjera nose visualizará este documento
  //no es posible obtener un tipo de cambio con exactitud para convertir a moneda extranjera
  Si pIdMoneda = 1 Y pIdMoneda1 != 1
  	continua
  FinSi
  //Fin N.D.5683        
  
  // Inicializar para cada cliente su bandera de impresión.
  gClienteConDoctos = 0
  gSaldoIniCte = 0
  gCargosCte = 0
  gAbonosCte = 0

  // N.D.3010 Inicio
  // Búsqueda de un documento del cliente/proveedor a la fecha inicial del reporte
  // Se inicializa la fecha con la que se realizaran las busquedas en el rango de fechas
  gFechaBusqueda = pDeLaFecha  

  // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
  tDocumentos.Usaindice['iClienteProveedorFecha']
  tDocumentos.Busca[tClientes(cIdClienteProveedor) & ':' & gFechaBusqueda]
  Si !tDocumentos->ENCONTRO
    // Busquedas parciales: Cursor en el registro más cercano que cumple con la llave
    // NOTA: La propiedad Llave de la tabla nos regresa la llave más cercana que cumple con el criterio de la búsqueda
    //       La llave está en formato cadena y no tiene ningún separador entre los campos, por lo que es necesario revisar
    //      en FoxPro la definición del índice para descomponer los elementos de la Llave
    // Revisar si la llave actual corresponde al Producto / Almacén y al Rango de Fechas.
    Si tClientes(cIdClienteProveedor) = @Val(@SUBSTR(tDocumentos->Llave;0;11))
      Si @SUBSTR(tDocumentos->Llave;11;8) >= pDeLaFecha Y @SUBSTR(tDocumentos->Llave;11;8) <= pAlaFecha
        // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
        gFechaBusqueda = @SUBSTR(tDocumentos->Llave;11;8)
        tDocumentos.Busca[tClientes(cIdClienteProveedor) & ':' & gFechaBusqueda]
      FinSi
    FinSi        
  FinSi

  // Todos aun sin Doctos o  el Cliente si tiene Doctos
  Si (pSoloConDoctos = 0) O tDocumentos->ENCONTRO
    gSaldoIniCte = fSaldoInicial(tClientes; gIdEjercicio; gPeriodo; pIdMoneda1; pDelaFecha; pQueTipo; tAcumuladosLib; tDoctosLib1; tTiposCambioLib)[C0] //N.D.5683
    // La tabla de documentos ya está posicianada en el primer documento del cliente en el rango de fechas
    // Recorrer los documentos hasta que sea diferente cliente/proveedor o se rompa el rango de fechas
    Mientras tDocumentos->Encontro Y (tDocumentos(cFecha) <= pAlaFecha)
      Si fDiscriminaDocto(tDocumentos) = 1
        // Búsqueda del siguiente registro que cumpla con el cliente
        tDocumentos.BUSCA SIGUIENTE[1]
        Continua
      Finsi
        
      // Este cliente tiene documentos
      gClienteConDoctos = 1

      // Expresar el documento en la moneda del reporte a traves de fCambiarMonedaDoctoAReporte
      gTotalDocumento = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambioLib; tDocumentos(cTotal); pIdMoneda1; tClientes(cIdMoneda)) //N.D.5683
      // N.D.3238 Redondear los importes antes de mostrarlos
      gTotalDocumento = fRedondeaImporteLib(gTotalDocumento; gDecimales)
       
      Si fNaturaleza(tDocumentos) = 0
        gCargosCte = gCargosCte + gTotalDocumento[C0]
      Sino
        gAbonosCte = gAbonosCte + gTotalDocumento[C0]
      FinSi
        
      // Búsqueda del siguiente registro que cumpla con el cliente
      tDocumentos.BUSCA SIGUIENTE[1]
    FinMientras
  Finsi
  // N.D.3010 Fin 
  
  // Solo imprimir el cliente y totalizar sus importes solo si:
  //  1. se desean imprimir todos los clientes ya sea con documentos o no.
  //  2. si solo se van a imprimir los clientes con documentos y tiene documentos.
  Si (pSoloConDoctos = 0) o (pSoloConDoctos = 1 y gClienteConDoctos = 1)
    // Si se imprimen clientes los cargos contables también son cargos comerciales.
    // Por el contrario, cuando se imprimen proveedores los cargos comerciales son abonos contables 
    //  y por eso se hacen negativos
    Si pQueTipo = 0
      // Clientes
      gSaldoCte = gSaldoIniCte + gCargosCte - gAbonosCte[C0]
    SiNo
      // Proveedores
      gSaldoCte = gSaldoIniCte - gCargosCte + gAbonosCte[C0]
    FinSi

    // Imprimir los datos del cliente
    vImprime = fMascarilla(tClientes(cCodigoCliente);tParametros(cMascarillaClientes))[C0]
    vImprime = tClientes(cRazonSocial)[C2]
    vImprime = @Col(gSaldoIniCte;0)[C4]
    vImprime = @Col(gCargosCte;0)[C6]
    vImprime = @Col(gAbonosCte;0)[C8]
    vImprime = @Col(gSaldoCte;0)[C10]
    DEFREGION ContextoDetalleCliente
    Si gCargosCte != 0
      [C6].REGIONINFO tClientes(cCodigoCliente)
    FinSi
    Si gAbonosCte != 0
      [C8].REGIONINFO tClientes(cCodigoCliente)
    FinSi
    Lista vImprime

    gTotalSaldoIni = gTotalSaldoIni + gSaldoIniCte[C0]
    gTotalCargos = gTotalCargos + gCargosCte[C0]
    gTotalAbonos = gTotalAbonos + gAbonosCte[C0]
    gTotalSaldos = gTotalSaldos + gSaldoCte
  FinSi

FinMientras

// Imprime los totales del reporte
fImprimeGranTotal()

//  FIN DEL REPORTE




