Exemple #1
0
        public async Task TestCase1(int hid, string currency, string user)
        {
            var context = this.fixture.GetCurrentDataContext();

            // 0a. Prepare the context for other homes to test the filters
            var secondhid = hid;

            if (hid == DataSetupUtility.Home1ID)
            {
                if (user == DataSetupUtility.UserA || user == DataSetupUtility.UserB)
                {
                    secondhid = DataSetupUtility.Home3ID;
                }
                else if (user == DataSetupUtility.UserC)
                {
                    secondhid = DataSetupUtility.Home4ID;
                }
                else if (user == DataSetupUtility.UserD)
                {
                    secondhid = DataSetupUtility.Home5ID;
                }
            }
            else if (hid == DataSetupUtility.Home2ID)
            {
                secondhid = DataSetupUtility.Home3ID;
            }

            if (hid == DataSetupUtility.Home1ID || secondhid == DataSetupUtility.Home1ID)
            {
                fixture.InitHome1TestData(context);
            }
            else if (hid == DataSetupUtility.Home2ID || secondhid == DataSetupUtility.Home2ID)
            {
                fixture.InitHome2TestData(context);
            }
            else if (hid == DataSetupUtility.Home3ID || secondhid == DataSetupUtility.Home3ID)
            {
                fixture.InitHome3TestData(context);
            }
            else if (hid == DataSetupUtility.Home4ID || secondhid == DataSetupUtility.Home4ID)
            {
                fixture.InitHome4TestData(context);
            }
            else if (hid == DataSetupUtility.Home5ID || secondhid == DataSetupUtility.Home5ID)
            {
                fixture.InitHome5TestData(context);
            }
            var account      = context.FinanceAccount.Where(p => p.HomeID == hid && p.Status != (Byte)FinanceAccountStatus.Closed).FirstOrDefault();
            var cc           = context.FinanceControlCenter.Where(p => p.HomeID == hid).FirstOrDefault();
            var curhmemquery = (from homemem in context.HomeMembers where homemem.HomeID == hid && homemem.User == user select homemem).FirstOrDefault();
            var curhmem      = Assert.IsType <HomeMember>(curhmemquery);
            var existamt     = (from homemem in context.HomeMembers
                                join findoc in context.FinanceDocument
                                on new { homemem.HomeID, homemem.User } equals new { findoc.HomeID, User = user }
                                select findoc.ID).ToList().Count();
            var existamt_curhome = context.FinanceDocument.Where(p => p.HomeID == hid).Count();

            // 1. Create first docs.
            var control   = new FinanceDocumentsController(context);
            var userclaim = DataSetupUtility.GetClaimForUser(user);
            var httpctx   = UnitTestUtility.GetDefaultHttpContext(provider, userclaim);

            control.ControllerContext = new ControllerContext()
            {
                HttpContext = httpctx
            };

            var doc = new FinanceDocument()
            {
                HomeID   = hid,
                DocType  = FinanceDocumentType.DocType_Normal,
                TranCurr = currency,
                Desp     = "Test 1"
            };
            var item = new FinanceDocumentItem()
            {
                DocumentHeader  = doc,
                ItemID          = 1,
                Desp            = "Item 1.1",
                TranType        = 2, // Wage
                TranAmount      = 10,
                AccountID       = account.ID,
                ControlCenterID = cc.ID,
            };

            doc.Items.Add(item);
            var rst = await control.Post(doc);

            Assert.NotNull(rst);
            var rst2 = Assert.IsType <CreatedODataResult <FinanceDocument> >(rst);

            Assert.Equal(rst2.Entity.TranCurr, doc.TranCurr);
            Assert.Equal(rst2.Entity.Desp, doc.Desp);
            var firstdocid = rst2.Entity.ID;

            documentsCreated.Add(firstdocid);
            Assert.True(firstdocid > 0);

            // 2a. Now read the whole orders (without home id)
            var queryUrl     = "http://localhost/api/FinanceDocuments";
            var req          = UnitTestUtility.GetHttpRequest(httpctx, "GET", queryUrl);
            var odatacontext = UnitTestUtility.GetODataQueryContext <FinanceDocument>(this.model);
            var options      = UnitTestUtility.GetODataQueryOptions <FinanceDocument>(odatacontext, req);
            var rst3         = control.Get(options);

            Assert.NotNull(rst3);
            //if (curhmem.IsChild.HasValue && curhmem.IsChild == true)
            //{
            //    existamt = context.FinanceDocument.Where(p => p.Createdby == user).Count();
            //    Assert.Equal(existamt, rst3.Cast<FinanceDocument>().Count());
            //}
            //else
            //{
            //    Assert.Equal(existamt + 1, rst3.Cast<FinanceDocument>().Count());
            //}

            // 2b. Now read the whole orders (with home id)
            queryUrl = "http://localhost/api/FinanceDocuments?$filter=HomeID eq " + hid.ToString();
            req      = UnitTestUtility.GetHttpRequest(httpctx, "GET", queryUrl);
            // odatacontext = UnitTestUtility.GetODataQueryContext<FinanceDocument>(this.model);
            options = UnitTestUtility.GetODataQueryOptions <FinanceDocument>(odatacontext, req);
            rst3    = control.Get(options);
            Assert.NotNull(rst3);
            if (curhmem.IsChild.HasValue && curhmem.IsChild == true)
            {
                existamt_curhome = context.FinanceDocument.Where(p => p.HomeID == hid && p.Createdby == user).Count();
                Assert.Equal(existamt_curhome, rst3.Cast <FinanceDocument>().Count());
            }
            else
            {
                Assert.Equal(existamt_curhome + 1, rst3.Cast <FinanceDocument>().Count());
            }

            // 3. Now create another one!
            doc = new FinanceDocument()
            {
                HomeID   = hid,
                DocType  = FinanceDocumentType.DocType_Normal,
                TranCurr = currency,
                Desp     = "Test 2"
            };
            item = new FinanceDocumentItem()
            {
                DocumentHeader  = doc,
                ItemID          = 1,
                Desp            = "Item 2.1",
                TranType        = 2, // Wage
                TranAmount      = 10,
                AccountID       = account.ID,
                ControlCenterID = cc.ID
            };
            doc.Items.Add(item);
            rst = await control.Post(doc);

            Assert.NotNull(rst);
            rst2 = Assert.IsType <CreatedODataResult <FinanceDocument> >(rst);
            Assert.Equal(rst2.Entity.TranCurr, doc.TranCurr);
            Assert.Equal(rst2.Entity.Desp, doc.Desp);
            // documentsCreated.Add(rst2.Entity);
            var seconddocid = rst2.Entity.ID;

            Assert.True(seconddocid > 0);

            // 4a. Change one document - add new document item
            doc.Desp = "Change Test";
            doc.Items.Add(new FinanceDocumentItem
            {
                DocumentHeader  = doc,
                ItemID          = 2,
                Desp            = "Item 2.2",
                TranType        = 2, // Wage
                TranAmount      = 20,
                AccountID       = account.ID,
                ControlCenterID = cc.ID
            });
            rst = await control.Put(seconddocid, doc);

            Assert.NotNull(rst);
            var rst4 = Assert.IsType <UpdatedODataResult <FinanceDocument> >(rst);

            Assert.Equal(doc.Desp, rst4.Entity.Desp);
            Assert.Equal(2, rst4.Entity.Items.Count);
            Assert.Equal("Item 2.1", rst4.Entity.Items.First(p => p.ItemID == 1).Desp);
            Assert.Equal("Item 2.2", rst4.Entity.Items.First(p => p.ItemID == 2).Desp);

            // 4b. Change one document - remove document item
            var itemidx = doc.Items.First(p => p.ItemID == 2);

            doc.Items.Remove(item);
            rst = await control.Put(seconddocid, doc);

            Assert.NotNull(rst);
            rst4 = Assert.IsType <UpdatedODataResult <FinanceDocument> >(rst);
            Assert.Equal(1, rst4.Entity.Items.Count);
            // Assert.Equal("Item 2.1", rst4.Entity.Items.First(p => p.ItemID == 1).Desp);

            // 5. Delete the second document
            var rst5 = await control.Delete(seconddocid);

            Assert.NotNull(rst5);
            var rst6 = Assert.IsType <StatusCodeResult>(rst5);

            Assert.Equal(204, rst6.StatusCode);
            Assert.Equal(0, context.FinanceDocumentItem.Where(p => p.DocID == seconddocid).Count());

            // 6. Now read the whole documents
            rst3 = control.Get(options);
            Assert.NotNull(rst3);
            if (curhmem.IsChild.HasValue && curhmem.IsChild == true)
            {
                existamt_curhome = context.FinanceDocument.Where(p => p.HomeID == hid && p.Createdby == user).Count();
                Assert.Equal(existamt_curhome, rst3.Cast <FinanceDocument>().Count());
            }
            else
            {
                Assert.Equal(existamt_curhome + 1, rst3.Cast <FinanceDocument>().Count());
            }

            // Last, clear all created objects
            CleanupCreatedEntries();
            await context.SaveChangesAsync();

            await context.DisposeAsync();
        }
