// GET: PreparacionBarro/Details/5
        public ActionResult Details(int id)
        {
            ViewBag.Loc = (int)HttpContext.Application["Locacion"];
            PreparacionBarro PreBar = tsvc.detallePreparacionBarro(id);

            return(View(PreBar));
        }
 //Metodos
 public void getPreparacionBarro(PreparacionBarro pPB)
 {
     this.Id = pPB.Id;
     this.FechaPreparacion  = pPB.FechaPreparacion;
     this.NumPreparado      = pPB.NumPreparado;
     this.BarroNegro        = pPB.BarroNegro;
     this.BarroBlanco       = pPB.BarroBlanco;
     this.Recuperado        = pPB.Recuperado;
     this.EnPiedra          = pPB.EnPiedra;
     this.TiempoAgitacion   = pPB.TiempoAgitacion;
     this.NumTambos         = pPB.NumTambos;
     this.DesperdicioMojado = pPB.DesperdicioMojado;
     this.Comentario        = pPB.Comentario;
     this.Estado            = pPB.Estado;
     this.Locacion          = pPB.Locacion;
 }
        public ActionResult Create(PreparacionBarroConsumo pPreBar)
        {
            ViewBag.Loc = (int)HttpContext.Application["Locacion"];
            if (ModelState.IsValid)
            {
                double?tmpBarNeg = pPreBar.BarroNegro;
                double?SumBN     = pPreBar.lstConsumoBarroNegro.Select(x => new { TotalSolicitado = x.Capacidad * x.BarroUsado }).Sum(x => x.TotalSolicitado);
                double?SumBB     = pPreBar.lstConsumoBarroBlanco.Select(x => new { TotalSolicitado = x.Capacidad * x.BarroUsado }).Sum(x => x.TotalSolicitado);

                List <BarroMovimientos> lst = new List <BarroMovimientos>();
                pPreBar.Estado = "Disponible";
                PreparacionBarro PB = new PreparacionBarro()
                {
                    Id = pPreBar.Id,
                    FechaPreparacion  = pPreBar.FechaPreparacion,
                    NumPreparado      = pPreBar.NumPreparado,
                    BarroNegro        = pPreBar.BarroNegro,
                    BarroBlanco       = pPreBar.BarroBlanco,
                    Recuperado        = pPreBar.Recuperado,
                    EnPiedra          = pPreBar.EnPiedra,
                    TiempoAgitacion   = pPreBar.TiempoAgitacion,
                    NumTambos         = pPreBar.NumTambos,
                    DesperdicioMojado = pPreBar.DesperdicioMojado,
                    Comentario        = pPreBar.Comentario,
                    Estado            = pPreBar.Estado,
                    Locacion          = pPreBar.Locacion,
                    Editor            = User.Identity.Name,
                    FechaEdicion      = DateTime.Now
                };

                //Si las recercas asignadas para cubrir el barro Negro solicitado son mayores, se cubre el pedido, en caso contrario se solicita asignar mas recervas.
                if (pPreBar.BarroNegro <= SumBN)
                {
                    //Si las recercas asignadas para cubrir el barro Blanco solicitado son mayores, se cubre el pedido, en caso contrario se solicita asignar mas recervas.
                    if (pPreBar.BarroBlanco <= SumBB)
                    {
                        int idPreparacion = tsvc.addPreparacionBarro(PB);
                        if (idPreparacion != -1)
                        {
                            var lstBarMovNegro = calculaBarroMovimientos(pPreBar.lstConsumoBarroNegro, (int)pPreBar.BarroNegro, PB, idPreparacion);
                            lst.AddRange(lstBarMovNegro);

                            var lstBarMovBlanco = calculaBarroMovimientos(pPreBar.lstConsumoBarroBlanco, (int)pPreBar.BarroBlanco, PB, idPreparacion);
                            lst.AddRange(lstBarMovBlanco);

                            List <BarroMovimientos> lstVariaciones = calculaBarroMovimientosVariaciones(PB, idPreparacion);

                            //Por ultimo se registran los movimientos en BD.
                            int res2 = tsvc.addMovimientosBarro(lst);
                            if (res2 > 0)
                            {
                                if (lstVariaciones.Count > 0)
                                {
                                    int res3 = tsvc.addMovimientosBarro(lstVariaciones);
                                    if (res3 > 0)
                                    {
                                        return(RedirectToAction("Index", new { pLoc = ViewBag.Loc }));
                                    }
                                }
                                else
                                {
                                    return(RedirectToAction("Index", new { pLoc = ViewBag.Loc }));
                                }
                            }
                        }
                        else
                        {
                            ViewBag.txtMensaje = "No se pudo crear la preparación, vuelva a intentarlo más tarde.";
                        }
                    }
                    else //Como las recervas son menores al barro solicitado, se pide una cantidad mayor de recervas.
                    {
                        ViewBag.txtMensaje = "Es necesario que asignes reservas de barro blanco mayores que el barro blanco solicitado para la preparación.";
                    }
                }
                else //Como las recervas son menores al barro solicitado, se pide una cantidad mayor de recervas.
                {
                    ViewBag.txtMensaje = "Es necesario que asignes reservas de barro mayores que el barro negro solicitado para la preparación.";
                }
            }

            List <ReservaBarro> lstReservas = tsvc.getReservasFrom((int)pPreBar.Locacion);

            ViewBag.lstLuz        = lstReservas;
            ViewBag.lstLocaciones = tsvc.obtenerSucursales(ViewBag.Loc);
            return(View(pPreBar));
        }
        // GET: PreparacionBarro/Delete/5
        public ActionResult Delete(int id)
        {
            PreparacionBarro PreBar = tsvc.detallePreparacionBarro(id);

            return(View(PreBar));
        }
        public List <BarroMovimientos> calculaBarroMovimientosVariaciones(PreparacionBarro pPB, int idPreparacion)
        {
            List <BarroMovimientos> tmpPB = new List <BarroMovimientos>();

            if (!string.IsNullOrEmpty(pPB.EnPiedra))
            {
                tmpPB.Add(new BarroMovimientos()
                {
                    CodigoProducto      = "B1",
                    FechaMovimiento     = DateTime.Now,
                    TipoMovimiento      = "Eg",
                    Unidades            = Double.Parse(pPB.EnPiedra),
                    Locacion            = pPB.Locacion,
                    PesoTotal           = Double.Parse(pPB.EnPiedra),
                    OrigenTransferencia = idPreparacion,
                    OrigenTabla         = "PreparacionBarro",
                    OrigenVariacion     = "EnPiedra",
                    Editor       = pPB.Editor,
                    FechaEdicion = DateTime.Now
                });
            }

            //if (!string.IsNullOrEmpty(pPB.DesperdicioMojado))
            //{
            //    double tmpDesperdicio = double.Parse(pPB.DesperdicioMojado) / 2;
            //    tmpPB.Add(new BarroMovimientos()
            //    {
            //        CodigoProducto = "N1",
            //        FechaMovimiento = DateTime.Now,
            //        TipoMovimiento = "Eg",
            //        Unidades = tmpDesperdicio,
            //        Locacion = pPB.Locacion,
            //        PesoTotal = tmpDesperdicio,
            //        OrigenTransferencia = idPreparacion,
            //        OrigenTabla = "PreparacionBarro",
            //        OrigenVariacion = "DesperdicioMojado",
            //        Editor = pPB.Editor,
            //        FechaEdicion = DateTime.Now
            //    });
            //    tmpPB.Add(new BarroMovimientos()
            //    {
            //        CodigoProducto = "B1",
            //        FechaMovimiento = DateTime.Now,
            //        TipoMovimiento = "Eg",
            //        Unidades = tmpDesperdicio,
            //        Locacion = pPB.Locacion,
            //        PesoTotal = tmpDesperdicio,
            //        OrigenTransferencia = idPreparacion,
            //        OrigenTabla = "PreparacionBarro",
            //        OrigenVariacion = "DesperdicioMojado",
            //        Editor = pPB.Editor,
            //        FechaEdicion = DateTime.Now
            //    });
            //}

            //if (pPB.Recuperado != null || pPB.Recuperado != 0)
            //{
            //}

            return(tmpPB);
        }
        public List <BarroMovimientos> calculaBarroMovimientos(List <ReservaBarroPreparado> plstBarroReservaAsignado, double pBarroSolicitado, PreparacionBarro pPreBar, int idPreparacion)
        {
            List <BarroMovimientos> lst = new List <BarroMovimientos>();
            double?SumBN = plstBarroReservaAsignado.Select(x => new { TotalSolicitado = x.Capacidad * x.BarroUsado }).Sum(x => x.TotalSolicitado);

            //foreach (var item in pPreBar.lstConsumoBarroNegro.OrderBy(x => x.CodigoBarro))
            for (int a = 0; a < plstBarroReservaAsignado.Count; a++)
            {
                var item = plstBarroReservaAsignado[a];
                if (item.BarroUsado > 0)
                {
                    //En caso de ser a granel, se hace una resta directa
                    if (item.Capacidad == 1)
                    {
                        double TotalKgUsados = item.BarroUsado * (double)item.Capacidad;
                        pBarroSolicitado = pBarroSolicitado - TotalKgUsados;

                        //Se hace el egreso de barro a granel.
                        //Nota: en el barro a granel "NO" es nesario hacer un ingreso con el sobrante del barro asignado.
                        BarroMovimientos tmpMovB_egNegro = new BarroMovimientos()
                        {
                            CodigoProducto      = item.CodigoBarro,
                            FechaMovimiento     = DateTime.Today,
                            TipoMovimiento      = "Eg",
                            Unidades            = item.BarroUsado,
                            Locacion            = pPreBar.Locacion,
                            OrigenTransferencia = idPreparacion,
                            OrigenTabla         = "PreparacionBarro",
                            PesoTotal           = TotalKgUsados,
                            Editor       = pPreBar.Editor,
                            FechaEdicion = pPreBar.FechaEdicion
                        };
                        lst.Add(tmpMovB_egNegro);
                    }
                    else  //Para los paquete se va haciendo gradual la resta, para determinar cuantos paquetes son necesrios.
                    {
                        double empaquetadosNecesarios = 0;
                        double TotalKgUsados          = 0;
                        //Se ira sumando paquete a paquete hasta cubrir el barro solicitado o agotar las recervas asignadas(BarroUsado).
                        for (int i = 1; i <= item.BarroUsado; i++)
                        {
                            empaquetadosNecesarios = i;
                            pBarroSolicitado       = pBarroSolicitado - (double)item.Capacidad;
                            if (pBarroSolicitado <= 0)
                            {
                                break;
                            }
                        }
                        TotalKgUsados = empaquetadosNecesarios * (double)item.Capacidad;

                        //Se genera el egreso de estas empaquetados.
                        BarroMovimientos tmpMovB_egNegro = new BarroMovimientos()
                        {
                            CodigoProducto      = item.CodigoBarro,
                            FechaMovimiento     = DateTime.Today,
                            TipoMovimiento      = "Eg",
                            Unidades            = empaquetadosNecesarios,
                            Locacion            = pPreBar.Locacion,
                            OrigenTransferencia = idPreparacion,
                            OrigenTabla         = "PreparacionBarro",
                            PesoTotal           = TotalKgUsados,
                            Editor       = pPreBar.Editor,
                            FechaEdicion = pPreBar.FechaEdicion
                        };
                        lst.Add(tmpMovB_egNegro);

                        //Cuando tmpBarNegro es negativo y dado que estamos en un segmento validador de paquetes
                        //se asume que el restante es debido a que un paquete tubo que ser habierto para cubrir el barro solicitado
                        //por esta razon, el restante sera un ingreso a granel en barromovimientos para no peder el restante del paquete habierto.
                        if (pBarroSolicitado < 0)
                        {
                            BarroMovimientos tmpMovB_inNegro = new BarroMovimientos()
                            {
                                CodigoProducto      = tsvc.obtenerCodigoDeProducto(item.Tipo, 1),
                                FechaMovimiento     = DateTime.Now,
                                TipoMovimiento      = "In",
                                Unidades            = pBarroSolicitado * -1,
                                Locacion            = pPreBar.Locacion,
                                OrigenTransferencia = idPreparacion,
                                OrigenTabla         = "PreparacionBarro",
                                PesoTotal           = pBarroSolicitado * -1,
                                Editor       = pPreBar.Editor,
                                FechaEdicion = pPreBar.FechaEdicion
                            };
                            lst.Add(tmpMovB_inNegro);
                        }
                    }
                }
            }

            return(lst);
        }