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.
OptionalfixedFeeAmount?: BigNumberOptionallabel?: stringOptionalmatcher?: MatcherOptionalvariableFeeBps?: BigNumberTS-side symmetric evaluation of fee rules for a single route. Thin wrapper
over search() + the shared pickWinningRule picker — mirrors the
SQL CTE precedence in ProductRouteService.search().
Returns the winning rule's fee terms (or null if no rule matches). The
caller stacks this on top of the route's vendor-baseline fees.
Returns fee 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 always operate on the CUSTOMER slice
regardless of this filter.
Customer-tier CRUD over
product_fee_rule. Always operates on thetype='CUSTOMER'slice. Customer rules can only ADD markup (admin baseline stacks beneath); negativefixedFeeAmount/variableFeeBpsare rejected withINVALID_FEE_RULEon bothcreate()andupdate().Identity / version split: see ProductFeeRuleAdminService for the full description. Edits insert a new version row and re-point
currentVersionIdin one transaction.Internal admins must use
ProductFeeRuleAdminServiceinstead.