Exemplo n.º 1
0
        public static ABSDealResult GetNancyDealResult(ABSDeal absDeal, NancyStaticAnalysisResult nancyResult)
        {
            var result = new ABSDealResult();

            result.OriginAcf = nancyResult.AssetCashflowDt;
            result.OriginCf  = nancyResult.CashflowDt;
            result.Acf       = result.OriginAcf.Copy();
            result.Cf        = result.OriginCf.Copy();
            result.AcfResult = new AcfResult(result.OriginAcf, absDeal.Assets);

            RunSpecialRules(result.Cf, absDeal.Info.IsCsdcDeal);

            SplitCategoryByNote(result.Cf);

            result.Cf  = CleanAndTranslateCashflowTable(result.Cf);
            result.Acf = CleanAndTranslateAssetCashflowTable(result.Acf);

            AddAssetIdToRepeatedCNName(result.Acf, absDeal);

            var dictDates = GetDeterminationDatesByPaymentDates(absDeal);

            ConvertAcfColumnDateName(result.Acf, dictDates);

            return(result);
        }
Exemplo n.º 2
0
        public MemoryStream GetAssetCashflowFile(Project project, DateTime paymentDay)
        {
            var projectLogicModel = new ProjectLogicModel(m_userName, project);
            var datasetSchedule   = projectLogicModel.DealSchedule.GetByPaymentDay(paymentDay);

            CommUtils.AssertNotNull(datasetSchedule.Dataset.Instance, "第{0}期模型未生成", Toolkit.DateToString(datasetSchedule.PaymentDate));
            paymentDay = datasetSchedule.PaymentDate;

            var dealModel = datasetSchedule.Dataset.DealModel;

            var absDeal   = new ABSDeal(dealModel.YmlFolder, dealModel.DsFolder);
            var acfResult = absDeal.Result.AcfResult;

            acfResult.MergeOsa(dealModel.OverrideSingleAsset);
            acfResult.ReCalcSum();
            var dt = acfResult.ExtractAssetCashflowDataTable(absDeal, paymentDay);

            var temproaryFolder = CommUtils.CreateTemporaryFolder(m_userName);
            var filePath        = Path.Combine(temproaryFolder, "AssetCashflowTable.csv");

            ExcelUtils.WriteCsv(dt, filePath);

            var buffer = File.ReadAllBytes(filePath);

            CommUtils.DeleteFolderAync(temproaryFolder);
            return(new MemoryStream(buffer));
        }
Exemplo n.º 3
0
        public object GetAssetCashflowTable(AssetCashflowStatisticInfo viewModel, Project project, DateTime paymentDate)
        {
            var acfTable        = new DataTable();
            var dictionaryDates = new Dictionary <DateTime, DateTime>();

            try
            {
                var projectLogicModel = new ProjectLogicModel(m_userName, project);
                var datasetSchedule   = projectLogicModel.DealSchedule.GetByPaymentDay(paymentDate);
                CommUtils.AssertNotNull(datasetSchedule.Dataset.Instance, "第{0}期模型未生成", Toolkit.DateToString(datasetSchedule.PaymentDate));
                paymentDate = datasetSchedule.PaymentDate;

                var dealModel = datasetSchedule.Dataset.DealModel;

                var absDeal   = new ABSDeal(dealModel.YmlFolder, dealModel.DsFolder);
                var acfResult = absDeal.Result.AcfResult;
                acfResult.MergeOsa(dealModel.OverrideSingleAsset);
                acfResult.ReCalcSum();
                return(acfResult.ExtractAssetCashflowTable(absDeal, paymentDate));
            }
            catch (ApplicationException ae)
            {
                var errorResult = new
                {
                    isError      = true,
                    errorMessage = ae.Message
                };
                return(errorResult);
            }
        }
