Beispiel #1
0
        private List <DataSeries> GetChartByDataset(string projectGuid, string paymentDay, Func <PaymentDetail, double> selector)
        {
            var project     = m_dbAdapter.Project.GetProjectByGuid(projectGuid);
            var datasets    = m_dbAdapter.Dataset.GetDatasetByProjectId(project.ProjectId);
            var subDatasets = datasets.Where(x => x.PaymentDate.HasValue && x.PaymentDate.Value.ToString("yyyyMMdd") == paymentDay).ToList();

            CommUtils.AssertEquals(subDatasets.Count, 1, "加载Dataset (project=" + project.Name + ", paymentDay=" + paymentDay + ") 失败");

            var dataset = subDatasets.Single();

            var notes      = m_dbAdapter.Dataset.GetNotes(project.ProjectId);
            var cnabsNotes = new ProjectLogicModel(CurrentUserName, project).Notes;
            var noteDict   = Toolkit.GetNoteDictionary(project, notes, cnabsNotes);
            var noteInfos  = notes.ConvertAll(x => noteDict[x.NoteId]);

            //Load dataset info
            var dealSchedule     = NancyUtils.GetDealSchedule(project.ProjectId);
            var noteDatas        = m_dbAdapter.Dataset.GetNoteDatas(dataset.DatasetId);
            var datasetViewModel = Toolkit.GetDatasetViewModel(dataset, dealSchedule.PaymentDates, noteDict, noteDatas);

            var dataSeriesList = new List <DataSeries>();

            foreach (var noteData in datasetViewModel.NoteDatas)
            {
                var ds = new DataSeries();
                ds.name = noteData.NoteInfo.Name;
                ds.data = new List <Vector>();
                ds.data.Add(new Vector(selector(noteData.PaymentDetail)));
                dataSeriesList.Add(ds);
            }

            return(dataSeriesList);
        }
Beispiel #2
0
        public ActionResult Index(string projectGuid, string paymentDay)
        {
            var projectLogicModel = new ProjectLogicModel(CurrentUserName, projectGuid);
            var project           = projectLogicModel.Instance;

            var datasetSchedule = projectLogicModel.DealSchedule.GetByPaymentDay(DateUtils.ParseDigitDate(paymentDay));

            CommUtils.AssertNotNull(datasetSchedule.Dataset.Instance,
                                    "Dataset数据加载失败,projectGuid=[" + projectGuid + "] paymentDay=[" + paymentDay + "]");
            var dataset = datasetSchedule.Dataset.Instance;

            var notes      = m_dbAdapter.Dataset.GetNotes(project.ProjectId);
            var cnabsNotes = projectLogicModel.Notes;
            var noteDict   = Toolkit.GetNoteDictionary(project, notes, cnabsNotes);

            var dealSchedule     = NancyUtils.GetDealSchedule(project.ProjectId);
            var noteDatas        = m_dbAdapter.Dataset.GetNoteDatas(dataset.DatasetId);
            var datasetViewModel = Toolkit.GetDatasetViewModel(dataset, dealSchedule.PaymentDates, noteDict, noteDatas);


            var             datasetFolder    = m_dbAdapter.Dataset.GetDatasetFolder(project, dataset.AsOfDate);
            VariablesHelper helper           = new VariablesHelper(datasetFolder);
            var             variables        = helper.GetVariablesByDate(dataset.PaymentDate.Value);
            var             rateResetRecords = InterestRateUtils.RateResetRecords(variables);

            //计算当期浮动利率
            datasetViewModel.NoteDatas.ForEach(x => x.CurrentCouponRate = InterestRateUtils.CalculateCurrentCouponRate(x.NoteInfo.CouponString, rateResetRecords));

            var viewModel = new CashflowDatasetViewModel();

            viewModel.Dataset     = datasetViewModel;
            viewModel.ProjectGuid = projectGuid;

            //添加今天之前所有已上传模型的支付日
            var nowDate = DateTime.Today;

            viewModel.ValidPaymentDays = datasetSchedule.SelectPaymentDates(
                x => x.PaymentDate <= nowDate &&
                x.Dataset != null && x.Dataset.Instance != null);

            if (project.CnabsDealId.HasValue)
            {
                viewModel.AllPaymentDays = m_dbAdapter.Model.GetPaymentDates(project.CnabsDealId.Value);
            }
            else
            {
                if (projectLogicModel.DealSchedule.Instanse != null)
                {
                    viewModel.AllPaymentDays = projectLogicModel.DealSchedule.Instanse.PaymentDates.ToList();
                }
                else
                {
                    viewModel.AllPaymentDays = new List <DateTime>();
                }
            }

            return(View(viewModel));
        }
Beispiel #3
0
        private void Run(double cdr, double cpr, AssetOverrideSetting assetOverrideSetting = null)
        {
            var folderInfo = CopyTemporaryModel();

            m_staticAnalysisResult = NancyUtils.RunStaticResultByPath(cdr.ToString(), cpr.ToString(),
                                                                      folderInfo.YmlFolder, folderInfo.DsFolder, assetOverrideSetting);

            ParallelUtils.Start(() => Directory.Delete(folderInfo.YmlFolder, true));
        }
Beispiel #4
0
        public void Load(int projectId, DateTime asOfDate)
        {
            var project      = m_dbAdapter.Project.GetProjectById(projectId);
            var dealSchedule = NancyUtils.GetDealSchedule(projectId, asOfDate.ToString("yyyyMMdd"));

            m_dealSchedule = dealSchedule;

            var errorMsg = "Search payment date/as of date failed, projectGuid=[" + project.ProjectGuid + "] asOfDate=[" + asOfDate.ToString() + "]";

            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);
            CommUtils.Assert(asOfDate < dealSchedule.LegalMaturity, errorMsg);

            var asOfDateList = dealSchedule.DeterminationDates.ToList();

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

            var paymentDateList   = dealSchedule.PaymentDates.ToList();
            var projectLogicModel = new ProjectLogicModel(m_userName, project);

            var findPaymentDates = projectLogicModel.DealSchedule.DurationPeriods
                                   .Where(x => x.Dataset != null && x.Dataset.Instance != null &&
                                          DateUtils.ParseDigitDate(x.Dataset.Instance.AsOfDate) == asOfDate)
                                   .Select(x => x.Dataset.Instance.PaymentDate);

            CommUtils.AssertEquals(findPaymentDates.Count(), 1, "查找PaymentDay失败,AsOfDate={0}", asOfDate);

            m_paymentDay = findPaymentDates.Single().Value;
            var index = paymentDateList.IndexOf(m_paymentDay);

            CommUtils.Assert(index >= 0, errorMsg);

            m_asOfDay = asOfDate;
            if (index == 0)
            {
                m_previousPaymentDay = paymentDateList[0];
            }
            else
            {
                m_previousPaymentDay = paymentDateList[index - 1];
            }

            if (index == paymentDateList.Count - 1)
            {
                m_nextAsOfDay    = null;
                m_nextPaymentDay = null;
            }
            else
            {
                m_nextAsOfDay    = asOfDateList[index + 1];
                m_nextPaymentDay = paymentDateList[index + 1];
            }

            m_isInitialized = true;
        }
        public ActionResult GetAmortizationByAsset(string projectGuid, string paymentDate, int assetId)
        {
            return(ActionUtils.Json(() =>
            {
                var project = new ProjectLogicModel(CurrentUserName, projectGuid);
                var dataset = project.DealSchedule.GetByPaymentDay(DateUtils.ParseDigitDate(paymentDate)).Dataset;
                var asset = dataset.Assets.Single(x => x.AssetId == assetId);

                if (asset.AmortizationType == AmortizationType.UserDefined)
                {
                    var records = dataset.AmortizationSchedule.SelectByAsset(assetId);
                    var viewModel = new PrepayRecordListViewModel(dataset.DatasetSchedule, records);
                    viewModel.AsOfDateBegin = dataset.DatasetSchedule.AsOfDateBegin;
                    viewModel.AsOfDateEnd = dataset.DatasetSchedule.AsOfDateEnd;
                    return ActionUtils.Success(viewModel);
                }
                else if (IsEqualPmtOrEqualPrin(asset.AmortizationType))
                {
                    if (IsEqualPmtOrEqualPrin(asset.SecurityData.PaymentMethod))
                    {
                        //当期的偿付类型是EqualPmt/EqualPrin
                        //返回值为系统根据EqualPmt/EqualPrin测算出的本金
                        var basicAnalyticsData = NancyUtils.GetBasicAnalyticsData(project.Instance.ProjectId, null, dataset.Instance.AsOfDate);
                        var assetCashflow = basicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems.SelectByAsset(assetId);

                        var viewModel = new PrepayRecordListViewModel(dataset.DatasetSchedule, assetCashflow);
                        return ActionUtils.Success(viewModel);
                    }
                    else
                    {
                        //已经发生了提前偿付,后几期的偿付类型是EqualPmt/EqualPrin
                        //返回值为提前偿付+系统根据EqualPmt/EqualPrin测算出的本金
                        var records = dataset.AmortizationSchedule.SelectByAsset(assetId);
                        var viewModel = new PrepayRecordListViewModel(dataset.DatasetSchedule, records);

                        var nextDatasetBasicAnalyticsData = NancyUtils.GetBasicAnalyticsData(project.Instance.ProjectId, null, dataset.DatasetSchedule.Next.AsOfDateBegin);
                        var nextAssetCashflowItems = nextDatasetBasicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems
                                                     .SelectByAsset(assetId).Where(x => x.PaymentDate > dataset.DatasetSchedule.PaymentDate);

                        viewModel.AddRange(nextAssetCashflowItems);
                        return ActionUtils.Success(viewModel);
                    }
                }
                else if (asset.AmortizationType == AmortizationType.SingleAmortization)
                {
                    var records = dataset.AmortizationSchedule.SelectByAsset(assetId);
                    var sumPrepayMoney = records.Sum(x => x.ReductionAmount);
                    var viewModel = new PrepayRecordListViewModel(dataset.DatasetSchedule, records);
                    viewModel.Add(assetId, asset.SecurityData.PrincipalBalance - sumPrepayMoney, project.DealSchedule.LegalMaturity);
                    return ActionUtils.Success(viewModel);
                }

                return ActionUtils.Failure("无法识别的偿付类型,projectGuid=["
                                           + projectGuid + "] + paymentDate=[" + paymentDate + "] + assetId=[" + assetId + "]");
            }));
        }
