using System.IO.Compression;
using System.Text;
using Newtonsoft.Json.Linq;
using YLErp.Office.Converters;
namespace YLErp.PluginTests
{
///
/// 国联确认书模板协议段勾选框占位符化后的渲染验证:
/// 客户开户维护的主协议类型(client_meta.MainProtocolType,1=NAFMII,其余 SAC)
/// 决定协议段 ☑/□ 勾选位置,模板不再依赖 Wingdings 2 硬编码复选框。
///
[TestClass]
public class TestGuoLianConfirmTemplate
{
private static string TemplatePath =>
Path.Combine(AppContext.BaseDirectory, "..\\..\\..\\..\\Plugins\\YLErp.Plugins.GuoLian\\App_Docs\\contract_template",
"国联民生-收益互换交易确认书-境内模板-【客户看多】-【现券】-清洁版.docx");
private static string OutputDir => Path.Combine(AppContext.BaseDirectory, "TestOutputs");
private static JsonVarDic BuildVarDic(bool isNafmii)
{
var varDic = new JsonVarDic();
varDic.SetVar("合同编号", "GL-20260827-001");
varDic.SetVar("客户名称", "测试客户");
varDic.SetVar("主协议编号", "GL-ZU-2026-001");
varDic.SetVar("补充协议编号", "GL-BC-2026-001");
static string Check(bool on) => on ? "☑" : "□";
varDic.SetVar("主协议SAC勾选", Check(!isNafmii));
varDic.SetVar("主协议NAFMII勾选", Check(isNafmii));
varDic.SetVar("补充协议SAC勾选", Check(!isNafmii));
varDic.SetVar("补充协议NAFMII勾选", Check(isNafmii));
varDic.SetVar("协会证券业勾选", "□");
varDic.SetVar("协会交易商勾选", "□");
varDic.SetVar("定义文件商品勾选", "□");
varDic.SetVar("定义文件利率勾选", "□");
varDic.SetVar("定义文件债券勾选", "□");
// 利率类型勾选框(同模板内另一处 ☑/□ 占位符),一并驱动以便预览完整
varDic.SetVar("IsFixed", isNafmii ? "□" : "☑");
varDic.SetVar("IsFloat", isNafmii ? "☑" : "□");
return varDic;
}
private static string RenderAndReadBody(bool isNafmii, string fileName)
{
Directory.CreateDirectory(OutputDir);
var targetPath = Path.Combine(OutputDir, fileName);
OfficeFileConverter.ConvertByUsingDocTemplate(TemplatePath, targetPath, BuildVarDic(isNafmii));
using var zip = ZipFile.OpenRead(targetPath);
var entry = zip.GetEntry("word/document.xml");
using var stream = entry.Open();
using var reader = new StreamReader(stream, Encoding.UTF8);
var xml = reader.ReadToEnd();
// 勾选框与协议名称分属不同 run,断言前拼接纯文本
var plainText = new StringBuilder();
foreach (System.Text.RegularExpressions.Match m in System.Text.RegularExpressions.Regex.Matches(xml, @"]*>(.*?)"))
{
plainText.Append(m.Groups[1].Value);
}
return plainText.ToString();
}
[TestMethod("测试-国联确认书-SAC客户协议段勾选")]
public void TestSacAgreementChecked()
{
var body = RenderAndReadBody(isNafmii: false, "guolian_confirm_sac.docx");
Assert.IsTrue(body.Contains("☑《中国证券期货市场衍生品交易主协议》/"), "SAC 客户主协议应勾选 SAC");
Assert.IsTrue(body.Contains("□《中国银行间市场金融衍生产品交易主协议(2009年版)》"), "SAC 客户主协议不应勾选 NAFMII");
Assert.IsTrue(body.Contains("☑《中国证券期货市场衍生品交易主协议》补充协议"), "SAC 客户补充协议应勾选 SAC");
Assert.IsFalse(body.Contains("{{主协议SAC勾选}}"), "协议段占位符应全部被替换");
}
[TestMethod("测试-国联确认书-NAFMII客户协议段勾选")]
public void TestNafmiiAgreementChecked()
{
var body = RenderAndReadBody(isNafmii: true, "guolian_confirm_nafmii.docx");
Assert.IsTrue(body.Contains("□《中国证券期货市场衍生品交易主协议》/"), "NAFMII 客户主协议不应勾选 SAC");
Assert.IsTrue(body.Contains("☑《中国银行间市场金融衍生产品交易主协议(2009年版)》"), "NAFMII 客户主协议应勾选 NAFMII");
Assert.IsTrue(body.Contains("☑《中国银行间市场金融衍生产品交易主协议(2009年版)补充协议》"), "NAFMII 客户补充协议应勾选 NAFMII");
Assert.IsFalse(body.Contains("{{主协议NAFMII勾选}}"), "协议段占位符应全部被替换");
}
}
}