Exemplo n.º 4
0
        private static NancyStaticAnalysisResult GetNancyStaticAnalysisResult(ABSDeal absDeal)
        {
            //TODO: 不同参数的设置

            var result = m_nancy.RunStaticResultByPath(
                absDeal.Setting.Cdr.ToString(),
                absDeal.Setting.Cpr.ToString(),
                absDeal.Location.YmlFolder,
                absDeal.Location.DsFolder);

            return(result);
        }
        public override object GetEntity()
        {
            var taskPeriod  = m_dbAdapter.TaskPeriod.GetByShortCode(Task.ShortCode);
            var paymentDate = Task.EndTime.Value;

            if (taskPeriod != null)
            {
                paymentDate = taskPeriod.PaymentDate;
            }
            var projectLogicModel = new ProjectLogicModel(m_userName, Task.ProjectId);
            var datasetSchedule   = projectLogicModel.DealSchedule.GetByPaymentDay(paymentDate);
            var dealModel         = datasetSchedule.Dataset.DealModel;

            paymentDate = datasetSchedule.PaymentDate;

            var absDeal   = new ABSDeal(dealModel.YmlFolder, dealModel.DsFolder);
            var acfResult = absDeal.Result.AcfResult;

            acfResult.MergeOsa(dealModel.OverrideSingleAsset);
            acfResult.ReCalcSum();
            var    acfDataset    = acfResult.Dataset.FirstOrDefault(x => x.PaymentDay == paymentDate);
            double totalReceived = 0;

            if (acfDataset != null)
            {
                totalReceived = acfDataset.Sum.Principal + acfDataset.Sum.Interest;
            }

            var taskExInfo = RecyclingPaymentDate.FromJson(Task.TaskExtension.TaskExtensionInfo);

            var entity = new RecyclingPaymentDateViewModel();

            entity.ConfirmedAccountBalance = taskExInfo.ConfirmedAccountBalance;

            var compareSign    = CommUtils.ParseEnum <SignComparisonModes>(taskExInfo.CompareSign);
            var acountType     = CommUtils.ParseEnum <EAccountType>(taskExInfo.AccountType);
            var bankAccounts   = m_dbAdapter.BankAccount.GetAccounts(Task.ProjectId, true);
            var accountBalance = bankAccounts.Where(x => x.AccountType == acountType)
                                 .Where(x => x.CurrentBalance != null).Sum(x => x.CurrentBalance.EndBalance);

            entity.CurrentAccountName    = taskExInfo.AccountType;
            entity.CompareSign           = taskExInfo.CompareSign;
            entity.CurrentAccountBalance = accountBalance;
            entity.PaymentMoney          = (decimal)totalReceived;
            entity.CompareResult         = CompareAccount((double)accountBalance, totalReceived, compareSign, acountType);
            entity.PaymentDay            = Toolkit.DateToString(paymentDate);
            return(entity);
        }
Exemplo n.º 6
0
        public static NancyDealInfo GetNancyDealData(ABSDeal absDeal)
        {
            using (StreamReader sr = new StreamReader(absDeal.Location.Yml))
            {
                var dateFromYml = NancyUtils.ReadYmlExInfo(sr);
                var info        = NancyUtils.GetNancyDealDataByFile(sr.BaseStream);
                info.UseCustomCashflow = dateFromYml.Item2;

                return(new NancyDealInfo
                {
                    Info = info,
                    FirstCollectionPeriodStartDate = dateFromYml.Item1,
                    UseCustomCashflow = dateFromYml.Item2,
                });
            }
        }
