Exemplo n.º 1
0
        private static Task SendMessage(ISendEndpoint endpoint)
        {
            var message = new TransferFundsCommand
            {
                TransferFundsId = Guid.NewGuid(),
                CreatedAt       = DateTime.UtcNow,
                FromWalletId    = 1,
                ToWalletId      = 2,
                Amount          = 100,
                Comment         = "Test"
            };

            return(endpoint.Send(message));
        }
Exemplo n.º 2
0
        public void ShowDialog(IEnumerable <LedgerBucket> ledgerBuckets)
        {
            Reset();
            TransferFundsDto         = new TransferFundsCommand();
            LedgerBuckets            = ledgerBuckets.ToList();
            this.dialogCorrelationId = Guid.NewGuid();
            var dialogRequest = new ShellDialogRequestMessage(BudgetAnalyserFeature.LedgerBook, this, ShellDialogType.SaveCancel)
            {
                CorrelationId = this.dialogCorrelationId,
                Title         = "Transfer Funds"
            };

            MessengerInstance.Send(dialogRequest);
        }
Exemplo n.º 3
0
        public void IsValid_ShouldBeFalse_GivenNullFromLedger()
        {
            this.subject = new TransferFundsCommand
            {
                FromLedger = null,
                ToLedger   = new SavedUpForLedger
                {
                    BudgetBucket    = StatementModelTestData.InsHomeBucket,
                    StoredInAccount = StatementModelTestData.ChequeAccount
                },
                Narrative      = "Foo",
                TransferAmount = 1
            };

            Assert.IsFalse(this.subject.IsValid());
        }
Exemplo n.º 4
0
        public void TransferFunds_ShouldIncreaseSavInsHome_GivenTransferFromChqSurplusToSavingsInsHome()
        {
            var transferDetails = new TransferFundsCommand
            {
                FromLedger     = this.surplusChqLedger,
                ToLedger       = this.insHomeSavLedger,
                TransferAmount = 22.00M,
                Narrative      = "Testing 123"
            };

            decimal beforeBalance = this.testDataEntryLine.Entries.First(e => e.LedgerBucket == this.insHomeSavLedger).Balance;

            this.subject.TransferFunds(this.testDataLedgerBook, transferDetails, this.testDataEntryLine);
            decimal afterBalance = this.testDataEntryLine.Entries.First(e => e.LedgerBucket == this.insHomeSavLedger).Balance;

            Assert.AreEqual(beforeBalance + transferDetails.TransferAmount, afterBalance);
        }
Exemplo n.º 5
0
        public void TransferFunds_ShouldDecreaseChqSurplus_GivenTransferFromChqSurplusToChqCarMtc()
        {
            var transferDetails = new TransferFundsCommand
            {
                FromLedger     = this.surplusChqLedger,
                ToLedger       = this.phNetChqLedger,
                TransferAmount = 22.00M,
                Narrative      = "Testing 123"
            };

            decimal beforeBalance = this.testDataEntryLine.SurplusBalances.First(b => b.Account == StatementModelTestData.ChequeAccount).Balance;

            this.subject.TransferFunds(this.testDataLedgerBook, transferDetails, this.testDataEntryLine);
            decimal afterBalance = this.testDataEntryLine.SurplusBalances.First(b => b.Account == StatementModelTestData.ChequeAccount).Balance;

            Assert.AreEqual(beforeBalance - transferDetails.TransferAmount, afterBalance);
        }
Exemplo n.º 6
0
 public void IsValid_ShouldBeFalse_GivenBlankNarrative()
 {
     this.subject = new TransferFundsCommand
     {
         FromLedger = new SpentMonthlyLedger()
         {
             BudgetBucket    = StatementModelTestData.PhoneBucket,
             StoredInAccount = StatementModelTestData.ChequeAccount
         },
         ToLedger = new SavedUpForLedger()
         {
             BudgetBucket    = StatementModelTestData.InsHomeBucket,
             StoredInAccount = StatementModelTestData.ChequeAccount
         },
         Narrative      = "",
         TransferAmount = 0M
     };
 }
