Files
zszq-trs/Plugins/YLErp.Plugins.ZheShang/DocumentGenerator/TradeConfirmationGenerator.cs
T

176 lines
7.7 KiB
C#

using Newtonsoft.Json.Linq;
using System.Text.RegularExpressions;
using YLErp.Core.Helpers;
using YLErp.DBModels;
using YLErp.DBModels.Consts;
using YLErp.Enums;
using YLErp.Plugins.TradeDocGenerator;
using YLErp.Plugins.TradeDocGenerator.Abstracts;
namespace YLErp.Plugins.ShanXi.DocumentGenerator
{
internal class TradeConfirmationGenerator : BaseConfirmationGenerator, ITradeConfirmationGenerator
{
public TradeConfirmationGenerator()
: base(ContractTypeEnum.Trade)
{
}
protected override string GetTemplateFilePath()
{
string templatePath = null;
var trade = Context.Trade;
if (trade.TradeType == "收益互换" && trade.StructureType != null)
{
var swapPosition = Context.GetSwapPositions(trade.id, true).Where(x => x.PositionType > 0).FirstOrDefault();
if (swapPosition != null)
{
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;
}
}
}
else
{
throw new Exception("不支持商品类型");
}
return templatePath;
}
protected override string GetOutputFileName(string contractNo, string contractIndex)
{
var rule = $"收益互换交易确认书{contractNo}";
return $"{rule}.{DocType.ToLower()}";
}
protected override string GetContractNo(out string contractIndex)
{
var contractNo = Context.GenerateContractNo(out contractIndex);
return contractNo;
}
protected override void PrepareViewData(Dictionary<string, JToken> dic)
{
var trade = Context.Trade;
switch (trade.IsGroup == 1 ? trade.StructureType : trade.TradeType)
{
case "收益互换":
SetSwapData(dic);
break;
default:
break;
}
}
/// <summary>
/// 山证收益互换模板数据填充
/// </summary>
/// <param name="dic"></param>
public void SetSwapData(Dictionary<string, JToken> dic)
{
SetSingleSwap(dic);
}
private void SetSingleSwap(Dictionary<string, JToken> dic)
{
var client = Context.GetClient();
var trade = Context.Trade;
var bank = Context.GetClientBankCard(false);
var clientduties = Context.GetClientDuties();
var swapPositions = Context.GetSwapPositions(trade.id, true);
var swapPosition = swapPositions.Where(x => x.PositionType == 1 || x.PositionType == 2).FirstOrDefault();
var interestMargin = swapPositions.Where(x => ConsTrade.InterestModels.Contains(x.InterestMode)).FirstOrDefault();
var initialMarginQuery = swapPositions.Where(x => x.InterestMode == 5);
var additionMarginQuery = swapPositions.Where(x => x.InterestMode == 6);
var underlyingCode = swapPosition?.UnderlyingCode;
var table1 = new JArray();
var table2 = new JArray();
var clientMarginRate = Context.GetClientMarginRate(client.id);
dic["交易编号"] = trade.TradeNumber;
dic["交易对手方全称"] = client.ClientType != "产品" ? client.Name : $"{client.Manager}作为管理人代表{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】日");
dic["成交日期2"] = trade.TradeDate?.ToString("【yyyy】年【M】月【d】日");
dic["户名"] = bank?.ClientName;
dic["银行账号"] = bank?.Card;
dic["开户行"] = bank?.Bank;
dic["大额行号"] = bank?.Payment;
FormatToDict("期初标的交割全价", (double)((swapPosition?.PosiGrossPrice) ?? 0) * 100, dic);
FormatToDict("期初标的交割净价", (double)((swapPosition?.PosiNetNoFeePrice) ?? 0) * 100, dic);
if (string.IsNullOrWhiteSpace(interestMargin?.FloatRateUnderlyingCode))
{
dic["利率类型"] = "固定利率";
dic["利差"] = "";
dic["固定利率"] = ((interestMargin?.InterestRateDefault) ?? 0) * 100;
dic["参考利率"] = "";
}
else
{
dic["利率类型"] = "浮动利率";
dic["利差"] = ((interestMargin?.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), dic);
var basicFee = trade.StockEqvNotionalReal == 0 ? 0 : ((double)((swapPosition?.PosiTradingFeePending) ?? 0) / trade.StockEqvNotionalReal) * 100;
dic["基本费率"] = (basicFee * 2).ToString("f4");
var initialMarginSum = initialMarginQuery.Sum(x =>
x.InterestDirection == 2 ? x.InterestPrincipalFix * -1 : x.InterestPrincipalFix);
FormatToDict("交易费用", (double)((swapPosition?.PosiTradingFeePending * 2) ?? 0), dic);
dic["交易费率"] = dic["基本费率"];
FormatToDict("期初预付金", (double)initialMarginSum, dic);
dic["期初预付金利率"] = ((initialMarginQuery.FirstOrDefault()?.InterestRateDefault) ?? 0) * 100;
dic["追加预付金返息率"] = ((clientMarginRate?.AddToMarginRebateRate) ?? 0) * 100;
dic["标的代码"] = underlyingCode;
dic["标的名称"] = Context.GetTradeUnderlying(underlyingCode).UnderlyingName;
var bond = JsonHelper.Deserialize<UnderlyingBond>(Context.GetTradeUnderlying(underlyingCode).ExJson) ??
new UnderlyingBond();
dic["标的发行人"] = bond.UnderlyingIssuer;
clientduties = clientduties.Where(x=> x.ContactTypeId.Contains("3")).OrderBy(o=>o.id).ToList();//交易下达人
if (clientduties.Count>0)
{
var clientduty= clientduties.First();
var row = new JObject();
row["姓名"] = clientduty.ContactName;
row["身份证号"] = clientduty.IdCardNo;
row["联系电话"] = clientduty.PhoneNumber;
row["电子邮箱"] = clientduty.Email;
row["传真"] = clientduty.Fax;
table2.Add(row);
}
dic["table2"] = table2;
}
}
}