예제 #1
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
 public DemoJianYuanReport()
 {
     DistInfo = new IncomeDistributionReport();
 }