# create_rate_modifiers

Create one or more catalog rate modifier rules in parallel. Each rule requires `buildingId`, `name`, plus a
`match` object (tagged union on `type`: `FLOOR` / `FLOOR_SIZE` / `ZONE` / `ORIENTATION` — set only the matching
branch payload) and an `adjustment` object (tagged union on `type`: `PERCENTAGE` → `percentage` delta, or
`FLAT` → `flat` cash amount). Partial failures do not abort the rest.

<!-- INPUT_BLOCK_START -->

## Input

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `rateModifiers` | `CreateRateModifierInput[]` | Yes | Array of rate modifier rules to create - [CreateRateModifierInput](#createratemodifierinput) |

### CreateRateModifierInput

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `buildingId` | `string` | Yes | The ID of the building the rule applies to |
| `name` | `string` | Yes | Human-readable name (max 150 characters) |
| `match` | `MatchCriteria` | Yes | [MatchCriteria](#matchcriteria) |
| `adjustment` | `RateAdjustment` | Yes | [RateAdjustment](#rateadjustment) |
| `enabled` | `boolean` | No | Whether the rule is enabled. Defaults to true. |
| `effectiveFrom` | `string` | No | Optional ISO-8601 start of the effective window |
| `effectiveTo` | `string` | No | Optional ISO-8601 end of the effective window |

### 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 -->
