protected void GenerarArchivoRetencionesIva_Button_Click(object sender, EventArgs e) { // Create the CSV file on the server String fileName = @"ImpuestoIvaRetenido_" + User.Identity.Name + ".txt"; String filePath = HttpContext.Current.Server.MapPath("~/Temp/" + fileName); if (File.Exists(@filePath)) { File.Delete(@filePath); } StreamWriter sw; try { sw = new StreamWriter(filePath, false); } catch (Exception ex) { string errorMessage = ex.Message; if (ex.InnerException != null) { errorMessage += ex.InnerException.Message; } ErrMessage_Span.InnerHtml = "Error al intentar escribir al archivo.<br /><br />" + errorMessage; ErrMessage_Span.Style["display"] = "block"; return; } StringBuilder sb; int cantidadLineas = 0; if (this.ObtencionArchivoRetencionesIva_AgregarEncabezados_CheckBox.Checked) { // agregamos una linea de encabezado al archivo ... sb = new StringBuilder(); // nuestro rif sb.Append("Nuestro rif" + "\t"); // periodo fiscal sb.Append("Período" + "\t"); // fecha Doc sb.Append("Fecha doc" + "\t"); // tipo operación (siempre C) sb.Append("Tipo oper" + "\t"); // tipo doc (siempre 01) sb.Append("Tipo doc" + "\t"); // su rif sb.Append("Su rif" + "\t"); // número documento sb.Append("Número doc" + "\t"); // número control sb.Append("Control" + "\t"); // total doc sb.Append("Total doc" + "\t"); // base imponible sb.Append("Monto imp" + "\t"); // ret iva sb.Append("Ret iva" + "\t"); // doc afectado sb.Append("Doc afectado" + "\t"); // comprobante seniat sb.Append("Comp seniat" + "\t"); // base no imp sb.Append("Monto no imp" + "\t"); // iva porc sb.Append("Iva%" + "\t"); // número de expediente (siempre 0) sb.Append("#Exp"); sw.Write(sb.ToString()); sw.Write(sw.NewLine); cantidadLineas++; } BancosEntities context = new BancosEntities(); // nótese como leemos las facturas seleccionadas, en la tabla 'temp...', para construir un filtro para Facturas_Impuestos, que regrese // justamente, las facturas que el usuario ha seleccionado string filtroFacturasSeleccionadas = ""; var facturas = from f in context.tTempWebReport_ConsultaFacturas where f.NombreUsuario == User.Identity.Name select f.ClaveUnicaFactura; foreach (int facturaID in facturas) { if (string.IsNullOrEmpty(filtroFacturasSeleccionadas)) { filtroFacturasSeleccionadas = "(it.FacturaID In {" + facturaID.ToString(); } else { filtroFacturasSeleccionadas += "," + facturaID.ToString(); } } if (string.IsNullOrEmpty(filtroFacturasSeleccionadas)) { filtroFacturasSeleccionadas = "(1 == 2)"; } else { filtroFacturasSeleccionadas += "})"; } var query = context.Facturas_Impuestos.Include("Factura"). Include("Factura.Proveedore"). Include("Factura.Compania"). Where(filtroFacturasSeleccionadas). Select(i => i); query = query.Where(i => i.ImpuestosRetencionesDefinicion.Predefinido == 2). // solo retenciones Iva OrderBy(i => i.Factura.NumeroComprobante); int retencionesIvaAgregadas = 0; foreach (Facturas_Impuestos impuesto in query) { // lamentablemente, debemos leer la definición del impuesto Iva para la retención que acabamos de leer. La razón es que // en el registro de la retención Iva no está el monto imponible que corresponde; cuando es una sola retención, se puede tomar // de la factura; cuando la factura tiene más de una retención, pueden haber montos imponibles diferentes ... Facturas_Impuestos impuestoIva = context.Facturas_Impuestos.Where(i => i.FacturaID == impuesto.FacturaID && i.ID < impuesto.ID). Where(i => i.ImpuestosRetencionesDefinicion.Predefinido == 1). OrderByDescending(i => i.ID). // para leer *justo* la definición de Iva anterior y no otra que está aún antes ... FirstOrDefault(); string numeroDocumento = ""; if (!string.IsNullOrEmpty(impuesto.Factura.NcNdFlag)) { numeroDocumento = impuesto.Factura.NcNdFlag + "-" + impuesto.Factura.NumeroFactura; } else { numeroDocumento = impuesto.Factura.NumeroFactura; } // ahora escribimos una linea al archivo de texto, separado por tabs sb = new StringBuilder(); // nuestro rif sb.Append(string.IsNullOrEmpty(impuesto.Factura.Compania.Rif) ? "" : impuesto.Factura.Compania.Rif.ToString().Replace("-", "")); sb.Append("\t"); // nótese que el usuario indica si desea la fecha de emisión o recepción en el archivo ... if (this.UsarFechaEmision_CheckBox.Checked) { sb.Append(impuesto.Factura.FechaEmision.ToString("yyyy") + impuesto.Factura.FechaEmision.ToString("MM")); sb.Append("\t"); sb.Append(impuesto.Factura.FechaEmision.ToString("yyyy-MM-dd")); sb.Append("\t"); } else { sb.Append(impuesto.Factura.FechaRecepcion.ToString("yyyy") + impuesto.Factura.FechaRecepcion.ToString("MM")); sb.Append("\t"); sb.Append(impuesto.Factura.FechaRecepcion.ToString("yyyy-MM-dd")); sb.Append("\t"); } // tipo operación (siempre C) sb.Append("C"); sb.Append("\t"); // tipo doc (siempre 01; no, 01 para facturas; 03 para NC) if (string.IsNullOrEmpty(impuesto.Factura.NcNdFlag)) { sb.Append("01"); } else if (impuesto.Factura.NcNdFlag == "NC") { sb.Append("03"); } else { sb.Append("01"); } sb.Append("\t"); // su rif sb.Append(string.IsNullOrEmpty(impuesto.Factura.Proveedore.Rif) ? "" : impuesto.Factura.Proveedore.Rif.ToString().Replace("-", "")); sb.Append("\t"); // número documento sb.Append(numeroDocumento); sb.Append("\t"); // ----------------------------------------------------------------------------------------- // número control string sNumeroControlDefinitivo = impuesto.Factura.NumeroControl; if (string.IsNullOrEmpty(sNumeroControlDefinitivo)) { sNumeroControlDefinitivo = "0"; } Int64 numeroControl = 0; if (this.NumeroControl_ConvertirSoloNumeros_CheckBox.Checked) { if (!Int64.TryParse(sNumeroControlDefinitivo, out numeroControl)) { // excelente como quitamos letras y caracteres especiales del string (tomado de algún lado en la Web) ... sNumeroControlDefinitivo = new String(sNumeroControlDefinitivo.Where(c => char.IsDigit(c)).ToArray()); } else { sNumeroControlDefinitivo = impuesto.Factura.NumeroControl; } } ; // --------------------------------------------------------------------------------------------------------------------------------------- // base imponible: nótese como la tomamos del registro de impuesto Iva (leído antes) decimal montoNoImponible = 0; decimal montoImponible = 0; decimal ivaPorc = 0; decimal montoIva = 0; decimal totalFactura = 0; if (impuesto.Factura.MontoFacturaSinIva != null) { montoNoImponible = impuesto.Factura.MontoFacturaSinIva.Value; } if (impuestoIva != null && impuestoIva.MontoBase != null) { montoImponible = impuestoIva.MontoBase.Value; } if (impuestoIva != null && impuestoIva.Porcentaje != null) { ivaPorc = impuestoIva.Porcentaje.Value; montoIva = montoImponible * ivaPorc / 100; } totalFactura = montoNoImponible + montoImponible + montoIva; sb.Append(sNumeroControlDefinitivo); sb.Append("\t"); // total doc sb.Append(totalFactura.ToString("0.00", CultureInfo.InvariantCulture)); sb.Append("\t"); // monto imponible sb.Append(montoImponible.ToString("0.00", CultureInfo.InvariantCulture)); sb.Append("\t"); // ret iva sb.Append(impuesto.Monto.ToString("0.00", CultureInfo.InvariantCulture)); sb.Append("\t"); // doc afectado sb.Append(string.IsNullOrEmpty(impuesto.Factura.NumeroFacturaAfectada) ? "0" : impuesto.Factura.NumeroFacturaAfectada); sb.Append("\t"); // comprobante seniat sb.Append(impuesto.Factura.NumeroComprobante); sb.Append("\t"); // base no imp sb.Append(montoNoImponible.ToString("0.00", CultureInfo.InvariantCulture)); sb.Append("\t"); // iva porc sb.Append(ivaPorc.ToString("0.00", CultureInfo.InvariantCulture)); sb.Append("\t"); // número de expediente (siempre 0) sb.Append("0"); sw.Write(sb.ToString()); sw.Write(sw.NewLine); cantidadLineas++; retencionesIvaAgregadas++; } try { // finally close the file sw.Close(); sw = null; } catch (Exception ex) { string errorMessage = ex.Message; if (ex.InnerException != null) { errorMessage += ex.InnerException.Message; } ErrMessage_Span.InnerHtml = "Ha ocurrido un error al intentar grabar el archivo requerido en el servidor. <br /><br />" + errorMessage; ErrMessage_Span.Style["display"] = "block"; context = null; return; } if (retencionesIvaAgregadas == 0) { ErrMessage_Span.InnerHtml = "No existe información para construir el archivo que Ud. ha requerido. <br /><br />" + "Probablemente Ud. no ha aplicado un filtro y seleccionado información aún."; ErrMessage_Span.Style["display"] = "block"; context = null; return; } GeneralMessage_Span.InnerHtml = "Ok, el archivo de texto ha sido generado en forma satisfactoria. <br />" + "La cantidad de facturas que se han grabado al archivo es: " + cantidadLineas.ToString() + ". <br />" + "El nombre del archivo es: " + filePath + ".<br /><br />"; GeneralMessage_Span.Style["display"] = "block"; ObtencionArchivoRetencionesIva_DownloadFile_LinkButton.Visible = true; FileName_HiddenField.Value = filePath; return; }
private bool LibroCompras_ExportarMicrosoftExcel() { if (User.Identity == null || string.IsNullOrEmpty(User.Identity.Name)) { // un timeout podría hacer que el usuario no esté authenticado ... string errorMessage = "Ud. debe hacer un login en la aplicación antes de continuar. Por vaya a Home e intente hacer un login en la aplicación."; ErrMessage_Span.InnerHtml = errorMessage; ErrMessage_Span.Style["display"] = "block"; return(false); } BancosEntities context = new BancosEntities(); var query = context.tTempWebReport_ConsultaFacturas.Where("it.NombreUsuario == '" + User.Identity.Name + "'"); if (query.Count() == 0) { string errorMessage = "No existe información para mostrar el reporte " + "que Ud. ha requerido. <br /><br /> Probablemente Ud. no ha aplicado un " + "filtro y seleccionado información aún."; ErrMessage_Span.InnerHtml = errorMessage; ErrMessage_Span.Style["display"] = "block"; return(false); } // ----------------------------------------------------------------------------------------------------------------- // preparamos el documento Excel, para tratarlo con ClosedXML ... string fileName = System.Web.HttpContext.Current.Server.MapPath("~/Excel/LibroCompras.xlsx"); XLWorkbook wb; IXLWorksheet ws; try { wb = new XLWorkbook(fileName); ws = wb.Worksheet(1); } catch (Exception ex) { string errorMessage = ex.Message; if (ex.InnerException != null) { errorMessage += "<br />" + ex.InnerException.Message; } ErrMessage_Span.InnerHtml = errorMessage; ErrMessage_Span.Style["display"] = "block"; return(false); } var excelTable = ws.Table("Ventas"); // ----------------------------------------------------------------------------------------------------------------- int cantidadRows = 0; decimal ivaPorc = 0; decimal montoNoImponible = 0; decimal montoImponible = 0; decimal montoIva = 0; DateTime?fechaComprobanteRetencionIva = null; decimal montoRetencionImpuestosIva = 0; foreach (var factura in query.OrderBy(f => f.FechaRecepcion).ThenBy(f => f.NumeroFactura)) { cantidadRows++; excelTable.DataRange.LastRow().Field(0).SetValue(cantidadRows); excelTable.DataRange.LastRow().Field(1).SetValue(factura.FechaRecepcion); excelTable.DataRange.LastRow().Field(2).SetValue(factura.NombreCompania); excelTable.DataRange.LastRow().Field(3).SetValue(factura.RifCompania); if (factura.ImportacionFlag != null && factura.ImportacionFlag.Value) { // importaciones switch (factura.NcNdFlag) { case "NC": { excelTable.DataRange.LastRow().Field(9).SetValue(factura.NumeroFactura); excelTable.DataRange.LastRow().Field(10).SetValue(factura.NumeroFacturaAfectada); break; } case "ND": { excelTable.DataRange.LastRow().Field(8).SetValue(factura.NumeroFactura); break; } default: { excelTable.DataRange.LastRow().Field(4).SetValue(factura.NumeroFactura); break; } } } else { // compra nacional switch (factura.NcNdFlag) { case "NC": { excelTable.DataRange.LastRow().Field(7).SetValue(factura.NumeroFactura); excelTable.DataRange.LastRow().Field(10).SetValue(factura.NumeroFacturaAfectada); break; } case "ND": { excelTable.DataRange.LastRow().Field(6).SetValue(factura.NumeroFactura); break; } default: { excelTable.DataRange.LastRow().Field(4).SetValue(factura.NumeroFactura); break; } } } // calculamos el porcentaje de Iva, que no viene en el registro montoNoImponible = factura.MontoFacturaSinIva != null ? factura.MontoFacturaSinIva.Value : 0; montoImponible = factura.MontoFacturaConIva != null ? factura.MontoFacturaConIva.Value : 0; montoIva = factura.Iva != null ? factura.Iva.Value : 0; ivaPorc = 0; fechaComprobanteRetencionIva = null; montoRetencionImpuestosIva = factura.RetencionSobreIva != null ? factura.RetencionSobreIva.Value : 0; if (montoImponible != 0) { ivaPorc = Math.Round(montoIva * 100 / montoImponible, 2); } // para determinar la fecha de recepción del comprobante, tenemos que buscar en la tabla FacturasImpuestos; además, en FacturasImpuestos, // el registro cuyo correspondiente en ImpuestosRetencionesDefinicion tenga 1 en la columna Predefinido ... Facturas_Impuestos impuestoIva = context.Facturas_Impuestos.Where(i => i.FacturaID == factura.ClaveUnicaFactura). Where(i => i.ImpuestosRetencionesDefinicion.Predefinido == 1). FirstOrDefault(); if (impuestoIva != null) { fechaComprobanteRetencionIva = impuestoIva.FechaRecepcionPlanilla; } if (factura.ImportacionFlag != null && factura.ImportacionFlag.Value) { excelTable.DataRange.LastRow().Field(11).SetValue(montoImponible + montoIva); // gravadas excelTable.DataRange.LastRow().Field(12).SetValue(montoNoImponible); // exoneradas excelTable.DataRange.LastRow().Field(13).SetValue(montoImponible); // base imponible excelTable.DataRange.LastRow().Field(14).SetValue(ivaPorc); excelTable.DataRange.LastRow().Field(15).SetValue(montoIva); } else { excelTable.DataRange.LastRow().Field(16).SetValue(montoImponible + montoIva); // gravadas excelTable.DataRange.LastRow().Field(17).SetValue(montoNoImponible); // exoneradas excelTable.DataRange.LastRow().Field(18).SetValue(montoImponible); // base imponible excelTable.DataRange.LastRow().Field(19).SetValue(ivaPorc); excelTable.DataRange.LastRow().Field(20).SetValue(montoIva); } excelTable.DataRange.LastRow().Field(21).SetValue(factura.NumeroComprobante); excelTable.DataRange.LastRow().Field(22).SetValue(fechaComprobanteRetencionIva); excelTable.DataRange.LastRow().Field(23).SetValue(montoRetencionImpuestosIva); excelTable.DataRange.InsertRowsBelow(1); } // en el libro de ventas, asumimos que el usuario seleccionó una sola empresa (cia contab) y usamos el primer registro // de la lista de items seleccionados para obtenerla ... string nombreCiaContab = ""; string rifCiaContab = ""; string direccionCiaContab = ""; string periodoFechaInicial = this.Periodo_FechaInicial_TextBox.Text; string periodoFechaFinal = this.Periodo_FechaFinal_TextBox.Text; if (query.Count() > 0) { var factura = query.FirstOrDefault(); nombreCiaContab = factura.CiaContabNombre; rifCiaContab = factura.CiaContabRif; direccionCiaContab = factura.CiaContabDireccion; } ws.Cell("B2").Value = nombreCiaContab; ws.Cell("B3").Value = "Rif: " + rifCiaContab; ws.Cell("B4").Value = direccionCiaContab; ws.Cell("B6").Value = "Período: " + periodoFechaInicial + " al " + periodoFechaFinal; string userName = User.Identity.Name.Replace("@", "_").Replace(".", "_"); fileName = System.Web.HttpContext.Current.Server.MapPath("~/Excel/LibroCompras_" + userName + ".xlsx"); if (File.Exists(fileName)) { File.Delete(fileName); } try { wb.SaveAs(fileName); string errorMessage = "Ok, la función que exporta los datos a Microsoft Excel se ha ejecutado en forma satisfactoria.<br />" + "En total, se han agregado " + cantidadRows.ToString() + " registros a la tabla en el documento Excel.<br />" + "Ud. debe hacer un <em>click</em> en el botón que permite obtener (<em>download</em>) el documento Excel."; Session["ExcelDocument_FileName"] = fileName; GeneralMessage_Span.InnerHtml = errorMessage; GeneralMessage_Span.Style["display"] = "block"; } catch (Exception ex) { string errorMessage = ex.Message; if (ex.InnerException != null) { errorMessage += "<br />" + ex.InnerException.Message; } errorMessage += "Se producido un error mientras se ejecutaba el proceso. El mensaje específico del error es:<br />" + errorMessage; ErrMessage_Span.InnerHtml = errorMessage; ErrMessage_Span.Style["display"] = "block"; return(false); } return(true); }