using YLErp.BLL;
using YLErp.QdpModule;
namespace YLErp.Modules.TradeModule.DealModule
{
///
/// 展期的服务
///
public class ExtensionTimeService : YLBaseService
{
public ExtensionTimeService(OptUserInfo userInfo) : base(userInfo)
{
}
public ExtensionTimeService(OptUserInfo optUser, YLContext dbContext) : base(optUser, dbContext)
{
}
///
/// 获取指定交易的展期记录
///
///
///
public List QueryExtensionTimeList(int tradeId)
{
return DbContext.ExtensionTime.Where(O => O.TradeId == tradeId && O.IsValid).ToList();
}
///
/// 保存展期记录
///
///
public void SaveExtensionTime(ExtensionTime info)
{
#region 检查
var obj = DbContext.ExtensionTime.Where(O => O.id == info.id).FirstOrDefault();
var trade = DbContext.trade.Where(O => O.id == info.TradeId).FirstOrDefault();
if (obj == null)
{
obj = new ExtensionTime();
obj.DataTag = Guid.NewGuid().ToString("N");
obj.OldMaturityDate = trade.ExerciseDate ?? trade.TradeDate ?? DateTime.MinValue;
DbContext.ExtensionTime.Add(obj);
}
if (obj.OldMaturityDate == info.NewMaturityDate)
{
throw new ServiceException("新到期日不应和原到期日一致!");
}
if (obj.ValueDate >= info.ValueDate)
{
throw new ServiceException("新展期日应晚于原展期日!");
}
if (trade == null)
{
throw new ServiceException("未找到交易,请刷新页面后再次尝试!");
}
#endregion
#region 操作
var tradeDict = new Dictionary() { { trade, obj } };
var tId = info.TradeId;
var newMaturityDate = info.NewMaturityDate;
if (trade.TradeType == "结构化交易")
{
var otherTrades =
(from t in DbContext.trade
join et in DbContext.ExtensionTime.Where(O => O.IsValid && O.NewMaturityDate == newMaturityDate)
on t.id equals et.TradeId into tempEt
from et in tempEt.DefaultIfEmpty()
where t.ParentTradeId == tId
select new { trade, et }).ToDictionary(K => K.trade, V => V.et);
foreach (var item in otherTrades)
{
var et = item.Value;
if (et == null)
{
et = new ExtensionTime();
et.DataTag = obj.DataTag;
et.OldMaturityDate = obj.OldMaturityDate;
DbContext.ExtensionTime.Add(et);
}
tradeDict.Add(item.Key, et);
}
}
else if (trade.ParentTradeId > 0)
{
var pId = trade.ParentTradeId;
var otherTrades =
(from t in DbContext.trade
join et in DbContext.ExtensionTime.Where(O => O.IsValid && O.NewMaturityDate == newMaturityDate)
on t.id equals et.TradeId into tempEt
from et in tempEt.DefaultIfEmpty()
where (t.id == pId
|| t.ParentTradeId == pId)
&& t.id != tId
select new { trade, et }).ToDictionary(K => K.trade, V => V.et);
foreach (var item in otherTrades)
{
var et = item.Value;
if (et == null)
{
et = new ExtensionTime();
et.DataTag = obj.DataTag;
et.OldMaturityDate = obj.OldMaturityDate;
DbContext.ExtensionTime.Add(et);
}
tradeDict.Add(item.Key, et);
}
}
foreach (var item in tradeDict)
{
saveExtensionTime(item.Key, item.Value, info.ValueDate, info.NewMaturityDate);
}
DbContext.SaveChanges();
//修改报送记录为已修改;
foreach (var item in tradeDict)
{
var infoTag = $"_{item.Value.id}_展期";
var notes = DbContext.sac_report_notes.Where(O => O.InfoTag.Contains(infoTag)).ToArray();
foreach (var note in notes)
{
note.changeStatus = true;
}
}
#endregion
DbContext.SaveChanges();
}
private void saveExtensionTime(trade trade, ExtensionTime obj, DateTime valueDate, DateTime newMaturityDate)
{
var dateStr = (obj.id > 0 ? trade.ExerciseDate ?? trade.TradeDate ?? DateTime.MinValue : obj.OldMaturityDate).ToString("yyyy-MM-dd");
var interval = newMaturityDate - trade.ExerciseDate;
var newSettlementDate = (trade.SettlementDate ?? trade.ExerciseDate ?? obj.OldMaturityDate).AddDays(interval.Value.Days);
var changes = $"[[\"ExerciseDate\",\"到期日期\",\"{trade.ExerciseDate?.ToString("yyyy-MM-dd")}\",\"{newMaturityDate.ToString("yyyy-MM-dd")}\",\"0\",\"{obj.DataTag}\",\"{valueDate.ToString("yyyy-MM-dd")}\"],[\"SettlementDate\",\"结算日期\",\"{trade.SettlementDate?.ToString("yyyy-MM-dd")}\",\"{newSettlementDate.ToString("yyyy-MM-dd")}\",\"0\",\"{obj.DataTag}\",\"{valueDate.ToString("yyyy-MM-dd")}\"]]";
obj.ValueDate = valueDate;
obj.TradeId = trade.id;
obj.NewMaturityDate = newMaturityDate;
obj.IsValid = true;
obj.OptId = UserId;
obj.OptDate = DateTime.Now;
trade.ExerciseDate = newMaturityDate;
trade.SettlementDate = newSettlementDate;
if (trade.TradeType == "收益互换")
{
var tid = trade.id;
var tradeSwapDetial = DbContext.trade_swap_detail.Where(O => O.TradeId == tid);
foreach (var item in tradeSwapDetial)
{
item.ExerciseDate = newMaturityDate;
}
var trade_swap = DbContext.trade_swap.FirstOrDefault(t => t.TradeId == tid);
var customizedResultsGet = QdpHelper.ParseAutocallCustomizedInfo(trade_swap.GetSwapTimeAndRate);
var newDateStr= newMaturityDate.ToString("yyyy-MM-dd");
if (customizedResultsGet.Item2 != null&& customizedResultsGet.Item2.Count()==1&& trade_swap.GetSwapTimeAndRate.Contains(dateStr))
{
trade_swap.GetSwapTimeAndRate = trade_swap.GetSwapTimeAndRate.Replace(dateStr, newDateStr);
}
var customizedResultsPay = QdpHelper.ParseAutocallCustomizedInfo(trade_swap.PaySwapTimeAndRate);
if (customizedResultsPay.Item2 != null&& customizedResultsPay.Item2.Count()==1 && trade_swap.PaySwapTimeAndRate.Contains(dateStr))
{
trade_swap.PaySwapTimeAndRate = trade_swap.PaySwapTimeAndRate.Replace(dateStr, newDateStr);
}
}
DbContext.TradeAuditLog.Add(new TradeAuditLog()
{
TradeId = obj.TradeId,
Changes = changes,
DataType = "C02",
OptId = UserId,
OptName = UserName,
OptDate = OptDate,
OptType = "交易展期",
AuditFlag = TradeAuditFlag.operation
});
}
///
/// 删除展期记录,并还原交易到期日
///
///
///
public trade DelExtensionTime(int tradeId, int id)
{
#region 检查
var trade = DbContext.trade.Where(O => O.id == tradeId).FirstOrDefault();
if (trade == null)
{
throw new ServiceException("未找到交易,请刷新页面后再次尝试!");
}
var obj = DbContext.ExtensionTime.Where(O => O.id == id && O.TradeId == trade.id).FirstOrDefault();
if (obj == null)
{
throw new ServiceException("未找到展期记录,请刷新页面后再次尝试!");
}
if (trade.ExerciseDate != obj.NewMaturityDate)
{
throw new ServiceException("展期记录应按照添加时间倒序依次删除!");
}
#endregion
#region 操作
var tradeDict = new Dictionary() { { trade, obj } };
var newMaturityDate = obj.NewMaturityDate;
if (trade.TradeType == "结构化交易")
{
var otherTrades =
(from t in DbContext.trade
join et in DbContext.ExtensionTime.Where(O => O.IsValid && O.NewMaturityDate == newMaturityDate)
on t.id equals et.TradeId
where t.ParentTradeId == tradeId
select new { trade, et }).ToDictionary(K => K.trade, V => V.et);
foreach (var item in otherTrades)
{
tradeDict.Add(item.Key, item.Value);
}
}
else if (trade.ParentTradeId > 0)
{
var pId = trade.ParentTradeId;
var otherTrades =
(from t in DbContext.trade
join et in DbContext.ExtensionTime.Where(O => O.IsValid && O.NewMaturityDate == newMaturityDate)
on t.id equals et.TradeId
where (t.id == pId
|| t.ParentTradeId == pId)
&& t.id != tradeId
select new { trade, et }).ToDictionary(K => K.trade, V => V.et);
foreach (var item in otherTrades)
{
tradeDict.Add(item.Key, item.Value);
}
}
foreach (var item in tradeDict)
{
delExtensionTime(item.Key, item.Value);
}
DbContext.SaveChanges();
#endregion
return trade;
}
///
/// 仅删除展期记录,默认不会还原交易到期日(慎用)
///
///
/// 只删除操作日期大于等于该值的记录
/// 是否修改交易到期日
/// 是否调用SaveChanges()
public void DelExtensionTime(int tradeId, DateTime startDate, bool editTrade = false, bool saveChanges = false)
{
#region 检查
var trade = DbContext.trade.Where(O => O.id == tradeId).FirstOrDefault();
if (trade == null)
{
throw new ServiceException("未找到交易,请刷新页面后再次尝试!");
}
#endregion
#region 操作
var tradeList = new List() { trade };
if (trade.TradeType == "结构化交易")
{
var otherTrades = DbContext.trade.Where(O => O.ParentTradeId == tradeId).ToArray();
tradeList.AddRange(otherTrades);
}
else if (trade.ParentTradeId > 0)
{
var pId = trade.ParentTradeId;
var otherTrades =
DbContext.trade.Where(O => (O.id == pId
|| O.ParentTradeId == pId)
&& O.id != tradeId).ToArray();
tradeList.AddRange(otherTrades);
}
foreach (var item in tradeList)
{
var objArr = DbContext.ExtensionTime.Where(O => O.TradeId == tradeId && O.IsValid && O.OptDate >= startDate).OrderByDescending(O => O.OptDate).ToArray();
foreach (var obj in objArr)
{
delExtensionTime(item, obj, editTrade);
}
}
if (saveChanges)
{
DbContext.SaveChanges();
}
#endregion
}
///
/// 删除展期记录
///
///
///
///
///
private void delExtensionTime(trade trade, ExtensionTime obj, bool editTrade = true)
{
var dateStr = trade.ExerciseDate.Value.ToString("yyyy-MM-dd");
var interval = trade.ExerciseDate - obj.OldMaturityDate;
var oldSettlementDate = (trade.SettlementDate ?? trade.ExerciseDate ?? obj.OldMaturityDate).AddDays(-interval.Value.Days);
var changes = $"[[\"ExerciseDate\",\"到期日期\",\"{trade.ExerciseDate?.ToString("yyyy-MM-dd")}\",\"{obj.OldMaturityDate.ToString("yyyy-MM-dd")}\",\"0\",\"{obj.DataTag}\",\"{obj.ValueDate.ToString("yyyy-MM-dd")}\"],[\"SettlementDate\",\"结算日期\",\"{trade.SettlementDate?.ToString("yyyy-MM-dd")}\",\"{oldSettlementDate.ToString("yyyy-MM-dd")}\",\"0\",\"{obj.DataTag}\",\"{obj.ValueDate.ToString("yyyy-MM-dd")}\"]]";
if (editTrade)
{
trade.ExerciseDate = obj.OldMaturityDate;
trade.SettlementDate = oldSettlementDate;
}
obj.IsValid = false;
obj.OptId = UserId;
obj.OptDate = DateTime.Now;
if (editTrade && trade.TradeType == "收益互换")
{
var tId = trade.id;
var tradeSwapDetial = DbContext.trade_swap_detail.Where(O => O.TradeId == tId);
foreach (var item in tradeSwapDetial)
{
item.ExerciseDate = obj.OldMaturityDate;
}
var trade_swap = DbContext.trade_swap.FirstOrDefault(t => t.TradeId == tId);
var customizedResultsGet = QdpHelper.ParseAutocallCustomizedInfo(trade_swap.GetSwapTimeAndRate);
var newDateStr = obj.OldMaturityDate.ToString("yyyy-MM-dd");
if (customizedResultsGet.Item2 != null && customizedResultsGet.Item2.Count() == 1 && trade_swap.GetSwapTimeAndRate.Contains(dateStr))
{
trade_swap.GetSwapTimeAndRate = trade_swap.GetSwapTimeAndRate.Replace(dateStr, newDateStr);
}
var customizedResultsPay = QdpHelper.ParseAutocallCustomizedInfo(trade_swap.PaySwapTimeAndRate);
if (customizedResultsPay.Item2 != null && customizedResultsPay.Item2.Count() == 1 && trade_swap.PaySwapTimeAndRate.Contains(dateStr))
{
trade_swap.PaySwapTimeAndRate = trade_swap.PaySwapTimeAndRate.Replace(dateStr, newDateStr);
}
}
DbContext.TradeAuditLog.Add(new TradeAuditLog()
{
TradeId = obj.TradeId,
Changes = changes,
DataType = "C02",
OptId = UserId,
OptName = UserName,
OptDate = OptDate,
OptType = "交易展期撤销",
AuditFlag = TradeAuditFlag.operation
});
}
}
}