Exemplo n.º 7
0
        private object GetAssetCashflowTableDetail(string projectGuid, DateTime paymentDate)
        {
            var dictDeterminationDates = new Dictionary <DateTime, DateTime>();
            var allAssetDetail         = new NancyBasicAssetCashflow();

            var projectLogicModel = Platform.GetProject(projectGuid);

            ABSDeal absDeal = null;

            try
            {
                var datasetSchedule = projectLogicModel.DealSchedule.GetByPaymentDay(paymentDate);
                paymentDate = datasetSchedule.PaymentDate;

                CommUtils.AssertNotNull(datasetSchedule.Dataset.Instance, "第{0}期模型未生成", Toolkit.DateToString(paymentDate));
                CommUtils.Assert(datasetSchedule.Dataset.HasDealModel, "找不到第{0}期模型", Toolkit.DateToString(paymentDate));

                absDeal = new ABSDeal(datasetSchedule.Dataset.DealModel);

                dictDeterminationDates = ABSDealUtils.GetDeterminationDatesByPaymentDates(absDeal);

                //获取当期所有的资产明细
                var asOfDate = datasetSchedule.Dataset.Instance.AsOfDate;
                allAssetDetail = NancyUtils.GetUnaggregateAssetCashflowByPath(projectLogicModel.Instance.ProjectId, asOfDate);
            }
            catch (ApplicationException ae)
            {
                var errorResult = new
                {
                    isError      = true,
                    errorMessage = ae.Message,
                    stackTrace   = ae.StackTrace,
                };
                return(errorResult);
            }

            var dictAllAssetDetail = allAssetDetail.BasicAssetCashflowItems.ToList().GroupBy(x => x.AssetId).ToDictionary(x => x.Key, y => y.ToList());

            var dataSetResult = new Dictionary <int, List <AssetCashflowData> >();
            var dictRowSpan   = new Dictionary <int, List <int> >();

            var osaDict = new Dictionary <DateTime, OverrideSingleAssetLogicModel>();

            var osaPrincipalRecords        = m_dbAdapter.OverrideSingleAssetPrincipal.GetByProject(projectLogicModel.Instance.ProjectId);
            var osaPrincipalBalanceRecords = m_dbAdapter.OverrideSingleAssetPrincipalBalance.GetByProject(projectLogicModel.Instance.ProjectId);
            var osaInterestRecords         = m_dbAdapter.OverrideSingleAssetInterest.GetByProject(projectLogicModel.Instance.ProjectId);

            //获取每笔资产的明细
            dictAllAssetDetail.Keys.ToList().ForEach(x =>
            {
                var currAssetDetailList = dictAllAssetDetail[x];
                dictRowSpan[x]          = new List <int>();

                var dictCurrAssetList = new Dictionary <DateTime, List <NancyBasicAssetCashflowItem> >();
                var data = new List <AssetCashflowData>();

                var prevDateTime = DateTime.Parse("1753-01-02");

                foreach (var currPaymentDate in dictDeterminationDates.Keys)
                {
                    var currCompareTime = dictDeterminationDates[currPaymentDate];
                    dictCurrAssetList[currCompareTime] = currAssetDetailList.Where(item => prevDateTime < item.PaymentDate && item.PaymentDate <= currCompareTime).ToList();

                    var currAssetList = dictCurrAssetList[currCompareTime];

                    var assetId = x;

                    OverrideSingleAssetLogicModel osa = null;
                    if (osaDict.ContainsKey(currPaymentDate))
                    {
                        osa = osaDict[currPaymentDate];
                    }
                    else
                    {
                        osa = new OverrideSingleAssetLogicModel(projectLogicModel, currPaymentDate,
                                                                osaPrincipalRecords, osaInterestRecords, osaPrincipalBalanceRecords);
                        osaDict[currPaymentDate] = osa;
                    }

                    var hasOsa = osa.HasOverrideRecords(assetId);

                    if (currAssetList.Count > 0)
                    {
                        dictRowSpan[x].Add(hasOsa ? 1 : (currAssetList.Count + 1));
                        var rowName = Toolkit.DateToString(currCompareTime);

                        for (int i = 0; i < currAssetList.Count; i++)
                        {
                            var ditail = currAssetList[i];

                            var currACFRow     = new AssetCashflowData();
                            currACFRow.RowName = rowName;

                            currACFRow.AddValue("资产回款日", Toolkit.DateToString(ditail.PaymentDate));
                            currACFRow.AddValue("利息", ditail.Interest.ToString("n2"));
                            currACFRow.AddValue("本金", ditail.Principal.ToString("n2"));
                            currACFRow.AddValue("合计", (ditail.Interest + ditail.Principal).ToString("n2"));
                            currACFRow.AddValue("剩余本金", ditail.Performing.ToString("n2"));
                            currACFRow.AddValue("损失", ditail.Loss.ToString("n2"));
                            currACFRow.AddValue("违约", ditail.Defaulted.ToString("n2"));

                            if (!hasOsa)
                            {
                                data.Add(currACFRow);
                            }
                        }

                        var total      = new AssetCashflowData();
                        total.RowName  = rowName;
                        var interest   = currAssetList.Sum(value => value.Interest);
                        var principal  = currAssetList.Sum(value => value.Principal);
                        var performing = currAssetList.Last().Performing;
                        if (osa.GetInterest(assetId) != null)
                        {
                            interest = osa.GetInterest(assetId).Interest;
                        }

                        if (osa.GetPrincipal(assetId) != null)
                        {
                            principal = osa.GetPrincipal(assetId).Principal;
                        }

                        if (osa.GetPrincipalBalance(assetId) != null)
                        {
                            performing = osa.GetPrincipalBalance(assetId).PrincipalBalance;
                        }

                        total.AddValue("资产回款日", "总计");
                        total.AddValue("利息", interest.ToString("n2"));
                        total.AddValue("本金", principal.ToString("n2"));
                        total.AddValue("合计", (interest + principal).ToString("n2"));
                        total.AddValue("剩余本金", performing.ToString("n2"));
                        total.AddValue("损失", currAssetList.Sum(value => value.Loss).ToString("n2"));
                        total.AddValue("违约", currAssetList.Sum(value => value.Defaulted).ToString("n2"));
                        data.Add(total);
                    }
                    prevDateTime = currCompareTime;
                }
                dataSetResult[x] = (data);
            });

            //获取所有的资产的中文名
            var dictAssetIdCNName = absDeal.Assets.GetAssetIdNameMap();

            var detailTableHeader = new List <string>()
            {
                "归集日", "资产回款日", "利息", "本金", "合计", "剩余本金", "损失", "违约"
            };

            return(new
            {
                tableHeader = detailTableHeader,
                assetIdCNName = dictAllAssetDetail.Keys.ToList().ConvertAll(x => new
                {
                    tableKey = x,
                    tableValues = dictAssetIdCNName[x]
                }),
                dataSets = dataSetResult.Keys.ToList().ConvertAll(x => new
                {
                    tableKey = x,
                    tableValues = dataSetResult[x],
                    rowSpanList = dictRowSpan[x]
                }),
                isError = false
            });
        }
