// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     ESTADO DE CUENTAS DE CLIENTES/PROVEDORES POR DOCUMENTO DE ABONO/CARGO  
//
// Sistema:     ADMINPAQ   Windows
//
// Descripcion: En Caso de mostrar información de Clientes :
//              El Estado de Cuenta despliega los Documentos del Cliente en un rango
//              de Fechas seleccionados, el orden puede ser :
//              a)Si se trata de un Abono: en orden de acuerdo a la serie-folio.
//              b)Si se trata de un Cargo: Aparecera despues del Abono al que salda, 
//                o al final ordenado por serie-folio si es que no salda ningun Abono o 
//                le queda un saldo a favor.
//
//              En Caso de mostrar información de Proveedores :
//              El Estado de Cuenta despliega los Documentos del Proveedor en un rango
//              de Fechas seleccionados, el orden puede ser :
//              a)Si se trata de un cargo: en orden de acuerdo a la serie-folio.
//              b)Si se trata de un abono: Aparecera despues del cargo al que salda, 
//                o al final ordenado por serie-folio si es que no salda ningun cargo o 
//                le queda un saldo a favor.
// Consideraciones :
// Creación  : 
// Revisiones : 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 29/10/2002   LAP     N.D.1427    En el caso de clientes/proveedores, si se 
//                                  imprime el Estado de Cuenta del Cliente con
//                                  el filtro "Solo con documentos" no debe de
//                                  considerar los documentos que tenga como
//                                  proveedor.
//                                  - fImpDatosCliente
//                                  - fImprimeResumen
//                                  - Cuerpo del reporte
// 06/12/2002   LAP     N.D.1672    Corrección a fin de que si el filtro de Solo
//                                  con documentos (pSoloConDoctos) este en Todos
//                                  realmente se impriman todos los clientes, ya que
//                                  actualmente solo imprime los que tienen documentos
//                                  - Cuerpo del reporte
// 28/07/2003   CILA    N.D.2335    Se cambio el numero de decimales de 2 a 4
//                                  para la columna de tipo de cambio.
// 09/03/2004	  LAP     N.D.2720    Nueva estructura para las relaciones abono-cargos
//                                  Encabezado, cuerpo y estructura del reporte. 
//                                  Adición de la columna de importe aplicado; la
//                                  cual muestra el importe que se abono al documento
//                                  de cargo.
//                                  - fImprimeDocumento.
// 13/04/2004   LAP     N.D.2744    Impresión de los documentos asociados con importes
//                                  en moneda diferente a la base.
//                                  - fImprimeDocumento
//                                  - fImprimeAbonosCargosAsociados
//                                  - Cuerpo del reporte
// 10/03/2005   HVA     N.D.3023
// 16/03/2005   HVA     N.D.3023 revision colegas
// 11/04/2005   HVA     N.D.3193 
// 20/04/2005   LAP     N.D.3023    Incluir los documentos de utilidad / perdida
//                                  cambiaria siempre y cuando correspondan a la
//                                  moneda del reporte.
//                                  - fImprimeAbonosCargosAsociados
//                                  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
//                                  - fImprimeDocumento
// 02/12/2005  LAP    N.D.3010      Nuevo esquema de búsquedas parciales para agilizar los reportes
//                                  - Cuerpo del reporte
//                                  - BuscaAlgunReg (ELIMINADO)
// 15/11/2007  ELVS   N.D.4893      Error cálculo incorrecto del saldo final por proveedor, al sumar
//                                  el saldo inicial de la compra más los cargos de los pagos, al generar
//                                  el reporte de estado de cuenta por documento de abono del rubro 
//                                  proveedores. Se están tomando al revés la naturaleza de los documentos
//                                  de compras y proveedores.
// 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. 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


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

  Incluye LibAdminPaq.rpt
  Incluye LibCliProv.rpt
  