Exemplo n.º 7
0
        public void Setup()
        {
            var fixture = new Fixture();

            _transferFundsCommand = fixture.Build <TransferFundsCommand>()
                                    .Create();

            _user = fixture.Build <User>()
                    .Create();

            _fromWallet = fixture.Build <Wallet>()
                          .CreateMany(1);

            _toWallet = fixture.Build <Wallet>()
                        .CreateMany(1);

            _target = new TransferFundsCommandHandler(_transactionServiceMock.Object, _userRepositoryMock.Object, _walletRepositoryMock.Object,
                                                      _currencyRepositoryMock.Object, _authenticationServiceMock.Object);
        }
        /// <summary>
        ///     Performs a funds transfer for the given ledger entry line.
        /// </summary>
        public void TransferFunds(LedgerBook ledgerBook, TransferFundsCommand transferDetails, LedgerEntryLine ledgerEntryLine)
        {
            if (transferDetails == null)
            {
                throw new ArgumentNullException(nameof(transferDetails));
            }

            if (ledgerEntryLine == null)
            {
                throw new ArgumentNullException(nameof(ledgerEntryLine));
            }

            if (!transferDetails.IsValid())
            {
                throw new InvalidOperationException("Code Error: The transfer command is in an invalid state, this should be resolved in the UI.");
            }

            PerformBankTransfer(ledgerBook, transferDetails, ledgerEntryLine);
        }
Exemplo n.º 9
0
        public void SettingFromLedger_ShouldPopulateAutoMatchingReference_GivenFromAndToLedgersAreDifferent()
        {
            this.subject = new TransferFundsCommand
            {
                FromLedger = new SpentMonthlyLedger
                {
                    BudgetBucket    = StatementModelTestData.PhoneBucket,
                    StoredInAccount = StatementModelTestData.ChequeAccount
                },
                ToLedger = new SavedUpForLedger
                {
                    BudgetBucket    = StatementModelTestData.InsHomeBucket,
                    StoredInAccount = StatementModelTestData.SavingsAccount
                },
                Narrative      = "Foo",
                TransferAmount = 12.34M
            };

            Assert.IsTrue(this.subject.AutoMatchingReference.IsSomething());
        }
Exemplo n.º 10
0
        public void IsValid_ShouldBeFalse_GivenLedgersAreTheBothSurplusForSameAccount()
        {
            this.subject = new TransferFundsCommand
            {
                FromLedger = new SurplusLedger
                {
                    BudgetBucket    = new SurplusBucket(),
                    StoredInAccount = StatementModelTestData.ChequeAccount
                },
                ToLedger = new SurplusLedger
                {
                    BudgetBucket    = new SurplusBucket(),
                    StoredInAccount = StatementModelTestData.ChequeAccount
                },
                Narrative      = "Foo",
                TransferAmount = 1
            };

            Assert.IsFalse(this.subject.IsValid());
        }
Exemplo n.º 11
0
        public void IsValid_ShouldBeTrue_GivenThisRealExample()
        {
            this.subject = new TransferFundsCommand
            {
                FromLedger = new SurplusLedger
                {
                    BudgetBucket    = new SurplusBucket(),
                    StoredInAccount = StatementModelTestData.ChequeAccount
                },
                ToLedger = new SavedUpForLedger
                {
                    BudgetBucket    = StatementModelTestData.CarMtcBucket,
                    StoredInAccount = StatementModelTestData.ChequeAccount
                },
                Narrative      = "Foo",
                TransferAmount = 12
            };

            Assert.IsTrue(this.subject.IsValid());
        }
Exemplo n.º 12
0
        public void IsValid_ShouldIndicateBankTransferRequired_GivenFromAndToLedgersAreDifferent()
        {
            this.subject = new TransferFundsCommand
            {
                FromLedger = new SpentMonthlyLedger
                {
                    BudgetBucket    = StatementModelTestData.PhoneBucket,
                    StoredInAccount = StatementModelTestData.ChequeAccount
                },
                ToLedger = new SavedUpForLedger
                {
                    BudgetBucket    = StatementModelTestData.InsHomeBucket,
                    StoredInAccount = StatementModelTestData.SavingsAccount
                },
                Narrative      = "Foo",
                TransferAmount = 12.34M
            };

            Assert.IsTrue(this.subject.BankTransferRequired);
        }
