Rate specifications
Configure how catalogue items are priced over time using composable rate specifications, calculation strategies, and modifiers.
Overview
A rate specification describes how a charge is calculated over a rental window — it does not hold a price itself. Prices live on catalogue item rates, which attach a rate specification (and an amount) to a catalogue item. This separation lets one definition such as "Daily Rate" drive pricing for thousands of catalogue items, each at its own price.
Every rate specification is composed from three parts:
| Part | Description |
|---|---|
| Calculation strategy | How elapsed time becomes chargeable units — period-based, fixed, or hybrid |
| Base period | The granularity of a chargeable unit (half-hourly, hourly, daily, weekly, monthly) |
| Modifiers | Optional adjustments applied after the base charge — duration multipliers and quantity factors |
Signals ships 11 presets that replicate common industry rate engine types so migrating users see familiar names. Presets are just pre-filled, fully-editable configurations — there is no special preset behaviour beyond a starting point.
Note: rate specifications are managed in the admin settings area, not the main catalogue. They are configuration intended for a small number of administrators, not a daily tool. Assigning rates to individual catalogue items happens on the catalogue item detail page.
Calculation Strategies
| Strategy | Behaviour | Base period |
|---|---|---|
| Period-based | Charges the unit price for each chargeable unit in the rental window | Required (any) |
| Fixed | A single flat charge regardless of duration | None |
| Hybrid | A fixed charge for an initial number of units, then a per-unit charge thereafter | Required (daily, weekly, monthly) |
Base Periods
A base period defines the length of one chargeable unit.
| Period | Unit length |
|---|---|
| Half-Hourly | 30 minutes |
| Hourly | 60 minutes |
| Daily | 1 day |
| Weekly | 7 days |
| Monthly | 30 days |
Note: Monthly is simplified to a fixed 30-day month in this version; calendar-month length is a planned refinement. Half-hourly and hourly periods are measured against the wall clock, while daily and longer periods are counted as whole calendar days.
Modifiers
Modifiers adjust the base charge after units are counted. They are applied in priority order: multipliers first, then factors.
| Modifier | Configuration | Effect |
|---|---|---|
| Multiplier | A tiers table of decimal multipliers, one row per period position |
Scales the unit price by tier as the rental lengthens. The last row inherits forward, so longer rentals keep the final tier's multiplier |
| Factor | A ranges table of {from, to, factor} rows |
Scales the per-unit subtotal based on the order quantity. An open-ended final range (to = null) covers everything above |
Multiplier tiers and factor ranges are stored as decimal strings to preserve precision; the engine performs all intermediate arithmetic losslessly and rounds only at final assembly.
Time Options
Period and hybrid strategies expose options that refine how elapsed time is counted:
| Option | Description |
|---|---|
| Day type | Count elapsed clock time, or only minutes within configured business hours |
| Business hours | Daily start/end times used when day type is Business Hours |
| Rental days per week | Treats a "week" as this many chargeable days (e.g. a 5-day working week) |
| Leeway minutes | Grace period before an extra unit is charged |
| First day cutoff | A pickup later than this time still bills the first day in full |
| Last day cutoff | A return earlier than this time drops the final partial day |
Presets
| Preset | Strategy | Base period | Modifiers |
|---|---|---|---|
| Daily Rate | Period-based | Daily | — |
| Daily Multiplier and Factor | Period-based | Daily | Multiplier, Factor |
| Hourly Rate | Period-based | Hourly | — |
| Hourly Multiplier and Factor | Period-based | Hourly | Multiplier, Factor |
| Half Hourly Rate | Period-based | Half-Hourly | — |
| Weekly Rate | Period-based | Weekly | — |
| Monthly Rate | Period-based | Monthly | — |
| Monthly Multiplier and Factor | Period-based | Monthly | Multiplier, Factor |
| Fixed Rate | Fixed | — | — |
| Fixed Rate and Factor | Fixed | — | Factor |
| Fixed Rate and Subs Days | Hybrid | Daily | — |
Presets are seeded on install. They can also be re-seeded from Admin → Database Seeders.
Rate specifications Admin
Route: /admin/settings/rate-specifications
Browse all rate specifications in a table that distinguishes presets from custom definitions and shows how many catalogue item rates use each one.
- Presets are read-only starting points and cannot be deleted.
- Custom definitions can be edited and deleted (deletion is blocked while catalogue item rates still reference them).
Create / Edit
Route: /admin/settings/rate-specifications/create or /admin/settings/rate-specifications/{id}/edit
Creating a definition starts with a choice: pick a preset to pre-fill the form, or start From Scratch. The form is schema-driven — choosing a strategy constrains the available base periods, and enabling a modifier reveals its configuration table (tier or range rows you can add, remove, and reorder). Fields appear and hide based on other field values (for example, business-hours fields only show when day type is Business Hours).
Duplicate
Any definition — including a preset — can be duplicated to produce an editable custom copy named "{name} (Copy)".
Catalogue item rates
Route: /catalogue-items/{id}/rates
Each catalogue item has a Rates tab listing the rate assignments for that catalogue item. A catalogue item rate combines:
| Field | Description |
|---|---|
| rate specification | The calculation behaviour to apply |
| Transaction type | Rental, Sale, or Service |
| Unit price | The amount, in the rate's currency |
| Currency | ISO 4217 currency code |
| Warehouse | Optional warehouse scope (blank = all warehouses) |
| Valid from / to | Optional date window the rate applies within |
| Priority | Higher priority wins when multiple rates overlap |
Rates are added and edited on a dedicated form page (/catalogue-items/{id}/rates/create); removal uses a confirmation modal. When a saved rate overlaps another rate of the same priority, type, and date window, a non-blocking warning banner is shown — overlapping rates are allowed and resolved by priority at calculation time.
Permissions
rate specifications and catalogue item rates are governed by the rates.* permission group: rates.access, rates.view, rates.create, rates.edit, and rates.delete. The admin area additionally requires admin access. The corresponding API abilities are rates:read and rates:write.