// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//  EficCobros.rpt
//  Nombre del reporte en el sistema: Eficiencia de cobranza
//
//  Sistema: AdminPAQ v1.1.8
// 
//  Este reporte pertenece al módulo de clientes y proveedores. 
//
//  Consideraciones especiales:
//  
//  Elaboró: Ricardo Paláu Castañeda
//  Fecha:   8 de Octubre de 2002
//  Modifico: HVA
//  Fecha:   30 de Octubre de 2002
//  Quedo con pFechaInicio en la version anterior, se cambio por gFechas;1
//  no mostraba los pagos cuando no habia saldo inicial por lo que se hizo una resta del saldo del 
//  primer periodo contra el total de cargo
//  Modifico: HVA
//  Fecha:   08 de Marzo de 2005
//  Defecto 2962 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
// Fecha        Nombre    IDLotus     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 20/04/2005 LAP      N.D.3219    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.
//                                  - Cuerpo del reporte
//                                  - fImprimirDocumento
// 09/08/2005 HVA      N.D.3368   - No muestra los importes en las celdas correctas por mes
// 15/09/2005 HVA      N.D.3422   - Si existen cantidades pequeñas de pendientes en los doctos las muestra en vez de tomarlas como 0
// 05/10/2005 HVA      N.D.3368   - Defecto Reabierto 
// 11/10/2005 HVA      N.D.3368   - Defecto Reabierto problemas en el primer periodo sumaba cantidades equivocadamente
// 17/10/2005 HVA      N.D.3368   - Defecto Reabierto al primer mes marcaba negativo
//  14/04/2009  JENL      N.D.5418    NO MUESTRA LAS FACTURAS CON COBROS GENERADOS EN EL MISMO
//                                    PERIODO DE LA FACTURA AL EJECUTAR EL REPORTE EFICIENCIA DE
//                                    COBRANZA EN EXCEL
//                                    Se modifico: fImprimirDocumento
// ************************************************************************************************


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


// *****************************************************************************
// Parámetros

// Parametro pFechaInicio         = '20021110'  // Fecha de inicio del análisis
Parametro pEjercicio           = 2002        // Ejercicio del análisis 
Parametro pMesInicial          = 10          // Mes de inicio del análisis, 1 = ene, 2 = feb...
Parametro pCteProvInicial      = ' '         // Cliente inicial del rango
Parametro pCteProvFinal        = ' '         // Cliente final del rango
// Parametro pDias                = 15          // Dias para agrupar saldos vencidos
Parametro pEstadoCliente       = 0           // Estado del cliente
                                             // 0 Todos
                                             // 1 Activos
                                             // 2 Inactivos
Parametro pTipoImpresion      = 0            // Tipo de impresión
                                             // 0 Todos
                                             // 1 Vencidos
                                             // 2 Por vencer
Parametro pDetallado          = 1            // Tipo de 
                                             // 0 Concentrado
                                             // 1 Detallado
Parametro pIdMonedaReporte    = 1            // Moneda del reporte
Parametro pIdClase1           = 0            // Clasificaciones del cliente
Parametro pIdClase2           = 0            // por omisión deben recibir 0 =  ninguna
Parametro pIdClase3           = 0            // se pueden seleccionar varias clases por clasificación.
Parametro pIdClase4           = 0            // por los pueden recibir una lista con los Id´s de las clases
Parametro pIdClase5           = 0            // seleccionadas.
Parametro pIdClase6           = 0


// *****************************************************************************
// Tablas 

UsaEmpresa tEmpresa;'ADMINPAQW'                   // Parámetros

UsaTabla tClientes = tEmpresa['MGW10002']         // Clientes/Proveedores
tClientes.Usaindice['iCodigoTipo']                // cCodigoCliente + cTipo

UsaTabla tDocumentos = tEmpresa['MGW10008']        // Documentos
tDocumentos.Usaindice['iCLienteProvAfectaNatVenc']// cIdClienteProveedor+cAfectado+cNaturaleza
                                                  // cFechaVencimiento
UsaTabla tValoresDeClasif = tEmpresa['mgw10020']
tValoresDeClasif.UsaIndice['']

UsaTabla tPeriodos = tEmpresa['mgw10031']          // Periodos
tPeriodos.UsaIndice['']

UsaTabla tMoneda = tEmpresa['MGW10034']           // Monedas
tMoneda.Usaindice['']                             // Indice primario: cIdMoneda

UsaTabla tParametros = tEmpresa['MGW10000']       // Parámetros de la empresa
tParametros.Usaindice['']                         // Indice primario: cIdEmpresa

UsaTabla tCargosAbonosLib = tEmpresa['mgw10009']  // Cargos / abonos 
tCargosAbonosLib.UsaIndice['iDoctoCargoAbono']    // IDDoctoCargo + IDDoctoAbono

UsaTabla tDoctosLib2 = tEmpresa['mgw10008'] Alias 'tDoctos2'               
tDoctosLib2.Usaindice['']                         // Usa el indice Primario cIDDocumento

Usatabla tTiposCambioLib = tEmpresa['mgw10035']       // Tipos de cambio por día
tTiposCambioLib.Usaindice['iMonedaFecha']                                 

UsaTabla  tConceptos = tEmpresa['mgw10006']
tConceptos.UsaIndice['']


// *****************************************************************************
// Definiciones y asumidos globales para el reporte
Columnas 20;3
Usaletra 'Arial'
Altura 9


// *****************************************************************************
// Variables de ámbito global

gIdioma       = 0  // Idioma del reporte
                   // 0 = Español
                   // 1 = Inglés
gMesesEsp     = ',Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre'[C0]
gFechas       = '' // Arreglo con las fechas de cada rango de días del reporte
gMeses        = '' // Arreglo con los nombres completos de los meses donde se realizan pagos
gTotalCliente = 0     // Acumulados del cliente
gTotalReporte = 0     // Acumulados del reporte
gCantidadMinima =0

tMoneda.Busca[@str(pIdMonedaReporte;0)]  
Si tMoneda->Encontro
  gDecimalesMonedaReporte = tMoneda(cDecimalesMoneda)
  gNombreMonedaReporte    = tMoneda(cNombreMoneda)
Sino
  gDecimalesMonedaReporte = 2    // Número de decimales en la moneda
  gNombreMonedaReporte     = 'Peso Mexicano'
