Example #1
0
        /// <summary>
        /// 证券和产品偿付频率错配
        /// 除了次级证券以外,把 Receiver Distribution 和 Interest Received 的值求和后
        /// 覆盖掉 Interest Received 和 Beginning Interest Due
        /// 删除掉 Receiver Distribution
        /// </summary>
        private static void MergeReceiverDistributionWithInterestReceived(DsTable dsTable)
        {
            if (dsTable.Rows.Any(x => x.Description == "证券和产品偿付频率错配"))
            {
                var notes = dsTable.Notes.Where(x => !x.Equals("Sub", StringComparison.CurrentCultureIgnoreCase));
                foreach (var note in notes)
                {
                    var rowReceiverDistribution = dsTable.FindRow(note + ".Receiver Distribution");
                    var rowInterestReceived     = dsTable.FindRow(note + ".Interest Received");
                    if (rowReceiverDistribution != null && rowInterestReceived != null)
                    {
                        var sumRow = rowReceiverDistribution + rowInterestReceived;
                        rowInterestReceived.CopyValueFrom(sumRow);

                        var rowBeginningInterestDue = dsTable.FindRow(note + ".Beginning Interest Due");
                        if (rowBeginningInterestDue != null)
                        {
                            rowBeginningInterestDue.CopyValueFrom(sumRow);
                        }
                    }

                    dsTable.RemoveRow(rowReceiverDistribution);
                }
            }
        }
Example #2
0
        /// <summary>
        /// 合并留存金额
        /// </summary>
        private static void MergeReserveRows(DsTable dsTable)
        {
            var sumReserveRow = new DsRow();

            for (int i = 0; i < dsTable.ColumnCount - 2; i++)
            {
                sumReserveRow.AppendValue((0m).ToString("n2"));
            }

            var rowCsdcReserve = dsTable.FindRow("中证本息兑付留存.End Balance");

            if (rowCsdcReserve != null)
            {
                sumReserveRow += rowCsdcReserve;
            }

            var rows = dsTable.Rows.Where(x => x.Description.EndsWith("Reserve.End Balance", StringComparison.CurrentCultureIgnoreCase) ||
                                          x.Description.EndsWith("留存账户.End Balance", StringComparison.CurrentCultureIgnoreCase)).ToList();

            foreach (var row in rows)
            {
                sumReserveRow += row;
            }

            sumReserveRow.Name        = "Reserve Accounts";
            sumReserveRow.Description = "当期留存账户余额";

            var reserveAccountDisplayEventRow = dsTable.FindRow("留存账户显示事件");

            if (reserveAccountDisplayEventRow == null)
            {
                dsTable.RemoveRow(rowCsdcReserve);
                dsTable.RemoveRow(rows);
            }
            else
            {
                dsTable.RemoveRow(reserveAccountDisplayEventRow);
            }

            //汇总后的留存金额插入到表中
            var insertRow = false;

            for (int i = dsTable.Rows.Count - 1; i >= 0; i--)
            {
                var row = dsTable.Rows[i];
                if (row.Name.Equals("Reserve Accounts", StringComparison.CurrentCultureIgnoreCase))
                {
                    dsTable.Rows.Insert(i + 1, sumReserveRow);
                    insertRow = true;
                    break;
                }
            }

            if (!insertRow)
            {
                dsTable.Rows.Add(sumReserveRow);
            }
        }
