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