private void Eliminar(int iIdFactura)
        {

            //Eliminar primero la partida para la integridad referencial
            oblFacturas = new MedNeg.Facturas.BlFacturas();
            string sDatosBitacora = string.Empty;

            //Guardar los datos del pedido para la bitacora
            oFactura = new MedDAL.DAL.facturas();
            oFactura = oblFacturas.BuscarFactura(iIdFactura);

            sDatosBitacora += "Folio:" + oFactura.Folio.ToString() + " ";
            sDatosBitacora += "Fecha:" + oFactura.Fecha.ToShortDateString() + " ";
            switch (oFactura.Estatus)
            {
                case "1":
                    sDatosBitacora += "Estatus:Pedido ";
                    break;
                case "2":
                    sDatosBitacora += "Estatus:Remitido ";
                    break;
                case "3":
                    sDatosBitacora += "Estatus:Emitida ";
                    break;
                case "4":
                    sDatosBitacora += "Estatus:Cobrada ";
                    break;
                case "5":
                    sDatosBitacora += "Estatus:Cancelada ";
                    break;
            }

            //Recuperar la partida del pedido
            oblFacturas = new MedNeg.Facturas.BlFacturas();
            var oQuery = oblFacturas.RecuperarPartidaFactura(iIdFactura);
            //Recorrer el resultado y meterlo al datagridview
            foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
            {
                sDatosBitacora += "Producto:" + oDetalle.productos.Nombre.ToString() + " ";
                sDatosBitacora += "Cantidad:" + oDetalle.Cantidad.ToString() + " ";
                sDatosBitacora += "IEPS:" + oDetalle.IEPS.ToString() + " ";
                sDatosBitacora += "Iva:" + oDetalle.Iva.ToString() + " ";
                sDatosBitacora += "Precio:" + oDetalle.Precio.ToString() + " ";
                sDatosBitacora += "Total:" + Convert.ToDecimal((oDetalle.Cantidad * oDetalle.Precio) + oDetalle.IEPS + oDetalle.Iva) + ", ";

            }


            if (oblFacturas.EliminarFacturaPartida(iIdFactura))
            {
                oblFacturas = new MedNeg.Facturas.BlFacturas();
                if (oblFacturas.EliminarRegistro(iIdFactura))
                {
                    //lblAviso.Text = "El usuario se ha eliminado con éxito";
                    MedDAL.DAL.bitacora oBitacora = new MedDAL.DAL.bitacora();
                    MedNeg.Bitacora.BlBitacora oblBitacora = new MedNeg.Bitacora.BlBitacora();
                    oBitacora.FechaEntradaSrv = DateTime.Now;
                    oBitacora.FechaEntradaCte = DateTime.Now;//Linea Temporal
                    oBitacora.Modulo = "Facturas";
                    oBitacora.Usuario = Session["usuario"].ToString();
                    oBitacora.Nombre = Session["nombre"].ToString();
                    oBitacora.Accion = "Eliminación de Factura";
                    oBitacora.Descripcion = sDatosBitacora;

                    if (!oblBitacora.NuevoRegistro(oBitacora))
                    {
                        lblDatos.Text = "El evento no pudo ser registrado en la bitácora";
                    }
                }
                else
                {
                    //lblAviso.Text = "El usuario no pudo ser eliminado, es posible que tenga datos relacionados";
                }

            }
            else
            {
                //lblAviso.Text = "El usuario no pudo ser eliminado, es posible que tenga datos relacionados";
            }

        }
        /// <summary>
        /// Cargar los datos del pedido y su partida
        /// </summary>
        /// <param name="bDatos"></param>
        protected void CargarFormulario(bool bDatos)
        {
            pnlFormulario.Visible = true;
            pnlCatalogo.Visible = false;

            if (bDatos)
            {

                //Objeto que contiene el id del pedido 
                oblFacturas = new MedNeg.Facturas.BlFacturas();
                oFactura = new MedDAL.DAL.facturas();
                oFactura = (MedDAL.DAL.facturas)oblFacturas.BuscarFactura(int.Parse(dgvDatos.SelectedDataKey[0].ToString()));

                //Llenar los campos del pedido
                txbFolio.Text = oFactura.Folio;
                txbFecha.Text = oFactura.Fecha.ToShortDateString();
                int iContador = 0;
                cmbEstatus.SelectedIndex = -1;
                foreach (ListItem elemento in cmbEstatus.Items)
                {
                    if (elemento.Value.Equals(oFactura.Estatus.ToString()))
                    {
                        elemento.Selected = true;
                    }
                    iContador++;
                }

                cmbTipoFactura.SelectedIndex = -1;
                iContador = 0;
                foreach (ListItem elemento in cmbTipoFactura.Items)
                {
                    if (elemento.Value.Equals(oFactura.TipoFactura.ToString()))
                    {
                        elemento.Selected = true;
                    }
                    iContador++;
                }

                //Llenar los campos del cliente
                txbCliente.Text = oFactura.clientes.Nombre + " " + oFactura.clientes.Apellidos;
                txbDireccion.Text = oFactura.clientes.Calle + " " + oFactura.clientes.NumeroExt;
                if (oFactura.clientes.NumeroInt != null)
                {
                    txbDireccion.Text += "Int: " + oFactura.clientes.NumeroInt;
                }

                txbPoblacion.Text = oFactura.clientes.poblaciones.Nombre.ToString() + ", " + oFactura.clientes.municipios.Nombre.ToString() + ", " + oFactura.clientes.estados.Nombre.ToString();

                //Lenar los datos de la partida del detalle
                oblFacturas = new MedNeg.Facturas.BlFacturas();

                //Recuperar la partida del pedido
                var oQuery = oblFacturas.RecuperarPartidaFactura(oFactura.idFactura);

                //Session["lstDetallePartida"] = new List<MedNeg.Facturas.BlDetallePartida>();
                if (((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Count() > 0)
                {
                    ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Clear();
                }

                //Recorrer el resultado y meterlo al datagridview
                Session["sTotalFactura"] = 0;
                foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
                {
                    oblDetallePartida = new MedNeg.Facturas.BlDetallePartida(
                        Convert.ToInt32(oDetalle.idProducto),
                        oDetalle.productos.Clave1,
                        oDetalle.productos.Nombre,
                        oDetalle.Cantidad,
                        Convert.ToDecimal(oDetalle.IEPS),
                        Convert.ToDecimal(oDetalle.Iva),
                        Convert.ToDecimal(oDetalle.Precio),
                        oDetalle.Observaciones,
                        Convert.ToDecimal((oDetalle.Precio * oDetalle.Cantidad) + oDetalle.IEPS + oDetalle.Iva));

                    ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Add(oblDetallePartida);
                    Session["sTotalFactura"] = Convert.ToDecimal(Session["sTotalFactura"]) + Convert.ToDecimal((oDetalle.Precio * oDetalle.Cantidad) + oDetalle.IEPS + oDetalle.Iva);
                }

                //Hacer el binding de la data al dgvDatos
                lblTotal.Text = "TOTAL:$" + Session["sTotalFactura"].ToString();
                dgvPartidaDetalle.DataBind();

                ////si el estatus es 1 (Pedido) aun se pueden agregar articulos de lo contario ya no
                //if (oFactura.Estatus == "3")
                //{
                //    HabilitaRemision();
                //    Deshabilita();
                //}
                //else
                //{
                    DeshabilitaRemision();
                    Deshabilita();
                    //cmbEstatus.Enabled = true;
                //}


            }
            else
            {

                //Limpia();
                //Deshabilita();

            }
        }
        private void Reimprimir(int iIdFactura)
        {
            oblFacturas = new MedNeg.Facturas.BlFacturas();
            oFactura = new MedDAL.DAL.facturas();
            oFactura = oblFacturas.BuscarFactura(iIdFactura);

            if (System.IO.File.Exists(Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".zip")))
            {
                System.IO.FileInfo fFactura = new System.IO.FileInfo(Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".zip"));

                Response.Clear();
                Response.AddHeader("Content-Disposition", "attachment; filename=" + fFactura.Name);
                Response.AddHeader("Content-Length", fFactura.Length.ToString());
                Response.ContentType = "application/....";
                Response.WriteFile(fFactura.FullName);
                Response.End();
            }
            else
            {
                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(5);", true);
            }
        }
        public bool Timbrar(int iIdFactura)
        {
            string sRutaCertificados = Server.MapPath("~/Archivos/");

            oblFacturas = new MedNeg.Facturas.BlFacturas();
            MedDAL.DAL.facturas oDALFacturas = new MedDAL.DAL.facturas();
            string sDatosBitacora = string.Empty;

            oFactura = new MedDAL.DAL.facturas();
            oFactura = oblFacturas.BuscarFactura(iIdFactura);

            int iResultado = oblFacturas.GenerarFacturaElectronica(iIdFactura, sRutaCertificados, Session["usuario"].ToString(), oFactura.idCliente, oFactura.Folio);

            if (iResultado == 0)
            {
                oblFacturas.CrearZip(new string[] { Server.MapPath("~/Archivos/FacturasElectronicasTimbradas"), Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".zip") }, Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".xml"), Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".pdf"));

                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(0);", true);

                System.IO.FileInfo fFactura = new System.IO.FileInfo(Server.MapPath("~/Archivos/FacturasElectronicasTimbradas/FacturaE-" + oFactura.Folio + ".zip"));

                Response.Clear();
                Response.AddHeader("Content-Disposition", "attachment; filename=" + fFactura.Name);
                Response.AddHeader("Content-Length", fFactura.Length.ToString());
                Response.ContentType = "application/....";
                Response.WriteFile(fFactura.FullName);
                Response.End();

            }
            else if (iResultado == 1)
            {
                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(1);", true);
            }
            else if (iResultado == 2)
            {
                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(2);", true);
            }
            else if (iResultado == 3)
            {
                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(3);", true);
            }
            else if (iResultado == 4)
            {
                ScriptManager.RegisterStartupScript(pnlFormulario, pnlFormulario.GetType(), "alertstock", "alertarFacturas(4);", true);
            }            

            return true;
        }
        /// <summary>
        /// Cargar los datos del pedido y su partida
        /// </summary>
        /// <param name="bDatos"></param>
        protected void CargarFormulario(bool bDatos)
        {
            pnlFormulario.Visible = true;
            pnlCatalogo.Visible = false;
            pnlFiltroReportes.Visible = false;

            if (bDatos)
            {

                //Objeto que contiene el id del pedido 
                oblFacturas = new MedNeg.Facturas.BlFacturas();
                oFactura = new MedDAL.DAL.facturas();
                oFactura = (MedDAL.DAL.facturas)oblFacturas.BuscarFactura(int.Parse(dgvDatos.SelectedDataKey[0].ToString()));
                
                //Llenar los campos de la factura
                txbFolio.Text = oFactura.Folio;

                if (oFactura.idPedido.Equals(null))
                    txbPedido.Text = "";
                else
                    txbPedido.Text = oFactura.pedidos.Folio.ToString();

                if (oFactura.idRemision.Equals(null))
                    txbRemision.Text = "";
                else
                    txbRemision.Text = oFactura.remisiones.Folio.ToString();

                if (oFactura.idReceta.Equals(null))
                    txbReceta.Text = "";
                else
                    txbReceta.Text = oFactura.recetas.Folio.ToString();

                txbFecha.Text = oFactura.Fecha.ToShortDateString();
                int iContador = 0;
                cmbEstatus.SelectedIndex = -1;
                foreach (ListItem elemento in cmbEstatus.Items)
                {
                    if (elemento.Value.Equals(oFactura.Estatus.ToString()))
                    {
                        elemento.Selected = true;
                    }
                    iContador++;
                }

                cmbTipoFactura.SelectedIndex = -1;
                iContador = 0;
                foreach (ListItem elemento in cmbTipoFactura.Items)
                {
                    if (elemento.Value.Equals(oFactura.TipoFactura.ToString()))
                    {
                        elemento.Selected = true;
                    }
                    iContador++;
                }
                
                //Llenar los campos del cliente
                txbCliente.Text = oFactura.clientes.Nombre + " " + oFactura.clientes.Apellidos;
                txbDireccion.Text = oFactura.clientes.Calle + " " + oFactura.clientes.NumeroExt;
                if (oFactura.clientes.NumeroInt != null)
                {
                    txbDireccion.Text += "Int: " + oFactura.clientes.NumeroInt;
                }

               txbPoblacion.Text = oFactura.clientes.poblaciones.Nombre.ToString() + ", " + oFactura.clientes.municipios.Nombre.ToString() +", " + oFactura.clientes.estados.Nombre.ToString();

               //Lenar los datos de la partida del detalle
               oblFacturas = new MedNeg.Facturas.BlFacturas();

               //Recuperar la partida del pedido
               List<MedDAL.DAL.facturas_partida> oQuery = new List<MedDAL.DAL.facturas_partida>();
               oQuery.AddRange(oblFacturas.RecuperarPartidaFactura(oFactura.idFactura));

               //Session["lstDetallePartida"] = new List<MedNeg.Facturas.BlDetallePartida>();
               if (((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Count() > 0)
               {
                   ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Clear();
               }
                
               //Recorrer el resultado y meterlo al datagridview
               Session["sTotalFactura"] = 0;

               //0087 Variables para gestionar la carga de datos del producto o del ensamble
               string sClave;
               string sNombre;
               bool bEsEnsamble;

               foreach (MedDAL.DAL.facturas_partida oDetalle in oQuery)
               {
                   //0087 Identificar si es un producto o un ensamble
                   if (oDetalle.idEnsamble.Equals(null))
                   {
                       //Datos del producto
                       sClave = oDetalle.productos.Clave1;
                       sNombre = oDetalle.productos.Nombre;
                       bEsEnsamble = false;
                   }
                   else
                   {
                       //Datos del ensamble
                       sClave = oDetalle.ensamble.ClaveBom;
                       sNombre = oDetalle.ensamble.Descripcion;
                       bEsEnsamble = true;
                   }

                   oblDetallePartida = new MedNeg.Facturas.BlDetallePartida(
                       Convert.ToInt32(oDetalle.idProducto),
                       //0087 Comentar para enviar las variables correspondientes que tienen la info del producto o ensamble
                       //oDetalle.productos.Clave1,
                       //oDetalle.productos.Nombre,
                       sClave,
                       sNombre,
                       oDetalle.Cantidad,
                       Convert.ToDecimal(oDetalle.IEPS),
                       Convert.ToDecimal(oDetalle.Iva),
                       Convert.ToDecimal(oDetalle.Precio),
                       oDetalle.Observaciones,
                       Convert.ToDecimal((oDetalle.Precio * oDetalle.Cantidad)+oDetalle.IEPS+oDetalle.Iva),
                       oDetalle.Descripcion,
                       bEsEnsamble //0087
                   );
                   

                     ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Add(oblDetallePartida);
                     Session["sTotalFactura"] = Convert.ToDecimal(Session["sTotalFactura"]) + Convert.ToDecimal((oDetalle.Precio * oDetalle.Cantidad) + oDetalle.IEPS + oDetalle.Iva);
               }
               
                //Hacer el binding de la data al dgvDatos
               lblTotal.Text = "TOTAL:$" + Session["sTotalFactura"].ToString();
               dgvPartidaDetalle.DataBind();

                //si el estatus es 1 (Pedido) aun se pueden agregar articulos de lo contario ya no
               if (oFactura.Estatus == "3")
               {
                   HabilitaRemision();
                   Deshabilita();
               }
               else
               {
                   DeshabilitaRemision();
                   Deshabilita();
               }


            }
            else
            {
                Session["lstDetallePartidaPedidos"] = new List<MedNeg.Facturas.BlDetallePartida>();
                dgvPartidaDetalle.DataSource = ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartidaPedidos"]);
                dgvPartidaDetalle.DataBind();
                //Limpia();
                //Deshabilita();

            }
        }