FinSi

Si gDecimalesMonedaReporte = 1
  gCantidadMinima = 0.1
FinSi
Si gDecimalesMonedaReporte = 2
  gCantidadMinima = 0.01
FinSi
Si gDecimalesMonedaReporte = 3
  gCantidadMinima = 0.001
FinSi
Si gDecimalesMonedaReporte = 4
  gCantidadMinima = 0.0001
FinSi
Si gDecimalesMonedaReporte = 5
  gCantidadMinima = 0.00001
FinSi


[C0..C19].Decimales 0



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


// *****************************************************************************
// Inicializa EXCEL
// Acceso a los 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
// Codigo Cliente     = 10 caracteres
ws.Columns(1).ColumnWidth = 20[C0]
// Nombre CLiente     = 40 caracteres
ws.Columns(2).ColumnWidth = 40[C0]
// Tipo de salida, El reporte es detallado ?
Si pDetallado = 0
  // Concepto
  ws.Columns(3).ColumnWidth = 0[C0]
  // Serie
  ws.Columns(4).ColumnWidth = 0[C0]
  // Folio
  ws.Columns(5).ColumnWidth = 0[C0]
  // Fecha documento
  ws.Columns(6).ColumnWidth = 0[C0]
  // Fecha vencimiento
  ws.Columns(7).ColumnWidth = 0[C0]
  // Dias vencidos
  ws.Columns(8).ColumnWidth = 0[C0]
  // Dias vencidos/por vencer
  ws.Columns(9).ColumnWidth = 0[C0]
Sino
  // Concepto
  ws.Columns(3).ColumnWidth = 25[C0]
  // Serie
  ws.Columns(4).ColumnWidth = 5[C0]
  // Folio
  ws.Columns(5).ColumnWidth = 12[C0]
  // Fecha documento     = 14 caracteres
  ws.Columns(6).ColumnWidth = 14[C0]
  // Fecha vencimiento   = 14 caracteres
  ws.Columns(7).ColumnWidth = 14[C0]
  // Dias vencidos/por vencer = 9 caracteres
  ws.Columns(8).ColumnWidth = 9[C0]
  Si pTipoImpresion = 0  // Se imprimen documentos vencidos y por vencer
    // Dias por vencer  = 9 caracteres
    ws.Columns(9).ColumnWidth = 9[C0]
  SiNo  // Sólo se imprimen documentos vencidos o por vencer, no ambos
    // Dias por vencer  = 9 caracteres
    ws.Columns(9).ColumnWidth = 0[C0]
  FinSi
FinSi
// Fin del tipo de salida

// Columnas de saldos y pagos 
ws.Columns(10).ColumnWidth = 15[C0]
ws.Columns(11).ColumnWidth = 15[C0]
ws.Columns(12).ColumnWidth = 15[C0]
ws.Columns(13).ColumnWidth = 15[C0]
ws.Columns(14).ColumnWidth = 15[C0]
ws.Columns(15).ColumnWidth = 15[C0]
ws.Columns(16).ColumnWidth = 15[C0]
ws.Columns(17).ColumnWidth = 15[C0]
ws.Columns(18).ColumnWidth = 15[C0]
ws.Columns(19).ColumnWidth = 15[C0]
ws.Columns(20).ColumnWidth = 15[C0]
ws.Columns(21).ColumnWidth = 15[C0]
ws.Columns(22).ColumnWidth = 15[C0]
// Fin del tipo de impresión


// *********************************************************************************************
// Funcion : fJulConv
// Proceso : Convierte un valor juliano a una fecha en formato AAAAMMDD
// Entradas: Juliano - Fecha en juliano
// Salidas : Fecha en formato AAAAMMDD
// *********************************************************************************************
DefFunc fJulConv(Juliano)
Local lAnio, lMes, lDia, lDias, lDias_anio, lAux, lSobra, lFechaCar

	// Se guarda un arreglo que contenga los días de cada mes
	lDias = '0,31,28,31,30,31,30,31,31,30,31,30,31'[C0]
	lDias_anio = '365,366,365'[C0]
	Si Juliano = 0
		Retorna ''
	FinSi
	// Calcula grupos de cuatro años ( por los bisiestos )
	lAnio = @Int(Juliano / 1461)
 	// Calcula los años de los dias restantes
	lSobra = (Juliano % 1461) - 365
	lAux = 0
	Mientras lSobra > 0
		lSobra = lSobra - @Val(@Escoge(lDias_anio;lAux))
		lAux = lAux + 1
	FinMientras
	lAnio = lAnio * 4 + lAux + 10	                // 1910 de base
	Si !(lAnio % 4)
		lDias = '0,31,29,31,30,31,30,31,31,30,31,30,31'[C0]
	Finsi
	lAux = @Int( (lAnio + 3) / 4 - 3 )            // Calcula los dias de años bisiestos
	lSobra = Juliano - (lAnio - 10) * 365 - lAux  // Calcula los dias que restan a los años calculado
	Si !lSobra
		lDia = 31
		lMes = 12
		lAnio = lAnio - 1
	SiNo
		lMes = 1
		lDia = @Escoge(lDias;1)
		Mientras lSobra > lDia
			lMes = lMes + 1
			lSobra = lSobra - lDia
			lDia = @Escoge(lDias;lMes)
		FinMientras
		lDia = lSobra
	FinSi
	lDia = @Str(lDia;0)
	Si @Len(lDia) = 1
		lDia = '0' & lDia
	FinSi
	lMes = @Str(lMes;0)
	Si @Len(lMes) = 1
		lMes = '0' & lMes
	FinSi
	lAnio = lAnio + 1900
	lAnio = @Str(lAnio;0)
	lFechaCar = lAnio & lMes & lDia
	Retorna lFechaCar
FinFunc