Exemplo n.º 8
0
        public object GetCurrPeriodAssetCashflowTable(string projectGuid, DateTime paymentDate)
        {
            try
            {
                var projectLogicModel = Platform.GetProject(projectGuid);
                var datasetSchedule   = projectLogicModel.DealSchedule.GetByPaymentDay(paymentDate);
                CommUtils.AssertNotNull(datasetSchedule.Dataset.Instance, "第{0}期模型未生成", Toolkit.DateToString(datasetSchedule.PaymentDate));

                paymentDate = datasetSchedule.PaymentDate;

                var osa = datasetSchedule.Dataset.DealModel.OverrideSingleAsset;

                var dealModel = datasetSchedule.Dataset.DealModel;
                var absDeal   = new ABSDeal(dealModel.YmlFolder, dealModel.DsFolder);

                //获取预测的资产池当期本金与利息
                var oldCurrPeriodAcfDataset = absDeal.Result.AcfResult.Dataset.Single(x => x.PaymentDay == paymentDate);
                var predictInterePrincipal  = new CurrPerdictPrincipalInterest();
                predictInterePrincipal.CurrPerdictInterest  = double.Parse(oldCurrPeriodAcfDataset.Sum.Interest.ToString("n2"));
                predictInterePrincipal.CurrPerdictPrincipal = double.Parse(oldCurrPeriodAcfDataset.Sum.Principal.ToString("n2"));

                //获取覆盖资产池的本金、利息
                var assetCashflowVariable = m_dbAdapter.AssetCashflowVariable.GetByProjectIdPaymentDay(projectLogicModel.Instance.ProjectId, paymentDate);

                var assetIdNameMap       = absDeal.Assets.GetAssetIdNameMap();
                var osaResults           = absDeal.Result.AcfResult.MergeOsa(datasetSchedule.Dataset.DealModel.OverrideSingleAsset);
                var currPeriodDataTable  = absDeal.Result.AcfResult.ExtractCurrPeriodAssetSummaryTable(paymentDate);
                var currPeriodAcfDataset = absDeal.Result.AcfResult.Dataset.Single(x => x.PaymentDay == paymentDate);

                //获取当前表格的本金、利息
                var currInterePrincipal = new CurrPerdictPrincipalInterest();
                currInterePrincipal.CurrPerdictInterest  = double.Parse(currPeriodAcfDataset.Sum.Interest.ToString("n2"));
                currInterePrincipal.CurrPerdictPrincipal = double.Parse(currPeriodAcfDataset.Sum.Principal.ToString("n2"));

                List <int> PrevOsaList = new List <int>();
                if (datasetSchedule.Previous != null)
                {
                    if (datasetSchedule.Previous.Dataset.HasDealModel)
                    {
                        var prevOsa = datasetSchedule.Previous.Dataset.DealModel.OverrideSingleAsset;

                        datasetSchedule.Dataset.Assets.ForEach(x =>
                        {
                            if (prevOsa.GetPrincipal(x.AssetId) != null ||
                                prevOsa.GetPrincipalBalance(x.AssetId) != null ||
                                prevOsa.GetInterest(x.AssetId) != null)
                            {
                                PrevOsaList.Add(x.AssetId);
                            }
                        });
                    }
                }

                var columnNames = new List <string>()
                {
                    "资产", "利息", "本金", "剩余本金", "损失", "违约", "合计", "费用"
                };
                var result = new
                {
                    paymentDate           = Toolkit.DateToString(paymentDate),
                    currPeriodTableHeader = columnNames,
                    isError                     = false,
                    handsonData                 = currPeriodDataTable.ToHandson(),
                    overrideSingleAssetData     = osaResults,
                    overrideSingleAssetDataLast = PrevOsaList,
                    assetIdNameMap              = assetIdNameMap.Keys.ToList()
                                                  .Select(x => new
                    {
                        assetId   = x,
                        assetName = assetIdNameMap[x]
                    }),
                    userCustomCashflow     = absDeal.Info.UseCustomCashflow,
                    predictInterePrincipal = predictInterePrincipal,
                    currInterePrincipal    = currInterePrincipal,
                    assetCashflowVariable  = assetCashflowVariable == null ? null : new
                    {
                        interest       = double.Parse(assetCashflowVariable.InterestCollection.ToString("n2")),
                        principal      = double.Parse(assetCashflowVariable.PricipalCollection.ToString("n2")),
                        enableOverride = assetCashflowVariable.EnableOverride
                    },
                };
                return(result);
            }
            catch (ApplicationException ae)
            {
                var errorResult = new
                {
                    isError      = true,
                    errorMessage = ae.Message
                };
                return(errorResult);
            }
        }