Exemple #2
0
        public async Task TestCase1(int hid, string currency, string user, short doctype)
        {
            var context = this.fixture.GetCurrentDataContext();

            // 0. Prepare the context for current home
            if (hid == DataSetupUtility.Home1ID)
            {
                fixture.InitHome1TestData(context);
            }
            else if (hid == DataSetupUtility.Home2ID)
            {
                fixture.InitHome2TestData(context);
            }
            else if (hid == DataSetupUtility.Home3ID)
            {
                fixture.InitHome3TestData(context);
            }
            else if (hid == DataSetupUtility.Home4ID)
            {
                fixture.InitHome4TestData(context);
            }
            else if (hid == DataSetupUtility.Home5ID)
            {
                fixture.InitHome5TestData(context);
            }
            var account = context.FinanceAccount.Where(p => p.HomeID == hid && p.Status != (Byte)FinanceAccountStatus.Closed).FirstOrDefault();
            var cc      = context.FinanceControlCenter.Where(p => p.HomeID == hid).FirstOrDefault();

            // 1. Create first Loan docs.
            var control   = new FinanceDocumentsController(context);
            var userclaim = DataSetupUtility.GetClaimForUser(user);
            var httpctx   = UnitTestUtility.GetDefaultHttpContext(provider, userclaim);

            control.ControllerContext = new ControllerContext()
            {
                HttpContext = httpctx
            };

            // 1a. Prepare data
            var dpcontext = new FinanceLoanDocumentCreateContext();

            dpcontext.DocumentInfo = new FinanceDocument()
            {
                HomeID   = hid,
                DocType  = doctype,
                TranCurr = currency,
                Desp     = "Test 1"
            };
            var item = new FinanceDocumentItem()
            {
                DocumentHeader = dpcontext.DocumentInfo,
                ItemID         = 1,
                Desp           = "Item 1.1",
                TranType       = doctype == FinanceDocumentType.DocType_BorrowFrom
                        ? FinanceTransactionType.TranType_BorrowFrom
                        : FinanceTransactionType.TranType_LendTo,
                TranAmount      = 1200,
                AccountID       = account.ID,
                ControlCenterID = cc.ID,
            };

            dpcontext.DocumentInfo.Items.Add(item);
            dpcontext.AccountInfo = new FinanceAccount()
            {
                HomeID     = hid,
                Name       = "Account_8" + ".1",
                CategoryID = doctype == FinanceDocumentType.DocType_BorrowFrom
                    ? FinanceAccountCategory.AccountCategory_BorrowFrom
                    : FinanceAccountCategory.AccountCategory_LendTo,
                Owner  = user,
                Status = (Byte)FinanceAccountStatus.Normal,
            };
            var startdate = new DateTime(2020, 1, 10);
            var enddate   = new DateTime(2021, 1, 10);

            dpcontext.AccountInfo.ExtraLoan = new FinanceAccountExtraLoan()
            {
                StartDate       = startdate,
                EndDate         = enddate,
                TotalMonths     = 12,
                RepaymentMethod = LoanRepaymentMethod.EqualPrincipal,
                InterestFree    = false,
            };
            var rsts = CommonUtility.WorkoutRepeatedDatesWithAmountAndInterest(new RepeatDatesWithAmountAndInterestCalInput
            {
                RepaymentMethod  = dpcontext.AccountInfo.ExtraLoan.RepaymentMethod.Value,
                InterestFreeLoan = dpcontext.AccountInfo.ExtraLoan.InterestFree.Value,
                StartDate        = dpcontext.AccountInfo.ExtraLoan.StartDate,
                TotalAmount      = 12000,
                EndDate          = dpcontext.AccountInfo.ExtraLoan.EndDate,
                TotalMonths      = dpcontext.AccountInfo.ExtraLoan.TotalMonths.Value,
                FirstRepayDate   = new DateTime(2020, 2, 15)
            });
            var tmpdocid = 1;

            foreach (var rst in rsts)
            {
                var tmpdoc = new FinanceTmpLoanDocument
                {
                    DocumentID        = tmpdocid++,
                    TransactionAmount = rst.TranAmount,
                    InterestAmount    = rst.InterestAmount,
                    TransactionDate   = rst.TranDate,
                    HomeID            = hid,
                    ControlCenterID   = item.ControlCenterID,
                    OrderID           = item.OrderID,
                    Description       = item.Desp,
                };

                dpcontext.AccountInfo.ExtraLoan.LoanTmpDocs.Add(tmpdoc);
            }
            var resp = await control.PostLoanDocument(dpcontext);

            var doc = Assert.IsType <CreatedODataResult <FinanceDocument> >(resp).Entity;

            documentsCreated.Add(doc.ID);
            Assert.True(doc.Items.Count == 2);

            // Now check in the databse
            foreach (var docitem in doc.Items)
            {
                if (docitem.AccountID != account.ID)
                {
                    accountsCreated.Add(docitem.AccountID);

                    var acnt = context.FinanceAccount.Find(docitem.AccountID);
                    Assert.NotNull(acnt);
                    if (doctype == FinanceDocumentType.DocType_BorrowFrom)
                    {
                        Assert.True(acnt.CategoryID == FinanceAccountCategory.AccountCategory_BorrowFrom);
                    }
                    else if (doctype == FinanceDocumentType.DocType_LendTo)
                    {
                        Assert.True(acnt.CategoryID == FinanceAccountCategory.AccountCategory_LendTo);
                    }
                    var acntExtraLoan = context.FinanceAccountExtraLoan.Find(docitem.AccountID);
                    Assert.NotNull(acntExtraLoan);
                    Assert.True(acntExtraLoan.RefDocID == doc.ID);

                    var tmpdocs = context.FinanceTmpLoanDocument.Where(p => p.AccountID == docitem.AccountID).OrderBy(p => p.TransactionDate).ToList();
                    Assert.True(rsts.Count == tmpdocs.Count);

                    foreach (var rst in rsts)
                    {
                        DateTime dat  = rst.TranDate;
                        var      tdoc = tmpdocs.Find(p => p.TransactionDate.Date == dat);
                        Assert.NotNull(tdoc);
                        Assert.True(tdoc.AccountID == acntExtraLoan.AccountID);
                    }
                }
            }

            // Last, clear all created objects
            CleanupCreatedEntries();

            await context.DisposeAsync();
        }
        public async Task TestCase1(int hid, string currency, string user, Boolean islegacy)
        {
            List <int> documentsCreated = new List <int>();
            var        context          = this.fixture.GetCurrentDataContext();

            // 0. Prepare the context for current home
            if (hid == DataSetupUtility.Home1ID)
            {
                fixture.InitHome1TestData(context);
            }
            else if (hid == DataSetupUtility.Home2ID)
            {
                fixture.InitHome2TestData(context);
            }
            else if (hid == DataSetupUtility.Home3ID)
            {
                fixture.InitHome3TestData(context);
            }
            else if (hid == DataSetupUtility.Home4ID)
            {
                fixture.InitHome4TestData(context);
            }
            else if (hid == DataSetupUtility.Home5ID)
            {
                fixture.InitHome5TestData(context);
            }
            var account = context.FinanceAccount.Where(p => p.HomeID == hid && p.Status != (Byte)FinanceAccountStatus.Closed).FirstOrDefault();
            var cc      = context.FinanceControlCenter.Where(p => p.HomeID == hid).FirstOrDefault();
            // var orders = context.FinanceOrder.Where(p => p.HomeID == hid).ToList();

            // 1. Buy an asset
            var control   = new FinanceDocumentsController(context);
            var userclaim = DataSetupUtility.GetClaimForUser(user);
            var httpctx   = UnitTestUtility.GetDefaultHttpContext(provider, userclaim);

            control.ControllerContext = new ControllerContext()
            {
                HttpContext = httpctx
            };

            // 1a. Prepare data
            var assetbuycontext = new FinanceAssetBuyDocumentCreateContext();

            assetbuycontext.AccountOwner    = user;
            assetbuycontext.ControlCenterID = cc.ID;
            assetbuycontext.Desp            = "Test buy in";
            // assetbuycontext.ExtraAsset =
            assetbuycontext.HID        = hid;
            assetbuycontext.IsLegacy   = islegacy;
            assetbuycontext.TranAmount = 2000;
            assetbuycontext.TranCurr   = currency;
            assetbuycontext.TranDate   = new DateTime(2020, 1, 1);
            assetbuycontext.Items      = new List <FinanceDocumentItem>();

            if (!islegacy)
            {
                var item2 = new FinanceDocumentItem()
                {
                    ItemID          = 1,
                    Desp            = "Item 1.1",
                    TranType        = 3,
                    TranAmount      = 2000,
                    AccountID       = account.ID,
                    ControlCenterID = cc.ID,
                };
                assetbuycontext.Items.Add(item2);
            }
            assetbuycontext.ExtraAsset            = new FinanceAccountExtraAS();
            assetbuycontext.ExtraAsset.Name       = "Asset to buy";
            assetbuycontext.ExtraAsset.CategoryID = context.FinAssetCategories.ToList()[0].ID;
            assetbuycontext.ExtraAsset.Comment    = "Test 1";

            var resp = await control.PostAssetBuyDocument(assetbuycontext);

            var doc = Assert.IsType <CreatedODataResult <FinanceDocument> >(resp).Entity;

            documentsCreated.Add(doc.ID);
            if (islegacy)
            {
                Assert.True(doc.Items.Count == 1);
            }
            else
            {
                Assert.True(doc.Items.Count == 2);
            }

            var assetacntid = 0;

            if (!islegacy)
            {
                foreach (var docitem in doc.Items)
                {
                    if (docitem.AccountID != account.ID)
                    {
                        assetacntid = docitem.AccountID;

                        var acnt = context.FinanceAccount.Find(docitem.AccountID);
                        Assert.NotNull(acnt);
                        var acntExtraAsset = context.FinanceAccountExtraAS.Find(docitem.AccountID);
                        Assert.NotNull(acntExtraAsset);
                        Assert.True(acntExtraAsset.RefenceBuyDocumentID == doc.ID);
                    }
                }
            }
            else
            {
                // The return result has no account info.
                var acntExtraAsset = context.FinanceAccountExtraAS.First(p => p.RefenceBuyDocumentID == doc.ID);
                Assert.NotNull(acntExtraAsset);

                assetacntid = acntExtraAsset.AccountID;
            }
            // Now check in the databse for items
            var ditems = context.FinanceDocumentItem.Where(p => p.AccountID == assetacntid).ToList();

            Assert.True(ditems.Count == 1);
            // Document item view
            var ditemview = (from diview in context.FinanceDocumentItemView
                             where diview.AccountID == assetacntid
                             select new { diview.AccountID, diview.Amount, diview.IsExpense }
                             ).ToList();

            Assert.True(ditemview.Count == 1);
            // Check the account group with expense
            var acntgrpexp = context.FinanceReporAccountGroupAndExpenseView.Where(p => p.AccountID == assetacntid).First();

            Assert.NotNull(acntgrpexp);
            // Check the balance
            var assetbal = context.FinanceReporAccountGroupView.Where(p => p.AccountID == assetacntid).First();

            Assert.NotNull(assetbal);
            Assert.Equal(2000, assetbal.Balance);

            // Okay, now sell it
            var assetsellcontext = new FinanceAssetSellDocumentCreateContext();

            assetsellcontext.AssetAccountID  = assetacntid;
            assetsellcontext.ControlCenterID = cc.ID;
            assetsellcontext.Desp            = "Test sell";
            assetsellcontext.HID             = hid;
            assetsellcontext.TranAmount      = 1000;
            assetsellcontext.TranCurr        = currency;
            assetsellcontext.TranDate        = new DateTime(2021, 1, 1);
            // Account which received the money
            assetsellcontext.Items = new List <FinanceDocumentItem>();
            var item = new FinanceDocumentItem()
            {
                ItemID          = 1,
                Desp            = "Item 2.1",
                TranType        = FinanceTransactionType.TranType_AssetSoldoutIncome,
                TranAmount      = 1000,
                AccountID       = account.ID,
                ControlCenterID = cc.ID,
            };

            assetsellcontext.Items.Add(item);

            resp = await control.PostAssetSellDocument(assetsellcontext);

            doc = Assert.IsType <CreatedODataResult <FinanceDocument> >(resp).Entity;
            documentsCreated.Add(doc.ID);

            // Last, clear all created objects
            foreach (var docid in documentsCreated)
            {
                this.fixture.DeleteFinanceDocument(context, docid);
            }
            if (assetacntid > 0)
            {
                this.fixture.DeleteFinanceAccount(context, assetacntid);
            }
            await context.SaveChangesAsync();

            await context.DisposeAsync();
        }
        public async Task TestCase1(int hid, string currency, string user, short doctype)
        {
            var context = this.fixture.GetCurrentDataContext();

            // 0. Prepare the context for current home
            if (hid == DataSetupUtility.Home1ID)
            {
                fixture.InitHome1TestData(context);
            }
            else if (hid == DataSetupUtility.Home2ID)
            {
                fixture.InitHome2TestData(context);
            }
            else if (hid == DataSetupUtility.Home3ID)
            {
                fixture.InitHome3TestData(context);
            }
            else if (hid == DataSetupUtility.Home4ID)
            {
                fixture.InitHome4TestData(context);
            }
            else if (hid == DataSetupUtility.Home5ID)
            {
                fixture.InitHome5TestData(context);
            }
            var account = context.FinanceAccount.Where(p => p.HomeID == hid && p.Status != (Byte)FinanceAccountStatus.Closed).FirstOrDefault();
            var cc      = context.FinanceControlCenter.Where(p => p.HomeID == hid).FirstOrDefault();

            // 1. Create DP docs.
            var control   = new FinanceDocumentsController(context);
            var userclaim = DataSetupUtility.GetClaimForUser(user);
            var httpctx   = UnitTestUtility.GetDefaultHttpContext(provider, userclaim);

            control.ControllerContext = new ControllerContext()
            {
                HttpContext = httpctx
            };

            // 1a. Prepare data
            var dpcontext = new FinanceADPDocumentCreateContext();

            dpcontext.DocumentInfo = new FinanceDocument()
            {
                HomeID   = hid,
                DocType  = doctype,
                TranCurr = currency,
                Desp     = "Test 1"
            };
            var item = new FinanceDocumentItem()
            {
                DocumentHeader = dpcontext.DocumentInfo,
                ItemID         = 1,
                Desp           = "Item 1.1",
                TranType       = doctype == FinanceDocumentType.DocType_AdvancePayment
                    ? FinanceTransactionType.TranType_AdvancePaymentOut
                    : FinanceTransactionType.TranType_AdvanceReceiveIn,
                TranAmount      = 1200,
                AccountID       = account.ID,
                ControlCenterID = cc.ID,
            };

            dpcontext.DocumentInfo.Items.Add(item);
            dpcontext.AccountInfo = new FinanceAccount()
            {
                HomeID     = hid,
                Name       = "Account_8" + ".1",
                CategoryID = doctype == FinanceDocumentType.DocType_AdvancePayment
                        ? FinanceAccountCategory.AccountCategory_AdvancePayment
                        : FinanceAccountCategory.AccountCategory_AdvanceReceive,
                Owner  = user,
                Status = (Byte)FinanceAccountStatus.Normal,
            };
            var startdate = DateTime.Today;
            var enddate   = DateTime.Today.AddMonths(6);

            dpcontext.AccountInfo.ExtraDP = new FinanceAccountExtraDP()
            {
                StartDate  = startdate,
                EndDate    = enddate,
                RepeatType = RepeatFrequency.Month,
                Comment    = "Test",
            };
            var rsts = CommonUtility.WorkoutRepeatedDatesWithAmount(new RepeatDatesWithAmountCalculationInput
            {
                StartDate   = startdate,
                EndDate     = enddate,
                TotalAmount = item.TranAmount,
                RepeatType  = RepeatFrequency.Month,
                Desp        = item.Desp,
            });
            var tmpdocid = 1;

            foreach (var rst in rsts)
            {
                var tmpdoc = new FinanceTmpDPDocument
                {
                    DocumentID      = tmpdocid++,
                    TranAmount      = rst.TranAmount,
                    TransactionDate = rst.TranDate,
                    HomeID          = hid,
                    TransactionType = 5,
                    ControlCenterID = item.ControlCenterID,
                    OrderID         = item.OrderID,
                    Description     = item.Desp
                };

                dpcontext.AccountInfo.ExtraDP.DPTmpDocs.Add(tmpdoc);
            }
            var resp = await control.PostDPDocument(dpcontext);

            var doc = Assert.IsType <CreatedODataResult <FinanceDocument> >(resp).Entity;

            documentsCreated.Add(doc.ID);
            Assert.True(doc.Items.Count == 2);
            var dpacntid = -1;

            foreach (var did in doc.Items)
            {
                if (did.AccountID != account.ID)
                {
                    dpacntid = did.AccountID;
                    accountsCreated.Add(dpacntid);
                }
            }

            // 2. Switch to second controller
            var tmpcontrol = new FinanceTmpDPDocumentsController(context);

            tmpcontrol.ControllerContext = new ControllerContext()
            {
                HttpContext = httpctx
            };
            var tmpdocs = tmpcontrol.Get();

            Assert.NotEmpty(tmpdocs);
            Assert.Equal(rsts.Count, tmpdocs.Count());
            var dpdocs = tmpdocs.Cast <FinanceTmpDPDocument>();

            // 3. Create repay document
            foreach (var dpdoc in dpdocs)
            {
                var dppostcontext = new FinanceTmpDPDocumentPostContext()
                {
                    DocumentID = dpdoc.DocumentID,
                    AccountID  = dpdoc.AccountID,
                    HomeID     = dpdoc.HomeID,
                };
                var repaydocresp = await tmpcontrol.PostDocument(dppostcontext);

                var repaydoc = Assert.IsType <CreatedODataResult <FinanceDocument> >(repaydocresp);
                Assert.True(repaydoc.Entity.ID > 0);
                documentsCreated.Add(repaydoc.Entity.ID);

                // Check in the database
                var dpdocInDB = context.FinanceTmpDPDocument.Where(p => p.DocumentID == dpdoc.DocumentID).SingleOrDefault();
                Assert.NotNull(dpdocInDB);
                Assert.NotNull(dpdocInDB.ReferenceDocumentID);
            }

            // Check the account status
            var account2 = context.FinanceAccount.Where(p => p.HomeID == hid && p.ID == dpacntid).FirstOrDefault();

            Assert.True(account2.Status == (Byte)FinanceAccountStatus.Closed);

            CleanupCreatedEntries();

            await context.DisposeAsync();
        }
        public async Task TestCase1_InterestFree(int hid, string currency, string user, short doctype)
        {
            var context = this.fixture.GetCurrentDataContext();

            // 0. Prepare the context for current home
            if (hid == DataSetupUtility.Home1ID)
            {
                fixture.InitHome1TestData(context);
            }
            else if (hid == DataSetupUtility.Home2ID)
            {
                fixture.InitHome2TestData(context);
            }
            else if (hid == DataSetupUtility.Home3ID)
            {
                fixture.InitHome3TestData(context);
            }
            else if (hid == DataSetupUtility.Home4ID)
            {
                fixture.InitHome4TestData(context);
            }
            else if (hid == DataSetupUtility.Home5ID)
            {
                fixture.InitHome5TestData(context);
            }
            var account = context.FinanceAccount.Where(p => p.HomeID == hid && p.Status != (Byte)FinanceAccountStatus.Closed).FirstOrDefault();
            var cc      = context.FinanceControlCenter.Where(p => p.HomeID == hid).FirstOrDefault();

            // 1. Create first Loan docs.
            var control   = new FinanceDocumentsController(context);
            var userclaim = DataSetupUtility.GetClaimForUser(user);
            var httpctx   = UnitTestUtility.GetDefaultHttpContext(provider, userclaim);

            control.ControllerContext = new ControllerContext()
            {
                HttpContext = httpctx
            };

            // 1a. Prepare data
            var dpcontext = new FinanceLoanDocumentCreateContext();

            dpcontext.DocumentInfo = new FinanceDocument()
            {
                HomeID   = hid,
                DocType  = doctype,
                TranCurr = currency,
                Desp     = "Test 1"
            };
            var item = new FinanceDocumentItem()
            {
                DocumentHeader = dpcontext.DocumentInfo,
                ItemID         = 1,
                Desp           = "Item 1.1",
                TranType       = doctype == FinanceDocumentType.DocType_BorrowFrom
                        ? FinanceTransactionType.TranType_BorrowFrom
                        : FinanceTransactionType.TranType_LendTo,
                TranAmount      = 1200,
                AccountID       = account.ID,
                ControlCenterID = cc.ID,
            };

            dpcontext.DocumentInfo.Items.Add(item);
            dpcontext.AccountInfo = new FinanceAccount()
            {
                HomeID     = hid,
                Name       = "Account_8" + ".1",
                CategoryID = doctype == FinanceDocumentType.DocType_BorrowFrom
                    ? FinanceAccountCategory.AccountCategory_BorrowFrom
                    : FinanceAccountCategory.AccountCategory_LendTo,
                Owner  = user,
                Status = (Byte)FinanceAccountStatus.Normal,
            };
            var startdate = new DateTime(2020, 1, 10);
            var enddate   = new DateTime(2021, 1, 10);

            dpcontext.AccountInfo.ExtraLoan = new FinanceAccountExtraLoan()
            {
                StartDate       = startdate,
                EndDate         = enddate,
                TotalMonths     = 12,
                RepaymentMethod = LoanRepaymentMethod.EqualPrincipal,
                InterestFree    = true,
            };
            var rsts = CommonUtility.WorkoutRepeatedDatesWithAmountAndInterest(new RepeatDatesWithAmountAndInterestCalInput
            {
                RepaymentMethod  = dpcontext.AccountInfo.ExtraLoan.RepaymentMethod.Value,
                InterestFreeLoan = dpcontext.AccountInfo.ExtraLoan.InterestFree.Value,
                StartDate        = dpcontext.AccountInfo.ExtraLoan.StartDate,
                TotalAmount      = 1200,
                EndDate          = dpcontext.AccountInfo.ExtraLoan.EndDate,
                TotalMonths      = dpcontext.AccountInfo.ExtraLoan.TotalMonths.Value,
                FirstRepayDate   = new DateTime(2020, 2, 15)
            });
            var tmpdocid = 1;

            foreach (var rst in rsts)
            {
                var tmpdoc = new FinanceTmpLoanDocument
                {
                    DocumentID        = tmpdocid++,
                    TransactionAmount = rst.TranAmount,
                    InterestAmount    = rst.InterestAmount,
                    TransactionDate   = rst.TranDate,
                    HomeID            = hid,
                    ControlCenterID   = item.ControlCenterID,
                    OrderID           = item.OrderID,
                    Description       = item.Desp,
                };

                dpcontext.AccountInfo.ExtraLoan.LoanTmpDocs.Add(tmpdoc);
            }
            var resp = await control.PostLoanDocument(dpcontext);

            var doc = Assert.IsType <CreatedODataResult <FinanceDocument> >(resp).Entity;

            documentsCreated.Add(doc.ID);
            var loanacntid = -1;

            foreach (var docitem in doc.Items)
            {
                if (docitem.AccountID != account.ID)
                {
                    loanacntid = docitem.AccountID;
                    accountsCreated.Add(loanacntid);
                }
            }
            Assert.True(doc.Items.Count == 2);

            // 2. Switch to second controller
            var tmpcontrol = new FinanceTmpLoanDocumentsController(context);

            tmpcontrol.ControllerContext = new ControllerContext()
            {
                HttpContext = httpctx
            };
            var tmpdocs = tmpcontrol.Get();

            Assert.NotEmpty(tmpdocs);
            Assert.Equal(rsts.Count, tmpdocs.Count());
            var dpdocs = tmpdocs.Cast <FinanceTmpLoanDocument>();

            // 3. Create repay document
            foreach (var dpdoc in dpdocs)
            {
                var contxt = new FinanceLoanRepayDocumentCreateContext();
                contxt.HomeID = hid;
                contxt.LoanTemplateDocumentID = dpdoc.DocumentID;
                contxt.DocumentInfo           = new FinanceDocument
                {
                    DocType  = FinanceDocumentType.DocType_Repay,
                    HomeID   = hid,
                    Desp     = dpdoc.Description,
                    TranCurr = currency,
                };
                contxt.DocumentInfo.Items.Add(new FinanceDocumentItem
                {
                    ItemID          = 1,
                    AccountID       = dpdoc.AccountID,
                    TranAmount      = dpdoc.TransactionAmount,
                    ControlCenterID = dpdoc.ControlCenterID,
                    OrderID         = dpdoc.OrderID,
                    TranType        = doctype == FinanceDocumentType.DocType_BorrowFrom
                        ? FinanceTransactionType.TranType_RepaymentIn
                        : FinanceTransactionType.TranType_RepaymentOut,
                });
                contxt.DocumentInfo.Items.Add(new FinanceDocumentItem
                {
                    ItemID          = 2,
                    AccountID       = account.ID,
                    TranAmount      = dpdoc.TransactionAmount,
                    ControlCenterID = dpdoc.ControlCenterID,
                    OrderID         = dpdoc.OrderID,
                    TranType        = doctype == FinanceDocumentType.DocType_BorrowFrom
                        ? FinanceTransactionType.TranType_RepaymentOut
                        : FinanceTransactionType.TranType_RepaymentIn,
                });
                var repaydocresp = await tmpcontrol.PostRepayDocument(contxt);

                var repaydoc = Assert.IsType <CreatedODataResult <FinanceDocument> >(repaydocresp);
                Assert.True(repaydoc.Entity.ID > 0);
                documentsCreated.Add(repaydoc.Entity.ID);

                // Check in the database
                var dpdocInDB = context.FinanceTmpLoanDocument.Where(p => p.DocumentID == dpdoc.DocumentID).SingleOrDefault();
                Assert.NotNull(dpdocInDB);
                Assert.NotNull(dpdocInDB.ReferenceDocumentID);
            }

            // 4. Now the account shall be closed automatically
            var account2 = context.FinanceAccount.Where(p => p.HomeID == hid && p.ID == loanacntid).FirstOrDefault();

            Assert.True(account2.Status == (Byte)FinanceAccountStatus.Closed);

            // Last, clear all created objects
            CleanupCreatedEntries();

            await context.DisposeAsync();
        }