Files
zszq-trs/UnitTestProject/Modules/TradeModule/DocGenerateModule/GuolianSwapConfirmBookScopeTest.cs
tengyufan b3484c3618 fix: 国联民生收益互换支持审批前生成交易确认书
- 仅国联民生收益互换支持在新增待确认、修改待确认、审批中生成交易确认书,期权、其他公司及其他交易状态保持原限制
- 交易确认书页面同步开放上述交易的“生成确认书”按钮,后端批量生成链路同步放开状态过滤
- 审批前生成仅校验客户、标的、初始持仓等模板必需核心数据;不以银行账户、联系人、保证金等非模板必填资料阻断
- 审批前已生成确认书的交易被修改时,使该交易原确认书关联失效,重新生成仍按原覆盖逻辑处理
- 审批拒绝时清理该交易审批前生成的确认书关联、OA 结果及用印队列;无其他有效引用时删除确认书数据,避免遗留无效确认书
- 保持原交易编号逻辑:自动生成和手工填写均不复用已拒绝交易编号
- 新增审批前适用范围、确认书关联及 OA 清理谓词专项单测
2026-07-30 11:10:48 +08:00

107 lines
4.5 KiB
C#

using YLErp.Configuration;
using YLErp.DBModels;
using YLErp.DBModels.Consts;
using YLErp.DBModels.Enums;
using YLErp.Modules.TradeModule.DocGenerateModule;
namespace YLErp.UnitTestProject.Modules.TradeModule.DocGenerateModule
{
[TestClass]
public class GuolianSwapConfirmBookScopeTest
{
[TestMethod]
public void IsPreApprovalTrade_AllAllowedStatuses_ReturnsTrue()
{
var statuses = new[]
{
ConsTrade.新增待确认,
ConsTrade.修改待确认,
ConsTrade.审批中
};
foreach (var status in statuses)
{
var trade = CreateTrade(status);
Assert.IsTrue(GuolianSwapConfirmBookScope.IsPreApprovalTrade(trade, CompanyEnum.国联), status);
}
}
[TestMethod]
public void IsPreApprovalTrade_NonGuolianSwapOrInvalidTrade_ReturnsFalse()
{
var confirmedSwap = CreateTrade(ConsTrade.确认成交);
var optionTrade = CreateTrade(ConsTrade.审批中, "香草期权");
var invalidSwap = CreateTrade(ConsTrade.审批中);
invalidSwap.ValidState = ConsGlobal.InValid;
Assert.IsFalse(GuolianSwapConfirmBookScope.IsPreApprovalTrade(confirmedSwap, CompanyEnum.国联));
Assert.IsFalse(GuolianSwapConfirmBookScope.IsPreApprovalTrade(optionTrade, CompanyEnum.国联));
Assert.IsFalse(GuolianSwapConfirmBookScope.IsPreApprovalTrade(CreateTrade(ConsTrade.审批中), CompanyEnum.国泰君安));
Assert.IsFalse(GuolianSwapConfirmBookScope.IsPreApprovalTrade(invalidSwap, CompanyEnum.国联));
}
[TestMethod]
public void OtherActiveReferencePredicate_OnlyMatchesOtherActiveTrade()
{
const string contractCode = "GLMS-TEST-20260728-FICC-04-000001";
var predicate = GuolianSwapConfirmBookCleanupService
.BuildOtherActiveReferencePredicate(contractCode, 4)
.Compile();
Assert.IsFalse(predicate(CreateRelation(4, contractCode, ContractTypeEnum.Trade, true)));
Assert.IsTrue(predicate(CreateRelation(7, contractCode, ContractTypeEnum.Trade, true)));
Assert.IsFalse(predicate(CreateRelation(7, contractCode, ContractTypeEnum.Trade, false)));
Assert.IsFalse(predicate(CreateRelation(7, "OTHER", ContractTypeEnum.Trade, true)));
Assert.IsFalse(predicate(CreateRelation(7, contractCode, ContractTypeEnum.Clearing, true)));
}
[TestMethod]
public void TradeConfirmationRelationPredicate_MatchesActiveAndInactiveRelations()
{
const string contractCode = "GLMS-TEST-20260728-FICC-04-000001";
var predicate = GuolianSwapConfirmBookCleanupService
.BuildTradeConfirmationRelationPredicate(4)
.Compile();
Assert.IsTrue(predicate(CreateRelation(4, contractCode, ContractTypeEnum.Trade, true)));
Assert.IsTrue(predicate(CreateRelation(4, contractCode, ContractTypeEnum.Trade, false)));
Assert.IsFalse(predicate(CreateRelation(7, contractCode, ContractTypeEnum.Trade, true)));
Assert.IsFalse(predicate(CreateRelation(4, contractCode, ContractTypeEnum.Clearing, true)));
}
[TestMethod]
public void ActiveOaResultPredicate_OnlyMatchesRejectedTradeActiveResult()
{
var predicate = GuolianSwapConfirmBookCleanupService
.BuildActiveOaResultPredicate(4)
.Compile();
Assert.IsTrue(predicate(new trade_contract_oa_result { trade_id = 4, is_valid = true }));
Assert.IsFalse(predicate(new trade_contract_oa_result { trade_id = 4, is_valid = false }));
Assert.IsFalse(predicate(new trade_contract_oa_result { trade_id = 7, is_valid = true }));
}
private static trade CreateTrade(string status, string tradeType = "收益互换")
{
return new trade
{
TradeType = tradeType,
TradeStatus = status,
ValidState = ConsGlobal.Valid
};
}
private static trade_contract_r CreateRelation(int tradeId, string contractCode, string type, bool isValid)
{
return new trade_contract_r
{
TradeId = tradeId,
ContractCode = contractCode,
Type = type,
IsValid = isValid
};
}
}
}