//******************************************************************************
//Parámetros.
    
  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 pSoloConDoctos  = 0        // 1 = Si, 0 = No
  Parametro pSoloConSaldo   = 0        // 0 = todos, 1 = Sólo con saldo  
  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 pFormato        = 0        // 0 = Continuo, 1 = Cliente por Hoja
  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
  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']

  //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['']



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

	// N.D.2720 Adición de la columna: Importe aplicado
  //             C0       C2        C4       C6       C8       C10      C12      C14       C16      C18 
  //Columnas 19;1.65,0.15,0.75,0.15,1.2,0.15,3.75,0.15,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,0.15,1.2  
  //          Fecha     Serie     Folio     Concepto  Cargo     Abono     Asociado  Saldo     Venc      T.C.      Estado
  //          C0        C2        C4        C6        C8        C10       C12       C14       C16       C18       C20
  Columnas 21;1.80,0.10,0.75,0.10,1.20,0.10,3.50,0.10,2.10,0.10,2.10,0.10,2.00,0.10,2.10,0.10,1.65,0.10,0.95,0.10,0.90,0
  UsaLetra 'Arial'
  Altura 9
  [C0..C5].Coma
  [C0..C5].Decimales 0
  [C0..C5].Blanco ' '
  // 2728 Decimales
  [C6..C18].Coma
  tMonedas.Busca[@Str(pIdMoneda1;0)] //N.D.5683
  gDecimales = tMonedas(cDecimalesMoneda)
  // N.D.2335 Inicio ---------------------------
  //[C6..C16].Decimales gDecimales
  //[C6..C16].Blanco '0.00'
  [C6..C14].Decimales gDecimales
  [C6..C14].Blanco '0.00'
  // 2728 Decimales
  [C18].Decimales 4
  [C18].Blanco '0.0000'
  // N.D.2335 Fin ------------------------------
  // 2728
  [C6..C18].Corchete True



//******************************************************************************
//Declaración de variables globales.
  
  gHoy = fFormateaFecha(@Hoy();0)
  gDelaFecha = ''
  gAlaFecha  = '' 
  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 = tMonedas(cNombreMoneda)



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

// ==========================================================================================
// 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
// ==========================================================================================
Deffunc fColumnas(atipo)
  Si atipo = 1
  	// N.D.2720 Adición de la columna: Importe aplicado
    //Columnas 19;1.65,0.15,0.75,0.15,1.2,0.15,3.75,0.15,2.1,0.15,2.1,0.15,2.1,0.15,1.95,0.15,1.2,0.15,1.2
    //          Fecha     Serie     Folio     Concepto  Cargo     Abono     Asociado  Saldo     Venc      T.C.      Estado
    //          C0        C2        C4        C6        C8        C10       C12       C14       C16       C18       C20
    Columnas 21;1.80,0.10,0.75,0.10,1.20,0.10,3.50,0.10,2.10,0.10,2.10,0.10,2.00,0.10,2.10,0.10,1.65,0.10,0.95,0.10,0.90,0	
  Sino 
    Si atipo = 2
                 //C0     C1   C2 
      Columnas 6;1.5,0.15,6.45,0.1
    Sino 
      Si atipo = 3
                  //C0 
        Columnas 1;3
      Finsi
    Finsi
  Finsi
Finfunc



// ==========================================================================================
// fImpDatosCliente (Procedimiento)
// 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
// ==========================================================================================
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 29/10/2002   LAP     N.D.1427    Adición de la variable global gClienteImpreso
//                                   a fin de identificar si el encabezado del
//                                   cliente se ha impreso o no .
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DefFunc fImpDatosCliente(aTblCliente:TABLA;aSaldo;aTipo)
  local lRenglon   
       
  // N.D.1427 Inicio
  Si gClienteImpreso = 1
    // Ya se imprimio el cliente
    Retorna
  Sino
    // No se ha impreso el cliente
    gClienteImpreso = 1
  FinSi  
  // N.D.1427 Fin

  NEGRITAS TRUE
  fColumnas(2) 

  lRenglon = ''
  Si aTipo = 0
    lRenglon[0] = 'Cliente:'
  Sino
    lRenglon[0] = 'Proveedor:'
  Finsi

  lRenglon[2] = fMascarilla(aTblCliente(cCodigoCliente);tParametros(cMascarillaClientes))
  Imprime lRenglon
  lRenglon[0] = 'Nombre:'
  lrenglon = aTblCliente(cRazonSocial)[C2]
  Imprime lrenglon

  NEGRITAS FALSE

  fColumnas(1) 
  lRenglon = ''
  lRenglon[6] = 'Saldo Inicial'
  // N.D.2720
  lRenglon[14] = aSaldo
  Imprime lRenglon
  
FinFunc



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



