// ***************************************************************************** // Funciones de librería. // ***************************************************************************** Incluye LibAdminPaq.rpt Incluye LibDigitales.rpt // ***************************************************************************** // Parámetros // ***************************************************************************** Parametro pEjercicio = '2022' Parametro pMes = '1' // 1 = Enero, 2 = Febrero, etc Parametro pSerie = ' ' Parametro pFolioInicial = 1 Parametro pFolioFinal = 999999999 Parametro pDelCliente = ' ' Parametro pAlCliente = ' ' Parametro pConceptoFactura = ' ' Parametro pSoloCFDIsSaldoPendiente = 0 // 0 = No, 1 = Sí // ***************************************************************************** // Apertura de tablas. // ***************************************************************************** UsaEmpresa tEmpresa;'CONTPAQ I Facturacion' UsaTabla tParametros = tEmpresa['mgw10000'] UsaTabla tIngreso = tEmpresa['mgw10008'] Alias 'tIngresos' tIngreso.Usaindice['IDOCUMEN01'] //ciddocumentoDe + cFecha + cSerie + cFolio Usatabla tAbono = tEmpresa['mgw10008'] Alias 'tAbonos' tAbono.Usaindice[''] UsaTabla tCfdiAbono = tEmpresa['mgw10045'] Alias 'tCfdiAbonos' tCfdiAbono.Usaindice['CIDDOCTO'] UsaTabla tClientes = tEmpresa['mgw10002'] Alias 'tCliente1' tClientes.Usaindice['ICODIGOT01'] UsaTabla tCargosAbonos = tEmpresa['mgw10009'] tCargosAbonos.UsaIndice['IDOCTOCA01'] UsaTabla tConceptos = tEmpresa['mgw10006'] Alias 'tConcepto1' tConceptos.UsaIndice['cIdConceptoDocumento'] UsaTabla tMonedas = tEmpresa['mgw10034'] tMonedas.Usaindice[''] UsaTabla tEjercicioPeriodo = tEmpresa['mgw10031'] tEjercicioPeriodo.Usaindice[''] tParametros.Busca Primero // Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunas valores // Globales para la biblioteca LibAdminPAQ.rpt tEjercicioPeriodo.Usaindice['cNumeroEjercicio'] fIniFechasHistoria(tEjercicioPeriodo) tEjercicioPeriodo.Usaindice[''] // ***************************************************************************** // Declaración de variables globales. // ***************************************************************************** Columnas 1; 5 gHoy = '' gDelaFecha = '' gAlaFecha = '' gDelaFecha = @str(pMes;0) Mientras @len(gDelaFecha)<2 gDelaFecha = '0' & gDelaFecha FinMientras gDelaFecha = @str(pEjercicio;0) & gDelaFecha & '01' gHoy = fFormateaFecha(@Hoy();0) // ***************************************************************************** // Definición de constantes de EXCEL. // ***************************************************************************** constante xlCentrarEnSeleccion 7 constante xlAutomatico -4105 constante xlManual -4135 constante xlInferior -4107 constante xlSubrayadoDoble -4119 constante xlIzquierda -4131 constante xlMediano -4138 constante xlNinguno -4142 constante xlDerecha -4152 constante xlSuperior -4160 constante xlHojaCalculo -4167 constante xlLineaSimple 1 constante xlBordeSuperior 8 constante xlBordeInferior 9 constante xlBordeIzquierda 7 constante xlBordeDerecha 10 constante xlCentro -4108 constante xlSaltoPagina -4135 // ***************************************************************************** // Inicializa EXCEL. // ***************************************************************************** Objeto Excel = @CreaObjeto('Excel.Application') Objeto wb = Excel.WorkBooks.Add(xlHojaCalculo) Objeto ws = wb.Worksheets(1) Excel.ActiveWindow.DisplayGridlines = FALSE[C0] Excel.Visible = -1[C0] gDecimales = tParametros(cDecimalesPrecioVenta) Decimales gDecimales gRenActual = 1 // Pone la longitud de cada columna ws.Columns(1).ColumnWidth = 11[C0] // A ws.Columns(2).ColumnWidth = 25[C0] // B ws.Columns(3).ColumnWidth = 10[C0] // C ws.Columns(4).ColumnWidth = 12[C0] // D ws.Columns(5).ColumnWidth = 35[C0] // E ws.Columns(6).ColumnWidth = 15[C0] // F ws.Columns(7).ColumnWidth = 12[C0] // G ws.Columns(8).ColumnWidth = 25[C0] // H ws.Columns(9).ColumnWidth = 35[C0] // I ws.Columns(10).ColumnWidth = 62[C0] // J lDigsDecimales = '0000000000' lDecimalesImportes = @SUBSTR(lDigsDecimales;1;gDecimales) lFormato = '#,##0.' & lDecimalesImportes & '_);(#,##0.' & lDecimalesImportes & ')' ws.Columns(7).NumberFormat = lFormato ws.Columns(5).NumberFormat = '@'[C0] // ************************************************************************************************* // Descripcion: Esta función recibe una fecha con formato ddmmaaaa y la convierte a formato dd/mmm/aaaa // Entradas : Fecha : contiene la fecha AAAAMMDD // Salida : regresa una cadena con la fecha en formato DD/MMM/AAAA // ************************************************************************************************* DefFunc fEditaFecha(aFecha) Local lMes Local lRegreso lMes = @INT(@SubStr(aFecha;4;2)) lRegreso[0] = @SubStr(aFecha;6;2) & '/' & @Escoge(kMeses;lMes-1) & '/' & @SubStr(aFecha;0;4) Retorna lRegreso FinFunc // ========================================================================================== // fDiscriminaCliente() // Salidas: 1 = indica que el cliente no aplica, debe descartarse // 0 = indica que el cliente no debe descartarse. // ========================================================================================== DefFunc fDiscriminaCliente(aCliente:TABLA) Local lRegresa lRegresa = 0 // Se salta el Cliente NINGUNO Si aCliente(cIdClienteProveedor) = 0 lRegresa = 1 Finsi // Si se requieren los clientes y no se trata de un cliente:(1=cliente,2=cliente/provedor,3= proveedor) Si aCliente(cTipoCliente) > 2 lRegresa = 1 Finsi // Descarta inactivos Si aCliente(cEstatus) = 0 lRegresa = 1 Finsi Retorna lRegresa FinFunc // ************************************************************************************************* // Descripcion: despues de buscar el id del peirodo se extrae las fechas correspondientres // a los mese 1,2,3,4..10,11,12 // Entradas : mes en formato numerico // Salida : fecha del mes // ************************************************************************************************* DefFunc fFechaEjercicioPeriodo(aMes) Local lRegreso Escoge aMes caso 1 lRegreso = tEjercicioPeriodo(cFecIniPeriodo1) fincaso caso 2 lRegreso = tEjercicioPeriodo(cFecIniPeriodo2) fincaso caso 3 lRegreso = tEjercicioPeriodo(cFecIniPeriodo3) fincaso caso 4 lRegreso = tEjercicioPeriodo(cFecIniPeriodo4) fincaso caso 5 lRegreso = tEjercicioPeriodo(cFecIniPeriodo5) fincaso caso 6 lRegreso = tEjercicioPeriodo(cFecIniPeriodo6) fincaso caso 7 lRegreso = tEjercicioPeriodo(cFecIniPeriodo7) fincaso caso 8 lRegreso = tEjercicioPeriodo(cFecIniPeriodo8) fincaso caso 9 lRegreso = tEjercicioPeriodo(cFecIniPeriodo9) fincaso caso 10 lRegreso = tEjercicioPeriodo(cFecIniPeriodo10) fincaso caso 11 lRegreso = tEjercicioPeriodo(cFecIniPeriodo11) fincaso caso 12 lRegreso = tEjercicioPeriodo(cFecIniPeriodo12) fincaso FinEscoge Retorna lRegreso Finfunc // ***************************************************************************** // fImpDatosIngreso // Descripción: Imprime los datos del ingreso // Salida: No regresa valor // ***************************************************************************** DefFunc fImpDatosIngreso(aFecha; aConcepto; aSerie; aFolio; aCliente; aMoneda; aTotal; aMetodoPago; aFormaPago) Local lFormaPago ws.Range('A' & gRenActual).Value = fFormateaFecha(aFecha; 0)[C0] ws.Range('B' & gRenActual).Value = aConcepto[C0] ws.Range('C' & gRenActual).Value = aSerie[C0] ws.Range('D' & gRenActual).Value = aFolio[C0] ws.Range('E' & gRenActual).Value = fMascarilla(aCliente;gMascarillaClientes)[C0] ws.Range('F' & gRenActual).Value = aMoneda[C0] ws.Range('G' & gRenActual).Value = aTotal[C0] Si aMetodoPago = 1 ws.Range('H' & gRenActual).Value = 'PUE'[C0] SiNo ws.Range('H' & gRenActual).Value = 'PPD'[C0] FinSi Escoge aFormaPago Caso '01' lFormaPago = '01 - Efectivo' FinCaso Caso '02' lFormaPago = '02 - Cheque nominativo' FinCaso Caso '03' lFormaPago = '03 - Transferencia electrónica de fondos' FinCaso Caso '04' lFormaPago = '04 - Tarjeta de crédito' FinCaso Caso '05' lFormaPago = '05 - Monedero electrónico' FinCaso Caso '06' lFormaPago = '06 - Dinero electrónico' FinCaso Caso '08' lFormaPago = '08 - Vales de despensa' FinCaso Caso '12' lFormaPago = '12 - Dación de pago' FinCaso Caso '13' lFormaPago = '13 - Pago por subrogación' FinCaso Caso '14' lFormaPago = '14 - Pago por consignación' FinCaso Caso '15' lFormaPago = '15 - Condonación' FinCaso Caso '17' lFormaPago = '17 - Compensación' FinCaso Caso '23' lFormaPago = '23 - Novación' FinCaso Caso '24' lFormaPago = '24 - Confusión' FinCaso Caso '25' lFormaPago = '25 - Remisión de deuda' FinCaso Caso '26' lFormaPago = '26 - Prescripción o caducidad' FinCaso Caso '27' lFormaPago = '27 - A satisfacción del acreedor' FinCaso Caso '28' lFormaPago = '28 - Tarjeta de débito' FinCaso Caso '29' lFormaPago = '29 - Tarjeta de servicios' FinCaso Caso '30' lFormaPago = '30 - Aplicación de anticipos' FinCaso Caso '31' lFormaPago = '31 - Intermediario pagos' FinCaso OtroCaso lFormaPago = '' FinCaso FinEscoge ws.Range('I' & gRenActual).Value = lFormaPago[C0] FinFunc // ***************************************************************************** // Encabezado // ***************************************************************************** Encab gColumnaEmpresa = 'F'[C0] gColumnaFinal = 'J'[C0] gMes = ''[C0] ws.Range('A' & gRenActual).Font.Color = @RGB(156;0;89)[C0] ws.Range('A' & gRenActual).Font.Size = 10[C0] ws.Range('A' & gRenActual).Value = 'Factura Electrónica'[C0] gRenActual = gRenActual + 1[C0] ws.Range(gColumnaFinal & gRenActual).HorizontalAlignment = xlDerecha[C0] ws.Range(gColumnaFinal & gRenActual).Value = gHoy gRenActual = gRenActual + 1[C0] ws.Range(gColumnaEmpresa & gRenActual).Font.Size = 14[C0] ws.Range(gColumnaEmpresa & gRenActual).Font.Bold = true[C0] ws.Range(gColumnaEmpresa & gRenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range(gColumnaEmpresa & gRenActual).Value = tEmpresa->Nombre gRenActual = gRenActual + 1[C0] ws.Range(gColumnaEmpresa & gRenActual).Font.Size = 12[C0] ws.Range(gColumnaEmpresa & gRenActual).Font.Bold = true[C0] ws.Range(gColumnaEmpresa & gRenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range(gColumnaEmpresa & gRenActual).Value = 'Análisis de CFDI de ingreso PUE contra su abono'[C0] gRenActual = gRenActual + 1[C0] Si pMes = 1 gMes = 'Enero' FinSi Si pMes = 2 gMes = 'Febrero' FinSi Si pMes = 3 gMes = 'Marzo' FinSi Si pMes = 4 gMes = 'Abril' FinSi Si pMes = 5 gMes = 'Mayo' FinSi Si pMes = 6 gMes = 'Junio' FinSi Si pMes = 7 gMes = 'Julio' FinSi Si pMes = 8 gMes = 'Agosto' FinSi Si pMes = 9 gMes = 'Septiembre' FinSi Si pMes = 10 gMes = 'Octubre' FinSi Si pMes = 11 gMes = 'Noviembre' FinSi Si pMes = 12 gMes = 'Diciembre' FinSi ws.Range(gColumnaEmpresa & gRenActual).Font.Size = 12[C0] ws.Range(gColumnaEmpresa & gRenActual).Font.Bold = true[C0] ws.Range(gColumnaEmpresa & gRenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range(gColumnaEmpresa & gRenActual).Value = gMes[C0] gRenActual = gRenActual + 2 ws.Range('A' & gRenActual).Font.Bold = True ws.Range('A' & gRenActual).Value = 'Este reporte nos permite identificar aquellos CFDI\'s que se emitieron como PUE y que al final del mes no han sido debidamente pagados como dice la disposición fiscal.'[C0] gRenActual = gRenActual + 1 ws.Range('A' & gRenActual).Font.Bold = True ws.Range('A' & gRenActual).Value = 'Se recomienda ejecutar este reporte en los últimos días del mes para verificar que todas las facturas PUE se encuentren saldadas.'[C0] gRenActual = gRenActual + 2 ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).HorizontalAlignment = xlCentrarEnSeleccion ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlInferior).LineStyle = xlLineaSimple ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlSuperior).LineStyle = xlLineaSimple ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlDerecha).LineStyle = xlLineaSimple ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Interior.Color = @RGB(255;0;0) ws.Range('A' & gRenActual).Font.Color = @RGB(255;255;255) ws.Range('A' & gRenActual).Font.Bold = true ws.Range('A' & gRenActual).Value = 'Ingresos' gRenActual = gRenActual + 1 ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Interior.ColorIndex = 55[C0] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Font.Bold = true[C0] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Font.Color = @RGB(255;255;255)[C0] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).WrapText = True[C0] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).HorizontalAlignment = xlCentro[C0] ws.Range('A' & gRenActual).Value = 'Fecha' ws.Range('B' & gRenActual).Value = 'Concepto' ws.Range('C' & gRenActual).Value = 'Serie' ws.Range('D' & gRenActual).Value = 'Folio' ws.Range('E' & gRenActual).Value = 'Cliente' ws.Range('F' & gRenActual).Value = 'Moneda' ws.Range('G' & gRenActual).Value = 'Total' ws.Range('H' & gRenActual).Value = 'Método de pago' ws.Range('I' & gRenActual).Value = 'Forma de pago' ws.Range('J' & gRenActual).Value = 'Observaciones' gRenActual = gRenActual + 1 Excel.Rows(gRenActual & ':' & gRenActual).Select Excel.ActiveWindow.FreezePanes = True FinEncab // ***************************************************************************** // Cuerpo del reporte // ***************************************************************************** Si pDelCliente = ' ' tClientes.Busca Primero pDelCliente = tClientes(cCodigoCliente) FinSi Si pAlCliente = ' ' tClientes.Busca Ultimo pAlCliente = tClientes(cCodigoCliente) FinSi tEjercicioPeriodo.busca primero Mientras tEjercicioPeriodo->encontro Si gDelaFecha >= tEjercicioPeriodo(cFecIniPeriodo1) y gDelaFecha <= tEjercicioPeriodo(cFechaFinal) si pMes = 12 gAlaFecha = tEjercicioPeriodo(cFechafinal) sino gAlaFecha = fFechaEjercicioPeriodo(pMes+1) gAlaFecha = fFechaAnterior(gAlaFecha) finsi Finsi tEjercicioPeriodo.Saltareg[1] FinMientras Si pEjercicio = 0 Y pMes = 0 gDelaFecha = pFechaInicial gAlaFecha = pFechaFinal FinSi gFechaBusqueda = gDelaFecha tIngreso.Usaindice['cFecha'] tIngreso.Busca[gFechaBusqueda] Si !tIngreso->ENCONTRO Si tIngreso->Llave >= gDelaFecha Y tIngreso->Llave <= gAlaFecha // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro gFechaBusqueda = tIngreso->Llave tIngreso.Busca[gFechaBusqueda] FinSi FinSi Mientras gFechaBusqueda <= gAlaFecha tIngreso.Busca[gFechaBusqueda] Mientras tIngreso->Encontro tConceptos.BUSCA[@STR(tIngreso(CIDCONCE01);0)] Si !tConceptos->ENCONTRO tIngreso.BUSCA SIGUIENTE[1] Continua FinSi Si tIngreso(CESCFD) = 0 O tIngreso(cNaturaleza) != 0 O tIngreso(cCancelado) = 1 O tIngreso(cCantParci) != 1 tIngreso.BUSCA SIGUIENTE[1] Continua FinSi Si pConceptoFactura != ' ' Y pConceptoFactura != '' lConceptoIncluido = False lNum = 0 Mientras (!lConceptoIncluido) Y @Escoge(pConceptoFactura;lNum) Si @Val(@Escoge(pConceptoFactura;lNum)) > 0 Y @Val(@Escoge(pConceptoFactura;lNum)) = tIngreso(cIdConceptoDocumento) lConceptoIncluido = true FinSi lNum = lNum +1 FinMientras Si !lConceptoIncluido tIngreso.BUSCA SIGUIENTE[1] Continua FinSi FinSi tClientes.Usaindice['PrimaryKey'] tClientes.Busca[@STR(tIngreso(cIdClien01);0)] Si fDiscriminaCliente(tClientes) = 1 tIngreso.BUSCA SIGUIENTE[1] Continua Finsi Si !tClientes->ENCONTRO O tClientes(cCodigoC01) < pDelCliente O tClientes(cCodigoC01) > pAlCliente tIngreso.BUSCA SIGUIENTE[1] Continua FinSi Si pSerie != ' ' Si tIngreso(cSerieDocumento) != pSerie tIngreso.BUSCA SIGUIENTE[1] Continua FinSi FinSi Si pSoloCFDIsSaldoPendiente = 1 Si tIngreso(cPendiente) = 0 tIngreso.BUSCA SIGUIENTE[1] Continua FinSi FinSi Si tIngreso(cFolio) < pFolioInicial O tIngreso(cFolio) > pFolioFinal tIngreso.BUSCA SIGUIENTE[1] Continua FinSi Si tIngreso(cMetodoPag) = '99' tIngreso.BUSCA SIGUIENTE[1] Continua FinSi tMonedas.BUSCA[@STR(tIngreso(cIdMoneda);0)] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & gRenActual & ':' & gColumnaFinal & gRenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] fImpDatosIngreso(tIngreso(cFecha); tConceptos(cNombreConcepto); tIngreso(cSerieDocumento); tIngreso(cFolio); tClientes(cCodigoCliente); tMonedas(cClaveSAT); tIngreso(cTotal); tIngreso(cCantParci); tIngreso(cMetodoPag)) tCargosAbonos.Busca[@STR(tIngreso(cIdDocumento);0)] Si tCargosAbonos->Encontro tAbono.BUSCA[@STR(tCargosAbonos(cIdDocum01);0)] Si tAbono->Encontro tCfdiAbono.BUSCA[@STR(tAbono(cIdDocumento);0)] FinSi FinSi Si !tCargosAbonos->Encontro O !tAbono->Encontro O tAbono(cCancelado) = 1 ws.Range(gColumnaFinal & gRenActual).Value = 'Sin pago en ' & gMes & '.'[C0] SiNo Si tIngreso(cPendiente) != 0 Si tCfdiAbono->Encontro Y tCfdiAbono(cUUID) != '' Y (tAbono(cIdDocum02) = 9 O tAbono(cIdDocum02) = 10 O tAbono(cIdDocum02) = 12) ws.Range(gColumnaFinal & gRenActual).Value = 'Pago parcial. REP generado indebidamente.'[C0] SiNo ws.Range(gColumnaFinal & gRenActual).Value = 'Pago parcial.'[C0] FinSi SiNo Si tAbono(cFecha) <= gAlaFecha Si tCfdiAbono->Encontro Y tCfdiAbono(cUUID) != '' Y (tAbono(cIdDocum02) = 9 O tAbono(cIdDocum02) = 10 O tAbono(cIdDocum02) = 12) ws.Range(gColumnaFinal & gRenActual).Value = 'Pagado. REP generado indebidamente.'[C0] SiNo ws.Range(gColumnaFinal & gRenActual).Value = 'Pagado.'[C0] FinSi SiNo Si tCfdiAbono->Encontro Y tCfdiAbono(cUUID) != '' Y (tAbono(cIdDocum02) = 9 O tAbono(cIdDocum02) = 10 O tAbono(cIdDocum02) = 12) ws.Range(gColumnaFinal & gRenActual).Value = 'Sin pago en ' & gMes & '. Pago fuera del mes. REP generado indebidamente.'[C0] SiNo ws.Range(gColumnaFinal & gRenActual).Value = 'Sin pago en ' & gMes & '. Pago fuera del mes.'[C0] FinSi FinSi FinSi FinSi gRenActual = gRenActual + 1 tIngreso.BUSCA SIGUIENTE[1] FinMientras gFechaBusqueda = fFechaSiguiente(gFechaBusqueda) FinMientras