private void GeneratePercentTable(IncomeDistributionReport obj, List <Dataset> datasetList, List <Note> notes, DateTime[] paymentDates) { obj.PrincipalTable = new List <CashItem>(); var rowCount = Math.Min(datasetList.Count, paymentDates.Length); for (int i = 0; i < datasetList.Count; ++i) { var dataset = datasetList[i]; var cashItem = new CashItem(); var noteDatas = m_dbAdapter.Dataset.GetNoteDatas(dataset.DatasetId); cashItem.Date = dataset.PaymentDate.Value; cashItem.Percent = new Dictionary <string, decimal>(); foreach (var noteData in noteDatas) { var note = notes.Single(x => x.NoteId == noteData.NoteId); CommUtils.AssertNotNull(noteData.PrincipalPaid, "请核兑付日为[{0}]期的相关数据,才能够生成本期报告", dataset.PaymentDate.Value.ToString("yyyy-MM-dd")); cashItem.Percent[note.ShortName] = noteData.PrincipalPaid.Value / note.Notional.Value; } obj.PrincipalTable.Add(cashItem); } obj.PrincipalTable.Reverse(); obj.SumPrincipalTable = new CashItem(); obj.SumPrincipalTable.Percent = new Dictionary <string, decimal>(); foreach (var note in notes) { obj.SumPrincipalTable.Percent[note.ShortName] = obj.PrincipalTable.Sum(x => x.Percent[note.ShortName]); } }
public IncomeDistributionReport InitializeIncDisReport() { var incDisReport = new IncomeDistributionReport(); incDisReport.Sequence = 1; incDisReport.DenominationDetail = null; incDisReport.RepayDetail = "分期偿还情况"; incDisReport.RepayDetailWithHyphen = "分期偿还情况(使用带-的券名)"; incDisReport.RepayDetailWithHyphenByJinTai = "分期偿还情况(使用带-的券名)(金泰专用)"; incDisReport.RepayPrincipalDetail = "分期偿还本金情况(对应白鹭2016-1中的【注:】中内容)"; incDisReport.EquityRegisterDetail = "权益登记日详情(对应白鹭2016-1)"; incDisReport.EquityRegisterDetailByJinTai = "权益登记日详情(金泰专用)"; incDisReport.EquityRegisterDetailByZhongGang = "权益登记日详情(中港专用)"; incDisReport.DurationDayCount = 2; incDisReport.AccrualDateSum = 3; incDisReport.PreviousT = new DateTime(); incDisReport.T = new DateTime(); incDisReport.T_1 = new DateTime(); incDisReport.Date = new DateTime(); incDisReport.BeginAccrualDate = new DateTime(); incDisReport.EndAccrualDate = new DateTime(); incDisReport.TaskEndTime = new DateTime(); Func <ChineseAbs.ABSManagement.Pattern.PaymentDetail> initPaymentDetail = () => new ChineseAbs.ABSManagement.Pattern.PaymentDetail { Sequence = 0, NameCN = "NameCN", NameCNHyphen = "NameCNHyphen", NameEN = "NameEN", NameENUnderline = "NameENUnderline", NameENHyphen = "NameENHyphen", Residual = 123.4m, UnitMoney = 123.5m, UnitPrincipal = 123.6m, UnitInterest = 123.7m, Notional = 1.8m, UnitCount = 3, Money = 2.0m, Principal = 2.1m, Interest = 2.2m, Denomination = 2.3m, IsEquity = true, CouponString = "CouponString" }; ChineseAbs.ABSManagement.Pattern.PaymentDetail payDetail = initPaymentDetail(); incDisReport.PriorSecurityList = new List <ABSManagement.Pattern.PaymentDetail>(); incDisReport.SubSecurityList = new List <ABSManagement.Pattern.PaymentDetail> { initPaymentDetail(), initPaymentDetail() }; incDisReport.SecurityList = new List <ABSManagement.Pattern.PaymentDetail> { initPaymentDetail(), initPaymentDetail() }; incDisReport.Sum = initPaymentDetail(); incDisReport.SumPrior = initPaymentDetail(); incDisReport.SumSub = initPaymentDetail(); incDisReport.PrincipalTable = new List <CashItem> { new CashItem { Date = new DateTime(), Percent = new Dictionary <string, decimal> () }, new CashItem { Date = new DateTime(), Percent = new Dictionary <string, decimal> () } }; incDisReport.Security = new Dictionary <string, ChineseAbs.ABSManagement.Pattern.PaymentDetail>(); incDisReport.Security.Add("T1key", incDisReport.SumPrior); incDisReport.Security.Add("T2key", incDisReport.SumPrior); incDisReport.SumPrincipalTable = new CashItem { Date = new DateTime(), Percent = new Dictionary <string, decimal>() }; return(incDisReport); }
protected override object MakeObjectInstance() { var logicModel = new ProjectLogicModel(m_userName, m_project); var schedule = logicModel.DealSchedule.Instanse; var firstNoteAccrualDates = schedule.NoteAccrualDates.First().Value; var firstNoteName = schedule.NoteAccrualDates.First().Key; foreach (var key in schedule.NoteAccrualDates.Keys) { var noteAccrualDates = schedule.NoteAccrualDates[key]; CommUtils.AssertEquals(firstNoteAccrualDates.Length, noteAccrualDates.Length, "检测到证券期数不一致,[{0}]={1},[{2}]={3}", firstNoteName, firstNoteAccrualDates.Length, key, noteAccrualDates.Length); for (int i = 0; i < firstNoteAccrualDates.Length; i++) { CommUtils.Assert(firstNoteAccrualDates[i] == noteAccrualDates[i], "检测到第[{0}]期证券Accrual date不一致,[{1}]={2},[{3}]={4}", i + 1, firstNoteName, firstNoteAccrualDates[i].ToShortDateString(), key, noteAccrualDates[i].ToShortDateString()); } } //从第N期开始模型数据时,getDealSchedule中不包含前几期的PaymentDate List <DateTime> paymentDates = schedule.PaymentDates.ToList(); if (m_project.CnabsDealId.HasValue) { paymentDates = m_dbAdapter.Model.GetPaymentDates(m_project.CnabsDealId.Value); } var datasets = m_dbAdapter.Dataset.GetDatasetByProjectId(m_project.ProjectId); var paymentDate = paymentDates.First(x => x == m_paymentDay); var sequence = paymentDates.FindIndex(x => x == m_paymentDay); 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 datasetId = dataset.DatasetId; var notes = m_dbAdapter.Dataset.GetNotes(m_project.ProjectId); var noteDatas = m_dbAdapter.Dataset.GetNoteDatas(datasetId); //初始化note信息 List <Note> cnabsNotes = new ProjectLogicModel(m_userName, m_project).Notes; var datasetFolder = m_dbAdapter.Dataset.GetDatasetFolder(m_project, dataset.AsOfDate); var variablesCsv = new VariablesHelper(datasetFolder); var futureVariablesPath = Path.Combine(datasetFolder, "FutureVariables.csv"); var variables = variablesCsv.GetVariablesByDate(dataset.PaymentDate.Value); var rateResetRecords = InterestRateUtils.RateResetRecords(variables); var idrObj = new IncomeDistributionReport(); idrObj.Sequence = sequence + 1; idrObj.SequenceCN = idrObj.Sequence.ToCnString(); idrObj.Security = new Dictionary <string, PaymentDetail>(); idrObj.PriorSecurityList = new List <PaymentDetail>(); idrObj.SubSecurityList = new List <PaymentDetail>(); idrObj.SecurityList = new List <PaymentDetail>(); idrObj.BeginAccrualDate = sequence == 0 ? schedule.FirstAccrualDate : schedule.NoteAccrualDates.First().Value[sequence - 1]; idrObj.EndAccrualDate = schedule.NoteAccrualDates.First().Value[sequence]; idrObj.AccrualDateSum = (idrObj.EndAccrualDate - idrObj.BeginAccrualDate).Days; for (int i = 0; i < notes.Count; i++) { var note = notes[i]; note.CouponString = InterestRateUtils.CalculateCurrentCouponRate(cnabsNotes[i].CouponString, rateResetRecords); var noteData = noteDatas.Single(x => x.NoteId == note.NoteId); CommUtils.Assert(noteData.HasValue, "兑付日为[{0}]的偿付期内,证券端现金流类型的工作未核对", paymentDate.ToShortDateString()); idrObj.Security[note.ShortName] = GeneratePaymentDetail(note, noteData, idrObj.Security.Count + 1); if (note.IsEquity) { idrObj.SubSecurityList.Add(GeneratePaymentDetail(note, noteData, idrObj.SubSecurityList.Count + 1)); } else { idrObj.PriorSecurityList.Add(GeneratePaymentDetail(note, noteData, idrObj.PriorSecurityList.Count + 1)); } idrObj.SecurityList.Add(GeneratePaymentDetail(note, noteData, idrObj.SecurityList.Count(x => x.Money != 0) + 1)); } Func <IEnumerable <PaymentDetail>, PaymentDetail> sum = (values) => new PaymentDetail { Residual = values.Sum(x => x.Residual), Principal = values.Sum(x => x.Principal), Interest = values.Sum(x => x.Interest), Money = values.Sum(x => x.Money), UnitCount = values.Sum(x => x.UnitCount), SumPaymentAmount = values.Sum(x => x.SumPaymentAmount) }; idrObj.Sum = sum(idrObj.Security.Values); idrObj.SumPrior = sum(idrObj.Security.Values.Where(x => !x.IsEquity)); idrObj.SumSub = sum(idrObj.Security.Values.Where(x => x.IsEquity)); GeneratePercentTable(idrObj, datasets, notes, schedule.PaymentDates); idrObj.RepayDetail = GenerateRepayDetail(idrObj.SecurityList, x => x.NameCN); idrObj.RepayDetailWithHyphen = GenerateRepayDetail(idrObj.SecurityList, x => x.NameCNHyphen); idrObj.RepayDetailWithHyphenByJinTai = GenerateRepayDetailByJinTai(idrObj.SecurityList, x => x.NameCNHyphen); idrObj.RepayPrincipalDetail = GenerateRepayPrincipalDetail(idrObj.SecurityList); idrObj.DenominationDetail = GenerateDenominationDetail(idrObj.SecurityList); idrObj.EquityRegisterDetail = GenerateEquityRegisterDetail(idrObj.SecurityList, dataset.PaymentDate.Value); idrObj.EquityRegisterDetailByJinTai = GenerateEquityRegisterDetailByJinTai(idrObj.SecurityList, dataset.PaymentDate.Value); idrObj.EquityRegisterDetailByZhongGang = GenerateEquityRegisterDetailByZhongGang(idrObj.SecurityList, dataset.PaymentDate.Value); idrObj.EquityRegisterDetailByYingBinGuan = GenerateEquityRegisterDetailByYingBinGuan(idrObj.SecurityList, dataset.PaymentDate.Value); idrObj.T = dataset.PaymentDate.Value; if (paymentDates.First() == idrObj.T) { idrObj.PreviousT = schedule.ClosingDate; } else { var previousIndex = paymentDates.IndexOf(idrObj.T) - 1; idrObj.PreviousT = paymentDates[previousIndex]; } idrObj.DurationDayCount = (idrObj.T - idrObj.PreviousT).Days; var t_1 = dataset.PaymentDate.Value.AddDays(-1); while (!CalendarCache.IsTradingDay(t_1)) { t_1 = t_1.AddDays(-1); } idrObj.T_1 = t_1; idrObj.Date = DateTime.Today; idrObj.TaskEndTime = m_timeStamp; return(idrObj); }
public DemoJianYuanReport() { DistInfo = new IncomeDistributionReport(); }