// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//	AnPreciosExcel.rpt
//	Nombre del reporte en el sistema: Antigüedad de Saldos y Pronóstico de Cobranza/Pagos 
//																		[Detallado] por Cliente/Proveedor en Excel
//
//  Sistema: AdminPAQ v1.1.
// 
//  Este reporte pertenece al módulo de clientes y proveedores. 
//
//	Consideraciones especiales:
//  
//	Elaboró:	Leonardo Aguilar Pizano
//	Fecha: 	  17 de septiembre de 2002
//  Lotus Notes:  S.C.239
//
// Revisiones : 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 01/10/2003  EGV			2445    Se agregó el parámetro pHastaFecha que es usado para validarla
//                              con la Fecha de Vencimiento de cada Documento obtenido. Si la
//                              fecha de Vencimiento del Documento es menor que el parámetro
//                              entonces se desplegará en el reporte.
// 24/05/2004  DRdA     N.C.65  Se agregaron los parámetros pAgenteInicial y pAgenteFinal para
//                              filtrar el reporte por un rango de agentes.
// 09/03/2005  HVA     N.D.3037
// 09/03/2005  HVA     N.D.3077 
// 29/04/2005   LAP    N.D.3240     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 y
//                                  fCambiarMonedaImporteAReporte de LibAdminPAQ.rpt
// 22/06/2005   HVA    N.D.3316     No se tomaban en cuenta abonos asociados al cargo en la parte de pronostico de cobranza
// 08/08/2005   LAP    N.D.3377     En caso de presentar el reporte en forma condensada no se debe
//                                  de mostrar la columna de agente (LAP)
//                                  - Cuerpo del reporte
//                                  No incluir los documentos cuya fecha sea mayor a la fecha hasta (LAP) 
//                                  - Cuerpo del reporte
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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


// *********************************************************************************************
// Parámetros
// *********************************************************************************************
Parametro pTipoReporte 				= 3						// Tipo del reporte
					// 1 - Antigüedad de saldos y pronóstico de cobranza por cliente
					// 2 - Antigüedad de saldos y pronóstico de cobranza detallado por cliente
					// 3 - Antigüedad de saldos y pronóstico de pagos por proveedor
					// 4 - Antigüedad de saldos y pronóstico de pagos detallado por proveedor
Parametro pFechaCorte			  	= '20040531'  // Fecha de corte
Parametro pHastaFecha         = '20040531'
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 pAgenteInicial         = ' '                // Agente inicial del rango
Parametro pAgenteFinal           = ' '                // Agente final del rango
Parametro pTipoImpresion			= 0						// Tipo de impresión
																						// 0 Todos
																						// 1 Vencidos
																						// 2 Por vencer
Parametro pDocumentosAImprimir= 0						// Documentos a imprimir
																						// 0 Todos
																						// 1 Cargos
																						// 2 Abonos
Parametro pIdMonedaReporte		= 1						// Moneda del reporte
Parametro	pDetallado					= 1						// Tipo de 
																						// 0 Concentrado
																						// 1 Detallado
Parametro pClienteProveedor		= 1						// Tipo de reporte
																						// 0 - Cliente
																						// 1 - Proveedor
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 tTiposCambio = tEmpresa['mgw10035'] 			// Tipos de cambio por día
tTiposCambio.Usaindice['iMonedaFecha']                                 

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

Si pClienteProveedor = 0
   UsaTabla	tAgentes = tEmpresa['mgw10001']
   tAgentes.UsaIndice['']
FinSi


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


// *********************************************************************************************
// Variables de ámbito global
// *********************************************************************************************
gIdioma = 0             // Idioma del reporte
                        // 0 = Español
                        // 1 = Inglés
gIdEjercicio 	= 0       // ID del ejercicio que contiene la fecha de inicio del reporte
gPeriodo 			= 0       // Numero de período que corresponde a la fecha de inicio del reporte
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
[C0..C7].Decimales 0

gTotalCliente = 0					// Acumulados del cliente
gTotalReporte = 0					// Acumulados del reporte
gLimite1 = pDias			// Guarda	el límite superior del primer rango para agrupar saldos	[ 1 - 15 Días]
gLimite2 = 2 * pDias	// Guarda	el límite superior del segundo rango para agrupar saldos[16 - 30 Días]
gLimite3 = 3 * pDias	// Guarda	el límite superior del tercer rango para agrupar saldos	[31 - 45 Días]

// *********************************************************************************************
// 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 = 10[C0]
// Nombre-CLiente 		= 40 caracteres
ws.Columns(2).ColumnWidth = 40[C0]
Si pClienteProveedor = 0
	// Nombre-Agente 		= 40 caracteres
	ws.Columns(3).ColumnWidth = 40[C0]
SiNo
	// Nombre-Agente
	ws.Columns(3).ColumnWidth = 0[C0]
FinSi
// Tipo de salida, El reporte es detallado ?
Si pDetallado = 0
	// Concepto
	ws.Columns(4).ColumnWidth = 0[C0]
	// Serie
	ws.Columns(5).ColumnWidth = 0[C0]
	// Folio
	ws.Columns(6).ColumnWidth = 0[C0]
	// Fecha_Documento
	ws.Columns(7).ColumnWidth = 0[C0]
	// Fecha_Vencimiento
	ws.Columns(8).ColumnWidth = 0[C0]
	// Dias_Vencidos/Por Vencer
	ws.Columns(9).ColumnWidth = 0[C0]
Sino
	// Concepto
	ws.Columns(4).ColumnWidth = 25[C0]
	// Serie
	ws.Columns(5).ColumnWidth = 5[C0]
	// Folio
	ws.Columns(6).ColumnWidth = 12[C0]
	// Fecha_Documento 		= 14 caracteres
	ws.Columns(7).ColumnWidth = 14[C0]
	// Fecha_Vencimiento 	= 14 caracteres
	ws.Columns(8).ColumnWidth = 14[C0]
	// Dias_Vencidos/Por Vencer	= 8 caracteres
	ws.Columns(9).ColumnWidth = 8[C0]
FinSi
// Fin del tipo de salida

// Tipo de impresión
Si pTipoImpresion = 0	// TODOS: Vencidos y Por vencer
	// Dias_PorVencer  		= 8 caracteres
	Si pDetallado = 0
		ws.Columns(10).ColumnWidth = 0[C0]
	Sino		
		ws.Columns(10).ColumnWidth = 8[C0]
	FinSI
	// Total_Vencido 			= 15 caracteres
	ws.Columns(11).ColumnWidth = 15[C0]
	// Titulo_Vencido1		= 15 caracteres
	ws.Columns(12).ColumnWidth = 15[C0]
	// Titulo_Vencido2		= 15 caracteres
	ws.Columns(13).ColumnWidth = 15[C0]
	// Titulo_Vencido3		= 15 caracteres
	ws.Columns(14).ColumnWidth = 15[C0]
	// Titulo_Vencido4		= 15 caracteres
	ws.Columns(15).ColumnWidth = 15[C0]
	// Total_PorVencer		= 15 caracteres
	ws.Columns(16).ColumnWidth = 15[C0]
	// Titulo_Vencido1		= 15 caracteres
	ws.Columns(17).ColumnWidth = 15[C0]
	// Titulo_Vencido2		= 15 caracteres
	ws.Columns(18).ColumnWidth = 15[C0]
	// Titulo_Vencido3		= 15 caracteres
	ws.Columns(19).ColumnWidth = 15[C0]
	// Titulo_Vencido4		= 15 caracteres
	ws.Columns(20).ColumnWidth = 15[C0]
	// Total          		= 15 caracteres
	ws.Columns(21).ColumnWidth = 15[C0]
Sino										// Vencidos o Por Vencer
	// Total_Vencido/Por_Vencer			= 15 caracteres
	ws.Columns(10).ColumnWidth = 15[C0]
	// Titulo_Vencido1/Por_Vencer1	= 15 caracteres
	ws.Columns(11).ColumnWidth = 15[C0]
	// Titulo_Vencido2/Por_Vencer2	= 15 caracteres
	ws.Columns(12).ColumnWidth = 15[C0]
	// Titulo_Vencido3/Por_Vencer3	= 15 caracteres
	ws.Columns(13).ColumnWidth = 15[C0]
	// Titulo_Vencido4/Por_Vencer4	= 15 caracteres
	ws.Columns(14).ColumnWidth = 15[C0]
	// Total          		= 15 caracteres
	ws.Columns(15).ColumnWidth = 15[C0]
FinSi
// Fin del tipo de impresión


