Example #1
0
        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));
        }
Example #2
0
        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));
        }