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