// *********************************************************************************************
// Nombre:    fConfiguraColumnas
// Proceso:   Configura las mascaras para las columnas que manejan cantidades
// Entradas:  
// Salidas
// *********************************************************************************************
DEFFUNC fConfiguraColumnas ()
LOCAL lDigDecimales, lDecimales, lNumDecimales, lFormato

  // Configuración de las columnas
  tParametros.Busca Primero
  lDigDecimales = '0000000000'

  // Decimales en días
  lFormato = '#,##0_);#,##0)'
  ws.Columns(8).NumberFormat = lFormato[C0]
  Si pTipoImpresion = 0
    ws.Columns(9).NumberFormat = lFormato[C0]
  FinSi

  // Decimales en importes
  lDecimales = @SUBSTR(lDigDecimales; 1; gDecimalesMonedaReporte)
  lFormato   = '#,##0.' & lDecimales & '_);(#,##0.' & lDecimales & ')'
  // Tipo de impresión: TODOS o Vencidos/PorVencer ?
  Si pTipoImpresion = 0
    ws.Columns(10).NumberFormat = lFormato[C0]
    ws.Columns(11).NumberFormat = lFormato[C0]
    ws.Columns(12).NumberFormat = lFormato[C0]
    ws.Columns(13).NumberFormat = lFormato[C0]
    ws.Columns(14).NumberFormat = lFormato[C0]
    ws.Columns(15).NumberFormat = lFormato[C0]
    ws.Columns(16).NumberFormat = lFormato[C0]
    ws.Columns(17).NumberFormat = lFormato[C0]
    ws.Columns(18).NumberFormat = lFormato[C0]
    ws.Columns(19).NumberFormat = lFormato[C0]
    ws.Columns(20).NumberFormat = lFormato[C0]
    ws.Columns(21).NumberFormat = lFormato[C0]
    ws.Columns(22).NumberFormat = lFormato[C0]
    ws.Columns(23).NumberFormat = lFormato[C0]
    ws.Columns(24).NumberFormat = lFormato[C0]
  Sino
    ws.Columns(9).NumberFormat  = lFormato[C0]
    ws.Columns(10).NumberFormat = lFormato[C0]
    ws.Columns(11).NumberFormat = lFormato[C0]
    ws.Columns(12).NumberFormat = lFormato[C0]
    ws.Columns(13).NumberFormat = lFormato[C0]
    ws.Columns(14).NumberFormat = lFormato[C0]
    ws.Columns(15).NumberFormat = lFormato[C0]
    ws.Columns(16).NumberFormat = lFormato[C0]
    ws.Columns(17).NumberFormat = lFormato[C0]
    ws.Columns(18).NumberFormat = lFormato[C0]
    ws.Columns(19).NumberFormat = lFormato[C0]
    ws.Columns(20).NumberFormat = lFormato[C0]
    ws.Columns(21).NumberFormat = lFormato[C0]
    ws.Columns(22).NumberFormat = lFormato[C0]
    ws.Columns(23).NumberFormat = lFormato[C0]
  FinSi
  // Fin tipo de impresión
FINFUNC
// Fin método: fConfiguraColumnas


// *****************************************************************************
// fDiscriminaCliente
// Descripcion : Verifica que el cliente / proveedor cumpla con los filtros del reporte
// Entrada :     atCliente  : tabla de clientes
// Salidas:      1         :  indica que el cliente no aplica, debe descartarse
//               0         :  indica que el cliente no debe descartarse.
// *****************************************************************************
Deffunc fDiscriminaCliente(atCliente:TABLA)
Local lRegresa
    
  lRegresa = 0

  // Se salta el Cliente NINGUNO
  Si atCliente(cIdClienteProveedor) = 0
    lRegresa = 1
  Finsi

  // Si no se trata de un cliente:(1=cliente,2=cliente/provedor,3= proveedor)
  Si atCliente(cTipoCliente) > 2 
    lRegresa = 1
  Finsi

  // Descarta los clientes segun el filtro de activo / inactivo
  Si (pEstadoCliente != 0) 
    Si (pEstadoCliente = 1 Y atCliente(cEstatus) = 0) O (pEstadoCliente = 2 Y atCliente(cEstatus) = 1)
      lRegresa = 1
    FinSi
  Finsi

  // Se Revisan las CLASIFICACIONES, solo en el caso de haber seleccionado al menos una 
  Si gNumDeClases > 0
    Si !fMiembroDeUnaClase(atCliente; gNumDeClases; gListIdDeClases; 0)
       // Sa salta el cliente actual, por no pertenecer a alguna de las clasificaciones
      lRegresa = 1
    Finsi
  Finsi

  Retorna lRegresa
FinFunc
// Fin Método: fDiscriminaCliente


// *****************************************************************************
// fImprimirTotalReporte
// Descripcion : 
// Entrada :
// Salidas: 
// *****************************************************************************
Deffunc fImprimirTotalReporte()
Local lImporte
Local  lRango1, lRango2, lCelda1, lCelda2

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

  lCelda1[0] = 'F' & RenActual
  lCelda2[0] = 'I' & RenActual
  lRango2 = 'J' & RenActual & ':V' & RenActual
  lRango1 = lCelda1 & ':' & lCelda2

  ws.Range(lRango1).Borders(xlInferior).LineStyle  = xlLineaSimple[C0]
  ws.Range(lRango1).Borders(xlSuperior).LineStyle  = xlLineaSimple[C0]
  ws.Range(lCelda1).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range(lCelda2).Borders(xlDerecha).LineStyle   = xlLineaSimple[C0]
  ws.Range(lCelda1).Value = 'TOTAL REPORTE:'[C0]

  ws.Range(lRango2).Borders(xlInferior).LineStyle  = xlLineaSimple[C0]
  ws.Range(lRango2).Borders(xlSuperior).LineStyle  = xlLineaSimple[C0]
  ws.Range(lRango2).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range(lRango2).Borders(xlDerecha).LineStyle   = xlLineaSimple[C0]

  ws.Range('J' & RenActual).Value = gTotalReporte[C0]  
  ws.Range('K' & RenActual).Value = gTotalReporte[C1]  
  ws.Range('L' & RenActual).Value = gTotalReporte[C2]
  ws.Range('M' & RenActual).Value = gTotalReporte[C3]
  ws.Range('N' & RenActual).Value = gTotalReporte[C4]
  ws.Range('O' & RenActual).Value = gTotalReporte[C5]
  ws.Range('P' & RenActual).Value = gTotalReporte[C6]
  ws.Range('Q' & RenActual).Value = gTotalReporte[C7]
  ws.Range('R' & RenActual).Value = gTotalReporte[C8]
  ws.Range('S' & RenActual).Value = gTotalReporte[C9]
  ws.Range('T' & RenActual).Value = gTotalReporte[C10]
  ws.Range('U' & RenActual).Value = gTotalReporte[C11]
  ws.Range('V' & RenActual).Value = gTotalReporte[C12]
