private async Task <ActionResult> ApproveRejectTransfer(ApproveRejectTransferRequest request) { try { await FinanceService.MarkTransfer(request); } catch { //TODO handle error return(RedirectToAction("MoneySummary", "Finances", new { request.ProjectId })); } return(RedirectToAction("MoneySummary", "Finances", new { request.ProjectId })); }
public async Task MarkTransfer(ApproveRejectTransferRequest request) { var moneyTransfer = await UnitOfWork.GetDbSet <MoneyTransfer>() .Include(transfer => transfer.Project) .Include(transfer => transfer.Sender) .Include(transfer => transfer.Receiver) .SingleAsync(transfer => transfer.Id == request.MoneyTranferId && transfer.ProjectId == request.ProjectId); moneyTransfer.RequestMasterAccess(CurrentUserId); switch (moneyTransfer.ResultState) { case MoneyTransferState.Approved: case MoneyTransferState.Declined: throw new EntityWrongStatusException(moneyTransfer); case MoneyTransferState.PendingForReceiver when CurrentUserId == moneyTransfer.ReceiverId: case MoneyTransferState.PendingForSender when CurrentUserId == moneyTransfer.SenderId: moneyTransfer.ResultState = request.Approved ? MoneyTransferState.Approved : MoneyTransferState.Declined; break; case MoneyTransferState.PendingForBoth when CurrentUserId == moneyTransfer.ReceiverId: moneyTransfer.ResultState = request.Approved ? MoneyTransferState.PendingForSender : MoneyTransferState.Declined; break; case MoneyTransferState.PendingForBoth when CurrentUserId == moneyTransfer.SenderId: moneyTransfer.ResultState = request.Approved ? MoneyTransferState.PendingForReceiver : MoneyTransferState.Declined; break; default: //admin tries to approve with superpowers moneyTransfer.RequestMasterAccess(CurrentUserId, acl => acl.CanManageMoney); moneyTransfer.ResultState = request.Approved ? MoneyTransferState.Approved : MoneyTransferState.Declined; break; } moneyTransfer.ChangedById = CurrentUserId; moneyTransfer.Changed = DateTimeOffset.UtcNow; await UnitOfWork.SaveChangesAsync(); }