Exemplo n.º 13
0
        public void IsValid_ShouldBeFalse_GivenSmallFractionalAmount()
        {
            this.subject = new TransferFundsCommand
            {
                FromLedger = new SpentMonthlyLedger
                {
                    BudgetBucket    = StatementModelTestData.PhoneBucket,
                    StoredInAccount = StatementModelTestData.ChequeAccount
                },
                ToLedger = new SavedUpForLedger
                {
                    BudgetBucket    = StatementModelTestData.InsHomeBucket,
                    StoredInAccount = StatementModelTestData.ChequeAccount
                },
                Narrative      = "Foo",
                TransferAmount = 0.00001M
            };

            Assert.IsFalse(this.subject.IsValid());
        }
Exemplo n.º 14
0
        public void TransferFunds_ShouldCreateAutoMatchingRule_GivenTransferFromChqSurplusToSavingsInsHome()
        {
            var transferFundsData = new TransferFundsCommand
            {
                AutoMatchingReference = "FooTest12345",
                BankTransferRequired  = true,
                FromLedger            = LedgerBookTestData.SurplusLedger,
                Narrative             = "Save excess for November",
                ToLedger       = LedgerBookTestData.HouseInsLedgerSavingsAccount,
                TransferAmount = 200M
            };

            this.mockRuleService.Setup(m => m.CreateNewSingleUseRule(transferFundsData.FromLedger.BudgetBucket.Code, null, new[] { "FooTest12345" }, null, -200, true))
            .Returns(new SingleUseMatchingRule(this.mockBucketRepo.Object));
            this.mockRuleService.Setup(m => m.CreateNewSingleUseRule(transferFundsData.ToLedger.BudgetBucket.Code, null, new[] { "FooTest12345" }, null, 200, true))
            .Returns(new SingleUseMatchingRule(this.mockBucketRepo.Object));

            this.subject.TransferFunds(this.testDataLedgerBook, transferFundsData, this.testDataEntryLine);

            this.mockRuleService.VerifyAll();
        }
Exemplo n.º 15
0
        public void TransferFunds_ShouldNotCreateAutoMatchingRule_GivenTransferFromChqSurplusToChqHairCut()
        {
            var transferFundsData = new TransferFundsCommand
            {
                AutoMatchingReference = "FooTest12345",
                BankTransferRequired  = false,
                FromLedger            = LedgerBookTestData.SurplusLedger,
                Narrative             = "Save excess for November",
                ToLedger       = LedgerBookTestData.HairLedger,
                TransferAmount = 400M
            };

            var success = true;

            this.mockRuleService.Setup(m => m.CreateNewSingleUseRule(It.IsAny <string>(), null, new[] { "FooTest12345" }, null, It.IsAny <decimal>(), true))
            .Returns(new SingleUseMatchingRule(this.mockBucketRepo.Object))
            .Callback(() => success = false);

            this.subject.TransferFunds(this.testDataLedgerBook, transferFundsData, this.testDataEntryLine);

            Assert.IsTrue(success);
        }
Exemplo n.º 16
0
        public void TransferFunds_ShouldDecreaseChqBalance_GivenTransferFromChqSurplusToSavingsInsHome()
        {
            var transferDetails = new TransferFundsCommand
            {
                FromLedger     = this.surplusChqLedger,
                ToLedger       = this.insHomeSavLedger,
                TransferAmount = 22.00M,
                Narrative      = "Testing 123"
            };

            decimal beforeBalance = this.testDataEntryLine.BankBalances.First(b => b.Account == StatementModelTestData.ChequeAccount).Balance
                                    + this.testDataEntryLine.BankBalanceAdjustments
                                    .Where(a => a.BankAccount == StatementModelTestData.ChequeAccount)
                                    .Sum(a => a.Amount);

            this.subject.TransferFunds(this.testDataLedgerBook, transferDetails, this.testDataEntryLine);
            decimal afterBalance = this.testDataEntryLine.BankBalances.First(b => b.Account == StatementModelTestData.ChequeAccount).Balance
                                   + this.testDataEntryLine.BankBalanceAdjustments
                                   .Where(a => a.BankAccount == StatementModelTestData.ChequeAccount)
                                   .Sum(a => a.Amount);

            Assert.AreEqual(beforeBalance - transferDetails.TransferAmount, afterBalance);
        }
