public ActionResult Create(Venda venda)
        {
            if (ModelState.IsValid)
            {
                String erro;
                if (!VendaHelper.efectuaVenda(venda, out erro))
                {
                    ViewBag.erro = erro;
                    return View();
                }
                TempData["sucesso"] = "Venda Efectuada!";
                return RedirectToAction("Index");
            }

            return View(venda);
        }
        private static void enviaVendaParaSede(Venda venda, float preco)
        {
            var queuePath = ConfigurationManager.AppSettings["queuePath"];
            if (!MessageQueue.Exists(queuePath))
            {
                MessageQueue.Create(queuePath, true);
            }

            ChannelFactory<IVendaServico> servico = new ChannelFactory<IVendaServico>("queueService");
            IVendaServico endpt = servico.CreateChannel();

            VendaOrdem vendaOrdem = new VendaOrdem();
            vendaOrdem.dadosVenda(venda.nomeCliente, venda.moradaCliente);

            vendaOrdem.acrescentaProduto(venda.codigoProduto, venda.quantidade, preco);

            endpt.enviaVenda(vendaOrdem);
        }
        internal static bool efectuaVenda(Venda venda, out String erro)
        {

            //TODO?: Try Catch->Pretty message?

            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
            {
                using (var context = new ASIVesteContext())
                {
                    var produto = context.Produtos
                                        .Where(b => b.Codigo == venda.codigoProduto)
                                        .FirstOrDefault();

                    try
                    {
                        if (produto == null)
                        {
                            erro = "Produto inexistente";
                            return false;
                        }

                        //TODO?: Assumindo que se aceita stock = 0, correcto?
                        if (produto.StockQtd <  venda.quantidade )
                        {
                            erro = "Stock indisponível";
                            return false;
                        }

                        //é usado um controlo transacional pessimista, pq é rápido: lê e actualiza (não tem tempos de utilizador nem grupo de actualização)
                        produto.StockQtd = produto.StockQtd - venda.quantidade;
                        context.SaveChanges();

                        enviaVendaParaSede(venda, produto.Preco);
                                                
                    }
                    //nunca ocorrerá -TODO: retirar
                    catch (DbUpdateException ex)
                    {
                        var entry = ex.Entries.Single();
                        var clientValues = (Produto)entry.Entity;
                        var databaseValues = (Produto)entry.GetDatabaseValues().ToObject();

                        if (databaseValues.StockQtd != clientValues.StockQtd)
                        {
                            //TODO databaseValues.StockQtd != clientValues.StockQtd
                            throw new Exception("TODO databaseValues.StockQtd != clientValues.StockQtd");
                        }
                        produto.RowVersion = databaseValues.RowVersion;
                    }

                }//END using (var context = new ASIVesteContext())

                // Complete the transaction.
                scope.Complete();

            }//END using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))

            erro = "";
            return true;

        }//END efectuaVenda
 public ActionResult Edit(Venda venda)
 {
     if (ModelState.IsValid)
     {
         db.Entry(venda).State = EntityState.Modified;
         db.SaveChanges();
         return RedirectToAction("Index");
     }
     return View(venda);
 }