Finfunc
// Fin método: fImprimirTotalReporte


// *****************************************************************************
// fImprimirTotalCliente
// Descripcion : 
// Entrada :
// Salidas: 
// *****************************************************************************
Deffunc fImprimirTotalCliente(atCliente:TABLA)
Local lImporte
Local  lRango, lUltimaCelda, lCeldaImportes, lCeldaDias

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

  lRango            = 'A' & RenActual & ':V' & RenActual
  lUltimaCelda[0]   = 'V' & RenActual
  lCeldaImportes[0] = 'J' & RenActual
  lCeldaDias[0]     = 'I' & RenActual

  Si pDetallado = 0
    ws.Range(lRango).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range(lRango).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range(lRango).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range(lRango).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]

    // Codigo_Cliente
    lMascarilla = tParametros(cMascarillaClientes)
    lCodigo = atCliente(cCodigoCliente)
    ws.Range('A' & RenActual).Value = @Chr(39) & fMascarilla(lCodigo;lMascarilla)[C0]
    // Nombre_Cliente
    ws.Range('B' & RenActual).Value = atCliente(cRazonSocial)[C0]
  Sino
    ws.Range('C' & RenActual & ':' & lCeldaDias).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('C' & RenActual & ':' & lCeldaDias).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('C' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range(lCeldaDias).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('C' & RenActual).Value = 'TOTAL CLIENTE:'[C0]

    ws.Range(lCeldaImportes & ':' & lUltimaCelda).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range(lCeldaImportes & ':' & lUltimaCelda).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range(lCeldaImportes & ':' & lUltimaCelda).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range(lCeldaImportes & ':' & lUltimaCelda).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  FinSi

  ws.Range('J' & RenActual).Value = gTotalCliente[C0]  
  ws.Range('K' & RenActual).Value = gTotalCliente[C1]    
  ws.Range('L' & RenActual).Value = gTotalCliente[C2]
  ws.Range('M' & RenActual).Value = gTotalCliente[C3]
  ws.Range('N' & RenActual).Value = gTotalCliente[C4]
  ws.Range('O' & RenActual).Value = gTotalCliente[C5]
  ws.Range('P' & RenActual).Value = gTotalCliente[C6]
  ws.Range('Q' & RenActual).Value = gTotalCliente[C7]
  ws.Range('R' & RenActual).Value = gTotalCliente[C8]
  ws.Range('S' & RenActual).Value = gTotalCliente[C9]
  ws.Range('T' & RenActual).Value = gTotalCliente[C10]
  ws.Range('U' & RenActual).Value = gTotalCliente[C11]
  ws.Range('V' & RenActual).Value = gTotalCliente[C12]
  gTotalCliente = 0

  Si pDetallado = 1
    // Avanza de renglon
    RenActual = RenActual + 1[C0]
  FinSi
Finfunc
// Fin Método: fImprimirTotalCliente


//!// *****************************************************************************
//!// fImporteMonedaReporte
//!// Descripcion : El importe lo cambia al IdMoneda que recibe a la moneda del Reporte
//!// Entrada :     aImporte           :   Importe a cambiar
//!//              aIdMonedaDocto    :   Id de la moneda del documento
//!//              aTipoCambioDocto  :   Tipo de cambio del documento a la moneda base
//!// Salida  :    Importe del documento o movimiento reflejado en la moneda que recibe 
//!// *****************************************************************************
//!Deffunc fImporteMonedaReporte(aImporte; aIdMonedaDocto; aTipoCambioDocto; aFecha)
//!Local lImporteMonedaRpt, lImporteMonedaBase, lTipoCambio
//!
//!  Si aIdMonedaDocto != pIdMonedaReporte
//!    // Transforma el importe a la moneda base tomando el tipo de cambio del documento
//!    lImporteMonedaBase  = aImporte * aTipoCambioDocto
//!    Si pIdMonedaReporte != 1
//!      // Si la moneda del reporte es diferente a la base convierte tomando el tipo de cambio
//!      lTipoCambio       = fTipoCambio(aFecha; pIdMonedaReporte; tTiposCambioLib)
//!      lImporteMonedaRpt = lImporteMonedaBase / lTipoCambio
//!    Sino
//!      lImporteMonedaRpt = lImporteMonedaBase
//!    FinSi    
//!  Sino
//!    lImporteMonedaRpt = aImporte
//!  FinSi
//!
//!  Retorna lImporteMonedaRpt
//!FinFunc
//!// Fin método: fImporteMonedaReporte


// *****************************************************************************
// fImprimirDocumento
// Descripcion : 
//
// Entrada :   
// Salidas: 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
// Fecha        Nombre  IDLotus     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 20/04/2005   LAP     N.D.3219    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.
//  14/04/2009  JENL    N.D.5418    Si el documento pertenece al periodo para el que se esta calculando
//                                  el monto de los pagos, y en el mismo periodo se paga la totalidad
//                                  del docto, ponia como monto de los pagos cero, por que la
//                                  condición requeria que el saldo al final del periodo fuera
//                                  diferente de cero para realizar el calculo, y dado que el docto
//                                  se pago en su totalidad en el mismo periodo, pues el saldo era 
//                                  cero, ahora si el saldo es diferente de cero (como era antes) o
//                                  el docto pertenece al periodo, deberá hacer el calculo.
//                                  Además, solo imprimia el reporte si tuvo saldo positivo en alguno
//                                  de los periodos calculados, esto evitaba que se imprimiera cuando
//                                  el docto era pagado en su totalidad en el mismo periodo de su
//                                  creación, ahora se imprime si tuvo saldo o pagos en alguno de los
//                                  periodos procesados.
// ************************************************************************************************
Deffunc fImprimirDocumento(atCliente:TABLA; atDocumento:TABLA; aFechaDocto; aFechaVencimiento; aDiasVencidos; aDiasPorVencer; aSaldoDocumento)
Local lImportes, lAux, lRango

  // Calcular el saldo del documento y los pagos efectuados en cada rango de 
  // fechas. Los pagos efectuados se calculan col la resta del saldo al final 
  // del rango menos el saldo al inicio del rango
  lImportes = 0
  lImportes[0] = aSaldoDocumento


  lAux = 0
  lTotal = 0  
  lProcesado = 0
  Si atDocumento(cFecha) <= @Col(gFechas;3) // Y atDocumento(cFecha) > @Col(gFechas;1)
//  Si atDocumento(cFecha) <= @Col(gFechas;3) 
    lAux = fSaldoDocumento(''; @Col(gFechas;3); tCargosAbonosLib; atDocumento; tDoctosLib2)

    Si lAux < gCantidadMinima Y lProcesado = 0
      lAux = 0
      lProcesado = 1
    FinSi
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lImportes[2] = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lImportes[2] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; lAux; pIdMonedaReporte; atCliente(cIdMoneda))
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lTotal = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    //lTotal = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; lAux; pIdMonedaReporte; atCliente(cIdMoneda))
    lTotal = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atDocumento(cTotal); pIdMonedaReporte; atCliente(cIdMoneda))
  SiNo
    lImportes[2] = @Col(lImportes;0)
  FinSi

  Si @Col(lImportes;2) != 0 Y @Col(lImportes;0) >= @Col(lImportes;2)
    lImportes[1] = @Col(lImportes;0) - @Col(lImportes;2)
  Sino
    //Si ltotal != 0 Y @Col(lImportes;2) != 0 N.D.5418
    Si ltotal != 0 Y (@Col(lImportes;2) != 0 O (atDocumento(cFecha) > @Col(gFechas;1) Y atDocumento(cFecha) <= @Col(gFechas;3)))//N.D.5418
      lImportes[1] = lTotal - @Col(lImportes;2)
      lTotal = 0
    Sino
      Si @Col(lImportes;0) != 0
        lImportes[1] = @Col(lImportes;0) - @Col(lImportes;2)
      Sino
        lImportes[1] = 0
      FinSi
    FinSi
  FinSi
  
  Si atDocumento(cFecha) <= @Col(gFechas;5)
    lAux = fSaldoDocumento(''; @Col(gFechas;5); tCargosAbonosLib; atDocumento; tDoctosLib2)
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lImportes[4] = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lImportes[4] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; lAux; pIdMonedaReporte; atCliente(cIdMoneda))
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lTotal = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lTotal = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atDocumento(cTotal); pIdMonedaReporte; atCliente(cIdMoneda))
    Si lAux < gCantidadMinima
      lImportes[4] = 0
      Si lProcesado = 0
        lAux = 0
        lProcesado = 1
      Sino
        lTotal = 0
      FinSi
    FinSi
  SiNo
    lImportes[4] = @Col(lImportes;2)
  FinSi
  
  Si @Col(lImportes;2) != 0
    lImportes[3] = @Col(lImportes;2) - @Col(lImportes;4)
  SiNo
    //Si ltotal != 0 Y @Col(lImportes;4) != 0 N.D.5418
    Si ltotal != 0 Y (@Col(lImportes;4) != 0 O (atDocumento(cFecha) > @Col(gFechas;3) Y atDocumento(cFecha) <= @Col(gFechas;5)))//N.D.5418
      lImportes[3] = lTotal - @Col(lImportes;4)
      lTotal = 0
    Sino
      lImportes[3] = 0
    FinSi
  FinSi
  
  Si atDocumento(cFecha) <= @Col(gFechas;7)
    lAux = fSaldoDocumento(''; @Col(gFechas;7); tCargosAbonosLib; atDocumento; tDoctosLib2)
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lImportes[6] = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lImportes[6] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; lAux; pIdMonedaReporte; atCliente(cIdMoneda))
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lTotal = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lTotal = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atDocumento(cTotal); pIdMonedaReporte; atCliente(cIdMoneda))
    Si lAux < gCantidadMinima
      lImportes[6] = 0 // esto me falta
      Si lProcesado = 0
        lAux = 0
        lProcesado = 1
      Sino
        lTotal = 0
      FinSi
    FinSi
  SiNo
    lImportes[6] = @Col(lImportes;4)
  FinSi

  Si @Col(lImportes;4) != 0
    lImportes[5] = @Col(lImportes;4) - @Col(lImportes;6)
  SiNo
    //Si ltotal != 0 Y @Col(lImportes;6) != 0 N.D.5418
    Si ltotal != 0 Y (@Col(lImportes;6) != 0 O (atDocumento(cFecha) > @Col(gFechas;5) Y atDocumento(cFecha) <= @Col(gFechas;7)))//N.D.5418
      lImportes[5] = lTotal - @Col(lImportes;6)
      lTotal = 0
    Sino
      lImportes[5] = 0
    FinSi 
  FinSi
  
  Si atDocumento(cFecha) <= @Col(gFechas;9)
    lAux = fSaldoDocumento(''; @Col(gFechas;9); tCargosAbonosLib; atDocumento; tDoctosLib2)
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lImportes[8] = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lImportes[8] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; lAux; pIdMonedaReporte; atCliente(cIdMoneda))
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lTotal = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lTotal = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atDocumento(cTotal); pIdMonedaReporte; atCliente(cIdMoneda))
    Si lAux < gCantidadMinima
      lImportes[8] = 0
      Si lProcesado = 0
        lAux = 0
        lProcesado = 1
      Sino
        lTotal = 0
      FinSi
    FinSi
  SiNo
    lImportes[8] = @Col(lImportes;6)
  FinSi
  
  Si @Col(lImportes;6) != 0 
    lImportes[7] = @Col(lImportes;6) - @Col(lImportes;8)
  SiNo
    //Si ltotal != 0 Y @Col(lImportes;8) != 0 N.D.5418
    Si ltotal != 0 Y (@Col(lImportes;8) != 0 O (atDocumento(cFecha) > @Col(gFechas;7) Y atDocumento(cFecha) <= @Col(gFechas;9)))//N.D.5418
      lImportes[7] = lTotal - @Col(lImportes;8)
      lTotal = 0
    Sino
      lImportes[7] = 0
    FinSi
  FinSi
  
  Si atDocumento(cFecha) <= @Col(gFechas;11)
    lAux = fSaldoDocumento(''; @Col(gFechas;11); tCargosAbonosLib; atDocumento; tDoctosLib2)
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lImportes[10] = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lImportes[10] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; lAux; pIdMonedaReporte; atCliente(cIdMoneda))
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lTotal = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lTotal = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atDocumento(cTotal); pIdMonedaReporte; atCliente(cIdMoneda))
    Si lAux < gCantidadMinima
      lImportes[10] = 0
      Si lProcesado = 0
        lAux = 0
        lProcesado = 1
      Sino
        lTotal = 0
      FinSi
    FinSi
  SiNo
    lImportes[10] = @Col(lImportes;8)
  FinSi
  
  Si @Col(lImportes;8) != 0 
    lImportes[9] = @Col(lImportes;8) - @Col(lImportes;10)
  SiNo
    //Si ltotal != 0 Y @Col(lImportes;10) != 0 N.D.5418
    Si ltotal != 0 Y (@Col(lImportes;10) != 0 O (atDocumento(cFecha) > @Col(gFechas;9) Y atDocumento(cFecha) <= @Col(gFechas;11)))//N.D.5418
      lImportes[9] = lTotal - @Col(Importes;10)
      lTotal = 0
    Sino
      lImportes[9] = 0
    FinSi
  FinSi
  
  Si atDocumento(cFecha) <= @Col(gFechas;13)
    lAux = fSaldoDocumento(''; @Col(gFechas;13); tCargosAbonosLib; atDocumento; tDoctosLib2)
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lImportes[12] = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lImportes[12] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; lAux; pIdMonedaReporte; atCliente(cIdMoneda))
    // N.D.3219 Expresar el importe en la moneda del reporte
    //!lTotal = fImporteMonedaReporte(lAux; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
    lTotal = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atDocumento(cTotal); pIdMonedaReporte; atCliente(cIdMoneda))
    Si lAux < gCantidadMinima
      lImportes[12] = 0
      Si lProcesado = 0
        lAux = 0
        lProcesado = 1
      Sino
        lTotal = 0
      FinSi
    FinSi
  SiNo
    lImportes[12] = @Col(lImportes;10)
  FinSi
  
  Si @Col(lImportes;10) != 0
    lImportes[11] = @Col(lImportes;10) - @Col(lImportes;12)
  SiNo
    //Si ltotal != 0 Y @Col(lImportes;12) != 0 N.D.5418
    Si ltotal != 0 Y (@Col(lImportes;12) != 0 O (atDocumento(cFecha) > @Col(gFechas;11) Y atDocumento(cFecha) <= @Col(gFechas;13)))//N.D.5418
      lImportes[11] = lTotal - @Col(Importes;12)
      lTotal = 0
    Sino
      lImportes[11] = 0
    FinSi
  FinSi
  
  // Si el documento no tiene saldos ni pagos en los rangos de fechas no imprimirlo
  //Si @Col(lImportes;0) + @Col(lImportes;2) + @Col(lImportes;4) + @Col(lImportes;6) + @Col(lImportes;8) + @Col(lImportes;10) + @Col(lImportes;12) = 0 N.D.5418
  Si @Col(lImportes;0) + @Col(lImportes;1) + @Col(lImportes;2) + @Col(lImportes;3) + @Col(lImportes;4) + @Col(lImportes;5) + @Col(lImportes;6) + @Col(lImportes;7) + @Col(lImportes;8) + @Col(lImportes;9) + @Col(lImportes;10) + @Col(lImportes;11) + @Col(lImportes;12) = 0//N.D.5418
    Retorna
  FinSi

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

    lRango = 'A' & RenActual & ':V' & RenActual
    ws.Range(lRango).Borders(xlInferior).LineStyle  = xlLineaSimple[C0]
    ws.Range(lRango).Borders(xlSuperior).LineStyle  = xlLineaSimple[C0]
    ws.Range(lRango).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range(lRango).Borders(xlDerecha).LineStyle   = xlLineaSimple[C0]

    // Codigo_Cliente
    lMascarilla = tParametros(cMascarillaClientes)
    lCodigo = atCliente(cCodigoCliente)
    ws.Range('A' & RenActual).Value = @Chr(39) & fMascarilla(lCodigo;lMascarilla)[C0]
    // Nombre_Cliente
    ws.Range('B' & RenActual).Value = atCliente(cRazonSocial)[C0]
    // Concepto
    tConceptos.Busca[@str(atDocumento(cIdConceptoDocumento);0)]  
    ws.Range('C' & RenActual).Value = tConceptos(cNombreConcepto)[C0]
    // Serie
    ws.Range('D' & RenActual).Value = atDocumento(cSerieDocumento)[C0]
    // Folio
    ws.Range('E' & RenActual).Value = atDocumento(cFolio)[C0]
    // Fecha_Documento
    ws.Range('F' & RenActual).Value = @Col(fFormateaFecha(aFechaDocto; gIdioma);0)[C0]
    // Fecha_Vencimiento
    Si aFechaVencimiento != 0
      ws.Range('G' & RenActual).Value = @Col(fFormateaFecha(aFechaVencimiento; gIdioma);0)[C0]
    FinSi
    Escoge pTipoImpresion 
      Caso 0    // Todos
        // Dias_Vencidos
        ws.Range('H' & RenActual).Value = aDiasVencidos[C0]
        // Dias_PorVencer
        ws.Range('I' & RenActual).Value = aDiasPorVencer[C0]
      FinCaso
      Caso 1    // Vencidos
        // Dias_Vencidos
        ws.Range('H' & RenActual).Value = aDiasVencidos[C0]
      FinCaso
      Caso 2    // PorVencer
        // Dias_PorVencer
        ws.Range('H' & RenActual).Value = aDiasPorVencer[C0]
      FinCaso
    FinEscoge
    ws.Range('J' & RenActual).Value = @Col(lImportes;0)
    ws.Range('K' & RenActual).Value = @Col(lImportes;1)
    ws.Range('L' & RenActual).Value = @Col(lImportes;2)
    ws.Range('M' & RenActual).Value = @Col(lImportes;3)
    ws.Range('N' & RenActual).Value = @Col(lImportes;4)
    ws.Range('O' & RenActual).Value = @Col(lImportes;5)
    ws.Range('P' & RenActual).Value = @Col(lImportes;6)
    ws.Range('Q' & RenActual).Value = @Col(lImportes;7)
    ws.Range('R' & RenActual).Value = @Col(lImportes;8)
    ws.Range('S' & RenActual).Value = @Col(lImportes;9)
    ws.Range('T' & RenActual).Value = @Col(lImportes;10)
    ws.Range('U' & RenActual).Value = @Col(lImportes;11)
    ws.Range('V' & RenActual).Value = @Col(lImportes;12)
  FinSi

  gTotalReporte = gTotalReporte + lImportes
  gTotalCliente = gTotalCliente + lImportes

  gClienteConSaldo = 1