// ==========================================================================================
// fImprimeDocumento (Procedimiento)
// Descripcion : 
// Entrada :La tabla de clientes, con el cliente a imprimir abierto
// Salida  :aTblDocto  = Documento que se va a imprimir 
//          gSaldoDocto = Saldo final del documento
//          pIdMoneda = ID de la moneda del cliente definido en el catálogo
//          aNivel : 1 = Si es el docto inicial
//                   2 = Si es un docto de cargo o abono, asociado al docto inicial
//                   3 = CUando es un Abono a saldo a favor de un cliente
//                         o un cargo con saldo a favor de un proveedor
//                   4 = Perdida o utilidad cambiaria N.D.2744
//          aImpDocto  = Este importe es que corresponde al docto.
//          aNaturaleza = NAturaleza del Docto que se imprime 0=Cargo, 1=Abono
//
// 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 fImprimeDocumento(aTblDocto:TABLA;aSaldoDocto;aIdMoneda;aTipo;aNivel;aImpDocto;aNaturaleza)
Local lSaldoMonedaRpt,lSaldoMonedaBase
Local lRenglon
Local lImpreso, lAfectado, lDevuelto
Local lImporteDoctoMonedaRpt, lImporteDoctoMonedaBase, lTipoCambioRpt

  // N.D.3023 Inicio
  // Expresar los importes de los documentos en la moneda del reporte. 
  //  Utilizar fCambiarMonedaDoctoAReporte de LibAdminPAQ.rpt
  lSaldoMonedaRpt = fCambiarMonedaDoctoAReporte(aTblDocto; tTiposCambioLib; aSaldoDocto; pIdMoneda1; tClientes(cIdMoneda)) //N.D.5683
  lImporteDoctoMonedaRpt = fCambiarMonedaDoctoAReporte(aTblDocto; tTiposCambioLib; aImpDocto; pIdMoneda1; tClientes(cIdMoneda)) //N.D.5683
  // N.D.3023 Fin
  // N.D.3238 Redondear los importes antes de mostrarlos
  lSaldoMonedaRpt = fRedondeaImporteLib(lSaldoMonedaRpt; gDecimales)
  lImporteDoctoMonedaRpt = fRedondeaImporteLib(lImporteDoctoMonedaRpt; gDecimales)  

  // N.D.2720 Inicio Adición de la columna: Importe aplicado
  // Fecha   Serie   Folio   Concepto   Cargo  Abono  Asociado  Saldo   Venc   T.C.   Estado
	// C0      C2      C4      C6         C8     C10    C12       C14     C16    C18    C20

	// Si el documento es un cargo imprime en la columna Cargo, de lo contrario
	// imprime en la columna Abono.
	// Los cargos incrementan el saldo del cliente, los abonos lo decrementan
  // Los Abonos Incrementan el saldo del Proveedor, los cargos lo decrementan
  lRenglon = ''[C0..C20]

  lRenglon = aTblDocto(cSerieDocumento)[C2]
  lRenglon = aTblDocto(cFolio)[C4]
  // N.D.2720 Identación de los documentos asociados
  // N.D.2744 Identación de la utilidad o perdida cambiaria
  //N.D.8914 Los documentos de pago que se muestran en el reporte de estado de cuenta por documento de abono deben omitir la 
  //funcionalidad de "sensible al contexto", porque no aplica para este tipo de documento donde no existe un detalle de movimientos.
  Si (aTblDocto(cIdDocumentoDe) >= 1 Y aTblDocto(cIdDocumentoDe) <= 6) O (aTblDocto(cIdDocumentoDe) >= 17 Y aTblDocto(cIdDocumentoDe) <= 21) O (aTblDocto(cIdDocumentoDe) = 38)  
	DEFREGION ContextoDetalleDocto
	[C4].REGIONINFO aTblDocto(cIdDocumentoDe) & ',' & aTblDocto(cFecha) & ' ,' & aTblDocto(cSerieDocumento) & ',' & aTblDocto(cFolio) //N.D.5511  
  FinSi   

  Si aNivel = 2 O aNivel = 4 O aNivel = -1
    lrenglon[0] = '   ' & fFormateaFecha(aTblDocto(cFecha);0)
  Sino
    lrenglon[0] = fFormateaFecha(aTblDocto(cFecha);0)
  FinSi

  tConceptos.Busca[@Str(aTblDocto(cIDConceptoDocumento);0)] 
  Si tConceptos->Encontro
    lRenglon = tConceptos(cNombreConcepto)[C6]
  Finsi

  Si aNaturaleza = 0  // es un cargo
    Si aNivel = 2
      lRenglon[12] = lImporteDoctoMonedaRpt
      lImporteDoctoMonedaRpt = 0
    Sino
      lRenglon[8] = lImporteDoctoMonedaRpt
    FinSi
    Si aNivel != -1
      gTotalCargosCliente = gTotalCargosCliente + lImporteDoctoMonedaRpt
    FinSi
  Sino                           // es un abono
    Si aNivel = 2
      lRenglon[12] = lImporteDoctoMonedaRpt
      lImporteDoctoMonedaRpt = 0
    Sino
      lRenglon[10] = lImporteDoctoMonedaRpt
    FinSi
    Si aNivel != -1
      gTotalAbonosCliente = gTotalAbonosCliente + lImporteDoctoMonedaRpt
    FinSi
  Finsi
  Si (aNaturaleza = 0 Y aTipo = 0) O (aNaturaleza = 1 Y aTipo = 1)
    lRenglon[16] = fFormateaFecha(aTblDocto(cFechaVencimiento);0)
  Finsi
  Si aNivel > 1       
    lRenglon[14] = (aNivel =  2 ? ' ' : lSaldoMonedaRpt)
  Sino
    lRenglon[14] = (aNivel = -1 ? ' ' : lSaldoMonedaRpt)
  Finsi
 
  // se acumulan los saldos, 
  gTotalSaldosCliente = gTotalSaldosCliente + lSaldoMonedaRpt
  // N.D.2744 Impresión del tipo de cambio del reporte
  //  lRenglon[18] = lTipoCambioRpt
  lRenglon[18] = aTblDocto( cTipoCambio )

  //Se determina el estado del documento
  lImpreso = aTblDocto( cImpreso )
  lAfectado= aTblDocto( cAfectado )
  lDevuelto = aTblDocto( cDevuelto )

  Si lImpreso = 1
    lRenglon[20] = '^(1)'
    Si lDevuelto = 1
      lRenglon[20] = '^(4)'
    Finsi
  Sino
    lRenglon[20] = '^(5)'
    Si lDevuelto = 1
      lRenglon[20] = '^(3)'      
    Sino   
      Si lAfectado = 1
        lRenglon[20] = '^(2)'      
      Finsi   
    Finsi
  Finsi
  // N.D.2720 Fin

  Si aNivel = -1
    ITALICO TRUE
  Finsi
  Imprime lRenglon
  Si aNivel = -1
    ITALICO FALSE
  Finsi

