Aeon 7.0.1829
Released August 17, 2026. Billing accuracy and desktop-client parity, faster queue setup, and safer role updates
Highlights​
- Find queues faster in the Customization Manager. The Queues page now has a search box (matching queue names, display names, menu groups, and — for numeric searches — Queue IDs and state codes) and a sort control (menu group, name, Queue ID, or state code). Each queue also shows its Queue ID and state code, matching the desktop client, so the numbers are at hand when building routing rules.
- Implementation field lists can render as tables. Module steps that collect per-field settings (Database Field, Field Label, Show on Form, Required) can now render as a real table — one row per field with column headers — instead of dozens of stacked cards.
- Implementation modules can write Field Customizations. Module authors can collect a per-field label alongside other per-field settings and have relabeled fields written to the staff web client's Field Customizations when the module is applied — setting a name back to its default removes the customization.
Fixes​
- Printed invoices now charge tax at the correct rate. The print pipeline read the stored tax rate as a percent instead of a fraction, so printed invoices and statements billed tax at one hundredth of the real rate (a $110.00 charge printed as $100.10) — and skipped the round-to-cents every other total applies. Printed, emailed, and on-screen amounts now all use one shared formula.
- Billing prices against the right category. Proxy requests now resolve the researcher's billing category (activity first, then researcher, then the requesting user — matching the desktop client), and the fallback for uncategorized users is "Default" instead of the nonexistent "global". Estimates only match defaults from the request's own category, and large fee schedules are no longer silently cut off in the Billing tab or the Billing Defaults editor.
- Payment amounts are now validated. Zero-amount payments are rejected, and saving a payment larger than the balance due asks for confirmation first — an overpayment clears the balance and can route the order onward automatically. Negative amounts remain allowed for recording refunds.
- Refunds are recorded as negative payments, and the payment form now says so. A note under the Amount field explains that entering a negative amount records a refund. Sites that want a self-describing entry can add a
Refundvalue to the PaymentMethod dropdown in the Customization Manager. - Billing tab — tax rates display exactly as stored: 7.25% no longer shows as 7.2% on the charge line or as 7.249999999999999 in the edit panel.
- Billing tab — the charge panel's live subtotal and Default estimates now round exactly like the saved charge, so the preview can no longer disagree with the charge line by a cent.
- Billing tab — payment and invoice dates no longer display one day early in timezones behind UTC; the tab now shows the same date as the printed invoice.
- Billing parity corrections. A per-page charge on a request with zero pages now estimates the base fee alone instead of billing one unit, editing an existing payment no longer overwrites its reference when you pick the Billing Account method, and the Billing Defaults tax-rate editor stores exactly the rate it displays. Newly inserted Billing Charges tables in the print designer fit their column widths again.
- Invoice updates keep their history honest. Updating an invoice no longer rewrites the invoice date on charges that were already billed — only newly added charges get stamped, matching the desktop client. The billing context of an invoiced charge is locked (it ties the line to the request field that generated it), and the zero-balance auto-route now runs after payment edits and deletions too, not just when a payment is first added.
- Custom routing rules apply to billing transitions again. Generating an invoice and clearing a balance with a payment now run the site's routing rules, the way the desktop client did, so a rule that redirects those requests takes effect. The reported queue is the one the request actually landed in.
- Billing Defaults "update requests" and account deletion behave predictably. Renaming a billing type now also updates requests that carry uninvoiced estimate charges (and renames those estimates to match); only truly invoiced requests are left alone. The Billing Accounts delete button is shown only to staff whose role can actually delete (Billing: Full) instead of failing after the confirmation dialog.
- Invoices can't be generated for anonymized users. The guard now checks the user's anonymized state the way the desktop client did, instead of relying on the username being blank.
- Requests with a linked billing account offer it as a payment method. Choosing "Billing Account" fills the payment reference with the account ID automatically, matching the desktop client.
- Global service packages appear in every request's Apply Package menu. Packages in the Global category apply under any billing category, but the menu only listed exact category matches, so categorized requests never saw them. This matches the desktop client's package menu.
- Fresh installs auto-process zero-balance invoices like upgraded sites. The
AutoProcessZeroBalanceInvoiceskey is now seeded to Yes on new installations, matching the v6 default — generating a $0 invoice routes the order straight to Awaiting Item Delivery instead of stopping for staff approval. - The default invoice template now prints a Base Fee column. Charges priced with a base fee used to print an amount the reader couldn't arrive at from the columns shown (e.g. "Qty 1, Unit Fee $0.00, Amount $50.00"). Already-installed copies of the default template gain the column automatically; templates you have edited are left untouched.
- The print designer no longer offers an Invoice Number field. Aeon has never assigned invoice numbers — in v6 and v7 alike, an invoice is the set of dated charges on a request — so the field always printed blank. Existing templates that placed it keep working and simply continue to render nothing there.
- Estimate cards no longer offer edit and delete controls to Billing View-only roles. The automatic estimate lines showed working-looking pencil/trash icons and an edit panel to read-only accounts, then silently failed to save. They now follow the same capability gate as the rest of the Billing tab.
- Dismissing an automatic estimate now sticks. Removing an estimate line from the Billing tab used to be undone by simply switching tabs and coming back. A dismissal now lasts for as long as the request stays open, and clears when Format, Service Level, or Shipping Option changes (the estimate is recalculated for the new value).
- Billing edits now show up in the request History. Adding, editing, or deleting a charge and editing or deleting a payment each write a History entry with the amounts involved. The "Invoice deleted" and "Applied service package" entries, which were being silently discarded, are now recorded too.
- Billing tab — the charge or payment currently open in the edit panel is now highlighted in the list, so it's clear which item is being edited.
- Billing changes show up live for other staff. Adding or editing charges and payments, generating or deleting an invoice, and applying a service package now notify anyone else viewing the same request, the way routing and photoduplication actions already did.
- Billing display polish. Totals no longer show "NaN" for roles with restricted money fields, and the Billing Defaults tax-rate editor preserves rates finer than 0.01% instead of silently rounding them.
- Updating a role no longer clears capabilities it wasn't asked to change. An update that set only some of a role's capabilities could silently reset all the others back to no access — including the Roles & Permissions access that the last-administrator safeguards exist to protect. A role update now changes only the capabilities it names: with
PATCH /api/v2/roles/{id}, capabilities you leave out of the request keep their current value, and you revoke one by naming it explicitly —nonefor an operational capability,falsefor a configuration one, ornullfor a layout assignment. An integration that removed a capability by omitting it will no longer remove it, so check any scripts that manage roles. Roles already affected are not repaired automatically, because the access levels they held beforehand are not recoverable — if any of your roles have been updated through the API, check each one against what it should grant. - Custom Dropdown groups can now be deleted. In the Customization Manager, deleting a group removes it and all of its entries in one step. Groups Aeon manages itself (Status, ReadingRoom, PaymentMethod, activity and reading-room location groups) and groups backing a custom field don't offer group deletion; their individual entries stay editable as before.
- Deleting a dropdown group is now all-or-nothing, and system groups are protected everywhere. Removing a group used to delete its entries one at a time, so an interruption could leave the group half-removed; it is now a single operation that either completes or changes nothing. Groups Aeon itself relies on — Status, Department, Reading Room, the Locations and Activity Status families, and any group holding a custom field's options — are now refused by the server as well as hidden in the staff client, so they can no longer be removed through the API. Editing or removing individual entries inside those groups is unchanged.
- The routing rules list is easier to scan and reorganize. Rule cards now start collapsed, showing just the description, rule number, status, and queue flow; expand a card to see its match condition, or use the new Expand All / Collapse All buttons.
- Routing rules can now be activated or deactivated with one click. Each rule card (and its right-click menu) has an Activate/Deactivate button, so you no longer have to open the rule for editing just to flip it on or off.
- The Queues screen now groups menu groups the same way the rest of Aeon does. Menu Group is free text, so
Referenceandreferenceare one group everywhere staff route requests — but the Queues screen listed them as two, with separate headings and separate filter options that each matched only one spelling. It now uses the same grouping as the route menus, so a group appears once and its filter matches every queue in it. Each queue still shows its own stored spelling. - The Customization Manager command palette's keyboard hints now match what the keys do. The arrow-key and Enter hints appear only when there are results to navigate, and the Return to Workspace row no longer shows a shortcut that never worked.
- The default callslip template now shows its optional fields when they have a value. The seeded Default Callslip had its show/hide conditions inverted, so Requested for, Special Request, Volume/Box, Issue, Date, Reference No., and Item No. were hidden exactly when the request had something to print there. Already-installed, unmodified copies of the default template are repaired automatically; a template you have edited in any way is left untouched.
- Implementation reports and previews show grouped per-item settings correctly. The downloadable module report and the Apply preview previously rendered a blank column of "(empty)" cells for repeater fields grouped in a row layout, and the print view labeled items "Item 1, 2, 3…" instead of naming them. Both now show the real values and item names.
- Cancel Photoduplication is now a one-click toolbar button. It appears on the request toolbar once photoduplication is initialized, and has moved out of the Photoduplication dropdown menu.
- The Sign In User dialog now pre-selects the reading room. It picks the only configured room, or the room and location last used in this browser, instead of requiring a selection every time — and a new "No location" option makes signing in without a seat an explicit, remembered choice.
- Reading room history times now display in the reading room's timezone. Sign-in and sign-out times on the user History tab were shown as raw UTC; they now convert to the room's configured timezone and label the timezone with the time (e.g. "3:36 PM EDT").
- Appointment times now show their timezone with the time. The Appointments tab on a user record displayed a bare abbreviation like "EDT" floating in the card corner, which read ambiguously; the abbreviation now appears inline after the time range instead.