Skip to content

feat: add insurance dynamic rule migration (surcharge + underwriting)#114

Open
cottonandcolor wants to merge 6 commits into
salesforcecli:mainfrom
cottonandcolor:feat/insurance-dynamic-rule-migration
Open

feat: add insurance dynamic rule migration (surcharge + underwriting)#114
cottonandcolor wants to merge 6 commits into
salesforcecli:mainfrom
cottonandcolor:feat/insurance-dynamic-rule-migration

Conversation

@cottonandcolor
Copy link
Copy Markdown

Summary

Adds two new commands to convert Insurance BRE dynamic rules to CML eligibility constraints:

  • sf cml convert surcharge-rules — reads ProductSurcharge.RuleDefinition from org or JSON file
  • sf cml convert underwriting-rules — reads UnderwritingRule.DynamicRuleDefinition from org or JSON file

Both convert ruleCriteria conditions into CML boolean constraints (eligibility-only, no actions), outputting .cml, _Associations.csv, and _RuleKeyMapping.json files. Import uses the existing sf cml import as-expression-set command.

Files added

  • src/shared/insurance-rule-converter.ts — shared criteria→constraint conversion, product code resolution
  • src/commands/cml/convert/surcharge-rules.ts — surcharge command
  • src/commands/cml/convert/underwriting-rules.ts — underwriting command
  • messages/cml.convert.surcharge-rules.md — help text
  • messages/cml.convert.underwriting-rules.md — help text
  • command-snapshot.json — updated with new commands

Context

Insurance dynamic rules (surcharge/underwriting) use the same ruleCriteria schema as Configurator rules but are stored on different entities (ProductSurcharge.RuleDefinition, UnderwritingRule.DynamicRuleDefinition) and are eligibility-only (pass/fail, no actions like AutoAdd/SetAttribute). The Insurance-Chewbacca team is adding CML support for surcharges in Core (W-21817142).

Example output

constraint Auto_WA_Tax = (product.id == "01tSB000004V4KLYA0" && Colour == "Red",
    "Surcharge eligibility: Auto_WA_Tax");

constraint DriverAccidentsLT2AndAutoConditionGood = (
    (product.id == "01tSB000004V4KpYAK" && Driver_Accident_Points < 2) ||
    (product.id == "01tSB000004V4KLYA0" && Auto_Value > 25000),
    "Underwriting eligibility: DriverAccidentsLT2AndAutoConditionGood");

Test plan

  • Tested sf cml convert surcharge-rules against live org (6 rules converted)
  • Tested sf cml convert underwriting-rules against live org (9 rules converted)
  • Handles Attribute-type and Tag-type conditions (e.g., UserProfile)
  • Resolves product codes from org when available, falls back to product IDs
  • yarn build passes (lint + compile + snapshot)
  • Import via sf cml import as-expression-set on a 264+ org with RuleEngineType field

… underwriting

Add two new commands to convert Insurance BRE dynamic rules to CML:
- `sf cml convert surcharge-rules` reads ProductSurcharge.RuleDefinition
- `sf cml convert underwriting-rules` reads UnderwritingRule.DynamicRuleDefinition

Both convert eligibility-only ruleCriteria into CML boolean constraints,
generate .cml files, association CSVs, and RuleKey mapping JSON.

Shared conversion logic extracted into insurance-rule-converter.ts.
Tested against a live org with 6 surcharge and 9 underwriting rules.
- Type-aware condition dispatch: use attributeName for Attribute type,
  contextTagName for Tag type (prevents SalesTransactionItemAttribute sentinel leak)
- Proper In/NotIn: expand multi-value to OR'd equality checks
- Contains/DoesNotContain: use strcontain() CML function
- criteriaExpressionType: respect ALL (AND) vs default OR between criteria
- attributeId: pass through to CmlAttribute for dual-lookup resolution
- Picklist dataType: map to string in CML
- collectAttributes: preserve attributeId and proper CML data type per attribute
- rootObjectId: prefer per-criteria rootObjectId over record ProductPath
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants