#TRS-ZS-32 互换簿记:支持浙商模板的交易确认书和结算确认书
This commit is contained in:
@@ -23,27 +23,21 @@ namespace YLErp.Plugins.ShanXi.DocumentGenerator
|
||||
var trade = Context.Trade;
|
||||
if (trade.TradeType == "收益互换" && trade.StructureType != null)
|
||||
{
|
||||
if (trade.StructureType == "普通债券类收益互换"|| trade.StructureType == "普通收益互换")
|
||||
{
|
||||
var swapPosition = Context.GetSwapPositions(trade.id, true).Where(x => x.PositionType>0).FirstOrDefault();
|
||||
var swapPosition = Context.GetSwapPositions(trade.id, true).Where(x => x.PositionType > 0).FirstOrDefault();
|
||||
|
||||
if (swapPosition != null)
|
||||
if (swapPosition != null)
|
||||
{
|
||||
switch (swapPosition.PositionType)
|
||||
{
|
||||
switch (swapPosition.PositionType)
|
||||
{
|
||||
case 1:
|
||||
templatePath = MosPathHelper.Combine(GlobalConfig.PluginFolder, "App_Docs\\交易确认书\\客户多头交易确认书模板.docx");
|
||||
break;
|
||||
case 2:
|
||||
templatePath = MosPathHelper.Combine(GlobalConfig.PluginFolder, "App_Docs\\交易确认书\\客户空头交易确认书模板.docx");
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
templatePath = MosPathHelper.Combine(GlobalConfig.PluginFolder, "App_Docs\\交易确认书\\客户多头交易确认书模板.docx");
|
||||
break;
|
||||
case 2:
|
||||
templatePath = MosPathHelper.Combine(GlobalConfig.PluginFolder, "App_Docs\\交易确认书\\客户空头交易确认书模板.docx");
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
templatePath = MosPathHelper.Combine(GlobalConfig.PluginFolder, "App_Docs\\交易确认书\\收益互换交易确认书(DMA)模板.docx");
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -78,44 +72,13 @@ namespace YLErp.Plugins.ShanXi.DocumentGenerator
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 检查是否存在扩展模板
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private string CheckTemplateFilePath(string templateFilePath, OtcTradeBase t)
|
||||
{
|
||||
bool check(string pathStr, string tempName, string suffix, out string nPath)
|
||||
{
|
||||
nPath = $"{pathStr}{tempName}{suffix}";
|
||||
return File.Exists(nPath);
|
||||
};
|
||||
|
||||
var fix = Path.GetExtension(templateFilePath);
|
||||
var path = $"{Path.GetDirectoryName(templateFilePath)}\\{Path.GetFileNameWithoutExtension(templateFilePath)}";
|
||||
if (check(path, t.OptionType, fix, out var newPath))
|
||||
{
|
||||
templateFilePath = newPath;
|
||||
}
|
||||
|
||||
return templateFilePath;
|
||||
}
|
||||
/// <summary>
|
||||
/// 山证收益互换模板数据填充
|
||||
/// </summary>
|
||||
/// <param name="dic"></param>
|
||||
public void SetSwapData(Dictionary<string, JToken> dic)
|
||||
{
|
||||
var trade = Context.Trade;
|
||||
if (trade.StructureType == "普通债券类收益互换" || trade.StructureType == "普通收益互换")
|
||||
{
|
||||
SetSingleSwap(dic);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetLongShort(dic);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void SetSingleSwap(Dictionary<string, JToken> dic)
|
||||
@@ -150,7 +113,30 @@ namespace YLErp.Plugins.ShanXi.DocumentGenerator
|
||||
|
||||
FormatToDict("期初标的交割全价", (double)((swapPosition?.PosiGrossPrice) ?? 0) * 100, dic);
|
||||
FormatToDict("期初标的交割净价", (double)((swapPosition?.PosiNetNoFeePrice) ?? 0) * 100, dic);
|
||||
dic["利差"] = ((interestMargin?.InterestRateDefault) ?? 0) * 100;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(interestMargin?.FloatRateUnderlyingCode))
|
||||
{
|
||||
dic["利率类型"] = "固定利率";
|
||||
dic["利差"] = "";
|
||||
dic["固定利率"] = ((interestMargin?.InterestRateDefault) ?? 0) * 100; ;
|
||||
dic["参考利率"] = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
dic["利率类型"] = "浮动利率";
|
||||
dic["利差"] = ((swapPosition?.InterestRateDefault) ?? 0) * 10000;
|
||||
dic["参考利率"] = interestMargin?.FloatRateUnderlyingCode;
|
||||
dic["固定利率"] = "";
|
||||
}
|
||||
if (initialMarginQuery.Any())
|
||||
{
|
||||
dic["初始预付金支付日"] = initialMarginQuery.FirstOrDefault().HappenDate?.ToString("【yyyy】年【M】月【d】日");
|
||||
}
|
||||
else
|
||||
{
|
||||
dic["初始预付金支付日"] = "";
|
||||
}
|
||||
FormatToDict("标的期初全价", trade.StockEqvNotionalReal * (double)((swapPosition?.PosiGrossPrice) ?? 0) * 100, dic);
|
||||
var basicFee = trade.StockEqvNotionalReal == 0 ? 0 : ((double)((swapPosition?.PosiTradingFeePending) ?? 0) / trade.StockEqvNotionalReal) * 100;
|
||||
dic["基本费率"] = (basicFee * 2).ToString("f4");
|
||||
var initialMarginSum = initialMarginQuery.Sum(x =>
|
||||
@@ -185,122 +171,6 @@ namespace YLErp.Plugins.ShanXi.DocumentGenerator
|
||||
dic["table2"] = table2;
|
||||
}
|
||||
|
||||
private void SetLongShort(Dictionary<string, JToken> dic)
|
||||
{
|
||||
var client = Context.GetClient();
|
||||
var trade = Context.Trade;
|
||||
var swapPositions = Context.GetSwapPositions(trade.id, true);
|
||||
var swapFlowDeals = Context.GetSwapFlowDeals(trade.id);
|
||||
swapFlowDeals = swapFlowDeals.Where(x => x.OpenFlag==(int)OpenCloseEnum.开仓).ToList();
|
||||
var table1 = new JArray();
|
||||
var table2 = new JArray();
|
||||
|
||||
dic["交易编号"] = trade.TradeNumber;
|
||||
dic["交易对手方全称"] = client.Name;
|
||||
dic["主协议编号"] = client.MainProtocolCode;
|
||||
dic["定义文件编号"] = client.SettleFileNumber;
|
||||
//FormatToDict("名义本金", trade.StockEqvNotionalReal, dic);
|
||||
dic["成交日期"] = trade.TradeDate?.ToString("yyyy年M月d日");
|
||||
dic["开始日期"] = trade.StartDate?.ToString("yyyy年M月d日");
|
||||
dic["到期日期"] = trade.ExerciseDate?.ToString("yyyy年M月d日");
|
||||
var count = 0;
|
||||
var count2 = 0;
|
||||
var interestMode = new int[] { 1, 2, 7, 8 };
|
||||
var list = swapPositions.Where(x => x.PositionType > 0 && x.PosiQuantity > 0);
|
||||
|
||||
var fixLong = swapPositions.Where(x => x.InterestMode == 7).FirstOrDefault();
|
||||
var fixShort = swapPositions.Where(x => x.InterestMode == 8).FirstOrDefault();
|
||||
dic["固定多头"] = ((double)(fixLong?.InterestRateDefault * 100 ?? 0)).ToString("0.####") + "%";
|
||||
dic["浮动多头"] = !string.IsNullOrWhiteSpace(fixLong?.FloatRateUnderlyingCode) ? "适用" : "不适用";
|
||||
dic["固定空头"] = ((double)(fixShort?.InterestRateDefault * 100 ?? 0)).ToString("0.####") + "%";
|
||||
dic["浮动空头"] = !string.IsNullOrWhiteSpace(fixShort?.FloatRateUnderlyingCode) ? "适用" : "不适用";
|
||||
dic["管理人名称"] = client.Manager;
|
||||
var calculationBasis = "";
|
||||
if (dic["浮动多头"].ToString() == "适用")
|
||||
{
|
||||
calculationBasis = fixLong?.FloatRateUnderlyingCode;
|
||||
}
|
||||
else if (dic["浮动空头"].ToString() == "适用")
|
||||
{
|
||||
calculationBasis = fixShort?.FloatRateUnderlyingCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
calculationBasis = "不适用";
|
||||
}
|
||||
|
||||
dic["计算基准"] = calculationBasis;
|
||||
|
||||
double totalPosiQuantity = 0;
|
||||
|
||||
foreach (var item in list)
|
||||
{
|
||||
var row = new JObject();
|
||||
|
||||
row["序号"] = ++count;
|
||||
if (!string.IsNullOrWhiteSpace(item?.UnderlyingCode))
|
||||
{
|
||||
var um = Context.GetTradeUnderlying(item?.UnderlyingCode);
|
||||
row["标的名称"] = um.UnderlyingName;
|
||||
row["标的代码"] = item?.UnderlyingCode;
|
||||
decimal multiplier = um.IsBond() ? 100 : 1;
|
||||
FormatToDict("期初价格", (double)((item?.PosiNetPrice * multiplier) ?? 0), row);
|
||||
}
|
||||
else
|
||||
{
|
||||
row["标的名称"] = "";
|
||||
row["标的代码"] = "";
|
||||
row["期初价格"] = "";
|
||||
}
|
||||
FormatToDict("数量", (double)((item?.PosiQuantity) ?? 0), row);
|
||||
totalPosiQuantity += (double)((item?.PosiQuantity) ?? 0);
|
||||
FormatToDict("合约乘数", (double)((item?.ContractSize) ?? 0), row);
|
||||
row["方向"] = item?.PositionType switch
|
||||
{
|
||||
1 => "买入",
|
||||
2 => "卖出",
|
||||
_ => ""
|
||||
};
|
||||
table1.Add(row);
|
||||
}
|
||||
FormatToDict("名义本金", totalPosiQuantity, dic);
|
||||
var underlyingCodes = swapFlowDeals.Select(r => r.UnderlyingCode).ToList();
|
||||
List<underlying_manager> underlyings = new List<underlying_manager>();
|
||||
if (underlyingCodes.Count() > 0)
|
||||
{
|
||||
underlyings = Context.GetUnderlyings(underlyingCodes);
|
||||
}
|
||||
foreach (var item in swapFlowDeals.OrderBy(o => o.UnderlyingCode).ThenBy(t => t.id))
|
||||
{
|
||||
var row = new JObject();
|
||||
row["编号"] = ++count2;
|
||||
row["标的代码"] = item.UnderlyingCode;
|
||||
var um = underlyings.FirstOrDefault(x => x.UnderlyingCode == item.UnderlyingCode);
|
||||
if (um != null)
|
||||
{
|
||||
row["标的名称"] = um.UnderlyingName;
|
||||
if (um.IsBond())
|
||||
{
|
||||
item.FullPrice *= ConsGlobal.bondShowPriceMultiple;
|
||||
item.FullPriceFee *= ConsGlobal.bondShowPriceMultiple;
|
||||
item.NetPrice *= ConsGlobal.bondShowPriceMultiple;
|
||||
item.NetPriceFee *= ConsGlobal.bondShowPriceMultiple;
|
||||
}
|
||||
}
|
||||
FormatToDict("成交收益率", (double)(item.Ytm), row);
|
||||
FormatToDict("成交全价", (double)(item.FullPriceFee), row);
|
||||
FormatToDict("成交数量", (double)(item.TradingQty), row);
|
||||
row["成交方向"] = item?.BsType switch
|
||||
{
|
||||
1 => "买入",
|
||||
2 => "卖出",
|
||||
_ => ""
|
||||
};
|
||||
row["交易日期"] = item.OccurDate.ToString("yyyy-MM-dd");
|
||||
table2.Add(row);
|
||||
}
|
||||
dic["table1"] = table1;
|
||||
dic["flowtable"] = table2;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user