コード例 #1
0
        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));
        }
コード例 #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 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();
        }