// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // // AnIVAFacCom.rpt // Nombre del reporte en el sistema: Análisis de IVA por Factura o Compra. // // Sistema: AdminPAQ v1.1 // // Este reporte perteneciente al módulo de ventas y compras, depliega en Excel // un listado de documentos con el desglose de IVA para un rango de fechas dado. // // Consideraciones especiales: // // Elaboró: Daniel Robles de Alba // Fecha: 05 de marzo del 2002. // // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Historia de modificaciones // Fecha Nombre IDLotus Descripcion // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // 16/04/2019 IYPZ S.C.4071 Se agrega el IVA 8%. // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // ***************************************************************************** // Funciones de librería Incluye LibAdminPAQ.Rpt // ***************************************************************************** // Parámetros del reporte: Parametro pFechaInicial = '20020101' // Fecha inicial del rango Parametro pFechaFinal = '20021231' // Fecha final del rango Parametro pIdMoneda = 1 // Id de la moneda a expresar el reporte Parametro pTipoReporte = 0 // Si es salida por factura o compra // 0 = Factura // 1 = Compra Parametro pMostrarTasa8 = 0 // Si se muestra el IVA AL 8% // 0 = No // 1 = Sí // ***************************************************************************** // Tablas a utilizar e Indices de búsqueda por omisión UsaEmpresa tEmpresa;'CONTPAQ I Facturacion' // Parámetros UsaTabla tDocumento = tEmpresa['MGW10008'] // Documentos tDocumento.Usaindice['iDocumentoDeFechaSerieFol'] // cIdDocumentoDe+cFecha+cSerie+cFolio UsaTabla tMovimiento = tEmpresa['MGW10010'] // Movimientos tMovimiento.Usaindice['iDoctoNumeroMovto'] // cIdDocumento+cNumeroMovimiento UsaTabla tClienteProveedor = tEmpresa['MGW10002'] // Clientes/Proveedores tClienteProveedor.Usaindice[''] // Indice primario: cIdClienteProveedor UsaTabla tProducto = tEmpresa['MGW10005'] // Productos tProducto.Usaindice[''] // Indice primario: cIdProducto UsaTabla tMoneda = tEmpresa['MGW10034'] // Monedas tMoneda.Usaindice[''] // Indice primario: cIdMoneda UsaTabla tTipoCambio = tEmpresa['MGW10035'] // Tipos de cambio entre monedas tTipoCambio.Usaindice['iMonedaFecha'] // cIdMoneda+cFecha UsaTabla tParametros = tEmpresa['MGW10000'] // Parámetros de la empresa tParametros.Usaindice[''] // Indice primario: cIdEmpresa Usatabla tTiposCambioLib = tEmpresa['mgw10035'] Alias 'tTipoC' tTiposCambioLib.Usaindice['iMonedaFecha'] UsaTabla tClienteProveedorTmp = tEmpresa['MGW10002'] Alias tCProv // Clientes/Proveedores tClienteProveedorTmp.Usaindice[''] // Indice primario: cIdClienteProveedor // ***************************************************************************** // Definiciones y asumidos globales para el reporte Columnas 38;1 Usaletra 'Arial' Altura 9 // ***************************************************************************** // Variables de ámbito global: gIdioma = 0 // Idioma del reporte // 0 = Español // 1 = Inglés gDecimalesMoneda = 2 // Número de decimales en la moneda gNeto = 0 // Bases del IVA (15,10,0,etc) gImpuesto = 0 // IVAs (15,10,0,etc) gProporcional = 0 // Proporciones de IVA sobre el neto del documento gTotalNeto = 0 // Total de las bases gTotalImpuesto = 0 // Total de los IVAs gTotal = 0 // Total de los totales gNumImpuesto = 1 // Cúal de los tres impuesto es usado [C0..C7].Decimales 0 tParametros.Busca Primero // Número de impuesto que tiene el IVA gNumImpuesto = tParametros(cNumImpuestoIVA) Si gNumImpuesto > 0 // ND-255 gNumImpuesto = gNumImpuesto - 1 // (0 = Impuesto1, 1 = Impuesto2, 2 = Impuesto3) FinSi // ************************************* // 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 // ************************************* // 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 // Fecha = 12 caracteres ws.Columns(1).ColumnWidth = 12[C0] // Serie = 5 caracteres ws.Columns(2).ColumnWidth = 5[C0] // Folio = 8 caracteres ws.Columns(3).ColumnWidth = 8[C0] // Cliente/Proveedor = 14 caracteres ws.Columns(4).ColumnWidth = 14[C0] // Base 15% = 15 caracteres ws.Columns(5).ColumnWidth = 15[C0] // Base 10% = 15 caracteres ws.Columns(6).ColumnWidth = 15[C0] // Base 8% = 15 caracteres ws.Columns(7).ColumnWidth = (pMostrarTasa8=0? 0:15 )[C0] // Base 0% = 15 caracteres ws.Columns(8).ColumnWidth = 15[C0] // Base Exento = 15 caracteres ws.Columns(9).ColumnWidth = 15[C0] // Base Otros = 15 caracteres ws.Columns(10).ColumnWidth = 15[C0] // Neto = 15 caracteres ws.Columns(11).ColumnWidth = 15[C0] // IVA 15% = 15 caracteres ws.Columns(12).ColumnWidth = 15[C0] // IVA 10% = 15 caracteres ws.Columns(13).ColumnWidth = 15[C0] // IVA 8% = 15 caracteres ws.Columns(14).ColumnWidth = (pMostrarTasa8=0? 0:15 )[C0] // IVA Otros = 15 caracteres ws.Columns(15).ColumnWidth = 15[C0] // Total = 15 caracteres ws.Columns(16).ColumnWidth = 15[C0] // Proporcion 15% = 15 caracteres ws.Columns(17).ColumnWidth = 15[C0] // Proporcion 10% = 15 caracteres ws.Columns(18).ColumnWidth = 15[C0] // Proporcion 8% = 15 caracteres ws.Columns(19).ColumnWidth = (pMostrarTasa8=0? 0:15 )[C0] // Proporcion 0% = 15 caracteres ws.Columns(20).ColumnWidth = 15[C0] // Proporcion Exento = 15 caracteres ws.Columns(21).ColumnWidth = 15[C0] // Proporcion Otros = 15 caracteres ws.Columns(22).ColumnWidth = 15[C0] // ***************************************************************************** // fConfiguraDecimales // // Configura el número de decimales de las columnas de importes, basado // en los parámetros de la empresa. // // Parámetros // // Salidas // ***************************************************************************** DefFunc fConfiguraDecimales() LOCAL lDigDecimales, lDecs, lFormato lDigDecimales = '0000000000' // Busca el registro de la moneda del documento tMoneda.Busca[@Str(pIdMoneda;0)] Si tMoneda->Encontro // Si lo encontró lDecs = @SUBSTR(lDigDecimales;1;tMoneda(cDecimalesMoneda)) // lFormato = '#,##0.' & lDecs & '_);[Rojo](#,##0.' & lDecs & ')' lFormato = '#,##0.' & lDecs & '_);(#,##0.' & lDecs & ')' ws.Columns(5).NumberFormat = lFormato[C0] ws.Columns(6).NumberFormat = lFormato[C0] ws.Columns(7).NumberFormat = lFormato[C0] ws.Columns(8).NumberFormat = lFormato[C0] 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] // De las columnas 15-19 se pasa el formato junto con el valor (ND-258 DRdA) Sino // Si no encontró el registro de la empresa [C8..C32].Decimales 2 // ws.Columns(6).NumberFormat = '#,##0.00_);[Rojo](#,##0.00)'[C0] ws.Columns(5).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(6).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(7).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(8).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(9).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(10).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(11).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(12).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(13).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(14).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(15).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] ws.Columns(16).NumberFormat = '#,##0.00_);(#,##0.00)'[C0] // De las columnas 17-19 se pasa el formato junto con el valor (ND-258 DRdA) FinSi FinFunc // ***************************************************************************** // fImprimeDocumento // // Esta función imprime los datos del documento y los calculados // // Parámetros // // Salidas // ***************************************************************************** DefFunc fImprimeDocumento(atDocumento: Tabla; aNeto; aImpuesto; aProporcional) Local lFechaEditada, lCodigo, lMascarilla // Manda a Excel Documentos(cFecha), Documentos(cSerieDocumento), Documentos(cFolio), Clientes(cCodigoCliente) // Manda a Excel Neto(0), Neto(1), Neto(2), Neto(3), Neto(4), Neto(5), Documentos(cNeto), Impuesto(0), Impuesto(1), Impuesto(2), Impuesto(3) // Manda a Excel Documentos(cTotal), Proporcional(0), Proporcional(1), Proporcional(2), Proporcional(3), Proporcional(4), Proporcional(5) // Avanza de renglon RenActual = RenActual + 1[C0] ws.Range('A' & RenActual & ':V' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':V' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':V' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':V' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] // Fecha del documento lFechaEditada = fFormateaFecha(atDocumento(cFecha); gIdioma) ws.Range('A' & RenActual).Value = @Col(lFechaEditada;0)[C0] // Serie ws.Range('B' & RenActual).Value = atDocumento(cSerieDocumento)[C0] // Folio ws.Range('C' & RenActual).Value = atDocumento(cFolio)[C0] // Lee el cliente o proveedor, lo formatea y lo imprime tClienteProveedor.Busca[@Str(atDocumento(cIdClienteProveedor);0)] Si tClienteProveedor->Encontro lCodigo = tClienteProveedor(cCodigoCliente) lMascarilla = tParametros(cMascarillaClientes) // N.D.0652 Se agregó un apostrofe al inicio del código por si viene iniciado // por ceros no los quite excel, sino que lo tome como una cadena y no como // un número. (DRdA) ws.Range('D' & RenActual).Value = @Chr(39) & fMascarilla(lCodigo;lMascarilla)[C0] FinSi // Base 15% ws.Range('E' & RenActual).Value = @Col(aNeto;0)[C0] // Base 10% ws.Range('F' & RenActual).Value = @Col(aNeto;1)[C0] // Base 8% ws.Range('G' & RenActual).Value = @Col(aNeto;2)[C0] // Base 0% ws.Range('H' & RenActual).Value = @Col(aNeto;3)[C0] // Base Exento ws.Range('I' & RenActual).Value = @Col(aNeto;4)[C0] // Base Otros ws.Range('J' & RenActual).Value = @Col(aNeto;5)[C0] // Neto ws.Range('K' & RenActual).Value = @Col(aNeto;7)[C0] // IVA 15% ws.Range('L' & RenActual).Value = @Col(aImpuesto;0)[C0] // IVA 10% ws.Range('M' & RenActual).Value = @Col(aImpuesto;1)[C0] // IVA 8% ws.Range('N' & RenActual).Value = @Col(aImpuesto;2)[C0] // IVA Otros ws.Range('O' & RenActual).Value = @Col(aImpuesto;3)[C0] // TOTAL ws.Range('P' & RenActual).Value = @Col(aNeto;8)[C0] // Se pasan los valores de las columnas O a la S con formato de porcentaje (ND-258 DRdA) // Proporcional 15% ws.Range('Q' & RenActual).Value = @Col(aProporcional;0)*100 & '%'[C0] // Proporcional 10% ws.Range('R' & RenActual).Value = @Col(aProporcional;1)*100 & '%'[C0] // Proporcional 8% ws.Range('S' & RenActual).Value = @Col(aProporcional;2)*100 & '%'[C0] // Proporcional 0% ws.Range('T' & RenActual).Value = @Col(aProporcional;3)*100 & '%'[C0] // Proporcional Exento ws.Range('U' & RenActual).Value = @Col(aProporcional;4)*100 & '%'[C0] // Proporcional Otros ws.Range('V' & RenActual).Value = @Col(aProporcional;5)*100 & '%'[C0] FinFunc // ***************************************************************************** // fImprimeTotales // // Esta función imprime los datos del documento y los calculados // // Parámetros // // Salidas // ***************************************************************************** DefFunc fImprimeTotales(aTotalNeto; aTotalImpuesto) // Avanza de renglon RenActual = RenActual + 1[C0] ws.Range('E' & RenActual & ':P' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':P' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':P' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':P' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':P' & RenActual).Font.FontStyle = 'Negrita'[C0] // Base 15% ws.Range('E' & RenActual).Value = @Col(aTotalNeto;0)[C0] // Base 10% ws.Range('F' & RenActual).Value = @Col(aTotalNeto;1)[C0] // Base 8% ws.Range('G' & RenActual).Value = @Col(aTotalNeto;2)[C0] // Base 0% ws.Range('H' & RenActual).Value = @Col(aTotalNeto;3)[C0] // Base Exento ws.Range('I' & RenActual).Value = @Col(aTotalNeto;4)[C0] // Base Otros ws.Range('J' & RenActual).Value = @Col(aTotalNeto;5)[C0] // Neto ws.Range('K' & RenActual).Value = @Col(aTotalNeto;7)[C0] // IVA 15% ws.Range('L' & RenActual).Value = @Col(aTotalImpuesto;0)[C0] // IVA 10% ws.Range('M' & RenActual).Value = @Col(aTotalImpuesto;1)[C0] // IVA 8% ws.Range('N' & RenActual).Value = @Col(aTotalImpuesto;2)[C0] // IVA Otros ws.Range('O' & RenActual).Value = @Col(aTotalImpuesto;3)[C0] // TOTAL ws.Range('P' & RenActual).Value = @Col(aTotalNeto;8)[C0] FinFunc // ***************************************************************************** // fCalculaTotales // // Esta función lee el IVA de los movtos y calcula los importe base de los IVAs // // Parámetros // // Entradas: aIdDocumento - Identificador del documento padre de los movtos // aNumImpuesto - determina el campo impuesto de la tabla de movtos // entre el 1 y 3l tres // Salidas: Los parámetros aNeto y aImpuesto deben ser enviados por referencia // ***************************************************************************** DefFunc fCalculaTotales(aNeto; aImpuesto; aTotal; atDocumento: Tabla; aNumImpuesto) Local lOffsetImporte, lOffsetPorcentaje, lEsExento, lNeto, lTotal, lImpuesto, lOtraTasa aNeto = 0[C0..C7] aImpuesto = 0[C0..C3] aRetencion = 0[C0..C1] aTotal = 0[C0..C5] lTotal = 0[C0] lImpuesto = 0[C0..C2] lOffsetImporte = 16 + (aNumImpuesto * 2) lOffsetPorcentaje = 17 + (aNumImpuesto * 2) Mientras [ tMovimiento.Busca[@Str(atDocumento(cIdDocumento);0)]; tMovimiento->Encontro; tMovimiento.Busca Siguiente[1] ] lNeto[0] = tMovimiento(cNeto) - tMovimiento(cDescuento1) - tMovimiento(cDescuento2) - tMovimiento(cDescuento3) - tMovimiento(cDescuento4) - tMovimiento(cDescuento5) lTotal[0] = tMovimiento(cTotal) + tMovimiento(cRetenci01) + tMovimiento(cRetenci02) lOtraTasa = FALSE Escoge tMovimiento->CampoVal[lOffsetPorcentaje] Caso 15 SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) <= 2009 lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte] aNeto[0] = @Col(aNeto;0) + @Col(lNeto;0) aImpuesto[0] = @Col(aImpuesto;0) + @COL(lImpuesto;0) aTotal[0] = @Col(aTotal;0) + tMovimiento(cTotal) SINO lOtraTasa = TRUE FINSI FinCaso Caso 16 SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) > 2009 lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte] aNeto[0] = @Col(aNeto;0) + @Col(lNeto;0) aImpuesto[0] = @Col(aImpuesto;0) + @Col(lImpuesto;0) aTotal[0] = @Col(aTotal;0) + tMovimiento(cTotal) SINO lOtraTasa = TRUE FINSI FinCaso Caso 10 SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) <= 2009 lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte] aImpuesto[1] = @Col(aImpuesto;1) + @Col(lImpuesto;0) aNeto[1] = @Col(aNeto;1) + @Col(lNeto;0) aTotal[1] = @Col(aTotal;1) + tMovimiento(cTotal) SINO lOtraTasa = TRUE FINSI FinCaso Caso 11 SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) > 2009 // AJUSTE 2010 CASO DOCUMENTO DE AJUSTE ESPECIAL lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte] aNeto[1] = @Col(aNeto;1) + @Col(lNeto;0) aImpuesto[1] = @Col(aImpuesto;1) + @Col(lImpuesto;0) aTotal[1] = @Col(aTotal;1) + tMovimiento(cTotal) SINO lOtraTasa = TRUE FINSI FinCaso Caso 8 SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) > 2018 lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte] aNeto[2] = @Col(aNeto;2) + @Col(lNeto;0) aImpuesto[2] = @Col(aImpuesto;2) + @Col(lImpuesto;0) aTotal[2] = @Col(aTotal;2) + tMovimiento(cTotal) SINO lOtraTasa = TRUE FINSI FinCaso Caso 0 // Si el importe del impuesto es distinto de cero es por que se capturó // y debe ir a otras tasas Si tMovimiento->CampoVal[lOffsetImporte] = 0.0 lEsExento = 0 Si tMovimiento(cIdProducto) != 0 tProducto.Busca[@Str(tMovimiento(cIdProducto);0)] Si !tProducto->Encontro Continua FinSi lEsExento = tProducto(cEsExento) FinSi Si lEsExento = 0 aNeto[3] = @Col(aNeto;3) + @Col(lNeto;0) aTotal[3] = @Col(aTotal;3) + tMovimiento(cTotal) SiNo aNeto[4] = @Col(aNeto;4) + @Col(lNeto;0) aTotal[4] = @Col(aTotal;4) + tMovimiento(cTotal) FinSi SiNo aImpuesto[3] = @Col(aImpuesto;3) + tMovimiento->CampoVal[lOffsetImporte] aNeto[5] = @Col(aNeto;5) + @Col(lNeto;0) aTotal[5] = @Col(aTotal;5) + tMovimiento(cTotal) FinSi FinCaso OtroCaso lOtraTasa = TRUE FinCaso FinEscoge SI lOtraTasa aImpuesto[3] = @Col(aImpuesto;3) + tMovimiento->CampoVal[lOffsetImporte] aNeto[5] = @Col(aNeto;5) + @Col(lNeto;0) aTotal[5] = @Col(aTotal;5) + tMovimiento(cTotal) FINSI FinMientras aNeto[6] = atDocumento(cNeto) - atDocumento(cDescuentoMov) aNeto[7] = atDocumento(cTotal) FinFunc // ***************************************************************************** // fCalculaProporcion // // Esta función calcula la parte proporcional de cada IVA sobre el neto del // documento // // Parámetros // // Entradas: // Salidas: El parámetro aProporcional deberá ser enviado por referencia // ***************************************************************************** DefFunc fCalculaProporcion(aTotal; aTotalDocumento; aProporcional) aProporcional[0] = @Col(aTotal;0) / aTotalDocumento aProporcional[1] = @Col(aTotal;1) / aTotalDocumento aProporcional[2] = @Col(aTotal;2) / aTotalDocumento aProporcional[3] = @Col(aTotal;3) / aTotalDocumento aProporcional[4] = @Col(aTotal;4) / aTotalDocumento aProporcional[5] = @Col(aTotal;5) / aTotalDocumento FinFunc // ***************************************************************************** // Encabezado del reporte Encab // 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 = 'Facturación 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 B a la R ws.Range('C' & RenActual & ':R' & 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] Si pTipoReporte = 0 ws.Range('A' & RenActual ).Value = 'A N Á L I S I S D E I V A P O R F A C T U R A'[C0] SiNo ws.Range('A' & RenActual ).Value = 'A N Á L I S I S D E I V A P O R C O M P R A'[C0] FinSi // Lo centra en las columnas A a la S ws.Range('A' & RenActual & ':S' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] // Avanza de renglon RenActual = RenActual + 1[C0] // Pone el rango de fechas en EXCEL ws.Range('A' & RenActual).Font.Size = 12[C0] ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0] ws.Range('A' & RenActual ).Value = 'Del: ' & fFormateaFecha(pFechaInicial;gIdioma) & ' Al: ' & fFormateaFecha(pFechaFinal;gIdioma)[C0] // Lo centra en las columnas A a la S ws.Range('A' & RenActual & ':S' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] // Avanza de renglon RenActual = RenActual + 1[C0] ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0] ws.Range('A' & RenActual ).Value = 'Impuesto a considerar: ' & tParametros->CampoVal[65+gNumImpuesto][C0] tMoneda.Busca[@Str(pIdMoneda;0)] Si tMoneda->Encontro ws.Range('S' & RenActual).HorizontalAlignment = xlDerecha[C0] ws.Range('S' & RenActual).Font.FontStyle = 'Negrita'[C0] ws.Range('S' & RenActual ).Value = 'Moneda: ' & tMoneda(cNombreMoneda)[C0] FinSi // Avanza de renglon RenActual = RenActual + 1[C0] // Pone el titulo Análisis del importe neto ws.Range('E' & RenActual & ':J' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range('E' & RenActual & ':J' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':J' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':J' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':J' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('E' & RenActual & ':J' & RenActual).Interior.ColorIndex = 3[C0] ws.Range('E' & RenActual).Font.Color = @RGB(255;255;255)[C0] ws.Range('E' & RenActual).Font.FontStyle = 'Negrita'[C0] ws.Range('E' & RenActual ).Value = 'ANÁLISIS DEL IMPORTE NETO'[C0] // Pone el titulo Análisis del impuesto ws.Range('L' & RenActual & ':O' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range('L' & RenActual & ':O' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('L' & RenActual & ':O' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('L' & RenActual & ':O' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('L' & RenActual & ':O' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('L' & RenActual & ':O' & RenActual).Interior.ColorIndex = 3[C0] ws.Range('L' & RenActual).Font.Color = @RGB(255;255;255)[C0] ws.Range('L' & RenActual).Font.FontStyle = 'Negrita'[C0] ws.Range('L' & RenActual ).Value = 'ANÁLISIS DEL IMPUESTO'[C0] // Pone el titulo Parte proporcional del neto ws.Range('Q' & RenActual & ':V' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0] ws.Range('Q' & RenActual & ':V' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('Q' & RenActual & ':V' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('Q' & RenActual & ':V' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('Q' & RenActual & ':V' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('Q' & RenActual & ':V' & RenActual).Interior.ColorIndex = 3[C0] ws.Range('Q' & RenActual).Font.Color = @RGB(255;255;255)[C0] ws.Range('Q' & RenActual).Font.FontStyle = 'Negrita'[C0] ws.Range('Q' & RenActual ).Value = 'PARTE PROPORCIONAL DEL NETO'[C0] // Avanza de renglon RenActual = RenActual + 1[C0] // Pone el titulo de cada columna en EXCEL ws.Range('A' & RenActual & ':V' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':V' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':V' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':V' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0] ws.Range('A' & RenActual & ':V' & RenActual).Interior.ColorIndex = 55[C0] ws.Range('A' & RenActual & ':V' & RenActual).Font.FontStyle = 'Negrita'[C0] ws.Range('A' & RenActual & ':V' & RenActual).Font.Color = @RGB(255;255;255)[C0] ws.Range('E' & RenActual & ':V' & RenActual).HorizontalAlignment = xlCentro[C0] ws.Range('A' & RenActual & ':V' & RenActual).Value = 'Fecha','Serie','Folio',(pTipoReporte=0?'Cliente':'Proveedor'),@Chr(39)&'16%',@Chr(39)&'11%',@Chr(39)&'8%',@Chr(39)&'0%','Exento','Otros Impuestos','Neto','IVA 16%','IVA 11%','IVA 8%','IVA Otros','TOTAL',@Chr(39)&'16%',@Chr(39)&'11%',@Chr(39)&'8%',@Chr(39)&'0%','Exento','Otros Impuestos' Excel.Rows('7:7').Select Excel.ActiveWindow.FreezePanes = True ws.Range('A' & RenActual).Select FinEncab // ***************************************************************************** // Cuerpo del reporte // Configura los decimales del reporte fConfiguraDecimales() Si pTipoReporte = 0 // Facturas? vIdDocumentoDe = 4 SiNo vIdDocumentoDe = 19 // Compras FinSi // Obtiene los documentos en el rango de fechas especificado en el reporte Mientras pFechaInicial <= pFechaFinal // Si encontro algún documento en esa fecha, recupera todos los documentos en esa fecha Mientras [tDocumento.Busca[vIdDocumentoDe & ':' & pFechaInicial]; tDocumento->Encontro; tDocumento.Busca Siguiente[2] ] // Omite los documentos cancelados, y que no han sido afectados Si tDocumento(cCancelado) != 0 Continua FinSi Si tDocumento(cAfectado) = 0 Continua FinSi // Si el docto tiene fecha menor a 2002 no desglosar su IVA Si tDocumento(cFecha) < '20020101' Continua FinSi tClienteProveedorTmp.Busca[@Str(tDocumento(cIdClienteProveedor);0)] Si tClienteProveedorTmp->Encontro lIdMonedaCliente = tClienteProveedorTmp(cIdMoneda) Sino lIdMonedaCliente = 1 FinSi Si lIdMonedaCliente != pIdMoneda Y pIdMoneda != 1 Continua FinSi fCalculaTotales(&gNeto; &gImpuesto; &gTotal; tDocumento; gNumImpuesto) gNeto[7] = tDocumento(cNeto) - tDocumento(cDescuentoMov) gNeto[8] = tDocumento(cTotal) //Si no muestra IVA 8%, se resta el importe al neto y total. Si pMostrarTasa8 = 0 gNeto[7] = @COL(gNeto; 7) - @COL(gNeto; 2) gNeto[8] = @COL(gNeto; 8) - @COL(gNeto; 2) - @COL(gImpuesto; 2) FinSi fCalculaProporcion(gTotal; @COL(gNeto; 8); &gProporcional) gNeto[0] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gNeto;0); pIdMoneda; lIdMonedaCliente) gNeto[1] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gNeto;1); pIdMoneda; lIdMonedaCliente) gNeto[2] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gNeto;2); pIdMoneda; lIdMonedaCliente) gNeto[3] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gNeto;3); pIdMoneda; lIdMonedaCliente) gNeto[4] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gNeto;4); pIdMoneda; lIdMonedaCliente) gNeto[5] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gNeto;5); pIdMoneda; lIdMonedaCliente) gNeto[6] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gNeto;6); pIdMoneda; lIdMonedaCliente) gNeto[7] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gNeto;7); pIdMoneda; lIdMonedaCliente) gNeto[8] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gNeto;8); pIdMoneda; lIdMonedaCliente) gImpuesto[0] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gImpuesto;0); pIdMoneda; lIdMonedaCliente) gImpuesto[1] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gImpuesto;1); pIdMoneda; lIdMonedaCliente) gImpuesto[2] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gImpuesto;2); pIdMoneda; lIdMonedaCliente) gImpuesto[3] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gImpuesto;3); pIdMoneda; lIdMonedaCliente) gTotal[0] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;0); pIdMoneda; lIdMonedaCliente) gTotal[1] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;1); pIdMoneda; lIdMonedaCliente) gTotal[2] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;2); pIdMoneda; lIdMonedaCliente) gTotal[3] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;3); pIdMoneda; lIdMonedaCliente) gTotal[4] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;4); pIdMoneda; lIdMonedaCliente) gTotal[5] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;5); pIdMoneda; lIdMonedaCliente) gTotalNeto = gTotalNeto + gNeto[C0..C8] gTotalImpuesto = gTotalImpuesto + gImpuesto[C0..C3] // Imprime el documento fImprimeDocumento(tDocumento;gNeto;gImpuesto;gProporcional) FinMientras // Busca en la siguiente fecha pFechaInicial = fFechaSiguiente(pFechaInicial) FinMientras // Manda a Excel TotalNeto y TotalImpuesto fImprimeTotales(gTotalNeto; gTotalImpuesto)