Beispiel #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,
                });
            }
        }
        private List <AssetDatasetViewModel> GetAssetCashflow(int projectId, DateTime[] paymentDates, List <DateTime> allPaymentDays)
        {
            var project = m_dbAdapter.Project.GetProjectById(projectId);

            var nowDate = DateTime.Today;

            List <AssetDatasetViewModel> viewModel = new List <AssetDatasetViewModel>();

            foreach (var paymentDate in paymentDates)
            {
                var dataset = m_dbAdapter.Dataset.GetDataset(projectId, paymentDate);
                if (dataset == null)
                {
                    continue;
                }

                var basicAnalyticsData = NancyUtils.GetBasicAnalyticsData(projectId, null, dataset.AsOfDate);

                AssetDatasetViewModel assetViewModel = new AssetDatasetViewModel();

                assetViewModel.Assets = new List <AssetViewModel>();
                var assetItems = basicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems.Where(x => x.PaymentDate == paymentDate);
                foreach (var assetItem in assetItems)
                {
                    assetViewModel.Assets.Add(new AssetViewModel
                    {
                        AssetId   = assetItem.AssetId,
                        Interest  = (decimal)assetItem.Interest,
                        Principal = (decimal)assetItem.Principal,
                        Name      = assetItem.AssetId.ToString()
                    });
                }

                assetViewModel.PaymentDay = paymentDate;
                assetViewModel.ReCalculateSumAsset();
                assetViewModel.Sequence = CommUtils.GetSequence(allPaymentDays, paymentDate);

                viewModel.Add(assetViewModel);

                if (paymentDate >= nowDate)
                {
                    break;
                }
            }

            return(viewModel);
        }
        public void LoadAssetCashflowInfo()
        {
            var basicAnalyticsData = NancyUtils.GetBasicAnalyticsData(m_project.Instance.ProjectId, null, m_instance.AsOfDate);
            var assetItems         = basicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems.Where(x => x.PaymentDate == DatasetSchedule.PaymentDate);

            foreach (var assetItem in assetItems)
            {
                var findAssets = Assets.Where(x => x.SecurityData.AssetId == assetItem.AssetId).ToList();
                if (findAssets.Count > 1)
                {
                    CommUtils.Assert(false, "找到了重复的AssetId[{0}]", assetItem.AssetId);
                }

                var findAsset = findAssets.SingleOrDefault();
                findAsset.BasicAsset = assetItem;
            }
        }
        public List <AmortizationRecord> LoadAmortizationRecords()
        {
            List <AmortizationRecord> amortizationRecords = null;
            var asset = m_assetLogicModel;

            if (asset.AmortizationType == AmortizationType.UserDefined)
            {
                var records = asset.Dataset.AmortizationSchedule.SelectByAsset(asset.AssetId);
                amortizationRecords = records.Select(x => new AmortizationRecord {
                    AssetId = x.AssetId,
                    Date    = x.ReductionDate,
                    Money   = x.ReductionAmount,
                }).ToList();
            }
            else if (asset.IsEqualPmtOrEqualPrin)
            {
                var basicAnalyticsData = NancyUtils.GetBasicAnalyticsData(ProjectLogicModel.Instance.ProjectId, null, asset.Dataset.Instance.AsOfDate);
                var records            = basicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems.SelectByAsset(asset.AssetId);
                amortizationRecords = records.Select(x => new AmortizationRecord {
                    AssetId = x.AssetId,
                    Date    = x.PaymentDate,
                    Money   = x.Principal
                }).ToList();
            }
            else if (asset.AmortizationType == AmortizationType.SingleAmortization)
            {
                var records        = asset.Dataset.AmortizationSchedule.SelectByAsset(asset.AssetId);
                var sumPrepayMoney = records.Sum(x => x.ReductionAmount);
                amortizationRecords = new List <AmortizationRecord> {
                    new AmortizationRecord {
                        AssetId = asset.AssetId,
                        Date    = asset.SecurityData.LegalMaturityDate,
                        Money   = asset.SecurityData.PrincipalBalance,
                    }
                };
            }

            CommUtils.AssertNotNull(amortizationRecords, "不支持的 AmortizationType");
            amortizationRecords = amortizationRecords.Where(x => MathUtils.MoneyNE(x.Money, 0))
                                  .OrderBy(x => x.Date).ToList();
            return(amortizationRecords);
        }
Beispiel #10
0
        private decimal GetFee(string feeName)
        {
            //var dsVariables = NancyUtils.GetOverridableVariables(m_project.ProjectId);

            var logicModel = new ProjectLogicModel(m_userName, m_project.ProjectId);
            var dataset    = logicModel.DealSchedule.GetByPaymentDay(m_paymentDay).Dataset;
            NancyStaticAnalysisResult results = NancyUtils.GetStaticAnalyticsResult(m_project.ProjectId,
                                                                                    null, dataset.Instance.AsOfDate, dataset.AssetOverrideSetting);

            var cfTable = results.CashflowDt;

            int columnIndex = -1;

            for (int i = 0; i < cfTable.Columns.Count; ++i)
            {
                DateTime columnDate;
                if (DateTime.TryParse(cfTable.Columns[i].ColumnName, out columnDate) &&
                    m_paymentDay == columnDate)
                {
                    columnIndex = i;
                    break;
                }
            }

            CommUtils.Assert(columnIndex >= 0, "找不到对应支付日[" + m_paymentDay.ToString() + "]的数据");

            for (int i = 0; i < cfTable.Rows.Count; ++i)
            {
                var row = cfTable.Rows[i];
                if (row.ItemArray[1].Equals(feeName))
                {
                    return(decimal.Parse(row.ItemArray[columnIndex].ToString()));
                }
            }

            throw new ApplicationException("Can't find [" + feeName + "].");
        }
Beispiel #11
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);
        }
