/// <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); } } }
/// <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); } }
/// <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); } } }