// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     ESTADO DE CUENTA EN EXCEL 
//
// Sistema:     ADMINPAQ  Versión v1.0 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 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. 
//
//              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 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.
// Consideraciones :
// Creación  :  
// Revisiones : 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 28/01/2002   MOFM    SC 25       Se agregó el parámetro pSoloConSaldo,  se
// 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
// 23/01/2003   LAP     N.D.1739    Función para escribir las clasificaciones 
//                                  en EXCEL
//                                  - fImprimeClasesExcel
// 27/03/2003		LAP									Los documentos asociados se imprimen identados
//																	en la fecha
//																	- fImprimeDocumento
//																	- fImprimeAbonosCargosAsociados
//																	- Cuerpo del reporte
// 28/07/2003   CILA   N.D.2335     Se cambio el numero de decimales de 2 a 4
//                                  en la columna de Tipo de Cambio.
// 18/06/2004   EGV     N.D.2808    Se modificó: fImprimeDocumento.
// 16/03/2005   HVA     N.D.3023    Saldos con Revision entre colegas
// 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
// 06/07/2005   LAP     N.D.3347    Incluir los documentos de utilidad / perdida cambiaria cuando
//                                  el documento de abono no se imprima. (LAP)
//                                  - Cuerpo del reporte  
//                                  - fImprimeUtilidadesAsociadas (NUEVO)
// 02/12/2005  LAP    N.D.3010      Nuevo esquema de búsquedas parciales para agilizar los reportes
//                                  - Cuerpo del reporte
//                                  - BuscaAlgunReg (ELIMINADO)
// 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. 
//  22/04/2009  JENL  N.D.5759    ERROR NO EJECUTA CORRECTAMENTE EL REPORTE DE ESTADO DE CUENTA A
//                                EXCEL CUANDO SE SELECCIONA EN EL FILTRO LA OPCION UN CLIENTE POR
//                                HOJA DEL CAMPO FORMATO DE IMPRESION
//                                Se modifico: Pricipal
//                                Se agrego: xlSaltoPagina
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



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

  Incluye LibAdminPaq.rpt
  Incluye LibCliProv.rpt
  


//******************************************************************************
//Parámetros.
    
  Parametro pDeLaFecha      = '20030101'
  Parametro pAlaFecha       = '20031231'
  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        = 1        // 0 = Clientes , 1 = Proveedores
  Parametro pConDoctosNoAfectados = 0  // 0 = No, 1 = Si
  Parametro pIdClase1       = 0        // Por omisión deben recibir 0 =  ninguna
  Parametro pIdClase2       = 0
  Parametro pIdClase3       = 0
  Parametro pIdClase4       = 0        // Deben ser los ID´s de los valores de las clases seleccionadas
  Parametro pIdClase5       = 0        // Para cada tipo de clasificación.
  Parametro pIdClase6       = 0        // Por omisión deben recibir 0 =  ninguna
  Parametro pIdMoneda1			= 1				 // N.D.5683 Este parámetro de moneda mostrará en que 
  																		 // moneda se visualizará el estado de cuenta.	


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

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

  UsaEmpresa tEmpresa;'AdminpaqW'               

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

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

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

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

  //Documentos.
  //Índice: IdClienteProveedor + cFecha + cSerie + cFolio.
  UsaTabla tDoctosLib1 = tEmpresa['mgw10008'] Alias 'tDoctos2' 
  tDoctosLib1.Usaindice['iClienteProveedorFecha']

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


    //Documentos. 
  //Índice: primario.
  UsaTabla tDoctosLib3 = tEmpresa['mgw10008'] Alias 'tDoctos4'               
  tDoctosLib3.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.

              //C0       C2        C4       C6       C8       C10      C12      C14       C16      C18 

  tMonedas.Busca[@Str(pIdMoneda1;0)] //N.D.5683
  gDecimales = tMonedas(cDecimalesMoneda)


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

// *************************************
// Definicion de constantes de EXCEL
// *************************************
constante xlCentrarEnSeleccion  7
constante xlAutomatico          -4105
constante xlManual              -4135
constante xlInferior            -4107
constante xlSubrayadoDoble      -4119
constante xlIzquierda           -4131
constante xlMediano             -4138
constante xlNinguno             -4142
constante xlDerecha             -4152
constante xlSuperior            -4160
constante xlHojaCalculo         -4167
constante xlLineaSimple		1
constante xlBordeSuperior	8
constante xlBordeInferior	9
constante xlBordeIzquierda	7
constante xlBordeDerecha	10
constante xlCentro		-4108
constante xlSaltoPagina -4135//N.D.5759

// *************************************
// Inicializa EXCEL
// *************************************
// Accesa objetos de excel. Crea un objeto de Excel con la funcion @CreaObjeto(). A esta funcion
// se le pasa un identificador de OLE de la aplicacion que se desea crear. En este caso el identificador
// es Excel.Application.5
Objeto Excel = @CreaObjeto('Excel.Application')

// Invoca el metodo de EXCEL Libros y luego el metodo Agregar para crear un libro de hoja de calculo
// representado por la constante de EXCEL (xlHojaCalculo).
// Es importante notar que estos metodos NO LOS EJECUTA EL REPORTEADOR sino que los hace EXCEL
// y estan documentados en el Help de EXCEL
Objeto wb = Excel.WorkBooks.Add(xlHojaCalculo)

// Accesa la hoja de calculo (HojasCalculo) numero 1 del Libro creado anteriormente
// y representado por la variable wb, de la instruccion anterior
Objeto ws = wb.Worksheets(1)

// Hace visible a EXCEL. Para Excel, TRUE o VERDADERO es -1, FALSE o FALSO es 0
Excel.ActiveWindow.DisplayGridlines = FALSE[C0]
Excel.Visible = -1[C0]

RenActual = 1

// Pone la longitud de cada columna
ws.Columns(1).ColumnWidth = 14[C0]
ws.Columns(2).ColumnWidth =  5[C0]
ws.Columns(3).ColumnWidth = 8[C0]
ws.Columns(4).ColumnWidth = 25[C0]
ws.Columns(5).ColumnWidth = 15[C0]
ws.Columns(6).ColumnWidth = 15[C0]
ws.Columns(7).ColumnWidth = 17[C0]
ws.Columns(8).ColumnWidth = 12[C0]
ws.Columns(9).ColumnWidth = 8[C0]
ws.Columns(10).ColumnWidth = 22[C0]
ws.Columns(11).ColumnWidth = 25[C0]

lDigsDecimales = '0000000000'
lDecs = @SUBSTR(lDigsDecimales;1;gDecimales)

