private void btnAceptar_Click(object sender, RoutedEventArgs e)
        {
            if (IsInteger(txtNumeroCaja.Text))
            {
                if (txtNombreCajero.Text.Trim() != "")
                {
                    //Agrego la caja en cuestion
                    var _db        = new LineaSupermercadoContext();
                    int numeroCaja = Convert.ToInt32(txtNumeroCaja.Text.ToString());

                    int cantCajas = _db.Cajas.Where(x => x.NumeroCaja == numeroCaja).Count();
                    if (cantCajas == 0)
                    {
                        Caja caja = new Caja();
                        caja.NumeroCaja = Convert.ToInt32(txtNumeroCaja.Text.ToString());
                        caja.Cajero     = txtNombreCajero.Text;
                        _db.Cajas.Add(caja);
                        _db.SaveChanges();
                        DialogResult = true;
                    }
                    else
                    {
                        MessageBox.Show("El numero de caja ya existe");
                    }
                }
                else
                {
                    MessageBox.Show("El nombre del cajero no puede estar vacio");
                }
            }
            else
            {
                MessageBox.Show("El numero de caja es incorrecto");
            }
        }
        private void btnAceptar_Click(object sender, RoutedEventArgs e)
        {
            if (txtNombreCliente.Text.Trim() != "")
            {
                var _db = new LineaSupermercadoContext();

                var cajaConMenosClientes = (from caj in _db.Cajas
                                            join ccli in _db.CajaCliente on caj.ID equals ccli.IDCaja into cli
                                            from ccli in cli.DefaultIfEmpty()
                                            select new { IDCaja = caj.ID, NumeroCaja = caj.NumeroCaja, ClientesSinAtender = (ccli == null) ? 0 : cli.Where(x => x.Estado == 0).Count() }

                                            ).GroupBy(x => new { x.IDCaja, x.NumeroCaja, x.ClientesSinAtender }).OrderBy(x => new { x.Key.ClientesSinAtender, x.Key.NumeroCaja }).First();
                //Creo el cliente
                Cliente cliente = new Cliente();
                cliente.Nombre = txtNombreCliente.Text;
                _db.Clientes.Add(cliente);

                //Lo agrego a la caja con menos clientes
                CajaCliente cajaCliente = new CajaCliente();
                cajaCliente.IDCliente = cliente.ID;
                cajaCliente.IDCaja    = cajaConMenosClientes.Key.IDCaja;
                cajaCliente.Orden     = _db.CajaCliente.Where(x => x.IDCaja == cajaConMenosClientes.Key.IDCaja).Select(x => x.Orden).DefaultIfEmpty(0).Max() + 1;
                _db.CajaCliente.Add(cajaCliente);
                _db.SaveChanges();

                DialogResult = true;
            }
            else
            {
                MessageBox.Show("El nombre del cliente no puede estar vacio");
            }
        }
 //Actualiza datagrid cajas
 private void RefreshDatagrid()
 {
     using (_db = new LineaSupermercadoContext())
     {
         var cajas = _db.Cajas.Include("Clientes").ToList();
         dgCajas.ItemsSource = cajas;
     }
 }
        //Ordena los clientes de una caja
        private void OrdernarCaja(int NumeroCaja)
        {
            _db = new LineaSupermercadoContext();
            List <CajaCliente> clientes = _db.Cajas.Include("Clientes").First(x => x.ID == NumeroCaja).Clientes.Where(x => x.Estado == 0).OrderBy(x => x.Orden).ToList();

            foreach (CajaCliente cajaCli in clientes)
            {
                cajaCli.Orden            = cajaCli.Orden - 1;
                _db.Entry(cajaCli).State = EntityState.Modified;
                _db.SaveChanges();
            }
        }
        //Desplaza clientes desde una caja hacia otra
        private void DesplazarClientes(int NumeroCajaAnt, int NumeroCajaNueva)
        {
            _db = new LineaSupermercadoContext();
            List <CajaCliente> clientes = _db.Cajas.Include("Clientes").First(x => x.ID == NumeroCajaAnt).Clientes.Where(x => x.Estado == 0).OrderBy(x => x.Orden).ToList();

            if (clientes.Count() > 0)
            {
                foreach (CajaCliente cajaCli in clientes)
                {
                    cajaCli.IDCaja = NumeroCajaNueva;
                    cajaCli.Orden  = _db.CajaCliente.Where(x => x.IDCaja == cajaCli.IDCaja).Select(x => x.Orden).DefaultIfEmpty(0).Max() + 1;
                    _db.Entry <CajaCliente>(cajaCli).State = EntityState.Modified;
                    _db.SaveChanges();
                }
            }
        }
        //Atiendo a un cliente
        private void btnAtenderCliente_Click(object sender, RoutedEventArgs e)
        {
            _db = new LineaSupermercadoContext();
            Caja c    = (Caja)((Button)e.Source).DataContext;
            Caja caja = _db.Cajas.Where(x => x.ID == c.ID).Include("Clientes").First();

            CajaCliente clienteAtendido = caja.Clientes.Where(x => x.Estado == 0).OrderBy(x => x.Orden).First();

            clienteAtendido.Estado           = 1;
            _db.Entry(clienteAtendido).State = EntityState.Modified;
            _db.SaveChanges();

            Cliente cliente = _db.Clientes.Find(clienteAtendido.IDCliente);

            MessageBox.Show("Atendiendo al cliente: " + cliente.Nombre);

            //Ordeno nuevamente el conjunto de clientes
            OrdernarCaja(caja.ID);

            //Actualizo cajas
            RefreshDatagrid();
        }
        //Cierra una caja
        private void btnCerrarCaja_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _db = new LineaSupermercadoContext();
                Caja caja            = (Caja)((Button)e.Source).DataContext;
                bool puedeCerrarCaja = false;

                //Objengo total de cajas abiertas
                int cajasAbiertas = _db.Cajas.Count();


                if (cajasAbiertas > 1)
                {
                    puedeCerrarCaja = true;
                }
                else
                {
                    Caja cajaAbierta = _db.Cajas.Include("Clientes").First();
                    if (cajaAbierta.ClientesPorAtender == 0)
                    {
                        puedeCerrarCaja = true;
                    }
                    else
                    {
                        MessageBox.Show("No se puede cerrar la unica caja abierta si posee clientes pendientes, debe atenderlos primero");
                    }
                }


                if (puedeCerrarCaja)
                {
                    //Si existe mas de una caja abierta debo desplazar clientes, sino es una unica caja sin clientes por atender
                    if (cajasAbiertas > 1)
                    {
                        //Obtengo la caja con menos clientes exceptuando la que voy a cerrar
                        var cajaConMenosClientes = (from caj in _db.Cajas
                                                    join ccli in _db.CajaCliente on caj.ID equals ccli.IDCaja into cli
                                                    from ccli in cli.DefaultIfEmpty()
                                                    where caj.ID != caja.ID
                                                    select new { IDCaja = caj.ID, NumeroCaja = caj.NumeroCaja, ClientesSinAtender = (ccli == null) ? 0 : cli.Where(x => x.Estado == 0).Count() }

                                                    ).GroupBy(x => new { x.IDCaja, x.NumeroCaja, x.ClientesSinAtender }).OrderBy(x => new { x.Key.ClientesSinAtender, x.Key.NumeroCaja }).First();

                        //Paso todos los clientes a la caja con menos clientes
                        DesplazarClientes(caja.ID, cajaConMenosClientes.Key.IDCaja);
                    }


                    //Borro la caja
                    Caja cajaDeleted = _db.Cajas.Find(caja.ID);
                    _db.Cajas.Remove(cajaDeleted);
                    _db.SaveChanges();

                    //Refresco datagrid
                    RefreshDatagrid();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }