// >>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     AUXILIAR DE MOVIMIENTOS POR CONCEPTO, CLIENTES/PROVEDORES     AuxMovPorCpto.rpt 
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: El auxiliar de movimientos imprime todos los documentos registrados para un 
//              cliente de acuerdo al rango de fechas seleccionado. 
//              Este reporte imprime totales, agrupados Por Concepto, Por Cliente y un Total General.
// 
// Consideraciones :
// Creación        : Felix de la Cruz S.   10/Septiembre/2001
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// *************************************************************************************************
// INCLUSION DE ARCHIVOS                                       
// *************************************************************************************************
   Incluye LibAdminPaq.rpt                                  
   Incluye LibCliProv.rpt

// *************************************************************************************************
// INICIO PARAMETROS
// *************************************************************************************************
    Parametro pDeLaFecha    = '20010101'      // Inicio del periodo actual.
		Parametro pAlaFecha     = '20011231'      // Fin del periodo actual
    Parametro pDelCliente   = ' '             // clave del primer cliente en el rango
		Parametro pAlCliente    = ' '             // clave del ultimo cliente en el rango
    Parametro pIdListaCptos = '5,11,13,14'    // Para Clientes, Lista de conceptos de cargo
                                              // Para Proveedores, Lista de conceptos de Abonos
    Parametro pSoloConDoctos  =  0            // 1 = Si, 0 = No
    Parametro pCualesClientes =  0            // 0 =todos, 1= Activos, 2= InActivos
    Parametro pIdMoneda       =  1            // 1 = ID moneda Peso mexicano
    Parametro pQueTipo        =  1        // 0 = Clientes, 1 = Proveedores     
    Parametro pIdClase1   = 0             // por omisión deben recibir 0 =  ninguna
    Parametro pIdClase2   = 0    
    Parametro pIdClase3   = 0   
    Parametro pIdClase4   = 0             // deben ser el ID de la clasificacion
    Parametro pIdClase5   = 0
    Parametro pIdClase6   = 0             // por omisión deben recibir 0 =  ninguna

// *************************************************************************************************
// INICIO APERTURA TABLAS
// *************************************************************************************************
// Nombres terminados en Lib, indican que la tabla fue abierta explicitamente para alguna Fx de libreria
  UsaEmpresa tEmpresa;'AdminpaqW'               

   // Parametros de la empresa
  UsaTabla tParametros = tEmpresa['mgw10000']         // Usa el indice primario

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

  // Conceptos de los documentos
  UsaTabla tConceptos = tEmpresa['mgw10006']     
  tConceptos.UsaIndice['cIdConceptoDocumento']

  // Documentos
  UsaTabla tDocumentos = tEmpresa['mgw10008'] Alias 'tDoctos1'  
  tDocumentos.Usaindice['iClienteProvCptoFecha']      //IdClienteProveedor+cIdCpto+cFecha+cSerie+cFolio
  UsaTabla tDoctoslib = tEmpresa['mgw10008']  Alias 'tDoctos2'               
  tDoctosLib.UsaIndice['iClienteProveedorFecha']      //IdClienteProveedor+cFecha+cSerie+cFolio
  // Acumulados por periodo
  UsaTabla tAcumuladosLib = tEmpresa['mgw10018']      // cIdTipoAcumulado + cIdOwner1 + cIdOwner2 
  tAcumuladosLib.Usaindice['iAcumImpteOwnerEjerMoneda']    // + cIdEjercicio + cIdMoneda

  // Valores de clasificaciones, 
  UsaTabla tValoresDeClasif = tEmpresa['mgw10020']
  tValoresDeClasif.UsaIndice['']

   // Periodos
  UsaTabla tPeriodos = tEmpresa['mgw10031']           // Usa el indice primario, cIDEjercicio
  tPeriodos.UsaIndice['cNumeroEjercicio']

  // tabla de monedas y su tipo de cambio
  UsaTabla tMonedas = tEmpresa['mgw10034']          
  tMonedas.Usaindice['']                              //  Usa el índice primario, por cIdMoneda

  // TiposCambio 
  Usatabla tTiposCambioLib = tEmpresa['mgw10035']
  tTiposCambioLib.Usaindice['iMonedaFecha']                                  //  cIdMoneda + cFecha

