// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     AUXILIAR DE MOVIMIENTOS POR CONCEPTO, CLIENTES/PROVEDORES     
//              AuxMovConcepto.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. 
//
// Consideraciones :
// Creación        : Leonardo Aguilar Pizano   09/Enero/2003
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus   Descripcion 
//  15/01/2003 LAP      S.C.291   Implementación inicial.
//  16/03/2005 HVA      S.C.3023  Saldos Bimonedas considerando Utilidades y perdidas
// 20/04/2005   LAP     N.D.3023    Incluir los documentos de utilidad / perdida
//                                  cambiaria siempre y cuando correspondan a la
//                                  moneda del reporte
//                                  - fDiscriminaDocto cambia a fDiscriminaDocumento
// 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
//                                  - fDefineNaturaleza
//                                  - fConvierteMoneda (ELIMINACION)
//  17/11/2005  LAP    N.D.3010     Nuevo esquema de búsquedas parciales para agilizar los reportes
//                                  - Cuerpo del reporte
//  01/09/2006  LAP    N.D.4270     Impresión del Tipo de cambio del documento y no el Historico
//                                  - fImprimeDocto
//  17/07/2007  ELVS   N.D.4751     Invierte la naturaleza de la pérdida y utilidad cambiaría.
//  30/06/2009  MGCJ   N.D.5885     Se incluyen llaves parciales, y es necesario resetear el indice
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//******************************************************************************
// INCLUSION DE ARCHIVOS
//******************************************************************************
    Incluye LibAdminPaq.rpt
    Incluye LibCliProv.rpt
//******************************************************************************
// INICIO PARAMETROS
//******************************************************************************
    Parametro pDeLaFecha    = '20020101'      // Inicio del periodo actual.
		Parametro pAlaFecha     = '20021231'      // 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 pCancelados   = 0               // 0 - No, 1 - Si  
    Parametro pIdMoneda       =  1            // 1 = ID moneda Peso mexicano

    Parametro pQueTipo        =  0        // 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 Función 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['']                  // 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
  // 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 
//******************************************************************************
// Ancho de columnas = caracteres / 17 * 2.54
// Se consideran columnas intermedias de un espacio
// Columna Campo      Caracteres   Tamaño final
// C1      Fecha        11          1.65 
// C3      Serie         4          0.75
// C5      Folio        12          1.80
// C7      Cliente      33          5.00
// C9      Cargos       20          3.00
// C11     Abonos       20          3.00
// C13     Tipo Cambio   6          1.00
// C15     Estado       10          1.50 
// Espacio               1          0.15 
  Columnas 16;0.15,1.65,0.15,0.75,0.15,1.80,0.15,4.50,0.15,3.00,0.15,3.00,0.15,1.00,0.15,1.5,0.00
  UsaLetra 'Arial'
  Altura 9
  [C1,C3,C5,C7].Decimales 0
  [C1,C3,C5,C7].Blanco ' '
  [C7,C9,C11,C13].Coma
  tMonedas.Busca[@Str(pIdMoneda;0)]
  gDecimales = tMonedas(cDecimalesMoneda)
  [C7,C9,C11].Decimales gDecimales
  [C13].Decimales 4
  [C7,C9,C11,C13].Blanco '0.00'
  [C7,C9,C11,C13].Corchete True
  
  kColFecha = 1
  kColSerie = 3
  kColFolio = 5
  kColCliente = 7
  kColCargos = 9
  kColAbonos = 11
  kColTipoCambio = 13
  kColEstado     = 15
//******************************************************************************
//VARIABLES GLOBALES 
//******************************************************************************
  gHoy = fFormateaFecha(@Hoy();0)
  gDelaFecha = ''
  gAlaFecha  = '' 
  gFechaBusqueda = ''
  gPeriodo   = 0
  gIdEjercicio = 0 
  gNombreMoneda = tMonedas(cNombreMoneda)

  gConceptoImpreso = 0
  // Variables para los totales generales                               
  gTotalCargosConcepto = 0.0
  gTotalAbonosConcepto = 0.0
  gTotalCargosReporte = 0.0
  gTotalAbonosReporte = 0.0


// =============================================================================
// Nombre:  fDiscriminaCliente
// Proceso: 
// 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 aCliente(cCodigoCliente) < pDelCliente O aCliente(cCodigoCliente) > pAlCliente
    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

// =============================================================================
// Nombre:  fDiscriminaDocumento
// Proceso:
// 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. Esto debido a que ahora
//                                  existen documentos de este tipo en cualquier
//                                  moneda.
// =============================================================================
DefFunc fDiscriminaDocumento(atDocumento:TABLA)
Local lRegresa

  lRegresa = 0

  // Si no esta afectado se lo brinca
  Si atDocumento(cAfectado) != 1
    lRegresa =1
  Finsi

  Si pCancelados = 1 y atDocumento(cCancelado) = 1
    lRegresa = 0  
  FinSi

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

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


// =============================================================================
// Nombre:  fDefineNaturaleza
// Proceso:
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 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
// =============================================================================
Deffunc fDefineNaturaleza(atDocto:TABLA; aCargo; aAbono)
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)
	//N.D.4751
  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
    // N.D.3023 Expresar el total del documento en la moneda del reporte
    //!aCargo = fConvierteMoneda(atDocto; pIdMoneda)
    aCargo = fCambiarMonedaDoctoAReporte(atDocto; tTiposCambioLib; atDocto(cTotal); pIdMoneda; tClientes(cIdMoneda))
    aAbono = 0.0
  Sino
    // N.D.3023 Expresar el total del documento en la moneda del reporte
    //!aAbono = fConvierteMoneda(atDocto; pIdMoneda)
    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
FinFunc

// =============================================================================
// Nombre:  fImprimeDocto
// Proceso
// =============================================================================
Deffunc fImprimeDocto(atDocto:TABLA; atCliente:TABLA; aCargo; aAbono)
Local lRenglon

  lRenglon = ''
  lRenglon[kColFecha] = fFormateaFecha(atDocto(cFecha);0)
  lRenglon[kColSerie] = atDocto(cSerieDocumento)
  lRenglon[kColFolio] = atDocto(cFolio)
  lRenglon[kColCliente] = atCliente(cRazonSocial)
  lRenglon[kColCargos] = aCargo  
  lRenglon[kColAbonos] = aAbono
  // N.D.4270 Impresión del Tipo de cambio del documento
  lRenglon[kColTipoCambio] = atDocto(cTipoCambio)
  //!Si pIdMoneda != atDocto(cIdMoneda)
  //!  Si pIdMoneda = 1
  //!    lRenglon[kColTipoCambio] = atDocto(cTipoCambio)
  //!  Sino
  //!    lRenglon[kColTipoCambio] =  fTipoCambio(atDocto(cFecha); pIdMoneda; tTiposCambioLib)
  //!  FinSi
  //!FinSi
  
  Si atDocto(cCancelado) = 1
    lRenglon[kColEstado] = 'Cancelado'
  Sino
    Si atDocto(cImpreso) = 1
      lRenglon[kColEstado] = 'Impreso'
    FinSi
  FinSi
  Imprime lRenglon 

FinFunc

// =============================================================================
// Nombre:  fImprimeConcepto
// Proceso: Imprime los datos del concepto
// =============================================================================
DefFunc fImprimeConcepto(atConceptos:TABLA)

  Si gConceptoImpreso = 0
    NEGRITAS TRUE       
    Texto 'Concepto:     ' & atConceptos(cCodigoConcepto)
    Imprime
    Texto 'Nombre:       ' & atConceptos(cNombreConcepto)
    Imprime 1
    NEGRITAS FALSE
    gConceptoImpreso = 1
  FinSi  
FinFunc

// =============================================================================
// Nombre:  fImprimeTotalConcepto
// Proceso: 
// =============================================================================
DefFunc fImprimeTotalConcepto(atConceptos:TABLA)
Local lRenglon

  Si gConceptoImpreso = 1
    lRenglon = ' '
    lRenglon[kColAbonos] = '__________________________'
    lRenglon[kColCargos] = '__________________________'
    Lista lRenglon
  
    lRenglon = ' '
    lRenglon[kColCliente]= 'Total ' & atConceptos(cNombreConcepto) & ' :'
    lRenglon[kColAbonos] = gTotalAbonosConcepto
    lRenglon[kColCargos] = gTotalCargosConcepto
    Lista lRenglon
    Imprime 2
  
    gTotalCargosReporte = gTotalCargosReporte + gTotalCargosConcepto
    gTotalAbonosReporte = gTotalAbonosReporte + gTotalAbonosConcepto
  FinSi

  gConceptoImpreso = 0  
FinFunc

// =============================================================================
// Nombre:  fImprimeTotalReporte
// Proceso: 
// =============================================================================
DefFunc fImprimeTotalReporte()
Local lRenglon

  lRenglon = ' '
  lRenglon[kColAbonos] = '__________________________'
  lRenglon[kColCargos] = '__________________________'
  Lista lRenglon
  
  lRenglon = ' '
  lRenglon[kColCliente]= 'Total Reporte General: '
  lRenglon[kColAbonos] = gTotalAbonosReporte
  lRenglon[kColCargos] = gTotalCargosReporte
  Lista 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
  Texto '^@TC{0,0,0}@S{16}' & 'AUXILIAR DE MOVIMIENTOS POR CONCEPTO'
  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 
  lTitulo[kColFecha] = 'Fecha'
  lTitulo[kColSerie] = 'Serie'
  lTitulo[kColFolio] = 'Folio'
  Si pQueTipo = 0
    lTitulo[kColCliente] = '^Cliente'
  Sino
    lTitulo[kColCliente] = '^Proveedor'
  FinSi
  lTitulo[kColCargos] = '^Cargos'
  lTitulo[kColAbonos] = '^Abonos'
  lTitulo[kColTipoCambio] = '^Tipo'
  lTitulo[kColEstado] = 'Estado'
  Imprime lTitulo
  lTitulo = ' '
  lTitulo[kColTipoCambio] = '^Cambio'
  Imprime lTitulo
  Texto '@TC{0,0,0}@L{-1}'
  Imprime 
  NEGRITAS FALSE
FinEncab

//******************************************************************************
//PRINCIPAL 
//******************************************************************************

  tClientes.Usaindice['ICodigoT01']                  // cCodigoCliente + cTipoCliente
  
  Si pDelCliente = ' '
    tClientes.Busca Primero
    pDelCliente = tClientes(cCodigoCliente)
  Finsi
  
  Si pAlCliente = ' '
    tClientes.Busca Ultimo
    pAlCliente =  tClientes(cCodigoCliente)  
  Finsi

  tClientes.Usaindice['']                  // cCodigoCliente + cTipoCliente
  
  tParametros.Busca Primero   

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

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

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

  lPosicion = 0
  Mientras @Escoge(pIdListaCptos;lPosicion)!= ''      
    tConceptos.Busca[@Escoge(pIdListaCptos;lPosicion)]     
    gConceptoImpreso = 0

    // Inicialización de los totales
    gTotalCargosConcepto = 0.0
    gTotalAbonosConcepto = 0.0
      
    //Mientras[tClientes.Busca[pDelCliente & '..' & pAlCliente]; tClientes->Encontro; tClientes.Busca Siguiente[1]]
      // Discriminación del Cliente / Proveedor
      // N.D.3010 Inicio
      // Búsqueda de un movimiento del producto a la fecha inicial del reporte
      gFechaBusqueda = pDeLaFecha
      // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
      tDocumentos.Usaindice['iConcept01']
      tDocumentos.Busca[@STR(tConceptos(cIdConceptoDocumento);0) & ':' & 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 tConceptos(cIdConceptoDocumento) = @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[@str(tConceptos(cIdConceptoDocumento);0) & ':' & gFechaBusqueda]
            FinSi
          FinSi
                
      FinSi
               
      // N.D.3010 Recorrer los movimientos hasta que sea diferente producto, almacén o se rompa el rango de fechas
      Si tDocumentos->Encontro
        // Impresión del concepto
        fImprimeConcepto(tConceptos)
      
        Mientras tDocumentos->Encontro Y (tDocumentos(cFecha) <= pAlaFecha)
         tClientes.BUSCA[@STR(tDocumentos(cIdClien01);0)]
         Si !tClientes->ENCONTRO O fDiscriminaCliente(tClientes) =1
            tDocumentos.BUSCA SIGUIENTE[1] 
            Continua
        Finsi
         Si pIdMoneda != 1 Y pIdMoneda != tClientes(cIdMoneda)
           tDocumentos.BUSCA SIGUIENTE[1] 
           Continua
         FinSi
  	      // Discriminación de los documentos
          Si fDiscriminaDocumento(tDocumentos) = 1
            tDocumentos.BUSCA SIGUIENTE[1]
            Continua
          Finsi
          // Se define si es saldo o abono, y se afecta el saldo inicial
          fDefineNaturaleza(tDocumentos; &lCargo; &lAbono)
          fImprimeDocto(tDocumentos; tClientes; lCargo; lAbono)
          // Se afectan los Totales por Concepto
          Si tDocumentos(cCancelado) = 0
            gTotalCargosConcepto = gTotalCargosConcepto + lCargo
            gTotalAbonosConcepto = gTotalAbonosConcepto + lAbono
          FinSi
          // Búsqueda del siguiente registro que cumpla con el cliente / concepto
          tDocumentos.BUSCA SIGUIENTE[1]
        FinMientras             
      FinSi
      // N.D.3010 Fin
    //FinMientras
    // Fin Mientras: Recorrido de los clientes   
    tDocumentos.Usaindice[''] 
    lPosicion = lPosicion + 1
    fImprimeTotalConcepto(tConceptos)        
  FinMientras
  // Fin Mientras: Recorrido de los conceptos
  // se imprimen los totales generales
  fImprimeTotalReporte()

  //  FIN DEL REPORTE

