public ActionResult Create([Bind(Include = "ID,DataCompra,InsumoID,MarcaID,FornecedorID,QtdeInicial,QtdeDisponivel,CustoMedio,CustoTotalInicial,Validade,_Insumo")] LoteInsumo loteInsumo) { if (ModelState.IsValid) { loteInsumo.QtdeDisponivel = loteInsumo.QtdeInicial; loteInsumo.CustoMedio = loteInsumo.CustoTotalInicial / loteInsumo.QtdeInicial; db.LotesInsumos.Add(loteInsumo); db.SaveChanges(); loteInsumo = db.LotesInsumos.Include(li => li._Insumo).Where(li => li.ID == loteInsumo.ID).FirstOrDefault(); // Incluir Movimentação Estoque Insumos MovimentacaoEstoqueInsumo movimentacaoEstoqueInsumo = new MovimentacaoEstoqueInsumo() { DataMovimentacao = loteInsumo.DataCompra, Qtde = loteInsumo.QtdeInicial, ValorMovimentacao = loteInsumo.CustoTotalInicial, LoteInsumoID = loteInsumo.ID }; MovimentacoesEstoqueInsumosController meic = new MovimentacoesEstoqueInsumosController(); if (meic.Create(movimentacaoEstoqueInsumo)) { // Incluir / Alterar Estoque Insumos EstoqueInsumosController eic = new EstoqueInsumosController(); var x = db.EstoqueInsumos.Where(ei => ei._Insumo.Nome.Equals(loteInsumo._Insumo.Nome)).FirstOrDefault(); if (x != null) { EstoqueInsumo estoqueInsumo = x; estoqueInsumo.QtdeTotalEstoque += loteInsumo.QtdeInicial; estoqueInsumo.CustoTotalEstoque += loteInsumo.CustoTotalInicial; if (!eic.Edit(estoqueInsumo)) { return(View()); } } else { EstoqueInsumo estoqueInsumo = new EstoqueInsumo() { QtdeTotalEstoque = loteInsumo.QtdeInicial, CustoTotalEstoque = loteInsumo.CustoTotalInicial, InsumoID = loteInsumo.InsumoID }; if (!eic.Create(estoqueInsumo)) { return(View()); } } return(RedirectToAction("Index")); } } ViewBag.FornecedorID = new SelectList(db.Fornecedores, "ID", "Nome", loteInsumo.FornecedorID); ViewBag.InsumoID = new SelectList(db.Insumos, "InsumoID", "Nome", loteInsumo.InsumoID); ViewBag.MarcaID = new SelectList(db.Marcas, "MarcaID", "Nome", loteInsumo.MarcaID); return(View(loteInsumo)); }
public ActionResult Create([Bind(Include = "ID,DataProducao,ValorVendaUnitario,ProdutoID,QtdeInicial,QtdeDisponivel,CustoMedio,CustoTotalInicial,Validade,_Produto")] LoteProduto loteProduto) { if (ModelState.IsValid) { // Verificando se há insumos necessários suficientes em estoque bool insumosDisponiveis = true; Produto produto = db.Produtos.Find(loteProduto.ProdutoID); foreach (InsumoComposicaoProduto item in produto._ComposicaoProduto) { double qtdeInsumo = item.QtdeInsumo * loteProduto.QtdeInicial; double qtdeEstoqueInsumo = db.EstoqueInsumos.Where(m => m.InsumoID.Equals(item.InsumoID)).Sum(m => m.QtdeTotalEstoque); if (qtdeInsumo > qtdeEstoqueInsumo) { insumosDisponiveis = false; } } if (insumosDisponiveis) { // Cria loteProduto no banco, depois vai ser alterado para incluir atributos faltantes sobre o custo loteProduto.QtdeDisponivel = loteProduto.QtdeInicial; db.LotesProdutos.Add(loteProduto); db.SaveChanges(); double custoTotalLoteProduto = 0; List <LoteInsumoProducao> lotesComposicaoProduto = new List <LoteInsumoProducao>(); // Percorre composição de Produto para encontrar os insumos necessário foreach (InsumoComposicaoProduto item in loteProduto._Produto._ComposicaoProduto) { EstoqueInsumo estoqueInsumo = db.EstoqueInsumos.Where(e => e.InsumoID == item.InsumoID).FirstOrDefault(); double qtdeInsumo = item.QtdeInsumo * loteProduto.QtdeInicial; while (qtdeInsumo > 0) { // Procura o Lote de Insumo que tenha estoque para e que esteja com a validade mais próxima LoteInsumo loteDisponivel = db.LotesInsumos. Where(l => l.InsumoID == item.InsumoID && l.QtdeDisponivel > 0). OrderBy(l => l.Validade).FirstOrDefault(); if ((loteDisponivel.QtdeDisponivel - qtdeInsumo) >= 0) { loteDisponivel.QtdeDisponivel -= qtdeInsumo; LotesInsumosController lic = new LotesInsumosController(); lic.Edit(loteDisponivel); LoteInsumoProducao loteInsumoProducao = new LoteInsumoProducao() { QtdeInsumo = qtdeInsumo, CustoTotalInsumo = qtdeInsumo * loteDisponivel.CustoMedio, LoteInsumoID = loteDisponivel.ID, LoteProdutoID = loteProduto.ID }; MovimentacaoEstoqueInsumo movimentacaoEstoqueInsumo = new MovimentacaoEstoqueInsumo() { DataMovimentacao = loteProduto.DataProducao, Qtde = -qtdeInsumo, ValorMovimentacao = loteDisponivel.CustoMedio * qtdeInsumo, LoteInsumoID = loteDisponivel.ID }; MovimentacoesEstoqueInsumosController meic = new MovimentacoesEstoqueInsumosController(); meic.Create(movimentacaoEstoqueInsumo); estoqueInsumo.QtdeTotalEstoque -= loteInsumoProducao.QtdeInsumo; estoqueInsumo.CustoTotalEstoque -= loteInsumoProducao.CustoTotalInsumo; EstoqueInsumosController eic = new EstoqueInsumosController(); eic.Edit(estoqueInsumo); lotesComposicaoProduto.Add(loteInsumoProducao); qtdeInsumo = 0; custoTotalLoteProduto += loteInsumoProducao.CustoTotalInsumo; } else { LoteInsumoProducao loteInsumoProducao = new LoteInsumoProducao() { QtdeInsumo = loteDisponivel.QtdeDisponivel, CustoTotalInsumo = loteDisponivel.QtdeDisponivel * loteDisponivel.CustoMedio, LoteInsumoID = loteDisponivel.ID, LoteProdutoID = loteProduto.ID }; MovimentacaoEstoqueInsumo movimentacaoEstoqueInsumo = new MovimentacaoEstoqueInsumo() { DataMovimentacao = loteProduto.DataProducao, Qtde = -loteDisponivel.QtdeDisponivel, ValorMovimentacao = loteDisponivel.CustoMedio * loteDisponivel.QtdeDisponivel, LoteInsumoID = loteDisponivel.ID }; MovimentacoesEstoqueInsumosController meic = new MovimentacoesEstoqueInsumosController(); meic.Create(movimentacaoEstoqueInsumo); estoqueInsumo.QtdeTotalEstoque -= loteInsumoProducao.QtdeInsumo; estoqueInsumo.CustoTotalEstoque -= loteInsumoProducao.CustoTotalInsumo; EstoqueInsumosController eic = new EstoqueInsumosController(); eic.Edit(estoqueInsumo); lotesComposicaoProduto.Add(loteInsumoProducao); qtdeInsumo -= loteDisponivel.QtdeDisponivel; custoTotalLoteProduto += loteInsumoProducao.CustoTotalInsumo; loteDisponivel.QtdeDisponivel = 0; LotesInsumosController lic = new LotesInsumosController(); lic.Edit(loteDisponivel); } } } loteProduto.CustoTotalInicial = custoTotalLoteProduto; loteProduto.CustoMedio = custoTotalLoteProduto / loteProduto.QtdeInicial; db.Entry(loteProduto).State = EntityState.Modified; db.LotesInsumosProducao.AddRange(lotesComposicaoProduto); db.SaveChanges(); MovimentacaoEstoqueProduto movimentacaoEstoqueProduto = new MovimentacaoEstoqueProduto() { DataMovimentacao = loteProduto.DataProducao, Qtde = loteProduto.QtdeInicial, ValorMovimentacao = loteProduto.CustoTotalInicial, LoteProdutoID = loteProduto.ID }; MovimentacoesEstoqueProdutosController mepc = new MovimentacoesEstoqueProdutosController(); if (mepc.Create(movimentacaoEstoqueProduto)) { EstoqueProdutosController epc = new EstoqueProdutosController(); var x = db.EstoqueProdutos.Where(e => e.ProdutoID == loteProduto.ProdutoID).FirstOrDefault(); if (x != null) { EstoqueProduto estoqueProduto = x; estoqueProduto.QtdeTotalEstoque += loteProduto.QtdeInicial; estoqueProduto.CustoTotalEstoque += loteProduto.CustoTotalInicial; epc.Edit(estoqueProduto); } else { EstoqueProduto estoqueProduto = new EstoqueProduto() { QtdeTotalEstoque = loteProduto.QtdeInicial, CustoTotalEstoque = loteProduto.CustoTotalInicial, ProdutoID = loteProduto.ProdutoID }; if (!epc.Create(estoqueProduto)) { return(View()); } } return(RedirectToAction("Index")); } } } ViewBag.ProdutoID = new SelectList(db.Produtos, "ProdutoID", "Nome", loteProduto.ProdutoID); return(View(loteProduto)); }