// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Reporte: ANTIGUEDAD DE SALDOS PARA CLIENTES/PROVEDORES AntigSaldos.rpt // // Sistema: ADMINPAQ Versión v1.0 Windows // // Descripcion: Este reporte muestra los saldos vencidos de los clientes o los saldo que se tienen // con los diferentes proveedores, estos saldos se agrupan en periodos de 10,15 etc.días // según lo que se pidan. // Solo se mostrarán los Clientes/Proveedores que presenten un saldo vencido. // Se puede mostrar el reporte a nivel de documentos (Detallado) o sumarizado a nivel de // Cliente/Proveedor. // Consideraciones : // Creación : Felix de la Cruz S. 05/Sept/2001 // Revisiones : // 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 // 13/08/2008 ELVS N.D.5234 ERROR PONE LOS DIAS DE PAGO EN LA SECCION DIAS DE REVISION // Y PONE LOS DIAS DE REVISION EN LA SECCION DE DIAS DE PAGO // AL EJECUTAR EL REPORTE DE CLIENTES ANTIGUEDAD DE SALDOS DETALLADO. // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // INCLUSION DE ARCHIVOS Incluye LibAdminPaq.rpt Incluye LibCliProv.rpt // INICIO PARAMETROS Parametro pFechaCorte = '20011129' Parametro pDelCliente = ' ' // clave del primer cliente en el rango Parametro pAlCliente = ' ' // clave del ultimo cliente en el rango Parametro pDias = 15 Parametro pCualesClientes = 0 // 0 =todos, 1= Activos, 2= InActivos Parametro pIdMoneda = 2 // 1 = ID moneda Peso mexicano Parametro pQueTipo = 0 // 0 = Clientes, 1 = Proveedores Parametro pDetallado = 0 // Reporte detallado o concentrado // 0 = Concentrado // 1 = Detallado Parametro pIdClase1 = 0 // por omisión deben recibir 0 = ninguna Parametro pIdClase2 = 0 // se pueden seleccionar varias clases por clasificación. Parametro pIdClase3 = 0 Parametro pIdClase4 = 0 // por los pueden recibir una lista con los Id´s de las clases Parametro pIdClase5 = 0 Parametro pIdClase6 = 0 // seleccionadas. // INICIO APERTURA TABLAS // Nombres terminados en Lib, indican: la tabla fue abierta explicitamente para alguna Fx de libreria UsaEmpresa tEmpresa;'CONTPAQ I Facturacion' // Parametros de la empresa UsaTabla tParametros = tEmpresa['mgw10000'] // Usa el indice primario // Documentos UsaTabla tDocumentos = tEmpresa['mgw10008'] Alias 'tDoctos1' tDocumentos.Usaindice['iCLienteProvAfectaNatVenc'] // cIdClienteProveedor+cAfectado+cNaturaleza // cFechaVencimiento UsaTabla tDoctosLib2 = tEmpresa['mgw10008'] Alias 'tDoctos2' tDoctosLib2.Usaindice[''] // Usa el indice Primario cIDDocumento // Clientes y Provedores UsaTabla tClientes = tEmpresa['mgw10002'] tClientes.Usaindice['iCodigoTipo'] // cCodigoCliente + cTipoCliente UsaTabla tMonedas = tEmpresa['mgw10034'] tMonedas.Usaindice[''] // Usa el índice primario, por cIdMoneda UsaTabla tCargosAbonosLib = tEmpresa['mgw10009'] tCargosAbonosLib.UsaIndice['iDoctoCargoAbono'] // IDDoctoCargo + IDDoctoAbono // TiposCambio Usatabla tTiposCambio = tEmpresa['mgw10035'] tTiposCambio.Usaindice['iMonedaFecha'] // cIdMoneda + cFecha UsaTabla tValoresDeClasif = tEmpresa['mgw10020'] tValoresDeClasif.UsaIndice[''] // Periodos UsaTabla tPeriodos = tEmpresa['mgw10031'] // Usa el indice primario, cIDEjercicio tPeriodos.UsaIndice[''] UsaTabla tConceptos = tEmpresa['mgw10006'] tConceptos.UsaIndice[''] //DEFINICION DE COLUMNAS UsaLetra 'Arial' Altura 9 // [C0..C2].Decimales 0 // [C0..C2].Blanco ' ' // [C4..C12].Coma tMonedas.Busca[@Str(pIdMoneda;0)] gDecimales = tMonedas(cDecimalesMoneda) // [C4..C12].Decimales gDecimales // [C4..C12].Blanco '0.00' //VARIABLES GLOBALES gHoy = fFormateaFecha(@Hoy();0) gNombreMoneda = tMonedas(cNombreMoneda) gLimite1 = pDias gLimite2 = 2*pDias gLimite3 = 3*pDias gAcum1Total = 0 gAcum2Total = 0 gAcum3Total = 0 gAcum4Total = 0 gTotalSaldoVencido = 0 //FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // ================================================================================================= // Función área sensible al contexto // ================================================================================================= DefFunc ContextoDetalleCliente(aNumeroColumna; aValor) EJECUTA tEmpresa->SysDirDatos & '\Reportes\Facturacion\AntigSaldos.RTW';pFechaCorte,aValor,aValor,pDias,0,pIdMoneda,pQueTipo,1,pIdClase1,pIdClase2,pIdClase3,pIdClase4,pIdClase5,pIdClase6;tEmpresa->Directorio FinFunc // ========================================================================================== // fColumnas() // ========================================================================================== Deffunc fColumnas(aTipo) Si aTipo = 'C' // Revisa si se quiere concentrado // C0 C2 C4 C6 C8 C10 C12 Columnas 19;2.1,0.15,5.4,0.15,1.95,0.15,1.95,0.15,1.95,0.15,1.95,0.15,1.95,0.1 [C0..C2].Decimales 0 [C0..C2].Blanco ' ' [C4..C12].Coma [C4..C12].Decimales gDecimales [C4..C12].Blanco '0.00' Sino // C0 C2 C4 C6 C8 C10 C12 C14 C16 C18 Columnas 19;1.65,0.15,1.65,0.15,0.75,0.15,1.2,0.15,1.95,0.15,1.95,0.15,1.95,0.15,1.95,0.15,1.95,0.15,3.0 [C0..C8].Decimales 0 [C0..C8].Blanco ' ' [C10..C18].Coma [C10..C18].Decimales gDecimales [C10..C18].Blanco '0.00' Finsi FinFunc // ========================================================================================== // fMascaraDias() // Esta función recibe un campo numérico, que en una representación binaria de siete digitos // indica ciertos días de la semana, según el digito que esté prendido, estos pueden ser // 1111111 - Dom Sab Vie Jue Mie Mar Lun // ========================================================================================== Deffunc fMascaraDias(aValor) Local lDias,lGuion // solo nos interesan los 7 bits mas a la derecha lGuion = '' lDias = '' Si aValor%2 = 1 // Un numero non = bit menos significativo encendido lDias = lGuion&'L' lGuion = '-' Finsi Si aValor%4 >= 2 // Valor Entre 1y4 = Segundo bit menos significativo encendido lDias = lDias & lGuion & 'M' lGuion = '-' Finsi Si aValor%8 >= 4 // Valor Entre 8y4 = Tercer bit menos significativo encendido lDias = lDias & lGuion & 'Mi' lGuion = '-' Finsi Si aValor%16 >= 8 // Valor Entre 16y8 = Cuarto bit menos significativo encendido lDias = lDias & lGuion & 'J' lGuion = '-' Finsi Si aValor%32 >= 16 lDias = lDias & lGuion & 'V' lGuion = '-' Finsi Si aValor%64 >= 32 lDias = lDias & lGuion & 'S' lGuion = '-' Finsi Si aValor%128>= 64 lDias = lDias & lGuion & 'D' lGuion = '-' Finsi Retorna lDias FinFunc // ========================================================================================== // fCambioMonedaDocto() // Descripcion : Esta función convierte el importe expresado en la moneda del documento a un // importe expresado en la moneda del reporte. // ========================================================================================== //! N.D.3240 DEFFUNC fCambioMonedaDocto(aTblDocto:TABLA; aSaldoDocto;aIdMoneda) //! N.D.3240 Local lSaldoMonedaRpt,lSaldoMonedaBase //! N.D.3240 Local lTipoCambioRpt //! N.D.3240 //! N.D.3240 // La moneda del Reporte es distinta a la moneda del Docto //! N.D.3240 Si aTblDocto(cIdMoneda) != aIdMoneda //! N.D.3240 lSaldoMonedaBase = aSaldoDocto * aTblDocto(cTipoCambio) //! N.D.3240 // Si el reporte es requerido en una Moneda distinta a la Moneda Base //! N.D.3240 Si aIdMoneda != 1 //! N.D.3240 // Convierte de la Moneda Base a la Moneda requerida en el Reporte //! N.D.3240 lTipoCambioRpt = fTipoCambio(aTblDocto(cFecha);aIdMoneda;tTiposCambio) //! N.D.3240 lSaldoMonedaRpt = lSaldoMonedaBase / lTipoCambioRpt //! N.D.3240 Sino //! N.D.3240 lSaldoMonedaRpt = lSaldoMonedaBase //! N.D.3240 Finsi //! N.D.3240 Sino //! N.D.3240 lSaldoMonedaRpt = aSaldoDocto //! N.D.3240 Finsi //! N.D.3240 Retorna lSaldoMonedaRpt //! N.D.3240 FinFunc // ========================================================================================== // fAcumulaSaldo() // Descripcion : Esta función acumula el saldo enla columna que le corresponde de acuerdo a el // número de días vencidos del saldo. // ========================================================================================== Deffunc fAcumulaSaldo(aDias;aSaldo) Si aDias <= gLimite1 gAcum1Cliente = gAcum1Cliente + aSaldo Sino Si aDias <= gLimite2 gAcum2Cliente = gAcum2Cliente + aSaldo Sino Si aDias <= gLimite3 gAcum3Cliente = gAcum3Cliente + aSaldo Sino gAcum4Cliente = gAcum4Cliente + aSaldo Finsi Finsi Finsi FinFunc // ========================================================================================= // fImprimeDocumento // ========================================================================================== Deffunc fImprimeDocumento(atCliente:TABLA;atDocto:TABLA;aSaldo;aDias) Local lRenglon // cuando se pide concentrado, aquí no se imprime nada. Si pDetallado = 0 Retorna Finsi NEGRITAS True Si gDatosCliente = 0 Si pQueTipo = 0 Texto 'Cliente: ' & fMascarilla(atCliente(cCodigoCliente);tParametros(cMascarillaClientes)) Sino Texto 'Proveedor: ' & fMascarilla(atCliente(cCodigoCliente);tParametros(cMascarillaClientes)) Finsi Imprime Texto 'Nombre: ' & atCliente(cRazonSocial) Imprime Texto 'Días de Pago: '& fMascaraDias(atCliente(cDiaPago)) //N.D.5234 Imprime Texto 'Días de Revisión: '& fMascaraDias(atCliente(cDiasRevision)) //N.D.5234 Imprime gDatosCliente = 1 Finsi NEGRITAS False fColumnas('D') // Se establecen las columnas para impresión detallada lRenglon = '' lRenglon[0] = fFormateaFecha(atDocto(cFechaVencimiento);0) lRenglon[2] = fFormateaFecha(atDocto(cFecha);0) lRenglon[4] = atDocto(cSerieDocumento) lRenglon[6] = atDocto(cFolio) lRenglon[8] = @Str(aDias;0) Si aDias <= gLimite1 lRenglon[10] = aSaldo Sino Si aDias <= gLimite2 lRenglon[12] = aSaldo Sino Si aDias <= gLimite3 lRenglon[14] = aSaldo Sino lRenglon[16] = aSaldo Finsi Finsi Finsi tConceptos.Busca[@Str(atDocto(cIDConceptoDocumento);0)] lRenglon[18] = tConceptos(cNombreConcepto) Imprime lRenglon FinFunc // ========================================================================================== // fImprimeTotales() // ========================================================================================== Deffunc fImprimeTotales(atCliente:TABLA;aTotal) local lRenglon // Si no se pidió Detallado Si pDetallado = 0 fColumnas('C') lRenglon = '' lRenglon[0] = fMascarilla(atCliente(cCodigoCliente);tParametros(cMascarillaClientes)) lRenglon[2] = atCliente(cRazonSocial) lRenglon[4] = aTotal lRenglon[6] = gAcum1Cliente lRenglon[8] = gAcum2Cliente lRenglon[10] = gAcum3Cliente lRenglon[12] = gAcum4Cliente Si aTotal != 0 DEFREGION ContextoDetalleCliente [C4].REGIONINFO atCliente(cCodigoCliente) FinSi Imprime lRenglon Sino // si se pidió detallado fColumnas('D') lRenglon = '' [C10,C12,C14,C16].Subrayacol '-' imprime lRenglon[10] = gAcum1Cliente lRenglon[12] = gAcum2Cliente lRenglon[14] = gAcum3Cliente lRenglon[16] = gAcum4Cliente Imprime lRenglon Finsi gAcum1Total = gAcum1Total + gAcum1Cliente gAcum2Total = gAcum2Total + gAcum2Cliente gAcum3Total = gAcum3Total + gAcum3Cliente gAcum4Total = gAcum4Total + gAcum4Cliente gTotalSaldoVencido = gTotalSaldoVencido + aTotal FinFunc // ========================================================================================== // fImprimeGranTotal() // ========================================================================================== Deffunc fImprimeGranTotal() Local lRenglon,lSubRaya lRenglon = '' lSubRaya = '' Saltalin 1 Si pDetallado = 0 lSubRaya = '==============='[C4,C6,C8,C10,C12] Imprime lSubRaya lRenglon[4] = gTotalSaldoVencido lRenglon[6] = gAcum1Total lRenglon[8] = gAcum2Total lRenglon[10] = gAcum3Total lRenglon[12] = gAcum4Total Sino lSubRaya = '==============='[C10,C12,C14,C16] imprime lSubRaya lRenglon[10] = gAcum1Total lRenglon[12] = gAcum2Total lRenglon[14] = gAcum3Total lRenglon[16] = gAcum4Total Finsi Imprime lRenglon FinFunc // ========================================================================================== // fDiscriminaCliente() // 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 se requieren los clientes y no se trata de un cliente:(1=cliente,2=cliente/provedor,3= proveedor) Si pQueTipo = 0 Y (atCliente(cTipoCliente) > 2) lRegresa = 1 Finsi // Si se requieren los Proveedores y no se trata de un Proveedor Si pQueTipo = 1 Y (atCliente(cTipoCliente) < 2) lRegresa = 1 Finsi // Si Estado solicitado no es Todos y No Coincide el tipo de cliente con el parametro // pCualesClientes = 2(inactivos) aplicando %2 = 0, 0 = inactivos en la tabla de clientes Si (pCualesClientes != 0) Y (atCliente(cEstatus) != pCualesClientes%2) lRegresa = 1 Finsi // Se Revisan las CLASIFICACIONES, solo en el caso de haber seleccionado al menos una Si gNumDeClases > 0 Si !fMiembroDeUnaClase(atCliente;gNumDeClases;gListIdDeClases;pQueTipo) // Sa salta el cliente actual, por no pertenecer a alguna de las clasificaciones lRegresa = 1 Finsi Finsi Retorna lRegresa FinFunc // ========================================================================================== // fEncabColumnas() // ========================================================================================== Deffunc fEncabColumnas() NEGRITAS TRUE Altura 9 Texto '@TC{0,0,0}@L{-1}' Imprime Si pDetallado = 0 // No se pidio detallado fColumnas('C') Texto C4; 'Importe' Texto C6; '^'&'1-'& @Str(gLimite1;0) Texto C8; '^'&@Str((gLimite1)+1;0)&'-'&@Str(gLimite2;0) Texto C10;'^'&@Str(gLimite2+1;0)&'-'&@Str(gLimite3;0) Texto C12;'^'&@Str(gLimite3+1;0) Imprime Texto C0;'Código' Texto C2;pQueTipo = 0? 'Nombre (Cliente)':'Nombre (Proveedor)' Texto C4; 'Total Vencido' Texto C6; '^Días' Texto C8; '^Días' Texto C10;'^Días' Texto C12;'^Días o más' Sino // Si se pidió detallado fColumnas('D') Texto C8; 'Días' Texto C10; '^'&'1-'& @Str(gLimite1;0) Texto C12; '^'&@Str((gLimite1)+1;0)&'-'&@Str(gLimite2;0) Texto C14; '^'&@Str(gLimite2+1;0)&'-'&@Str(gLimite3;0) Texto C16; '^'&@Str(gLimite3+1;0) Imprime Texto C0; 'Vencimiento' Texto C2; 'Fecha' Texto C4; 'Serie' Texto C6; 'Folio' Texto C8; 'Vencidos' Texto C10;'^Días' Texto C12;'^Días' Texto C14;'^Días' Texto C16;'^Días o más' Texto C18;'Concepto' Finsi Imprime 1 Texto '@TC{0,0,0}@L{-1}' Imprime NEGRITAS FALSE FinFunc //ENCABEZADO Encab Si pDetallado = 0 fColumnas('C') Sino fColumnas('D') Finsi Texto '@TC{156,0,89}@S{8}Factura Electrónica' Hoja '"@TC{0,0,0}@S{8}Hoja: ' Imprime Texto '@TC{0,0,0}@S{8}Moneda: ' & gNombreMoneda Texto '"@TC{0,0,0}@S{8}Fecha: ' & gHoy Imprime Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre Imprime Si pDetallado = 0 Texto '^@TC{0,0,0}@S{16}' & 'Antiguedad de Saldos' Sino Texto '^@TC{0,0,0}@S{16}' & 'Antiguedad de Saldos Detallado' Finsi Imprime gFechaCorte = fFormateaFecha(pFechaCorte;0) Texto '^@TC{0,0,0}@S{16}'& 'Fecha de Corte : ' & gFechaCorte Imprime // ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado fRevisaClases(tValoresDeClasif) // ===== Fin de la revision de clasificaciones fEncabColumnas() FinEncab //PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Si pDelCliente = ' ' tClientes.Busca Primero pDelCliente = tClientes(cCodigoCliente) Finsi Si pAlCliente = ' ' tClientes.Busca Ultimo pAlCliente = tClientes(cCodigoCliente) Finsi // Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunas valores // Globales para la biblioteca LibAdminPAQ.rpt fIniFechasHistoria(tPeriodos) gSaldoDocumento = 0.0 gTotalVencido = 0.0 tParametros.Busca Primero Mientras [tClientes.Busca[pDelCliente & '..' & pAlCliente ]; tClientes->Encontro ; tClientes.Busca Siguiente[1]] Si fDiscriminaCliente(tClientes) = 1 Continua Finsi // Se buscan todos los documentos asociados a el cliente, afectados Si pQueTipo = 0 // Para clientes busca cargos gLlaveBusqueda = tClientes(cIdClienteProveedor)&':'&'1:'&'0' Sino // Para Proveedores busca abonos gLlaveBusqueda = tClientes(cIdClienteProveedor)&':'&'1:'&'1' Finsi // Inicializa totales por Cliente gTotalVencido = 0.0 // guarda el acumulado de saldos vencidos del cliente gAcum1Cliente = 0.0 // Acumulado del rango 1, 2,3, 4 gAcum2Cliente = 0.0 gAcum3Cliente = 0.0 gAcum4Cliente = 0.0 gDatosCliente = 0 // Indica si se imprimió o no, los datos del empleado. Mientras [tDocumentos.Busca[gLlaveBusqueda];tDocumentos->Encontro;tDocumentos.Busca Siguiente[3]] // CASO Clientes/Proveedores : se descartan los cargos que no son de clientes // y los abonos que no son de proveedores Si pQueTipo = 0 y tDocumentos(cUsaCliente) = 0 // cargo pero no es docto de cliente Continua Finsi Si pQueTipo = 1 y tDocumentos(cUsaProveedor) = 0 // abono pero no es docto de proveedor Continua Finsi Si tDocumentos(cFechaVencimiento) <= pFechaCorte gSaldoDocumento = fSaldoDocumento('';pFechaCorte;tCargosAbonosLib;tDocumentos;tDoctosLib2) // N.D.3238/4362 Redondear los importes antes de mostrarlos Si tMonedas(cIdMoneda) != tDocumentos(cIdMoneda) tMonedas.Busca[@Str(tDocumentos(cIdMoneda);0)] FinSi gSaldoDocumento = fRedondeaImporteLib(gSaldoDocumento; tMonedas(cDecimalesMoneda)) // Si tiene un saldo vencido, este documento Si gSaldoDocumento > 0.000001 // se obtiene el saldo en la moneda del reporte //! N.D.3240 gSaldoDocumento = fCambioMonedaDocto(tDocumentos; gSaldoDocumento;pIdMoneda) gSaldoDocumento = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambio; gSaldoDocumento; pIdMoneda; tClientes(cIdMoneda)) // N.D.3238/4362 Redondear los importes antes de mostrarlos gSaldoDocumento = fRedondeaImporteLib(gSaldoDocumento; gDecimales) // se acumula al total vencido del cliente/Proveedor gTotalVencido = gTotalVencido + gSaldoDocumento // se obtienen los días vencidos del documento gDiasVencidos = fConvJul(pFechaCorte)-fConvJul(tDocumentos(cFechaVencimiento)) // se acumulan a la columna apropiada fAcumulaSaldo(gDiasVencidos;gSaldoDocumento) // Imprime el documento, la función valida si es detallado o concentrado fImprimeDocumento(tClientes;tDocumentos;gSaldoDocumento;gDiasVencidos) // Imprimir datos del cliente (Solo la primera vez) y del documento Finsi Sino // Se llego al fin ya no es necesario seguir buscando FinCiclo FinSi FinMientras // final de la busqueda, se imprime el resumen, solo en caso de haber un saldo vencido Si gTotalVencido > 0.001 // Imprime los totales, la función valida si es detallado o concentrado fImprimeTotales(tClientes;gTotalVencido) Finsi FinMientras // Fin del mientras tClientes.busca fImprimeGranTotal() // FIN DEL REPORTE