Price Matrix¶
The price matrix shows device types as rows and price groups as columns. Each cell holds the price that price resolution would return on a chosen reference date.
Route: /price/matrix · Permission: price_view
Why¶
The price list answers "which prices exist?". It does not answer "where is one missing?". That second question is the expensive one in practice: for a device type without a price in the customer's group, the order position silently stays at 0.00 and only surfaces at invoicing time.
The matrix makes those gaps visible. Empty cells are colour-marked, and above the table a counter states how many cells of the current page are filled.
Controls¶
| Control | Effect |
|---|---|
| Reference date | The matrix shows the prices valid on that day |
| Complexity | Narrows to one effort level; "All" ignores the field |
| Device type | Full-text search across the type name |
| Device category | Narrows the rows to one or more device categories |
Device category is not price group
The device category is the technical grouping of the device ("pressure gauges"), the same one the inventory uses. It sits on the row axis. The price group forms the columns, and the price class is the pricing container of the device axis — three different things with similar names.
The reference date is more than cosmetics: prices with a validity period change visibly with it. A look at 1 January shows whether the new price round is complete before it takes effect.
Editing cells¶
Clicking a cell opens the price dialog — editing for a filled cell, creating for an empty one. Device type and price group are already set; if a complexity is filtered, it is carried over.
That is the actual time saved compared to the list: adding a missing price there means looking up the device type and price group by hand.
Editing requires price_edit. Without it the matrix is read-only.
Scale¶
The matrix paginates over device types; price groups form all columns. With many groups the table scrolls horizontally while the device type column stays in place.
API¶
Response:
{
"data": {
"categories": [{ "id": "…", "name": "Standard" }],
"rows": [
{
"type_id": "…",
"type_name": "Fluke 87V",
"cells": {
"<price-group-id>": {
"price_id": "…",
"price": 120.0,
"tax": 19.0,
"unit": "EA",
"complexity": null,
"start_date": null,
"end_date": null
}
}
}
]
},
"meta": {
"total": 120,
"page": 1,
"per_page": 25,
"covered_cells": 18,
"total_cells": 50
}
}
A key under cells exists only where a price applies. A missing key is the
gap — there is no null value that would need interpreting first.
Cells are resolved server-side through the same price resolution an order position uses, so matrix and order cannot drift apart.