Example #3
0
        /// <summary>
        /// 对nancy返回的结果执行特殊的规则处理:
        /// 1、证券利随本清
        /// 2、证券和产品偿付频率错配
        /// 3、合并留存金额
        /// 4、自动处理中证登手续费
        /// </summary>
        /// <param name="result"></param>
        /// <param name="isCsdcDeal"></param>
        private static void RunSpecialRules(DataTable cf, bool isCsdcDeal)
        {
            //处理“证券利随本清”
            var rowIndex = cf.IndexOfRow(x => x.ItemArray[1].Equals("证券利随本清"));

            if (rowIndex >= 0)
            {
                var key = ".Receiver Distribution";
                var rowIndexReceiver = -1;
                while ((rowIndexReceiver = cf.IndexOfRow(x => x.ItemArray[1].ToString().Contains(key))) >= 0)
                {
                    var description = cf.Rows[rowIndexReceiver].ItemArray[1].ToString();
                    var noteName    = description.Substring(0, description.Length - key.Length);
                    var rowIndexInterestReceived     = cf.IndexOfRow(x => x.ItemArray[1].ToString() == noteName + ".Interest Received");
                    var rowIndexBeginningInterestDue = cf.IndexOfRow(x => x.ItemArray[1].ToString() == noteName + ".Beginning Interest Due");
                    if (rowIndexInterestReceived < 0 || rowIndexBeginningInterestDue < 0)
                    {
                        break;
                    }

                    //把Receiver Distribution和Interest Received的值加起来
                    for (int i = 2; i < cf.Columns.Count; ++i)
                    {
                        var totalInterest = double.Parse(cf.Rows[rowIndexInterestReceived][i].ToString())
                                            + double.Parse(cf.Rows[rowIndexReceiver][i].ToString());

                        cf.Rows[rowIndexReceiver][i] = totalInterest.ToString("n2");
                    }

                    cf.CopyRow(rowIndexReceiver, rowIndexInterestReceived, 2);
                    cf.CopyRow(rowIndexReceiver, rowIndexBeginningInterestDue, 2);
                    cf.Rows.RemoveAt(rowIndexReceiver);
                }
            }

            //备份第一种处理“证券利随本清”的方法
            //rowIndex = cf.IndexOfRow(x => x.ItemArray[1].Equals("Alpha证券利随本清Alpha"));
            //if (rowIndex >= 0)
            //{
            //    cf.Rows.RemoveAt(rowIndex);

            //    //收到的逾期利息
            //    var key = ".Deferred Interest Received";
            //    var rowIndexDeferredInterestReceived = -1;
            //    while ((rowIndexDeferredInterestReceived = cf.IndexOfRow(x => x.ItemArray[1].ToString().Contains(key))) >= 0)
            //    {
            //        var description = cf.Rows[rowIndexDeferredInterestReceived].ItemArray[1].ToString();
            //        var noteName = description.Substring(0, description.Length - key.Length);

            //        //收到的利息
            //        var rowIndexInterestReceived = cf.IndexOfRow(x => x.ItemArray[1].ToString() == noteName + ".Interest Received");
            //        //预计收到的利息
            //        var rowIndexBeginningInterestDue = cf.IndexOfRow(x => x.ItemArray[1].ToString() == noteName + ".Beginning Interest Due");
            //        //未偿利息(逾期利息)
            //        var rowIndexInteststDeferred = cf.IndexOfRow(x => x.ItemArray[1].ToString() == noteName + ".Interest Deferred");
            //        if (rowIndexInterestReceived < 0 || rowIndexBeginningInterestDue < 0 || rowIndexInterestReceived < 0)
            //        {
            //            break;
            //        }

            //        for (int i = 2; i < cf.Columns.Count; ++i)
            //        {
            //            var interestReceived = double.Parse(cf.Rows[rowIndexInterestReceived][i].ToString())
            //                + double.Parse(cf.Rows[rowIndexDeferredInterestReceived][i].ToString());

            //            //收到的利息=收到的利息+收到的逾期利息
            //            cf.Rows[rowIndexInterestReceived][i] = interestReceived.ToString("n2");
            //            //预计收到的利息=收到的利息+收到的逾期利息
            //            cf.Rows[rowIndexBeginningInterestDue][i] = cf.Rows[rowIndexInterestReceived][i];
            //        }

            //        //清空未偿利息(逾期利息)
            //        cf.Rows.RemoveAt(rowIndexInteststDeferred);
            //        //清空收到的逾期利息
            //        cf.Rows.RemoveAt(rowIndexDeferredInterestReceived);
            //    }
            //}

            var dsTable = new DsTable(cf);

            //处理“证券和产品偿付频率错配”
            MergeReceiverDistributionWithInterestReceived(dsTable);

            //合并留存金额
            MergeReserveRows(dsTable);

            dsTable.OverrideTo(cf);

            //是否自动处理中证手续费
            if (isCsdcDeal)
            {
                var csdcRows = new List <Tuple <int, DataRow> >();

                var key = ".Interest Received";
                for (var i = 0; i < cf.Rows.Count; ++i)
                {
                    var row = cf.Rows[i];
                    if (row.ItemArray[1].ToString().EndsWith(key, StringComparison.CurrentCultureIgnoreCase))
                    {
                        var description = row.ItemArray[1].ToString();
                        var noteName    = description.Substring(0, description.Length - key.Length);

                        var principalReceivedIndex = cf.IndexOfRow(x => x.ItemArray[1].ToString() == noteName + ".Principal Received");

                        var csdcRow = cf.NewRow();
                        csdcRow[0] = "Notes";
                        csdcRow[1] = noteName + ".CsdcFee";

                        for (int j = 2; j < cf.Columns.Count; ++j)
                        {
                            //中证登手续费 = (本金 + 利息) * 万分之0.5
                            var totalReceived = double.Parse(cf.Rows[principalReceivedIndex][j].ToString())
                                                + double.Parse(row[j].ToString());

                            csdcRow[j] = (totalReceived * 0.00005).ToString("n2");
                        }

                        csdcRows.Add(Tuple.Create(i, csdcRow));
                    }
                }

                csdcRows = csdcRows.OrderByDescending(x => x.Item1).ToList();

                foreach (var csdcRow in csdcRows)
                {
                    cf.Rows.InsertAt(csdcRow.Item2, csdcRow.Item1);
                }
            }
        }