Finfunc



// ==========================================================================================
// fImprimeAbonosAsociados (Procedimiento)
// Descripcion : Imprime los abonos asociados a un documento de cargo
// Entrada :aTblDoctoActivo = Es el documento para el cual se buscaran los abonos/Cargos
//          aTblDoctosTmp  = Tabla de documentos sobre la que se buscaran los abonos/Cargos
//          aTblCargos = la Tabla de asociación de Documentos -> Documentos
//          aFechaInicial = Incio del rango
//          aFechaFinal =  Fin del rango
//          aTipo =  (0 = Clientes buscar abonos, 1= Proveedores Buscar cargos)
// Salida  :Imprime un renglón por cada abono asociado al documento.
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 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 fImprimeAbonosCargosAsociados(aTblDoctoActivo:TABLA;aTblDoctosTmp:TABLA;aTblCargos:TABLA;aFechaInicial;aFechaFinal;aTipo)
Local lsaldo, lImpDocto, lNat, lSaldoAjuste

  // Regresa al inicio de cargos y abonos para poder imprimir los abonos asociados al cargo 
  lSaldo = 0.0

  // Documentos de Cargo, se asegura que el indice sea el apropiado
  Si aTipo = 1//0
    aTblCargos.UsaIndice['iDoctoCargoAbono']
    aTblCargos.Busca Primero
  Sino
    aTblCargos.UsaIndice[''] // el indice primario es IDDoctoAbono+IDDoctoCargo
    aTblCargos.Busca Primero
  Finsi
  
  aTblCargos.BUSCA[@Str(aTblDoctoActivo(cIdDocumento);0)]
  Mientras aTblCargos->ENCONTRO
    Si (aTipo = 1) //0)    // si es para clientes, busca el abono
      // busca el documento de abono asociado, para obtener la fecha del docto,no la del CargoAbono
      aTblDoctosTmp.BUSCA[@Str(aTblCargos(cIdDocumentoAbono);0)]
    Sino              // Si es para Proveedores, busca el cargo
      // busca el documento de abono asociado, para obtener la fecha del docto,no la del CargoAbono
      aTblDoctosTmp.BUSCA[@Str(aTblCargos(cIdDocumentoCargo);0)]
    Finsi

    Si aTblDoctosTmp->Encontro
      // Toma solo el importe abonado o cargado a el documento, ya que el Importe Total puede estár 
      // divido en varios abonos a doctos diferentes.
      // Para clientes toma el importe cargo ;ya que es un abono asoc. a un cargo
      // Para Proveedore toma el importe de abono;ya que es un cargo asoc. a un abono
      //  -ambos importes estan reflejados  en la moneda del docto de la tabla aTblDoctosTmp-
      lImpDocto = (aTipo = 1 ? -(-aTblCargos(cImporteCargo)) : -(-aTblCargos(cImporteAbono)))
      // valida la fecha que este dentro del rango, o que solo se busquen a una fecha de corte
      Si (aFechaInicial = '' O aTblDoctosTmp(cFecha) >= aFechaInicial) Y (aTblDoctosTmp(cFecha) <= aFechaFinal)
        Si (pConDoctosNoAfectados = 1 O pConDoctosNoAfectados = 0 Y aTblDoctosTmp(cAfectado) = 1)
          // N.D.2744 Impresión del documento asociado
          fImprimeDocumento(aTblDoctosTmp; lSaldo; aTblDoctoActivo(cIdMoneda); aTipo; 2; lImpDocto; aTblDoctosTmp(cNaturaleza))
          // N.D.3023 Incluir los documentos de utilidad / perdida cambiaria si la moneda de dichos
          //  documentos corresponde a la del reporte
          Si aTblCargos(cIdUtilidadPerdidaCamb) > 0
            aTblDoctosTmp.Busca[@Str(aTblCargos(cIdUtilidadPerdidaCamb);0)]
            Si aTblDoctosTmp->Encontro
              // N.D.3023 Incluir el documento solo si corresponden las monedas
              Si aTblDoctosTmp(cIdMoneda) = pIdMoneda1 //N.D.5683
                lImpDocto = aTblDoctosTmp(cTotal) 
                // Verifica la naturaleza del documento
                lNat = fNaturaleza(aTblDoctosTmp)
				Si aTipo = 1
				  //Utilidades negativas, pérdidas positivas para reporte de proveedor
				  Si aTblDoctosTmp(cIdDocumentoDe) = 28 O aTblDoctosTmp(cIdDocumentoDe) = 30
                    lImpDocto = -lImpDocto
                  FinSi
				SiNo  
				  //Pérdidas negativas, utilidades positivas para reporte de cliente
				  Si aTblDoctosTmp(cIdDocumentoDe) = 29 O aTblDoctosTmp(cIdDocumentoDe) = 31
                    lImpDocto = -lImpDocto
                  FinSi
				FinSi
                fImprimeDocumento(aTblDoctosTmp; lSaldo; aTblDoctosTmp(cIdMoneda); aTipo; 4; lImpDocto; lNat)
              FinSi
            Finsi
          FinSi
          // S.C.264 Impresión del documento de Ajuste al IVA
          Si aTblCargos(cIdAjusIVA) > 0 Y aTblDoctosTmp(cIdDocumentoOrigen) = aTblDoctoActivo(cIdDocumento)
            aTblDoctosTmp.Busca[@Str(aTblCargos(cIdAjusIVA);0)]
            Si aTblDoctosTmp->Encontro
              lImpDocto = aTblDoctosTmp(cTotal) 
              lNat = fNaturaleza(aTblDoctosTmp)
              lSaldoAjuste = 0//fSaldoDocumento(pDelaFecha; pAlaFecha; tCargosAbonosLib; aTblDoctosTmp; tDoctosLib2)
              fImprimeDocumento(aTblDoctosTmp; lSaldoAjuste; aTblDoctosTmp(cIdMoneda); aTipo; -1; lImpDocto; lNat)
              //fImprimeAbonosCargosAsociados(aTblDoctosTmp; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo)
            Finsi
          FinSi
        FinSi //
      Finsi                                         
    Finsi

    aTblCargos.Busca Siguiente[1]
  Finmientras
