Optionaldescription?: stringOptionaleffectiveFrom?: InstantWhen this version becomes effective. Defaults to now() at the DB
layer when omitted. Pass a future Temporal.Instant to schedule a
change.
Optionallabel?: stringOptionalmatcher?: MatcherTS-side symmetric evaluation of activation rules for a single route.
Thin wrapper: search() fetches every rule visible to this customer
(admin-global, admin-for-this-customer, customer-tier), then the shared
pickWinningRule picker applies the same precedence as the SQL
CTE in ProductRouteService.search().
Returns null when no rule matches; the caller treats that as
"NO_MATCHING_RULES" and inherits whatever default the route surface uses
(typically: APPROVE if the route itself matches, else INACTIVE).
The pure picker is also exported as pickWinningRule for callers who want to simulate against a hypothetical rule set without writing.
Returns activation rules visible to this customer:
customerId IS NULL)type='ADMIN', customerId=input.customerId)type='CUSTOMER', customerId=input.customerId)Pass types: ["CUSTOMER"] from a controller to restrict to the customer's
own writable slice. Write paths (create/update/delete) always operate
on the CUSTOMER slice regardless of this filter.
Customer-tier CRUD over
product_activation_rule. Always operates on thetype='CUSTOMER'slice. Customer rules can only opt the customer OUT of routes (value: "DENY") — opting back in is reserved for admin tier (CUSTOMER_CANNOT_ACTIVATEon bothcreate()andupdate()).Identity / version split: see ProductActivationRuleAdminService for the full description.
Internal admins must use
ProductActivationRuleAdminServiceinstead.