Пример #1
0
        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();
        }
Пример #2
0
        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));
        }
Пример #3
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();
        }
Пример #4
0
        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));
        }
Пример #5
0
        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));
        }
Пример #6
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();
        }
Пример #7
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));
        }
        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();
        }