FinFunc


// ==========================================================================================
// fImprimeUtilidadesAsociadas (Procedimiento)
// Descripcion : Imprime los documentos de utilidad/perdida cambiaria asociados al documento de
//                abono (clientes) o cargo (proveedores) siempre y cuando el documento de
//                naturaleza contraria no se haya impreso
// Entrada :    aTblDoctoActivo   = Es el documento para el cual se buscaran los abonos/Cargos
//              aTblDoctosTmp     = Tabla de documentos sobre la que se buscaran los abonos/Cargos
//              aTblCargosAbonos  = la Tabla de asociación de Documentos -> Documentos
// Salida  :Imprime un renglón por cada abono asociado al documento.
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 06/07/2005   LAP     N.D.3347    Implementación inicial.
// ==========================================================================================
DefFunc fImprimeUtilidadesAsociadas(aTblDoctoActivo:TABLA; aTblDoctosTmp:TABLA; aTblCargosAbonos:TABLA)
Local lImpDocto, lNat
  
  // Documentos de Cargo, se asegura que el indice sea el apropiado
  Si pQueTipo = 0
    // Clientes     Recibe el documento de abono, y debe de buscar si existe alguna asoción con un cargo
    aTblCargosAbonos.UsaIndice['']                  // cIdDocumentotoAbono + cIdDocumentoCargo
  Sino
    // Proveedores  Recibe el documento de cargo, y debe de buscar si existe alguna asoción con un abono
    aTblCargosAbonos.UsaIndice['iDoctoCargoAbono']  // cIdDocumentotoCargo + cIdDocumentoAbono
  Finsi
  
  aTblCargosAbonos.Busca Primero
	Mientras[aTblCargosAbonos.BUSCA[@Str(aTblDoctoActivo(cIdDocumento);0)]; aTblCargosAbonos->Encontro; aTblCargosAbonos.Busca Siguiente[1]]
    Si (pQueTipo = 0)    
      // Clientes:    Busqueda del documento de cargo [Factura, etc.]
      aTblDoctosTmp.BUSCA[@Str(aTblCargosAbonos(cIdDocumentoCargo);0)]
    Sino              
      // Proveedores: Busqueda del documento de abono [Compra, etc.]
      aTblDoctosTmp.BUSCA[@Str(aTblCargosAbonos(cIdDocumentoAbono);0)]
    Finsi

    // Valida si existe documento de utilidad/perdida cambiaria
    Si aTblCargosAbonos(cIdUtilidadPerdidaCamb) = 0
      Continua
    FinSi

    // Validar que el documento de cargo/abono asociado al documento principal no se imprimio debido al rango de fechas.
    Si aTblDoctosTmp->Encontro
      Si aTblDoctosTmp(cFecha) >= pDeLaFecha Y aTblDoctosTmp(cFecha) <= pAlaFecha
    //    // Si el documento asociado si se imprimio continuar con el siguiente cargo-abono
        Continua
      FinSi   
    FinSi
    
    // Incluir los documentos de utilidad / perdida cambiaria si la moneda de dichos documentos corresponde a la del reporte
    aTblDoctosTmp.Busca[@Str(aTblCargosAbonos(cIdUtilidadPerdidaCamb);0)]
    Si aTblDoctosTmp->Encontro 
      // Incluir el documento solo si corresponden las monedas
      Si aTblDoctosTmp(cIdMoneda) = pIdMoneda1 //N.D.5683
        lImpDocto = aTblDoctosTmp(cTotal) 
        // Verifica la naturaleza del documento
        lNat = fNaturaleza(aTblDoctosTmp)
        Si pQueTipo = 0 Y lNat = 1  // Si es cliente y se trata de un abono
          lImpDocto = -lImpDocto
        Finsi
        Si pQueTipo = 1 y lNat = 0  // Si es proveedor y se trata de un cargo
          lImpDocto = -lImpDocto
        Finsi
        // Identar los documentos asociados
        fImprimeDocumento(aTblDoctosTmp; lImpDocto; pIdMoneda1; pQueTipo; 4; lImpDocto; lNat) //N.D.5683
      Finsi
    Finsi    
  Finmientras
