# update_rate_modifiers

Update one or more catalog rate modifier rules in parallel. Each item targets an existing rule by `id`. The
`match.type` branch (`FLOOR` / `FLOOR_SIZE` / `ZONE` / `ORIENTATION`) is immutable — repeat it and adjust the
matching branch payload. Optionally change `name`, `adjustment` (PERCENTAGE delta or FLAT cash), `enabled`, or the
effective window. Each update is reported per-rule; partial failures do not abort the rest.

<!-- INPUT_BLOCK_START -->

## Input

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `rateModifiers` | `UpdateRateModifierInput[]` | Yes | Array of rate modifier rules to update - [UpdateRateModifierInput](#updateratemodifierinput) |

### UpdateRateModifierInput

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | `string` | Yes | The ID of the rate modifier rule to update |
| `name` | `string` | No | New human-readable name (max 150 characters) |
| `match` | `MatchCriteria` | No | New match criteria (operator + values). Its `type` must match the existing rule attribute — the subclass is immutable post-create. - [MatchCriteria](#matchcriteria) |
| `adjustment` | `RateAdjustment` | No | New adjustment. Its `type` must match the existing rule kind (percentage / flat is immutable post-create). - [RateAdjustment](#rateadjustment) |
| `enabled` | `boolean` | No | Whether the rule is enabled |
| `effectiveFrom` | `string \| null` | No | ISO-8601 start of the effective window. Pass `null` to clear it. |
| `effectiveTo` | `string \| null` | No | ISO-8601 end of the effective window. Pass `null` to clear it. |

### MatchCriteria

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `type` | `RateModifierAttribute` | Yes | [RateModifierAttribute](#ratemodifierattribute) |
| `floor` | `FloorMatch` | No | [FloorMatch](#floormatch) |
| `floorSize` | `FloorSizeMatch` | No | [FloorSizeMatch](#floorsizematch) |
| `zone` | `ZoneMatch` | No | [ZoneMatch](#zonematch) |
| `orientation` | `OrientationMatch` | No | [OrientationMatch](#orientationmatch) |

### RateAdjustment

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `type` | `Type` | Yes | Discriminator selecting the adjustment arm. `PERCENTAGE` → set `percentage`; `FLAT` → set `flat`. - [Type](#type) |
| `percentage` | `PercentageAdjustment` | No | [PercentageAdjustment](#percentageadjustment) |
| `flat` | `FlatAdjustment` | No | [FlatAdjustment](#flatadjustment) |

### FloorMatch

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `operator` | `OrderedMatchOperator` | Yes | [OrderedMatchOperator](#orderedmatchoperator) |
| `floors` | `number[]` | Yes | Floor numbers the rule matches against. Scalar operators require exactly one value; IN/NIN require at least one. |

### FloorSizeMatch

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `operator` | `OrderedMatchOperator` | Yes | [OrderedMatchOperator](#orderedmatchoperator) |
| `floorSizes` | `number[]` | Yes | Floor sizes (in square metres) the rule matches against. Must be non-negative. |

### ZoneMatch

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `operator` | `IdentityMatchOperator` | Yes | [IdentityMatchOperator](#identitymatchoperator) |
| `zoneIds` | `string[]` | Yes | Zone IDs the rule matches against. All zones must belong to the rule's building. |

### OrientationMatch

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `operator` | `IdentityMatchOperator` | Yes | [IdentityMatchOperator](#identitymatchoperator) |
| `orientationIds` | `string[]` | Yes | Orientation IDs the rule matches against. All orientations must belong to the rule's building. |

### PercentageAdjustment

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `delta` | `number` | Yes | Multiplicative delta, e.g. 0.1 = +10%. Range -9.9999..9.9999. |

### FlatAdjustment

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `amount` | `unknown` | Yes | Signed money object (minor units + ISO 4217 currency). |

### RateModifierAttribute

| Value | Description |
| --- | --- |
| `FLOOR` | Rule matches against unit floors |
| `FLOOR_SIZE` | Rule matches against unit floor sizes (in square metres) |
| `ZONE` | Rule matches against unit zones |
| `ORIENTATION` | Rule matches against unit orientations |

### Type

| Value | Description |
| --- | --- |
| `PERCENTAGE` | Percentage delta applied to the base rate |
| `FLAT` | Fixed cash amount added to/subtracted from the base rate |

### OrderedMatchOperator

| Value | Description |
| --- | --- |
| `EQ` | Equal to |
| `NEQ` | Not equal to |
| `GT` | Greater than |
| `GTE` | Greater than or equal to |
| `LT` | Less than |
| `LTE` | Less than or equal to |
| `IN` | In the set of values |
| `NIN` | Not in the set of values |

### IdentityMatchOperator

| Value | Description |
| --- | --- |
| `EQ` | Equal to |
| `NEQ` | Not equal to |
| `IN` | In the set of values |
| `NIN` | Not in the set of values |

<!-- INPUT_BLOCK_END -->

<!-- OUTPUT_BLOCK_START -->

## Output

| Field | Type | Description |
| --- | --- | --- |
| `content` | `ContentItem[]` | Array of content items returned by the tool - [ContentItem](#contentitem) |
| `isError` | `boolean` | Whether the tool execution resulted in an error |

### ContentItem

| Field | Type | Description |
| --- | --- | --- |
| `type` | `'text'` | Content type (currently only 'text' is supported) |
| `text` | `string` | The text content to display |

<!-- OUTPUT_BLOCK_END -->
