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;
    }
Esempio n. 2
0
        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);
        }