public void InserirCompra(Compra compra) { /* Inicia uma transação no banco, se qualquer coisa der errado * durante a inserção da compra, um rollback será realizado e * o processo será inteiro "desconsiderado", caso dê certo o * método commit será chamado e a transação será finalizada. */ _compraRepository.BeginTransaction(); try { int valor; var result = _compraRepository.InserirCompra(compra, out valor); if (result == -1) { _compraRepository.RollBackTransaction(); _notification.Add("Falha ao inserir compra"); return; } /* Após inserir os dados da compra, item a item dessa mesma compra * é inserido no banco, se algum deles exceder o estoque, o rollback * é realizado. */ foreach (var item in compra.Itens) { if (item.QtdeCompra <= 0) { _notification.Add("Quantidade do produto nao pode ser zero ou menor"); return; } VerificaEstoque(item); if (_notification.HasNotification()) { _compraRepository.RollBackTransaction(); return; } item.IdCompra = valor; _compraProdutoRepository.InserirCompraProduto(item); } var user = _usuarioRepository.SelecionarUsuario(compra.Usuario.Cpf); if (user.SaldoUsuario < -100) { _compraRepository.RollBackTransaction(); _notification.Add("Você está excedendo a dívida máxima, pague a lojinha!"); return; } if (user.Ativo != "A") { _compraRepository.RollBackTransaction(); _notification.Add("Sua conta foi desativada! Contate um administrador"); return; } _compraRepository.CommitTransaction(); } catch { // Em caso de exception(erro) o roolback é realizado _compraRepository.RollBackTransaction(); _notification.Add("Erro ao inserir compra"); } }