// *************************************************************************************************
// DEFINICION DE COLUMNAS 
// *************************************************************************************************
              // C0      C2        C4       C6       C8       C10      C12       C14
  Columnas 15; 1.65,0.15,0.75,0.15,1.2,0.15,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1  
  UsaLetra 'Arial'
  Altura 9
  [C0,C2,C4,C12].Decimales 0
  [C0,C2,C4,C12].Blanco ' '
  [C6,C8,C10,C14].Coma
  tMonedas.Busca[@Str(pIdMoneda;0)]
  gDecimales = tMonedas(cDecimalesMoneda)
  [C6,C8,C10].Decimales gDecimales
  [C6,C8,C10].Blanco '0.00'
  [C14].Decimales 4
  [C14].Blanco '0.0000'
  [C6,C8,C10,C14].Corchete True

// *************************************************************************************************
// VARIABLES GLOBALES 
// *************************************************************************************************
  gHoy = fFormateaFecha(@Hoy();0)
  gDelaFecha = ''
  gAlaFecha  = '' 
  gPeriodo   = 0
  gIdEjercicio = 0 
  gNombreMoneda = tMonedas(cNombreMoneda)

  gNombresCptos = ''            // guardará una lista con los nombres de los cptos seleccionados
  gSaldoCliente = 0.0           // Tiene el saldo inicial originalmente, pero se modifica con cada
                                // importe adicional
  gGranTotalCargos = 0.0        // variables para los totales generales 
  gGranTotalAbonos = 0.0
  gYaSeImprimioCliente = 0

// *************************************************************************************************
// FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
// =================================================================================================
// Función área sensible al contexto
// =================================================================================================
DefFunc ContextoDetalleDocto(aNumeroColumna; aValor)
Local lTipo
    Si pQueTipo = 0 // Clientes
      lTipo = 1 // Ventas
    Sino
      lTipo = 0 // Compras
    FinSI
    EJECUTA tEmpresa->SysDirDatos & '\Reportes\AdminPAQ\ImpDoctos.RTW';@Escoge(aValor;1),@Escoge(aValor;1),@Escoge(aValor;2),@Escoge(aValor;3),@Escoge(aValor;3),@Escoge(aValor;0),' ',' ',' ',' ',' ',0,1,0,0,2,1,lTipo;tEmpresa->Directorio
FinFunc


// *************************************************************************************************
Deffunc fColumnas(aTipo)
  Si aTipo = 1
                // C0      C2        C4       C6        C8        C10       C12       C14
    Columnas 15; 1.65,0.15,0.75,0.15,1.2,0.15,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1  
  Sino
               // C0      C2        C4       C6        C8        C10       C12       C14
    Columnas 15; 2.3,0.15,0.1,0.15,1.2,0.15,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1   
  Finsi
FinFunc

// *************************************************************************************************
// Esta función recupera y guarda en una lista, los nombres de los conceptos, para tenerlos en
// memoria y evitar lectura con cada cliente.
// *************************************************************************************************
Deffunc fCargaNombresCptos()
Local lPosicion

  lPosicion = 0
  Mientras @Escoge(pIdListaCptos;lPosicion)!= ''         
    tConceptos.Busca[@Escoge(pIdListaCptos;lPosicion)]    
    Si lPosicion = 0
      gNombresCptos = tConceptos(cNombreConcepto)
    Sino
      gNombresCptos = gNombresCptos & ','&tConceptos(cNombreConcepto)
    Finsi
    lPosicion = lPosicion +1
  FinMientras
FinFunc

// *************************************************************************************************
// 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
//          Posicion : tiene la posición dentro de la lista, que corresponde al concepto 
// *************************************************************************************************
Deffunc BuscaAlgunReg(aFechaIni;aFechaFin;aIdBuscado;aTblDeBusqueda:TABLA;aListaCptos)
Local lpos, lFechaIni

  lFechaIni = aFechaIni
  lpos = 0
  Mientras @Escoge(aListaCptos;lpos) != ''
    aTblDeBusqueda.BUSCA[aIdBuscado &':'& @Escoge(aListaCptos;lpos)]
    Si aTblDeBusqueda->Encontro
      aFechaIni = lFechaIni
      // Busca la llave completa, de otra forma nunca entraria al ciclo
      aTblDeBusqueda.BUSCA[aIdBuscado &':'& @Escoge(aListaCptos;lpos)&':' &aFechaIni]
      // si lo encontro en la primer fecha, ya no entra
      Mientras aFechaIni <= aFechaFin Y !aTblDeBusqueda->ENCONTRO 
        aTblDeBusqueda.BUSCA[aIdBuscado &':'& @Escoge(aListaCptos;lpos)&':' &aFechaIni]
        Si !aTblDeBusqueda->Encontro 
          aFechaIni = fFechaSiguiente(aFechaIni)
        Finsi
      FinMientras
      // Si lo encontro se sale del ciclo para dejar a lPos en la pos. del primer Cpto encontrado
      Si aTblDeBusqueda->Encontro 
        Finciclo
      Sino
        lpos = lpos + 1   
      Finsi
    Sino
      lpos = lpos + 1 
    Finsi
  FinMientras 
  Retorna  lpos
