SIGNALS Documentation
API Reference

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.