FinFunc



// ==========================================================================================
// fImprimeResumen (Procedimiento)
// Descripcion : Imprime los totales por Cliente/Proveedor
// Comentarios : asume la misma distribucion de columnas que el cuerpo principal del reporte
// ==========================================================================================
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 29/10/2002   LAP     N.D.1427    Adición de la variable global gClienteImpreso
//                                   a fin de identificar si el encabezado del
//                                   cliente se ha impreso o no.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Deffunc fImprimeResumen(aTipo)
Local lRenglon

  // N.D.1427 Inicio
  // Si el cliente no se ha impreso no se debe imprimir su resumen
  Si gClienteImpreso = 0
    Retorna
  Sino
    gClienteImpreso = 1
  FinSi  
  // N.D.1427 Fin

  // N.D.2720
  [C8,C10,C14].Subrayacol '-'
  lRenglon[8]  = gTotalCargosCliente
  lRenglon[10] = gTotalAbonosCliente
  lRenglon[14] = gTotalSaldosCliente + gSaldoInicialCliente
  Imprime lRenglon
  
  lRenglon = ''
  lRenglon[6] = 'Resumen'
  Imprime lRenglon
  lRenglon[6] = 'Saldo Inicial'
  lRenglon[8] = gSaldoInicialCliente
  Imprime lRenglon
  Si aTipo = 0      // Se trata de clientes
    lRenglon[6] = '(+) Cargos'
    lRenglon[8] = gTotalCargosCliente
    Imprime lRenglon
    lRenglon[6] = '(-) Abonos'
    lRenglon[8] = gTotalAbonosCliente
    Imprime lRenglon
  Sino
    lRenglon[6] = '(-) Cargos'
    lRenglon[8] = gTotalCargosCliente
    Imprime lRenglon
    lRenglon[6] = '(+) Abonos'
    lRenglon[8] = gTotalAbonosCliente
    Imprime lRenglon
  Finsi
  [C8].Subrayacol'-'
  lRenglon[6] = '(=) Saldo Final'
  // todos los totales se suman por que son negativos o positivos según correspondas.
  Si aTipo = 0      // se trata de clientes
    lRenglon[8] = gSaldoInicialCliente + gTotalCargosCliente + gTotalAbonosCliente
  Sino
    lRenglon[8] = gSaldoInicialCliente + gTotalCargosCliente + gTotalAbonosCliente
  Finsi
  Imprime lRenglon 
  Imprime 1
  
  gTotalCargosGral = gTotalCargosGral + gTotalCargosCliente
  gTotalAbonosGral = gTotalAbonosGral + gTotalAbonosCliente
  gTotalSaldosGral = gTotalSaldosGral + gTotalSaldosCliente + gSaldoInicialCliente
  
