Inheritance: Estoque
 public frmCadastrarProduto(Produto produto, DeletarDaComandaAtiva deleteDaComanda, EnumTipoCadastro enumTipoCadastro)
 {
     _produto = produto;
     _deleteDaComanda = deleteDaComanda;
     _enumTipoCadastro = enumTipoCadastro;
     InitializeComponent();
 }
        public int Salvar(Produto produto)
        {
            try
            {
                InstanciarDbContext();
                InstanciarProdutoBO();
                int retorno = 0;
                if (_produtoBO.VerificaSeExisteProduto(produto) == NaoExiste)
                {
                    _banco.Entry(produto).State = EntityState.Added;
                    retorno = _banco.SaveChanges() == Sucesso ? Sucesso : Insucesso.ErroCustomForTernary("Não foi possível salvar, verifiques os dados");

                }
                return retorno;
            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }

        }
        public bool VerificarSeExisteProdutoNaAlteracao(Produto produto)
        {
            try
            {

                bool existe = false;

                if (_banco.Produto.Find(produto.ID).Codigo != produto.Codigo)
                {
                    if (_banco.Produto.Any(c => c.Codigo == produto.Codigo))
                    {
                        existe = true.RetornaErro("Produto com esse código já esta cadastrado.");
                    }

                }
                return existe;

            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }
        }
        public bool VerificaSeExisteProduto(Produto produto)
        {
            try
            {
                return _banco.Produto
                       .FirstOrDefault(c => c.Codigo == produto.Codigo)
                       != null ? Existe.RetornaErro("Produto com esse código já esta cadastrado.") : NaoExiste;

            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }

        }
        public int Alterar(Produto produto)
        {
            try
            {
                InstanciarBanco();
                _banco.Entry(produto).State = EntityState.Modified;
                return _banco.SaveChanges();

            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }

        }
        public int? GetQuantidadeNoEstoque(Produto produto)
        {
            try
            {
                InstanciarDbContext();
                Produto prod = _banco.Produto.FirstOrDefault(c => c.Codigo == produto.Codigo);
                return prod.Quantidade;


            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }

        }
        public bool VerificarSeEstaNaMovimentacao(Produto produto)
        {
            try
            {

                bool existe = false;

                if (_banco.MovimentacaoProduto.FirstOrDefault(c => c.Codigo == produto.Codigo && c.Valor > 0) != null)
                    existe = true.RetornaErro("Não é possível deletar um produto que esta na Movimentação de Produto");
                return existe;

            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }
        }
        public bool VerificarSeEstaNaComanda(Produto produto)
        {
            try
            {

                bool existe = false;

                if (_banco.VendaComComandaAtiva.FirstOrDefault(c => c.IDProduto == produto.ID) != null)
                    existe = true.RetornaErro("Não é possível deletar um produto que esta na Comanda");
                return existe;

            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }
        }
        public void DarBaixa(Produto produto, Estoque estoque)
        {
            try
            {

                if (produto.GerenciarEstoque == GerenciarEstoque)
                {
                    InstanciarDbContext();
                    produto.Quantidade -= estoque.Quantidade;
                    _banco.Entry(produto).State = System.Data.Entity.EntityState.Modified;
                    _banco.SaveChanges();
                }

            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }
        }
        private Produto PupularProduto()
        {
            try
            {

                InstanciarTipoCadastroRepositorio();
                Produto produto = new Produto();
                switch (cbbTipoCadastro.Text)
                {
                    case "Unidade":
                        PreenchimentoDoProdutoPadrao(produto);
                        PreenchimentoDoProdutoPorUnidade(produto);
                        break;
                    case "Peso":
                        PreenchimentoDoProdutoPadrao(produto);
                        break;
                }
                return produto;
            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }
        }
        private void PreenchimentoDoProdutoPorUnidade(Produto produto)
        {
            try
            {

                if (ckbEstoque.Checked)
                {
                    produto.Quantidade = Convert.ToInt32(txtEstoque.Text.Length == 0 ? 0 : Convert.ToInt32(txtEstoque.Text));
                    produto.QuantidadeMaxima = Convert.ToInt32(txtQtdMaxima.Text.Length == 0 ? 0 : Convert.ToInt32(txtQtdMaxima.Text));
                    produto.QuantidadeMinima = Convert.ToInt32(txtQtdMinima.Text.Length == 0 ? 0 : Convert.ToInt32(txtQtdMinima.Text));
                }
                else
                {
                    produto.Quantidade = null;
                    produto.QuantidadeMaxima = null;
                    produto.QuantidadeMinima = null;
                }

            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }
        }
        private void PreenchimentoDoProdutoPadrao(Produto produto)
        {
            try
            {

                if (_categoriaRepositorio.GetIdDaCategoriaPeloNome(cbbCategoria.Text) != 0)
                {
                    produto.Categoria = _categoriaRepositorio.GetIdDaCategoriaPeloNome(cbbCategoria.Text);
                    produto.ID = _produto.ID;
                    produto.Nome = txtNome.Text.UpperCaseOnlyFirst();
                    produto.TipoCadastro = _tipoCadastroRepositorio.GetIDPeloNome(cbbTipoCadastro.Text);
                    produto.Descricao = txtDescricao.Text != null && txtDescricao.Text != "" ? txtDescricao.Text.UpperCaseOnlyFirst() : "";
                    produto.Codigo = txtCodigo.Text;
                    produto.GerenciarEstoque = ckbEstoque.Checked;
                    produto.PrecoCompra = Convert.ToDecimal(txtPrecoCompra.Text.Length == 0 ? 0 : Convert.ToDecimal(txtPrecoCompra.Text));
                    produto.PrecoVenda = Convert.ToDecimal(txtPrecoVenda.Text.Length == 0 ? 0 : Convert.ToDecimal(txtPrecoVenda.Text));
                    switch (cbbTipoCadastro.Text)
                    {
                        case "Unidade":
                            produto.Porcentagem = Calcular.TratarStringDePorcentagem(txtPorcentagem);
                            break;
                        case "Peso":
                            produto.Porcentagem = Convert.ToInt32(txtPorcentagem.Text.Length == 0 ? 0 : Convert.ToInt32(txtPorcentagem.Text));
                            break;
                    }

                }

            }
            catch (CustomException erro)
            {
                DialogMessage.MessageFullComButtonOkIconeDeInformacao(erro.Message, "Aviso");
                FocarNoTxt(txtCodigo);
            }
            catch (Exception erro)
            {
                DialogMessage.MessageComButtonOkIconeErro(erro.Message, "Erro");
            }
        }
        public int Deletar(Produto produto)
        {
            try
            {
                InstanciarDbContext();
                InstanciarProdutoBO();
                int retorno = 0;
                if (_produtoBO.VerificarSeEstaNaComanda(produto) == NaoExiste)
                {
                    if (_produtoBO.VerificarSeEstaNaMovimentacao(produto) == NaoExiste)
                    {
                        _banco.Entry(produto).State = EntityState.Deleted;
                        retorno = _banco.SaveChanges() == Sucesso ? Sucesso : Insucesso;
                    }

                }
                return retorno;

            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }
        }
        public int Alterar(Produto produto)
        {
            try
            {
                InstanciarDbContext();
                InstanciarProdutoBO();
                int retorno = 0;
                if (_produtoBO.VerificarSeExisteProdutoNaAlteracao(produto) == NaoExiste)
                {
                    _banco.Entry(produto).State = EntityState.Modified;
                    retorno = _banco.SaveChanges() == Sucesso ? Sucesso : Insucesso;
                }
                return retorno;

            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }
        }
 public frmMovimentacaoProdutos(Produto produto)
 {
     _produto = produto;
     InitializeComponent();
 }
        private VendaComComandaAtiva PupularVendaComComandaAtivaPeso(Produto produto, decimal peso)
        {


            try
            {
                int pesoTemp = Convert.ToInt32(peso);
                InstanciarComandaRepositorio();
                VendaComComandaAtiva venda = new VendaComComandaAtiva();
                venda.IDComanda = _comandaRepositorio.GetIDPeloCodigo(txtCodigoDaComanda.Text).ID;
                venda.IDProduto = produto.ID;
                venda.PrecoTotal = (produto.PrecoVenda / 1000) * peso;
                venda.Quantidade = -pesoTemp;
                return venda;

            }
            catch (CustomException erro)
            {
                throw new CustomException(erro.Message);
            }
            catch (Exception erro)
            {
                throw new Exception(erro.Message);
            }
        }
 public frmCadastrarProduto(Produto produto, EnumTipoOperacao tipoOperacao)
 {
     _produto = produto;
     _tipoOperacao = tipoOperacao;
     InitializeComponent();
 }