using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.Xml.Serialization;
using YLErp.Modules.SuperviseReportModule.SAC.Common;
using static YLErp.DBModels.Consts.ConsReport;
namespace YLErp.Modules.SuperviseReportModule.SAC.Model
{
///
/// 收益互换交易存续期管理
///
[Table("A1006_SwapDurationManagement")]
public class SwapDurationManagementModel : ReportBaseModel
{
///
/// 操作标识
/// 长度:1
/// 必填:是
/// 说明:
///
[XmlIgnore]
[SacDescription("OperationType", "操作标识", "1", true, "")]
public OptFlagsEnum OperationType { get; set; }
///
/// 收益互换交易类型
/// 长度:2
/// 必填:是
/// 说明:
///
[XmlIgnore]
[SacDescription("SwapType", "收益互换交易类型", "2", true, "")]
public string SwapType { get; set; }
///
/// 操作事件编号
/// 长度:6
/// 必填:是
///
/// 说明:存续期发生相关事件时,必填;
/// 同一笔交易确认书下应当保证唯一性,并按照事件发生顺序进行编号,起始编号为0000.
/// 如一笔交易下依次发生展期\调仓\终止事件,编号应当分别为0000\0001\0002,
/// 场外业务报告系统返回编号分别为E0000\R0001\T0002
///
///
[CheckStringLengthInMap(Map = new[] { 4, 5 })]
[DefaultValue("")]
[SacDescription("DurationEventNO", "操作事件编号", "6", true, "存续期发生相关事件时,必填;\r\n同一笔交易确认书下应当保证唯一性,并按照事件发生顺序进行编号,起始编号为0000.\r\n如一笔交易下依次发生展期、调仓、终止事件,编号应当分别为0000、0001、0002,\r\n场外业务报告系统返回编号分别为E0000、R0001、T0002;")]
public new string DurationEventNO { get; set; }
///
/// 交易确认书编号(双方约定)
/// 长度:100
/// 必填:是
/// 说明:双方约定
///
[CheckStringMaxLength(MaxLength = 100)]
[DefaultValue("")]
[SacDescription("ConfirmationNo", "交易确认书编号(双方约定)", "100", true, "双方约定;")]
public string ConfirmationNo { get; set; }
///
/// 存续期操作类型
/// 长度:2
/// 必填:是
/// 说明:当"收益互换交易类型"为"多空组合"时,可选"调仓"
///
[CheckConditionStringValue(ConditionName = nameof(SwapType), ConditionValue = "2", CheckHandleNameArr = new[] { "A", "C" })]
[CheckConditionStringNEQValue(ConditionName = nameof(SwapType), ConditionValue = "2", CheckHandleNameArr = new[] { "B", "C" })]
[CheckStringInMap(Map = new[] { "1", "4" }, CheckHandleName = "A")]
[CheckStringInMap(Map = new[] { "1", "2", "3" }, CheckHandleName = "B")]
[CheckStringIntMaxLength(MaxValue = 4, MinValue = 1, BeforePointMaxLength = 2, CheckHandleName = "C")]
[DefaultValue("")]
[SacDescription("DurationOperationType", "存续期操作类型", "2", true, "当收益互换交易类型为多空组合时,可选调仓;")]
public string DurationOperationType { get; set; }
///
/// 操作发生日期
/// 长度:10
/// 必填:是
/// 说明:分别为"确定进行展期日期"\"合约终止日期"\"交易发生违约日期"\"多空组合收益互换发生标的调仓日期"
///
[CheckStringIsDateTimeFormat]
[DefaultValue("")]
[SacDescription("DurationOperationDate", "操作发生日期", "10", true, "分别为确定进行展期日期、合约终止日期、交易发生违约日期、多空组合收益互换发生标的调仓日期;")]
public string DurationOperationDate { get; set; }
///
/// 展期后到期日
/// 长度:10
/// 必填:否
///
/// 说明:当"存续期操作类型"为"展期"时,必填;
/// 不存在展期操作数据,不得早于原合约到期日;
/// 存在展期操作数据,不得早于最近一次展期数据的"展期后到期日"
///
[CheckConditionStringValue(ConditionName = nameof(DurationOperationType), ConditionValue = "01", CheckHandleNameArr = new[] { "A" })]
[CheckConditionStringNEQValue(ConditionName = nameof(DurationOperationType), ConditionValue = "01", CheckHandleNameArr = new[] { "B" })]
[CheckStringIsDateTimeFormat(CheckHandleName = "A")]
[CheckStringIsDateTimeFormat(Required = false, CheckHandleName = "B")]
[DefaultValue("")]
[SacDescription("RenewalDate", "展期后到期日", "10", false, "当存续期操作类型为展期时,必填;\r\n不存在展期操作数据,不得早于原合约到期日;\r\n存在展期操作数据,不得早于最近一次展期数据的展期后到期日;")]
public string RenewalDate { get; set; }
///
/// 违约方
/// 长度:2
/// 必填:否
/// 说明:当"存续期操作类型"为"违约终止"时,必填
///
[CheckConditionStringValue(ConditionName = nameof(DurationOperationType), ConditionValue = "03", CheckHandleNameArr = new[] { "A" })]
[CheckConditionStringNEQValue(ConditionName = nameof(DurationOperationType), ConditionValue = "03", CheckHandleNameArr = new[] { "B" })]
[CheckStringInMap(Map = new[] { "0", "1" }, CheckHandleName = "A")]
[CheckStringInMap(Map = new[] { "0", "1" }, Required = false, CheckHandleName = "B")]
[DefaultValue("")]
[SacDescription("DefaultingParty", "违约方", "2", false, "当存续期操作类型为违约终止时,必填;")]
public string DefaultingParty { get; set; }
///
/// 违约事件说明
/// 长度:1024
/// 必填:否
/// 说明:当"存续期操作类型"为"违约终止"时,必填
///
[CheckConditionStringValue(ConditionName = nameof(DurationOperationType), ConditionValue = "03", CheckHandleNameArr = new[] { "A" })]
[CheckConditionStringNEQValue(ConditionName = nameof(DurationOperationType), ConditionValue = "03", CheckHandleNameArr = new[] { "B" })]
[CheckStringMaxLength(MaxLength = 1024, CheckHandleName = "A")]
[CheckStringMaxLength(MaxLength = 1024, Required = false, CheckHandleName = "B")]
[DefaultValue("")]
[SacDescription("DefaultEvent", "违约事件说明", "1024", false, "当存续期操作类型为违约终止时,必填;")]
public string DefaultEvent { get; set; }
///
/// 名义本金变动(元)
/// 长度:36,2
/// 必填:否
///
/// 说明:首次存续期操作,为较名义本金的增减情况;
/// 存在"存续期操作"的,为较最近一次存量名义本金的增减情况,增加为正数,减少为负数.
/// 其中,当"存续期操作类型"选择"终止"\"违约终止"\"调仓"时,必填;
/// 当"存续期操作类型"选择"终止"或"违约终止"时,只能减少;
/// 当"存续期操作类型"选择"调仓"时,可增可减
///
///
[CheckConditionStringInMap(ConditionName = nameof(DurationOperationType), ConditionMap = new[] { "04" }, CheckHandleNameArr = new[] { "A" })]
[CheckConditionStringInMap(ConditionName = nameof(DurationOperationType), ConditionMap = new[] { "02", "03" }, CheckHandleNameArr = new[] { "B" })]
[CheckConditionStringNotInMap(ConditionName = nameof(DurationOperationType), ConditionMap = new[] { "02", "03", "04" }, CheckHandleNameArr = new[] { "C" })]
[CheckStringIntLength(BeforePointMaxLength = 36, AfterPointLength = 2, CheckHandleName = "A")]
[CheckStringIntLength(BeforePointMaxLength = 36, AfterPointLength = 2, MaxValue = 0, CheckHandleName = "B")]
[CheckStringIntLength(BeforePointMaxLength = 36, AfterPointLength = 2, Required = false, CheckHandleName = "C")]
[DefaultValue("")]
[SacDescription("ChangeAmount", "名义本金变动(元)", "36,2", false, "首次存续期操作,为较名义本金的增减情况;\r\n存在存续期操作的,为较最近一次存量名义本金的增减情况,增加为正数,减少为负数.\r\n其中,当存续期操作类型选择终止、违约终止、调仓时,必填;\r\n当存续期操作类型选择终止或违约终止时,只能减少;\r\n当存续期操作类型选择调仓时,可增可减;")]
public string ChangeAmount { get; set; }
///
/// 存量名义本金(元)
/// 长度:36,2
/// 必填:是
///
/// 说明:对于非多空收益互换,名义本金(或最近一次存量名义本金)+本次名义本金变动=本次存量名义本金;
/// 对于多空组合收益互换,存量名义本金为存量多头名义本金和空头名义本金孰大者
///
///
[CheckStringIntLength(BeforePointMaxLength = 36, AfterPointLength = 2)]
[DefaultValue("")]
[SacDescription("Balance", "存量名义本金(元)", "36,2", true, "对于非多空收益互换,名义本金(或最近一次存量名义本金)+本次名义本金变动=本次存量名义本金;\r\n对于多空组合收益互换,存量名义本金为存量多头名义本金和空头名义本金孰大者;")]
public string Balance { get; set; }
///
/// 本次支付金额(元)
/// 长度:36,2
/// 必填:否
///
/// 说明:当"存续期操作类型"选择"终止"\"违约终止"\"调仓"时,必填;
/// 支付为正,收取为负
///
///
[CheckConditionStringInMap(ConditionName = nameof(DurationOperationType), ConditionMap = new[] { "02", "03", "04" }, CheckHandleNameArr = new[] { "A" })]
[CheckConditionStringNotInMap(ConditionName = nameof(DurationOperationType), ConditionMap = new[] { "02", "03", "04" }, CheckHandleNameArr = new[] { "B" })]
[CheckStringIntLength(BeforePointMaxLength = 36, AfterPointLength = 2, CheckHandleName = "A")]
[CheckStringIntLength(BeforePointMaxLength = 36, AfterPointLength = 2, Required = false, CheckHandleName = "B")]
[DefaultValue("")]
[SacDescription("AmountPaidThisTime", "本次支付金额(元)", "36,2", false, "当存续期操作类型选择终止、违约终止、调仓时,必填;\r\n支付为正,收取为负;")]
public string AmountPaidThisTime { get; set; }
///
/// 保证金比例(%)
/// 长度:8,2
/// 必填:是
/// 说明:为保证金占存量名义本金比例,其中多空组合收益互换存量名义本金为存量多头名义本金和空头名义本金孰大者
///
[CheckStringIntLength(BeforePointMaxLength = 8, AfterPointLength = 2)]
[DefaultValue("")]
[SacDescription("MarginRatio", "保证金比例(%)", "8,2", true, "为保证金占存量名义本金比例,其中多空组合收益互换存量名义本金为存量多头名义本金和空头名义本金孰大者;")]
public string MarginRatio { get; set; }
///
/// 合约持仓明细
/// 必填:否
/// 说明:校验规则:当"存量名义本金(元)"为0时,非必填;展期数据不允许添加合约持仓明细;
///
[XmlElement]
[CheckConditionStringValue(ConditionName = nameof(DurationOperationType), ConditionValue = "01", CheckHandleNameArr = new[] { "A" })]
[CheckConditionIntInRange(ConditionName = nameof(Balance), MinValue = 0, MaxValue = 0, CheckHandleNameArr = new[] { "B" })]
[CheckIEnumerableTMaxCount(CheckHandleName = "A", MaxCount = 0)]
[CheckIEnumerableTMaxCount(CheckHandleName = "B", MaxCount = 0)]
[NotMapped]
[SacDescription("CurrentPositionDetails", "合约持仓明细", "", false, "校验规则:当存量名义本金(元)为0时,非必填;\r\n展期数据不允许添加合约持仓明细;")]
public List CurrentPositionDetails { get; set; }
///
/// 存续期信息附件
/// 必填:否
/// 说明:校验规则:只支持PDF格式
///
[CheckStringEndsWith(EndsWithString = ".pdf", Required = false)]
[DefaultValue("")]
[SacDescription("SwapDurationManagementAtt", "存续期信息附件", "", false, "校验规则:只支持PDF格式;")]
public string SwapDurationManagementAtt { get; set; }
///
/// 空白1
///
[DefaultValue("")]
[SacDescription("Blank1", "空白1", "", false, "")]
public string Blank1 { get; set; }
///
/// 空白2
///
[DefaultValue("")]
[SacDescription("Blank2", "空白2", "", false, "")]
public string Blank2 { get; set; }
}
///
/// 合约持仓明细
///
[Table("A1006_CurrentPositionDetail")]
public class CurrentPositionDetailModel : ReportSubBaseModel
{
///
/// 挂钩标的编码
/// 长度:200
/// 必填:是
/// 说明:标的代码应当符合标准规范的编码
///
[CheckStringMaxLength(MaxLength = 200)]
[DefaultValue("")]
[SacDescription("UndrlygAssetCode", "挂钩标的编码", "200", true, "标的代码应当符合标准规范的编码;")]
public string UndrlygAssetCode { get; set; }
///
/// 标的小类
/// 长度:2
/// 必填:是
/// 说明:应当符合标准规范
///
[CheckStringInMap(Map = new[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "99" })]
[DefaultValue("")]
[SacDescription("UndrlygAssetDtldType", "标的小类", "2", true, "应当符合标准规范;")]
public string UndrlygAssetDtldType { get; set; }
///
/// 标的名称
/// 长度:200
/// 必填:是
/// 说明:
///
[CheckStringMaxLength(MaxLength = 200)]
[DefaultValue("")]
[SacDescription("UndrlygAssetName", "标的名称", "200", true, "")]
public string UndrlygAssetName { get; set; }
///
/// 标的交易场所
/// 长度:200
/// 必填:是
/// 说明:
///
[CheckStringMaxLength(MaxLength = 200)]
[DefaultValue("")]
[SacDescription("UndrlygAssetTradgPlc", "标的交易场所", "200", true, "")]
public string UndrlygAssetTradgPlc { get; set; }
///
/// 标的价格
/// 长度:36,4
/// 必填:是
/// 说明:
///
[CheckStringIntLength(BeforePointMaxLength = 36, AfterPointLength = 4)]
[DefaultValue("")]
[SacDescription("UndrlygAssetPrice", "标的价格", "36,4", true, "")]
public string UndrlygAssetPrice { get; set; }
///
/// 客户持仓方向
/// 长度:2
/// 必填:是
/// 说明:
///
[CheckStringInMap(Map = new[] { "0", "1" })]
[DefaultValue("")]
[SacDescription("InvestorPosition", "客户持仓方向", "2", true, "")]
public string InvestorPosition { get; set; }
///
/// 标的数量
/// 长度:36,6
/// 必填:是
/// 说明:
///
[CheckStringIntLength(BeforePointMaxLength = 36, AfterPointLength = 6)]
[DefaultValue("")]
[SacDescription("UndrlygAssetAmt", "标的数量", "36,6", true, "")]
public string UndrlygAssetAmt { get; set; }
///
/// 合约乘数
/// 长度:36
/// 必填:是
/// 说明:整数
///
[CheckStringIntLength(BeforePointMaxLength = 36, AfterPointLength = 0)]
[DefaultValue("")]
[SacDescription("ContractMultiplier", "合约乘数", "36", true, "整数;")]
public string ContractMultiplier { get; set; }
///
/// 名义本金(元)
/// 长度:36,2
/// 必填:是
/// 说明:∑标的持仓数量∗合约乘数∗期初价格
///
[CheckStringIntLength(BeforePointMaxLength = 36, AfterPointLength = 2)]
[DefaultValue("")]
[SacDescription("NotinalPrincipleAmt", "名义本金(元)", "36,2", true, "∑标的持仓数量∗合约乘数∗期初价格;")]
public string NotinalPrincipleAmt { get; set; }
///
/// 空白1
///
[DefaultValue("")]
[SacDescription("Blank1", "空白1", "", false, "")]
public string Blank1 { get; set; }
///
/// 空白2
///
[DefaultValue("")]
[SacDescription("Blank2", "空白2", "", false, "")]
public string Blank2 { get; set; }
[XmlIgnore]
[DefaultValue("")]
[SacDescription("ConfirmationNo", "交易确认书编号", "100", false, "")]
public string ConfirmationNo { get; set; }
}
}