FinFunc



// ==========================================================================================
// fImprimeGranTotal (Procedimiento)
// 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

  // N.D.2720
  lRenglon[8]  = gTotalCargosGral
  lRenglon[10] = gTotalAbonosGral
  lRenglon[14] = gTotalSaldosGral
  lSubRaya = ''
  lSubRaya = '================='[C8,C10,C14]
  Imprime lSubRaya

  Imprime lRenglon
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
// ==========================================================================================
// N.D.3010 Nuevo esquema de Busquedas Parciales po lo cual este metodo queda fuera de uso
//!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 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

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

  // S.C.264 Discriminar los ajustes con documento origen
  //Si atDocumento(cIdConceptoDocumento) = gIdConceptoAjuste Y atDocumento(cIdDocumentoOrigen) > 0
  //  lRegresa = 1
  //FinSi

  Retorna lRegresa

FinFunc



// ==========================================================================================
// fImprimeNotaEstadoDocto (Procedimiento)
// Descripcion: Imprime la nota de especificaciones del estado del documento.
// ==========================================================================================
Deffunc fImprimeNotaEstadoDocto()

  fColumnas(3)

  Texto C0;'(1) Impreso'
  Imprime
  Texto C0;'(2) Afectado'
  Imprime
  Texto C0;'(3) Devuelto'
  Imprime
  Texto C0;'(4) Devuelto e Impreso'
  Imprime
  Texto C0;'(5) Sin Afectar'
  Imprime

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
    Texto '^@TC{0,0,0}@S{16}' & 'ESTADO DE CUENTA POR DOCUMENTO DE ABONO'
    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
      fColumnas(1)   
      Altura 9
      Texto '@TC{0,0,0}@L{-1}'
      Imprime 
      // N.D.2720
		  // Fecha   Serie   Folio   Concepto   Cargo   Abono   CA   Saldo   Venc   T.C.   Estado
  		// C0      C2      C4      C6         C8      C10     C12  C14     C16    C18    C20
      Texto C12;'^Importe'
      Texto C14;'^Saldo'	//c12
      Texto C18;'Tipo'		//c16
      Texto C20;'Estado'	//c18
      Imprime
      Texto C0;'Fecha'
      Texto C2;'Serie'
      Texto C4;'Folio'
      Texto C6;'Concepto'
      Texto C8;'^Cargos'
      Texto C10;'^Abonos'
      Texto C12;'^Aplicado'
      Texto C14;'^Documento'	//c12
      Texto C16;'Vence'       //c14
      Texto C18;'Cambio'      //c16
      Texto C20;'Docto.'      //c18
      Imprime 1
      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.1427    En el caso de clientes/proveedores, si se 