Finfunc


// *************************************************************************************************
// *************************************************************************************************
Deffunc fDefineNaturaleza(atDocto:TABLA;aCargo;aAbono;aSaldo)
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(abono)
  // 31. Perdida Cambiaria Proveedor(cargo)
  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

  Si lNaturaleza = 0
    aCargo = fCambiarMonedaDoctoAReporte(atDocto; tTiposCambioLib; atDocto(cTotal); pIdMoneda; tClientes(cIdMoneda))
    aAbono = 0.0
  Sino
    aAbono = fCambiarMonedaDoctoAReporte(atDocto; tTiposCambioLib; atDocto(cTotal); pIdMoneda; tClientes(cIdMoneda))
    aCargo = 0.0
  Finsi

  //Se actualiza el saldo del cliente
  Si pQueTipo = 0
    aAbono = -aAbono
  sino
    aCargo = -aCargo
  Finsi
  aSaldo =aSaldo + aCargo + aAbono
FinFunc


// *************************************************************************************************
// Descripcion : Imprime los datos del cliente, como encabezado para despues imprimir el detalle
//               Obtiene el saldo inicial ya que es parte de los datos del cliente
// Entrada : La tabla de clientes, con el cliente a imprimir abierto
// Salida  : No regresa valor,
//           pero imprime los renglones de 1.- Datos del cliente;  1.- Saldo inicial el cliente
// *************************************************************************************************
DefFunc fImpDatosCliente(aTCliente:TABLA;aSaldo;aTipo)
local lRenglon   

  lRenglon = ''
  NEGRITAS TRUE       
  Si aTipo = 0
    Texto 'Cliente:    ' & fMascarilla(atCliente(cCodigoCliente);tParametros(cMascarillaClientes))
  Sino
    Texto 'Proveedor:  ' & fMascarilla(atCliente(cCodigoCliente);tParametros(cMascarillaClientes))
  Finsi
  Imprime
  Texto   'Nombre:     ' & atCliente(cRazonSocial)
  Imprime 1
  NEGRITAS FALSE
  fColumnas(2)
  lRenglon[0] = 'Saldo Inicial' 
  lRenglon[10]= aSaldo
  Imprime lRenglon
  fColumnas(1)
FinFunc


// *************************************************************************************************
// *************************************************************************************************
Deffunc fImprimeDocumento(atDocto:TABLA; aSaldo; aNombreCpto; aCargo; aAbono)
Local lRenglon
Local lSerieDocto

  Si aNombreCpto != ''
    Negritas True
    Texto 'Concepto: ' & aNombreCpto
    Imprime
    Negritas False
  FinSi

  lRenglon = ''
  lRenglon[0] = fFormateaFecha(atDocto(cFecha);0)
  lRenglon[2] = atDocto(cSerieDocumento)
  lRenglon[4] = atDocto(cFolio)
  DEFREGION ContextoDetalleDocto
  Si atDocto(cSerieDocumento) = ''
    lSerieDocto = ' '
  Sino
    lSerieDocto = atDocto(cSerieDocumento)
  FinSi
  [C4].REGIONINFO atDocto(cIdDocumentoDe) & ',' & atDocto(cFecha) & ',' & lSerieDocto & ',' & atDocto(cFolio)
  Si atDocto(cNaturaleza) = 0 O atDocto(cIdDocumentoDe) = 28 O atDocto(cIdDocumentoDe) = 30
  // Si se trata de un docto de cargo
    // si es un cliente el docto debe tener fecha de venc.
    lRenglon[12] = (pQueTipo = 0 ? fFormateaFecha(atDocto(cFechaVencimiento);0): ' ')
    lRenglon[6] = aCargo  
  Sino
  // Entonces es un abono  
    // si es un proveedor al docto debe tener fecha venc.
    lRenglon[12] = (pQueTipo = 1 ? fFormateaFecha(atDocto(cFechaVencimiento);0): ' ')
    lRenglon[8] = aAbono
  FInsi
  lRenglon[10] = aSaldo  
  lRenglon[14] = atDocto(cTipoCambio)
  Imprime lRenglon 
FinFunc


// *************************************************************************************************
// 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


