// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // Reporte: MOVIMIENTO POR CUENTA BANCARIA // // Sistema: ADMINPAQ Versión v10.0 Windows // // Descripcion: Reporte que imprime la relación de abonos timbrados vs xml generado y factura pagada // Consideraciones : La información se obtiene de datos almacenados en tablas, no lee los xml // Creación : Agosto 2017 // Revisiones : // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< //****************************************************************************** //Funciones de librería. Incluye LibAdminPaq.rpt Incluye LibCliProv.rpt //****************************************************************************** //Parámetros. Parametro pDeLaFecha = '20170101' Parametro pAlaFecha = '20171231' Parametro pDeLaCuenta = ' ' // Código de la Cuenta bancaria Parametro pALaCuenta = ' ' // Código de la Cuenta bancaria Parametro pIdMoneda = 1 //****************************************************************************** //Apertura de tablas. //Nombres terminados en Lib, indican que la tabla fue abierta explícitamente //para alguna Fx de librería UsaEmpresa tEmpresa;'CONTPAQ I Facturacion' // Parámetros //Parametros de la empresa. UsaTabla tParametros = tEmpresa['mgw10000'] UsaTabla tDocumentos = tEmpresa['mgw10008'] Alias 'tDoctos1' tDocumentos.Usaindice['CIDCUENTA'] //CIDCUENTA + FECHA DOCUMENTO UsaTabla tDigitales = tEmpresa['mgw10045'] tDigitales.Usaindice['CIDDOCTO'] UsaTabla tClientes = tEmpresa['mgw10002'] tClientes.Usaindice[''] Usatabla tCuentas = tEmpresa['mgw10056'] Alias 'tCuenta1' tCuentas.Usaindice['INUMEROC01'] Usatabla tCuentasCP = tEmpresa['mgw10056'] Alias 'tCuenta2' tCuentasCP.Usaindice[''] UsaTabla tMonedas = tEmpresa['mgw10034'] tMonedas.Usaindice[''] Usatabla tConcepto = tEmpresa['mgw10006'] Alias 'tConcepto' tConcepto.Usaindice[''] Columnas 1;5 pIdMoneda = 1 tMonedas.Busca[@Str(pIdMoneda;0)] gDecimales = tMonedas(cDecimalesMoneda) //****************************************************************************** //Declaración de variables globales. gHoy = fFormateaFecha(@Hoy();0) gNombreMoneda = tMonedas(cNombreMoneda) // ************************************* // 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 constante xlSaltoPagina -4135 // ************************************* // Inicializa EXCEL // ************************************* // Accesa 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 ws.Columns(1).ColumnWidth = 18[C0] // A ws.Columns(2).ColumnWidth = 18[C0] // B ws.Columns(3).ColumnWidth = 8[C0] // C ws.Columns(4).ColumnWidth = 10[C0] // D ws.Columns(5).ColumnWidth = 25[C0] // E ws.Columns(6).ColumnWidth = 40[C0] // F ws.Columns(7).ColumnWidth = 15[C0] //G ws.Columns(8).ColumnWidth = 12[C0] //H ws.Columns(9).ColumnWidth = 25[C0] //I ws.Columns(10).ColumnWidth = 20[C0] //J ws.Columns(11).ColumnWidth = 20[C0] //K ws.Columns(12).ColumnWidth = 20[C0] //L ws.Columns(13).ColumnWidth = 20[C0] //M ws.Columns(14).ColumnWidth = 20[C0] //N ws.Columns(15).ColumnWidth = 38[C0] //O lDigsDecimales = '0000000000' lDecs = @SUBSTR(lDigsDecimales;1;gDecimales) lFormato = '#,##0.' & lDecs & '_);(#,##0.' & lDecs & ')' ws.Columns(7).NumberFormat = lFormato[C0] ws.Columns(1).NumberFormat = 'dd-mmm-aaaa'[C0] ws.Columns(2).NumberFormat = 'dd-mmm-aaaa'[C0] //****************************************************************************** //Funciones. // ========================================================================================== // fImpDatosCuenta (Procedimiento) // Descripcion : Imprime los datos de la cuenta de la empresa (DESTINO) // Entrada : aTblCuenta // Salida : No regresa valor // ========================================================================================== DefFunc fImpDatosCuenta(aTblCuenta:TABLA) Si gCuentaImpreso = 1 Retorna Sino gCuentaImpreso = 1 FinSi RenActual = RenActual + 1[C0] ws.Range('A' & RenActual ).Value = 'Número de Cuenta:'[C0] ws.Range('A' & RenActual).Font.Bold = true[C0] ws.Range('B' & RenActual).Font.Bold = true[C0] ws.Range('B' & RenActual ).Value = @chr(39) & aTblCuenta(cNumeroC01)[C0] RenActual = RenActual + 1[C0] ws.Range('A' & RenActual ).Value = 'Alias:'[C0] ws.Range('A' & RenActual).Font.Bold = true[C0] ws.Range('B' & RenActual).Font.Bold = true[C0] ws.Range('B' & RenActual ).Value = aTblCuenta(cNombreC01)[C0] ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 1[C0] FinFunc // ========================================================================================== // fImprimeDocumento (Procedimiento) // Descripcion : Imprime el movimiento de la cuenta destino (EMPRESA) // Entrada :La tabla de clientes, con el cliente a imprimir abierto // // ========================================================================================== DefFunc fImprimeDocumento(aTblDocumento:TABLA; aTblDigital:TABLA; aTblCliente:TABLA; aTblMoneda:TABLA; ATblCuenta:TABLA; ATblCuentaCP:TABLA; aTblConcepto:TABLA) // Fecha del documento ws.Range('A' & RenActual ).Value = @chr(39) & fFormateaFecha(aTblDocumento(cFecha);0)[C0] aTblDigital.Busca[@STR(aTblDocumento(cIdDocum01);0)] Si aTblDigital->ENCONTRO // Fecha de emisión ws.Range('B' & RenActual ).Value = @chr(39) & fFormateaFecha(aTblDigital(cFechaEmi);0)[C0] // Número de operación bancaria ws.Range('J' & RenActual ).Value = @chr(39) & aTblDigital(CDESCONCBA)[C0] ws.Range('O' & RenActual ).Value = @chr(39) & aTblDigital(cUUID)[C0] FinSi ws.Range('C' & RenActual ).Value = aTblDocumento(cSerieDo01)[C0] ws.Range('D' & RenActual ).Value = aTblDocumento(cFolio)[C0] aTblConcepto.Busca[@STR(aTblDocumento(cIdConce01);0)] SI aTblConcepto->ENCONTRO ws.Range('E' & RenActual ).Value = aTblConcepto(CNOMBREC01)[C0] FINSI // Nombre del cliente ws.Range('F' & RenActual ).Value = aTblCliente(cRazonSocial)[C0] // Importe de la moneda ws.Range('G' & RenActual ).Value = aTblDocumento(cTotal)[C0] // Forma pago lDescFormaPago = '' lClaveFormaPago = aTblDocumento(cMetodoPag) Escoge lClaveFormaPago Caso 1 lDescFormaPago = 'Efectivo' FinCaso Caso 2 lDescFormaPago = 'Cheque nominativo' FinCaso Caso 3 lDescFormaPago = 'Transferencia electrónica de fondos' FinCaso Caso 4 lDescFormaPago = 'Tarjeta de crédito' FinCaso Caso 5 lDescFormaPago = 'Monedero electrónico' FinCaso Caso 6 lDescFormaPago = 'Dinero electrónico' FinCaso Caso 8 lDescFormaPago = 'Vales de despensa' FinCaso Caso 12 lDescFormaPago = 'Dación en pago' FinCaso Caso 13 lDescFormaPago = 'Pago por subrogación' FinCaso Caso 14 lDescFormaPago = 'Pago por consignación' FinCaso Caso 15 lDescFormaPago = 'Condonación' FinCaso Caso 17 lDescFormaPago = 'Compensación' FinCaso Caso 23 lDescFormaPago = 'Novación' FinCaso Caso 24 lDescFormaPago = 'Confusión' FinCaso Caso 25 lDescFormaPago = 'Remisión de deuda' FinCaso Caso 26 lDescFormaPago = 'Prescripción o caducidad' FinCaso Caso 27 lDescFormaPago = 'A satisfacción del acreedor' FinCaso Caso 28 lDescFormaPago = 'Tarjeta de débito' FinCaso Caso 29 lDescFormaPago = 'Tarjeta de servicios' FinCaso Caso 30 lDescFormaPago = 'Aplicación de anticipos' FinCaso Caso 31 lDescFormaPago = 'Intermediario pagos' FinCaso Caso 99 lDescFormaPago = 'Por definir' FinCaso FinEscoge ws.Range('I' & RenActual ).Value = @chr(39) & lClaveFormaPago & ' - ' & lDescFormaPago[C0] // Código sat de la moneda del documento aTblMoneda.Busca[@STR(aTblDocumento(cIdMoneda);0)] Si aTblMoneda->ENCONTRO ws.Range('H' & RenActual ).Value = aTblMoneda(cClaveSAT)[C0] FinSi // ABONO CLIENTE O DE PROVEEDO // La cuenta origen es del cliente/proveedor y el destino es la de la empresa Si aTblDocumento(cNaturaleza) = 1 ws.Range('M' & RenActual ).Value = @chr(39) & aTblCuenta(cNumeroC01)[C0] ws.Range('N' & RenActual ).Value = @chr(39) & aTblCuenta(cNombreC01)[C0] aTblCuentaCP.BUSCA[@STR(aTblDocumento(CIDMONEDCA);0)] Si aTblCuentaCP->ENCONTRO Y aTblCuentaCP(cIdCuenta) != 0 ws.Range('K' & RenActual ).Value = @chr(39) & aTblCuentaCP(cNumeroC01)[C0] ws.Range('L' & RenActual ).Value = @chr(39) & aTblCuentaCP(cNombreC01)[C0] FinSi SiNo // La cuenta origen es la de la empresa y el destino es la del cliente/proveedor ws.Range('K' & RenActual ).Value = @chr(39) & aTblCuenta(cNumeroC01)[C0] ws.Range('L' & RenActual ).Value = @chr(39) & aTblCuenta(cNombreC01)[C0] aTblCuentaCP.BUSCA[@STR(aTblDocumento(CIDMONEDCA);0)] Si aTblCuentaCP->ENCONTRO Y aTblCuentaCP(cIdCuenta) != 0 ws.Range('M' & RenActual ).Value = @chr(39) & aTblCuentaCP(cNumeroC01)[C0] ws.Range('N' & RenActual ).Value = @chr(39) & aTblCuentaCP(cNombreC01)[C0] FinSi FinSi Si aTblDocumento(CUSAPROV01) = 1 // Documento de Proveedor ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Font.Color = @RGB(68;114;196)[C0] FinSi ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] RenActual = RenActual + 1[C0] Finfunc // ========================================================================================== // fDiscriminaCuenta() // Salidas: 1 = indica que la cuenta no aplica y se debe descartar // 0 = indica que la cuenta no debe descartarse. // ========================================================================================== DefFunc fDiscriminaCliente(aTblCliente:TABLA) Local lRegresa lRegresa = 0 // Se salta el Cliente NINGUNO Si aTblCliente(cIdClienteProveedor) = 0 lRegresa = 1 Finsi // Clientes inactivos Si aTblCliente(cEstatus) = 0 lRegresa = 1 Finsi Retorna lRegresa FinFunc // ============================================================================= // fDiscriminaDocto() // Salidas: 1 = indica que el Docto no aplica, debe descartarse // 0 = indica que el Docto no debe descartarse. // ============================================================================= DefFunc fDiscriminaDocto(aTblDocumento:TABLA) Local lRegresa lRegresa = 0 // si no es cargo o abono Si aTblDocumento(cNaturaleza) = 2 lRegresa = 1 Finsi Si aTblDocumento(cCancelado) = 1 lRegresa = 1 FinSi Retorna lRegresa FinFunc //****************************************************************************** //Encabezado. Encab // Valida el rango de fechas pALaFecha = pALaFecha < pDeLaFecha ? pDeLaFecha : pAlaFecha // Pone el nombre del sistema gFinReporte = 'O'[C0] gEmpresa = 'I'[C0] ws.Range('A' & RenActual).Font.Color = @RGB(156;0;89)[C0] ws.Range('A' & RenActual).Font.Size = 10[C0] ws.Range('A' & RenActual).Value = 'Factura Electrónica'[C0] RenActual = RenActual + 1[C0] ws.Range(gFinReporte & RenActual).HorizontalAlignment = xlDerecha[C0] ws.Range(gFinReporte & RenActual).Value = gHoy RenActual = RenActual + 1[C0] // Pone el nombre de la empresa ws.Range('A' & RenActual).Font.Size = 14[C0] ws.Range('A' & RenActual).Font.Bold = true[C0] ws.Range('A' & RenActual & ':' & gEmpresa & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range('A' & RenActual ).Value = tEmpresa->Nombre RenActual = RenActual + 1[C0] ws.Range('A' & RenActual).Font.Size = 12[C0] ws.Range('A' & RenActual).Font.Bold = true[C0] ws.Range('A' & RenActual & ':' & gEmpresa & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range('A' & RenActual ).Value = 'Movimientos por Cuenta Bancaria'[C0] RenActual = RenActual + 1[C0] ws.Range('A' & RenActual).Font.Size = 12[C0] ws.Range('A' & RenActual).Font.Bold = true[C0] ws.Range('A' & RenActual & ':' & gEmpresa & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] gDelaFecha = fFormateaFecha(pDelaFecha;0) gAlaFecha = fFormateaFecha(pAlaFecha;0) ws.Range('A' & RenActual ).Value = 'Del: ' & gDelaFecha & ' Al: ' & gAlaFecha[C0] RenActual = RenActual + 2[C0] // Pone el titulo de cada columna en EXCEL ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Interior.ColorIndex = 55[C0] ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Font.Bold = true[C0] ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Font.Color = @RGB(255;255;255)[C0] ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).WrapText = True ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).HorizontalAlignment = xlCentro[C0] ws.Range('A' & RenActual).Value = 'Fecha Pago' ws.Range('B' & RenActual).Value = 'Fecha Emisión' ws.Range('C' & RenActual).Value = 'Serie' ws.Range('D' & RenActual).Value = 'Folio' ws.Range('E' & RenActual).Value = 'Concepto' ws.Range('F' & RenActual).Value = 'Cliente/Proveedor' ws.Range('G' & RenActual).Value = 'Cargo/Abono' ws.Range('H' & RenActual).Value = 'Moneda' ws.Range('I' & RenActual).Value = 'Forma de Pago' ws.Range('J' & RenActual).Value = 'Número Operación' ws.Range('K' & RenActual).Value = 'Cuenta Origen' ws.Range('L' & RenActual).Value = 'Alias Cuenta Origen' ws.Range('M' & RenActual).Value = 'Cuenta Destino' ws.Range('N' & RenActual).Value = 'Alias Cuenta Destino' ws.Range('O' & RenActual).Value = 'UUID' RenActual = RenActual + 1 FinEncab //****************************************************************************** //Cuerpo principal. //****************************************************************************** tParametros.Busca Primero Si pDeLaCuenta = ' ' tCuentas.Busca Primero pDeLaCuenta = tCuentas(cNumeroC01) FinSi Si pAlaCuenta = ' ' tCuentas.Busca Ultimo pALaCuenta = tCuentas(cNumeroC01) FinSi Mientras[tCuentas.Busca[pDeLaCuenta & '..' & pAlaCuenta ]; tCuentas->Encontro ; tCuentas.Busca Siguiente[1]] Si tCuentas(cIdCuenta) = 0 O tCuentas(cIdCatal01) != 0 // Quita la cuenta 0, y las cuentas que no son de la empresa Continua FinSi // Se inicializa la fecha con la que se realizaran las busquedas en el rango de fechas gFechaBusqueda = pDeLaFecha // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente tDocumentos.Usaindice['CIDCUENTA'] tDocumentos.Busca[tCuentas(cIdCuenta) & ':' & gFechaBusqueda] Si !tDocumentos->ENCONTRO Si tCuentas(cIdCuenta) = @Val(@SUBSTR(tDocumentos->Llave;0;11)) Si @SUBSTR(tDocumentos->Llave;11;8) >= pDeLaFecha Y @SUBSTR(tDocumentos->Llave;11;8) <= pAlaFecha gFechaBusqueda = @SUBSTR(tDocumentos->Llave;11;8) tDocumentos.Busca[tCuentas(cIdCuenta) & ':' & gFechaBusqueda] FinSi FinSi FinSi gCuentaImpreso = 0 // Bandera para controlar la impresión de la cuenta Mientras tDocumentos->Encontro Y (tDocumentos(cFecha) <= pAlaFecha) tClientes.BUSCA[@STR(tDocumentos(cIdClien01);0)] Si fDiscriminaCliente(tClientes) = 1 tDocumentos.BUSCA SIGUIENTE[1] Continua Finsi Si fDiscriminaDocto(tDocumentos) = 1 tDocumentos.BUSCA SIGUIENTE[1] Continua Finsi fImpDatosCuenta(tCuentas) fImprimeDocumento(tDocumentos;tDigitales;tClientes;tMonedas;tCuentas;tCuentasCP;tConcepto) // Búsqueda del siguiente registro que cumpla con la cuenta tDocumentos.BUSCA SIGUIENTE[1] FinMientras tDocumentos.Usaindice[''] // Para las busquedas parciales FinMientras // FIN DEL REPORTE