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); }