// *********************************************************************************************
// 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(9).NumberFormat = lFormato[C0]
	Si pTipoImpresion = 0
		ws.Columns(10).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(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]
	Sino
		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]
	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.
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// ==========================================================================================
Deffunc fDiscriminaCliente(atCliente:TABLA)
Local lRegresa
    
  lRegresa = 0

  // Se salta el Cliente NINGUNO
  Si atCliente(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 (pClienteProveedor = 0) Y (atCliente(cTipoCliente) > 2) 
    lRegresa = 1
  Finsi
  // Si se requieren los Proveedores y no se trata de un Proveedor
  Si  (pClienteProveedor = 1) Y (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; pClienteProveedor)
     	// Sa salta el cliente actual, por no pertenecer a alguna de las clasificaciones
      lRegresa = 1
    Finsi
  Finsi

  Retorna lRegresa
FinFunc
// Fin Método: fDiscriminaCliente


// ==========================================================================================
// fDiscriminaPorAgente
// Descripcion : Verifica que el agente del documento  cumpla con los filtros del reporte
// Entrada : 		aIdAgente	:  identificador que relaciona al agente.
// Salidas:  		1 				:	indica que el agente no aplica, debe descartarse
//          		0 				:	indica que el agente no debe descartarse.
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// ==========================================================================================
Deffunc fDiscriminaPorAgente(aIdAgente)
Local lRegresa
    
  lRegresa = 0

  Si pClienteProveedor = 0
    // Cuando se quiere desde el primero se incluyen los documentos con id de agente en cero

    // Si no se quiere desde el primer agente y el id es cero se descarta el docto
    Si pAgenteInicial != ' ' Y aIdAgente = 0
      lRegresa = 1
    Finsi

    // Se busca el agente del docto actual para efectuar las comparaciones
    Si lRegresa = 0 Y aIdAgente != 0
      tAgentes.Busca[@str(aIdAgente;0)]
    FinSi

    // Si el agente del docto es menor al inicial del rango se descarta el docto
    Si lRegresa = 0 Y pAgenteInicial != ' ' Y tAgentes(cCodigoAgente) < pAgenteInicial
      lRegresa = 1
    Finsi

    // Si el agente del docto es mayor al final del rango se descarta el docto
    Si lRegresa = 0 Y pAgenteFinal != ' ' Y aIdAgente != 0 Y tAgentes(cCodigoAgente) > pAgenteFinal
      lRegresa = 1
    Finsi
  FinSi

  Retorna lRegresa
FinFunc
// Fin Método: fDiscriminaPorAgente


// ==========================================================================================
// fImprimirTotalReporte
// Descripcion : 
// Entrada :
// Salidas: 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// ==========================================================================================
Deffunc fImprimirTotalReporte()
Local lImporte
Local	lRango1, lRango2, lCelda1, lCelda2

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

	lCelda1[0] = 'G' & RenActual
	Si pTipoImpresion = 0
		lCelda2[0] = 'J' & RenActual
		lRango2 = 'K' & RenActual & ':U' & RenActual
	Sino
		lCelda2[0] = 'I' & RenActual
		lRango2 = 'J' & RenActual & ':O' & RenActual
	FinSi
	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]

	Escoge pTipoImpresion
		Caso 0	// Todos
			// Total_Vencido
			ws.Range('K' & RenActual).Value = gTotalReporte[C0]	
			// Vencido1
         ws.Range('L' & RenActual).Value = gTotalReporte[C1]	
			// Vencido2
	  	   ws.Range('M' & RenActual).Value = gTotalReporte[C2]
			// Vencido3
		   ws.Range('N' & RenActual).Value = gTotalReporte[C3]
			// Vencido4
		   ws.Range('O' & RenActual).Value = gTotalReporte[C4]
			// Total_PorVencer
			ws.Range('P' & RenActual).Value = gTotalReporte[C5]
			// PorVencer1
		   ws.Range('Q' & RenActual).Value = gTotalReporte[C6]
			// PorVencer2
		   ws.Range('R' & RenActual).Value = gTotalReporte[C7]
			// PorVencer3
	  	   ws.Range('S' & RenActual).Value = gTotalReporte[C8]
			// PorVencer4
		   ws.Range('T' & RenActual).Value = gTotalReporte[C9]
			// Total
		   ws.Range('U' & RenActual).Value = gTotalReporte[C10]
		FinCaso
		Caso 1	// Vencidos
			// Total_Vencido
			ws.Range('J' & RenActual).Value = gTotalReporte[C0]	
			// Vencido1
		   ws.Range('K' & RenActual).Value = gTotalReporte[C1]	
			// Vencido2
		   ws.Range('L' & RenActual).Value = gTotalReporte[C2]
			// Vencido3
	  	   ws.Range('M' & RenActual).Value = gTotalReporte[C3]
			// Vencido4
		   ws.Range('N' & RenActual).Value = gTotalReporte[C4]
			// Total
		  ws.Range('O' & RenActual).Value = gTotalReporte[C10]
		FinCaso
		Caso 2 	// PorVencer
			// Total_PorVencer
			ws.Range('J' & RenActual).Value = gTotalReporte[C5]	
			// PorVencer1
		   ws.Range('K' & RenActual).Value = gTotalReporte[C6]	
			// PorVencer2
		   ws.Range('L' & RenActual).Value = gTotalReporte[C7]
			// PorVencer3
	  	   ws.Range('M' & RenActual).Value = gTotalReporte[C8]
			// PorVencer4
		   ws.Range('N' & RenActual).Value = gTotalReporte[C9]
			// Total
		   ws.Range('O' & RenActual).Value = gTotalReporte[C10]
		FinCaso
	FinEscoge

Finfunc
// Fin método: fImprimirTotalReporte