Exemplo n.º 17
0
        public async Task <IActionResult> TransferFunds([FromBody] TransferFundsCommand command)
        {
            bool result = await _mediator.Send(command);

            return(Ok(result));
        }
        private void PerformBankTransfer(LedgerBook ledgerBook, TransferFundsCommand transferDetails, LedgerEntryLine ledgerEntryLine)
        {
            var sourceTransaction = new CreditLedgerTransaction
            {
                Amount = -transferDetails.TransferAmount,
                AutoMatchingReference = transferDetails.AutoMatchingReference,
                Date      = ledgerEntryLine.Date,
                Narrative = transferDetails.Narrative
            };

            var destinationTransaction = new CreditLedgerTransaction
            {
                Amount = transferDetails.TransferAmount,
                AutoMatchingReference = transferDetails.AutoMatchingReference,
                Date      = ledgerEntryLine.Date,
                Narrative = transferDetails.Narrative
            };

            if (transferDetails.BankTransferRequired)
            {
                ledgerEntryLine.BalanceAdjustment(-transferDetails.TransferAmount, transferDetails.Narrative,
                                                  transferDetails.FromLedger.StoredInAccount);
                ledgerEntryLine.BalanceAdjustment(transferDetails.TransferAmount, transferDetails.Narrative,
                                                  transferDetails.ToLedger.StoredInAccount);
                this.transactionRuleService.CreateNewSingleUseRule(
                    transferDetails.FromLedger.BudgetBucket.Code,
                    null,
                    new[] { transferDetails.AutoMatchingReference },
                    null,
                    -transferDetails.TransferAmount,
                    true);
                this.transactionRuleService.CreateNewSingleUseRule(
                    transferDetails.ToLedger.BudgetBucket.Code,
                    null,
                    new[] { transferDetails.AutoMatchingReference },
                    null,
                    transferDetails.TransferAmount,
                    true);
            }


            // No need for a source transaction for surplus ledger.
            if (!(transferDetails.FromLedger.BudgetBucket is SurplusBucket))
            {
                var ledgerEntry     = ledgerEntryLine.Entries.Single(e => e.LedgerBucket == transferDetails.FromLedger);
                var replacementTxns = ledgerEntry.Transactions.ToList();
                replacementTxns.Add(sourceTransaction);
                ledgerEntry.SetTransactionsForReconciliation(replacementTxns);
                ledgerEntry.RecalculateClosingBalance(ledgerBook);
            }

            // No need for a destination transaction for surplus ledger.
            if (!(transferDetails.ToLedger.BudgetBucket is SurplusBucket))
            {
                var ledgerEntry     = ledgerEntryLine.Entries.Single(e => e.LedgerBucket == transferDetails.ToLedger);
                var replacementTxns = ledgerEntry.Transactions.ToList();
                replacementTxns.Add(destinationTransaction);
                ledgerEntry.SetTransactionsForReconciliation(replacementTxns);
                ledgerEntry.RecalculateClosingBalance(ledgerBook);
            }
        }
Exemplo n.º 19
0
        /// <summary>
        ///     Transfer funds from one ledger bucket to another. This is only possible if the current ledger reconciliation is
        ///     unlocked.
        ///     This is usually used during reconciliation.
        /// </summary>
        /// <param name="ledgerBook">The parent ledger book.</param>
        /// <param name="reconciliation">
        ///     The reconciliation line that this transfer will be created in.  A transfer can only occur
        ///     between two ledgers in the same reconciliation.
        /// </param>
        /// <param name="transferDetails">The details of the requested transfer.</param>
        public void TransferFunds(LedgerBook ledgerBook, LedgerEntryLine reconciliation, TransferFundsCommand transferDetails)
        {
            if (reconciliation == null)
            {
                throw new ArgumentNullException(nameof(reconciliation), "There are no reconciliations. Transfer funds can only be used on the most recent reconciliation.");
            }

            this.reconciliationManager.TransferFunds(ledgerBook, transferDetails, reconciliation);
        }
Exemplo n.º 20
0
 public async Task TransferFunds(Guid fromAccountId, Guid toAccountId, decimal amountToTransfer)
 {
     var token   = new CancellationToken();
     var command = new TransferFundsCommand(fromAccountId, toAccountId, amountToTransfer);
     await mediator.Send(command, token);
 }
Exemplo n.º 21
0
 private void Reset()
 {
     TransferFundsDto      = null;
     BankTransferConfirmed = false;
     LedgerBuckets         = null;
 }