lFormato = '#,##0.' & lDecs & '_);(#,##0.' & lDecs & ')'
ws.Columns(5).NumberFormat = lFormato[C0]
ws.Columns(6).NumberFormat = lFormato[C0]
ws.Columns(7).NumberFormat = lFormato[C0]
// N.D.2335 Inicio ------------------------------
//ws.Columns(9).NumberFormat = lFormato[C0]
lFormato = '#,##0.0000_);(#,##0.0000)'
ws.Columns(9).NumberFormat = lFormato[C0]
// N.D.2335 Fin ---------------------------------

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


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

    lRenglon = ''
    Si aTipo = 0
      ws.Range('A' & RenActual ).Value = 'Cliente:'[C0]
    Sino
      ws.Range('A' & RenActual ).Value = 'Proveedor:'[C0]
    Finsi
    ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]
    ws.Range('C' & RenActual ).NumberFormat = '@'[C0]
    ws.Range('C' & RenActual ).Value = fMascarilla(aTblCliente(cCodigoCliente);tParametros(cMascarillaClientes))
    ws.Range('C' & RenActual).Font.FontStyle = 'Negrita'[C0]
    RenActual = RenActual + 1

    ws.Range('A' & RenActual ).Value = 'Nombre:'[C0]
    ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]
    ws.Range('C' & RenActual ).NumberFormat = '@'[C0]
    ws.Range('C' & RenActual ).Value = aTblCliente(cRazonSocial)[C0]
    ws.Range('C' & RenActual).Font.FontStyle = 'Negrita'[C0]

    RenActual = RenActual + 1

    ws.Range('D' & RenActual ).Value = 'Saldo Inicial'[C0]
    ws.Range('E' & RenActual ).Value = aSaldo[C0]
    ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]

    RenActual = RenActual + 1
    ws.Range('A' & RenActual & ':K' & RenActual ).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]

 
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
//          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
// 14/05/2002   CFAC     N.C.0095  Se agregó bloque de código 'N.C.0095-14/05/2002'
//                                 para determinar el valor a imprimir del estado
//                                 del documento.
// 27/03/2003		LAP									Los documentos asociados se imprimen identados
// 18/06/2004   EGV      N.D.2808  Si se hizo una asociación entre ADM y CheqPAQ de 
//                                 1 Docto. en Pesos y uno en M.E. tomar el tipo
//                                 de cambio que guardó CheqPAQ en el Documento de Pesos.																	en la fecha
// 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;aIdentarDocto)
	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)  

	// La moneda del Reporte es distinta a la moneda del Docto
	// 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..C18]

  ws.Range('B' & RenActual ).Value = aTblDocto(cSerieDocumento)[C0]
  ws.Range('C' & RenActual ).Value = aTblDocto(cFolio)[C0]

	// Identación del documento
	Si aIdentarDocto = 1
  	ws.Range('A' & RenActual ).Value = @CHR(39) & @CHR(32) & @CHR(32) & @CHR(32) & fFormateaFecha(aTblDocto(cFecha);0)
	Sino
  	ws.Range('A' & RenActual ).Value = @CHR(39) & fFormateaFecha(aTblDocto(cFecha);0)
	Finsi
  ws.Range('J' & RenActual).HorizontalAlignment = xlDerecha[C0]

  tConceptos.Busca[@Str(aTblDocto(cIDConceptoDocumento);0)] 
  Si tConceptos->Encontro
    ws.Range('D' & RenActual ).Value= tConceptos(cNombreConcepto)[C0]
  Finsi

  Si aNaturaleza = 0  // es un cargo
    ws.Range('E' & RenActual ).Value=lImporteDoctoMonedaRpt[C0] 
    Si aNivel != -1
      gTotalCargosCliente = gTotalCargosCliente + lImporteDoctoMonedaRpt
    FinSi
  Sino                           // es un abono
    ws.Range('F' & RenActual ).Value = lImporteDoctoMonedaRpt[C0]
    Si aNivel != -1
      gTotalAbonosCliente = gTotalAbonosCliente + lImporteDoctoMonedaRpt
    FinSi
  Finsi
  Si (aNaturaleza = 0 Y aTipo = 0) O (aNaturaleza = 1 y aTipo = 1)
    ws.Range('H' & RenActual ).Value =  @CHR(39) & fFormateaFecha(aTblDocto(cFechaVencimiento);0)[C0]
  Finsi    
  Si aNivel > 1       
    ws.Range('G' & RenActual ).Value = (aNivel =  2 ? ' ' : lSaldoMonedaRpt)[C0] 
  Sino
    ws.Range('G' & RenActual ).Value = (aNivel = -1 ? ' ' : lSaldoMonedaRpt)[C0]
  Finsi
  
  // se acumulan los saldos, 
  gTotalSaldosCliente = gTotalSaldosCliente + lSaldoMonedaRpt
  ws.Range('I' & RenActual ).Value = aTblDocto(cTipoCambio)[C0]

  //Inicia 'N.C.0095-14/05/2002'

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

  Si lImpreso = 1
    ws.Range('J' & RenActual ).Value = @CHR(39) & '(1)'[C0]
    Si lDevuelto = 1
      ws.Range('J' & RenActual ).Value = @CHR(39) &' (4)'[C0]
    Finsi
  Sino
    ws.Range('J' & RenActual ).Value = @CHR(39) & '(5)'[C0]
    Si lDevuelto = 1
      ws.Range('J' & RenActual ).Value = @CHR(39) & '(3)'[C0]      
    Sino   
      Si lAfectado = 1
        ws.Range('J' & RenActual ).Value = @CHR(39) & '(2)'[C0]      
      Finsi   
    Finsi
  Finsi

  //Termina 'N.C.0095-14/05/2002'

  ws.Range('K' & RenActual ).Value = aTblDocto(cReferencia)[C0] 

  ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]

  RenActual = RenActual + 1
  

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
// 27/03/2003		LAP									Los documentos asociados se imprimen identados
//																	en la fecha
// 20/04/2005   LAP     N.D.3023    Incluir los documentos de utilidad / perdida
//                                  cambiaria siempre y cuando correspondan a la
//                                  moneda del reporte.
// ==========================================================================================
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 = 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 = 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)
					// Indicar que se deben de identar los documento asociados
          fImprimeDocumento(aTblDoctosTmp; lSaldo; pIdMoneda1;aTipo;2;lImpDocto;aTblDoctosTmp(cNaturaleza);1) //N.D.5683
          // 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 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
	  						 // Indicar que se deben de identar los documento asociados
                 fImprimeDocumento(aTblDoctosTmp; lSaldo; pIdMoneda1;aTipo;4;lImpDocto;lNat;1) //N.D.5683
               Finsi
             FinSi
          FinSi
          // S.C.264 Impresión del documento de Ajuste al IVA
          Si aTblCargos(cIdAjusIVA) > 0
             aTblDoctosTmp.Busca[@Str(aTblCargos(cIdAjusIVA);0)]
             Si aTblDoctosTmp->Encontro Y aTblDoctosTmp(cIdDocumentoOrigen) = aTblDoctoActivo(cIdDocumento)
               lImpDocto = aTblDoctosTmp(cTotal) 
               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
			         lSaldoAjuste = 0 //fSaldoDocumento(pDelaFecha; pAlaFecha; tCargosAbonosLib; aTblDoctosTmp; tDoctosLib2)
               fImprimeDocumento(aTblDoctosTmp; lSaldoAjuste; pIdMoneda1; aTipo; -1; lImpDocto; lNat; 1) //N.D.5683
               //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; 1) //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

  ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  
  ws.Range('E' & RenActual & ':G' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual & ':G' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual & ':G' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual ).Value = gTotalCargosCliente[C0]
  ws.Range('F' & RenActual ).Value = gTotalAbonosCliente
  ws.Range('G' & RenActual ).Value = gTotalSaldosCliente + gSaldoInicialCliente
  RenActual = RenActual + 1
  
  ws.Range('C' & RenActual ).Value = 'Resumen'
  RenActual = RenActual + 1
  ws.Range('D' & RenActual ).Value = 'Saldo Inicial'
  ws.Range('E' & RenActual ).Value =  gSaldoInicialCliente

  ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]

  RenActual = RenActual + 1
  Si aTipo = 0      // Se trata de clientes
    ws.Range('D' & RenActual ).Value = '(+) Cargos'
    ws.Range('E' & RenActual ).Value = gTotalCargosCliente
    ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    RenActual = RenActual + 1
    ws.Range('D' & RenActual ).Value = '(-) Abonos'
    ws.Range('E' & RenActual ).Value = gTotalAbonosCliente
    ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    RenActual = RenActual + 1
  Sino
    ws.Range('D' & RenActual ).Value = '(-) Cargos'
    ws.Range('E' & RenActual ).Value = gTotalCargosCliente
    ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    RenActual = RenActual + 1
    ws.Range('D' & RenActual ).Value = '(+) Abonos'
    ws.Range('E' & RenActual ).Value = gTotalAbonosCliente
    ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    RenActual = RenActual + 1
  Finsi

  RenActual = RenActual + 1
  ws.Range('D' & RenActual ).Value = '(=) Saldo Final'
  // todos los totales se suman por que son negativos o positivos según correspondas.
  Si aTipo = 0      // se trata de clientes
    ws.Range('E' & RenActual ).Value = gSaldoInicialCliente + gTotalCargosCliente + gTotalAbonosCliente
  Sino
    ws.Range('E' & RenActual ).Value = gSaldoInicialCliente + gTotalCargosCliente + gTotalAbonosCliente
  Finsi
  ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]

  RenActual = RenActual + 2
  
  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
  
  ws.Range('E' & RenActual ).Value = gTotalCargosGral
  ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]

  ws.Range('F' & RenActual ).Value = gTotalAbonosGral
  ws.Range('F' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('F' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('F' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('F' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]

  ws.Range('G' & RenActual ).Value = gTotalSaldosGral
  ws.Range('G' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('G' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('G' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('G' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  
  RenActual = RenActual + 1

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
//------------------------------------------------------------------------------
//  07/05/2002    N.D.389          De acuerdo al parámetro pConDoctosNoAfectados
//                                 se verifica que en caso de quererse incluir
//                                 Documentos no afectados en el reporte, dichos
//                                 Documentos no estén cancelados. (EGV) 
// =============================================================================
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

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

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

  RenActual = RenActual +1
  ws.Range('A' & RenActual).Value = '(1) Impreso'
  ws.Range('A' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  RenActual = RenActual +1
  ws.Range('A' & RenActual).Value = '(2) Afectado'
  ws.Range('A' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  RenActual = RenActual +1
  ws.Range('A' & RenActual).Value = '(3) Devuelto'
  ws.Range('A' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  RenActual = RenActual +1
  ws.Range('A' & RenActual).Value = '(4) Devuelto e Impreso'
  ws.Range('A' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  RenActual = RenActual +1
  ws.Range('A' & RenActual).Value = '(5) Sin Afectar'
  ws.Range('A' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  RenActual = RenActual +1

Finfunc



// ==========================================================================================
// Nombre:  fImprimeClasesExcel
// Proceso: Imprime los nombres de las clasificaciones justificados al centro en Excel
// Entrada:	
//          aListaNombreClases  El número total de clases seleccionadas,contando todas las 
//																clasificaciones 	
//					aNumPorClase        Lista que tiene como elementos el numero de clases 
//                                seleccionadas para cada clasificación
//          aColumnaInicial     Columna en Excel a partir de la cual se imprimiran 
//                                justificadas al centro las clasificaciones (Ejemplo 'A')
//          aColumnaFinal       Columna en Excel hasta la cual se imprimiran justificadas
//                                al centro las clasificaciones (Ejemplo 'K')
//          aRenglon            Renglón de Excel a patrir del cual se imprimirán las
//                                clasificaciones.  Este valor se pasa Por referencia.
// Salidas: 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus     Descripcion
//  23/01/2003 LAP      N.D.1739    Implementación inicial
// ==========================================================================================
Deffunc fImprimeClasesExcel(aListaNombreClases; aNumPorClase; aColumnaInicial; aColumnaFinal; aRenglon)
Local	lLeyenda, lNumeroClase, lNumElmentos, lContador, lDesplazamiento

	lDesplazamiento = 0
  lNumeroClase = 0
  lLeyenda = ''

  // Se barren las seis listas de ID´s
  Mientras lNumeroClase < 6
    // solo se imprimen los que si tuvieron al menos un ID 
    Si @Escoge(aNumPorClase; lNumeroClase) != ''
      // Obtengo el número de elementos para la clase
      lNumElmentos = @Val(@Escoge(aNumPorClase; lNumeroClase))
      lContador = 0
      // Barre todos los elementos de esta clase
      Mientras lContador < lNumElmentos
        lLeyenda = lLeyenda & ',' & @Escoge(aListaNombreClases; lDesplazamiento+lContador)
        lContador = lContador +1
      FinMientras 

      lDesplazamiento = lDesplazamiento + lNumElmentos
    
      // Se imprime la clase y sus valores seleccionados
		  // Avanza de renglon
		  aRenglon = aRenglon + 1[C0]
		  ws.Range(aColumnaInicial & aRenglon).Font.Size = 10[C0]
		  ws.Range(aColumnaInicial & aRenglon).Font.FontStyle = 'Negrita'[C0]    
		  // Lo centra en las columnas
 		  ws.Range(aColumnaInicial & aRenglon & ':' & aColumnaFinal & aRenglon).HorizontalAlignment = xlCentrarEnSeleccion[C0]
		  ws.Range(aColumnaInicial & aRenglon).Value = 'CLASIFICACIÓN No.' & @Str(lNumeroClase+1; 0) & ' : ' & @SubStr(lLeyenda; 1; @Len(lLeyenda)-1)
      lLeyenda = ''
    Finsi
    lNumeroClase = lNumeroClase + 1
  FinMientras
 
  aRenglon = aRenglon + 2[C0]

FinFunc
// Fin método: fImprimeClasesExcel

//******************************************************************************
//Encabezado.
Encab
    // Pone el nombre del sistema
    ws.Range('A' & RenActual).Font.Color = @RGB(255;0;0)[C0]
    ws.Range('A' & RenActual).Font.Size = 10[C0]
    ws.Range('A' & RenActual).Value = 'AdminPAQ'[C0]
    RenActual = RenActual + 1

    ws.Range('A' & RenActual).Value = @CHR(39) & gHoy[C0]
    ws.Range('K' & RenActual).Value = 'Moneda: ' & gNombreMoneda[C0]
    RenActual = RenActual + 1

    // Pone el nombre de la empresa
    ws.Range('C' & RenActual).Font.Size = 14[C0]
    ws.Range('C' & RenActual).Font.FontStyle = 'Negrita'[C0]
    // Lo centra en las columnas A a la K
    ws.Range('C' & RenActual & ':L' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('C' & RenActual ).Value = tEmpresa->Nombre

    // Avanza de renglon
    RenActual = RenActual + 1[C0]

    // Pone el titulo del reporte en EXCEL
    ws.Range('A' & RenActual).Font.Size = 12[C0]
    ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]
    si pQueTipo = 0
      ws.Range('A' & RenActual ).Value = 'E S T A D O  D E  C U E N T A  D E  C L I E N T E S'[C0]
    Sino
      ws.Range('A' & RenActual ).Value = 'E S T A D O  D E  C U E N T A  D E  P R O V E E D O R E S'[C0]
    FinSi
    // Lo centra en las columnas A a la M
    ws.Range('A' & RenActual & ':M' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]

    // Avanza de renglon
    RenActual = RenActual + 1[C0]

    // Pone el titulo del reporte en EXCEL
    ws.Range('A' & RenActual).Font.Size = 12[C0]
    ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    gDelaFecha = fFormateaFecha(pDelaFecha;0)
    gAlaFecha  = fFormateaFecha(pAlaFecha;0)
    ws.Range('A' & RenActual ).Value = 'Del: ' & gDelaFecha & ' Al: ' & gAlaFecha[C0]
    // Lo centra en las columnas A a la M
    ws.Range('A' & RenActual & ':M' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]

    // Avanza de renglon
    RenActual = RenActual + 1[C0]

    // N.D.1739 Inicio
    //! ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
    //!fRevisaClases(tValoresDeClasif)
    //!// ===== Fin de la revision de clasificaciones
  	// ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
    // ===== se arman los ID en una LIsta para poder recorrerlos en una iteración
    gClasesRecibidas = fCuentaClases(&gNumClasesPorTipo; pIdClase1; pIdClase2; pIdClase3; pIdClase4; pIdClase5; pIdClase6)
    // se cargan las clasificaciones validas y se obtiene el número de clases validas
    gNumDeClases = fCargaClases(tValoresDeClasif; &gListNombreDeClases; &gListIdDeClases; gClasesRecibidas)
    Si gNumDeClases > 0    // solo si hubo al menos una clase seleccionada
      fImprimeClasesExcel(gListNombreDeClases; gNumClasesPorTipo; 'A'; 'M'; &RenActual)
    FinSi
    // N.D.1739 Fin

    //NEGRITAS TRUE 
//      Altura 9
//      Texto '@TC{0,0,0}@L{-1}'
//      Imprime 
//
//      Texto C12;'^Saldo'
//      Texto C16;'Tipo'
//      Texto C18;'Estado'
//      Imprime
//      Texto C0;'Fecha'
//      Texto C2;'Serie'
//      Texto C4;'Folio'
//      Texto C6;'Concepto'
//      Texto C8;'^Cargos'
//      Texto C10;'^Abonos'
//      Texto C12;'^Documento'
//      Texto C14;'Vence'
//      Texto C16;'Cambio'
//      Texto C18;'Docto.'
//      Imprime 1
//      Texto '@TC{0,0,0}@L{-1}'
//      Imprime 
//    NEGRITAS FALSE

    // Pone el titulo de cada columna en EXCEL
    ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':K' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':K' & RenActual).Interior.ColorIndex = 55[C0]    
    ws.Range('A' & RenActual & ':K' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('A' & RenActual & ':K' & RenActual).Font.Color = @RGB(255;255;255)[C0]

    ws.Range('J' & RenActual).HorizontalAlignment = xlDerecha[C0]
  
    ws.Range('A' & RenActual).Value = 'Fecha'
    ws.Range('B' & RenActual).Value = 'Serie'
    ws.Range('C' & RenActual).Value = 'Folio'
    ws.Range('D' & RenActual).Value = 'Concepto'
    ws.Range('E' & RenActual).Value = 'Cargos'
    ws.Range('F' & RenActual).Value = 'Abonos'
    ws.Range('G' & RenActual).Value = 'Saldo Documento'
    ws.Range('H' & RenActual).Value = 'Vence'
    ws.Range('I' & RenActual).Value = 'Cambio'
    ws.Range('J' & RenActual).Value = 'Estado del Documento'
    ws.Range('K' & RenActual).Value = 'Referencia'
    ws.Range('A' & RenActual & ':K' & RenActual).HorizontalAlignment = xlCentro[C0]

    RenActual = RenActual + 1

    // N.D.1739
    // Ajustar el Panel a congelar de acuerdo con RenActual
    Excel.Rows(RenActual & ':' & RenActual).Select
    Excel.ActiveWindow.FreezePanes = True
    ws.Range('A' & RenActual).Select

   // N.D.5759  Como es un cliente por hoja los encabezados los repetirá para cada hoja
    Si pFormato = 1  // (Impresión de Cliente por hoja)
        ws.PageSetup.PrintTitleRows = '$1:$6'
    Finsi   
  FinEncab



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

// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 28/01/2002   MOFM    SC 25       Se valida el parámetro pSoloConSaldo para
//                                  determinar si imprimir el cliente o no.
// 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 .
// 27/03/2003		LAP									Los documentos asociados se imprimen identados
//																	en la fecha
// 01/12/2005  LAP      N.D.3010      Nuevo esquema de búsquedas parciales para agilizar los reportes
//  22/04/2009  JENL    N.D.5759    Se cambia Saltahoj por instrucciones adecuadas para excel y se
//                                  copia el encabezado para cada cliente
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  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
        
        // 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 (pSoloConSaldo = 1) Y (gSoloConSaldo = 1)  
          //  Imprime datos del cliente que tiene saldo y su saldo inicial            
          fImpDatosCliente(tClientes; gSaldoInicialCliente; pQueTipo)
          gSoloConSaldo = 0
        FinSi

        Si pQueTipo = 0
          // REPORTE PARA CLIENTES
          Si tDocumentos(cNaturaleza) = 0
            // Imprime el Documento de Cargo  y luego sus abonos asociados
            fImprimeDocumento(tDocumentos; gSaldoDocto; pIdMoneda1; pQueTipo; 1; tDocumentos(cTotal); 0; 0) //N.D.5683
            // Ajuste por saldo
            //SI tDocumentos(cIdMonedCa) != 0
            //   tDoctosLib3.BUSCA[@STR(tDocumentos(cIdMonedCa);0)]
            //   SI tDoctosLib3->ENCONTRO
            //      lSaldoAjuste = fSaldoDocumento(pDelaFecha; pAlaFecha; tCargosAbonosLib; tDoctosLib3; tDoctosLib2)
            //      fImprimeDocumento(tDoctosLib3; lSaldoAjuste; pIdMoneda1; pQueTipo; 4; tDoctosLib3(cTotal);0; 1 )
            //      fImprimeAbonosCargosAsociados(tDoctosLib3; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo)                      
            //   FINSI      
            //FINSI
            fImprimeAbonosCargosAsociados(tDocumentos; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo)
	      Sino
          // Si el abono todavía tiene importe Pendiente deberá imprimirse nuevamente con  el saldo pendiente por cubrir.
	          Si gSaldoDocto > 0.001
              fImprimeDocumento(tDocumentos; -gSaldoDocto; pIdMoneda1; pQueTipo; 3; -gSaldoDocto; 1; 0) //N.D.5683
              // En caso de los abonos se deben de imprimir las utilidad / perdidas cambiarias siempre y cuando el cargo no se haya impreso
              fImprimeUtilidadesAsociadas(tDocumentos; tDoctosLib2; tCargosAbonosLib)
 		        Finsi 
          Finsi
        Sino
          // REPORTE PARA PROVEEDORES
          Si tDocumentos(cNaturaleza) = 1
            // Imprime el Documento de Abono  y luego sus Cargos asociados
            fImprimeDocumento(tDocumentos; gSaldoDocto; pIdMoneda1; pQueTipo; 1; tDocumentos(cTotal); 1; 0) //N.D.5683
            // Ajuste por saldo
            //SI tDocumentos(cIdMonedCa) != 0
            //   tDoctosLib3.BUSCA[@STR(tDocumentos(cIdMonedCa);0)]
            //   SI tDoctosLib3->ENCONTRO
            //      lSaldoAjuste = fSaldoDocumento(pDelaFecha; pAlaFecha; tCargosAbonosLib; tDoctosLib3; tDoctosLib2)
            //      fImprimeDocumento(tDoctosLib3; lSaldoAjuste; pIdMoneda1; pQueTipo; 4; tDoctosLib3(cTotal);0; 1 )
            //      fImprimeAbonosCargosAsociados(tDoctosLib3; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo)                      
            //   FINSI      
            //FINSI
            fImprimeAbonosCargosAsociados(tDocumentos; tDoctosLib2; tCargosAbonosLib; pDelaFecha; pAlaFecha; pQueTipo)
	        Sino
            // Si el cargo todavía tiene importe Pendiente deberá imprimirse nuevamente con  el saldo pendiente por cubrir
	          Si gSaldoDocto > 0.001
              fImprimeDocumento(tDocumentos; -gSaldoDocto; pIdMoneda1; pQueTipo; 3; -gSaldoDocto; 0; 0) //N.D.5683
              // En caso de los abonos se deben de imprimir las utilidad / perdidas cambiarias siempre y cuando el cargo no se haya impreso
              fImprimeUtilidadesAsociadas(tDocumentos; tDoctosLib2; tCargosAbonosLib)
    		    Finsi 
          Finsi
        Finsi
        // 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)
        //N.D.5759 Inicio
  		  //Saltahoj
        //ws.Range('1:6').Copy
        //ws.Range('A' & RenActual).Insert
  		  ws.rows(RenActual).PageBreak = xlSaltoPagina
        //RenActual = RenActual + 6
        //N.D.5759 Fin
    	Finsi
    Finsi
    // N.D.3010 Fin 
  FinMientras
  
  fImprimeGranTotal()
  fImprimeNotaEstadoDocto()

  //  FIN DEL REPORTE