Finfunc
// Fin método: fImprimirDocumento


// *****************************************************************************
// fImprimeClasesExcel
// Descripcion :   Imprime los nombres de las clases justificados al centro
// Entrada :      aNumClases  : 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
// Salidas: 
// *****************************************************************************
Deffunc fImprimeClasesExcel(aListaNombreClases; aNumPorClase)
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
      RenActual = RenActual + 1[C0]
      ws.Range('A' & RenActual).Font.Size = 12[C0]
      ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
      // Lo centra en las columnas
      Si pTipoImpresion = 0
        ws.Range('A' & RenActual & ':T' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
      Sino
        ws.Range('A' & RenActual & ':N' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
      FinSi
      ws.Range('A' & RenActual ).Value = 'CLASIFICACIÓN No.' & @Str(lNumeroClase+1; 0) & ' : ' & @SubStr(lLeyenda; 1; @Len(lLeyenda)-1)
      lLeyenda = ''
    Finsi
    lNumeroClase = lNumeroClase + 1
  FinMientras
FinFunc
// Fin método: fImprimeClasesExcel


// *****************************************************************************
// Encabezado del reporte
// *****************************************************************************
Encab
  // Calcular las fechas finales de los rangos de dias del reporte
  i = 0
  Mientras i <= 7
    lIndice1 = i*2+1
    lIndice2 = i*2+2
    Si ( pMesInicial + i ) > 12
      Si ( pMesInicial + i - 12 ) < 10
        lFecha = ( pEjercicio + 1 ) & '0' & ( pMesInicial + i - 12 ) & '01'
      SiNo
        lFecha = ( pEjercicio + 1 )  & ( pMesInicial + i - 12 ) & '01'
      FinSi
      gMeses[i] = @Escoge(gMesesEsp; pMesInicial + i - 12) & ' de ' & ( pEjercicio + 1 )
    SiNo
      Si ( pMesInicial + i ) < 10
        lFecha = pEjercicio & '0' & ( pMesInicial + i ) & '01'
      SiNo
        lFecha = pEjercicio & ( pMesInicial + i ) & '01'
      FinSi
      gMeses[i] = @Escoge(gMesesEsp; pMesInicial + i) & ' de ' & pEjercicio
    FinSi
    gFechas[lIndice1] = fFechaAnterior(lFecha)
    gFechas[lIndice2] = fFormateaFecha(@Col(gFechas;lIndice1); gIdioma)
    i = i + 1
  FinMientras

//  gFechas[1]  = pFechaInicio
//  gFechas[2]  = fFormateaFecha(@Col(gFechas;1); gIdioma )
//  gFechas[3]  = fJulConv( fConvJul(pFechaInicio) + pDias )
//  gFechas[4]  = fFormateaFecha(@Col(gFechas;3); gIdioma)
//  gFechas[5]  = fJulConv( fConvJul(pFechaInicio) + pDias * 2 )
//  gFechas[6]  = fFormateaFecha(@Col(gFechas;5); gIdioma)
//  gFechas[7]  = fJulConv( fConvJul(pFechaInicio) + pDias * 3 )
//  gFechas[8]  = fFormateaFecha(@Col(gFechas;7); gIdioma)
//  gFechas[9]  = fJulConv( fConvJul(pFechaInicio) + pDias * 4 )
//  gFechas[10] = fFormateaFecha(@Col(gFechas;9); gIdioma)
//  gFechas[11] = fJulConv( fConvJul(pFechaInicio) + pDias * 5 )
//  gFechas[12] = fFormateaFecha(@Col(gFechas;11); gIdioma)
//  gFechas[13] = fJulConv( fConvJul(pFechaInicio) + pDias * 6 )
//  gFechas[14] = fFormateaFecha(@Col(gFechas;13); gIdioma)

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

  // Pone el nombre de la empresa
  ws.Range('B' & RenActual).Font.Size = 14[C0]
  ws.Range('B' & RenActual).Font.FontStyle = 'Negrita'[C0]
  // Lo centra en las columnas
  ws.Range('B' & RenActual & ':T' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
  ws.Range('B' & 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]
  // Lo centra en las columnas
  ws.Range('A' & RenActual & ':V' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]

  Si pDetallado = 0
    ws.Range('A' & RenActual ).Value = 'E F I C I E N C I A     D E     C O B R A N Z A     C O N C E T R A D A'[C0]
  SiNo
    ws.Range('A' & RenActual ).Value = 'E F I C I E N C I A     D E     C O B R A N Z A     D E T A L L A D A'[C0]
  FinSi

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

  // Pone la fecha de corte
  ws.Range('A' & RenActual).Font.Size = 12[C0]
  ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
  // Lo centra en las columnas
  ws.Range('A' & RenActual & ':V' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
//  ws.Range('A' & RenActual ).Value = 'Fecha de Inicio del Análisis: ' & fFormateaFecha(pFechaInicio;gIdioma)[C0]
  ws.Range('A' & RenActual ).Value = 'Periodo Inicial del Análisis: ' & @Escoge(gMesesEsp;pMesInicial) & ' de ' & pEjercicio

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

  ws.Range('A' & RenActual).Font.Size = 12[C0]
  ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
  // Lo centra en las columnas
  ws.Range('A' & RenActual & ':V' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
  Escoge pTipoImpresion 
    Caso 0  // TODOS
      ws.Range('A' & RenActual ).Value = 'Se Incluyen Documentos Vencidos y Por Vencer'
    FinCaso
    Caso 1  // Vencidos
      ws.Range('A' & RenActual ).Value = 'Se Incluyen Documentos Vencidos'
    FinCaso              
    Caso 2 // PorVencer
      ws.Range('A' & RenActual ).Value = 'Se Incluyen Documentos Por Vencer'
    FinCaso
  FinEscoge

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

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

  // Moneda del reporte
  ws.Range('T' & RenActual).Font.Size = 12[C0]
  ws.Range('T' & RenActual ).Value = 'Moneda: ' & gNombreMonedaReporte[C0]

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

  // Pone el titulo de cada columna en EXCEL
  lRango = 'A' & RenActual & ':V' & RenActual
  ws.Range(lRango).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range(lRango).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range(lRango).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range(lRango).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  ws.Range(lRango).Interior.ColorIndex = 55[C0]    
  ws.Range(lRango).Font.FontStyle = 'Negrita'[C0]    
  ws.Range(lRango).Font.Color = @RGB(255;255;255)[C0]
  ws.Range(lRango).WrapText = 1[C0]
  ws.Range('A' & RenActual & ':V' & RenActual).HorizontalAlignment = xlCentro[C0]
  ws.Range('C' & RenActual & ':V' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
  ws.Range('A' & RenActual & ':V' & RenActual).VerticalAlignment = xlCentro[C0]
  ws.Range('A' & RenActual & ':B' & RenActual).Value = 'Código','Nombre(Cliente)'
  Escoge pTipoImpresion 
    Caso 0  // TODOS
      ws.Range('C' & RenActual & ':I' & RenActual).Value = 'Concepto Documento', 'Serie', 'Folio','Fecha Documento','Fecha Vencimiento','Dias Vencidos','Dias por Vencer'
    FinCaso
    Caso 1  // Vencidos
      ws.Range('C' & RenActual & ':H' & RenActual).Value = 'Concepto Documento', 'Serie', 'Folio','Fecha Documento','Fecha Vencimiento','Dias Vencidos'
    FinCaso              
    Caso 2 // PorVencer
      ws.Range('C' & RenActual & ':H' & RenActual).Value = 'Concepto Documento', 'Serie', 'Folio','Fecha Documento','Fecha Vencimiento','Dias por Vencer'
    FinCaso
  FinEscoge
  ws.Range('J' & RenActual ).Value = 'Saldo al ' & @Col(gFechas;2)
  ws.Range('K' & RenActual & ':N' & RenActual).Value = 'Pagos en ' & @Col(gMeses; 0), 'Saldo al ' & @Col(gFechas;4),  'Pagos en ' & @Col(gMeses; 1), 'Saldo al ' & @Col(gFechas;6) 
  ws.Range('O' & RenActual & ':R' & RenActual).Value = 'Pagos en ' & @Col(gMeses; 2), 'Saldo al ' & @Col(gFechas;8),  'Pagos en ' & @Col(gMeses; 3), 'Saldo al ' & @Col(gFechas;10) 
  ws.Range('S' & RenActual & ':V' & RenActual).Value = 'Pagos en ' & @Col(gMeses; 4), 'Saldo al ' & @Col(gFechas;12), 'Pagos en ' & @Col(gMeses; 5), 'Saldo al ' & @Col(gFechas;14)

  RenFijo = RenActual + 1
  Excel.Rows(RenFijo & ':' & RenFijo).Select
  Excel.ActiveWindow.FreezePanes = True
  ws.Range('A' & RenActual).Select
FinEncab


// *****************************************************************************
// Cuerpo del reporte
// *****************************************************************************
tParametros.Busca Primero   

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

fConfiguraColumnas()

Si pCteProvInicial = ' '
  tClientes.Busca Primero
  pCteProvInicial = tClientes(cCodigoCliente)
Finsi

Si pCteProvFinal = ' '
  tClientes.Busca Ultimo
  pCteProvFinal =  tClientes(cCodigoCliente)  
Finsi

Mientras[tClientes.Busca[pCteProvInicial & '..'  & pCteProvFinal]; tClientes->Encontro ; tClientes.Busca Siguiente[1]]

  gClienteConSaldo = 0

  // Filtra los clientes/proveedores en base a las clasificaciones
  Si fDiscriminaCliente(tClientes) = 1
    Continua
  Finsi

  // Se buscan todos los documentos asociados a el cliente, afectados 
  lLlave[0] = tClientes(cIdClienteProveedor) & ':1:0'
  Mientras[tDocumentos.Busca[lLlave]; tDocumentos->Encontro; tDocumentos.Busca Siguiente[3]]
    // Descartar los documentos que no usen cliente
    Si tDocumentos(cUsaCliente) != 1
      Continua
    FinSI

    // Calcular el saldo del documento a la fecha de corte
    Si tDocumentos(cFecha) <= @Col(gFechas;1)
      lSaldoDocumento = fSaldoDocumento(''; @Col(gFechas;1); tCargosAbonosLib; tDocumentos; tDoctosLib2)
      // N.D.3219 Expresar el importe en la moneda del reporte
      //!lImporte = fImporteMonedaReporte(lSaldoDocumento; tDocumentos(cIdMoneda); tDocumentos(cTipoCambio); tDocumentos(cFecha))
      lImporte = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambioLib; lSaldoDocumento; pIdMonedaReporte; tClientes(cIdMoneda))
    SiNo
      lSaldoDocumento = 0
      lImporte = 0
    FinSi

    // Documento con importe vencido
    Si tDocumentos(cFechaVencimiento) < @Col(gFechas;1) Y lSaldoDocumento > 0 
      Si pTipoImpresion < 2  // 0 = TODOS, 1 = Vencidos
        lDiasVencidos = fConvJul(@Col(gFechas;1)) - fConvJul(tDocumentos(cFechaVencimiento))
        // Cliente, Documento, Fecha_Docto, Fecha_Vencimiento, aDiasVencidos, aDiasPorVencer)
        fImprimirDocumento(tClientes; tDocumentos; tDocumentos(cFecha); tDocumentos(cFechaVencimiento); lDiasVencidos; 0; lImporte)
      FinSi
    // Documento por vencer
    Sino   
      Si pTipoImpresion = 0 O pTipoImpresion = 2  // 0 = TODOS, 2 = Por Vencer
        lDiasPorVencer = fConvJul(tDocumentos(cFechaVencimiento)) - fConvJul(@Col(gFechas;1))
        // Cliente, Documento, Fecha_Docto, Fecha_Vencimiento, aDiasVencidos, aDiasPorVencer)
        fImprimirDocumento(tClientes; tDocumentos; tDocumentos(cFecha); tDocumentos(cFechaVencimiento); 0; lDiasPorVencer; lImporte)
      FinSi
    FinSi  // El documento esta vencido a la fecha de corte o por vencer

  FinMientras
  // Si el Clientetiene algun importe vencido 
  Si gClienteConSaldo != 0
    fImprimirTotalCliente(tClientes)
  FinSi
FinMientras

// Imprime Total General
fImprimirTotalReporte()


