扩展出口控制规则功能

本文提供的信息对于扩展规则功能以实现出口控制的开发人员非常有用。

规则主要被定义为 msdyn_exportcontroljurisdictionmsdyn_exportcontrolrulemsdyn_exportcontrollicense 表中的数据。

高级流

评估按文档行执行。 结果是为每一行提供一组匹配的限制、例外和适用的许可证。 如果没有发现限制,则例外和许可集合为空。

不执行文档级检查。 相反,如果存在没有匹配例外的任何限制,则文档被视为被阻止。 以下伪代码显示了如何考虑限制、例外和许可。

foreach (Line in Request)
{
    Line.MatchingRestrictions = FindAnyMatchingRestrictions(Line);

    foreach (MatchingRestriction in Line.MatchingRestrictions)
    {
        Line.MatchingExceptions = FindAnyMatchingExceptions(Line);

        foreach (MatchingException in Line.MatchingExceptions)
        {
            if (MatchingException.RequireLicense)
            {
                Line.ApplicableLincenses = FindApplicableLicenses(Line);
            }
        }
    }
}

单个规则的评估

msdyn_exportcontrolrule 表中有信息字段,如销售目的地国家/地区、收货目的地国家/地区、de minimis 阈值和交易目的。 如果未设置字段,则对规则评估没有影响。 行中的值必须与设置了值的所有规则匹配。 否则,该规则不适用。

例如,行具有以下值:

  • 销往国家/地区:法国
  • 发往国家/地区:墨西哥
  • 交易目的:退货
  • 最低限度阈值:28%

规则示例 1

规则具有以下值:

  • 销往国家/地区: 空白
  • 发往国家/地区:墨西哥、加拿大
  • 交易目的: 空白
  • 最低限度阈值:25%

在这种情况下,仅评估收货目的地国家/地区和 de minimis 值。 由于收货目的地国家/地区墨西哥位于该规则提供的值列表中,并且 28% 大于该规则提供的 25% 阈值,因此该规则被评估为 true

规则示例 2

规则具有以下值:

  • 销售到国家/地区:意大利
  • 发往国家/地区:墨西哥、加拿大
  • 交易目的: 空白
  • 最低限度阈值: 空白

在这种情况下,仅评估销售目的地国家/地区和收货目的地国家/地区值。 由于销售目的地国家/地区法国不在该规则提供的值列表中,因此该规则被评估为 false

仅当行中的出口管制分类编号 (ECCN) 是规则中明确列出的代码之一,或者 ECCN 是规则中某个类别的一部分时,规则才适用。 标记为适用于所有代码的规则会自动评估为 true,而不考虑行中包含的 ECCN。

只有在找到一个或多个与该行匹配的许可证时,标记为需要许可证的例外规则才会被评估为 true

许可证评估也是如此。 验证过程中会忽略留空的字段。 如果某个字段有值(也就是说,它不为空),则被测试的物料必须与该字段中的某个值相匹配。 只有当所有字段都评估为 true 时,总体评估才为 true

Power Fx 公式

Microsoft Power Fx 公式能够为不是简单引用国家/地区或用途的应用场景来表达复杂的规则。 与规则的其他字段一样,如果没有提供 Power Fx 公式,则对规则评估没有影响。 被评估的文档对象传递给规则,并可在公式中用于比较。

以下是一些用于出口控制的 Power Fx 公式的例子。 有关更多信息,请参阅公式参考

  • 运送到以下三个国家/地区之一的文档:

    CountRows(Filter(["NOR","SWE","FIN"], Value=Document.SellToCountryRegion)) > 0

  • 运送到三个国家/地区之一且在美国出口管理条例 (EAR) 管辖范围内包含至少一种 6A994 产品的文档:

    And(CountRows(Filter(["NOR","SWE","FIN"], Value=Document.SellToCountryRegion)) > 0, CountIf(Document.Lines, CountIf(Codes, And(Jurisdiction="EAR",Code="6A994")) > 0) > 0)

  • 在特定日期之后且每行包含的物料不超过五个的文档:

    And(Document.DocumentDate > Date(2023, 12, 1), CountIf(Document.Lines, Quantity > 5) = 0)

覆盖

可以在行代码层覆盖出口控制检查。 因此,您可以在文档的一行上改写某个辖区的失败出口控制检查,但仍在其他行上实施检查。 若要覆盖出口控制检查,请将 "msdyn_overridden": true 作为 msdyn_CheckExportControlLineCodes 集合中某个行代码的属性进行传递。 仍然会评估出口检查,并且仍然会显示任何信息性或警告性消息。 但是,任何错误消息都会降级为警告消息,不会阻止活动。