// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // // 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;'CONTPAQ I Facturacion' // 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(156;0;89)[C0] ws.Range('A' & RenActual).Font.Size = 8[C0] ws.Range('A' & RenActual).Value = 'Factura Electrónica'[C0] // Pone el nombre de la empresa ws.Range('C' & RenActual).Font.Size = 14[C0] ws.Range('C' & RenActual).Font.FontStyle = 'Negrita'[C0] // Lo centra en las columnas ws.Range('C' & RenActual & ':T' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range('C' & RenActual ).Value = tEmpresa->Nombre // Avanza de renglon RenActual = RenActual + 1[C0] // Pone el titulo del reporte en EXCEL ws.Range('A' & RenActual).Font.Size = 12[C0] ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0] // 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()