public async Task TestCase1() { string token = await IdentityServerSetup.Instance.GetAccessTokenForUser(DataSetupUtility.UserA, DataSetupUtility.IntegrationTestPassword); var clientWithAuth = _factory.CreateClient(); clientWithAuth.SetBearerToken(token); // Step 1. Metadata request var metadata = await this._client.GetAsync("/api/$metadata"); Assert.Equal(HttpStatusCode.OK, metadata.StatusCode); var content = await metadata.Content.ReadAsStringAsync(); if (content.Length > 0) { // How to verify metadata? // TBD. } // Step 2. Read Home Defines - Non authority case var req1 = await this._client.GetAsync("/api/HomeDefines"); Assert.Equal(HttpStatusCode.Unauthorized, req1.StatusCode); // Step 3. Read Home Defines - Authority case var resp2 = await clientWithAuth.GetAsync("/api/HomeDefines"); Assert.True(resp2.IsSuccessStatusCode); string result = resp2.Content.ReadAsStringAsync().Result; if (!String.IsNullOrEmpty(result)) { JToken outer = JToken.Parse(result); // Old way to deserialize the arry JArray inner = outer["value"].Value <JArray>(); var dfs = inner.ToObject <List <HomeDefine> >(); Assert.Equal(2, dfs.Count); // For user A, Home1 Is a must var bHome1Exist = false; foreach (var df in dfs) { Assert.NotNull(df); Assert.True(df.ID > 0); Assert.False(String.IsNullOrEmpty(df.Name)); Assert.NotNull(df.HomeMembers); if (df.ID == DataSetupUtility.Home1ID) { bHome1Exist = true; } } Assert.True(bHome1Exist); } // Step 4. Read home defines - with home members resp2 = await clientWithAuth.GetAsync("/api/HomeDefines?$expand=HomeMembers"); Assert.True(resp2.IsSuccessStatusCode); result = resp2.Content.ReadAsStringAsync().Result; if (!String.IsNullOrEmpty(result)) { JToken outer = JToken.Parse(result); JArray inner = outer["value"].Value <JArray>(); var dfs = inner.ToObject <List <HomeDefine> >(); Assert.Equal(2, dfs.Count); // For user A, Home1 Is a must foreach (var df in dfs) { Assert.NotNull(df); Assert.True(df.ID > 0); Assert.False(String.IsNullOrEmpty(df.Name)); Assert.NotNull(df.HomeMembers); var exist = df.HomeMembers.Single(p => p.User == DataSetupUtility.UserA); Assert.NotNull(exist); } } var hid = DataSetupUtility.Home1ID; var cc1id = 0; var ord1id = 0; var acnt1id = 0; var doc1id = 0; var jsetting = new JsonSerializerSettings(); jsetting.Converters.Add(new StringEnumConverter()); jsetting.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; jsetting.DateFormatString = "yyyy-MM-dd"; // Step 5. Create a control center var cc = new FinanceControlCenter() { HomeID = hid, Name = "Control Center 1", Comment = "Comment 1", Owner = DataSetupUtility.UserA }; var kjson = JsonConvert.SerializeObject(cc, jsetting); var inputContent = new StringContent(kjson, Encoding.UTF8, "application/json"); resp2 = await clientWithAuth.PostAsync("/api/FinanceControlCenters", inputContent); Assert.True(resp2.IsSuccessStatusCode); result = resp2.Content.ReadAsStringAsync().Result; if (!String.IsNullOrEmpty(result)) { var odatarst = JsonConvert.DeserializeObject <FinanceControlCenter>(result); Assert.Equal(odatarst.Name, cc.Name); Assert.Equal(odatarst.HomeID, cc.HomeID); Assert.Equal(odatarst.Owner, cc.Owner); cc1id = odatarst.ID; Assert.True(cc1id > 0); } // Step 6. Create an order var ord = new FinanceOrder() { HomeID = hid, Name = "Order 1", Comment = "Comment 1" }; var srule = new FinanceOrderSRule() { Order = ord, RuleID = 1, ControlCenterID = cc1id, Precent = 100 }; ord.SRule.Add(srule); kjson = JsonConvert.SerializeObject(ord, jsetting); inputContent = new StringContent(kjson, Encoding.UTF8, "application/json"); resp2 = await clientWithAuth.PostAsync("/api/FinanceOrders", inputContent); Assert.True(resp2.IsSuccessStatusCode); result = resp2.Content.ReadAsStringAsync().Result; if (!String.IsNullOrEmpty(result)) { var odatarst = JsonConvert.DeserializeObject <FinanceOrder>(result); Assert.Equal(odatarst.Name, ord.Name); ord1id = odatarst.ID; Assert.True(ord1id > 0); } // Step 7. Create an account var acnt = new FinanceAccount() { HomeID = DataSetupUtility.Home1ID, Name = "Account 1", CategoryID = FinanceAccountCategory.AccountCategory_Cash, Owner = DataSetupUtility.UserA }; kjson = JsonConvert.SerializeObject(acnt, jsetting); inputContent = new StringContent(kjson, Encoding.UTF8, "application/json"); resp2 = await clientWithAuth.PostAsync("/api/FinanceAccounts", inputContent); Assert.True(resp2.IsSuccessStatusCode); result = resp2.Content.ReadAsStringAsync().Result; if (!String.IsNullOrEmpty(result)) { var odatarst = JsonConvert.DeserializeObject <FinanceAccount>(result); Assert.Equal(odatarst.Name, acnt.Name); acnt1id = odatarst.ID; Assert.True(acnt1id > 0); } // Step 7a. Get all accounts resp2 = await clientWithAuth.GetAsync("/api/FinanceAccounts?hid=" + hid.ToString()); Assert.True(resp2.IsSuccessStatusCode); result = resp2.Content.ReadAsStringAsync().Result; if (!String.IsNullOrEmpty(result)) { //var odatarst = JsonConvert.DeserializeObject<FinanceAccount>(result); //Assert.Equal(odatarst.Name, acnt.Name); //acnt1id = odatarst.ID; //Assert.True(acnt1id > 0); } // Step 7b. Read one specified account resp2 = await clientWithAuth.GetAsync("/api/FinanceAccounts(" + acnt1id.ToString() + ")"); // ?hid=" + hid.ToString()); Assert.True(resp2.IsSuccessStatusCode); result = resp2.Content.ReadAsStringAsync().Result; if (!String.IsNullOrEmpty(result)) { } // Step 8. Post a document var doc = new FinanceDocument() { DocType = FinanceDocumentType.DocType_Normal, HomeID = hid, TranDate = DateTime.Today, Desp = "First document", TranCurr = DataSetupUtility.Home1BaseCurrency, }; var item = new FinanceDocumentItem() { DocumentHeader = doc, ItemID = 1, Desp = "Item 1.1", TranType = 2, // Wage TranAmount = 10, AccountID = acnt1id, ControlCenterID = cc1id, }; doc.Items.Add(item); jsetting.NullValueHandling = NullValueHandling.Ignore; kjson = JsonConvert.SerializeObject(doc, jsetting); inputContent = new StringContent(kjson, Encoding.UTF8, "application/json"); resp2 = await clientWithAuth.PostAsync("/api/FinanceDocuments", inputContent); Assert.True(resp2.IsSuccessStatusCode); result = resp2.Content.ReadAsStringAsync().Result; if (!String.IsNullOrEmpty(result)) { var odatarst = JsonConvert.DeserializeObject <FinanceDocument>(result); Assert.Equal(odatarst.Desp, doc.Desp); doc1id = odatarst.ID; Assert.True(doc1id > 0); } // Step 9. Create an ADP document //var adpcontext = new FinanceADPDocumentCreateContext(); //adpcontext.DocumentInfo = new FinanceDocument(); //adpcontext.AccountInfo = new FinanceAccount(); }
public async Task <IActionResult> PostAssetBuyDocument([FromBody] FinanceAssetBuyDocumentCreateContext createContext) { if (!ModelState.IsValid) { HIHAPIUtility.HandleModalStateError(ModelState); } if (createContext == null || createContext.ExtraAsset == null) { throw new BadRequestException("No data is inputted"); } if (createContext.HID <= 0) { throw new BadRequestException("Not HID inputted"); } // User String usrName = String.Empty; try { usrName = HIHAPIUtility.GetUserID(this); if (String.IsNullOrEmpty(usrName)) { throw new UnauthorizedAccessException(); } } catch { throw new UnauthorizedAccessException(); } // Check whether User assigned with specified Home ID var hms = _context.HomeMembers.Where(p => p.HomeID == createContext.HID && p.User == usrName).Count(); if (hms <= 0) { throw new UnauthorizedAccessException(); } // Do basic checks if (String.IsNullOrEmpty(createContext.TranCurr) || String.IsNullOrEmpty(createContext.ExtraAsset.Name)) { throw new BadRequestException("Invalid input data"); } if (createContext.IsLegacy.HasValue && createContext.IsLegacy.Value) { if (createContext.Items.Count > 0) { throw new BadRequestException("Invalid input data"); } } else { if (createContext.Items.Count <= 0) { throw new BadRequestException("Invalid input data"); } } foreach (var di in createContext.Items) { if (di.TranAmount == 0 || di.AccountID <= 0 || di.TranType <= 0 || (di.ControlCenterID <= 0 && di.OrderID <= 0)) { throw new BadRequestException("Invalid input data in items!"); } } // Construct the Account var vmAccount = new FinanceAccount(); vmAccount.HomeID = createContext.HID; vmAccount.Name = createContext.ExtraAsset.Name; vmAccount.Status = (Byte)FinanceAccountStatus.Normal; vmAccount.CategoryID = FinanceAccountCategory.AccountCategory_Asset; vmAccount.ExtraAsset = new FinanceAccountExtraAS(); vmAccount.Owner = createContext.AccountOwner; vmAccount.Comment = createContext.ExtraAsset.Comment; vmAccount.ExtraAsset.Name = createContext.ExtraAsset.Name; vmAccount.ExtraAsset.Comment = createContext.ExtraAsset.Comment; vmAccount.ExtraAsset.CategoryID = createContext.ExtraAsset.CategoryID; vmAccount.ExtraAsset.AccountHeader = vmAccount; // Construct the Doc. var vmFIDoc = new FinanceDocument(); vmFIDoc.DocType = FinanceDocumentType.DocType_AssetBuyIn; vmFIDoc.Desp = createContext.Desp; vmFIDoc.TranDate = createContext.TranDate; vmFIDoc.HomeID = createContext.HID; vmFIDoc.TranCurr = createContext.TranCurr; var maxItemID = 0; if (createContext.IsLegacy.HasValue && createContext.IsLegacy.Value) { // Legacy account... } else { Decimal totalAmt = 0; foreach (var di in createContext.Items) { if (di.ItemID <= 0 || di.TranAmount == 0 || di.AccountID <= 0 || (di.ControlCenterID <= 0 && di.OrderID <= 0)) { throw new BadRequestException("Invalid input data in items!"); } // Todo: new check the tran. type is an expense! totalAmt += di.TranAmount; vmFIDoc.Items.Add(di); if (maxItemID < di.ItemID) { maxItemID = di.ItemID; } } if (totalAmt != createContext.TranAmount) { throw new BadRequestException("Amount is not even"); } } // Database update var errorString = ""; var errorOccur = false; var origdocid = 0; var assetaccountid = 0; using (var transaction = _context.Database.BeginTransaction()) { try { // 1. Create the document vmFIDoc.Createdby = usrName; vmFIDoc.CreatedAt = DateTime.Now; var docEntity = _context.FinanceDocument.Add(vmFIDoc); await _context.SaveChangesAsync(); origdocid = docEntity.Entity.ID; // 2, Create the account vmAccount.ExtraAsset.RefenceBuyDocumentID = origdocid; vmAccount.CreatedAt = DateTime.Now; vmAccount.Createdby = usrName; var acntEntity = _context.FinanceAccount.Add(vmAccount); await _context.SaveChangesAsync(); assetaccountid = acntEntity.Entity.ID; // 3. Update the document by adding one more item var nitem = new FinanceDocumentItem(); nitem.ItemID = ++maxItemID; nitem.AccountID = assetaccountid; nitem.TranAmount = createContext.TranAmount; nitem.Desp = vmFIDoc.Desp; nitem.TranType = FinanceTransactionType.TranType_OpeningAsset; if (createContext.ControlCenterID.HasValue) { nitem.ControlCenterID = createContext.ControlCenterID.Value; } if (createContext.OrderID.HasValue) { nitem.OrderID = createContext.OrderID.Value; } nitem.DocumentHeader = vmFIDoc; docEntity.Entity.Items.Add(nitem); docEntity.State = EntityState.Modified; await _context.SaveChangesAsync(); vmFIDoc = docEntity.Entity; transaction.Commit(); } catch (Exception exp) { errorOccur = true; errorString = exp.Message; transaction.Rollback(); } } if (errorOccur) { throw new BadRequestException(errorString); } return(Created(vmFIDoc)); }
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(); }
public async Task <IActionResult> PostAssetSellDocument([FromBody] FinanceAssetSellDocumentCreateContext createContext) { if (!ModelState.IsValid) { HIHAPIUtility.HandleModalStateError(ModelState); } if (createContext.HID <= 0) { throw new BadRequestException("Not HID inputted"); } if (createContext.AssetAccountID <= 0) { throw new BadRequestException("Asset Account is invalid"); } if (createContext.TranAmount <= 0) { throw new BadRequestException("Amount is less than zero"); } if (createContext.Items.Count <= 0) { throw new BadRequestException("No items inputted"); } // User String usrName = String.Empty; try { usrName = HIHAPIUtility.GetUserID(this); if (String.IsNullOrEmpty(usrName)) { throw new UnauthorizedAccessException(); } } catch { throw new UnauthorizedAccessException(); } // Check whether User assigned with specified Home ID var hms = _context.HomeMembers.Where(p => p.HomeID == createContext.HID && p.User == usrName).Count(); if (hms <= 0) { throw new UnauthorizedAccessException(); } // Construct the Doc. var vmFIDoc = new FinanceDocument(); vmFIDoc.DocType = FinanceDocumentType.DocType_AssetSoldOut; vmFIDoc.Desp = createContext.Desp; vmFIDoc.TranDate = createContext.TranDate; vmFIDoc.HomeID = createContext.HID; vmFIDoc.TranCurr = createContext.TranCurr; Decimal totalAmt = 0; var maxItemID = 0; foreach (var di in createContext.Items) { if (di.ItemID <= 0 || di.TranAmount == 0 || di.AccountID <= 0 || di.TranType != FinanceTransactionType.TranType_AssetSoldoutIncome || (di.ControlCenterID <= 0 && di.OrderID <= 0)) { throw new BadRequestException("Invalid input data in items!"); } totalAmt += di.TranAmount; vmFIDoc.Items.Add(di); if (maxItemID < di.ItemID) { maxItemID = di.ItemID; } } if (Decimal.Compare(totalAmt, createContext.TranAmount) != 0) { throw new BadRequestException("Amount is not even"); } // Check 1: check account is a valid asset? var query = (from account in this._context.FinanceAccount join assetaccount in this._context.FinanceAccountExtraAS on account.ID equals assetaccount.AccountID where account.ID == createContext.AssetAccountID select new { Status = account.Status, RefSellDoc = assetaccount.RefenceSoldDocumentID }).FirstOrDefault(); if (query.Status != (Byte)FinanceAccountStatus.Normal) { throw new BadRequestException("Account status is not normal"); } if (query.RefSellDoc != null) { throw new BadRequestException("Asset has soldout doc already"); } // Check 2: check the inputted date is valid > must be the later than all existing transactions; var query2 = (from docitem in this._context.FinanceDocumentItem join docheader in this._context.FinanceDocument on docitem.DocID equals docheader.ID where docitem.AccountID == createContext.AssetAccountID orderby docheader.TranDate descending select new { TranDate = docheader.TranDate }).FirstOrDefault(); if (createContext.TranDate < query2.TranDate) { throw new BadRequestException("Tran. data is invalid"); } // Check 3. Fetch current balance var query3 = (from acntbal in this._context.FinanceReporAccountGroupView where acntbal.AccountID == createContext.AssetAccountID select acntbal.Balance).First(); if (query3 <= 0) { throw new BadRequestException("Balance is less than zero"); } var nitem = new FinanceDocumentItem(); nitem.ItemID = ++maxItemID; nitem.AccountID = createContext.AssetAccountID; nitem.TranAmount = createContext.TranAmount; nitem.Desp = vmFIDoc.Desp; nitem.TranType = FinanceTransactionType.TranType_AssetSoldout; if (createContext.ControlCenterID.HasValue) { nitem.ControlCenterID = createContext.ControlCenterID.Value; } if (createContext.OrderID.HasValue) { nitem.OrderID = createContext.OrderID.Value; } nitem.DocumentHeader = vmFIDoc; vmFIDoc.Items.Add(nitem); var ncmprst = Decimal.Compare(query3, createContext.TranAmount); if (ncmprst > 0) { var nitem2 = new FinanceDocumentItem(); nitem2.ItemID = ++maxItemID; nitem2.AccountID = createContext.AssetAccountID; nitem2.TranAmount = Decimal.Subtract(query3, createContext.TranAmount); nitem2.Desp = vmFIDoc.Desp; nitem2.TranType = FinanceTransactionType.TranType_AssetValueDecrease; if (createContext.ControlCenterID.HasValue) { nitem2.ControlCenterID = createContext.ControlCenterID.Value; } if (createContext.OrderID.HasValue) { nitem2.OrderID = createContext.OrderID.Value; } nitem.DocumentHeader = vmFIDoc; vmFIDoc.Items.Add(nitem2); } else if (ncmprst < 0) { var nitem2 = new FinanceDocumentItem(); nitem2.ItemID = ++maxItemID; nitem2.AccountID = createContext.AssetAccountID; nitem2.TranAmount = Decimal.Subtract(createContext.TranAmount, query3); nitem2.Desp = vmFIDoc.Desp; nitem2.TranType = FinanceTransactionType.TranType_AssetValueIncrease; if (createContext.ControlCenterID.HasValue) { nitem2.ControlCenterID = createContext.ControlCenterID.Value; } if (createContext.OrderID.HasValue) { nitem2.OrderID = createContext.OrderID.Value; } nitem.DocumentHeader = vmFIDoc; vmFIDoc.Items.Add(nitem2); } // Database update var errorString = ""; var errorOccur = false; var origdocid = 0; using (var transaction = _context.Database.BeginTransaction()) { try { // 1. Create the document vmFIDoc.CreatedAt = DateTime.Now; vmFIDoc.Createdby = usrName; var docEntity = _context.FinanceDocument.Add(vmFIDoc); await _context.SaveChangesAsync(); origdocid = docEntity.Entity.ID; vmFIDoc = docEntity.Entity; transaction.Commit(); } catch (Exception exp) { errorOccur = true; errorString = exp.Message; transaction.Rollback(); } } if (errorOccur) { throw new BadRequestException(errorString); } return(Created(vmFIDoc)); }
public async Task <IActionResult> PostLoanDocument([FromBody] FinanceLoanDocumentCreateContext createContext) { if (!ModelState.IsValid) { HIHAPIUtility.HandleModalStateError(ModelState); } if (createContext == null || createContext.DocumentInfo == null || createContext.AccountInfo == null || createContext.AccountInfo.HomeID <= 0 || createContext.AccountInfo.Status != (Byte)FinanceAccountStatus.Normal || createContext.DocumentInfo.HomeID <= 0 || createContext.DocumentInfo.HomeID != createContext.AccountInfo.HomeID || createContext.AccountInfo.ExtraLoan == null || createContext.AccountInfo.ExtraLoan.LoanTmpDocs.Count <= 0) { throw new BadRequestException("Invalid inputted data"); } // Check tmp doc ID var tmpdocids = new Dictionary <int, int>(); foreach (var tmpdoc in createContext.AccountInfo.ExtraLoan.LoanTmpDocs) { if (tmpdoc.DocumentID <= 0) { throw new BadRequestException("Invalid document ID"); } if (tmpdocids.ContainsKey(tmpdoc.DocumentID)) { throw new BadRequestException("Duplicated Document ID found: " + tmpdoc.DocumentID); } tmpdocids.Add(tmpdoc.DocumentID, tmpdoc.DocumentID); } // User String usrName = String.Empty; try { usrName = HIHAPIUtility.GetUserID(this); if (String.IsNullOrEmpty(usrName)) { throw new UnauthorizedAccessException(); } } catch { throw new UnauthorizedAccessException(); } // Check whether User assigned with specified Home ID var hms = _context.HomeMembers.Where(p => p.HomeID == createContext.AccountInfo.HomeID && p.User == usrName).Count(); if (hms <= 0) { throw new UnauthorizedAccessException(); } if (!(createContext.DocumentInfo.DocType == FinanceDocumentType.DocType_BorrowFrom || createContext.DocumentInfo.DocType == FinanceDocumentType.DocType_LendTo)) { throw new BadRequestException("Invalid document type"); } if (createContext.DocumentInfo.Items.Count != 1) { throw new BadRequestException("Only one item doc is supported by far"); } foreach (var tdoc in createContext.AccountInfo.ExtraLoan.LoanTmpDocs) { if (!tdoc.ControlCenterID.HasValue && !tdoc.OrderID.HasValue) { throw new BadRequestException("Either control center or order shall be specified in Loan Template doc"); } if (tdoc.TransactionAmount <= 0) { throw new BadRequestException("Amount is zero!"); } tdoc.Createdby = usrName; tdoc.CreatedAt = DateTime.Now; } // Database update var errorString = ""; var errorOccur = false; var origdocid = 0; var dpaccountid = 0; using (var transaction = _context.Database.BeginTransaction()) { try { // 1. Create document createContext.DocumentInfo.Createdby = usrName; createContext.DocumentInfo.CreatedAt = DateTime.Now; var docEntity = _context.FinanceDocument.Add(createContext.DocumentInfo); await _context.SaveChangesAsync(); origdocid = docEntity.Entity.ID; // 2, Create the account createContext.AccountInfo.ExtraLoan.RefDocID = origdocid; createContext.AccountInfo.CreatedAt = DateTime.Now; createContext.AccountInfo.Createdby = usrName; var acntEntity = _context.FinanceAccount.Add(createContext.AccountInfo); await _context.SaveChangesAsync(); dpaccountid = acntEntity.Entity.ID; // 3, Update the document var itemid = docEntity.Entity.Items.ElementAt(0).ItemID; // _context.Attach(docEntity); var ndi = new FinanceDocumentItem(); ndi.ItemID = ++itemid; ndi.AccountID = dpaccountid; ndi.ControlCenterID = docEntity.Entity.Items.ElementAt(0).ControlCenterID; ndi.OrderID = docEntity.Entity.Items.ElementAt(0).OrderID; ndi.Desp = docEntity.Entity.Items.ElementAt(0).Desp; ndi.TranAmount = docEntity.Entity.Items.ElementAt(0).TranAmount; ndi.UseCurr2 = docEntity.Entity.Items.ElementAt(0).UseCurr2; if (createContext.DocumentInfo.DocType == FinanceDocumentType.DocType_BorrowFrom) { ndi.TranType = FinanceTransactionType.TranType_OpeningLiability; } else if (createContext.DocumentInfo.DocType == FinanceDocumentType.DocType_LendTo) { ndi.TranType = FinanceTransactionType.TranType_OpeningAsset; } docEntity.Entity.Items.Add(ndi); docEntity.State = EntityState.Modified; await _context.SaveChangesAsync(); transaction.Commit(); } catch (Exception exp) { errorOccur = true; errorString = exp.Message; transaction.Rollback(); } } if (errorOccur) { throw new BadRequestException(errorString); } return(Created(createContext.DocumentInfo)); }
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 <IActionResult> PostDocument([FromBody] FinanceTmpDPDocumentPostContext context) { // User String usrName = String.Empty; try { usrName = HIHAPIUtility.GetUserID(this); if (String.IsNullOrEmpty(usrName)) { throw new UnauthorizedAccessException(); } } catch { throw new UnauthorizedAccessException(); } var tpdoc = _context.FinanceTmpDPDocument .Where(p => p.DocumentID == context.DocumentID && p.AccountID == context.AccountID && p.HomeID == context.HomeID) .SingleOrDefault(); if (tpdoc == null) { return(NotFound()); } // Check 1: Home ID var hms = from hmem in _context.HomeMembers where hmem.User == usrName && hmem.HomeID == tpdoc.HomeID select new { HomeID = hmem.HomeID } into hids join homedefs in _context.HomeDefines on hids.HomeID equals homedefs.ID select new { HomeID = homedefs.ID, BaseCurrency = homedefs.BaseCurrency }; if (hms.Count() != 1) { throw new UnauthorizedAccessException(); } var homes = hms.ToList(); // Check 2: Document posted already? if (tpdoc.ReferenceDocumentID.HasValue && tpdoc.ReferenceDocumentID.Value > 0) { throw new BadRequestException("Tmp Doc not existed yet or has been posted"); } if (!tpdoc.ControlCenterID.HasValue && !tpdoc.OrderID.HasValue) { throw new BadRequestException("Tmp doc lack of control center or order"); } if (tpdoc.TranAmount == 0) { throw new BadRequestException("Tmp doc lack of amount"); } // Left items var dpAccount = _context.FinanceAccount.Where(p => p.ID == context.AccountID && p.HomeID == context.HomeID).SingleOrDefault(); if (dpAccount == null) { throw new BadRequestException("Cannot find Account"); } else if (!(dpAccount.Status == null || dpAccount.Status == (Byte)FinanceAccountStatus.Normal)) { throw new BadRequestException("Account status is not Normal"); } var leftItemsCnt = _context.FinanceTmpDPDocument .Where(p => p.AccountID == context.AccountID && p.HomeID == context.HomeID && p.DocumentID != context.DocumentID && p.ReferenceDocumentID == null) .Count(); // Save it to normal doc. var findoc = new FinanceDocument(); findoc.Desp = tpdoc.Description; findoc.DocType = FinanceDocumentType.DocType_Normal; findoc.HomeID = tpdoc.HomeID; //findoc.TranAmount = vmTmpDoc.TranAmount; findoc.TranCurr = homes[0].BaseCurrency; findoc.TranDate = tpdoc.TransactionDate; findoc.CreatedAt = DateTime.Now; var findocitem = new FinanceDocumentItem { AccountID = tpdoc.AccountID }; if (tpdoc.ControlCenterID.HasValue) { findocitem.ControlCenterID = tpdoc.ControlCenterID.Value; } if (tpdoc.OrderID.HasValue) { findocitem.OrderID = tpdoc.OrderID.Value; } findocitem.Desp = tpdoc.Description; findocitem.ItemID = 1; findocitem.TranAmount = tpdoc.TranAmount; findocitem.TranType = tpdoc.TransactionType; findoc.Items.Add(findocitem); // Database update var errorString = ""; var errorOccur = false; var origdocid = 0; using (var transaction = _context.Database.BeginTransaction()) { try { // 1. Create the document findoc.CreatedAt = DateTime.Now; findoc.Createdby = usrName; var docEntity = _context.FinanceDocument.Add(findoc); _context.SaveChanges(); origdocid = docEntity.Entity.ID; // 2. Update the tmp doc tpdoc.ReferenceDocumentID = origdocid; tpdoc.UpdatedAt = DateTime.Now; tpdoc.Updatedby = usrName; _context.FinanceTmpDPDocument.Update(tpdoc); _context.SaveChanges(); // 3. Close DP account if (leftItemsCnt == 0) { dpAccount.Status = (Byte)FinanceAccountStatus.Closed; dpAccount.Updatedby = usrName; dpAccount.UpdatedAt = DateTime.Now; _context.FinanceAccount.Update(dpAccount); _context.SaveChanges(); } findoc = docEntity.Entity; await transaction.CommitAsync(); } catch (Exception exp) { errorOccur = true; errorString = exp.Message; transaction.Rollback(); } } if (errorOccur) { throw new DBOperationException(errorString); } return(Created(findoc)); }
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(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_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(); }