// *************************************************************************************************
// Salidas:  1 = indica que el Docto no aplica, debe descartarse
//           0 = indica que el Docto no debe descartarse.
// *************************************************************************************************
DefFunc fDiscriminaDocumento(atDocumento:TABLA)
Local lRegresa

  lRegresa = 0
  // 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 no esta afectado se lo brinca
  Si atDocumento(cAfectado) != 1
    lRegresa =1
  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) != 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 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


// *************************************************************************************************
// *************************************************************************************************
Deffunc fImprimeTotalConcepto(aSaldo;aTotalCargos;aTotalAbonos)
Local lRenglon
  
  Columnas 15; 3.50,0.15,0.15,0.15,0.05,0.05,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1    
  [C6,C8].Subrayacol '-' 
  lRenglon[6] = aTotalCargos 
  lRenglon[8] = aTotalAbonos
  Imprime lRenglon
  Imprime 1  
  fcolumnas(2)
FinFunc


// *************************************************************************************************
// Recibe le saldo por parámetro, los cargos y abonos los toma de variable globales
// *************************************************************************************************
Deffunc fImprimeTotalesCliente(aSaldo)      
Local lRenglon

  Columnas 15; 3.50,0.15,0.15,0.15,0.05,0.05,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1   
  [C6,C8].Subrayacol '-'   
  Si pQuetipo = 0
    lRenglon[0] = '                      Total cliente'
  Sino
    lRenglon[0] = '                      Total proveedor' 
  FinSi
  lRenglon[6] = gTotalCargosCliente
  lRenglon[8] = gTotalAbonosCliente
  Imprime lRenglon
  Imprime 1
  // Acumula Totales generales
  gGranTotalCargos = gGranTotalCargos + gTotalCargosCliente
  gGranTotalAbonos = gGranTotalAbonos + gTotalAbonosCliente
FinFunc


// *************************************************************************************************
// Solo imprimie totales generales, son varoables de alcance global
// *************************************************************************************************
Deffunc fImprimeGranTotal()      
Local lRenglon,lSubRaya

  lSubRaya = ''
  lSubRaya = '================'[C6,C8]
  Saltalin 1
  Imprime lSubRaya
  Columnas 15; 3.50,0.15,0.15,0.15,0.05,0.05,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,1   
  lRenglon[0] = '                      Total General'   
  lRenglon[6] = gGranTotalCargos
  lRenglon[8] = gGranTotalAbonos
  Imprime lRenglon
FinFunc


// *************************************************************************************************
// ENCABEZADO 
// *************************************************************************************************
  Encab  
    Texto '@TC{0,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}' & 'AUXILIAR DE MOVIMIENTOS POR CLIENTE'
    Sino
      Texto '^@TC{0,0,0}@S{16}' & 'AUXILIAR DE MOVIMIENTOS POR PROVEEDOR'
    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 C10;'^Saldo'
    Texto C14;'^Tipo'
    Imprime
    Texto C0; 'Fecha'
    Texto C2; 'Serie'
    Texto C4; 'Folio'
    Texto C6; '^Cargos'
    Texto C8; '^Abonos'
    Si pQueTipo = 0
      Texto C10;'^Cliente'
    Sino
      Texto C10;'^Proveedor'
    Finsi
    Texto C12;'Vence'
    Texto C14;'^Cambio'
    Imprime 1
    Texto '@TC{0,0,0}@L{-1}'
    Imprime 
    NEGRITAS FALSE
  FinEncab

// *************************************************************************************************
// PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
Si pDelCliente = ' '
  tClientes.Busca Primero
  pDelCliente = tClientes(cCodigoCliente)
Finsi
  
Si pAlCliente = ' '
  tClientes.Busca Ultimo
  pAlCliente =  tClientes(cCodigoCliente)  
Finsi

tParametros.Busca Primero   

// primeto carga todos los nombres de los conceptos, solo una vez
fCargaNombresCptos()

// Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunas valores
// Globales para la biblioteca LibAdminPAQ.rpt
fIniFechasHistoria(tPeriodos)

// Obtener el Ejercicio y el Periodo que le corresponde a pFechaIni, para calcular saldo inicial  
// Se calculan al inico y se pasan como parametros, para calcularlos solo una vez.
fEjercicioPeriodo(pDelaFecha;&gPeriodo;&gIdEjercicio;tPeriodos)  