Exemplo n.º 9
0
 public static DealSchedule GetNancyDealSchedule(ABSDeal absDeal)
 {
     return(m_nancy.GetDealSchedule(absDeal.Location.Yml, absDeal.Location.DsFolder));
 }
Exemplo n.º 10
0
        public static void UpdateDatasetByPredictModel(ProjectLogicModel project)
        {
            var dbAdapter = new DBAdapter();

            var dealSchedule = project.DealSchedule.Instanse;

            var errorMsg = "Error occurred in UpdateDatasetByPredictModel";

            CommUtils.Assert(dealSchedule.DeterminationDates != null && dealSchedule.DeterminationDates.Length > 0, errorMsg);
            CommUtils.Assert(dealSchedule.PaymentDates != null && dealSchedule.PaymentDates.Length > 0, errorMsg);
            CommUtils.Assert(dealSchedule.DeterminationDates.Length == dealSchedule.PaymentDates.Length, errorMsg);

            var asOfDateEndList = dealSchedule.DeterminationDates.ToList();

            var asOfDateBeginList = asOfDateEndList.Select(x => x).ToList();

            asOfDateBeginList.RemoveAt(asOfDateBeginList.Count - 1);
            asOfDateBeginList.Insert(0, dealSchedule.FirstCollectionPeriodStartDate);

            var newAsOfDateList = project.EnablePredictMode ? asOfDateBeginList : asOfDateEndList;
            var oldAsOfDateList = project.EnablePredictMode ? asOfDateEndList : asOfDateBeginList;
            var paymentDateList = dealSchedule.PaymentDates.ToList();

            var durationPeriods = new List <DatasetScheduleLogicModel>();

            if (project.EnablePredictMode)
            {
                //切换到预测模式
                //使用过去一期的模型collateral里asset的PrincipalBalance覆盖掉未来一期的值
                //从过去到未来遍历
                durationPeriods.AddRange(project.DealSchedule.DurationPeriods);
            }
            else
            {
                //切换到当期模式:
                //使用未来一期的模型collateral里asset的PrincipalBalance覆盖掉过去一期的值
                //从未来到过去遍历
                durationPeriods.AddRange(project.DealSchedule.DurationPeriods);
                durationPeriods.Reverse();
            }

            //Fields: asOfDate, assetId, principalBalance
            foreach (var period in durationPeriods)
            {
                var dataset = period.Dataset.Instance;
                if (dataset == null)
                {
                    continue;
                }

                var idx = paymentDateList.IndexOf(period.PaymentDate);
                if (idx < 0 || idx >= newAsOfDateList.Count)
                {
                    continue;
                }

                var ymlFolder = dbAdapter.Dataset.GetYmlFolder(project.Instance);

                var newAsOfDate          = newAsOfDateList[idx];
                var newDatasetFolder     = dbAdapter.Dataset.GetDatasetFolder(project.Instance, newAsOfDate);
                var newCollateralCsvPath = Path.Combine(newDatasetFolder, "collateral.csv");

                var oldAsOfDate          = oldAsOfDateList[idx];
                var oldDatasetFolder     = dbAdapter.Dataset.GetDatasetFolder(project.Instance, oldAsOfDate);
                var oldCollateralCsvPath = Path.Combine(oldDatasetFolder, "collateral.csv");

                dataset.AsOfDate = DateUtils.DateToDigitString(newAsOfDate);
                dbAdapter.Dataset.Update(dataset);

                if (File.Exists(newCollateralCsvPath))
                {
                    var assetPrincipalBalance = new Dictionary <int, string>();
                    if (File.Exists(oldCollateralCsvPath))
                    {
                        var oldCollateralCsv = new CollateralCsv();
                        oldCollateralCsv.Load(oldCollateralCsvPath);
                        foreach (var record in oldCollateralCsv)
                        {
                            //保存当次遍历Asset的期初本金
                            assetPrincipalBalance[record.AssetId] = record.Items["PrincipalBalance"];
                        }
                    }
                    else
                    {
                        if (oldAsOfDate > newAsOfDate && period.Next != null)
                        {
                            var deal       = new ABSDeal(ymlFolder, newDatasetFolder);
                            var acfDataset = deal.Result.AcfResult.Dataset.FirstOrDefault(x =>
                                                                                          x.PaymentDay == period.Previous.PaymentDate);
                            if (acfDataset != null)
                            {
                                assetPrincipalBalance = acfDataset.ToDictionary(x => x.Asset.Id, x => x.Performing.ToString("n2"));
                            }
                        }
                    }

                    var collateralAsOfDate = asOfDateBeginList[idx];

                    var newCollateralCsv = new CollateralCsv();
                    newCollateralCsv.Load(newCollateralCsvPath);

                    foreach (var record in newCollateralCsv)
                    {
                        var assetId = record.AssetId;
                        //更新封包日日期
                        newCollateralCsv.UpdateCellValue(assetId, "AsOfDate",
                                                         collateralAsOfDate.ToString("MM/dd/yyyy"));

                        //更新Asset的期初本金
                        if (assetPrincipalBalance.ContainsKey(assetId))
                        {
                            newCollateralCsv.UpdateCellValue(assetId, "PrincipalBalance",
                                                             assetPrincipalBalance[assetId]);
                        }
                    }
                    newCollateralCsv.Save(newCollateralCsvPath);
                }
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// 根据当期PaymentDate获取PaymentDates对应的DeterminationDates
        /// </summary>
        public static Dictionary <DateTime, DateTime> GetDeterminationDatesByPaymentDates(ABSDeal absDeal)
        {
            var dealSchedule       = absDeal.Schedule;
            var paymentDates       = dealSchedule.PaymentDates;
            var determinationDates = dealSchedule.DeterminationDates;

            var paymentDateStrList = paymentDates.ToList().ConvertAll(x => x.ToString());
            var dictionaryDates    = new Dictionary <DateTime, DateTime>();

            for (int i = 0; i < paymentDates.Length; i++)
            {
                dictionaryDates[paymentDates[i]] = determinationDates[i];
            }

            return(dictionaryDates);
        }
Exemplo n.º 12
0
        public static DataTable GetCashflowDt(DatasetScheduleLogicModel datasetSchedule,
                                              AssetCashflowVariable assetCashflowVariable,
                                              double sysPredictInterest, double sysPredictPrincipal,
                                              out double currInterestCollection, out double currPrincipalCollection)
        {
            currInterestCollection  = sysPredictInterest;
            currPrincipalCollection = sysPredictPrincipal;

            var       assetOverrideSetting = new AssetOverrideSetting(assetCashflowVariable);
            DataTable cashflowDt           = new DataTable();
            var       project     = datasetSchedule.ProjectLogicModel.Instance;
            var       dataset     = datasetSchedule.Dataset.Instance;
            var       paymentDate = datasetSchedule.PaymentDate;

            var hasOsa = false;
            var osa    = datasetSchedule.Dataset.DealModel.OverrideSingleAsset;

            foreach (var asset in datasetSchedule.Dataset.Assets)
            {
                var overridePrincipal = osa.GetPrincipal(asset.AssetId);
                var overrideInterest  = osa.GetInterest(asset.AssetId);
                if (overridePrincipal != null || overrideInterest != null)
                {
                    hasOsa = true;
                    break;
                }
            }

            //测算优先级:
            //1、覆盖现金流测算
            //2、单笔资产覆盖的方式测算
            //3、系统测算
            //未填写覆盖现金流值,或填写值和系统测算值一致,认为是不使用本息覆盖现金流测算
            var hasOverrideCashflow = assetCashflowVariable != null &&
                                      assetCashflowVariable.EnableOverride;

            if (hasOverrideCashflow)
            {
                //使用覆盖现金流的方式测算
                cashflowDt              = NancyUtils.GetStaticAnalyticsResult(project.ProjectId, null, dataset.AsOfDate, assetOverrideSetting).CashflowDt;
                currInterestCollection  = assetOverrideSetting.Interest;
                currPrincipalCollection = assetOverrideSetting.Principal;
            }
            else
            {
                if (hasOsa)
                {
                    //未填写覆盖现金流参数,已填写单笔资产覆盖
                    //重新计算本息,使用覆盖现金流的方式测算
                    var dealModel = datasetSchedule.Dataset.DealModel;
                    var absDeal   = new ABSDeal(dealModel.YmlFolder, dealModel.DsFolder);

                    var acfResult  = absDeal.Result.AcfResult;
                    var acfDataset = acfResult.Dataset.SingleOrDefault(x => x.PaymentDay == paymentDate);
                    acfResult.MergeOsa(osa);
                    acfResult.ReCalcSum();

                    var sumPrincipal = double.Parse(acfDataset.Sum.Principal.ToString("n2"));
                    var sumInterest  = double.Parse(acfDataset.Sum.Interest.ToString("n2"));

                    assetOverrideSetting.IsOverride  = true;
                    assetOverrideSetting.Principal   = sumPrincipal;
                    assetOverrideSetting.Interest    = sumInterest;
                    assetOverrideSetting.PaymentDate = paymentDate;

                    cashflowDt              = NancyUtils.GetStaticAnalyticsResult(project.ProjectId, null, dataset.AsOfDate, assetOverrideSetting).CashflowDt;
                    currInterestCollection  = assetOverrideSetting.Interest;
                    currPrincipalCollection = assetOverrideSetting.Principal;
                }
                else
                {
                    //未填写覆盖现金流参数,且未填写单笔资产覆盖
                    //使用非覆盖现金流的方式测算
                    cashflowDt = NancyUtils.GetStaticAnalyticsResult(project.ProjectId, null, dataset.AsOfDate).CashflowDt;
                }
            }

            return(cashflowDt);
        }
Exemplo n.º 13
0
 public static void GenerateNextModel(ABSDeal absDeal)
 {
 }
Exemplo n.º 14
0
        public static ABSDealResult GetNancyDealResult(ABSDeal absDeal)
        {
            var nancyResult = GetNancyStaticAnalysisResult(absDeal);

            return(GetNancyDealResult(absDeal, nancyResult));
        }
Exemplo n.º 15
0
        public DataTable ExtractAssetCashflowDataTable(ABSDeal absDeal, DateTime paymentDay)
        {
            var dt = new DataTable();
            var determinationDates = ABSDealUtils.GetDeterminationDatesByPaymentDates(absDeal);
            var colHeader          = new List <string> {
                "资产", "项目"
            };

            colHeader.AddRange(determinationDates.Keys.Select(x => determinationDates[x].ToString("yyyy-MM-dd")));
            colHeader.ForEach(x => dt.Columns.Add(x));

            var selectName = new List <string> {
                "利息", "本金", "剩余本金", "损失", "违约", "合计", "费用"
            };
            var selectValue = new List <Func <AcfUnitBase, double> > {
                x => x.Interest,
                x => x.Principal,
                x => x.Performing,
                x => x.Loss,
                x => x.Defaulted,
                x => x.Sum,
                x => x.Fee,
            };

            var dataResult = new List <List <string> >();

            foreach (var acfAsset in Asset)
            {
                for (int i = 0; i < selectName.Count; i++)
                {
                    var row = new List <string>();
                    row.Add(acfAsset.Asset.DisplayName);
                    row.Add(selectName[i]);

                    foreach (var acfUnit in acfAsset)
                    {
                        var value = selectValue[i](acfUnit);
                        row.Add(value.ToString("n2"));
                    }

                    var dtRow = dt.NewRow();
                    dtRow.ItemArray = row.ToArray();
                    dt.Rows.Add(dtRow);
                }
            }

            for (int i = 0; i < selectName.Count; i++)
            {
                var row = new List <string>();
                row.Add("总计");
                row.Add("总" + selectName[i]);
                foreach (var acfDataset in Dataset)
                {
                    var value = selectValue[i](acfDataset.Sum);
                    row.Add(value.ToString("n2"));
                }

                var dtRow = dt.NewRow();
                dtRow.ItemArray = row.ToArray();
                dt.Rows.Add(dtRow);
            }

            return(dt);
        }
Exemplo n.º 16
0
        /// <summary>
        /// 抽出资产端现金流表
        /// </summary>
        public object ExtractAssetCashflowTable(ABSDeal absDeal, DateTime paymentDay)
        {
            var determinationDates = ABSDealUtils.GetDeterminationDatesByPaymentDates(absDeal);
            var colHeader          = new List <string> {
                "资产", "项目"
            };

            colHeader.AddRange(determinationDates.Keys.Select(x => determinationDates[x].ToString("yyyy-MM-dd")));

            var selectName = new List <string> {
                "利息", "本金", "剩余本金", "损失", "违约", "合计", "费用"
            };
            var selectValue = new List <Func <AcfUnitBase, double> > {
                x => x.Interest,
                x => x.Principal,
                x => x.Performing,
                x => x.Loss,
                x => x.Defaulted,
                x => x.Sum,
                x => x.Fee,
            };

            var dataResult = new List <List <string> >();

            foreach (var acfAsset in Asset)
            {
                for (int i = 0; i < selectName.Count; i++)
                {
                    var row = new List <string>();
                    row.Add(acfAsset.Asset.DisplayName);
                    row.Add(selectName[i]);

                    foreach (var acfUnit in acfAsset)
                    {
                        var value = selectValue[i](acfUnit);
                        row.Add(value.ToString("n2"));
                    }
                    dataResult.Add(row);
                }
            }

            for (int i = 0; i < selectName.Count; i++)
            {
                var row = new List <string>();
                row.Add("总计");
                row.Add("总" + selectName[i]);
                foreach (var acfDataset in Dataset)
                {
                    var value = selectValue[i](acfDataset.Sum);
                    row.Add(value.ToString("n2"));
                }

                dataResult.Add(row);
            }

            List <object> mergeCellsInfo = new List <object>();

            for (int i = 0; i < Asset.Count + 1; i++)
            {
                mergeCellsInfo.Add(new
                {
                    row     = i * 7,
                    col     = 0,
                    rowspan = 7,
                    colspan = 1,
                });
            }
            ;

            var result = new
            {
                colHeader      = colHeader,
                paymentDate    = paymentDay.ToString("yyyy-MM-dd"),
                dataResult     = dataResult,
                mergeCellsInfo = mergeCellsInfo,
                isError        = false
            };

            return(result);
        }
Exemplo n.º 17
0
        private static void AddAssetIdToRepeatedCNName(DataTable acf, ABSDeal absDeal)
        {
            var           assets          = absDeal.Assets;
            var           rowSpansDic     = SetRowSpansDic(acf);
            List <string> acfTableCNNames = new List <string>();

            for (int iRow = 0; iRow < acf.Rows.Count; iRow++)
            {
                var row    = acf.Rows[iRow];
                var cnName = row[0].ToString();
                if (rowSpansDic[iRow] != 0 && cnName != string.Empty && cnName != "总计")
                {
                    acfTableCNNames.Add(cnName);
                }
            }

            var assetsCNNames       = assets.Select(x => x.SecurityData.SecurityName).ToList();
            var diffAcfTableCNNames = acfTableCNNames.Distinct().ToList();
            var diffAssetsCNNames   = assetsCNNames.Distinct().ToList();

            CommUtils.Assert(diffAcfTableCNNames.Count == diffAssetsCNNames.Count, "资产表格行数与资产数量不相等");

            object lastName   = string.Empty;
            int    iAssetsRow = 0;

            for (int iRow = 0; iRow < acf.Rows.Count; iRow++)
            {
                var acfTableRow = acf.Rows[iRow];
                CommUtils.Assert(acfTableRow.ItemArray.Length > 0, "");
                if (acf.Rows[iRow][0].ToString() == string.Empty ||
                    acf.Rows[iRow][0].ToString() == "总计")
                {
                    continue;
                }
                if (rowSpansDic[iRow] != 0)
                {
                    iAssetsRow++;
                    lastName = acfTableRow[0].ToString();
                }

                CommUtils.Assert(iAssetsRow >= 1 && iAssetsRow < assets.Count + 1, "资产assets下标[{0}]越界({1}-{2})", iAssetsRow, 1, assets.Count + 1);
                var assetId        = assets[iAssetsRow - 1].SecurityData.AssetId;
                var acfTableCNName = acfTableCNNames[iAssetsRow - 1];
                var assetsCNName   = assetsCNNames[iAssetsRow - 1];

                var acfTableCNNameCount = acfTableCNNames.FindAll(x => x == acfTableCNName).ToList().Count();
                var assetsCNNameCount   = assetsCNNames.FindAll(x => x == assetsCNName).ToList().Count();
                CommUtils.Assert(acfTableCNNameCount == assetsCNNameCount, "资产[{0}]数量有误", acfTableCNName);

                if (acfTableCNNameCount > 1)
                {
                    if (rowSpansDic[iRow] != 0)
                    {
                        lastName = acfTableCNName + "(" + assetId.ToString() + ")";
                        assets[iAssetsRow - 1].SecurityData.SecurityName = lastName.ToString();
                    }
                    acf.Rows[iRow][0] = lastName;
                    acf.Rows[iRow][0] = lastName;
                }
            }
        }