/// <summary>
        /// Cargar los datos del pedido del cual se va a generar la remisión
        /// </summary>
        /// <param name="sFolioPedido"></param>
        private void CargaPedido(string sFolioPedido)
        {
            //Objeto que contiene el id del pedido 
            MedNeg.Pedidos.BlPedidos oblPedido = new MedNeg.Pedidos.BlPedidos();
            MedDAL.DAL.pedidos oPedido = new MedDAL.DAL.pedidos();
            oPedido = oblPedido.BuscarPedidoFolio(sFolioPedido);

            //Llenar los campos del pedido
            Session["sIdPedido"] = oPedido.idPedido;
            Session["sIdCliente"] = oPedido.idCliente;
            //txbFolio.Text = oPedido.Folio;
            //txbFecha.Text = oPedido.Fecha.ToShortDateString();


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

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

            //Lenar los datos de la partida del detalle
            oblPedido = new MedNeg.Pedidos.BlPedidos();

            //Recuperar la partida del pedido
            var oQuery = oblPedido.RecuperarPartidaPedido(oPedido.idPedido);

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

            Session["sTotalFactura"] = 0;
            //Recorrer el resultado y meterlo al datagridview
            foreach (MedDAL.DAL.pedidos_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();


        }
        /// <summary>
        /// Registrar nuevo pedido
        /// </summary>
        private void Nuevo()
        {

            string sRutaArchivoConfig=Server.MapPath("~/Archivos/Configuracion.xml");

            oPedido = new MedDAL.DAL.pedidos();
            oblPedido = new MedNeg.Pedidos.BlPedidos();
            if (Session["sIdCliente"] != null)
            {
                oPedido.idCliente = (int)Session["sIdCliente"];
                oPedido.Fecha = DateTime.Now;
                oPedido.Estatus = cmbEstatus.SelectedValue;

                //Validar Folio Repetido
                if (ValidaFolioRepetido())
                {

                    //Validar si se esta respetando el folio automatico y verificar si aun es el mismo o cambio su valor
                    if (Session["iFolioAutomatico"].Equals(txbFolio.Text))
                    {
                        oPedido.Folio = oblPedido.RecuperaFolioAutomatico(sRutaArchivoConfig).ToString();
                    }
                    else
                    {
                        oPedido.Folio = txbFolio.Text;
                    }

                    if (oblPedido.NuevoRegistro(oPedido))
                    {
                        //Datos de la bitacora
                        sDatosBitacora += "Folio:" + txbFolio.Text + " ";
                        sDatosBitacora += "Fecha:" + txbFecha.Text + " ";
                        sDatosBitacora += "Estatus:" + cmbEstatus.SelectedItem.ToString() + " ";
                        sDatosBitacora += "Cliente:" + txbCliente.Text + " ";

                        // Registrar la partida del pedido
                        oPedido = new MedDAL.DAL.pedidos();
                        oPedido = oblPedido.BuscarPedidoFolio(txbFolio.Text);
                        int iIdPedido = oPedido.idPedido;
                        bool bRegistroFallido = false;

                        //Recorrer el objeto de sesion lstDetallePartidaPedidos que contiene los datos de la partida
                        foreach (MedNeg.Facturas.BlDetallePartida pedidoDetalle in (List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartidaPedidos"])
                        {
                            //Saber si es un ensamble el que se esta registrando
                            if (pedidoDetalle.bEsEnsamble == true)
                            {
                                AgregarDetalleEnsamble(pedidoDetalle, oPedido.idPedido);
                            }
                            else
                            {
                                oblPedido = new MedNeg.Pedidos.BlPedidos();
                                MedDAL.DAL.pedidos_partida oPedidoPartida = new MedDAL.DAL.pedidos_partida();

                                oPedidoPartida.idPedido = iIdPedido;
                                oPedidoPartida.idProducto = pedidoDetalle.iIdProducto;
                                oPedidoPartida.Cantidad = pedidoDetalle.dCantidad;
                                oPedidoPartida.IEPS = pedidoDetalle.dIeps;
                                oPedidoPartida.Iva = pedidoDetalle.dIva;
                                oPedidoPartida.Precio = pedidoDetalle.dPrecio;
                                oPedidoPartida.Observaciones = pedidoDetalle.sObservaciones;
                                oPedidoPartida.Descripcion = pedidoDetalle.sProducto;

                                //Registrar el detalle del pedido
                                if (!oblPedido.NuevoDetallePartida(oPedidoPartida))
                                {
                                    bRegistroFallido = true;
                                }
                                else
                                {
                                    sDatosBitacora += "Producto:" + pedidoDetalle.iIdProducto.ToString() + " ";
                                    sDatosBitacora += "Cant:" + pedidoDetalle.dCantidad.ToString() + " ";
                                    sDatosBitacora += "IEPS:" + pedidoDetalle.dIeps.ToString() + " ";
                                    sDatosBitacora += "Iva:" + pedidoDetalle.dIva.ToString() + " ";
                                    sDatosBitacora += "Precio:" + pedidoDetalle.dPrecio.ToString() + " ";
                                    sDatosBitacora += "Total:" + Convert.ToDecimal((pedidoDetalle.dCantidad * pedidoDetalle.dPrecio) + pedidoDetalle.dIeps + pedidoDetalle.dIva) + ", ";
                                    sDatosBitacora += "Obs:" + pedidoDetalle.sObservaciones;                                    
                                }
                            }
                        }

                        //Si un registro de la partida se debe de eliminar todo
                        if (!bRegistroFallido)
                        {
                            oBitacora = new MedDAL.DAL.bitacora();
                            oblBitacora = new MedNeg.Bitacora.BlBitacora();
                            oBitacora.FechaEntradaSrv = DateTime.Now;
                            oBitacora.FechaEntradaCte = DateTime.Now;//Linea Temporal
                            oBitacora.Modulo = "Pedidos";
                            oBitacora.Usuario = Session["usuario"].ToString();
                            oBitacora.Nombre = Session["nombre"].ToString();
                            oBitacora.Accion = "Nuevo Pedido";
                            oBitacora.Descripcion = sDatosBitacora;
                            if (!oblBitacora.NuevoRegistro(oBitacora))
                            {
                                lblDatos.Text = "El evento no pudo ser registrado en la bitácora";
                            }

                            //Actualizar el consecutivo en la bitacora
                            oblPedido.ActualizarFolioPedido(sRutaArchivoConfig);
                            Session["sIdCliente"] = null;

                            //Proceso que mande reporte con los datos del pedido acabado de hacer. 
                            //Pedidos, Pedidos_Partida
                            //MostrarReporte(txbFolio.Text);
                        }
                        else
                        {
                            //Eliminar el pedido, su partida e indicar al usuario que lo intente de nuevo, limpiar la cadena de bitacora
                            Eliminar(iIdPedido);
                            sDatosBitacora = "";
                            lblDatos.Text = "No se pudo registrar el pedido, por favor verifique los datos y vuelva a intentarlo";

                        }
                    }
                    else //Fallo el registro del pedido
                    {
                        lblDatos.Text = "No se pudo registrar el pedido, por favor vuelva a intentarlo";
                    }

                }
                else  //si es folio repetido
                {
                    lblDatos.Text = "Folio Repetido, no se puede generar el pedido";

                }
            }
            else
            {
                lblDatos.Text = "Por favor, elija a un Cliente";
            }
        }
        /// <summary>
        /// Editar
        /// </summary>
        private void Editar()
        {
            oPedido = new MedDAL.DAL.pedidos();
            oblPedido = new MedNeg.Pedidos.BlPedidos();
            //oPedido.idPedido = int.Parse(dgvDatos.SelectedDataKey.Value.ToString());
            //oPedido.Estatus = cmbEstatus.SelectedValue.ToString();
            oPedido = oblPedido.BuscarPedidoFolio(txbFolio.Text);
            oPedido.Estatus = cmbEstatus.SelectedValue.ToString();


            if(oblPedido.EditarRegistro(oPedido))
            {

                //Datos de la bitacora
                string sDatosBitacora = string.Empty;
                sDatosBitacora += "Folio:" + txbFolio.Text + " ";
                sDatosBitacora += "Fecha:" + txbFecha.Text + " ";
                sDatosBitacora += "Estatus:" + cmbEstatus.SelectedItem.ToString() + " ";
                sDatosBitacora += "Cliente:" + txbCliente.Text + " ";
                    

                oblPedido = new MedNeg.Pedidos.BlPedidos();
                if (oblPedido.EliminarPedidoPartida(oPedido.idPedido))
                {
                    bool bRegistroFallido = false;

                    //Recorrer el objeto de sesion lstDetallePartidaPedidos que contiene los datos de la partida
                    foreach (MedNeg.Facturas.BlDetallePartida pedidoDetalle in (List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartidaPedidos"])
                    {
                        //Saber si es un ensamble el que se esta registrando
                        if (pedidoDetalle.bEsEnsamble == true)
                        {
                            AgregarDetalleEnsamble(pedidoDetalle, oPedido.idPedido);
                        }
                        else
                        {
                            oblPedido = new MedNeg.Pedidos.BlPedidos();
                            MedDAL.DAL.pedidos_partida oPedidoPartida = new MedDAL.DAL.pedidos_partida();

                            oPedidoPartida.idPedido = oPedido.idPedido;
                            oPedidoPartida.idProducto = pedidoDetalle.iIdProducto;
                            oPedidoPartida.Cantidad = pedidoDetalle.dCantidad;
                            oPedidoPartida.IEPS = pedidoDetalle.dIeps;
                            oPedidoPartida.Iva = pedidoDetalle.dIva;
                            oPedidoPartida.Precio = pedidoDetalle.dPrecio;
                            oPedidoPartida.Observaciones = pedidoDetalle.sObservaciones;

                            //Registrar el detalle del pedido
                            if (!oblPedido.NuevoDetallePartida(oPedidoPartida))
                            {
                                bRegistroFallido = true;
                            }
                            else
                            {
                                sDatosBitacora += "Producto:" + oPedidoPartida.idProducto.ToString() + " ";
                                sDatosBitacora += "Cant:" + pedidoDetalle.dCantidad.ToString() + " ";
                                sDatosBitacora += "IEPS:" + pedidoDetalle.dIeps.ToString() + " ";
                                sDatosBitacora += "Iva:" + pedidoDetalle.dIva.ToString() + " ";
                                sDatosBitacora += "Precio:" + pedidoDetalle.dPrecio.ToString() + " ";
                                sDatosBitacora += "Total:" + Convert.ToDecimal((pedidoDetalle.dCantidad * pedidoDetalle.dPrecio) + pedidoDetalle.dIeps + pedidoDetalle.dIva) + ", ";
                                sDatosBitacora += "Obs." + pedidoDetalle.sObservaciones;
                            }
                        }
                    }


                    //Anotar en la bitacora la modificación al pedido
                    //lblAviso.Text = "El usuario se ha registrado con éxito";
                    oBitacora = new MedDAL.DAL.bitacora();
                    oblBitacora = new MedNeg.Bitacora.BlBitacora();
                    oBitacora.FechaEntradaSrv = DateTime.Now;
                    oBitacora.FechaEntradaCte = DateTime.Now;//Linea Temporal
                    oBitacora.Modulo = "Pedidos";
                    oBitacora.Usuario = Session["usuario"].ToString();
                    oBitacora.Nombre = Session["nombre"].ToString();
                    oBitacora.Accion = "Edición de Pedido";
                    oBitacora.Descripcion = sDatosBitacora;
                    if (!oblBitacora.NuevoRegistro(oBitacora))
                    {
                        lblDatos.Text = "El evento no pudo ser registrado en la bitácora";
                    }
                }


            }

        }
        /// <summary>
        /// Cargar los datos del pedido del cual se va a generar la remisión
        /// </summary>
        /// <param name="sFolioPedido"></param>
        private void CargaPedido(string sFolioPedido)
        {
            //Objeto que contiene el id del pedido 
            MedNeg.Pedidos.BlPedidos oblPedido = new MedNeg.Pedidos.BlPedidos();
            MedDAL.DAL.pedidos oPedido = new MedDAL.DAL.pedidos();
            oPedido = oblPedido.BuscarPedidoFolio(sFolioPedido);

            //Llenar los campos del pedido
            Session["sIdPedido"] = oPedido.idPedido;
            Session["sIdCliente"] = oPedido.idCliente;
            //txbFolio.Text = oPedido.Folio;
            //txbFecha.Text = oPedido.Fecha.ToShortDateString();


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

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

            //Lenar los datos de la partida del detalle
            oblPedido = new MedNeg.Pedidos.BlPedidos();

            //Recuperar la partida del pedido
            List<MedDAL.DAL.pedidos_partida> oQuery = new List<MedDAL.DAL.pedidos_partida>();
            oQuery.AddRange(oblPedido.RecuperarPartidaPedido(oPedido.idPedido));
            
            //Session["lstDetallePartida"] = new List<MedNeg.Facturas.BlDetallePartida>();
            if (((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Count()>0)
            {
                ((List<MedNeg.Facturas.BlDetallePartida>)Session["lstDetallePartida"]).Clear();
            }

            Session["sTotalFactura"] = 0;

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


            //Recorrer el resultado y meterlo al datagridview
            foreach (MedDAL.DAL.pedidos_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);

                ((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();


        }