【问题】互换的结算确认书目前展示了期权的
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -1,8 +1,12 @@
|
||||
using Newtonsoft.Json.Linq;
|
||||
using YLErp.Core.Helpers;
|
||||
using YLErp.DBModels;
|
||||
using YLErp.DBModels.Consts;
|
||||
using YLErp.DBModels.Enums;
|
||||
using YLErp.Models;
|
||||
using YLErp.Plugins.TradeDocGenerator;
|
||||
using YLErp.Plugins.TradeDocGenerator.Abstracts;
|
||||
using YLErp.QdpModule;
|
||||
|
||||
namespace YLErp.Plugins.GuoLian.DocumentGenerator
|
||||
{
|
||||
@@ -17,123 +21,192 @@ namespace YLErp.Plugins.GuoLian.DocumentGenerator
|
||||
return contractNo;
|
||||
}
|
||||
|
||||
protected override string GetTemplateFilePath()
|
||||
{
|
||||
var templatePath = Path.Combine(GlobalConfig.PluginFolder, "App_Docs/settlement_template/settle_01.docx");
|
||||
return templatePath;
|
||||
}
|
||||
|
||||
protected override string GetOutputFileName(string contractNo, string contractIndex)
|
||||
protected override void PrepareViewData(Dictionary<string, object> dic)
|
||||
{
|
||||
var client = Context.GetClient();
|
||||
var flowEvents = Context.GetFlowEvents();
|
||||
var valueDate = flowEvents.FirstOrDefault()?.UnwindDate ?? Context.SystemValueDate;
|
||||
var fileName = $"结算单_{client.Name}_{valueDate:yyyyMMdd}_{contractIndex}";
|
||||
return $"{fileName}.{DocType.ToLower()}";
|
||||
var allFlowEvents = Context.GetAllFlowEvents();
|
||||
var swapPositions = Context.GetSwapPositions();
|
||||
var trades = Context.Trades;
|
||||
var tradeIds = trades.Select(t => t.id).ToList();
|
||||
var tradeExtends = Context.GetTrade_Extends(tradeIds);
|
||||
List<ExcelReportModel> table = new List<ExcelReportModel>();
|
||||
SwapEndConfirmModel outPut = new SwapEndConfirmModel();
|
||||
|
||||
foreach (var flowEventGroup in flowEvents)
|
||||
{
|
||||
var tradeId = flowEventGroup.SwapTradeId;
|
||||
var positions = swapPositions.Where(x => x.SwapTradeId == tradeId && x.IsInitial).ToList();
|
||||
var posi = positions.FirstOrDefault(f => f.id == flowEventGroup.PositionId);
|
||||
var unwindFlowEvents = allFlowEvents.Where(x => x.EventId == flowEventGroup.EventId);
|
||||
var trade = trades.FirstOrDefault(x => x.id == tradeId);
|
||||
var preSettleDate = flowEventGroup.UnwindDate.Value.AddDays(-1);
|
||||
var swapEodPositions = Context.GetEodPositions(tradeId, preSettleDate);
|
||||
var tradeExtend = tradeExtends.FirstOrDefault(x => x.TradeId == tradeId);
|
||||
var ratio = posi.PositionType == (int)PositionTypeFlag.Long ? 1 : -1;
|
||||
ExcelReportModel row = new ExcelReportModel();
|
||||
var confirmNo = Context.Gettrade_contract_r(tradeId, ContractTypeEnum.Trade);
|
||||
if (string.IsNullOrEmpty(confirmNo))
|
||||
{
|
||||
throw new ServiceException($"{trade.TradeNumber}未生成交易确认书");
|
||||
}
|
||||
row.TradeNumber = confirmNo;
|
||||
row.ClientName = client.Name;
|
||||
row.UnderlyingCode = flowEventGroup.UnderlyingCode;
|
||||
row.StartDate = trade.StartDate.Value.ToString("yyyy-MM-dd");
|
||||
var eventDate = flowEventGroup.UnwindDate.Value;
|
||||
row.EventDate = eventDate.ToString("yyyy-MM-dd");
|
||||
var payDate = flowEventGroup.PayDate;
|
||||
var sr = tradeExtend == null ? 0 : tradeExtend.ExtendObj.SettlementRules;
|
||||
if (!payDate.HasValue)
|
||||
{
|
||||
payDate = QdpCalendarHelper.GetNonHoliday(flowEventGroup.EventDate.AddDays(sr));
|
||||
}
|
||||
row.PayDate = payDate.Value.ToString("yyyy-MM-dd");
|
||||
row.ClosePrice = ((flowEventGroup.TradingAmountAvg) * 100).ToString("0.00000000");
|
||||
decimal interestRate = unwindFlowEvents.Where(x => ConsTrade.InterestModels.Contains(x.InterestMode)).Sum(s => s.InterestRate);
|
||||
row.InterestRate = interestRate.ToString("0.00%");
|
||||
var PosiNotionalValue = flowEventGroup.Quantity * flowEventGroup.ContractSize * posi.PosiGrossPrice;
|
||||
if (flowEventGroup.EventId.HasValue)
|
||||
{
|
||||
var swapEvent = Context.GetEvent(flowEventGroup.EventId.Value);
|
||||
if (swapEvent != null)
|
||||
{
|
||||
swapEvent.unwindData = JsonHelper.Deserialize<UnwindData>(swapEvent.EventData);
|
||||
PosiNotionalValue = swapEvent.unwindData.CloseNotionalValue;
|
||||
}
|
||||
}
|
||||
|
||||
row.Quantity = flowEventGroup.Quantity.ToString("0.00");
|
||||
row.PosiNotionalValue = PosiNotionalValue.ToString("0.00");
|
||||
row.PosiNetPrice = (posi.PosiGrossPrice * 100).ToString("0.00000000");
|
||||
//var tradingFee = (flowEventGroup.TradingAmountFeeAvg- posi.PosiNetPrice- flowEventGroup.TradingAmountAvg+ posi.PosiGrossPrice)* PosiNotionalValue* ratio;
|
||||
var tradingFee = flowEventGroup.TradingFee + flowEventGroup.TradingFeePending;
|
||||
row.Fee = (-tradingFee).ToString("0.00");
|
||||
var RateDays = (eventDate - trade.StartDate.Value).Days;
|
||||
RateDays = RateDays < 0 ? 0 : RateDays;
|
||||
row.RateDays = RateDays.ToString();
|
||||
var MarginAmout = positions.Where(x => x.InterestMode == (int)InterestModeEnum.初始预付金).Sum(s => s.InterestPrincipalFix * (s.InterestDirection == (int)SwapDirectionEnum.收取 ? 1 : -1));
|
||||
row.MarginAmout = Math.Abs(MarginAmout).ToString("0.00");
|
||||
var MarginRebateRate = positions.Where(x => x.InterestMode == (int)InterestModeEnum.初始预付金).Sum(s => s.InterestRateDefault);
|
||||
row.MarginRebateRate = MarginRebateRate.ToString("0.00%");
|
||||
|
||||
var MarginInterestAmount = unwindFlowEvents.Where(x => ConsTrade.InterestMarginModels.Contains(x.InterestMode)).Sum(s => s.InterestClosePnL);
|
||||
row.MarginInterestAmount = (-MarginInterestAmount).ToString("0.00");
|
||||
|
||||
var InterestAmount = unwindFlowEvents.Where(x => ConsTrade.InterestModels.Contains(x.InterestMode)).Sum(s => s.InterestClosePnL) * -1;
|
||||
row.InterestAmount = InterestAmount.ToString("0.00");
|
||||
|
||||
//var lastInterestAmount= swapEodPositions.Where(x => ConsTrade.InterestModels.Contains(x.InterestMode)).Sum(s => s.InterestIncomeSum);
|
||||
//var lastPosiNotionalValue = swapEodPositions.Sum(s=>s.PosiNotionalValue);
|
||||
//var InterestAmount = lastPosiNotionalValue==0?0: - lastInterestAmount* PosiNotionalValue/ lastPosiNotionalValue;
|
||||
//row.InterestAmount = InterestAmount.ToString("0.00");
|
||||
|
||||
//var lastMarginAmount = swapEodPositions.Where(x => ConsTrade.InterestMarginModels.Contains(x.InterestMode)).Sum(s => s.InterestIncomeSum);
|
||||
//var MarginInterestAmount = lastMarginAmount == 0 ? 0 : -lastMarginAmount * PosiNotionalValue / lastMarginAmount;
|
||||
//row.MarginInterestAmount = MarginInterestAmount.ToString("0.00");
|
||||
var FloatRate = PosiNotionalValue == 0 ? 0 : InterestAmount / PosiNotionalValue;
|
||||
row.FloatRate = FloatRate.ToString("0.0000%");
|
||||
var PosiPnl = -(flowEventGroup.MarkClosePnl - tradingFee - flowEventGroup.DividendIn);
|
||||
row.PosiPnl = PosiPnl.ToString("0.00");
|
||||
var markClosePnl = (-flowEventGroup.MarkClosePnl);
|
||||
row.MarkClosePnl = markClosePnl.ToString("0.00");
|
||||
row.DividendIn = (-flowEventGroup.DividendIn).ToString("0.00");
|
||||
var marginBackAmount = unwindFlowEvents.Where(x => ConsTrade.InterestMarginModels.Contains(x.InterestMode)).Sum(s => s.InterestPrincipal);
|
||||
var NetSettleAmout = unwindFlowEvents.Sum(x => x.InterestClosePnL) * -1 + flowEventGroup.MarkClosePnl * -1 + marginBackAmount;
|
||||
row.NetSettleAmout = NetSettleAmout.ToString("0.00");
|
||||
table.Add(row);
|
||||
}
|
||||
outPut.table = table;
|
||||
dic["TRS结算单"] = outPut;
|
||||
|
||||
}
|
||||
|
||||
protected override void PrepareViewData(Dictionary<string, JToken> dic)
|
||||
{
|
||||
var client = Context.GetClient();
|
||||
var trades = Context.Trades;
|
||||
var trade = trades.FirstOrDefault();
|
||||
if (string.IsNullOrEmpty(client.SettleFileNumber))
|
||||
{
|
||||
throw new ServiceException($"{client.Name}未设置定义文件编号");
|
||||
}
|
||||
var flowEvents = Context.GetFlowEvents();
|
||||
var allFlowEvents = Context.GetAllFlowEvents();
|
||||
|
||||
// 基础信息
|
||||
dic["客户名称"] = client.Name;
|
||||
dic["乙方名称"] = client.Name;
|
||||
|
||||
var eventDate = flowEvents.FirstOrDefault()?.UnwindDate;
|
||||
dic["结算日期"] = eventDate?.ToString("yyyy年M月d日") ?? DateTime.Now.ToString("yyyy年M月d日");
|
||||
|
||||
// 交易信息
|
||||
dic["交易编号"] = trade?.TradeNumber ?? "";
|
||||
dic["交易类型"] = trade?.TradeType ?? "";
|
||||
dic["标的代码"] = trade?.UnderlyingCode ?? "";
|
||||
|
||||
var underlying = trade != null ? Context.GetTradeUnderlying(trade.UnderlyingCode) : null;
|
||||
if (underlying != null)
|
||||
var swapPositions = Context.GetSwapPositions();
|
||||
var trades = Context.Trades;
|
||||
var eventDate = flowEvents.First().UnwindDate;
|
||||
var td = trades.First();
|
||||
var realPositions = swapPositions.Where(x => x.PosiQuantity > 0 && !x.IsInitial).ToList();
|
||||
var posiNationalValue = realPositions.Sum(x => x.PosiNotionalValue);
|
||||
var metaDic = Context.GetTradeMetas(td.id);
|
||||
dic["主协议编号"] = metaDic[ConsTradeMetaKey.MainProtocolCode];
|
||||
dic["文件编号"] = client.SettleFileNumber;
|
||||
dic["乙方"] = client.Name;
|
||||
dic["管理人名称"] = client.Manager;
|
||||
var confirmNo = Context.Gettrade_contract_r(td.id, ContractTypeEnum.Trade);
|
||||
if (string.IsNullOrEmpty(confirmNo))
|
||||
{
|
||||
dic["标的名称"] = underlying.UnderlyingName;
|
||||
throw new ServiceException($"{td.TradeNumber}未生成交易确认书");
|
||||
}
|
||||
|
||||
// 结算金额 - 从 flow events 计算
|
||||
var flowEvent = flowEvents.FirstOrDefault();
|
||||
if (flowEvent != null)
|
||||
FormatToDict("平仓日期", eventDate, dic);
|
||||
JArray table = new JArray();
|
||||
JArray table2 = new JArray();
|
||||
foreach (var flowEvent in flowEvents)
|
||||
{
|
||||
var unwindFlowEvents = allFlowEvents.Where(x => x.EventId == flowEvent.EventId);
|
||||
var NetSettleAmout = unwindFlowEvents.Sum(x => x.InterestClosePnL) * -1
|
||||
+ flowEvent.MarkClosePnl * -1;
|
||||
|
||||
dic["结算金额"] = NetSettleAmout.ToString("N2");
|
||||
dic["结算金额大写"] = Context.CmycurD(Math.Abs((double)NetSettleAmout));
|
||||
dic["结算价格"] = flowEvent.TradingAmountAvg.ToString("N4");
|
||||
dic["结算比例"] = "0.00%";
|
||||
var tradeId = flowEvent.SwapTradeId;
|
||||
var positions = swapPositions.Where(x => x.SwapTradeId == tradeId).ToList();
|
||||
var posi = positions.FirstOrDefault(f => f.PositionId == flowEvent.PositionId);
|
||||
JObject row = new JObject();
|
||||
row["交易确认书编号"] = confirmNo;
|
||||
var ratio = flowEvent.PositionType == (int)PositionTypeFlag.Long ? 1 : -1;
|
||||
row["多空方向"] = flowEvent.PositionType == (int)PositionTypeFlag.Long ? "多" : "空";
|
||||
FormatToDict("平仓日期", eventDate, row);
|
||||
underlying_manager underlying = Context.GetTradeUnderlying(flowEvent.UnderlyingCode);
|
||||
row["标的代码"] = flowEvent.UnderlyingCode;
|
||||
row["标的名称"] = underlying?.UnderlyingName;
|
||||
var preQty = flowEvent.Quantity + flowEvent.PositionQty ?? 0;
|
||||
FormatToDict("平仓前数量", Convert.ToDouble(preQty) * ratio, row);
|
||||
FormatToDict("平仓数量", Convert.ToDouble(flowEvent.Quantity), row);
|
||||
FormatToDict("平仓后数量", Convert.ToDouble(flowEvent.PositionQty ?? 0) * ratio, row);
|
||||
FormatToDict("平仓成交金额", Convert.ToDouble(flowEvent.Quantity * posi.PosiNetPrice * flowEvent.ContractSize), row);
|
||||
table.Add(row);
|
||||
}
|
||||
else
|
||||
JObject row2 = new JObject();
|
||||
row2["交易确认书编号"] = confirmNo;
|
||||
FormatToDict("平仓日期", eventDate, row2);
|
||||
FormatToDict("平仓后名义本金", Convert.ToDouble(posiNationalValue), row2);
|
||||
table2.Add(row2);
|
||||
dic["table"] = table;
|
||||
dic["table2"] = table2;
|
||||
}
|
||||
protected override string GetTemplateFilePath()
|
||||
{
|
||||
var trades = Context.Trades;
|
||||
var templatePath = string.Empty;
|
||||
if (trades.Any(s => s.StructureType == "多空组合" || s.StructureType == "定义文件型债券收益互换"))
|
||||
{
|
||||
dic["结算金额"] = "0.00";
|
||||
dic["结算金额大写"] = Context.CmycurD(0);
|
||||
dic["结算价格"] = "0.0000";
|
||||
dic["结算比例"] = "0.00%";
|
||||
templatePath = MosPathHelper.Combine(GlobalConfig.PluginFolder, "App_Docs/settlement_template/dma_01.docx");
|
||||
return templatePath;
|
||||
}
|
||||
|
||||
// 名义本金
|
||||
dic["名义本金"] = trade?.OriginalStockEqvNotional?.ToString("N2") ?? "0.00";
|
||||
|
||||
// 表格数据
|
||||
var table1 = new JArray();
|
||||
foreach (var fe in flowEvents)
|
||||
{
|
||||
var unwindFlowEvents = allFlowEvents.Where(x => x.EventId == fe.EventId);
|
||||
var netAmount = unwindFlowEvents.Sum(x => x.InterestClosePnL) * -1 + fe.MarkClosePnl * -1;
|
||||
var row = new JObject
|
||||
{
|
||||
["交易编号"] = trade?.TradeNumber ?? "",
|
||||
["交易类型"] = trade?.TradeType ?? "",
|
||||
["标的代码"] = fe.UnderlyingCode ?? trade?.UnderlyingCode ?? "",
|
||||
["标的名称"] = underlying?.UnderlyingName ?? "",
|
||||
["结算金额"] = netAmount.ToString("N2")
|
||||
};
|
||||
table1.Add(row);
|
||||
}
|
||||
dic["table1"] = table1;
|
||||
templatePath = MosPathHelper.Combine(GlobalConfig.PluginFolder, "App_Docs/settlement_template/nodma_01.xlsx");
|
||||
return templatePath;
|
||||
}
|
||||
|
||||
protected override void PrepareViewData(Dictionary<string, object> dic)
|
||||
protected override string GetOutputFileName(string contractNo, string contractIndex)
|
||||
{
|
||||
var client = Context.GetClient();
|
||||
var trades = Context.Trades;
|
||||
var trade = trades.FirstOrDefault();
|
||||
var client = Context.GetClient();
|
||||
var flowEvents = Context.GetFlowEvents();
|
||||
var allFlowEvents = Context.GetAllFlowEvents();
|
||||
|
||||
dic["客户名称"] = client.Name;
|
||||
var eventDate = flowEvents.FirstOrDefault()?.UnwindDate;
|
||||
dic["结算日期"] = eventDate?.ToString("yyyy-MM-dd") ?? DateTime.Now.ToString("yyyy-MM-dd");
|
||||
dic["交易编号"] = trade?.TradeNumber ?? "";
|
||||
dic["交易类型"] = trade?.TradeType ?? "";
|
||||
dic["标的代码"] = trade?.UnderlyingCode ?? "";
|
||||
|
||||
var underlying = trade != null ? Context.GetTradeUnderlying(trade.UnderlyingCode) : null;
|
||||
dic["标的名称"] = underlying?.UnderlyingName ?? "";
|
||||
|
||||
var flowEvent = flowEvents.FirstOrDefault();
|
||||
if (flowEvent != null)
|
||||
var eventDate = flowEvents.FirstOrDefault().UnwindDate.Value;
|
||||
var valueDate = eventDate.ToString("yyyy-MM-dd");
|
||||
var count = Context.GetDMASelttementCount(client.id, eventDate);
|
||||
var countStr = count == 0 ? "" : "-" + (count + 1).ToString();
|
||||
var FullName = $"结算单-{client.Name}-{valueDate}{countStr}";
|
||||
if (trades.Any(s => s.StructureType == "多空组合" || s.StructureType == "定义文件型债券收益互换"))
|
||||
{
|
||||
var unwindFlowEvents = allFlowEvents.Where(x => x.EventId == flowEvent.EventId);
|
||||
var NetSettleAmout = unwindFlowEvents.Sum(x => x.InterestClosePnL) * -1 + flowEvent.MarkClosePnl * -1;
|
||||
dic["结算金额"] = NetSettleAmout;
|
||||
dic["结算价格"] = flowEvent.TradingAmountAvg;
|
||||
FullName = $"{client.Name}-结算确认书-{valueDate}-交易平仓{countStr}";
|
||||
return $"{FullName}.docx";
|
||||
}
|
||||
else
|
||||
{
|
||||
dic["结算金额"] = 0;
|
||||
dic["结算价格"] = 0;
|
||||
}
|
||||
|
||||
dic["名义本金"] = trade?.OriginalStockEqvNotional ?? 0;
|
||||
return $"{FullName}.xlsx";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ using YLErp.Plugins.TradeDocGenerator.Abstracts;
|
||||
namespace YLErp.Plugins.GuoLian.DocumentGenerator
|
||||
{
|
||||
/// <summary>
|
||||
/// 国联证券了结报告生成器
|
||||
/// 国联证券了结报告生成器
|
||||
/// </summary>
|
||||
internal class TradeUnwindReportGenerator : BaseUnwindReportGenerator, ITradeUnwindReportGenerator
|
||||
{
|
||||
@@ -17,124 +17,123 @@ namespace YLErp.Plugins.GuoLian.DocumentGenerator
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 准备Word模板数据
|
||||
/// 准备Word模板数据
|
||||
/// </summary>
|
||||
protected override void PrepareViewData(Dictionary<string, JToken> dic)
|
||||
{
|
||||
var table1 = new JArray();
|
||||
var trade = Context.Trade;
|
||||
var client = Context.GetClient();
|
||||
var valueTimeList = new List<DateTime>();
|
||||
var valuetimelist = new List<DateTime>();
|
||||
var underlying = Context.GetTradeUnderlying();
|
||||
var variety = Context.GetUnderlyingVariety();
|
||||
var tradeCash = Context.GetTradeCash();
|
||||
var tradeList = Context.Trades.Union(Context.SubTrades).ToList();
|
||||
|
||||
var instrumentTypeArr = new List<string>() { ConsGlobal.InstrumentType.Stock, ConsGlobal.InstrumentType.StockIndex, ConsGlobal.InstrumentType.StockIF };
|
||||
var tradelist = Context.Trades.Union(Context.SubTrades).ToList();
|
||||
foreach (var item in Context.Trades)
|
||||
{
|
||||
foreach (var tradeCashItem in Context.TradeCashes[item.id])
|
||||
foreach (var tradeCashs in Context.TradeCashes[item.id])
|
||||
{
|
||||
var settlementPrice = (trade.IsUsePremiumRate != null && trade.IsUsePremiumRate.Value
|
||||
? tradeCashItem.UnwindPricePercentRate.OtcFormatPercent()
|
||||
: tradeCashItem.UnwindPrice.OtcFormatMoney());
|
||||
|
||||
var settlementprice = (trade.IsUsePremiumRate != null && trade.IsUsePremiumRate.Value ? tradeCashs.UnwindPricePercentRate.OtcFormatPercent() : tradeCashs.UnwindPrice.OtcFormatMoney());
|
||||
var row = new JObject();
|
||||
var currentTrade = tradeList.Find(o => o.id == tradeCashItem.TradeId);
|
||||
|
||||
row["交易编号"] = currentTrade?.TradeNumber ?? "";
|
||||
|
||||
// 买卖方向处理
|
||||
OtcTradeBase trades = tradelist.Find(O => O.id == tradeCashs.TradeId);
|
||||
row["交易编号"] = trades.TradeNumber;
|
||||
switch (item.BuySell)
|
||||
{
|
||||
case "买入":
|
||||
row["买方"] = (trade.OpponentRole == null || trade.OpponentRole == "乙方") ? "甲方" : "乙方";
|
||||
case "买入":
|
||||
if (trade.OpponentRole == null || trade.OpponentRole == "乙方")
|
||||
{
|
||||
row["买方"] = $"甲方";
|
||||
}
|
||||
else
|
||||
{
|
||||
row["买方"] = $"乙方";
|
||||
}
|
||||
break;
|
||||
case "卖出":
|
||||
row["买方"] = (trade.OpponentRole == null || trade.OpponentRole == "乙方") ? "乙方" : "甲方";
|
||||
case "卖出":
|
||||
if (trade.OpponentRole == null || trade.OpponentRole == "乙方")
|
||||
{
|
||||
row["买方"] = $"乙方";
|
||||
}
|
||||
else
|
||||
{
|
||||
row["买方"] = $"甲方";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
row["买方"] = "";
|
||||
break;
|
||||
}
|
||||
row["交易日期"] = $"{trades.TradeDate:yyyy/MM/dd}";
|
||||
row["开始日期"] = $"{trades.StartDate:yyyy/MM/dd}-{trades.ExerciseDate:yyyy/MM/dd}";
|
||||
row["名义本金"] = $"{trades.OriginalStockEqvNotional.OtcFormatMoney()}";
|
||||
row["标的代码"] = $"{trades.UnderlyingCode}";
|
||||
row["期权类型"] = $"{trades.TradeType}";
|
||||
row["期初价格"] = $"{trades.TradePrice.OtcFormatMoney()}";
|
||||
row["结算日期"] = $"{tradeCashs.ValueDate:yyyy/MM/dd}";
|
||||
row["结算价格"] = $"{tradeCashs.FinalPrice.OtcFormatMoney()}";
|
||||
row["结算模块"] = $"{(tradeCashs.UnwindPercentRate * trades.OriginalNotional * underlying.CountRatio).OtcFormatMoney()}";
|
||||
row["结算单价"] = $"{settlementprice}";
|
||||
var Amountqrs = -tradeCashs.Amount;
|
||||
var Amountqrs2 = -(tradeCashs.Amount + (trades.TradePrice ?? 0) * (tradeCashs.UnwindPercentRate ?? 0) * ((trades.BuySell == "卖出") ? 1 : -1));
|
||||
|
||||
row["交易日期"] = currentTrade?.TradeDate?.ToString("yyyy/MM/dd") ?? "";
|
||||
row["开始日期"] = $"{currentTrade?.StartDate:yyyy/MM/dd}-{currentTrade?.ExerciseDate:yyyy/MM/dd}";
|
||||
row["名义本金"] = currentTrade?.OriginalStockEqvNotional.OtcFormatMoney() ?? "0.00";
|
||||
row["标的代码"] = currentTrade?.UnderlyingCode ?? "";
|
||||
row["期权类型"] = currentTrade?.TradeType ?? "";
|
||||
row["期初价格"] = currentTrade?.TradePrice.OtcFormatMoney() ?? "0.00";
|
||||
row["结算日期"] = tradeCashItem.ValueDate.ToString("yyyy/MM/dd");
|
||||
row["结算价格"] = tradeCashItem.FinalPrice.OtcFormatMoney();
|
||||
row["结算模块"] = ((tradeCashItem.UnwindPercentRate ?? 0) * (currentTrade?.OriginalNotional ?? 0) * (underlying?.CountRatio ?? 0)).OtcFormatMoney() ?? "0.00";
|
||||
row["结算单价"] = settlementPrice;
|
||||
|
||||
var amountQrs = -tradeCashItem.Amount;
|
||||
var amountQrs2 = -(tradeCashItem.Amount + (currentTrade?.TradePrice ?? 0) * (tradeCashItem.UnwindPercentRate ?? 0) * ((currentTrade?.BuySell == "卖出") ? 1 : -1));
|
||||
|
||||
row["结算期权费"] = amountQrs.OtcFormatMoney();
|
||||
row["结算金额"] = amountQrs2.OtcFormatMoney();
|
||||
|
||||
row["结算期权费"] = $"{Amountqrs.OtcFormatMoney()}";
|
||||
row["结算金额"] = $"{Amountqrs2.OtcFormatMoney()}";
|
||||
table1.Add(row);
|
||||
valueTimeList.Add(tradeCashItem.ValueDate);
|
||||
valuetimelist.Add(tradeCashs.ValueDate);
|
||||
}
|
||||
}
|
||||
|
||||
// 合同编号由基类统一设置,此处不再重复生成
|
||||
dic["合同编号"] = Context.GenerateContractNo(out _);
|
||||
dic["table1"] = table1;
|
||||
dic["合同日期"] = DateTime.Now.ToString("yyyy/MM/dd");
|
||||
dic["了结日期1"] = valueTimeList.Min().ToString("yyyy/MM/dd");
|
||||
dic["了结日期2"] = valueTimeList.Max().ToString("yyyy/MM/dd");
|
||||
dic["合同日期"] = $"{DateTime.Now.ToString("yyyy/MM/dd")}";//ValueDate
|
||||
dic["了结日期1"] = $"{valuetimelist.Min():yyyy/MM/dd}";
|
||||
dic["了结日期2"] = $"{valuetimelist.Max():yyyy/MM/dd}";
|
||||
|
||||
// 甲乙方信息
|
||||
var ownerInfo = Context.GetOwner_info("默认");
|
||||
dic["客户名称"] = client?.Name ?? "";
|
||||
dic["公司名称"] = ownerInfo?.FullName ?? "";
|
||||
#region 甲乙方信息判断
|
||||
|
||||
if (trade.OpponentRole == null || trade.OpponentRole == "乙方")
|
||||
|
||||
var owner_Info = Context.GetOwner_info("默认");
|
||||
dic["客户名称"] = client != null ? client.Name : "";
|
||||
dic["公司名称"] = owner_Info != null ? owner_Info.FullName != null ? owner_Info.FullName : "" : "";
|
||||
if (trade.OpponentRole == null || trade.OpponentRole == "乙方")
|
||||
{
|
||||
dic["甲方"] = ownerInfo?.FullName ?? "";
|
||||
dic["乙方"] = client?.Name ?? "";
|
||||
dic["甲方"] = owner_Info != null ? owner_Info.FullName != null ? owner_Info.FullName : "" : "";
|
||||
dic["乙方"] = client != null ? client.Name : "";
|
||||
}
|
||||
else
|
||||
{
|
||||
dic["甲方"] = client?.Name ?? "";
|
||||
dic["乙方"] = ownerInfo?.FullName ?? "";
|
||||
dic["甲方"] = client != null ? client.Name : "";
|
||||
dic["乙方"] = owner_Info != null ? owner_Info.FullName != null ? owner_Info.FullName : "" : "";
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取模板文件路径
|
||||
/// </summary>
|
||||
protected override string GetTemplateFilePath()
|
||||
{
|
||||
var templatePath = Path.Combine(GlobalConfig.PluginFolder, "App_Docs\\settlement_template\\unwind_01.docx");
|
||||
var templatePath = "";
|
||||
templatePath = Path.Combine(GlobalConfig.PluginFolder, "App_Docs/settlement_template/settle_01.docx");
|
||||
return templatePath;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取输出文件名
|
||||
/// </summary>
|
||||
protected override string GetOutputFileName(string contractNo, string contractIndex)
|
||||
{
|
||||
var client = Context.GetClient();
|
||||
var trade = Context.Trade;
|
||||
var tradeList = Context.Trades.Union(Context.SubTrades).ToList();
|
||||
var ownerInfo = Context.GetOwner_info("默认") ?? new Owner_info();
|
||||
|
||||
var maxTradeDate = tradeList.Max(m => m.TradeDate);
|
||||
var minTradeDate = tradeList.Min(m => m.TradeDate);
|
||||
|
||||
string date;
|
||||
if (maxTradeDate == minTradeDate)
|
||||
var tradelist = Context.Trades.Union(Context.SubTrades).ToList();
|
||||
var owner_Info = Context.GetOwner_info("默认") ?? new Owner_info();
|
||||
var dts = tradelist.Max(m => m.TradeDate);
|
||||
var dte = tradelist.Min(m => m.TradeDate);
|
||||
var date = "";
|
||||
if (dts == dte)
|
||||
{
|
||||
date = trade.TradeDate?.ToString("yyyyMMdd") ?? DateTime.Now.ToString("yyyyMMdd");
|
||||
date = trade.TradeDate?.ToString("yyyyMMdd");
|
||||
}
|
||||
else
|
||||
{
|
||||
date = $"{minTradeDate:yyyyMMdd}-{maxTradeDate:yyyyMMdd}";
|
||||
date = dts?.ToString("yyyyMMdd") + "-" + dte?.ToString("yyyyMMdd");
|
||||
}
|
||||
|
||||
var fullName = ownerInfo?.FullName ?? "";
|
||||
var rule = $"{fullName} {trade.TradeType}结算确认书 {date}";
|
||||
var FullName = owner_Info != null ? owner_Info.FullName != null ? owner_Info.FullName : "" : "";
|
||||
var rule = $"{FullName}{trade.TradeType}结算确认书{date}";
|
||||
Context.GetcontractIndex(rule, out var contractIndex2);
|
||||
return $"{rule}-{contractIndex2}.{DocType.ToLower()}";
|
||||
}
|
||||
|
||||
@@ -26,6 +26,12 @@
|
||||
<None Update="App_Docs\contract_template\国联民生-收益互换交易确认书-境内模板-【客户看空】-【债券ETF】-清洁版.docx">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="App_Docs\settlement_template\dma_01.docx">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="App_Docs\settlement_template\nodma_01.xlsx">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<!-- 结算单模板 -->
|
||||
<None Update="App_Docs\settlement_template\settle_01.docx">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
|
||||
@@ -168,7 +168,7 @@ var colModelGrid = [
|
||||
sortable: false,
|
||||
formatter: function (cellvalue, options, rowObject) {
|
||||
if (rowObject.TradeType === "收益互换") {
|
||||
return otcformat.trading.umprice(cellvalue) * 100 + "%";
|
||||
return otcformat.flex(otcformat.trading.umprice(cellvalue), 2, 9, true, false, true);
|
||||
}
|
||||
return otcformat.trading.umprice(cellvalue);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user