// ==========================================================================================
// fImprimirTotalCliente
// Descripcion : 
// Entrada :
// Salidas: 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// ==========================================================================================
Deffunc fImprimirTotalCliente(atCliente:TABLA)
Local lImporte
Local	lRango, lUltimaCelda, lCeldaImportes, lCeldaDias

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

	Si pTipoImpresion = 0
		lRango  					= 'A' & RenActual & ':U' & RenActual
		lUltimaCelda[0] 	= 'U' & RenActual
		lCeldaImportes[0]	= 'K' & RenActual
		lCeldaDias[0]			= 'J' & RenActual
	Sino
		lRango  					= 'A' & RenActual & ':O' & RenActual
		lUltimaCelda[0] 	= 'O' & RenActual
		lCeldaImportes[0]	= 'J' & RenActual
		lCeldaDias[0]			= 'I' & RenActual
	FinSi

	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('D' & RenActual & ':' & lCeldaDias).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
		ws.Range('D' & RenActual & ':' & lCeldaDias).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	   ws.Range('D' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
		ws.Range(lCeldaDias).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
      Si pClienteProveedor = 0
	     ws.Range('D' & RenActual).Value = 'TOTAL CLIENTE:'[C0]
      SiNo
	     ws.Range('D' & RenActual).Value = 'TOTAL PROVEEDOR:'[C0]
      FinSi

 		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

	Escoge pTipoImpresion
		Caso 0		// Todos
			// Total_Vencido
			ws.Range('K' & RenActual).Value = gTotalCliente[C0]	
			// Vencido1
	  	ws.Range('L' & RenActual).Value = gTotalCliente[C1]		
			// Vencido2
  		ws.Range('M' & RenActual).Value = gTotalCliente[C2]
			// Vencido3
  		ws.Range('N' & RenActual).Value = gTotalCliente[C3]
			// Vencido4
	  	ws.Range('O' & RenActual).Value = gTotalCliente[C4]
			// Total_PorVencer
			ws.Range('P' & RenActual).Value = gTotalCliente[C5]
			// Vencido1
  		ws.Range('Q' & RenActual).Value = gTotalCliente[C6]
			// Vencido2
	  	ws.Range('R' & RenActual).Value = gTotalCliente[C7]
			// Vencido3
  		ws.Range('S' & RenActual).Value = gTotalCliente[C8]
			// Vencido4
  		ws.Range('T' & RenActual).Value = gTotalCliente[C9]
			// Total
	  	ws.Range('U' & RenActual).Value = gTotalCliente[C10]
		FinCaso
		Caso 1		// Vencidos
			// Total_Vencido
			ws.Range('J' & RenActual).Value = gTotalCliente[C0]	
			// Vencido1
	  	ws.Range('K' & RenActual).Value = gTotalCliente[C1]		
			// Vencido2
  		ws.Range('L' & RenActual).Value = gTotalCliente[C2]
			// Vencido3
  		ws.Range('M' & RenActual).Value = gTotalCliente[C3]
			// Vencido4
	  	ws.Range('N' & RenActual).Value = gTotalCliente[C4]
			// Total
	  	ws.Range('O' & RenActual).Value = gTotalCliente[C10]
		FinCaso
		Caso 2		// Por Vencer
			// Total_PorVencer
			ws.Range('J' & RenActual).Value = gTotalCliente[C5]
			// Vencido1
  		ws.Range('K' & RenActual).Value = gTotalCliente[C6]
			// Vencido2
	  	ws.Range('L' & RenActual).Value = gTotalCliente[C7]
			// Vencido3
  		ws.Range('M' & RenActual).Value = gTotalCliente[C8]
			// Vencido4
  		ws.Range('N' & RenActual).Value = gTotalCliente[C9]
			// Total
	  	ws.Range('O' & RenActual).Value = gTotalCliente[C10]
		FinCaso
	FinEscoge

	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 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// ==========================================================================================
//! N.D.3240 Deffunc fImporteMonedaReporte(aImporte; aIdMonedaDocto; aTipoCambioDocto; aFecha)
//! N.D.3240 Local lImporteMonedaRpt, lImporteMonedaBase, lTipoCambio
//! N.D.3240 
//! N.D.3240 	Si aIdMonedaDocto != pIdMonedaReporte
//! N.D.3240 		// Transforma el importe a la moneda base tomando el tipo de cambio del documento
//! N.D.3240 		lImporteMonedaBase	= aImporte * aTipoCambioDocto
//! N.D.3240 		Si pIdMonedaReporte != 1
//! N.D.3240 			// Si la moneda del reporte es diferente a la base convierte tomando el tipo de cambio
//! N.D.3240 			lTipoCambio    		= fTipoCambio(aFecha; pIdMonedaReporte; tTiposCambio)
//! N.D.3240 			lImporteMonedaRpt = lImporteMonedaBase / lTipoCambio
//! N.D.3240 		Sino
//! N.D.3240 			lImporteMonedaRpt = lImporteMonedaBase
//! N.D.3240 		FinSi		
//! N.D.3240 	Sino
//! N.D.3240 		lImporteMonedaRpt = aImporte
//! N.D.3240 	FinSi
//! N.D.3240 
//! N.D.3240 	Retorna lImporteMonedaRpt
//! N.D.3240 FinFunc
// Fin método: fImporteMonedaReporte


// ==========================================================================================
// fImprimirDocumento
// Descripcion : 
//
// Entrada : 	
// Salidas: 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// ==========================================================================================
Deffunc fImprimirDocumento(atCliente:TABLA; atDocumento:TABLA; aSumar; aFechaDocto; aFechaVencimiento; aDiasVencidos; aDiasPorVencer; aTotalVencido; aTotalPorVencer; aTotal)
Local lImporte, lVencido, lPorVencer
Local	lRango

	// Si el reportes es para clientes descartar los documentos que usen proveedor y viceversa
	//	pClienteProveedor	[0 - Cliente / 1 - Proveedor]
	Si (pClienteProveedor = 0) y (atDocumento(cUsaProveedor) = 1)
		Retorna
	FinSI
	Si (pClienteProveedor = 1) y (atDocumento(cUsaCliente) = 1)
		Retorna
	FinSI

	lImporte = 0
	lAcumulados = 0

	Si pTipoImpresion = 0 o pTipoImpresion = 1	// Todos y/o Vencidos
//		Si aDiasVencidos != 0
		  Si aDiasVencidos <= gLimite1
  		  lAcumulados[1] = aTotalVencido
		  Sino
  		  Si aDiasVencidos <= gLimite2
	  		  lAcumulados[2] = aTotalVencido
	    	Sino 
  	    	Si aDiasVencidos <= gLimite3
    	  		lAcumulados[3] = aTotalVencido
	      	Sino
  	      	lAcumulados[4] = aTotalVencido
	  	    Finsi
  	  	Finsi
		  Finsi
//		FinSi
	FinSi

	Si pTipoImpresion = 0 o pTipoImpresion = 2	// Todos y/o PorVencer
//		Si aDiasPorVencer != 0
		  Si aDiasPorVencer <= gLimite1
  		  lAcumulados[6] = aTotalPorVencer
		  Sino
  		  Si aDiasPorVencer <= gLimite2
	  		  lAcumulados[7] = aTotalPorVencer
	    	Sino 
	  	    Si aDiasPorVencer <= gLimite3
  	  	  	lAcumulados[8] = aTotalPorVencer
    	  	Sino
      	  	lAcumulados[9] = aTotalPorVencer
	      	Finsi
	  	  Finsi
		  Finsi
//		FinSi
	FinSi

	Si aSumar = 1
		lImporte = lAcumulados
		Si pTipoImpresion = 0 o pTipoImpresion = 1
			lImporte[0] = aTotalVencido
		FinSi
		Si pTipoImpresion = 0 o pTipoImpresion = 2
			lImporte[5] = aTotalPorVencer
		FinSi
		lImporte[10] = aTotal
	Sino
		lImporte = -lAcumulados
		Si pTipoImpresion = 0 o pTipoImpresion = 1
			lImporte[0] = -aTotalVencido
		FinSi
		Si pTipoImpresion = 0 o pTipoImpresion = 2
			lImporte[5] = -aTotalPorVencer
		FinSi
		lImporte[10] = -aTotal
	FinSi

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

		Si pTipoImpresion = 0
			lRango = 'A' & RenActual & ':U' & RenActual
		Sino
			lRango = 'A' & RenActual & ':O' & RenActual
		FinSi
	  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]
      Si pClienteProveedor = 0
  	      ws.Range('C' & RenActual).Value = ''[C0]
         Si pClienteProveedor = 0 Y atDocumento(cIdAgente) != 0
  	        ws.Range('C' & RenActual).Value = tAgentes(cNombreAgente)[C0]
         FinSi
      FinSi	
		// Concepto
		tConceptos.Busca[@str(atDocumento(cIdConceptoDocumento);0)]	
  	ws.Range('D' & RenActual).Value = tConceptos(cNombreConcepto)[C0]
		// Serie
  	ws.Range('E' & RenActual).Value = atDocumento(cSerieDocumento)[C0]
		// Folio
  	ws.Range('F' & RenActual).Value = atDocumento(cFolio)[C0]
	  // Fecha_Documento
  	ws.Range('G' & RenActual).Value = @Col(fFormateaFecha(aFechaDocto; gIdioma);0)[C0]
		// Fecha_Vencimiento
		Si aFechaVencimiento != 0
	  	ws.Range('H' & RenActual).Value = @Col(fFormateaFecha(aFechaVencimiento; gIdioma);0)[C0]
		FinSi
		Escoge pTipoImpresion 
			Caso 0		// Todos
				// Dias_Vencidos
  			ws.Range('I' & RenActual).Value = aDiasVencidos[C0]
				// Dias_PorVencer
	  		ws.Range('J' & RenActual).Value = aDiasPorVencer[C0]
				// Total_Vencido
				ws.Range('K' & RenActual).Value = lImporte[C0]	
				// Vencido1
	  		ws.Range('L' & RenActual).Value = lImporte[C1]
				// Vencido2
 				ws.Range('M' & RenActual).Value = lImporte[C2]
				// Vencido3
 				ws.Range('N' & RenActual).Value = lImporte[C3]
				// Vencido4
		  	ws.Range('O' & RenActual).Value = lImporte[C4]
				// Total_PorVencer
				ws.Range('P' & RenActual).Value = lImporte[C5]	
				// Vencido1
			  ws.Range('Q' & RenActual).Value = lImporte[C6]
				// Vencido2
		  	ws.Range('R' & RenActual).Value = lImporte[C7]
				// Vencido3
  			ws.Range('S' & RenActual).Value = lImporte[C8]
				// Vencido4
		  	ws.Range('T' & RenActual).Value = lImporte[C9]
				// Total
			  ws.Range('U' & RenActual).Value = lImporte[C10]
			FinCaso
			Caso 1		// Vencidos
				// Dias_Vencidos
  			ws.Range('I' & RenActual).Value = aDiasVencidos[C0]
				// Total_Vencido
				ws.Range('J' & RenActual).Value = lImporte[C0]	
				// Vencido1
	  		ws.Range('K' & RenActual).Value = lImporte[C1]
				// Vencido2
 				ws.Range('L' & RenActual).Value = lImporte[C2]
				// Vencido3
 				ws.Range('M' & RenActual).Value = lImporte[C3]
				// Vencido4
		  	ws.Range('N' & RenActual).Value = lImporte[C4]
				// Total
			  ws.Range('O' & RenActual).Value = lImporte[C10]
			FinCaso
			Caso 2		// PorVencer
				// Dias_PorVencer
	  		ws.Range('I' & RenActual).Value = aDiasPorVencer[C0]
				// Total_PorVencer
				ws.Range('J' & RenActual).Value = lImporte[C5]	
				// Vencido1
			  ws.Range('K' & RenActual).Value = lImporte[C6]
				// Vencido2
		  	ws.Range('L' & RenActual).Value = lImporte[C7]
				// Vencido3
  			ws.Range('M' & RenActual).Value = lImporte[C8]
				// Vencido4
		  	ws.Range('N' & RenActual).Value = lImporte[C9]
				// Total
			  ws.Range('O' & RenActual).Value = lImporte[C10]
			FinCaso
		FinEscoge
	FinSi

	gTotalReporte = gTotalReporte + lImporte
	gTotalCliente = gTotalCliente + lImporte

	Si aTotal != 0
		gClienteConSaldo = 1
	FinSi
