public JsonResult PreencherCarrinho(Controller controller) { //Para simular uma possivel consulta no banco. no caso as Listas receberiam de um query, select.. etc var qntProdutosListadosBanco = ListaProduto.Count(); var qntFilais = ListaFiliais.Count(); //Os Ids de carrinho são gerados de 1 a 10000 pra diminuir a probabilidade de se repetir. var idItemCarrinho = RandomNumber(1, 10000); //Uma verificacao caso seja igual. Como não tem um banco de dados que trave isto por Id, dessa forma diminuo a probabilidade //de dar errado ao quadrado if (ListaCarrinho.Any(a => a.Id == idItemCarrinho)) { idItemCarrinho = RandomNumber(1, 10000); } var idProduto = RandomNumber(1, qntProdutosListadosBanco); var idFilial = RandomNumber(1, qntFilais); var produto = ListaProduto.FirstOrDefault(p => p.Id == idProduto); var itemEstoque = Estoque.FirstOrDefault(x => x.IdProduto == idProduto && x.IdFilial == idFilial); if (itemEstoque.Disponibilidade) { var itemCarrinho = new Carrinho { Id = idItemCarrinho, IdProduto = idProduto, QntComprada = RandomNumber(1, itemEstoque.QntProduto), IdFilial = idFilial }; ListaCarrinho.Add(itemCarrinho); var buscarItemEstoque = Estoque.Where(u => u.Id == itemEstoque.Id && u.IdProduto == produto.Id && u.IdFilial == idFilial); //para facilitar o codigo será considerado o estoque será considerado como se fosse uma prateleira apenas e a medida que o cliente pega o item, //o mesmo é decrementado da quantidade do estoque. foreach (var itemDoEstoque in buscarItemEstoque) { //verificaçao de segurança para que não permitam que sejam "comprados" mais itens do que existam if (itemEstoque.QntProduto >= itemCarrinho.QntComprada) { // subtrai do total do estoque itemDoEstoque.QntProduto = itemEstoque.QntProduto - itemCarrinho.QntComprada; //caso sejam compradas todas as unidades, o produto vira indisponivel if (itemDoEstoque.QntProduto == 0) { itemEstoque.Disponibilidade = false; } var buscarFilial = ListaFiliais.FirstOrDefault(f => f.Id == idFilial); itemEstoque = new FilialEstoque { Id = itemEstoque.Id, IdFilial = itemEstoque.IdFilial, IdProduto = produto.Id, QntProduto = itemDoEstoque.QntProduto, Disponibilidade = itemDoEstoque.QntProduto != 0, NomeFilial = buscarFilial.Nome, NomeProduto = produto.Nome }; EstoqueAtualizado.Add(itemEstoque); } else { var mensagem = "O produto " + $"{produto.Nome}" + " não possui a quantidade escolhida"; controller.ModelState.AddModelError(nameof(Mensagem), mensagem); } var qntEstoqueTeste = Estoque.FirstOrDefault(x => x.IdProduto == idProduto && x.IdFilial == idFilial).QntProduto; } } return(null); }