//                                  imprime el Estado de Cuenta del Cliente con
//                                  el filtro "Solo con documentos" no debe de
//                                  considerar los documentos que tenga como
//                                  proveedor.
//                                  Adición de la variable global gClienteImpreso
//                                  a fin de identificar si el encabezado del
//                                  cliente se ha impreso o no .
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  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)

  // S.C.264 Recuperación del concepto de Ajuste al IVA
  tConceptos.UsaIndice['CCODIGOC01']
  Si pQueTipo = 0 // 0 = Clientes
    tConceptos.Busca['AJUSTE_IVA_CTE_CARGO_2010']
  Sino
    tConceptos.Busca['AJUSTE_IVA_PRV_CARGO_2010']
  FinSi           // 1 = Proveedores
  gIdConceptoAjuste = 0
  Si tConceptos->Encontro
    gIdConceptoAjuste = tConceptos(cIdConceptoDocumento)
  FinSi
  tConceptos.UsaIndice['']
  
  gRangoValido = pDeLaFecha <= pAlaFecha ? 1:0
  Mientras[tClientes.Busca[pDelCliente & '..'  & pAlCliente]; (gRangoValido Y 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.
    gClienteImpreso = 0

    // Se inicializan las variables de totales por cliente
    gTotalAbonosCliente = 0.0
    gTotalCargosCliente = 0.0    
    gTotalSaldosCliente = 0.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
      gSaldoInicialCliente = fSaldoInicial(tClientes; gIdEjercicio; gPeriodo; pIdMoneda1; pDelaFecha; pQueTipo; tAcumuladosLib; tDoctosLib1; tTiposCambioLib) //N.D.5683
      // Imprime los datos del cliente sólo cuando se selecciona que todos, sin importar si tiene saldo o no
      Si pSoloConSaldo = 0
        gSoloConSaldo = 0 
      Sino
        gSoloConSaldo = 1
      FinSi

      // En caso de que el cliente no tenga documentos en el rango de fechas, pero se desean imprimir todos los clientes imprimir sus datos
      Si pSoloConDoctos = 0
        //  Imprime datos del cliente que tiene saldo y su saldo inicial            
        fImpDatosCliente(tClientes; gSaldoInicialCliente; pQueTipo)
        gSoloConSaldo = 0
      FinSi

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

        // Calcula el Saldo del Documento es igual tanto para cargos, como para abonos
        gSaldoDocto = fSaldoDocumento(pDelaFecha; pAlaFecha; tCargosAbonosLib; tDocumentos; tDoctosLib2)
        // Se verifica para no imprimir documentos saldados.  
        Si ( pSoloConSaldo = 1 ) Y ( gSaldoDocto < 0.001 )
          // Búsqueda del siguiente registro que cumpla con el cliente
          tDocumentos.BUSCA SIGUIENTE[1]
          Continua
        Finsi        

        Si ( pSoloConSaldo = 1 ) Y (gSoloConSaldo = 1 )  
          //  Imprime datos del cliente que tiene saldo y su saldo inicial            
          fImpDatosCliente(tClientes; gSaldoInicialCliente; pQueTipo)
          gSoloConSaldo = 0
        FinSi

        // Imprime los datos del cliente sólo cuando se selecciona que todos, sin importar si tiene saldo o no
        Si pSoloConSaldo = 0
          //  Imprime datos del cliente y su saldo inicial
          fImpDatosCliente(tClientes; gSaldoInicialCliente; pQueTipo)
        FinSi

        Si pQueTipo = 0
          // REPORTE PARA CLIENTES
          Si tDocumentos(cNaturaleza) = 1
            // Imprime el Documento de Cargo  y luego sus abonos asociados
            fImprimeDocumento(tDocumentos; -gSaldoDocto; tDocumentos(cIdMoneda); pQueTipo; 1; -tDocumentos(cTotal); tDocumentos(cNaturaleza)) 
            fImprimeAbonosCargosAsociados(tDocumentos; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo)
			fImprimeUtilidadesAsociadas(tDocumentos; tDoctosLib2; tCargosAbonosLib)
	        Sino
            // Si el cargo todavía tiene importe Pendiente deberá imprimirse nuevamente con  el saldo pendiente por cubrir.
            fImprimeDocumento(tDocumentos; -(-gSaldoDocto); tDocumentos(cIdMoneda); pQueTipo; 3; -(-tDocumentos(cTotal)); tDocumentos(cNaturaleza))
          Finsi
        Sino
        //N.D.4893 
          // REPORTE PARA PROVEEDORES
          Si tDocumentos(cNaturaleza) = 0
            // Imprime el Documento de Abono  y luego sus Cargos asociados
            fImprimeDocumento(tDocumentos; -gSaldoDocto; tDocumentos(cIdMoneda); pQueTipo; 1; -tDocumentos(cTotal); 0) 
            fImprimeAbonosCargosAsociados(tDocumentos; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo)
			fImprimeUtilidadesAsociadas(tDocumentos; tDoctosLib2; tCargosAbonosLib)
          Sino                                                                    // si es abono 
            // Si el cargo todavía tiene importe Pendiente deberá imprimirse nuevamente con  el saldo pendiente por cubrir
            fImprimeDocumento(tDocumentos; -(-gSaldoDocto); tDocumentos(cIdMoneda); pQueTipo; 3; -(-tDocumentos(cTotal)); 1)			
          Finsi
        Finsi
        //fin N.D.4893

        // Búsqueda del siguiente registro que cumpla con el cliente
        tDocumentos.BUSCA SIGUIENTE[1]
      FinMientras

      Si gSoloConSaldo = 0
        fImprimeResumen(pQueTipo)
      FinSi

      Si pFormato = 1  // (Impresión de Cliente por hoja)
  		  Saltahoj
    	Finsi
    Finsi
    // N.D.3010 Fin
  FinMientras
   
  fImprimeGranTotal()
  fImprimeNotaEstadoDocto()

  //  FIN DEL REPORTE