Finfunc
// Fin método: fImprimirDocumento


// *********************************************************************************************
// Encabezado del reporte
// *********************************************************************************************
// ==========================================================================================
// 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: 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// ==========================================================================================
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 & ':U' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
			Sino
	  		ws.Range('A' & RenActual & ':O' & 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

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]

  // 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
	Si pTipoImpresion = 0
	  ws.Range('B' & RenActual & ':T' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	Sino
	  ws.Range('B' & RenActual & ':N' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	FinSi
  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
	Si pTipoImpresion = 0
	  ws.Range('A' & RenActual & ':U' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	Sino
	  ws.Range('A' & RenActual & ':O' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	FinSi
  Si pClienteProveedor = 0
    ws.Range('A' & RenActual ).Value = 'A N T I G Ü E D A D     D E     S A L D O S     Y     P R O N Ó S T I C O     D E     C O B R A N Z A'[C0]
  SiNo
    ws.Range('A' & RenActual ).Value = 'A N T I G Ü E D A D     D E     S A L D O S     Y     P R O N Ó S T I C O     D E     P A G O S'[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
	Si pTipoImpresion = 0
	  ws.Range('A' & RenActual & ':U' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	Sino
	  ws.Range('A' & RenActual & ':O' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	FinSi
  ws.Range('A' & RenActual ).Value = 'Fecha de Corte: ' & fFormateaFecha(pFechaCorte;gIdioma)[C0]

  // Se avanza un renglón y se imprime el rango final de fecha de Vencimiento de los Documentos a imprimir.
  RenActual = RenActual + 1[C0]
  ws.Range('A' & RenActual).Font.Size = 12[C0]
  ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
  Si pTipoImpresion = 0
	  ws.Range('A' & RenActual & ':U' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	Sino
	  ws.Range('A' & RenActual & ':O' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	FinSi
  ws.Range('A' & RenActual ).Value = 'Incluír Documentos menores a: ' & fFormateaFecha(pHastaFecha;gIdioma)[C0]

	// ===== 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
	Si pTipoImpresion = 0
	  ws.Range('R' & RenActual).Font.Size = 12[C0]
  	ws.Range('R' & RenActual ).Value = 'Moneda: ' & gNombreMonedaReporte[C0]
	Sino
	  ws.Range('N' & RenActual).Font.Size = 12[C0]
  	ws.Range('N' & RenActual ).Value = 'Moneda: ' & gNombreMonedaReporte[C0]
	FinSi

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

	Si pTipoImpresion = 0
	  ws.Range('L' & RenActual & ':O' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 		ws.Range('L' & RenActual & ':O' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  ws.Range('L' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
 		ws.Range('O' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
	  ws.Range('L' & RenActual & ':O' & RenActual).Interior.ColorIndex = 3[C0]    
 		ws.Range('L' & RenActual & ':O' & RenActual).Font.FontStyle = 'Negrita'[C0]    
	  ws.Range('L' & RenActual & ':O' & RenActual).Font.Color = @RGB(255;255;255)[C0]
  	ws.Range('L' & RenActual & ':O' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	 	ws.Range('L' & RenActual).Value = 'SALDOS VENCIDOS'

	  ws.Range('Q' & RenActual & ':T' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 		ws.Range('Q' & RenActual & ':T' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  ws.Range('Q' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
 		ws.Range('T' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
	  ws.Range('Q' & RenActual & ':T' & RenActual).Interior.ColorIndex = 3[C0]    
 		ws.Range('Q' & RenActual & ':T' & RenActual).Font.FontStyle = 'Negrita'[C0]    
	  ws.Range('Q' & RenActual & ':T' & RenActual).Font.Color = @RGB(255;255;255)[C0]
  	ws.Range('Q' & RenActual & ':T' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	 	ws.Range('Q' & RenActual).Value = 'SALDOS POR VENCER'
	Sino		
	  ws.Range('K' & RenActual & ':N' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 		ws.Range('K' & RenActual & ':N' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  ws.Range('K' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
 		ws.Range('N' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
	  ws.Range('K' & RenActual & ':N' & RenActual).Interior.ColorIndex = 3[C0]    
 		ws.Range('K' & RenActual & ':N' & RenActual).Font.FontStyle = 'Negrita'[C0]    
	  ws.Range('K' & RenActual & ':N' & RenActual).Font.Color = @RGB(255;255;255)[C0]
  	ws.Range('K' & RenActual & ':N' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
		Si pTipoImpresion = 1	// Vencidos
		 	ws.Range('K' & RenActual).Value = 'SALDOS VENCIDOS'
		Sino									// PorVencer
		 	ws.Range('K' & RenActual).Value = 'SALDOS POR VENCER'
		FinSI
	FinSi

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

  // Pone el titulo de cada columna en EXCEL
	Si pTipoImpresion = 0
		lRango = 'A' & RenActual & ':U' & RenActual
	Sino
		lRango = 'A' & RenActual & ':O' & RenActual
	FinSi
	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]
	Si pTipoImpresion = 0
	 	ws.Range('C' & RenActual & ':U' & RenActual).HorizontalAlignment = xlCentro[C0]
	Sino
	 	ws.Range('C' & RenActual & ':O' & RenActual).HorizontalAlignment = xlCentro[C0]
	FinSi

	ws.Range('A' & RenActual & ':C' & RenActual).WrapText = 1[C0]
	Si pClienteProveedor = 0
  	  ws.Range('A' & RenActual & ':C' & RenActual).Value = 'Código','Nombre(Cliente)','Nombre(Agente)'
	Sino
  	  ws.Range('A' & RenActual & ':C' & RenActual).Value = 'Código','Nombre(Proveedor)',''
	FinSi

	Si pTipoImpresion = 0
		ws.Range('D' & RenActual & ':U' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
		ws.Range('D' & RenActual & ':U' & RenActual).VerticalAlignment = xlCentro[C0]
		ws.Range('D' & RenActual & ':U' & RenActual).WrapText = 1[C0]
		ws.Range('D' & RenActual & ':J' & RenActual).Value = 'Concepto Documento', 'Serie', 'Folio','Fecha Documento','Fecha Vencimiento','Dias Vencidos','Dias por Vencer'
		ws.Range('K' & RenActual & ':O' & RenActual).Value = 'Total Vencido','0-' & @str(pDias;0) & ' Días',@str(pDias+1;0) & '-' & @str(pDias*2;0) & ' Días',@str((pDias*2)+1;0) & '-' & @str(pDias*3;0) & ' Días',@str((pDias*3)+1;0) & ' Días o más'
		ws.Range('P' & RenActual & ':U' & RenActual).Value = 'Total por Vencer','0-' & @str(pDias;0) & ' Días',@str(pDias+1;0) & '-' & @str(pDias*2;0) & ' Días',@str((pDias*2)+1;0) & '-' & @str(pDias*3;0) & ' Días',@str((pDias*3)+1;0) & ' Días o más','Total'
	Sino
		ws.Range('D' & RenActual & ':O' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
		ws.Range('D' & RenActual & ':O' & RenActual).VerticalAlignment = xlCentro[C0]
		ws.Range('D' & RenActual & ':O' & RenActual).WrapText = 1[C0]
		Si pTipoImpresion = 1	// Vencidos
			ws.Range('D' & RenActual & ':I' & RenActual).Value = 'Concepto Documento', 'Serie', 'Folio','Fecha Documento','Fecha Vencimiento','Dias Vencidos'
			ws.Range('J' & RenActual & ':O' & RenActual).Value = 'Total Vencido','0-' & @str(pDias;0) & ' Días',@str(pDias+1;0) & '-' & @str(pDias*2;0) & ' Días',@str((pDias*2)+1;0) & '-' & @str(pDias*3;0) & ' Días',@str((pDias*3)+1;0) & ' Días o más','Total'
		Sino									// PorVencer
			ws.Range('D' & RenActual & ':I' & RenActual).Value = 'Concepto Documento', 'Serie', 'Folio','Fecha Documento','Fecha Vencimiento','Dias por Vencer'
			ws.Range('J' & RenActual & ':O' & RenActual).Value = 'Total por Vencer','0-' & @str(pDias;0) & ' Días',@str(pDias+1;0) & '-' & @str(pDias*2;0) & ' Días',@str((pDias*2)+1;0) & '-' & @str(pDias*3;0) & ' Días',@str((pDias*3)+1;0) & ' Días o más','Total'
		FinSi
	FinSi
	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()

  // N.D.3377 Inicio
  // En caso de ser concentrado y de pertenecer a Clientes no se debe de mostrar la columna de agentes
	Si pClienteProveedor = 0 Y pDetallado = 0
  	  ws.Columns(3).ColumnWidth = 0[C0]
	FinSi
  // N.D.3377 Fin

  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

		Si pDocumentosAImprimir = 0
			lLimite = 2
			Si pClienteProveedor = 0
				// Clientes
				lArreglo[0] = '0,1'	//"Cargo","Abono"
			Sino
				// Proveedores
				lArreglo[0] = '1,0' //"Abono","Cargo"
			FinSi
		Sino
			lLimite = 1
			Si pDocumentosAImprimir = 1
				Si pClienteProveedor = 0
					// Clientes
					lArreglo[0] = '0' //"Cargo"
				Sino
					// Proveedores
					lArreglo[0] = '1' //"Abono"
				FinSi
			FinSi
			Si pDocumentosAImprimir = 2
				Si pClienteProveedor = 0
					// Clientes
					lArreglo[0] = '1' //"Abono"
				Sino
					// Proveedores
					lArreglo[0] = '0' //"Cargo"
				FinSi
			FinSi
		FinSi

		lContador = 0
		Mientras lContador < lLimite
			// Se buscan todos los documentos asociados a el cliente, afectados 
			lLlave[0] = tClientes(cIdClienteProveedor) & ':' & '1:' & @Escoge(lArreglo;lContador)
			Mientras[tDocumentos.Busca[lLlave]; tDocumentos->Encontro; tDocumentos.Busca Siguiente[3]]
            // Filtra los agentes para los documentos de clientes
				Si pClienteProveedor = 0 Y fDiscriminaPorAgente(tDocumentos(cIdAgente)) = 1
					Continua
				Finsi
				lSaldoDocumento = 0
				lImporte = 0
				Si (pClienteProveedor = 0 Y @Escoge(lArreglo;lContador) = '1') O (pClienteProveedor = 1 Y @Escoge(lArreglo;lContador) = '0')
				  // N.D.3377 No incluir los documentos de cuya fecha sea mayor a la fecha hasta
					Si tDocumentos(cPendiente) != 0 Y tDocumentos(cFecha) <= pHastaFecha
						//! N.D.3240 lImporte = fImporteMonedaReporte(tDocumentos(cPendiente); tDocumentos(cIdMoneda); tDocumentos(cTipoCambio); tDocumentos(cFecha))
						lImporte = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambio; tDocumentos(cPendiente); pIdMonedaReporte; tClientes(cIdMoneda))
            // N.D.3238/4362 Redondear los importes antes de mostrarlos
            lImporte = fRedondeaImporteLib(lImporte; gDecimalesMonedaReporte)
						Si tDocumentos(cFecha) < pFechaCorte					// Documento con importe vencido
							Si pTipoImpresion < 2
								lDiasVencidos = fConvJul(pFechaCorte) - fConvJul(tDocumentos(cFecha))
								// Cliente, Documento, Restar=0, Fecha_Docto, Fecha_Vencimiento, aDiasVencidos, aDiasPorVencer, aTotalVencido, aTotalPorVencer, aTotal)
								fImprimirDocumento(tClientes; tDocumentos; 0; tDocumentos(cFecha); 0; lDiasVencidos; 0; lImporte; 0; lImporte)
							FinSi
						Sino																				// Documento con importe por vencer
							Si pTipoImpresion = 0 o pTipoImpresion = 2	
								lDiasPorVencer = fConvJul(tDocumentos(cFecha)) - fConvJul(pFechaCorte)
								// Cliente, Documento, Restar=0, Fecha_Docto, Fecha_Vencimiento, aDiasVencidos, aDiasPorVencer, aTotalVencido, aTotalPorVencer, aTotal)
								fImprimirDocumento(tClientes; tDocumentos; 0; tDocumentos(cFecha); 0; 0; lDiasPorVencer; 0; lImporte; lImporte)
							FinSi
						FinSi
					FinSi
					Continua
				FinSi
				Si (tDocumentos(cFechaVencimiento) < pFechaCorte) y (pDocumentosAImprimir < 2) 
					Si pTipoImpresion < 2
						// Calcular Saldo del Documento 
    	    	lSaldoDocumento = fSaldoDocumento(''; pFechaCorte; tCargosAbonosLib; tDocumentos; tDoctosLib2)
            // N.D.3238/4362 Redondear los importes antes de mostrarlos
            Si tMoneda(cIdMoneda) != tDocumentos(cIdMoneda)
              tMoneda.Busca[@Str(tDocumentos(cIdMoneda);0)]
            FinSi
            lSaldoDocumento = fRedondeaImporteLib(lSaldoDocumento; tMoneda(cDecimalesMoneda))
						//Si lSaldoDocumento > 0.0001 Y tDocumentos(cFechaVencimiento) <= pHastaFecha
            Si lSaldoDocumento >= 0.001 Y tDocumentos(cFecha) <= pHastaFecha
							// El documento tiene un saldo vencido de acuerdo a la fecha de corte
							lDiasVencidos = fConvJul(pFechaCorte) - fConvJul(tDocumentos(cFechaVencimiento))
							//! N.D.3240 lImporte = fImporteMonedaReporte(lSaldoDocumento; tDocumentos(cIdMoneda); tDocumentos(cTipoCambio); tDocumentos(cFecha))
							lImporte = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambio; lSaldoDocumento; pIdMonedaReporte; tClientes(cIdMoneda))
              // N.D.3238/4362 Redondear los importes antes de mostrarlos
              lImporte = fRedondeaImporteLib(lImporte; gDecimalesMonedaReporte)
							// Cliente, Documento, Sumar=1, Fecha_Docto, Fecha_Vencimiento, aDiasVencidos, aDiasPorVencer, aTotalVencido, aTotalPorVencer, aTotal)
							fImprimirDocumento(tClientes; tDocumentos; 1; tDocumentos(cFecha); tDocumentos(cFechaVencimiento); lDiasVencidos; 0; lImporte; 0; lImporte)
						FinSi
					FinSi
				Sino
					Si pDocumentosAImprimir = 2
						Continua
					FinSi
					Si pTipoImpresion = 1
						Continua
					FinSi
					// Aquí se procesan los documentos de cargo que se vencen en una fecha posterior a la fecha de corte 
					lSaldoDocumento = fSaldoDocumento(''; pHastaFecha; tCargosAbonosLib; tDocumentos; tDoctosLib2)
          // N.D.3238/4362 Redondear los importes antes de mostrarlos
          Si tMoneda(cIdMoneda) != tDocumentos(cIdMoneda)
            tMoneda.Busca[@Str(tDocumentos(cIdMoneda);0)]
          FinSi
          lSaldoDocumento = fRedondeaImporteLib(lSaldoDocumento; tMoneda(cDecimalesMoneda))
					//Si lSaldoDocumento > 0.0001 Y tDocumentos(cFechaVencimiento) <= pHastaFecha
          Si lSaldoDocumento >= 0.001 Y tDocumentos(cFecha) <= pHastaFecha
						// El documento tiene un saldo por vencer 
						lDiasPorVencer = fConvJul(tDocumentos(cFechaVencimiento)) - fConvJul(pFechaCorte)
						//! N.D.3240 lImporte = fImporteMonedaReporte(lSaldoDocumento; tDocumentos(cIdMoneda); tDocumentos(cTipoCambio); tDocumentos(cFecha))
						lImporte = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambio; lSaldoDocumento; pIdMonedaReporte; tClientes(cIdMoneda))
            // N.D.3238/4362 Redondear los importes antes de mostrarlos
            lImporte = fRedondeaImporteLib(lImporte; gDecimalesMonedaReporte)
						// Cliente, Documento, Sumar=1, Fecha_Docto, Fecha_Vencimiento, aDiasVencidos, aDiasPorVencer, aTotalVencido, aTotalPorVencer, aTotal)
						fImprimirDocumento(tClientes; tDocumentos; 1; tDocumentos(cFecha); tDocumentos(cFechaVencimiento); 0; lDiasPorVencer; 0; lImporte; lImporte)
					FinSi
				FinSi
			FinMientras
			lContador = lContador + 1
		FinMientras
		// Si el Clientetiene algun importe vencido 
		Si gClienteConSaldo != 0
			fImprimirTotalCliente(tClientes)
		FinSi
	FinMientras

	// Imprime Total General
	fImprimirTotalReporte()