Beispiel #12
0
        public Page <Project> GetProjects(long pageNum, long itemsPerPage, bool isLoadDealInfo, List <int> authorizedProjectIds)
        {
            if (authorizedProjectIds.Count == 0)
            {
                return(new Page <Project>
                {
                    Items = new List <Project>()
                });
            }

            var sqlCondition = "(" + string.Join(", ", authorizedProjectIds.ConvertAll(x => x.ToString())) + ")";
            var page         = m_db.Page <ABSMgrConn.TableProject>(pageNum, itemsPerPage,
                                                                   "SELECT * FROM dbo.Project WHERE project_id IN "
                                                                   + sqlCondition + " AND record_status_id <> @0" + m_orderBy, (int)RecordStatus.Deleted);

            var projects = new Page <Project>().Parse(page);

            projects.Items = page.Items.ConvertAll(item => new Project(item));

            if (isLoadDealInfo)
            {
                if (projects.Items.Any(x => x.CnabsDealId.HasValue))
                {
                    var vwProjects = m_db.Fetch <ABSMgrConn.VwProject>(
                        "SELECT * FROM dbo.vw_project WHERE project_id IN (@authorizedProjectIds)" + m_orderBy, new { authorizedProjectIds });

                    var cnabsDealIds = projects.Items.Where(x => x.CnabsDealId.HasValue).Select(x => x.CnabsDealId);
                    var vwDeals      = m_db.Fetch <ABSMgrConn.VwDeal>(
                        "SELECT * FROM dbo.vw_deal WHERE deal_id IN (@cnabsDealIds)", new { cnabsDealIds });

                    var vwPaymentDates = m_db.Fetch <ABSMgrConn.VwPaymentDates>(
                        "SELECT * FROM " + m_db.ChineseABSDB + "[dbo].[PaymentDates] WHERE deal_id IN (@cnabsDealIds) ORDER BY payment_date", new { cnabsDealIds });

                    var nowDate = DateTime.Today;

                    foreach (var project in projects.Items)
                    {
                        var vwProject = vwProjects.FirstOrDefault(x => x.project_id == project.ProjectId);
                        if (vwProject != null)
                        {
                            if (vwProject.deal_name_chinese != null || vwProject.issuer != null ||
                                vwProject.total_offering != null || vwProject.frequency != null)
                            {
                                project.ProjectDealInfo = new ProjectDealInfo();
                                project.ProjectDealInfo.FromTableObject(vwProject);
                            }
                        }

                        //Get deal type
                        if (project.CnabsDealId.HasValue)
                        {
                            var vwDeal = vwDeals.FirstOrDefault(x => x.deal_id == project.CnabsDealId.Value);
                            if (vwDeal != null)
                            {
                                project.DealType = vwDeal.type;
                            }

                            var vwPaymentDate = vwPaymentDates
                                                .Where(x => x.deal_id == project.CnabsDealId.Value && x.payment_date.HasValue)
                                                .FirstOrDefault(x => x.payment_date.Value >= nowDate);
                            if (vwPaymentDate != null)
                            {
                                project.NextPaymentDate = vwPaymentDate.payment_date.Value;
                            }
                        }
                    }
                }

                if (projects.Items.Any(x => !x.CnabsDealId.HasValue))
                {
                    var rootFolder = WebConfigUtils.RootFolder;
                    foreach (var project in projects.Items)
                    {
                        if (project.CnabsDealId.HasValue || project.ModelId <= 0)
                        {
                            continue;
                        }

                        project.Model = GetModel(project.ModelId);

                        var modelFolder = Path.Combine(rootFolder, project.Model.ModelFolder);
                        var ymlFilePath = modelFolder + @"\Script.yml";
                        if (File.Exists(ymlFilePath))
                        {
                            using (StreamReader sr = new StreamReader(ymlFilePath))
                            {
                                var nancyDealData = NancyUtils.GetNancyDealDataByFile(sr.BaseStream);
                                if (nancyDealData != null)
                                {
                                    project.DealType                   = nancyDealData.DealTypeString;
                                    project.ProjectDealInfo            = new ProjectDealInfo();
                                    project.ProjectDealInfo.Originator = nancyDealData.Originator;

                                    var paymentDates = nancyDealData.ScheduleData.PaymentSchedule.GetPaymentDates();
                                    var nowDate      = DateTime.Today;
                                    if (paymentDates.Any(x => x >= nowDate))
                                    {
                                        project.NextPaymentDate = paymentDates.First(x => x >= nowDate);
                                    }
                                    else
                                    {
                                        project.NextPaymentDate = paymentDates.Last();
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(projects);
        }
Beispiel #13
0
        private Dictionary <string, string> SaveNoteData(int projectId)
        {
            var taskPeriod  = m_dbAdapter.TaskPeriod.GetByShortCode(this.m_task.ShortCode);
            var paymentDate = this.m_task.EndTime.Value;

            if (taskPeriod != null)
            {
                paymentDate = taskPeriod.PaymentDate;
            }

            var projectLogicModel = new ProjectLogicModel(m_userName, projectId);
            var project           = projectLogicModel.Instance;
            var dataset           = m_dbAdapter.Dataset.GetDatasetByDurationPeriod(project.ProjectId, paymentDate);
            var results           = NancyUtils.GetStaticAnalyticsResult(projectId, null, dataset.AsOfDate);
            var cfTable           = results.CashflowDt;

            Func <string, string> findValue = (key) => {
                var rowIndex = cfTable.IndexOfRow(x => x[1].ToString() == key);
                if (rowIndex >= 0)
                {
                    return(cfTable.Rows[rowIndex][2].ToString());
                }
                else
                {
                    return(string.Empty);
                }
            };

            var dict = new Dictionary <string, string>();

            dict["Expense.Received"] = findValue("Expense.Received");
            dict["Tax.Received"]     = findValue("Tax.Received");


            var notes = m_dbAdapter.Dataset.GetNotes(project.ProjectId);

            var currentDatasetColumnIndex = 2;

            for (int i = 0; i < cfTable.Columns.Count; ++i)
            {
                DateTime temp;
                if (DateTime.TryParse(cfTable.Columns[i].ColumnName, out temp) &&
                    dataset.PaymentDate.Value == temp)
                {
                    currentDatasetColumnIndex = i;
                    break;
                }
            }

            foreach (var n in notes)
            {
                var nd   = m_dbAdapter.Dataset.GetNoteData((int)n.NoteId, dataset.DatasetId);
                var prin = cfTable.AsEnumerable().FirstOrDefault(r => r[1].ToString().Contains(n.ShortName + ".Principal") && r[1].ToString().Contains("Received"))[currentDatasetColumnIndex].ToString();
                nd.PrincipalPaid = (decimal)((prin == string.Empty || prin == "-") ? 0.0 : double.Parse(prin));
                var interest = cfTable.AsEnumerable().FirstOrDefault(r => r[1].ToString().Contains(n.ShortName + ".Interest") && r[1].ToString().Contains("Received"))[currentDatasetColumnIndex].ToString();
                nd.InterestPaid = (decimal)((interest == string.Empty || interest == "-") ? 0.0 : double.Parse(interest));
                var end = cfTable.AsEnumerable().FirstOrDefault(r => r[1].ToString().Contains(n.ShortName + ".Beginning") && r[1].ToString().Contains("Outstanding"))[currentDatasetColumnIndex + 1].ToString();
                nd.EndingBalance = (decimal)((end == string.Empty || end == "-") ? 0.0 : double.Parse(end));
                m_dbAdapter.Dataset.UpdateNoteData(nd);
            }
            //var nr = m_dbAdapter.Dataset.GetNoteResultByProjectIdAndDatasetId(project.ProjectId, dataset.DatasetId);
            //DataTable drResult = results.AssetCashflowDt;
            //DataTable drCf = results.CashflowDt;
            //nr.NoteResultTable = results.Tables[0];
            //nr.NoteCashflowTable = CommUtils.ToJson(drCf);
            //m_dbAdapter.Dataset.UpdateNoteResult(nr);

            return(dict);
        }
Beispiel #14
0
        protected override object MakeObjectInstance()
        {
            var book = LoadExcelBook(m_excelFileName, m_excelStream);

            List <CellKeyword> keywordList = new List <CellKeyword>();

            var collateralInterestCollectionKey = new CellKeyword("收款信息", "收入回收款", "");

            keywordList.Add(collateralInterestCollectionKey);
            var collateralPrincipalCollectionKey = new CellKeyword("收款信息", "本金回收款", "");

            keywordList.Add(collateralPrincipalCollectionKey);

            var collateralLossAmountKey = new CellKeyword("违约及严重拖欠信息", "新增违约抵押贷款", "金额");

            keywordList.Add(collateralLossAmountKey);

            #region Word文档中表格里的字段抓取

            var 正常贷款金额 = new CellKeyword("本收款期间资产池贷款状态特征", "正常", "贷款余额");
            keywordList.Add(正常贷款金额);

            var 正常贷款金额占比 = new CellKeyword("本收款期间资产池贷款状态特征", "正常", "占期末资产池抵押贷款余额百分比");
            keywordList.Add(正常贷款金额占比);

            var 拖欠31至60天以上贷款金额 = new CellKeyword("本收款期间资产池贷款状态特征", "拖欠31至60天", "贷款余额");
            keywordList.Add(拖欠31至60天以上贷款金额);

            var 拖欠31至60天以上贷款金额占比 = new CellKeyword("本收款期间资产池贷款状态特征", "拖欠31至60天", "占期末资产池抵押贷款余额百分比");
            keywordList.Add(拖欠31至60天以上贷款金额占比);

            var 拖欠61至90天以上贷款金额 = new CellKeyword("本收款期间资产池贷款状态特征", "拖欠61至90天", "贷款余额");
            keywordList.Add(拖欠61至90天以上贷款金额);

            var 拖欠61至90天以上贷款金额占比 = new CellKeyword("本收款期间资产池贷款状态特征", "拖欠61至90天", "占期末资产池抵押贷款余额百分比");
            keywordList.Add(拖欠61至90天以上贷款金额占比);

            var 拖欠91至120天以上贷款金额 = new CellKeyword("本收款期间资产池贷款状态特征", "拖欠91至120天", "贷款余额");
            keywordList.Add(拖欠91至120天以上贷款金额);

            var 拖欠91至120天以上贷款金额占比 = new CellKeyword("本收款期间资产池贷款状态特征", "拖欠91至120天", "占期末资产池抵押贷款余额百分比");
            keywordList.Add(拖欠91至120天以上贷款金额占比);

            var 拖欠121至150天以上贷款金额 = new CellKeyword("本收款期间资产池贷款状态特征", "拖欠121至150天", "贷款余额");
            keywordList.Add(拖欠121至150天以上贷款金额);

            var 拖欠121至150天以上贷款金额占比 = new CellKeyword("本收款期间资产池贷款状态特征", "拖欠121至150天", "占期末资产池抵押贷款余额百分比");
            keywordList.Add(拖欠121至150天以上贷款金额占比);

            var 拖欠151至180天以上贷款金额 = new CellKeyword("本收款期间资产池贷款状态特征", "拖欠151至180天", "贷款余额");
            keywordList.Add(拖欠151至180天以上贷款金额);

            var 拖欠151至180天以上贷款金额占比 = new CellKeyword("本收款期间资产池贷款状态特征", "拖欠151至180天", "占期末资产池抵押贷款余额百分比");
            keywordList.Add(拖欠151至180天以上贷款金额占比);

            var 违约抵押贷款_未被注销金额 = new CellKeyword("本收款期间资产池贷款状态特征", "违约抵押贷款(未被注销)", "贷款余额");
            keywordList.Add(违约抵押贷款_未被注销金额);

            var 违约抵押贷款_未被注销占比 = new CellKeyword("本收款期间资产池贷款状态特征", "违约抵押贷款(未被注销)", "占期末资产池抵押贷款余额百分比");
            keywordList.Add(违约抵押贷款_未被注销占比);

            var 贷款余额_汇总 = new CellKeyword("本收款期间资产池贷款状态特征", "汇总", "贷款余额");
            keywordList.Add(贷款余额_汇总);


            var 期初本金总余额 = new CellKeyword("资产池存续期总体信息", "入池总金额", "上次报告期");
            keywordList.Add(期初本金总余额);

            var 期末本金总余额 = new CellKeyword("资产池存续期总体信息", "入池总金额", "本次报告期");
            keywordList.Add(期末本金总余额);

            var 本期应收本金 = new CellKeyword("资产池存续期总体信息", "", "应收本金");
            keywordList.Add(本期应收本金);

            var 本期应收利息 = new CellKeyword("资产池存续期总体信息", "", "应收利息");
            keywordList.Add(本期应收利息);

            var 收入账_利息_正常回收_上次报告期 = new CellKeyword("收款信息", "计划内还款", new[] { "上一收款期", "利息" });
            keywordList.Add(收入账_利息_正常回收_上次报告期);

            var 收入账_利息_正常回收_本次报告期 = new CellKeyword("收款信息", "计划内还款", new[] { "本收款期", "利息" });
            keywordList.Add(收入账_利息_正常回收_本次报告期);

            var 收入账_利息_提前偿还_上次报告期 = new CellKeyword("收款信息", "提前还款", new[] { "上一收款期", "利息" });
            keywordList.Add(收入账_利息_提前偿还_上次报告期);

            var 收入账_利息_提前偿还_本次报告期 = new CellKeyword("收款信息", "提前还款", new[] { "本收款期", "利息" });
            keywordList.Add(收入账_利息_提前偿还_本次报告期);

            var 收入账_利息_拖欠回收_上次报告期 = new CellKeyword("收款信息", "拖欠回收", new[] { "上一收款期", "利息" });
            keywordList.Add(收入账_利息_拖欠回收_上次报告期);

            var 收入账_利息_拖欠回收_本次报告期 = new CellKeyword("收款信息", "拖欠回收", new[] { "本收款期", "利息" });
            keywordList.Add(收入账_利息_拖欠回收_本次报告期);

            var 收入账_利息_违约回收_上次报告期 = new CellKeyword("收款信息", "违约回收", new[] { "上一收款期", "利息" });
            keywordList.Add(收入账_利息_违约回收_上次报告期);

            var 收入账_利息_违约回收_本次报告期 = new CellKeyword("收款信息", "违约回收", new[] { "本收款期", "利息" });
            keywordList.Add(收入账_利息_违约回收_本次报告期);

            var 收入账_利息_合计_上次报告期 = new CellKeyword("收款信息", "合计", new[] { "上一收款期", "利息" });
            keywordList.Add(收入账_利息_合计_上次报告期);

            var 收入账_利息_合计_本次报告期 = new CellKeyword("收款信息", "合计", "利息");
            keywordList.Add(收入账_利息_合计_本次报告期);

            //var 收入账_其他收入_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(收入账_其他收入_上次报告期);

            //var 收入账_其他收入_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(收入账_其他收入_本次报告期);

            //var 收入账_上期转存_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(收入账_上期转存_上次报告期);

            //var 收入账_上期转存_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(收入账_上期转存_本次报告期);

            //var 收入账_合格投资_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(收入账_合格投资_上次报告期);

            //var 收入账_合格投资_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(收入账_合格投资_本次报告期);

            var 收入账_合计_上次报告期 = new CellKeyword("收款信息", "收入回收款", "上一收款期");
            keywordList.Add(收入账_合计_上次报告期);

            var 收入账_合计_本次报告期 = new CellKeyword("收款信息", "收入回收款", "");
            keywordList.Add(收入账_合计_本次报告期);

            var 本金账_本金_正常回收_上次报告期 = new CellKeyword("收款信息", "计划内还款", new[] { "上一收款期", "本金" });
            keywordList.Add(本金账_本金_正常回收_上次报告期);

            var 本金账_本金_正常回收_本次报告期 = new CellKeyword("收款信息", "计划内还款", new[] { "本收款期", "本金" });
            keywordList.Add(本金账_本金_正常回收_本次报告期);

            var 本金账_本金_提前偿还_上次报告期 = new CellKeyword("收款信息", "提前还款", new[] { "上一收款期", "本金" });
            keywordList.Add(本金账_本金_提前偿还_上次报告期);

            var 本金账_本金_提前偿还_本次报告期 = new CellKeyword("收款信息", "提前还款", new[] { "本收款期", "本金" });
            keywordList.Add(本金账_本金_提前偿还_本次报告期);

            var 本金账_本金_拖欠回收_上次报告期 = new CellKeyword("收款信息", "拖欠回收", new[] { "上一收款期", "本金" });
            keywordList.Add(本金账_本金_拖欠回收_上次报告期);

            var 本金账_本金_拖欠回收_本次报告期 = new CellKeyword("收款信息", "拖欠回收", new[] { "本收款期", "本金" });
            keywordList.Add(本金账_本金_拖欠回收_本次报告期);

            var 本金账_本金_违约回收_上次报告期 = new CellKeyword("收款信息", "违约回收", new[] { "上一收款期", "本金" });
            keywordList.Add(本金账_本金_违约回收_上次报告期);

            var 本金账_本金_违约回收_本次报告期 = new CellKeyword("收款信息", "违约回收", new[] { "本收款期", "本金" });
            keywordList.Add(本金账_本金_违约回收_本次报告期);

            var 本金账_本金_合计_上次报告期 = new CellKeyword("收款信息", "合计", new[] { "上一收款期", "本金" });
            keywordList.Add(本金账_本金_合计_上次报告期);

            var 本金账_本金_合计_本次报告期 = new CellKeyword("收款信息", "合计", new[] { "本收款期", "本金" });
            keywordList.Add(本金账_本金_合计_本次报告期);

            //var 本金账_其他收入_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(本金账_其他收入_上次报告期);

            //var 本金账_其他收入_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(本金账_其他收入_本次报告期);

            //var 本金账_上期转存_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(本金账_上期转存_上次报告期);

            //var 本金账_上期转存_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(本金账_上期转存_本次报告期);

            var 本金账_合计_上次报告期 = new CellKeyword("收款信息", "本金回收款", "上一收款期");
            keywordList.Add(本金账_合计_上次报告期);

            var 本金账_合计_本次报告期 = new CellKeyword("收款信息", "本金回收款", "本收款期");
            keywordList.Add(本金账_合计_本次报告期);

            //var 收入及本金合计_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(收入及本金合计_上次报告期);

            //var 收入及本金合计_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(收入及本金合计_本次报告期);

            //var 税收_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(税收_上次报告期);

            //var 税收_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(税收_本次报告期);

            //var 费用支出_服务总费用支出_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(费用支出_服务总费用支出_上次报告期);

            //var 费用支出_服务总费用支出_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(费用支出_服务总费用支出_本次报告期);

            //var 费用支出_其他费用支出_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(费用支出_其他费用支出_上次报告期);

            //var 费用支出_其他费用支出_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(费用支出_其他费用支出_本次报告期);

            //var 证券账户支出_证券利息总支出_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(证券账户支出_证券利息总支出_上次报告期);

            //var 证券账户支出_证券利息总支出_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(证券账户支出_证券利息总支出_本次报告期);

            //var 证券账户支出_证券本金总支出_上次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(证券账户支出_证券本金总支出_上次报告期);

            //var 证券账户支出_证券本金总支出_本次报告期 = new CellKeyword("收款信息", "计划内还款", "利息");
            //keywordList.Add(证券账户支出_证券本金总支出_本次报告期);

            //var 信托核算日 = new CellKeyword("资产池存续期总体信息", "", "时间111");
            //keywordList.Add(信托核算日);
            #endregion

            var cumlossKey = new CellKeyword("违约及严重拖欠信息", "累计违约时点违约抵押贷款金额", "上一收款期间期末");
            keywordList.Add(cumlossKey);



            var dictValues = GetCellValues(book, keywordList);

            var idrObj = new DemoJianYuanReport();

            idrObj.违约抵押贷款在本收款期间期末所处的处置状态 = new PatternTable();
            GetPatternTable(book, idrObj.违约抵押贷款在本收款期间期末所处的处置状态,
                            "违约抵押贷款在本收款期间期末所处的处置状态及抵销权风险监控",
                            "占初始起算日资产池余额百分比", "汇总");

            idrObj.入池资产笔数与金额特征 = new PatternTable();
            GetPatternTable(book, idrObj.入池资产笔数与金额特征,
                            "资产池存续期总体信息",
                            "单笔贷款平均本金余额", new [] { "1、入池资产笔数与金额特征", "本次报告期" });

            idrObj.入池资产的期限特征 = new PatternTable();
            GetPatternTable(book, idrObj.入池资产的期限特征,
                            "资产池存续期总体信息",
                            "贷款最短到期期限", new [] { "2、入池资产的期限特征", "本次报告期" });

            idrObj.入池资产利率特征 = new PatternTable();
            GetPatternTable(book, idrObj.入池资产利率特征,
                            "资产池存续期总体信息",
                            "最低贷款利率(%)", new [] { "3、入池资产利率特征", "本次报告期" });


            var logicModel = new ProjectLogicModel(m_userName, m_project.ProjectId);
            var schedule   = logicModel.DealSchedule.Instanse;

            List <DateTime> paymentDates = schedule.PaymentDates.ToList();

            var taskPeriod  = m_dbAdapter.TaskPeriod.GetByShortCode(this.m_task.ShortCode);
            var paymentDate = m_task.EndTime.Value;
            if (taskPeriod != null)
            {
                paymentDate = taskPeriod.PaymentDate;
            }

            var datasets = m_dbAdapter.Dataset.GetDatasetByProjectId(m_project.ProjectId);
            paymentDate = paymentDates.First(x => x >= paymentDate);

            datasets = datasets.Where(x => x.PaymentDate.HasValue && x.PaymentDate.Value <= paymentDate).ToList();
            var findDatasets = datasets.Where(x => x.PaymentDate.HasValue && x.PaymentDate.Value == paymentDate).ToList();
            findDatasets.Sort((l, r) => l.AsOfDate.CompareTo(r.AsOfDate));
            CommUtils.Assert(findDatasets.Count >= 1, "找不到偿付期为 [{0}] 的数据模型", DateUtils.DateToString(paymentDate));

            var dataset = findDatasets[0];


            var scheduledPaymentDates = paymentDates.Select(x => x).ToList();
            var rootFolder            = WebConfigUtils.RootFolder;
            var project     = m_dbAdapter.Project.GetProjectById(logicModel.Instance.ProjectId);
            var modelFolder = Path.Combine(rootFolder, project.Model.ModelFolder);
            var ymlFilePath = modelFolder + @"\Script.yml";
            if (File.Exists(ymlFilePath))
            {
                using (StreamReader sr = new StreamReader(ymlFilePath))
                {
                    var nancyDealData = NancyUtils.GetNancyDealDataByFile(sr.BaseStream);
                    if (nancyDealData != null)
                    {
                        scheduledPaymentDates = nancyDealData.ScheduleData.PaymentSchedule.GetScheduledPaymentDates().ToList();
                    }
                }
            }


            var dealScheduleLogicModel = logicModel.DealSchedule.GetByPaymentDay(findDatasets[0].PaymentDate.Value);

            var dbAdapter     = new DBAdapter();
            var datasetFolder = dbAdapter.Dataset.GetDatasetFolder(logicModel.Instance, dataset.AsOfDate);

            Func <CellKeyword, double> parseDouble = (x) =>
            {
                double temp = 0;
                CommUtils.Assert(double.TryParse(dictValues[x], out temp), "无法转换{0}-{1}-{2}为数值",
                                 x.TitleName, x.RowName, x.ColumnName);
                return(temp);
            };

            Func <CellKeyword, double> percentParseDouble = (x) =>
            {
                double temp = 0;
                CommUtils.Assert(dictValues[x].Substring(dictValues[x].Length - 1) == "%", "无法转换{0}-{1}-{2}为数值",
                                 x.TitleName, x.RowName, x.ColumnName);

                var value = dictValues[x].Substring(0, dictValues[x].Length - 1);
                CommUtils.Assert(double.TryParse(value, out temp), "无法转换{0}-{1}-{2}为数值",
                                 x.TitleName, x.RowName, x.ColumnName);
                return(temp / 100);
            };

            //FutureVariables.csv
            //Cumloss
            //违约及严重拖欠信息
            //    累计违约时点违约抵押贷款金额(行) + 上一收款期间期末(列)    16154029.17
            //var futureVariablesPath = Path.Combine(datasetFolder, "FutureVariables.csv");
            //var futureVariablesCsv = new VariablesCsv();
            //futureVariablesCsv.Load(futureVariablesPath);
            //double cumloss = parseDouble(cumlossKey);
            //futureVariablesCsv.UpdateCellValue("Cumloss", paymentDate, cumloss.ToString());
            //futureVariablesCsv.Save();

            //CurrentVariables.csv
            //Collateral.InterestCollection
            //Collateral.PrincipalCollection
            //收款信息
            //    本金回收款(行) + 下一列    123009207.33
            //    收入回收款(行) + 下一列     26277809.43
            //Collateral.Loss.Amount
            //违约及严重拖欠信息
            //    新增违约抵押贷款 (行) + 金额(列)    1834059.79
            //var currentVariablesPath = Path.Combine(datasetFolder, "CurrentVariables.csv");
            //var currentVariablesCsv = new VariablesCsv();
            //currentVariablesCsv.Load(currentVariablesPath);
            //double collateralInterestCollection = parseDouble(collateralInterestCollectionKey);
            //currentVariablesCsv.UpdateCellValue("Collateral.InterestCollection", paymentDate, collateralInterestCollection.ToString());

            //double collateralPrincipalCollection = parseDouble(collateralPrincipalCollectionKey);
            //currentVariablesCsv.UpdateCellValue("Collateral.PrincipalCollection", paymentDate, collateralPrincipalCollection.ToString());

            //double collateralLossAmount = parseDouble(collateralLossAmountKey);
            //currentVariablesCsv.UpdateCellValue("Collateral.Loss.Amount", paymentDate, collateralLossAmount.ToString());
            //currentVariablesCsv.Save();

            var dict = SaveNoteData(m_project.ProjectId);
            idrObj.ExpenseReceived = dict["Expense.Received"];
            idrObj.TaxReceived     = dict["Tax.Received"];

            var maker = new IncomeDistributionReportMaker(m_userName);
            idrObj.DistInfo = (IncomeDistributionReport)maker.GetObjInstance(m_task.ProjectId, paymentDate, m_task.EndTime.Value);


            //从第N期开始模型数据时,getDealSchedule中不包含前几期的PaymentDate
            if (m_project.CnabsDealId.HasValue)
            {
                paymentDates = m_dbAdapter.Model.GetPaymentDates(m_project.CnabsDealId.Value);
            }

            idrObj.CurrentYear    = idrObj.DistInfo.T.Year;
            idrObj.Sequence       = idrObj.DistInfo.Sequence;
            idrObj.SequenceInYear = paymentDates.Where(x => x.Year == idrObj.CurrentYear)
                                    .Count(x => x <= idrObj.DistInfo.T);


            Func <DateTime, DateTime> findScheduledPaymentDate = (date) =>
            {
                //倒序scheduledPaymentDates 然后再查找
                scheduledPaymentDates = scheduledPaymentDates.OrderByDescending(x => x).ToList();
                var lastIndex = paymentDates.Count - paymentDates.IndexOf(date) - 1;
                CommUtils.Assert(scheduledPaymentDates.Count > lastIndex, "找不到scheduledPaymentDate,scheduledPaymentDates.Count <= lastIndex");
                return(scheduledPaymentDates[lastIndex]);
            };

            idrObj.ScheduledPreviousT = findScheduledPaymentDate(idrObj.DistInfo.PreviousT);
            idrObj.ScheduledT         = findScheduledPaymentDate(idrObj.DistInfo.T);

            idrObj.正常贷款金额      = (decimal)parseDouble(正常贷款金额);
            idrObj.正常贷款金额占比    = (decimal)percentParseDouble(正常贷款金额占比);
            idrObj.期初本金总余额     = (decimal)parseDouble(期初本金总余额);
            idrObj.期末本金总余额     = (decimal)parseDouble(期末本金总余额);
            idrObj.本期应收本金      = (decimal)parseDouble(本期应收本金);
            idrObj.本期应收利息      = (decimal)parseDouble(本期应收利息);
            idrObj.拖欠90天以上贷款金额 = (decimal)parseDouble(拖欠91至120天以上贷款金额)
                                 + (decimal)parseDouble(拖欠121至150天以上贷款金额)
                                 + (decimal)parseDouble(拖欠151至180天以上贷款金额)
                                 + (decimal)parseDouble(违约抵押贷款_未被注销金额);
            idrObj.拖欠90天以上贷款金额占比 = idrObj.拖欠90天以上贷款金额 / (decimal)parseDouble(贷款余额_汇总);

            idrObj.拖欠60天以上贷款金额   = idrObj.拖欠90天以上贷款金额 + (decimal)parseDouble(拖欠61至90天以上贷款金额);
            idrObj.拖欠60天以上贷款金额占比 = idrObj.拖欠60天以上贷款金额 / (decimal)parseDouble(贷款余额_汇总);
            //idrObj.拖欠90天以上贷款金额占比 + (decimal)percentParseDouble(拖欠61至90天以上贷款金额占比);

            idrObj.拖欠30天以上贷款金额   = idrObj.拖欠60天以上贷款金额 + (decimal)parseDouble(拖欠31至60天以上贷款金额);
            idrObj.拖欠30天以上贷款金额占比 = idrObj.拖欠30天以上贷款金额 / (decimal)parseDouble(贷款余额_汇总);
            //idrObj.拖欠60天以上贷款金额占比 + (decimal)percentParseDouble(拖欠31至60天以上贷款金额占比);

            idrObj.收入账_利息_正常回收_上次报告期 = (decimal)parseDouble(收入账_利息_正常回收_上次报告期);
            idrObj.收入账_利息_提前偿还_上次报告期 = (decimal)parseDouble(收入账_利息_提前偿还_上次报告期);
            idrObj.收入账_利息_拖欠回收_上次报告期 = (decimal)parseDouble(收入账_利息_拖欠回收_上次报告期);
            idrObj.收入账_利息_违约回收_上次报告期 = (decimal)parseDouble(收入账_利息_违约回收_上次报告期);
            idrObj.收入账_利息_合计_上次报告期   = (decimal)parseDouble(收入账_利息_合计_上次报告期);

            idrObj.收入账_利息_正常回收_本次报告期 = (decimal)parseDouble(收入账_利息_正常回收_本次报告期);
            idrObj.收入账_利息_提前偿还_本次报告期 = (decimal)parseDouble(收入账_利息_提前偿还_本次报告期);
            idrObj.收入账_利息_拖欠回收_本次报告期 = (decimal)parseDouble(收入账_利息_拖欠回收_本次报告期);
            idrObj.收入账_利息_违约回收_本次报告期 = (decimal)parseDouble(收入账_利息_违约回收_本次报告期);
            idrObj.收入账_利息_合计_本次报告期   = (decimal)parseDouble(收入账_利息_合计_本次报告期);
            //idrObj.收入账_其他收入_上次报告期 = (decimal)parseDouble(收入账_其他收入_上次报告期);
            //idrObj.收入账_其他收入_本次报告期 = (decimal)parseDouble(收入账_其他收入_本次报告期);
            //idrObj.收入账_上期转存_上次报告期 = (decimal)parseDouble(收入账_上期转存_上次报告期);
            //idrObj.收入账_上期转存_本次报告期 = (decimal)parseDouble(收入账_上期转存_本次报告期);
            //idrObj.收入账_合格投资_上次报告期 = (decimal)parseDouble(收入账_合格投资_上次报告期);
            //idrObj.收入账_合格投资_本次报告期 = (decimal)parseDouble(收入账_合格投资_本次报告期);
            idrObj.收入账_合计_上次报告期      = (decimal)parseDouble(收入账_合计_上次报告期);
            idrObj.收入账_合计_本次报告期      = (decimal)parseDouble(收入账_合计_本次报告期);
            idrObj.本金账_本金_正常回收_上次报告期 = (decimal)parseDouble(本金账_本金_正常回收_上次报告期);
            idrObj.本金账_本金_正常回收_本次报告期 = (decimal)parseDouble(本金账_本金_正常回收_本次报告期);
            idrObj.本金账_本金_提前偿还_上次报告期 = (decimal)parseDouble(本金账_本金_提前偿还_上次报告期);
            idrObj.本金账_本金_提前偿还_本次报告期 = (decimal)parseDouble(本金账_本金_提前偿还_本次报告期);
            idrObj.本金账_本金_拖欠回收_上次报告期 = (decimal)parseDouble(本金账_本金_拖欠回收_上次报告期);
            idrObj.本金账_本金_拖欠回收_本次报告期 = (decimal)parseDouble(本金账_本金_拖欠回收_本次报告期);
            idrObj.本金账_本金_违约回收_上次报告期 = (decimal)parseDouble(本金账_本金_违约回收_上次报告期);
            idrObj.本金账_本金_违约回收_本次报告期 = (decimal)parseDouble(本金账_本金_违约回收_本次报告期);
            idrObj.本金账_本金_合计_上次报告期   = (decimal)parseDouble(本金账_本金_合计_上次报告期);
            idrObj.本金账_本金_合计_本次报告期   = (decimal)parseDouble(本金账_本金_合计_本次报告期);
            //idrObj.本金账_其他收入_上次报告期 = (decimal)parseDouble(本金账_其他收入_上次报告期);
            //idrObj.本金账_其他收入_本次报告期 = (decimal)parseDouble(本金账_其他收入_本次报告期);
            //idrObj.本金账_上期转存_上次报告期 = (decimal)parseDouble(本金账_上期转存_上次报告期);
            //idrObj.本金账_上期转存_本次报告期 = (decimal)parseDouble(本金账_上期转存_本次报告期);
            idrObj.本金账_合计_上次报告期 = (decimal)parseDouble(本金账_合计_上次报告期);
            idrObj.本金账_合计_本次报告期 = (decimal)parseDouble(本金账_合计_本次报告期);

            idrObj.收入及本金合计_上次报告期 = idrObj.本金账_合计_上次报告期 + idrObj.收入账_合计_上次报告期;
            idrObj.收入及本金合计_本次报告期 = idrObj.本金账_合计_本次报告期 + idrObj.收入账_合计_本次报告期;

            //idrObj.税收_上次报告期 = (decimal)parseDouble(税收_上次报告期);
            //idrObj.税收_本次报告期 = (decimal)parseDouble(税收_本次报告期);
            //idrObj.费用支出_服务总费用支出_上次报告期 = (decimal)parseDouble(费用支出_服务总费用支出_上次报告期);
            //idrObj.费用支出_服务总费用支出_本次报告期 = (decimal)parseDouble(费用支出_服务总费用支出_本次报告期);
            //idrObj.费用支出_其他费用支出_上次报告期 = (decimal)parseDouble(费用支出_其他费用支出_上次报告期);
            //idrObj.费用支出_其他费用支出_本次报告期 = (decimal)parseDouble(费用支出_其他费用支出_本次报告期);
            //idrObj.证券账户支出_证券利息总支出_上次报告期 = (decimal)parseDouble(证券账户支出_证券利息总支出_上次报告期);
            //idrObj.证券账户支出_证券利息总支出_本次报告期 = (decimal)parseDouble(证券账户支出_证券利息总支出_本次报告期);
            //idrObj.证券账户支出_证券本金总支出_上次报告期 = (decimal)parseDouble(证券账户支出_证券本金总支出_上次报告期);
            //idrObj.证券账户支出_证券本金总支出_本次报告期 = (decimal)parseDouble(证券账户支出_证券本金总支出_本次报告期);
            //idrObj.信托核算日 = dictValues[信托核算日];

            //查找收款期间截止日
            {
                var sheet      = FindSheetByTitle(book, 2, 0, "资产池存续期总体信息");
                var val        = GetCellValue(sheet, 0, 0);
                var index      = val.LastIndexOf(idrObj.DistInfo.T.Year.ToString());
                var strEndDate = val.Substring(index);


                var indexBeginDate    = val.IndexOf(idrObj.DistInfo.T.Year.ToString());
                var indexBeginDateDay = val.IndexOf("日");
                var strBeginDate      = val.Substring(indexBeginDate, indexBeginDateDay - indexBeginDate + 1);

                DateTime receiveMoneyBeginDate;
                CommUtils.Assert(DateTime.TryParse(strBeginDate, out receiveMoneyBeginDate),
                                 "解析收款期间开始日失败:" + val);

                idrObj.ReceiveMoneyBeginDate = receiveMoneyBeginDate;


                DateTime receiveMoneyEndDate;
                CommUtils.Assert(DateTime.TryParse(strEndDate, out receiveMoneyEndDate),
                                 "解析收款期间截止日失败:" + val);

                idrObj.ReceiveMoneyEndDate = receiveMoneyEndDate;
            }

            return(idrObj);
        }
Beispiel #15
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
            });
        }
        private void CreateDataset(Project project, string asOfDate)
        {
            var projectId = project.ProjectId;
            var datasets  = m_dbAdapter.Dataset.GetDatasetByProjectId(projectId);

            if (datasets.Any(x => x.AsOfDate == asOfDate))
            {
                throw new ApplicationException("产品[" + project.Name + "]中,dataset [" + asOfDate + "]已存在。");
            }

            //Find payment date
            DateTime?paymentDate  = null;
            var      dealSchedule = NancyUtils.GetDealSchedule(project.ProjectId);

            if (dealSchedule == null || dealSchedule.PaymentDates == null || dealSchedule.PaymentDates.Length == 0)
            {
                //创建第一期Dataset时,没有模型数据,无法读取DealSchedule,此时PaymentDate从数据库中取得
                if (project.CnabsDealId.HasValue)
                {
                    var paymentDates = m_dbAdapter.Model.GetPaymentDates(project.CnabsDealId.Value);
                    var date         = DateTime.ParseExact(asOfDate, "yyyyMMdd", CultureInfo.InvariantCulture);
                    if (paymentDates.All(x => x < date))
                    {
                        throw new ApplicationException("产品[" + project.Name + "]中,dataset [" + asOfDate + "]不在任何支付日之前。");
                    }
                    paymentDate = paymentDates.First(x => x >= date);
                }
            }
            else
            {
                //创建第N期Dataset时,有模型数据,此时PaymentDate按照DealSchedule中AsOfDate对应Index查出
                var curAsOfDate = DateUtils.ParseDigitDate(asOfDate);
                if (curAsOfDate == dealSchedule.FirstCollectionPeriodStartDate)
                {
                    paymentDate = dealSchedule.PaymentDates[0];
                }
                else
                {
                    for (int i = 0; i < dealSchedule.DeterminationDates.Length - 1; ++i)
                    {
                        if (curAsOfDate == dealSchedule.DeterminationDates[i])
                        {
                            paymentDate = dealSchedule.PaymentDates[i + 1];
                            break;
                        }
                    }
                }
            }

            CommUtils.AssertNotNull(paymentDate, "无法根据AsOfDate[" + asOfDate + "]查询到对应的支付日。");

            var notes = m_dbAdapter.Dataset.GetNotes(projectId);

            //Create dataset
            var dataset = new Dataset();

            dataset.ProjectId   = projectId;
            dataset.AsOfDate    = asOfDate;
            dataset.PaymentDate = paymentDate;
            LogEditProduct(EditProductType.CreateProduct, projectId, "创建Dataset[" + projectId + "][" + asOfDate + "]", "");
            dataset = m_dbAdapter.Dataset.NewDataset(dataset);

            //Create note result
            var noteResult = new NoteResults();

            noteResult.ProjectId = projectId;
            noteResult.DatasetId = dataset.DatasetId;
            LogEditProduct(EditProductType.CreateProduct, projectId, "创建NoteResult[" + projectId + "][" + dataset.DatasetId + "]", "");
            noteResult = m_dbAdapter.Dataset.NewNoteResult(noteResult);

            //Create note data
            foreach (var note in notes)
            {
                var noteData = new NoteData();
                noteData.NoteId    = note.NoteId;
                noteData.DatasetId = dataset.DatasetId;
                LogEditProduct(EditProductType.CreateProduct, projectId, "创建NoteData[" + note.NoteName + "][" + note.NoteId + "][" + dataset.DatasetId + "]", "");
                noteData = m_dbAdapter.Dataset.NewNoteData(noteData);
            }
        }
Beispiel #17
0
        public ActionResult GetPaymentPercentChart(string projectGuid)
        {
            return(ActionUtils.Json(() =>
            {
                var project = m_dbAdapter.Project.GetProjectByGuid(projectGuid);

                CommUtils.Assert(project.CnabsDealId.HasValue, "CNABS deal id is null.");

                DealService dealService = new DealService();
                var dealData = dealService.GetDealData(project.CnabsDealId.Value);
                CommUtils.Assert(dealData.ClosingDate.HasValue, "查找计息日失败");
                var closingDate = dealData.ClosingDate;

                //Load note info
                var notes = m_dbAdapter.Dataset.GetNotes(project.ProjectId);
                var cnabsNotes = new ProjectLogicModel(CurrentUserName, project).Notes;
                var noteDict = Toolkit.GetNoteDictionary(project, notes, cnabsNotes);
                var noteInfos = notes.ConvertAll(x => noteDict[x.NoteId]);

                //Load dataset info
                var datasetViewModels = new List <DatasetViewModel>();
                var dealSchedule = NancyUtils.GetDealSchedule(project.ProjectId);
                var datasets = m_dbAdapter.Dataset.GetDatasetByProjectId(project.ProjectId);
                foreach (var dataset in datasets)
                {
                    var noteDatas = m_dbAdapter.Dataset.GetNoteDatas(dataset.DatasetId);
                    var datasetViewModel = Toolkit.GetDatasetViewModel(dataset, dealSchedule.PaymentDates, noteDict, noteDatas);
                    datasetViewModels.Add(datasetViewModel);
                }

                datasetViewModels.Reverse();

                var dataSeries = new DataSeries();
                dataSeries.name = "汇总";
                dataSeries.data = new List <Vector>();
                dataSeries.data.Add(new Vector(closingDate.Value, 100f));

                var sumNotional = noteInfos.Sum(x => x.Notional);
                var endingBalance = sumNotional;

                if (sumNotional.HasValue && sumNotional.Value != 0)
                {
                    foreach (var datasetViewModel in datasetViewModels)
                    {
                        var detail = datasetViewModel.SumPaymentDetail;
                        endingBalance -= detail.PrincipalPaid;
                        dataSeries.data.Add(new Vector(datasetViewModel.PaymentDay.Value, (endingBalance.Value / sumNotional.Value) * 100));
                    }
                }

                var dataSeriesList = new List <DataSeries>();
                dataSeriesList.Add(dataSeries);

                Dictionary <string, List <Vector> > series = new Dictionary <string, List <Vector> >();
                Dictionary <string, decimal> endingBalances = new Dictionary <string, decimal>();
                foreach (var noteInfo in noteInfos)
                {
                    var key = noteInfo.Name;
                    series[key] = new List <Vector>();
                    endingBalances[key] = noteInfo.Notional.Value;
                    series[key].Add(new Vector(closingDate.Value, 100d));
                }

                foreach (var datasetViewModel in datasetViewModels)
                {
                    foreach (var noteData in datasetViewModel.NoteDatas)
                    {
                        var key = noteData.NoteInfo.Name;
                        endingBalances[key] -= noteData.PaymentDetail.PrincipalPaid.Value;
                        series[key].Add(new Vector(datasetViewModel.PaymentDay.Value, (100 * endingBalances[key] / noteData.NoteInfo.Notional.Value)));
                    }
                }

                foreach (var key in series.Keys)
                {
                    var ds = new DataSeries();
                    ds.name = key;
                    ds.data = series[key];
                    dataSeriesList.Add(ds);
                }

                return ActionUtils.Success(dataSeriesList);
            }));
        }
        public ActionResult PrepayAmortizationByAsset(string projectGuid, string paymentDate, int assetId,
                                                      string prepayDate, double money, string distributionType, string distributionDetail, string comment)
        {
            return(ActionUtils.Json(() =>
            {
                CommUtils.Assert(money >= 0, "提前偿付金额不能为负数");
                var type = CommUtils.ParseEnum <PrepayDistrubutionType>(distributionType);

                var project = new ProjectLogicModel(CurrentUserName, projectGuid);
                var dataset = project.DealSchedule.GetByPaymentDay(DateUtils.ParseDigitDate(paymentDate)).Dataset;
                var asset = dataset.Assets.Single(x => x.AssetId == assetId);

                CommUtils.Assert(DateUtils.ParseDigitDate(prepayDate) >= dataset.DatasetSchedule.AsOfDateBegin &&
                                 DateUtils.ParseDigitDate(prepayDate) <= dataset.DatasetSchedule.AsOfDateEnd,
                                 "提前偿付日期必须在当期时间范围(" + dataset.DatasetSchedule.AsOfDateBegin.ToShortDateString()
                                 + "~" + dataset.DatasetSchedule.AsOfDateEnd.ToShortDateString() + ")内");

                if (asset.AmortizationType == AmortizationType.UserDefined)
                {
                    var amortization = dataset.AmortizationSchedule;
                    amortization.AddPrepayment(assetId, DateUtils.ParseDigitDate(prepayDate), money, type, distributionDetail);
                    amortization.Save();

                    var history = new AssetPrepaymentHistory();
                    history.ProjectId = project.Instance.ProjectId;
                    history.DatasetId = dataset.Instance.DatasetId;
                    history.AssetId = assetId;
                    history.PrepayAmount = money;
                    history.PrepayTime = DateUtils.ParseDigitDate(prepayDate);
                    history.DistributionType = distributionType;
                    history.DistributionDetail = distributionDetail;
                    history.Comment = comment;
                    history.TimeStamp = DateTime.Now;
                    history.TimeStampUserName = CurrentUserName;
                    m_dbAdapter.PaymentHistory.NewAssetPrepaymentHistory(history);

                    var viewModel = new PrepayRecordListViewModel(dataset.DatasetSchedule, amortization.SelectByAsset(assetId));
                    return ActionUtils.Success(viewModel);
                }

                CommUtils.Assert(type != PrepayDistrubutionType.Custom, "等额本金、等额本息、一次偿付类的资产不支持自定义偿付。");

                //处理等额本金、等额本息、一次偿付类的提前偿付,需要下期模型存在
                if (dataset.Next == null)
                {
                    //下期模型不存在,自动生成下一期模型
                    CommUtils.AssertNotNull(dataset.DatasetSchedule.Next, "找不到下期模型封包日,提前偿付测算失败");

                    CreateDataset(project.Instance, dataset.DatasetSchedule.Next.AsOfDateBegin.ToString("yyyyMMdd"));

                    var assetModifier = new AssetModifier(CurrentUserName);
                    assetModifier.Load(project.Instance.ProjectId, dataset.DatasetSchedule.AsOfDateBegin);
                    assetModifier.GenerateNextDataset(project.Instance.ProjectId);
                }
                CommUtils.AssertNotNull(dataset.Next, "无法找到下期模型数据,提前偿付测算失败");

                if (IsEqualPmtOrEqualPrin(asset.AmortizationType))
                {
                    var curDatasetBasicAnalyticsData = NancyUtils.GetBasicAnalyticsData(project.Instance.ProjectId, null, dataset.DatasetSchedule.AsOfDateBegin);

                    double curDatasetPrincipal = 0;
                    if (IsEqualPmtOrEqualPrin(asset.SecurityData.PaymentMethod))
                    {
                        //当期未发生过提前偿付,当期偿付金额是Nancy测算金额
                        curDatasetPrincipal = curDatasetBasicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems
                                              .Single(x => x.AssetId == assetId && x.PaymentDate == dataset.DatasetSchedule.PaymentDate).Principal;
                    }
                    else
                    {
                        var nextDatasetAsset = dataset.Next.Assets.Single(x => x.AssetId == assetId);
                        CommUtils.Assert(IsEqualPmtOrEqualPrin(nextDatasetAsset.AmortizationType),
                                         "第[" + dataset.Next.DatasetSchedule.PaymentDate.ToString("yyyyMMdd") + "]期偿付类型错误,提前偿付测算失败");

                        //当期发生过提前偿付,当期偿付金额是AmortizationSchedule中金额
                        var curAmortizationRecord = dataset.AmortizationSchedule.Single(x => x.ReductionDate == dataset.DatasetSchedule.PaymentDate);
                        //当期未发生本次提前偿付的偿付本金
                        curDatasetPrincipal = (double)curAmortizationRecord.ReductionAmount;
                    }

                    //保存AmortizationSchedule
                    var amortization = dataset.AmortizationSchedule;
                    amortization.Add(new AmortizationScheduleRecord {
                        AssetId = assetId,
                        ReductionAmount = money + curDatasetPrincipal,
                        ReductionDate = DateUtils.ParseDigitDate(prepayDate)
                    });
                    amortization.Save();

                    //更新PaymentMethod
                    dataset.CollateralCsv.UpdateCellValue(assetId, "PaymentMethod", "");
                    dataset.CollateralCsv.Save();

                    var sumFutureDatasetPrincipal = curDatasetBasicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems
                                                    .Where(x => x.AssetId == assetId && x.PaymentDate > dataset.DatasetSchedule.PaymentDate)
                                                    .Sum(x => x.Principal);

                    var records = new List <AmortizationScheduleRecord>();
                    //当期的新的本金偿付值是 根据等额本金/等额本息计算出的本金值 加上提前偿付金额
                    records.Add(new AmortizationScheduleRecord
                    {
                        AssetId = assetId,
                        ReductionAmount = curDatasetPrincipal + money,
                        ReductionDate = dataset.DatasetSchedule.PaymentDate
                    });

                    //更新下期的本金期末余额(减去提前偿付金额),重新根据等额本金/等额本息计算本金
                    dataset.Next.CollateralCsv.UpdateCellValue(assetId, "PrincipalBalance", (sumFutureDatasetPrincipal - money).ToString());
                    dataset.Next.CollateralCsv.Save();

                    var nextDatasetBasicAnalyticsData = NancyUtils.GetBasicAnalyticsData(project.Instance.ProjectId, null, dataset.DatasetSchedule.Next.AsOfDateBegin);
                    var nextAssetCashflowItems = nextDatasetBasicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems
                                                 .Where(x => x.AssetId == assetId && x.PaymentDate > dataset.DatasetSchedule.PaymentDate && x.Principal != 0)
                                                 .OrderBy(x => x.PaymentDate);

                    foreach (var item in nextAssetCashflowItems)
                    {
                        records.Add(new AmortizationScheduleRecord
                        {
                            AssetId = assetId,
                            ReductionAmount = item.Principal,
                            ReductionDate = item.PaymentDate
                        });
                    }

                    var viewModel = new PrepayRecordListViewModel(dataset.DatasetSchedule, records);
                    return ActionUtils.Success(viewModel);
                }
                else if (asset.AmortizationType == AmortizationType.SingleAmortization)
                {
                    var nextDatasetAsset = dataset.Next.Assets.Single(x => x.AssetId == assetId);
                    CommUtils.AssertEquals(nextDatasetAsset.SecurityData.PaymentMethod, ZEnums.EPaymentMethod.UNDEFINEDENUM,
                                           "无法识别的偿付类型,提前偿付测算失败。");

                    var nextAmortizationRecords = dataset.Next.AmortizationSchedule.SelectByAsset(assetId);
                    CommUtils.AssertEquals(nextAmortizationRecords.Count, 0,
                                           "第[" + dataset.Next.DatasetSchedule.PaymentDate.ToString("yyyyMMdd") + "]期已发生提前偿付, 提前偿付测算失败");

                    var records = dataset.AmortizationSchedule.SelectByAsset(assetId);
                    var prepayRecord = new AmortizationScheduleRecord
                    {
                        AssetId = assetId,
                        ReductionAmount = money,
                        ReductionDate = DateUtils.ParseDigitDate(prepayDate)
                    };

                    records.Add(prepayRecord);

                    var sumPrepayAmount = records.Sum(x => x.ReductionAmount);
                    CommUtils.Assert(sumPrepayAmount <= asset.SecurityData.PrincipalBalance,
                                     "提前偿付金额[" + sumPrepayAmount + "]大于剩余未偿付金额[" + asset.SecurityData.PrincipalBalance + "]");

                    records.Add(new AmortizationScheduleRecord()
                    {
                        AssetId = assetId,
                        ReductionAmount = asset.SecurityData.PrincipalBalance - sumPrepayAmount,
                        ReductionDate = asset.SecurityData.MaturityDate
                    });

                    dataset.AmortizationSchedule.AddPrepayment(assetId, DateUtils.ParseDigitDate(prepayDate), money, type, distributionDetail);
                    dataset.AmortizationSchedule.Save();

                    dataset.Next.CollateralCsv.UpdateCellValue(assetId, "PrincipalBalance",
                                                               (asset.SecurityData.PrincipalBalance - sumPrepayAmount).ToString());
                    dataset.Next.CollateralCsv.Save();

                    var viewModel = new PrepayRecordListViewModel(dataset.DatasetSchedule, records);
                    return ActionUtils.Success(viewModel);
                }

                return ActionUtils.Success("无法识别的偿付类型,projectGuid=["
                                           + projectGuid + "] + paymentDate=[" + paymentDate + "] + assetId=[" + assetId + "]");
            }));
        }
Beispiel #19
0
        public void GenerateNextDataset(int projectId)
        {
            CommUtils.Assert(m_isInitialized, "AssetModifier hasn't been initialized!");

            var project       = m_dbAdapter.Project.GetProjectById(projectId);
            var datasetFolder = m_dbAdapter.Dataset.GetDatasetFolder(project, m_asOfDay);

            CommUtils.Assert(Directory.Exists(datasetFolder), "Load dataset [" + project.ProjectGuid + "][" + m_asOfDay + "] failed!");

            if (!m_nextAsOfDay.HasValue)
            {
                return;
            }

            //Create folder for next dataset if not exists.
            var nextDatasetFolder = m_dbAdapter.Dataset.GetDatasetFolder(project, m_nextAsOfDay.Value);

            if (!Directory.Exists(nextDatasetFolder))
            {
                try
                {
                    Directory.CreateDirectory(nextDatasetFolder);
                }
                catch (Exception e)
                {
                    throw new ApplicationException("Create dataset [" + project.ProjectGuid + "][" + m_asOfDay + "] folder failed! Exception: " + e.Message);
                }
            }

            //Copy and modify collertal.csv
            var collateralPath     = Path.Combine(datasetFolder, "collateral.csv");
            var nextCollateralPath = Path.Combine(nextDatasetFolder, "collateral.csv");

            FileUtils.Copy(collateralPath, nextCollateralPath);

            var amortizationPath     = Path.Combine(datasetFolder, "AmortizationSchedule.csv");
            var nextAmortizationPath = Path.Combine(nextDatasetFolder, "AmortizationSchedule.csv");

            FileUtils.Copy(amortizationPath, nextAmortizationPath, false);

            var promisedCashflowPath     = Path.Combine(datasetFolder, "PromisedCashflow.csv");
            var nextPromisedCashflowPath = Path.Combine(nextDatasetFolder, "PromisedCashflow.csv");

            FileUtils.Copy(promisedCashflowPath, nextPromisedCashflowPath, false);

            var reinvestmentPath     = Path.Combine(datasetFolder, "Reinvestment.csv");
            var nextReinvestmentPath = Path.Combine(nextDatasetFolder, "Reinvestment.csv");

            FileUtils.Copy(reinvestmentPath, nextReinvestmentPath, false);

            var currentCombileVaiablesPath = Path.Combine(datasetFolder, "CombinedVariables.csv");
            var nextCombileVaiablesPath    = Path.Combine(nextDatasetFolder, "CombinedVariables.csv");

            FileUtils.Copy(currentCombileVaiablesPath, nextCombileVaiablesPath, false);

            var currentVariablesPath     = Path.Combine(datasetFolder, "CurrentVariables.csv");
            var nextCurrentVariablesPath = Path.Combine(nextDatasetFolder, "CurrentVariables.csv");

            FileUtils.Copy(currentVariablesPath, nextCurrentVariablesPath, false);

            var futureVariablesPath     = Path.Combine(datasetFolder, "FutureVariables.csv");
            var nextFutureVariablesPath = Path.Combine(nextDatasetFolder, "FutureVariables.csv");

            FileUtils.Copy(futureVariablesPath, nextFutureVariablesPath, false);

            var pastVariablesPath     = Path.Combine(datasetFolder, "PastVariables.csv");
            var nextPastVariablesPath = Path.Combine(nextDatasetFolder, "PastVariables.csv");

            FileUtils.Copy(pastVariablesPath, nextPastVariablesPath, false);



            BasicAnalyticsData basicAnalyticsData = NancyUtils.GetBasicAnalyticsData(projectId, null, m_asOfDay);

            //AssetId, 剩余本金
            var dictPrincipalBalance = new Dictionary <int, double>();

            foreach (var assetCashFlow in basicAnalyticsData.BasicAssetCashflow.BasicAssetCashflowItems)
            {
                if (assetCashFlow.PaymentDate == m_paymentDay)
                {
                    dictPrincipalBalance[assetCashFlow.AssetId] = assetCashFlow.Performing;
                }
            }



            var collateralCsv = new CollateralCsv();

            collateralCsv.Load(nextCollateralPath);
            foreach (var record in collateralCsv)
            {
                var assetId = record.AssetId;
                //更新封包日日期
                collateralCsv.UpdateCellValue(assetId, "AsOfDate",
                                              m_nextAsOfDay.Value.ToString("MM/dd/yyyy"));

                //更新剩余本金
                collateralCsv.UpdateCellValue(assetId, "PrincipalBalance",
                                              dictPrincipalBalance.ContainsKey(assetId) ? dictPrincipalBalance[assetId].ToString() : "0");

                if (collateralCsv.ContainsColumn("AccrueFromAsOfDate"))
                {
                    collateralCsv.UpdateCellValue(assetId, "AccrueFromAsOfDate", "FALSE");
                }
            }
            collateralCsv.Save(nextCollateralPath);



            ProcessVaiables(m_dbAdapter.Dataset.GetYmlFolder(project), basicAnalyticsData);

            if (m_previousPaymentDay != m_paymentDay && File.Exists(nextPromisedCashflowPath))
            {
                var p = new PromisedCashflowCsv(nextPromisedCashflowPath);
                p.Load();
                p.Records = p.Records.Where(o => o.PaymentDate > m_previousPaymentDay).ToList();
                p.Save();
            }
        }
Beispiel #20
0
        public ActionResult GetProjectInfoAndContacts(string projectGuid)
        {
            return(ActionUtils.Json(() =>
            {
                //权限检查
                var authorizedIds = m_dbAdapter.Authority.GetAuthorizedProjectIds();
                var project = m_dbAdapter.Project.GetProjectByGuid(projectGuid);
                CommUtils.Assert(authorizedIds.Contains(project.ProjectId), "当前用户没有读取产品[{0}]的权限", project.Name);

                var projectInfo = new ProjectInfo();
                if (project.CnabsDealId.HasValue)
                {
                    DealService ds = new DealService();
                    projectInfo = MonitorConvertion.ConvertProjectInfo(ds.GetDealData(project.CnabsDealId.Value), projectGuid);
                }
                else
                {
                    var rootFolder = WebConfigUtils.RootFolder;
                    project.Model = m_dbAdapter.Project.GetModel(project.ModelId);

                    var modelFolder = Path.Combine(rootFolder, project.Model.ModelFolder);
                    var ymlFilePath = modelFolder + @"\Script.yml";
                    if (System.IO.File.Exists(ymlFilePath))
                    {
                        using (StreamReader sr = new StreamReader(ymlFilePath))
                        {
                            var nancyDealData = NancyUtils.GetNancyDealDataByFile(sr.BaseStream);
                            if (nancyDealData != null)
                            {
                                DateTime?date = null;
                                projectInfo = new ProjectInfo()
                                {
                                    guid = project.ProjectGuid,
                                    fullName = project.Name,
                                    closingDate = nancyDealData.ScheduleData.ClosingDate,
                                    legalMaturityDate = nancyDealData.ScheduleData.LegalMaturity,
                                    firstPaymentDate = nancyDealData.ScheduleData.PaymentSchedule.Periods.Count > 0 ?
                                                       nancyDealData.ScheduleData.PaymentSchedule.Periods[0].PaymentDate : date,
                                    paymentFrequency = Toolkit.PaymentFrequency(nancyDealData.ScheduleData.PaymentPerYear),
                                    //TODO: 监管机构 产品类型
                                    //regulator
                                    //productType
                                };
                            }
                        }
                    }
                }

                var result = new
                {
                    ProjectInfo = new
                    {
                        Guid = projectInfo.guid,
                        FullName = projectInfo.fullName,
                        ClosingDate = Toolkit.DateToString(projectInfo.closingDate),
                        LegalMaturityDate = Toolkit.DateToString(projectInfo.legalMaturityDate),
                        FirstPaymentDate = Toolkit.DateToString(projectInfo.firstPaymentDate),
                        PaymentFrequency = projectInfo.paymentFrequency,
                        Regulator = Toolkit.ToString(projectInfo.regulator),
                        ProductType = Toolkit.ToString(projectInfo.productType),
                    },
                    Contacts = m_dbAdapter.Contact.GetContactsByProjectId(project.ProjectId),
                };

                return ActionUtils.Success(result);
            }));
        }
Beispiel #21
0
        private void Initialize(ProjectLogicModel project)
        {
            var objStr = "产品 [" + project.Instance.Name + "] ";

            var projectId = project.Instance.ProjectId;

            if (project.Instance.Model == null && project.Instance.ModelId > 0)
            {
                project.Instance.Model = m_dbAdapter.Project.GetModel(project.Instance.ModelId);
            }

            var modelFolder = WebConfigUtils.RootFolder + project.Instance.Model.ModelFolder + "\\";

            CommUtils.Assert(Directory.Exists(modelFolder), "找不到模型路径[{0}]", modelFolder);

            DealSchedule dealSchedule = null;

            try
            {
                dealSchedule = NancyUtils.GetDealSchedule(projectId, ignoreException: false);
            }
            catch (Exception e)
            {
                CommUtils.Assert(false, "加载模型失败:[{0}],模型路径:{1}"
                                 + Environment.NewLine + e.Message, modelFolder);
            }
            CommUtils.AssertNotNull(dealSchedule, "加载模型失败:{0}", modelFolder);
            m_instanse = dealSchedule;

            CommUtils.Assert(DateUtils.IsNormalDate(dealSchedule.FirstCollectionPeriodStartDate),
                             "模型中,FirstCollectionPeriodStartDate({0})不是有效的日期", dealSchedule.FirstCollectionPeriodStartDate.ToString());
            CommUtils.Assert(DateUtils.IsNormalDate(dealSchedule.FirstCollectionPeriodEndDate),
                             "模型中,FirstCollectionPeriodEndDate({0})不是有效的日期", dealSchedule.FirstCollectionPeriodEndDate.ToString());

            CommUtils.AssertNotNull(dealSchedule.PaymentDates, objStr + "中没有PaymentDatas数据");
            CommUtils.AssertNotNull(dealSchedule.DeterminationDates, objStr + "中没有DeterminationDates数据");
            CommUtils.AssertEquals(dealSchedule.PaymentDates.Length, dealSchedule.DeterminationDates.Length, objStr + "中DealSchedule数据加载失败");

            _durationPeriods = new List <DatasetScheduleLogicModel>();
            for (int i = 0; i < dealSchedule.PaymentDates.Length; i++)
            {
                var paymentDate    = dealSchedule.PaymentDates[i];
                var durationPeriod = new DatasetScheduleLogicModel(project);
                durationPeriod.Sequence    = m_project.GetAllPaymentDates(dealSchedule.PaymentDates).IndexOf(paymentDate) + 1;
                durationPeriod.PaymentDate = paymentDate;
                if (i == 0)
                {
                    durationPeriod.AsOfDateBegin = dealSchedule.FirstCollectionPeriodStartDate;
                }
                else
                {
                    durationPeriod.AsOfDateBegin = dealSchedule.DeterminationDates[i - 1];
                }

                durationPeriod.AsOfDateEnd = dealSchedule.DeterminationDates[i];

                if (i != 0)
                {
                    durationPeriod.Previous      = _durationPeriods[i - 1];
                    durationPeriod.Previous.Next = durationPeriod;
                }

                _durationPeriods.Add(durationPeriod);
            }

            ClosingDate   = dealSchedule.ClosingDate;
            LegalMaturity = dealSchedule.LegalMaturity;
        }