Mientras[tClientes.Busca[pDelCliente & '..'  & pAlCliente ]; tClientes->Encontro ; tClientes.Busca Siguiente[1]]
  Si fDiscriminaCliente(tClientes) =1
    Continua
  Finsi

  Si pIdMoneda != 1 Y pIdMoneda != tClientes(cIdMoneda)
    Continua
  FinSi

  // Se inicializa la fecha con la que se realizaran las busquedas en el rango de fechas
  gFechaBusqueda = pDeLaFecha  
  gPosicion = 0
  gTotalCargosCliente = 0.0
  gTotalAbonosCliente = 0.0
  gYaSeImprimioCliente = 0

  // busca Algun docto , debe estar afectado y dentro del rango
  // Si encontro tDocumentos queda en el registro encontrado y gFechaBusqueda en la fecha en que se encontro
  gPosicion = BuscaAlgunReg(&gFechaBusqueda;pAlaFecha;tClientes(cIdClienteProveedor);&tDocumentos;pIdListaCptos)
  // gPosicion tiene la posicion del Primer ID que encontro
  // si no encontró, tiene una posicion mayor que el numero de elementos y debe regresar NULL
  // Todos aun sin Doctos O  el Cliente si tiene Doctos
  Si (pSoloConDoctos = 0) O (tDocumentos->ENCONTRO  )
    // se le pasa la tabla de tDoctoslib, por que tiene un indice diferente a la tDocumentos
    gSaldoCliente = fSaldoInicial(tClientes;gIdEjercicio;gPeriodo;pIdMoneda;pDelaFecha;pQueTipo;tAcumuladosLib;tDoctoslib;tTiposCambioLib)

    // Se barre cada uno de los conceptos, iniciando por el primero que encontro
    Mientras @Escoge(pIdListaCptos ; gPosicion) != ''
      // Se obtine el nombre del concepto en proceso y se inicializa el contador de doctos por Cpto
      gNombreCpto = @Escoge(gNombresCptos;gPosicion)
      gAlMenosUnDocto = 0
      // Totales por concepto
      gTotalCargosCpto = 0.0
      gTotalAbonosCpto = 0.0
      // Se buscan movtos asociados a el concepto en todo el rango de fechas
      Mientras gFechaBusqueda <= pAlaFecha
        // Ahora si barre todos los movimientos a partir del primero que ya habia encontrado
        // la Llave base se refiere al IdCliente y el IdConcepto, solo cambiaria la fecha
        gLlaveBase = @Str(tClientes(cIdClienteProveedor);0)&':'&@Escoge(pIdListaCptos ; gPosicion)
        Mientras [tDocumentos.BUSCA[ gLlaveBase & ':' & gFechaBusqueda]; tDocumentos->ENCONTRO; tDocumentos.BUSCA SIGUIENTE[3]]
		      // Se saltan los doctos que no deben aplicar
          Si fDiscriminaDocumento(tDocumentos) = 1
            Continua
          Finsi

          Si gYaSeImprimioCliente = 0
            fImpDatosCliente(tClientes; gSaldoCliente; pQueTipo)
            gYaSeImprimioCliente = 1
          FinSi

          // Se define si es saldo o abono, y se afecta el saldo inicial
          fDefineNaturaleza(tDocumentos; &gCargo; &gAbono; &gSaldoCliente)

          // Se imprime el Documento. El nombre del concepto solo se imprime la primera vez.
          gAlMenosUnDocto = gAlMenosUnDocto +1
          fImprimeDocumento(tDocumentos; gSaldoCliente; gNombreCpto; gCargo; gAbono)
          // Solo la primera vez se imprime el nombre
          gNombreCpto = ''

          // Afectar los Totales por Concepto
          gTotalCargosCpto = gTotalCargosCpto + gCargo
          gTotalAbonosCpto = gTotalAbonosCpto + gAbono         
          // Afectar los totales por Cliente / Proveedor
          gTotalCargosCliente = gTotalCargosCliente + gCargo
          gTotalAbonosCliente = gTotalAbonosCliente + gAbono
        FinMientras                      
        // Fin del mientras Documentos.busca
        gFechaBusqueda = fFechaSiguiente(gFechaBusqueda)
      FinMientras             // mientras la fecha es menor

      // se imprime los totales de concepto
      Si gAlMenosUnDocto > 0
        fImprimeTotalConcepto(gSaldoCliente; gTotalCargosCpto; gTotalAbonosCpto)
      FinSi
      // reinicia la fecha para seguir con la busqueda desde la fecha inicial
      gFechaBusqueda = pDeLaFecha
      gPosicion = gPosicion + 1
    FinMientras

    // se imprimen los totales del cliente
    Si gYaSeImprimioCliente = 1
      fImprimeTotalesCliente(gSaldoCliente)
    FinSi
  Finsi 
  // Fin del Si solo con documentos
FinMientras                            
// Fin del mientras tClientes.busca

// se imprimen los totales generales
fImprimeGranTotal() 
//  FIN DEL REPORTE

