示例#1
0
        // Parse original Asset for possible view model edits, and update as needed. Except for:
        // Read-only : 'TickerSymbol' - change would require Asset deletion/recreation.
        //           : 'AccountType'  - change would require duplicate checks & merging logic
        //                              [see PositionController.UpdatePositionsByAsset()].
        public static Asset ParseAssetForUpdates(AssetSummaryVm assetPostEdits, Asset assetPreEdits, out bool isModified)
        {
            isModified = false;

            if (assetPreEdits.Profile.TickerDescription != assetPostEdits.TickerSymbolDescription && !string.IsNullOrWhiteSpace(assetPostEdits.TickerSymbolDescription)) {
                assetPreEdits.Profile.TickerDescription = assetPostEdits.TickerSymbolDescription.Trim();
                 isModified = true;
            }
            if (assetPreEdits.AssetClass.Code != assetPostEdits.AssetClassification && !string.IsNullOrWhiteSpace(assetPostEdits.AssetClassification)) {
                assetPreEdits.AssetClass.Code = assetPostEdits.AssetClassification.Trim();
                if (!isModified) isModified = true;
            }

            // Position attributes.
            if (!assetPreEdits.Positions.Any()) return assetPreEdits;
            var referencedPositionId = new Guid();
            var assetPreEditPositionRecord = assetPreEdits.Positions.Where(p => p.Account.AccountTypeDesc.Trim() == assetPostEdits.AccountTypePreEdit.Trim()).AsQueryable();
            if (assetPreEditPositionRecord.First().Quantity != assetPostEdits.Quantity && assetPostEdits.Quantity > 0)
            {
                assetPreEditPositionRecord.First().Quantity = assetPostEdits.Quantity;
                assetPreEditPositionRecord.First().LastUpdate = DateTime.Now;
                referencedPositionId = assetPreEditPositionRecord.First().PositionId;

                if (!isModified) isModified = true;
            }
            if (assetPreEditPositionRecord.First().MarketPrice != assetPostEdits.UnitPrice) {
                assetPreEditPositionRecord.First().MarketPrice = assetPostEdits.UnitPrice;
                if (!isModified) isModified = true;
            }

            if (assetPreEdits.Profile.DividendFreq != assetPostEdits.DividendFrequency && !string.IsNullOrWhiteSpace(assetPostEdits.DividendFrequency)) {
                assetPreEdits.Profile.DividendFreq = assetPostEdits.DividendFrequency.Trim().ToUpper();
                if (!isModified) isModified = true;
            }

            // Income attributes.
            if (!assetPreEdits.Revenue.Any()) return assetPreEdits;
            var assetPreEditIncomeRecord = assetPreEdits.Revenue.Where(r => r.IncomePositionId == referencedPositionId).AsQueryable();
            if (assetPreEditIncomeRecord.First().Actual != assetPostEdits.IncomeRecvd)
            {
                assetPreEditIncomeRecord.First().Actual = assetPostEdits.IncomeRecvd;
                assetPreEditIncomeRecord.First().LastUpdate = DateTime.Now;
                if (!isModified) isModified = true;
            }
            if (assetPreEditIncomeRecord.First().DateRecvd == assetPostEdits.DateRecvd) return assetPreEdits;
            assetPreEditIncomeRecord.First().DateRecvd = assetPostEdits.DateRecvd;
            if (!isModified) isModified = true;

            return assetPreEdits;
        }
示例#2
0
        // ReSharper disable once InconsistentNaming
        public async void Controller_can_not_PUT_update_a_Fake_Asset_with_a_bad_AccountType()
        {
            // Arrange 
            _ctrl = new AssetController(_mockRepo.Object, _mockIdentitySvc.Object, _mockRepoInvestor.Object, _mockRepoAssetClass.Object, _mockRepoProfile.Object, _mockRepoAcctType.Object, _mockRepoPosition.Object, _mockRepoIncome.Object)
                                                {
                                                    Request = new HttpRequestMessage { RequestUri = new Uri("http://localhost/PIMS.Web.Api/api/Asset/VNR") },
                                                    Configuration = new HttpConfiguration()
                                                };

            // AccountTypePreEdit value initialized by server and sent unmodified by the client.
            var editedAsset = new AssetSummaryVm {AccountTypePreEdit  = "IRRA", AccountTypePostEdit = ""};
            //var debugTest = TestHelpers.ObjectToJson(editedAsset);

            // Act 
            //var debugTest = TestHelpers.ObjectToJson(editedAsset);
            var updatedAsset = await _ctrl.UpdateByTicker(editedAsset, "VNR") as BadRequestResult;


            // Assert
            Assert.IsTrue(updatedAsset == null);
        }
示例#3
0
        // ReSharper disable once InconsistentNaming
        public async void Controller_Can_PUT_update_a_Fake_Asset_with_AccountType_and_Quantity_and_DateRecvd_changes()
        {
            // Asset - Summary:
            // Selected Asset data for all Assets may be viewed and updated via each AssetSummaryVM grid record; each grid row 
            // represents data elements from various aggregate child objects comprising an Asset aggregate root.

            // Arrange - "assetViewModel" maps to http content, while ticker maps to "existingTicker" in ctrl.
            var dateRecvd = DateTime.UtcNow;
            _ctrl = new AssetController(_mockRepo.Object, _mockIdentitySvc.Object, _mockRepoInvestor.Object, _mockRepoAssetClass.Object, _mockRepoProfile.Object, _mockRepoAcctType.Object, _mockRepoPosition.Object, _mockRepoIncome.Object)
                                                {
                                                    Request = new HttpRequestMessage { RequestUri = new Uri("http://localhost/PIMS.Web.Api/api/Asset/VNR") },
                                                    Configuration = new HttpConfiguration()
                                                };

            var editedAssetSummary = new AssetSummaryVm
                                      {
                                          AccountTypePreEdit = "ML-CMA",
                                          AccountTypePostEdit = "Roth-IRA",
                                          Quantity = 500,
                                          DateRecvd = dateRecvd.AddDays(2)
                                      };
            var debugTest = TestHelpers.ObjectToJson(editedAssetSummary);

            // Act - "UpdateByTicker()" allows for PUT/PATCH updates.
            var updatedAsset = await _ctrl.UpdateByTicker(editedAssetSummary, "VNR") as OkNegotiatedContentResult<Asset>;


            // Assert
            Assert.IsTrue(updatedAsset != null);
            Assert.That(editedAssetSummary.Quantity, Is.EqualTo(updatedAsset.Content.Positions.First().Quantity));
            Assert.That(updatedAsset.Content.Positions.First().Account.AccountTypeDesc.ToUpper(), Is.EqualTo("ROTH-IRA"));
            Assert.That(updatedAsset.Content.Revenue.First().DateRecvd, Is.EqualTo(editedAssetSummary.DateRecvd));
            Assert.That(updatedAsset.Content.Positions.First().Quantity, Is.EqualTo(editedAssetSummary.Quantity));
        }