protected void UiVistaEncabezado_CustomCallback(object sender, DevExpress.Web.ASPxGridViewCustomCallbackEventArgs e)
        {
            if (!ValidarConexionYUsuarioLogueado(sender))
            {
                return;
            }
            try
            {
                switch (e.Parameters.Split('|')[0])
                {
                case "ExpandirGrupoVistaGeneral":
                    UiVistaEncabezado.ExpandAll();
                    break;

                case "ContraerGrupoVistaGeneral":
                    UiVistaEncabezado.CollapseAll();
                    break;

                case "ObtenerEncabezados":
                    ObtenerEncabezado(sender);
                    break;

                case "ObteneMarcador":
                    ObtenerFacturaParaMarcador(sender, int.Parse(e.Parameters.Split('|')[1]));
                    break;
                }
            }
            catch (Exception ex)
            {
                EstablecerError(ex.Message, sender);
            }
        }
 protected void Page_Load(object sender, EventArgs e)
 {
     if (!ValidarConexionYUsuarioLogueado(sender))
     {
         return;
     }
     if (Session["UiVistaEncabezadoFacturaPorSku"] != null)
     {
         UiVistaEncabezado.DataSource = Session["UiVistaEncabezadoFacturaPorSku"];
         UiVistaEncabezado.DataBind();
         GenerarReporteVistaGeneral();
     }
 }
        protected void UiMenuEncabezado_ItemClick(object source, DevExpress.Web.MenuItemEventArgs e)
        {
            if (!ValidarConexionYUsuarioLogueado(source))
            {
                return;
            }
            try
            {
                switch (e.Item.Name)
                {
                case "UiBotonGenerarExcelVistaGeneral":
                    UiExportarVista.WriteXlsxToResponse();
                    break;

                case "UiBotonGenerarReporteVistaGeneral":
                    UiVistaEncabezado.ExpandAll();
                    UiPopupReporteVistaGeneral.ShowOnPageLoad = true;
                    break;

                case "UiBotonExportarAXml":
                    if (NoExistenDatosDeFacturas())
                    {
                        throw new Exception(
                                  "No tiene datos de facturas para procesar, por favor, verifique y vuelva a intentar.");
                    }

                    GenerarReporteDeFacturasEnFormatoXml();
                    break;
                }
            }
            catch (Exception ex)
            {
                ScriptManager.RegisterStartupScript(this, GetType(), "ErrorText",
                                                    "CallError('Error: " + ex.Message + "');", true);
            }
        }
        /// <summary>
        /// Metodo que recorre las facturas y genera el reporte de las mismas en formato XML
        /// </summary>
        public void GenerarReporteDeFacturasEnFormatoXml()
        {
            UiVistaEncabezado.ExpandAll();

            var listaFacturasVisibles = new List <FacturaDetalle>();

            for (var i = 0; i < UiVistaEncabezado.VisibleRowCount; i++)
            {
                if (UiVistaEncabezado.IsGroupRow(i))
                {
                    continue;
                }
                var fila = (FacturaDetalle)UiVistaEncabezado.GetRow(i);
                if (fila != null)
                {
                    listaFacturasVisibles.Add(fila);
                }
            }

            var listaFacturasAgrupadas = listaFacturasVisibles.GroupBy(factura => factura.ID).Select(grupoFactura => grupoFactura.First()).ToList();

            var listaDeFacturasParaReporte = listaFacturasAgrupadas.Select(factura => new FacturaEncabezado
            {
                ID = factura.ID
                ,
                INVOICE_ID = factura.INVOICE_ID
                ,
                CDF_RESOLUCION = factura.CDF_RESOLUCION
                ,
                CDF_SERIE = factura.CDF_SERIE
                ,
                CLIENT_ID = factura.CLIENT_ID
                ,
                CDF_NOMBRECLIENTE = factura.CDF_NOMBRECLIENTE
                ,
                POSTED_DATETIME = factura.POSTED_DATETIME
                ,
                PAY_DEAL = factura.PAY_DEAL
                ,
                CODE_CUSTOMER_ALTERNATE = factura.CODE_CUSTOMER_ALTERNATE
                ,
                Detalle = FacturaDetalles.Where(detalleDeFactura => detalleDeFactura.ID.Equals(factura.ID)).ToList()
            }).ToList();

            MarcarFacturasQueGeneraronXml?.Invoke(UiVistaEncabezado, new FacturaArgumento {
                ListaDeFacturasEncabezado = listaDeFacturasParaReporte, FechaInicial = UiFechaIncio.Date, FechaFinal = UiFechaFinal.Date, Login = Session["LOGIN"].ToString()
            });

            UiVistaEncabezado.JSProperties.Add("cpRecargarGrid", "Enabled");

            var documentoXml = new XDocument(new XDeclaration("1.0", "iso-8859-1", null));
            var nodoRaiz     = new XElement("invoices");

            documentoXml.Add(nodoRaiz);
            foreach (var facturaParaXml in listaDeFacturasParaReporte)
            {
                var nodoFactura = new XElement("invoice");
                nodoFactura.Add(new XElement("id", facturaParaXml.INVOICE_ID));
                nodoFactura.Add(new XElement("OfficialSerNr", facturaParaXml.CDF_RESOLUCION));
                nodoFactura.Add(new XElement("CustCode", facturaParaXml.CODE_CUSTOMER_ALTERNATE));
                nodoFactura.Add(new XElement("CustName", facturaParaXml.CDF_NOMBRECLIENTE));
                nodoFactura.Add(new XElement("TransDate", Convert.ToDateTime(facturaParaXml.POSTED_DATETIME.ToString()).Date.ToString("dd/MM/yyyy")));
                nodoFactura.Add(new XElement("PayDeal", facturaParaXml.PAY_DEAL));
                var nodoDetalleDeFactura = new XElement("items");
                for (var i = 0; i < facturaParaXml.Detalle.Count; i++)
                {
                    var detalleDeFactura          = facturaParaXml.Detalle[i];
                    var nodoSkuDeDetalleDeFactura = new XElement("item_line");
                    nodoSkuDeDetalleDeFactura.Add(new XElement("id", i));
                    nodoSkuDeDetalleDeFactura.Add(new XElement("ArtCode", detalleDeFactura.ART_CODE));
                    nodoSkuDeDetalleDeFactura.Add(new XElement("Spec", detalleDeFactura.DESCRIPTION_SKU));
                    nodoSkuDeDetalleDeFactura.Add(new XElement("Quant", detalleDeFactura.QTY));
                    nodoSkuDeDetalleDeFactura.Add(new XElement("Price", detalleDeFactura.PRICE));
                    nodoSkuDeDetalleDeFactura.Add(new XElement("VATCode", detalleDeFactura.VAT_CODE));
                    nodoSkuDeDetalleDeFactura.Add(new XElement("Sum", detalleDeFactura.TOTAL_LINE));
                    nodoSkuDeDetalleDeFactura.Add(new XElement("SerialNr", detalleDeFactura.SERIAL_NR));
                    nodoDetalleDeFactura.Add(nodoSkuDeDetalleDeFactura);
                }
                nodoFactura.Add(nodoDetalleDeFactura);
                nodoRaiz.Add(nodoFactura);
            }

            var carpetaParaAlmacenarDocumentoXml = $"{AppDomain.CurrentDomain.BaseDirectory}/App_Data/UploadTemp/";
            var fechaDeCreacionDeDocumento       = DateTime.Now.ToString("u").Replace(':', '.').Replace('Z', ' ');
            var nombreDeArchivo = $"ReporteDeFacturas {fechaDeCreacionDeDocumento} {Session["LOGIN"]}.xml";
            var rutaCompletaDeGuardadoDeArchivo = Path.Combine(carpetaParaAlmacenarDocumentoXml, nombreDeArchivo);

            documentoXml.Save(rutaCompletaDeGuardadoDeArchivo);

            var response = System.Web.HttpContext.Current.Response;

            response.ClearContent();
            response.Clear();
            response.ContentType = "application/xml";
            response.AddHeader("Content-Disposition", $"attachment; filename={nombreDeArchivo};");
            response.TransmitFile(rutaCompletaDeGuardadoDeArchivo);
            response.Flush();
            response.End();
        }