RentWorks+ Release Notes
The article contains all RentWorks+ release notes as of June 24, 2026
1.9.80 Latest June 24, 2026
Added
- Search — Global search bar: A search bar is now available on every page (focus it with Cmd/Ctrl+K) and finds reservations, rental agreements, vehicles and customers, with matching records shown first ahead of links to modules, settings and quick actions. Super Admins get the same bar with live tenant lookup that opens a tenant's 360 page.
- Transaction Numbers — Multiple active number ranges: You can now keep more than one transaction number range active per record type and location, as long as their date windows don't overlap. When a new range starts while an open-ended range is still running, the old range is closed automatically the day before the new one begins, so year-end and fiscal-period changeovers no longer need a manual switch at midnight. A range whose dates fully overlap an existing fixed-date range is still blocked.
Changed
- Reservations — Planner booking actions: The always-visible three-dot button on planner booking blocks has been removed; the same booking actions are still available by right-clicking the block.
Fixed
- Contracts — Change History records charge edits: Adding, removing or editing a misc charge through Edit / Modify on a rental agreement now appears in the History tab, attributed to the user with a timestamp. Previously these saves updated the total but left no audit-trail entry.
- Rates — Vehicle License Fee per-day rate: The editable misc-charges table now shows the real Vehicle License Fee per-day rate instead of $0.00, and the billed amount is rounded to the nearest cent so it matches the rate shown times the number of days. Previously the fee could be over-collected by a cent a day and could flip to $0.00 on every other save.
- Maintenance — Repair Order creation reliability: A repair order now saves with the correct status — Completed when a close date is set, otherwise Open — and no longer gets stuck on a "number already exists" error. Repair order numbers now skip past any already-used numbers and are tracked separately for each company.
- E-Sign — Send-for-signature error fixed: Creating an e-signature document no longer fails with a server error on the hosted environments. This unblocks sending documents for signature, including delivery by text message.
- Transaction Numbers — Availability warning reason and close-day handling: The transaction-number availability warning now states the real reason — a range that is expiring versus one that is nearly full — instead of always reading "almost full" (it could read "almost full" at 1% capacity). A range whose close date is today now stays usable through the end of today, and the active range is chosen using your local timezone's current date.
1.9.79June 23, 2026
Added
- Reports — Fleet Maintenance & Compliance report: A new report under Fleet & Equipment covering license expiration, maintenance alerts, maintenance due, open problems, and repair orders across five views, with headline counts for grounded vehicles, estimated downtime, and maintenance backlog.
- Reports — Excel export: Every report can now be exported to Excel (.xlsx), alongside the existing CSV and PDF options.
- Reservations — Smart Assign upgrade suggestions: When the requested vehicle class is full, Bulk Assign now offers available vehicles from other classes as alternatives, and both Smart Assign and Bulk Assign share an expandable breakdown explaining how each candidate vehicle was scored.
- Notifications — Maintenance digests: Two scheduled email digests now go out automatically — a weekly list of vehicles due for maintenance and a monthly list of upcoming license expirations.
Changed
- Reservations — Smart Assign add-on: Smart Assign and Bulk Assign are now part of a per-tenant add-on and are hidden for tenants who don't have it enabled.
- Reservations — Planner location filters: The Reservation Planner now has separate Check-Out and Check-In location filters in place of the single shared filter.
Fixed
- Check-In — Waived overtime: Setting an overtime rate to $0 at check-in is now honoured. Previously the balance still included full overtime and blocked check-in with an outstanding-balance error even though the screen showed $0.
- Vehicles — Fleet status drill-down: Clicking a status on the dashboard Fleet Status card now filters the Vehicle Fleet page correctly. Previously the status was silently dropped when a location filter was already applied.
- Reservations — Planner return path: Saving a reservation opened from the planner calendar now returns you to the planner. Previously it always jumped back to the reservations list.
1.9.78June 20, 2026
Added
- Usage Alerts — Super Admin configures per-tenant usage-limit alerts: who is notified (Super-Admin and/or Client) and on which channel (in-app and/or email) for Users, Vehicles, Integration and Signing limits; defaults to Super-Admin on, Client off; "Apply to all" copies one row's setup to the rest.
1.9.77June 19, 2026
Added
- Reservations — standby associated rate lines now shown + editable beneath primary rate; auto-swaps to standby when primary rate disqualifies.
Fixed
- Rate Engine — late-return grace period now a hard gate; once exceeded, full late duration (including grace minutes) billed from original due time.
1.9.76June 19, 2026
Added
- Payments — global Adyen credit-card config in Super Admin portal; merchant secrets out of tenant card form; Store ID per Location wired to card sessions and recurring charges.
1.9.75June 19, 2026
Added
- Non-Revenue — tickets get Notes tab; driver picker searches drivers, not renters.
- Vehicles — Inventory page shows session history; status, location, discrepancies, Resume, read-only locks.
Fixed
- App — ESC closes modal only, no more background sidebar collapse; auto-filled defaults no longer trigger false unsaved-changes prompt.
1.9.74June 19, 2026
Fixed
- PDF Builder — RA print fix: payment totals aggregate, deposit total correct, rate lines show, open/closed layout right.
1.9.73June 19, 2026
Added
- Vehicles — Documents tab live. Upload, view, edit, delete, search vehicle docs. Status cards: Total, Valid, Expiring Soon, Expired. Registration auto-fill license number, state, expiry.
Fixed
- Vehicles — add vehicle with acquisition, financing, or depreciation data no longer errors.
1.9.72June 19, 2026
Changed
- Check Out — old multi-step wizard gone; walk-up checkout stays.
1.9.71June 19, 2026
Fixed
- Vehicles — history tabs show staff name not raw ID; unknown actors show "Unknown — not captured"; automated changes show "System (Automated)".
1.9.70June 19, 2026
Added
- Reservations — restore removed/edited no-show fee to original charge; charges tab shows original vs current with Edited/Removed badge.
- Reservations — new "Closed" status marks honored reservation with closed contract.
Changed
- Rental Agreements — misc charges now read-only; pencil edits one row at time; reset icon restores rate.
Fixed
- Non-Revenue — toasts stack vertically, stay readable, get close button; "$0 rows skipped" message gone from Cash Receipts.
- Payments — Cash Receipts credit rows no longer block payment; credit shows disabled badge.
- Reservations — reservation badge, list pill, KPI tile read "Closed" once linked agreement checked in.
1.9.69June 19, 2026
Added
- E-Sign — send rental agreements for digital signing by email or SMS; customers sign on branded public page; RA shows live status and signed copy.
1.9.68June 19, 2026
Added
- Counter — Reservations section, own access right.
- Rental Agreements — Overdue tab, KPI count, red flag.
Fixed
- Check-In — Paid time shows correct local time, right day.
- Counter — transaction-number Date Open editable; Date End before Date Open blocked.
1.9.67June 19, 2026
Added
- Vehicles — mark damage critical at check-in. Auto-ground vehicle, block checkout till repair order closed. Profile show grounded banner. Repair orders link damages, track per-damage status.
Fixed
- Vehicles — photo delete now styled dialog with spinner, not browser popup.
- Vehicles — photo upload no more fail on deployed servers using IAM-role creds.
1.9.66June 19, 2026
Fixed
- Super Admin — tenant revenue trend counts base subscription, no more $0 months.
- Super Admin — usage alerts fire on breach and new-user add; per-tenant logs; 70% and 90% threshold alerts both fire.
1.9.65June 19, 2026
Added
- Rental Agreements — second tab on same RA shows lock banner, goes read-only on Edit RA, Checkout, Check-in.
Fixed
- Rental Agreements — contract and reservation numbers now stay scoped to correct location; missing range shows clear Settings error.
1.9.64June 19, 2026
Added
- Reservation Planner — Smart Assign Recommends The Best Vehicle For A Reservation: A new Smart Assign button on an unassigned reservation finds the best-fit available vehicles for you and shows them as a ranked, scored shortlist that weighs class match, whether the vehicle is ready, how long it has been sitting idle, and how well it fits the schedule around the other bookings. Each suggestion explains why it scored the way it did and how much of a gap it leaves before and after the rental, upgrades are clearly flagged with any upgrade charge (or marked free), and a "View on Planner" link highlights the vehicle's row so you can see it in context. Picking a suggestion assigns the vehicle in one click — with a quick confirmation step when an upgrade charge applies or the vehicle carries a risk warning — and the system re-checks that the vehicle is still free for those dates before committing, so it can never be double-booked.
- Reservation Planner — Bulk Assign Many Reservations At Once With Preview And Undo: Managers can now assign a whole batch of unassigned reservations in one go. Bulk Assign proposes the best vehicle for each reservation and shows the entire plan as a preview you can review — and deselect individual rows from — before anything is committed, with a preview-only mode and an auto-assign mode. Reservations are worked through earliest-pickup first so each assignment is immediately taken into account for the next one, preventing double-bookings, and any reservation with no suitable vehicle is listed under "Needs Manual Review" with its own Smart Assign button. After a bulk run an "Undo All" option reverses the entire batch for a short window, and if a vehicle becomes unavailable between preview and confirm only that row is held back while the rest go through.
1.9.63June 19, 2026
Added
- Reservations & Checkout — Required Deposit Is Now Driven By Your Own Deposit Rules: The required deposit on a reservation is now worked out from deposit rules you configure, choosing the most specific match in the order Company, then Vehicle Class, then Location, and it is shown — together with the amount still owed — right above the Estimated Total Charges on both the reservation and the counter checkout screens. An info icon explains which rule applied, the required deposit never exceeds the rental's total charges and falls back to $0 when no rule matches, and the amount staff see is the amount enforced at checkout. Staff with the override permission can still open a contract without collecting the deposit (and that override is recorded), and the Deposit Rules setup has moved into Settings under Rate and Pricing as a filterable table.
- Rental Agreements — Exchange A Vehicle From Another Location: When you swap in a replacement vehicle that belongs to a different location than your counter, saving the change now asks you to confirm transferring that vehicle to your location first. Confirm to move the vehicle and save the swap, or go back and pick a different one.
Changed
- Check-In & Counter — Discounts And Promos Are Now Their Own Clearly Labelled Charge Lines: Discounts and promotional codes now appear as their own separate, clearly labelled lines — handled like a miscellaneous charge — rather than being blended into the regular charge list, and promo codes can be added or removed right on the check-in screen. When a discount or promo leaves the customer owed money, the screen now reads "Credit owed" instead of showing a confusing negative balance.
Fixed
- Check-In — Outstanding Balance Now Matches The Live Charges On Screen: The balance shown at check-in is now taken straight from the live recalculation of the rental's current charges — including discounts, promos, and any adjusted charge rates — and refreshes the moment the page opens, so the figure you collect always matches what is displayed. A check-in will not complete if those current charges cannot be confirmed.
- Rental Agreements — Overview And Edit Totals Always Agree: The total shown on a rental agreement's Overview now matches the total on its Edit screen exactly. Previously the two could differ by a penny on the same agreement, even when nothing had been changed, because each screen added up the charges in a slightly different order.
- Checkout — A Specific Vehicle Is Now Required Before A Rental Agreement Opens: You can no longer check out a rental agreement on a vehicle class alone. The system now requires a specific vehicle to be assigned before the rental agreement is opened — across walk-up checkouts, converting a reservation into a rental, and the counter wizard — and shows a clear message if you try to check out without one.
1.9.62June 16, 2026
Added
- Payments — New Payments Management Page: A new "Payments" item now appears in the sidebar for staff whose role is allowed to see it, opening a single page that lists every payment your company has taken across all tender types — credit card, debit card, cash, check, direct bill and gift card/voucher — including payments that are not tied to any rental agreement or reservation. The page opens on the current week by default, and eight summary cards across the top show your company's all-time totals — Total, Captured, Posted, Authorized, Refunded, Voided, Cancelled and Failed — which stay fixed as you change the dates or filters below. The table supports search, advanced filters, sorting, paging, a branded Excel export and a click-through to each payment's own detail screen.
- Payments — Filter, Search And Sort Your Payments: You can narrow the list to a specific date range (with the end date included), show only orphaned payments that aren't linked to a booking, and search by customer name, card last four digits, cardholder name, PO number, AR customer, processor reference, RA number, reservation number, memo or check number — so pasting a reference or typing a last name finds the payment. You can also sort by columns such as date, amount, status, type and location.
- Payments — Detailed View For Every Payment: Clicking any payment opens a dedicated page showing the amount, status, payment method with the real card brand logo and last four digits, the linked reservation/RA number and customer, and — for card payments — the card details, a dated timeline of what happened (authorized, captured, refunded, voided) with who processed each step, the fraud score and result, the individual risk-rule details, and 3-D Secure authentication. Cash, check and other payments show only the sections that apply to them, with no empty boxes.
- Payments — Refund Or Void Directly From The Page: Staff with the new Refund / Void Payment permission can refund or void a payment straight from the list. One Refund button now does the right thing automatically — card payments are sent to the processor for a real money-back refund, while cash, check, direct-bill and gift-card payments get an offsetting reversal recorded in the system — so staff no longer have to know which kind it is. A confirmation dialog shows the payment details and a warning that the action cannot be undone before anything is submitted.
- Payments — Shortcut From A Restored Rental Agreement: When you restore an earlier version of a rental agreement that already had money taken on a card, a message now tells you how many captured payments exist and offers a "View in Payments" button that jumps straight to the Payments page filtered to that agreement, with the date range automatically widened to the last 90 days so older payments are sure to appear.
- Payments — New Cancelled Status For Unfinished Payments: A new Cancelled status now appears for payments a customer started but never completed — for example closing the card payment window without paying. These attempts stay visible on the list instead of disappearing, get a grey Cancelled badge, are counted on a new Cancelled summary card, and can be filtered for on their own. No money is ever involved because nothing was charged.
- Payments — Declined Cards Stay Visible With The Bank's Reason: When a customer's card is declined, the attempt now stays on the payments list marked Failed instead of disappearing, and the specific reason the bank gave — such as a wrong security code or an expired card — is recorded and shown in a red banner at the top of the payment's detail page (or "No reason provided by the processor" when the bank gives none). The customer is still told the charge did not go through and no money is taken.
Changed
- Payments — Refund And Void Now Have Their Own Permission: Refunding or voiding a payment now requires the new Refund / Void Payment permission, which administrators can switch on or off per role under the Financial section of Roles. Previously refunding a cash or check payment was not permission-controlled, so staff who used to do this will need the permission granted to their role before it works again.
- Payments — Card Refunds Finish When The Processor Confirms: A card refund is now recorded as in-progress immediately so the screen updates right away, and is marked fully Refunded once the payment processor confirms it. Card payments that have already been charged can be refunded but not voided — the system will tell you to use Refund instead.
- Payments — Processor Comparison Shows As Pending For Now: The Payments page is built to compare each card payment against the payment processor's report, but that connection is not switched on yet, so today the comparison simply stays pending rather than showing any payment as missing. The payment list itself loads and works normally; only the side-by-side comparison is waiting on the processor connection.
Fixed
- Payments — Status Filter Now Returns Results: Filtering the Payments list by status (Authorized, Captured, Posted, Refunded, Voided, Failed) now correctly narrows the list. Previously this type of status filter on the shared table sent the wrong information to the server and the page errored out instead of filtering. The Customers and Corporate Accounts lists, which filter by account status, are unaffected.
- Access Rights — Admin Role Can Now Be Edited: On Settings, Roles, Access Rights, the role dropdown now includes the Admin role, which was previously hidden so nobody could change what Admin was allowed to do. Super Admin remains hidden and cannot be reconfigured.
1.9.61June 15, 2026
Added
- Claims — Automatic Claim Numbers: When a claim is saved, the system now assigns its claim number automatically — built from the date of loss, the rental vehicle's unit number, and a sequential number pulled from a range you configure in Settings under Transaction Numbers. Agents no longer type the claim number themselves. The unit number now shows the correct vehicle on the claim number instead of reading "UNKNOWN", and two claims created at the same moment can never end up with the same number. If no Claims numbering range has been set up yet, starting a new claim shows a prompt with a direct link to configure one first.
- Check-In — Update An Expired Driver License Without Leaving The Agreement: When a returning customer is added as a driver and their license on file has already expired, staff can now fix the license details right inside the agreement instead of being blocked or having to leave and edit the customer separately. An Update License option appears alongside the existing warning and opens a short form pre-filled with the customer's current license number, state, and the expired date. The new expiration date must be later than the rental's return date, and the save button stays disabled until every field is filled in correctly. Once saved, the license is updated on the customer's record and the driver is added — but if the customer still has another reason they cannot be added, the original warning reappears showing only the remaining issues.
- Contract Modify — Override Authority For After-Hours Pickup And Return Times: When a pickup or return time falls outside a location's operating hours, standard agents are still blocked from saving and prompted to adjust the time. Authorized staff can now be granted permission to save these legitimate after-hours times: they see an amber informational warning instead of a block and can save without changing the recorded time, so the contract keeps the real pickup or return time instead of a falsified one. Separate permissions cover pickup-time and return-time overrides, so a location can allow supervisors to override after-hours returns (such as key-drops) without also allowing pickup overrides. Every override is recorded for audit, and the same after-hours handling now applies consistently across Edit Agreement, the checkout screen, vehicle check-in, and non-revenue tickets.
Changed
- Notifications — Opt-In By Default With Guided Setup: New accounts now start with every notification turned off, so nothing is sent to renters until you deliberately switch it on. A new setup step appears right after location setup the first time you sign in, letting you pick which notifications to turn on, grouped into Customer-Facing (sent to renters by email) and Internal Staff (shown to your team). You can turn on whole groups at once, pick individual ones, or skip and keep everything off. Accounts that existed before this change keep all their previously active notifications running and instead see a one-time reminder banner inviting them to review and trim the list whenever they're ready.
- Vehicles — Corrected Tab Label To "Vehicle Depreciation": The finance section of a vehicle record, the section heading inside it, and the matching column header on the vehicle import and export template now read "Vehicle Depreciation" instead of the previous incorrect "Vehicle Disposition". Disposition refers to selling or removing a vehicle from the fleet, while depreciation is the scheduled reduction in a vehicle's value over time, so the new wording matches what fleet managers and accountants actually expect to see there. Existing vehicles, their saved sale and depreciation details, and import or export files all continue to work exactly as before — only the wording has changed.
Fixed
- Reservations — Day Count Updates Instantly When You Pick A Date: When you change the pickup or return date on a rental agreement or reservation using the calendar, the number of days now recalculates the moment you choose the date, instead of waiting until you click somewhere else on the page. If only one of the two dates has been chosen so far, the day count keeps showing its previous value until both dates are in place, so counter staff always see an accurate number.
- Counter — Clearer Primary Renter Remove Button On Walkup Rentals: The button next to the primary renter on a walkup rental agreement now shows a red X with the tooltip "Remove primary renter", so its purpose is obvious and matches the remove button already used for additional drivers. Previously the button showed a different icon labeled "Change primary renter", which wrongly implied it would swap the renter when it actually removed them. Clicking it now removes the renter right away without opening an extra search pop-up; staff use the search field above the driver list to add a replacement. The same fix applies to the driver section when creating a reservation.
- Vehicles — Status And Advanced Filters Now Work Together On The Fleet Screen: On the Vehicle Fleet list you can now combine the toolbar Status selector with the Advanced Filters panel and both stay active at the same time. Previously, changing the Status dropdown wiped out whatever you had typed into Advanced Filters, and when Advanced Filters were applied the chosen Status was quietly ignored so vehicles of every status still showed up. Now the list narrows to only the vehicles that match both the selected status and your advanced filter values together, including the special cases for sold and archived vehicles.
- Check-In — Estimated Charges Now Refresh When You Change The Return Details: On the counter check-in screen, changing the number of rental days, the scheduled return date or time, the fuel-in level, or the odometer-in reading now immediately recalculates the running totals — Time & Mileage, Duration, the estimated charges, and the refund or balance-due amount all update to match what you entered. Previously these inputs were disconnected, so the agent could read an outdated refund figure to the customer. Editing the number of days now also moves the return date and time to match (and vice-versa), so the two always agree. On smaller and mobile screens the check-in screen now uses a guided step-by-step layout that requires the odometer reading before you can move on.
- Counter — Checkout Reservation List Now Shows Every Open Reservation On Arrival: When an agent opens the checkout screen, the list now displays all open and no-show reservations right away, instead of a small partial set that previously only appeared after typing a character into search and then clearing it. Changing the location filter still narrows the list correctly, today's pickups still sort to the top, and clearing a search now reliably returns the full open list rather than leaving a stale or empty result.
1.9.60June 10, 2026
Fixed
- Rental Agreements — Card Authorization Holds No Longer Print As Payments On The Contract: A card authorization hold (an amount reserved on a customer's card but never captured) used to appear as a deposit payment line on the printed rental agreement and was added into the Total Deposits/Payments figure. On a fully paid contract this inflated the paid side, leaving the contract looking out of balance with a blank Net Due. Authorization holds are now excluded from both the printed payment lines and the totals, so closed contracts balance correctly.
- Rental Agreements — Card Numbers On Printed Contracts Are Always Properly Masked: When the system stored an encrypted card token instead of a card number, the printed contract could show garbled characters in place of the masked card. The contract now prefers the card's last four digits (shown as ****1111), only falls back to the stored number when it is a real card number, and prints nothing rather than unreadable characters.
1.9.59June 10, 2026
Added
- PDF Builder — New Forms Can Be Created By Importing A JSON Template: The Create New Form dialog now offers an Import JSON option alongside the existing starting points. Upload a form template file — such as one converted from the legacy system — and it is checked before anything is created, with a summary of pages and elements and clear warnings for invisible white text, elements positioned off the page, and unsupported content. An optional fix, on by default when white text is found, converts that text to black so the imported form is immediately readable.
Fixed
- Vehicles — Adding A Vehicle No Longer Fails When Another Company Uses The Same Unit Number: Creating a vehicle used to be rejected with a 'unit number already exists' error if any other company on the platform had a vehicle with that number, even though it wasn't in your fleet. Unit numbers are now checked only within your own fleet, so the same number can exist at different companies while duplicates inside one fleet are still blocked.
1.9.58June 5, 2026
Fixed
- Vehicles — Editing A Vehicle Whose Unit Number Has Extra Spaces No Longer Fails: Some vehicles brought over from the old system carry hidden trailing spaces in their unit number. Opening such a vehicle from search and saving used to fail with a 'vehicle not found' error. These vehicles now update, archive, duplicate, and show their history correctly, and an exact-match warning is shown if two units differ only by spacing.
- Check-In — Longer Agreement Numbers No Longer Block Check-In: As rental-agreement and reservation numbers grew longer, returning a vehicle could fail partway through check-in. Check-in now completes and closes the contract regardless of how long the agreement number is.
- Reservations — Running Total Now Matches Between The List And The Detail: After a cancellation or no-show changed a reservation's charges, the total shown in the reservations list could disagree with the total on the reservation's own page. Both now show the same, correct amount.
1.9.57June 3, 2026
Added
- Support — Live Chat Is Now Available To Signed-In Users: A chat widget now loads once you sign in, giving a direct support channel from any page. It stays off the login screen and is removed again when you sign out, so it only runs for logged-in users.
Changed
- Report a Bug — Report A Bug Button Moved Into The Sidebar: The floating button used to sit in the bottom-right corner, where it overlapped the new chat widget. It now lives in the left sidebar, shrinking to an icon when the sidebar is collapsed.
- Tenant Provisioning — Tenant Slug Now Accepts Any Characters: Creating or editing a tenant used to reject a slug unless it was lowercase letters, numbers, and hyphens. Any value is now accepted — still required and capped at 50 characters — while auto-generate still offers a clean default.
1.9.56May 29, 2026
Added
- Maintenance — Maintenance Page Rebuilt With A Unified Procedure/Alert List, Calendar, And Grounded-Reason Popup: The page now has tabs for Procedure/Alert, Repair Order, and History, with an expandable alert list, search, and a one-click path to create an alert from a newly added procedure. A planner-style monthly calendar plots upcoming maintenance, and a vehicle that is out of service now shows a popup explaining why it was grounded.
- Companies / Reservations — Corporate Rental Flow Added Across The Booking Screens: A customer can now be linked to a corporate account from their profile, and picking a renter tied to a company prompts to switch the booking to Corporate and scopes the renter search to that company. Free CDW is applied at $0 where the company is configured for it, and a brand-new driver added on a corporate booking is saved as a customer linked to that company.
Changed
- Statuses — Customer Statuses Are Now A Fixed List: The six customer statuses (Active, Inactive, Suspended, Blacklisted, VIP, Deleted) can no longer be added to or deleted, and only their display name can be edited. This is now enforced on both the screen and the server.
Fixed
- Self-Inspection — A Vehicle With An Open Self-Inspection Can No Longer Be Selected, Even With An Override: Vehicles tied to an unfinished self-inspection are now blocked from selection on both vehicle search and the planner, and the block holds even for agents allowed to rent unavailable vehicles. A missing or blank inspection status is now treated as still in progress instead of slipping through as available.
- Check-In — Charges On Rentals With Vehicle Exchanges Are Now Correct: The mileage charge now includes the miles driven on every prior vehicle and no longer uses the wrong vehicle's odometer, which previously could add thousands of dollars in phantom miles. Fuel charges from earlier exchange legs also no longer disappear from the breakdown.
- Misc Charges — Vehicle License Fee Now Saves Correctly And Stays Consistent: The fee was recording a zero quantity, losing its checkout-time rate whenever the contract was recalculated, and adding as $0 when applied through Contract Modify. It now records a single charge, keeps the rate captured at checkout, and adds the correct amount through Contract Modify.
- Payments — Card And Saved-Card Handling Hardened For Adyen Terminals: Saving a card to a rental no longer fails with a validation error, cards are stored only when the agent chooses to save them, and the card brand and last four digits are now recorded. Cancel and status checks now target the exact terminal that took the payment at multi-terminal locations, and authorization holds can now be voided.
- Maintenance — Vehicle Summary Maintenance Section Now Shows Accurate Service Status: Last and Next Service now fill in from active alerts and an overdue or due-soon banner replaces the blanket 'up to date' message. Creating a repair order now also shows field-level errors instead of one generic message.
1.9.55May 26, 2026
Added
- Reservations — No-Show And Payment Events Now Recorded On The Reservation History Tab: Marking, reopening, or adjusting a no-show, along with payment events, now create a history entry the agent can review. These transitions previously left no record on the History tab.
Changed
- Reservations — A Honored Reservation Is Now Locked From Edits At The Server, Not Just On Screen: Once a reservation has been honored into a rental agreement, attempts to edit, cancel, mark no-show, or change its no-show fee are rejected with a clear message pointing the agent to the linked agreement. Previously a stale tab could still push these changes through even though the agreement is the source of truth.
- Companies — Company Form Cleaned Up And Add Contract Now Lists Company Customers: The Account Manager and Sales Rep pickers are filtered to the right roles, a Tour Company type was added, and the unused Industry and Business Type fields were removed. The Add Contract dialog now lists customers linked to the company instead of corporate contacts and pre-selects the primary customer.
- Customers — Customer Form And Driver Section Streamlined: The customer form now allows a blank email or address and adds gender, additional-driver, and sponsor fields, while the driver section blocks adding the same person twice. A license, email, or phone number that already belongs to another customer now surfaces a clear message and stops the save instead of writing silently.
Fixed
- Rates — Rate Rule Date Fields Now Reject Impossible Calendar Dates Instead Of Silently Blanking: The booking and departure/return date fields used to accept impossible dates such as February 31, then drop them on save so the field came back blank with no explanation. Each field now shows an inline error and blocks Save until corrected, with the same check enforced on the server.
- Vehicles — Status Modify Dropdown Now Matches Status Management Exactly: The dropdown hid On Rent and Out of Service and showed labels that differed from the configured statuses. It now lists every status set up in Settings → Status Management with the same names, so adding or renaming a status appears here automatically.
- Reservations — Overview Payments Tile Now Shows The Real Payment Time: Each payment showed the previous day at 8:00 PM regardless of when the transaction happened, because it read a date-only field. It now shows the actual captured, refunded, or voided time, matching the Charges & Payments tab.
- Counter — Contract Inquiry Search No Longer Hangs On A Slow Fleet Lookup: Clearing the search box now reloads the open-contract queue instead of leaving stale results, and a slow vehicle lookup no longer pins the page on 'Searching…'.
- PDF Builder — Large Dollar Amounts No Longer Truncate On Printed Agreements: Charge-line and payment amounts of $1,000 or more printed clipped — for example $1,259.21 showed as 1259.2 — on signed rental agreements. The amount cells were widened so the full figure prints, and existing tenants' stored templates are updated automatically.
- PDF Builder — Closed Agreements Now Print Fuel In, Odometer In, And Miles Driven: These fields were blank on a printed closed rental agreement because the return-side readings were never pulled in. They now fill in from the check-in readings, with Miles Driven calculated from the out and in odometer.
- Reservation Planner — Overdue Bar Tooltip Now Shows The Real Return Date: Hovering an overdue rental bar showed today at 11:59 PM as the Return date, contradicting the overdue warning on the same bar. The tooltip now shows the agreement's actual due-back date and time, and the bar's right edge lines up with the current-time line.
1.9.54May 22, 2026
Added
- Reservation And Rental Agreement — New Bi-Directional Link Chip On Both Detail Headers: Once a reservation has been honored into a rental agreement, a new chip appears next to the status badge on both detail pages so an agent can jump straight between the two records. The reservation page shows a 'View Contract #RA-X' chip that opens the contract detail, and the contract page shows a 'View Reservation #RE-X' chip that opens the original reservation. Both ends point at the same shared details surface so the two flows feel symmetric, and the chip is only rendered when the linkage actually exists so unhonored reservations and walk-in contracts continue to look unchanged.
Changed
- Honored Reservations — Original Reservation Now Locks Once It Has Been Honored, And A Banner Routes The Agent To The Active Contract: When a reservation has been honored and the linked rental agreement is at Open Contract or Closed Contract, the reservation page now hides Edit, Check-Out, Check-In, Cancel, Cancel Contract, and Void and renders a clear banner explaining that the reservation is locked because the contract is the source of truth. The banner's primary call to action opens the rental agreement details page so the agent can take action there instead. Save attempts that try to edit a honored reservation are now also rejected at the API with a canonical 'Reservation honored' message so the lock cannot be bypassed by a stale tab.
- Reservations And Rental Agreement Lists — Cross-Filter By The Linked Document Number, With A 'From Reservation Only' Toggle On Contract Search: The Reservations list now has a new 'Contract #' tag-input column so an agent can paste one or more rental agreement numbers and pull up only the reservations that have been honored into those agreements. The Rental Agreement / Contract search advanced form now mirrors the same idea with a new 'Reservation # (originated from)' input plus a 'From reservation only' checkbox so an agent can quickly filter walk-in contracts out of the list and review only contracts that started life as a reservation. Both filters accept comma-separated lists and compose normally with the existing date, location, and status filters.
- Cancel Vs Void — Buttons Are Now Mutually Exclusive And Driven By Whether Money Has Actually Been Captured: The Cancel and Void buttons on the reservation and contract detail pages no longer both appear at the same time. If no payment has been captured against the record the agent sees Cancel only; once a payment has been captured the agent sees Void only; a full refund returns Cancel and hides Void again. The unrelated button is hidden rather than disabled so the choice is unambiguous, and the existing privilege gates still apply on top of the captured-payments rule. The net-amount predicate sums captured, posted, authorized-with-deposit-captured, refunded, and refund-pending rows together with a small floating-point tolerance so partial refunds and rounding do not cause the button to flicker.
- Releases Page — Redesigned As A Card Grid With A Timeline Sidebar, Deep-Link Modal, And View Toggle: The What's New / Releases page has been rebuilt around a card grid for the most recent releases plus a Timeline sidebar that groups every release by year and month, with collapsible year and month groups so it is easy to scan back through the history. Clicking any card opens a release-detail modal that lists the Added, Changed, and Fixed sections in a more readable layout, and the modal supports deep links via the URL hash so a specific version can be linked to and reopened on reload. A search box, a year filter, and a view toggle between grid and timeline have been added to the toolbar, and the toolbar and sidebar now stick under the global app header at the correct offset on every viewport. The latest three release entries have also been rewritten in plain English so the page reads naturally without internal jargon.
- Onboarding Tour — Auto-Start Disabled So Returning Users No Longer See The In-App Guide On Every Login: The in-app product tour no longer starts automatically when a user lands on the dashboard. Users who want to walk the tour again can still launch it from the help menu, but the auto-start step has been removed so frequent users are not interrupted on every session.
- Reservation Detail Header — Section Title Now Reflects Whether The Record Is A Reservation Or A Rental Agreement: The collapsible details section on the shared reservation / rental agreement page now reads 'Rental Details' when the page is being viewed as a contract and 'Reservation Details' when it is being viewed as a reservation, so the agent always sees a title that matches the record they are looking at. The rest of the section content is unchanged.
- Counter Fleet And Vehicle Profile — Check-In Button Now Uses The Same Blue Across Both Surfaces: The Check In primary action button on the Counter Fleet vehicle cards and the Check In button on the new vehicle profile header now share the same blue styling, so the affordance reads the same whether the agent acts on a vehicle from the counter dashboard or from the vehicle profile page.
Fixed
- Counter-Only Roles — Post-Login Landing Page Now Resolves Dynamically To The First Page The User Can Actually View: Users with only counter privileges (for example the Staff role) used to be redirected to the operations form builder after login because the landing route was hardcoded. The landing route is now resolved at login time by walking the sidebar in declaration order and picking the first entry the user is actually allowed to view, so a counter-only user now lands on Counter Checkout, while users with broader access continue to land where they did before. The same resolver is used when the user opens the app root or hits a route they cannot view, so the fallback is consistent everywhere.
- Sidebar — Top-Level Vehicle Inventory, Non-Revenue, And Bug Tracker Entries Now Honour The Role's Hide Flag: The standalone Vehicle Inventory, Non-Revenue, and Bug Tracker sidebar items were being shown to roles that do not have access to them because the underlying permission keys were missing from the seeded role JSON and the sidebar defaulted unknown keys to visible. Those three keys are now seeded on every non-admin role with hide enabled by default and on the SUPER_ADMIN menu privilege map as visible, so the sidebar reflects each role's intended menu without administrators having to flip the toggles by hand. The Access Rights configuration screen also exposes the Bug Tracker toggle under the Admin group so the visibility can still be customised per role.
- Counter Checkout — Standalone Rental Agreement Route Now Gated To Counter-Sourced Navigation: The /dashboard/checkout/new route used to be reachable directly by anyone with the link, even users who only had counter-checkout permission. The route now only opens when the navigation actually came from the counter wizard (either the existing counter_user=true query parameter or the in-app fromCounter state); other users with no rental-agreement permission are routed back to their resolved landing page so the page can no longer be opened out of context.
- Honored Reservation Edit From Checkout — Vehicle Class And Unit Panel Now Render On The First Frame: Pressing Edit on a reservation, or opening checkout from a saved reservation, used to flash an empty Vehicle Selection section for a beat while the vehicle details lookup raced the render. The selected vehicle, the vehicle class, the rented-as class, the selection mode, and a placeholder vehicle record built from the saved reservation are now all seeded synchronously, so the class and unit panel show up correctly on the first render and the async lookup just confirms the placeholder.
- Checkout From Reservation — Pickup Time Now Defaults To Now Instead Of The Saved Reservation Time: When an agent honors a reservation by opening checkout, the pickup time on the live form now defaults to the current time rather than the time saved on the reservation, matching the existing rule that pickup-date-is-today flows always use the current time. The saved reservation time is still available to the agent if they need to override the default manually.
- Rate Calculation — Saved Rate Now Resolves Correctly Even When It Arrives Before The Available Rates List: On press-Edit and on from-reservation checkout, the saved rate could land before the available rates list finished loading, which left the rate calc looking at a saved rate id that was not in the list yet and the totals stuck at $0.00. The rate-and-charges hook now bumps its recalculation trigger exactly once when the saved rate first appears in the available list, so the totals and the per-line breakdown recompute as soon as the data is consistent. A small guard prevents the bump from firing twice or disturbing the smart-requal flow.
- Reservation Sidebar — Live Breakdown Rows Now Show Under Non-Zero Totals On The Checkout Flow: The sidebar's existing-charges gate was reading off the reservation's stored charges array instead of the props the caller actually passed in, so the checkout flow (which intentionally passes empty arrays plus the live calc) was hiding the live breakdown even when the totals were non-zero. The gate now reads off the props directly, so checkout shows the live breakdown rows under their totals as expected.
- Contract Cancel Button — Confirm Modal Now Always Fires And Routes Back To The Read-Only Contract Page: The Cancel button on the contract modify page used to skip the confirmation modal when no form edits had been made, which made it too easy to cancel a contract by accident. The button now always opens the confirm dialog, the confirm action discards any pending form edits, and the page routes back to the read-only contract details so the agent ends up where they started instead of on a blank page.
- Reservation Cross-Filter — Comma-Only Contract Number Input No Longer Silently Drops The Has-Contract Predicate: Pasting a comma-only string (for example ', ,') into the new Contract # filter used to be treated as truthy but parsed to zero tokens, which silently widened the result set because the has-contract predicate was dropped. The filter now normalises the input and falls through to the has-contract predicate when no real tokens are present, so the toggle keeps doing what the agent expects regardless of stray punctuation.
- Deployed File Uploads — Vehicle Photos, Customer Documents, E-Sign Documents, Damage Captures, Brand Storage, Bug Screenshots, PDF Assets, And Generated Reports Now Save To Cloud Storage In Deployed Environments: The container deploy used to receive the cloud-storage credentials only at build time, so the running container fell back to local-disk storage on every deployed environment and any upload that required the cloud bucket (the most visible one being vehicle photos, which surfaced a 'Vehicle photo storage is not configured' error) silently broke. Both credentials are now injected into the container environment alongside the bucket and region variables, so all upload-driven flows succeed in dev, pre-prod, and prod without falling back to disk.
1.9.53May 20, 2026
Added
- Customers: Bulk import from a spreadsheet. A new Data dropdown on the Customers toolbar opens an Import Customers dialog where you drop in an XLSX file built from a downloadable template. Duplicate emails and missing fields are flagged per row, so valid records import and only the failing rows come back for correction.
- Locations: Tunable no-show check cadence. A new Check Every dropdown on the No-Show Settings panel lets each location run the no-show sweep anywhere from every 5 minutes to once a day. The default stays at 1 hour, so existing locations keep their current cadence.
Changed
- Reservations: Pickup and return times now anchored in UTC. Pickup, expected return, and actual return are stored in UTC and converted back to local on display, so a reservation viewed from another timezone shows the equivalent local time. Check-in parses the saved date and time the same way, so Date In and Time In no longer drift between servers.
- Counter: Fleet page restyled and each card's primary action follows status. The Counter Fleet page drops the sky-blue accents and adopts the standard primary and neutral colors and status-badge outlines used elsewhere. Each vehicle card's primary action now matches the current state (Checkout, Check In, Close Work Order, Return to Service, Close, or read-only) instead of always reading Checkout.
- Locations: Impact preview before deleting a location. Deleting a location now runs the same impact check the deactivate flow uses and warns you when open rental agreements or reservations still point at it. Locations with no open bookings still go straight through the existing simple confirmation.
- Drivers: Picker works the same on every screen, license expiry checked against return date. Counter Checkout, the Reservation page, the Rental Agreement edit page, and the Drivers tab now share the same combobox, search dialog, and Add Driver and Add Employee buttons. License expiration is checked against the rental return date instead of today, and first and last names are trimmed on save.
- Sessions: Shared across tabs and Ctrl-click opens rows in a new tab. Opening a second tab while signed in no longer bounces you to login, and local, dev, staging, and production keep separate session slots even when hosted at the same address. Ctrl-click on Windows, Cmd-click on Mac, or middle-click on a row in Reservations, Vehicles, Customers, Companies, Non-Revenue, or on a sidebar item now opens it in a new tab.
Fixed
- PDF Builder: Payment rows show readable labels and full details for non-card payments. Contract PDFs used to print raw codes like CSH or VS and left Description, Check #, and Reference # blank for non-card payments. Each payment row now resolves to its configured label and those three fields print for cash, check, and card alike.
- Reservations: Check Availability now counts overdue rentals and On Rent vehicles. Vehicles past their due-back date but not yet returned, or sitting at On Rent through a manual status change, were being reported as available. Both cases now count as on-rent, so the chart and daily breakdown match what is actually in the field.
- Sessions: New tab no longer kicked to login when already signed in. The session-present flag used to be kept per-tab, so a freshly opened tab could not see the existing session and redirected to login. It is now kept per-domain, so every tab on the same environment sees the active session and restores it through the existing refresh cookie.
1.9.52May 18, 2026
Added
- Reservations: End-to-end no-show flow with auto-cancel and a dedicated fee. Each location has a No-Show Settings card with a toggle and configurable thresholds for grace hours, quote pickup, and auto-cancel age, and an hourly job flips eligible reservations to No-Show, attaches the No-Show Fee from the matching rate plan, frees the held vehicle, and notifies staff and the renter. Agents can mark, reopen, or cancel a No-Show manually, and a supervisor-only dialog edits or removes the fee while keeping the status.
- Self-Inspection: Customer-driven pickup and dropoff loop with damage pull-back. For tenants on the Self-Inspection vendor, counter checkout creates the vendor contract idempotently and the renter completes the pickup inspection on their own device. On check-in the return odometer and fuel post back to the vendor, any dropoff damages pull through as a check-in inspection, and a polling loop closes the Rental Agreement automatically when the customer submits the dropoff.
- Vehicles: Inspection History tab merges Self-Inspection contracts with manual inspections. The tab is redesigned into a Current Vehicle State summary on top and a unified history list below, merging Self-Inspection contracts looked up by VIN with the manual inspections in the system and deduplicating by Rental Agreement number. The shared inspection card renders the Self-Inspection pickup, dropoff, and employee status panel inline when the row comes from the vendor.
- PDF Builder: Payment fields and human-readable payment codes. Four new fields (Payment Type, Description, Check #, Reference #) are draggable in the PDF Form Builder so designers can place payment details onto custom templates. The Payment Information cell on stock templates also prints the human-readable payment type (Cash, Visa) instead of the underlying code.
Changed
- Non-Revenue: Visual and functional parity with Rental Agreements, Counter route retired. The Non-Revenue Open and Details pages now share the same look, components, and driver and vehicle blocks as the Rental Agreement pages, and the Vehicle Selection block mirrors Counter Checkout walk-up. A quick-status tab strip (Open, Closed, Cancelled, All) sits above the list and persists in the URL, per-row Close and Cancel actions are gone, Void is renamed to Cancel everywhere, and the separate Counter Non-Revenue route is retired in favour of the dashboard page.
- Entity History: Undo and Redo buttons removed, phantom field changes filtered out. Every Undo and Redo button is gone across roughly twenty-five entity history surfaces, and legacy Undone or Redone rows render as plain Updated entries. The viewer also no longer reports phantom field changes; unset columns coalescing to empty values and audit metadata are filtered out so the badge and details show only the fields you actually touched.
- Counter Contract Inquiry: Location filter and refreshed status list. The page gets a location dropdown so you can narrow the inquiry to one location instead of seeing every contract in the tenant. The status filter also drops Pending and adds Voided so the choices match the actual contract states.
- Reservations: Pending Reservation status hidden where it no longer applies. The Pending Reservation status is dropped from the Rental Agreement list page's advanced filter as part of the broader cleanup. Contract-stage statuses (Pending Open, Open Contract, Closed Contract, Voided Contract) remain available where they are relevant.
Fixed
- Counter Checkout: Five defects in the checkout and honor-reservation flow. The inline driver search now shows the license number under the phone number, the Delivery Service modal opens correctly from the checkout page, the live rate calculation no longer cascades when you pick a rate plan or apply a promo, honoring an open reservation pre-selects the rate plan and saved snapshot, and saving no longer returns a 'Pending Reservation is deprecated' validation error.
- PDF Builder: Unsaved-changes guard now catches in-app navigation and browser back. The editor used to warn only on a hard refresh, so a sidebar click or browser back silently discarded edits. It now intercepts in-app navigation and the browser back button as well, with the native hard-refresh warning still in place as a safety net.
- PDF Builder: Manage Allocations dialog no longer carries stale selections between opens. The dialog used to remember the rows selected the previous time, even if you closed without saving. Its state is now reset every time the dialog opens so you start clean.
- Non-Revenue: Close modal no longer fires the unsaved-changes dialog on a pristine form. The modal pre-fills the odometer and status fields, so closing immediately popped the Unsaved Changes dialog with no edits. The dirty check is now a diff against the reset snapshot, so the dialog fires only on an actual user edit.
- Non-Revenue: Closed and Cancelled tabs now actually filter the list. A persisted status filter from the old advanced-filter sheet was silently overriding the new tab filter, so Closed still showed Open rows. The persisted filter is invalidated and the tab strip is now the single source of truth for status.
- Reservations: Contract-stage statuses accepted when saving a Rental Agreement edit. Saving used to reject Pending Open, Open Contract, Closed Contract, and Voided Contract with a validation error before reaching the service layer. Those statuses are now accepted, so editing an Open Contract from the planner or list goes through normally; the genuinely retired Pending Reservation status stays rejected.
- Maintenance: Missing database column restored on the alerts endpoint. The maintenance alerts endpoint was returning a server error because a column declared on the schema had never been migrated. An idempotent migration adds the column so the endpoint serves correctly on a fresh deploy.
- Notifications: External recipient picker now persists its configuration. The external recipients and internal location filter on notification settings were silently not being saved, so the values vanished on the next reload. Both fields are now correctly persisted.
- Dashboard: Reservations Not Picked Up widget now reflects the real No-Show status. The Operational Load widget's tile and detail list were filtering on the retired Pending Reservation proxy and always returning zero. They now filter on No-Show, so the tile shows the actual count and the list shows the actual reservations.
1.9.51May 15, 2026
Added
- Check-In: Exchange-vehicle mileage now included in the mileage charge. When a rental includes one or more vehicle exchanges, the Check-In page shows the miles driven on every prior leg and adds them to the live preview and final saved charge. A hint panel in the Vehicle & Readings section shows the accumulated exchange miles and combined total, and the same totals are recalculated server-side on save so the persisted amount matches what was on screen.
- Vehicles: New 'Override Expired Vehicle Documents' permission. A new privilege in User Management lets administrators authorize specific agents to rent a vehicle whose registration, insurance, or other document has expired. Agents without the permission still see the existing block, so the default safety behaviour is unchanged.
Fixed
- Companies: Tax-Exempt toggle now cascades to active reservations and rental agreements. Toggling a corporate account's Tax Exempt flag immediately updates Taxable and Tax Exempt Reason on every active reservation and rental agreement tied to that company, so contract PDFs, invoices, and reports reflect the change without re-opening each booking. Customer-level tax preferences still win over the corporate setting, closed and cancelled records are left untouched, and if any single cascade fails the company-level change is rolled back.
- Payments: Adyen webhook notifications now verified per-tenant. Webhook signature verification now uses the HMAC key configured on each tenant's credit-card terminal record instead of a single installation-wide key, so multiple tenants on Adyen can each receive and validate webhooks correctly. Tenants without a per-terminal key continue to fall back to the installation-wide key, so existing single-tenant setups are unaffected.
- Reservations: Save from the planner no longer rejected. Editing a reservation from the planner and clicking Save was being rejected with a 'property sessionId should not exist' error after a recent backend update. The reservation update path now accepts the same session field the create path already accepts, so edits go through normally and any deposit captured before the reservation was finalised stays linked.
1.9.50May 15, 2026
Added
- Claims Dashboard — New Table View, Shared Pagination, And Quick Status Filter: The Claims workspace now has a proper scannable Table view that becomes the default on /dashboard/claims, sitting alongside the existing Cards and Board views. Each row shows Claim #, Date of Loss, Type, Status, Priority, Customer, Vehicle, Outstanding, Created, and a per-row View action; clicking a row opens the claim detail and sortable column headers cycle desc → asc on Claim #, Date of Loss, Outstanding, and Created. Outstanding amounts in credit are clearly tagged with a CR suffix and colored. A shared pagination bar with a Rows-per-page selector (10 / 25 / 50 / 100) and a 'Showing X to Y of Z' counter is now used by both the Cards and Table views, and the toolbar gains a Status quick-select dropdown immediately before the Filters button so the most common filter is one click away. Existing /dashboard/claims?view=… bookmarks continue to work — the legacy list value maps to Cards, and the new default is Table.
Changed
- Claims Dashboard — Filters Sheet, KPI Strip, And Search Modernized: The Claims Filters sheet now matches the Reservations / Rental Agreements look — a title row with an active-count badge, each filter wrapped in its own card with a per-field Clear button, and a sticky footer with Clear All and Apply Filters that disable when no filters are set. The Sort dropdown has been removed because the date-range filter plus sortable column headers now cover the same ground, and the standalone 'Analytics insights' collapsible has been folded into a single six-tile KPI row at the top of the page: Total Open Claims, Avg Days to Close, Expenses MTD, Recovery Rate, Opened this month, and Closed this month. The search placeholder has been refreshed to reflect the broader coverage below.
Fixed
- Claims Dashboard — Customer And Vehicle Columns Now Populate, Global Search Now Matches Status, Priority, And Type: The Claims list API was returning empty Customer and Vehicle fields on every row — the Cards view masked it by only rendering those fields when present, but the new Table view exposed the gap. The list now pulls Customer name and Vehicle Unit # from the linked rental so the columns are filled. Global Claims search has also been broadened so what an agent sees in the table is what they can type — typing 'in review' finds claims with status In Review, 'urgent' finds Urgent priority, 'settle' finds Settled, and free-text 'damage' matches the Damage claim type — in addition to the existing Claim #, Customer name, Vehicle Unit / VIN / Plate, and Rental Agreement number matches.
1.9.49May 15, 2026
Changed
- Reservations Dashboard — Status Options Simplified, KPI Strip Expanded To Six Tiles, Multi-Reservation # Search: The Reservations dashboard status filter and the reservation form's status dropdown now show only the lifecycle states that actually apply on this side of the business — Quote, Open Reservation, Cancelled, No Show, and Voided — with the contract-stage statuses (Pending Open, Open Contract, Closed Contract, Voided Contract) removed since they belong on the Rental Agreement dashboard. The KPI strip at the top of the page now shows six tiles instead of two: Total, Quote, Open Reservation, Cancelled, No Show, and Voided, so agents can read the reservation mix at a glance. The Reservation # search now accepts multiple numbers chipped in together (the same pattern Unit # already used) so an agent can pull up several reservations in one query, and the default landing filter has been moved from the deprecated Pending Reservation status to Open Reservation. On the backend, Quote reservations can no longer start a pickup directly — a Quote must be promoted to Open Reservation first — bringing the start-checkout path in line with the existing search-list behaviour.
- Reservation Planner — Rental Agreement Edits Now Show The Suggested-Changes Banner: Editing a Rental Agreement from the planner now shows the same blue 'Res Planner suggested changes' banner with per-row Apply buttons that reservation edits already showed, so the agent can review each pending change (date, time, vehicle) and accept them one at a time instead of having them silently applied on form load. Saving a routine reservation or rental-agreement update no longer pops the post-save Print / Email / eSignature dialog — that dialog stays in place on the dedicated checkout and check-in pages where it belongs.
- Reservation Planner — Drag To Unassigned Now Updates Inline, No Confirm Popover: Dropping a reservation onto the Unassigned row now updates the reservation immediately with a toast confirmation instead of opening a confirm popover and redirecting to the edit page. The conflict-resolution dropdown also no longer offers an Unassign action for active rental agreements or non-revenue tickets that cannot be unassigned by business rule, matching the protection that already existed in the drag-confirm flow. The booking detail modal footer now correctly reads 'View Details' for read-only bookings instead of the wrong 'See all changes' label.
- Reservation Edit — Vehicle Search Default Location No Longer Pre-Filled: When an agent opens the vehicle search modal while editing an existing reservation or rental agreement, the Location filter now starts on 'All Locations' instead of automatically pinning to the pickup location, so the agent can pick a replacement vehicle anywhere in the fleet without first having to clear the location filter.
- Vehicles & Non-Revenue Datatables — Redundant Free-Text Filters Removed: Plain-text fields like Product, Ticket #, Unit #, and Driver Name have been dropped from the Vehicles and Non-Revenue advanced-filter sheets because the global search box at the top of each page already covers them. Only enumerated values and date filters remain in the advanced sheet, making the filters more focused.
- Counter Checkout — Today's Reservations Queue Auto-Filters By Terminal Location And Is Paginated: The Today's Reservations queue and search results on the counter checkout contract-search step now default the Location filter to the workstation's terminal location so an agent at a specific counter sees their own location first instead of having to pick it from the dropdown every time (the dropdown can still be overridden manually). The queue and search-result lists now paginate five rows at a time with Previous / Next controls and a page counter, and the 'today' filter has been hardened to compare only the date portion so reservations starting at 00:00 on the current day are no longer hidden from the queue. Walkup and reservation selection now navigate straight to the matching dashboard page so the agent lands on the form a step sooner and the URL is always shareable.
- Driver Selection — Underage / Age-Constraint Check Now Knows The Reservation Context: When an agent selects a driver from the inline combobox or the search modal during checkout or reservation creation, the underage / age-constraint check now correctly receives the selected pickup location, return date, and vehicle class — previously this context was only passed in some paths, so the check could miss an underage driver depending on how the agent had selected them. The pickup location's minimum-driver-age threshold is also fetched live on the checkout page when the pickup location changes, so the combobox badge and blocking-issues check stay in sync with whatever location is currently selected.
- Driver Selection Section — Layout Refresh: The driver search, Add Driver / Add Employee, and Delivery Service buttons have been reorganized into two clean rows — full-width search on top, equal-width action buttons below — so long button labels no longer fight for space, and long driver names, emails, and phone numbers truncate cleanly in the selected-driver card instead of pushing the layout out of alignment.
- Rate Seasons Table — Multi-Date Seasons Are Now Expandable Inline: A rate season with more than one date range now has an expand chevron on the row; clicking it shows every date range inline as a clean list with a Recurring or Fixed badge per range, replacing the previous hover-tooltip that was hard to read on long lists. Rate Rules also now strip whitespace from the Rule Name field as you type so a code-style identifier like 'WEEKEND' cannot have spaces silently embedded in it.
Fixed
- Reservation Planner — Overdue Open Contracts Stay Visible Through The Overdue Period: An Open Contract whose original Due Back date has passed now keeps its timeline bar rendered all the way through to today, so the agent can still see the rental on the planner while it is late. Previously the bar disappeared as soon as the calendar paged past the original due-back date and only the side icons hinted that the rental was overdue. The overdue indicator itself has also been moved to the right edge of the row label so it no longer competes for space with the status block, and a duplicate 'Jump to pickup' tooltip action that did the same thing as 'View details' has been removed.
- User Management — Privilege Changes Now Take Effect Immediately Without Re-Login: When an administrator edits their own privileges and saves, the permissions cache is now force-refreshed immediately so menu items, page guards, and privilege-gated actions reflect the change in the same session — previously the admin had to wait out a roughly thirty-second cache window or sign out and back in for the new permissions to apply. If the refresh fails for any reason, a clear warning toast tells the admin to re-login so they are never left wondering why a newly granted privilege has not appeared.
- Bulk Check-In Settings Modal — Form Now Scrolls Properly And Location Checkboxes No Longer Double-Toggle: The Bulk Check-In Settings modal has been given a proper scrollable body with a sticky Save / Cancel footer so the bottom of the form is never clipped on shorter screens, and the location-list checkboxes now correctly stop click propagation so clicking the checkbox itself no longer toggles the row a second time.
1.9.48May 14, 2026
Changed
- Unified Contract Summary Dialog Across Inquiry, Counter Checkout, And Reservations Save: Contract Inquiry's Print button previously generated a generic browser-print summary that bypassed the form-template system used everywhere else, and the post-checkout flow redirected the agent to a separate `/print-contracts` page that re-rendered the same contract data in a different layout. A new shared `ContractSummaryDialog` is now used by Contract Inquiry, the counter `ReviewSubmitStep`, and both `ReservationsPage` save sites (checkout-mode RA edit + RA create) — Print pipes through the real `useNativePdfPrint` Document/Invoice → form-template pickers and produces a backend-rendered PDF; Email pre-fills the renter address and routes through the standard email pipeline; "Send for eSignature" surfaces only on Open contracts and submits to Signiphi. Closing the dialog (X) navigates to the RA list with no full-page redirect. The standalone `/print-contracts` route, its `lazy()` import, the duplicate `PrintEmailPage`, and the sidebar entry have been removed.
Fixed
- Adyen CC Terminal Resolution — Wrong Terminal Picked At Multi-Terminal Locations (Payments Couldn't Start): `createAdyenSession` was sending only `locationCode` so when a location had multiple Terminal rows the backend's `resolveCcControl` used Prisma `findFirst` with no ordering and could pick a row whose `cardTerminalId` was the sentinel string `"NONE"` instead of the workstation's real terminal — the `CreditCardControl` lookup then failed with a 400 and the agent couldn't start the payment. The frontend now passes `terminalSettings.DeviceID` as a new `terminalCode` parameter so the backend lookup is pinned to the exact workstation terminal; the backend filter now adds `notIn: ['NONE', '']` to `cardTerminalId` so the sentinel string can never be matched even on stale rows; and the Terminal Settings form has been hardened to strip the literal `"NONE"` to `null` before save so the falsy-check no longer lets the sentinel be written to `card_terminal_id` in the first place.
1.9.47May 14, 2026
Added
- Vehicle Photo Gallery + Primary Photo Across All Vehicle List Views: A new Photos tab on the vehicle profile supports multi-upload, set-primary, drag-to-reorder, lightbox, and source-filter pills (All / Gallery / Damage). The gallery also surfaces inspection-damage photos read-only, grouped by inspection event with color-coded type badges (Scratch / Dent / Missing / Photo), and a damage photo can be promoted to a vehicle's primary without re-upload (a new gallery row is created pointing at the same S3 key). The primary photo now flows through the Fleet datatable column 0, the vehicle profile / details modal, the vehicle form general-tab cover, the shared RE/RA/NR vehicle search modal, the `ReservationDataTableCard` card view (replacing the generic Lucide `Car` icon with `VehicleThumb` + `FaCar` fallback), and a brand-new Photo column at index 0 on the Reservations, Open Reservations (RA), and Non-Revenue datatables. The backend list endpoints (`/reservations`, RA list, `/non-revenue`) have been extended with `primaryPhotoUrl` using the same gallery → legacy `imageFile` fallback that the vehicles list endpoint already uses, so all four list endpoints now agree.
- Repair Orders + Maintenance Alerts: A Repair Orders tab, table, and modal land under Operations → Maintenance, with transaction-number-range integration and creation gated on at least one maintenance alert existing for the tenant (the form blocks with a helpful link to the alerts page when none exist). The status workflow advances OPEN → IN_PROGRESS → COMPLETED and the close action is gated on status. A warning-alert indicator is inlined next to the unit number on the Fleet, RA, and non-revenue datatables — red AlertTriangle for "RO required", amber Wrench for "IN_REPAIR" — with a count badge when multiple alerts exist on one unit; this replaces the standalone "Alert" column that was empty on nearly every row. schedule fields (`Pester` action, sub-day `freqSeconds`, free-text `groundedDescription`) are preserved alongside dev's parallel counter-based scheduling (`freqCounter`, `lastCounter`, `nextCounter`) so both feature sets coexist additively in `AlertModal` and `ProcedureModal`.
- Res Planner Booking-Detail Notes: The booking detail modal on the Reservation Planner now has an inline notes section with add, delete, pin / unpin, a count badge in the modal header, and lazy load with a per-booking cache in `useResplannerStore`, backed by `notesApi`. Notes survive a modal reopen and reflect changes immediately.
- Res Planner Overdue Open-Contract Indicator: Open contracts that are past their expected return now surface an "Overdue" badge on the vehicle row, a drag-confirm warning, and a jump-to-pickup action so the agent can quickly resolve the late return without leaving the planner.
Changed
- Datatable Column Version Bump To `_columns_v2` With Smarter Insert Logic: To make the new Photo column appear automatically without forcing every user to manually reset their datatable customizations, `useColumnSettings`' storage key has been bumped to `_columns_v2`; existing users' column order, width, and hidden-column preferences reset once on first load after this ships. New "insert at code-defined position" merge logic has been added so future column additions slot in at the right index without another version bump.
Fixed
- Res Planner Active-Booking Edits Now Route Through The Real Edit Pages: Res Planner was previously letting agents drag, resize, or unassign active rental agreements and non-revenue tickets in ways the data model forbids — most concretely, dragging an active RA whose start date is in the past, and unassigning vehicles from active RAs or non-revs. The planner now disables drag and resize at the source for any active RA whose start time is in the past, and a click on the block routes straight to `/dashboard/checkout/<raNumber>/edit`. Dropping an active RA or non-rev on the Unassigned lane is rejected at drop time (the popover never opens, the block snaps back, a toast explains why) and the Unassigned lane filters RAs and NRs out entirely. For future bookings, drag-confirm and the booking-detail modal's location editor now stage the proposed change in sessionStorage and redirect to the matching edit page (`/dashboard/checkout/<raNumber>/edit`, `/dashboard/reservations/<resNumber>/edit`, or `/dashboard/non-revenue/<number>?edit=1`) — the strict modification logic continues to live exactly where it already does, on the dedicated edit pages, not in the planner. The staged change carries a `returnTo` path so saving lands the agent back on Res Planner instead of the default list view, and the popover button is re-labelled "Show all changes" / "View all changes" with an external-link icon to convey the redirect intent.
- Res Planner Reservation Bars Off By One Day For Date-Only Strings: `YYYY-MM-DD` date strings were being parsed at UTC midnight, which rendered bars one column early or late for tenants outside UTC. A new `parseLocalDateTime` correctly handles date-only strings and is now used in every booking-position computation on the timeline.
- Res Planner Vertical Vehicle-Assignment Drag No Longer Shifts Dates Or Times: Vertical drags to assign a vehicle to a different row were shifting the booking's pickup / return by every horizontal pixel of cursor jitter, because the drag handler applied X delta unconditionally. The handler now detects the dominant axis per frame and freezes the X position when `|deltaY| > |deltaX|`, so vertical drags only change vehicle and horizontal drags only change time. Diagonal drags still allow both to change.
- Res Planner Class-Mismatch Confirmation Before Silent Upgrade/Downgrade: Dropping a reservation onto a vehicle of a different class than reserved was silently accepted. A new AlertDialog ("Vehicle class differs from reservation") now prompts the agent to Accept and update (treats as upgrade/downgrade) or Cancel (reverts the optimistic timeline update) before any drag-confirm popover renders. The pending drag is held behind the modal.
- Res Planner Modals Dismissed By Outside-Click On Child Popovers: Radix outside-click was firing when the user interacted with a child popover, dismissing the parent modal. Gated with `pointerDownOutside` capture so child popovers no longer dismiss their parent.
- Res Planner Drops On Unavailable / Sold Vehicles Now Blocked At Drop Time: Maintenance, grounded, and sold vehicles now render a row-spanning grey bar across their unavailable window and drops on those rows are rejected at drop time with a toast.
- Edit-Page Click-To-Apply Banner Replaces Silent Staged-Edit Cascade (Backend 30s Transaction Timeout Fix): The previous Res-Planner-to-edit-page staging consumer silently populated every staged field on form hydrate; when it touched rate-rule recompute paths it was blowing the backend's 30 s transaction timeout. Each staged field now exposes its own Apply button in a new suggestions banner; date and time are grouped per pickup/return so the form never sees an inverted-date window; Vehicle Apply opens the picker pre-filled with the unit number for the user to confirm. The backend save log now shows `Updating sections: ['rrmType','pickupReturn','vehicle']` (no `rateCharges`) and the save completes well under 30 s.
- Edit-Page Open Latency Dropped By ~1.25 Seconds: The `isSettled` timer that gates the staging banner, draft restore, and other UI was reduced from 1500 ms to 250 ms, so the edit page no longer sits in dead time for a second and a half after every API fetch. `getFormState()` was also deduplicated in the draft-snapshot block.
- Inspection History Tab Rules-Of-Hooks Crash On Self-Inspection Flag Flip: The canonical `InspectionHistoryTab` called `useSelfInspectionFeature()` (Zustand-backed) and `useSIContractData()` then conditionally returned before twelve subsequent `useState` / `useEffect` / `useCallback` hooks. Because the Zustand store hydrates async, the flag flipped between renders and React threw `Rendered fewer hooks than expected`. Split into `<SelfInspectionView>` and `<StaffInspectionView>` sub-components that own their own hooks; the top-level `InspectionHistoryTab` is now a thin picker.
- Vehicle Search Status Filter And Self-Inspection Page-Size Pre-Existing Bugs: `vehicleApi.searchVehicles` was sending `Status` (capital S) where the backend DTO expects `vehicleStatus`, silently dropping the filter on every search; `selfInspectionApi.checkLocationExists` was calling `searchLocations({ perPage: 500 })` against a Self-Inspection service that caps `perPage` at 50, returning a 400 on every check. Both fixed.
1.9.46May 14, 2026
Fixed
- Loading Error After a New Release — No More Refresh-And-Hope: Users who kept the app open while a new version was deployed were occasionally seeing a "Loading Error" screen when clicking through to another page, because their browser was still trying to fetch files from the previous release. The app now recognises this situation and automatically refreshes itself once to pick up the latest version, so users keep working without having to manually reload or sign back in. If a page genuinely fails to load for another reason, the existing error screen still appears so issues are not hidden.
1.9.45May 14, 2026
Added
- Counter Checkout — Unlinked Deposit Navigation Guard: The walk-up counter checkout flow now mirrors the reservation page's `UnlinkedDepositGuard`, intercepting back/forward/in-app navigation when a captured deposit exists on the active session but no rental agreement has been created yet. The guard wires `useUnlinkedDepositGuard` + `getPaymentsBySession` to a sessionId-scoped query and refetches on payment-modal close so a just-taken deposit is visible to the next nav attempt. A `bypassUnlinkedDepositGuardRef` flag flips inside the new `onBeforeNavigate` callback on `useCheckoutSubmit` so the post-submit redirect to `/print-contracts` is not intercepted; the bypass only flips on the success path (`raNumber` set) so stale leaks after a failed submit are still blocked. The guard is enabled in walk-up mode only — from-reservation mode is skipped because the existing reservation already owns the deposit. `UnlinkedDepositGuardModal` gains optional `stayButtonLabel` and `contextLabel` props so the checkout flow displays "Stay in Rental Agreement" / "rental agreement" wording while the reservation copy stays as the default.
Fixed
- Vehicle Fleet Page — KPI Tiles And List Now Agree (Total / On Rent No Longer Diverge): The Vehicle Fleet page tiles (Total Vehicles, Available, On Rent, etc.) and the underlying `/vehicles` list were silently disagreeing — KPI showed the real per-tenant count (e.g. 55) while the list returned only the subset the caller was allowed to rent (e.g. 15) because the `RENT_UNAVL` privilege ("Ability to rent a vehicle currently marked as unavailable") was being applied as a *viewing* filter inside `VehiclesService.findAll`, hiding every on-rent vehicle from any user without the privilege. The filter has been removed from the listing — the same privilege is still enforced at the actual rental-creation boundary in `reservation-validation.service.ts`, so removing it from the generic listing does not allow renting unavailable vehicles. Three accidental duplicate copies of the filter block (merge artifact across two prior PRs) were also collapsed, and the now-unused `PrivilegeService` injection, `PrivilegesModule` import and matching spec mock have been removed.
- Vehicle Profile Lookup — `GET /vehicles/:unitNumber` No Longer 404s On Legacy Whitespace, Now Scoped By Tenant: Calling the single-vehicle endpoint against a row whose stored `unit_number` carries leading or trailing whitespace (e.g. `"2352 "`) was returning 404 because the lookup was exact-match; trimming the path param alone did not help because the stored value still had the whitespace. A new `TrimPipe` is applied to the `:unitNumber` path param, and a new `resolveVehicleIdByUnitNumber` helper uses raw SQL (`WHERE TRIM(unit_number) = $1`) to find the canonical row id, after which the existing Prisma query re-fetches by primary key so all relation includes still work. `@CurrentUser` is now plumbed through the controller into the service and the tenant id is part of the lookup predicate, closing a tenant-scope gap where any authenticated user could fetch any tenant's vehicle by unit number. `@Transform(trim)` has been added to `VehicleCreateDto.unitNumber` and `VehicleImportRequestDto.unitNumber` so new writes can no longer reintroduce the whitespace.
1.9.44May 14, 2026
Added
- Check-In — Dedicated CheckInEditPage Route: A new greenfield check-in route at `/dashboard/checkin/:resNumber/edit` replaces the legacy reuse of `ReservationsPage` for vehicle returns. The page composes five dedicated wrapper sections (Pickup & Return, Vehicle & Readings, Rate Selection, Misc Charges, Payments) with a Collapsible left column, a sticky right-column summary sidebar (gradient header, driver card, vehicle card, expandable Time & Mileage, Misc, Taxes, Fuel and Payments sections, balance-due banner, Add To Balance button), and a single shared `CheckInFormContext` carrying reservation number, vehicle inspection data, and check-in privileges. The submit button shows the outstanding balance amount, is disabled until odometer and fuel level are provided, and the page is isolated from `ReservationsPage` so the legacy form is no longer mutated by check-in flows.
- Locations — Disable-Impact Warning Before Deactivating a Location: Flipping a location's Status toggle from Active to Inactive now fetches a new read-only `GET /locations/:id/disable-impact` summary and, if any open RAs or reservations reference the location as their checkout or expected-return, surfaces a confirmation dialog showing the counts and a small sample of affected RA / Reservation numbers before the save proceeds. Operators can no longer silently break in-flight rentals by disabling their location.
Changed
- Counter Check-In — Refund / Void / Delete Payment Icons Aligned With ReservationsPage: The Counter Check-In payments timeline now uses the same icon language as the Reservations payments timeline — RotateCcw for refund, Ban for void, Trash2 for delete — and CC/DC payments correctly suppress the void action. The Total-Before-Payments row is now rendered above the Balance Due row and an Add $X to Balance button sits directly below the balance banner, matching the established pattern.
- Access Rights — Admin-Role and Permission Components for Configuration Surfaces: Configuration screens that should only be touched by tenant admins (Claims status rules, Insurance carriers, Letter templates, Equipment / Fuel / Source of Business / Source Referrals tables, Terminal Credit Cards table, Roles, User Management Access Rights, etc.) now wrap their controls in new `RequireAdminRole` and `RequirePermission` components and surface a `ReadOnlyBanner` to non-admin users instead of silently no-oping or letting unauthorised users hit a guarded API. Permission children definitions in Business Operations have been extended to drive the new banners.
Fixed
- Contract Modify — Rate-Rule Misc Charges Preserved Across Rate Switches: Misc charges tagged with `source: 'rateRule'` were being silently dropped on save and silently skipped when a new rate's rule did not include them. The initial load and rate-switch paths in `useContractModifyForm` now tag charges sourced from `rateRuleIncludedCharges` correctly so the `source` field survives the save round-trip; when the new rate's rule introduces a charge not on the contract the system now calls `qualifyCharges()` and auto-adds qualifying charges with `source: 'rateRule'` (silently skipping unqualified ones); and when the new rate's rule drops a charge the old rule included, the charge is immediately converted to `source: 'manual'` and a new `DroppedRateRuleChargesModal` lets the agent choose Keep (stays as manual) or Remove. The stale "add them manually if needed" warning toast has been removed.
1.9.43May 12, 2026
Added
- Claims — Default Lookup Values Backfill, Document Required Badges, and Claim History Refresh: The Claims module ships a series of follow-ups discovered while testing end-to-end. Tenants that had never configured their Claims lookup tables (Claim Types, Expense Types, Recovery Sources, Document Types, Contact Types, Claim Payment Types) are seeded with the legacy AutoMate2 / RentWorks defaults; the Claims Setup page now exposes a Payment Types tab and renders an inline Required badge on Document Types via a new optional `metadataColumns` prop on the shared LookupsJokerPage; the Claim form auto-imports vehicle and renter when a valid RA is verified (the import dialog no longer auto-opens and the default option is `'all'`); the shared `MementoHistoryPanel` now refreshes its fetch when the parent entity's `auditInfo.updatedAt` changes; and `useUpdateClaim` / `useUpdateClaimStatus` now invalidate history queries via the prefix `['claims', 'history', id]` so every paginated history page reflects the latest edit.
Fixed
- Vehicle Class / Rate Configuration — Time & Mileage Modal No Longer Pops False "Unsaved Changes" Dialog (Urgent): In Vehicle Class / Rate Configuration → Time & Mileage, the unsaved-changes dialog was popping up on every close attempt even when the user had not touched a single field — confusing users into clicking Discard thinking it was harmless, which then surfaced as "Time and Mileage rate disappears after update". The edit-mode dirty check was falling back to `rateLines.length > 0`, which is true for every rate that has lines, so `isDirty` returned `true` on mount before any user interaction and the close-guard intercepted every close. The dirty check now compares against the initial form snapshot instead of the line count, so the dialog only appears on real changes.
1.9.42May 12, 2026
Changed
- Reservations Page — Phase 0 Refactor: 9 Shared Components Extracted: Phase 0 of the ReservationsPage god-page split extracts 9 prop-driven components from `ReservationsPage.tsx` and wires them in-place — `TwoColumnPageLayout`, `ViewOnlyIndicator`, `NotesSection`, `DraftRestoreButton`, `TopSelectorBar` (`mode='checkin' | 'checkout' | 'reservation'`), `PrimaryDriverCard`, `MobileSaveBar`, the `ChargesSummary` parent + 6 breakdown children, and a `getSubmitLabel` helper for `SubmitMode` → label resolution. `ReservationsPage.tsx` drops from 7,335 to 6,558 LOC (-777) with no behaviour change. These components become the composition primitives for the upcoming `CheckInEditPage`, `CheckoutAgreementPage`, and `ReservationPage` phases so cross-page consistency is enforced by prop unification instead of fork-and-edit.
1.9.41May 12, 2026
Added
- Contract Modify — Full Payment Actions Panel: The Contract Payment Section on the Contract Modify page has been expanded from a single Add Payment button into a fully-functional payment management panel. The list of payments is fetched and re-fetched on every action via `getPaymentsByContract` and capped at a scrollable height so it never pushes the Save button off-screen. An amber Auth-Hold panel surfaces AUTHORIZED deposits with `depositCaptured = false` and offers Capture Funds (routed to Adyen or the manual endpoint based on `processorTxnId`) and Void Hold actions. Each row carries per-row action buttons in the compact timeline variant — Pencil to edit a cash payment (amount + memo), RotateCcw to refund (modal pre-fills the remaining refundable balance and routes to `refundAdyenPayment` or `refundManualPayment`), Ban to void non-CC/DC, Trash to delete cash. Confirmation dialogs precede void and delete. The previous `balanceDue > 0` gate on the Add Payment button has been removed so payments can be added at any time, and the selected company name is now threaded through to the choose-payment modal.
- Custom Fields — End-to-End Custom Field Support on Vehicles, Customers, Non-Revenue, and Field Security: Custom field definitions are now first-class across the configuration and entity layers. The Field Security Configuration tab now manages custom field definitions inline with built-in fields and the screen selector uses the shared SearchableSelect, the Vehicles Finance tab is reorganized into a Card layout with a sticky section-navigation bar that scrolls between Finance subsections, custom fields are wired through the Vehicle Form, Customer Create / Profile, Non-Revenue Details, and Fleet / Equipment Overview reports, and the underlying field-security service exposes custom fields end-to-end.
Changed
- Rental Agreements Dashboard — Open / Voided / Closed Status Tiles: The Rental Agreements dashboard's Checked Out and Pending tiles have been replaced with Open, Voided, and Closed tiles that break Total Contracts out by contract status, so agents can see the contract mix at a glance. The Reservations dashboard tiles are unchanged.
- Vehicle Inventory — Clear Session Documentation Tightened: The `clearSession` mutator on the vehicle inventory service has been re-documented to make clear that it clears all line items from a session (not the manager-only backend action the previous comment implied), and the supporting access control on the physical-inventory clear path has been updated accordingly.
1.9.40May 11, 2026
Added
- Reservations & Counter Checkout — Vehicle Planner-Conflict Warning Modal: When a walk-up rental agreement takes a vehicle that is already pre-assigned to one or more future reservations in the Reservation Planner, the agent now sees a yellow warning modal listing each conflicting reservation with its dates and RA/res numbers. The agent can either pick a different vehicle or click "Proceed with Conflict" to continue; the affected future reservations are then flagged in the database so the planner can display a purple conflict indicator next to them until they are reassigned. The same flow runs from both /counter/checkout and /dashboard/checkout/new.
- Reservation Planner — Vehicle Conflict Indicator on Timeline Rows: Reservations whose pre-assigned vehicle was taken by a walk-up RA now render with a visual conflict indicator on the Reservation Planner timeline, so agents can spot affected bookings at a glance and reassign them before their pickup date.
Fixed
- Counter Checkout — Walk-Up Conflict Flag No Longer Crashes Post-Commit: The planner-conflict flag write is now sent after the walk-up RA has been successfully created, and a failure to flag no longer rolls back or duplicates the just-committed RA. Agents see an inline toast if the flag call fails and the RA itself remains intact.
- Counter Checkout — No Stale Conflict IDs After Lock Failure: The list of acknowledged planner-conflict IDs is now only written to the checkout store after the vehicle lock has been confirmed. If another agent grabs the lock in the same instant, the local store stays clean so unrelated future reservations are not flagged in error.
- Vehicle Availability — Errors Now Surface Instead of Faking Success: A failed availability check no longer returns a fake "available" result; callers see a toast and can retry or pick another vehicle, preventing silent over-bookings.
1.9.39May 11, 2026
Added
- Counter Checkout — Location Filter on Contract Search: The Counter Checkout contract search step now includes a Location dropdown alongside the search bar. Agents can scope today's reservation queue and free-text searches to a specific pickup location, and the selected location is appended to the “Today's Reservations” header so the active filter is always visible. The queue's status filter has also been retuned from Pending Open to No Show so cars that did not arrive surface alongside open reservations.
- Reservations — Edit Cash Payment Workflow: A new Edit Cash Payment dialog has been added to the Reservations payments timeline. Agents with the new edit-cash-payment permission can adjust the amount and notes on a recorded cash payment in place, with full validation and audit, instead of having to void and re-enter it. Users without the privilege see the existing read-only view.
- Reservations & Vehicle Picker — Override Vehicle Availability and Underage Driver Alerts: Privileged agents can now override vehicle availability when picking a car from the inline grid, vehicle search modal, or counter checkout vehicle step, and unavailable vehicles render with a clear override affordance instead of being hidden. The same flows now surface an underage driver alert before vehicle selection, with override controls gated by the underage-driver permission so the warning cannot be silently bypassed.
- Vehicle Fleet — Coming Soon Tab: A new Coming Soon tab is now rendered on the Vehicle Fleet page surfacing vehicles that have been pre-loaded but not yet placed in service. The page reads the new Coming Soon status seeded in 1.9.32 and renders each row with the same actions available on the standard fleet list, so fleet managers can track and activate inbound inventory from a single place.
- Checkout — Customer Override Modal for Blocking Issues: The checkout flow now consults a new `getCheckoutBlockingIssues` endpoint on `customerApi` and surfaces a `CustomerOverrideModal` listing every issue (expired licence, unqualified rate, underage driver, blacklisted customer, etc.) that would otherwise block the agreement. Authorized agents can review and override individual items; a `logCheckoutOverride` call records the override on the customer for audit. The existing hard-block is preserved for agents without override privileges. The override flow is wired through every counter checkout step (Driver Selection, Vehicle Selection, Rate & Charges, Vehicle Return on check-in, and Review & Submit) so blocking issues surface consistently before commit.
- Privileges — Auto-Refresh on Permission Change: A new `usePrivilegeAutoRefresh` hook and `NewSolProtectedRoute` wiring now keep the permissions store in sync with the server without requiring the agent to sign out and back in. When an admin grants or revokes a privilege from the Privileges tab, the affected user's session picks up the new permission set on the next protected-route transition and the UI re-evaluates privilege-gated actions immediately.
Fixed
- Misc Charges — Tax-Type Charges Can No Longer Be Marked Taxable: Sales Tax, Federal Tax, Other Tax, and Misc Fees charge types now hide the Taxable tab and force the taxable flag off in the Misc Charge form, preventing the circular configuration where a tax could be taxed by itself. Switching an existing charge to a tax type automatically jumps the user back to the General tab, clears the taxable flag, and disables the checkbox with an inline “tax charges cannot be taxable” hint. The Percent Calc tab's applicable-targets list is also filtered to exclude tax-type targets.
1.9.38May 11, 2026
Added
- Rental Agreements Dashboard — Open / Voided / Closed Tiles: The Rental Agreements dashboard tiles have been re-cut from the legacy Checked Out and Pending tiles to a new Open / Voided / Closed split sourced from the dedicated KPI counts shipped in 1.9.31. Total Contracts and Total Revenue now sit alongside three colour-coded status tiles (Open in green, Voided in red, Closed in secondary) so agents can see the contract mix at a glance, and the Reservations page tiles continue to use the existing Active and Pending counts unchanged.
- Vehicle, Customer, and Company Lists — Toolbar Filters, Filter Presets, and Multi-Value Pickers: Continuing the filter UX cleanup started in 1.9.37, the Vehicle Fleet, Customer Management, and Companies list pages now share the same toolbar primitives. A new `toolbarFilters` slot on the shared DataTable carries multiple inline dropdowns next to the legacy status filter (so Companies can render both Status and Type pickers in the toolbar), Filter Presets snapshot toolbar state alongside advanced filters so customer and company pages — which have no advanced panel — can also save presets, and the Companies list adds a Company Type filter (Broker, Corporate, Insurance, Tour, Other, Partner) that filters server-side.
- Customer Form — Auto-Filled Badge on Postal-Code Lookups: A new AutoFilled badge is now rendered against the City and State fields when they are auto-populated from a postal-code lookup, so agents can see at a glance which fields were filled in by the system and which were entered manually. The renter form in checkout now shares the same lookup service used by the customer form so the experience matches across both surfaces.
- Driver Management — Employer Field: An employer field has been added to the Driver Management panel and is now threaded through the checkout API, counter checkout wizard, and reservation new-driver form, so agents can capture and edit the renter's employer alongside the rest of the driver record.
Changed
- Vehicle Class Modal — Reordered Fields and Auto-Derived Class Code: The Vehicle Class creation modal now opens with the Status toggle at the top, the Description input above the Class Code, and an auto-derived Class Code that lowercases and strips spaces from the Description until the user manually edits it (auto-derive then locks for that session so manual input is not clobbered). The Product field pre-selects from terminal settings on create, and the legacy Alternative Classes section has been removed.
Fixed
- Counter Checkout — Crash on Existing Agreements Fixed: Opening an existing reservation or rental agreement from the Counter Checkout flow (/counter/checkout) and from the Reservations Checkout details page no longer triggers a Loading Error screen on first render. The checkout wizard now renders reliably the moment the existing agreement finishes loading.
1.9.37May 9, 2026
Added
- Misc Charges — Taxable Tab Available on Every Charge Type: The Taxable tab in the Misc Charge form is now visible for every charge type. The applicable-taxes list automatically filters out taxes of the same type as the charge being edited to prevent circular tax configurations, with a clear loading and empty state while the list is being computed.
- Rental Agreements & Reservations — Filter Presets, Multi-Unit Search, and Shared DataTable Cleanup: The Rental Agreement and Reservation list pages have been reworked to fix several long-standing filter inconsistencies. The RA browser status dropdown no longer offers reservation-only statuses (Quote, Open Reservation, Cancelled, etc.); Location Out and Location Due now write to distinct backend params instead of silently overwriting each other; the previously-shipped Filter Presets bar is now actually rendered in the toolbar; the Unit Number filter accepts a comma-separated list of units in a single search; the global search box matches across closed contracts so customer-name searches no longer miss them; and status pill labels truncate cleanly with an ellipsis instead of being clipped by the surrounding cell.
Changed
- Misc Charges — Tiers Checkbox Removed: The Hourly / Daily / Weekly / Monthly rate inputs in the Misc Charge form now render directly whenever a time-based Calculate By method is selected (24 Hour, Calendar Day, Modified 24 Hour) — the redundant Tiers checkbox toggle has been removed so the price grid appears in one step instead of two.
- Non-Revenue — Inspection and Vehicle Selection Flow Refactor: The Open Non-Revenue screen no longer carries an unused location state and now navigates straight to the dashboard non-revenue list. The shared Vehicle Selection Section has been updated alongside this change so the inspection modal opens against the actually-selected vehicle instead of falling back to the previously-selected one.
Fixed
- Counter Checkout — Added Driver No Longer Wipes Pre-Filled Charges: Adding a driver through the counter checkout step previously cleared the in-progress charge breakdown because the addition path passed through a different store mutator than the rest of the flow. The `addAdditionalDriver` mutator has been renamed and routed through a single `addDriverWithData` path used by both the renter-search and new-driver entry points, so the charge calculation survives a driver add and the additional-driver charge is reflected on the contract immediately.
1.9.36May 9, 2026
Added
- UI — Full Keyboard Navigation in Searchable and Multi-Select Dropdowns: The shared searchable single-select and multi-select dropdowns used across country pickers, location filters, vehicle pickers, report filters, and dozens of other places throughout the app can now be driven entirely from the keyboard. Enter or arrow keys open the popover, typing a letter seeds the search, arrow keys with wrap and Home/End move the highlight, and Enter or Tab commit the selection and advance focus to the next field in one keystroke.
Changed
- Vehicle Fleet — Unavailable Badge on Reservation Tiles: The Open Reservations table now surfaces a clear Unavailable badge on each reservation tile whose pre-assigned vehicle is no longer available, so agents can spot affected bookings without opening each reservation. The Vehicle Class form modal and Vehicles datatable were updated alongside this change to align tile rendering with the new shared badge component.
- Vehicle Fleet — Custom Status Tiles in KPI Strip: The Vehicles datatable KPI strip now renders a tile for every tenant-defined custom vehicle status alongside the standard tiles, so the breakdown always reconciles with Total Vehicles instead of silently rolling non-standard rows into Available.
Fixed
- Exports — Export All No Longer Fails With Validation Errors: Clicking Export All from the Companies, Fleet, and other data tables no longer fails with a validation error. Exports now paginate within the server's row cap and assemble the full result set in the background.
- Contract Modify — Keep Dates No Longer Wipes Vehicle and Rate on OnRent Conflict (Critical Data-Loss Fix): When editing an OnRent rental agreement, changing the pickup date pops the vehicle-availability conflict modal. Clicking Keep Dates silently nulled the selected vehicle, dropped the conflict info, and made the agreement appear to lose its rate — destroying data on an active rental with no recovery path. Keep Dates now flags-and-keeps instead of wiping: the vehicle stays on the agreement with an amber Date Conflict badge and a banner listing the conflicting RA / RES, rate, equipment, odometer, fuel, and other agreement data are preserved, and Save is blocked until the agent picks a replacement vehicle, at which point the conflict clears automatically.
1.9.35May 9, 2026
Changed
- Vehicle Profile — Unified Primary Action by Vehicle Status: The Vehicle Profile header no longer hard-codes a single Check-Out action. The page now resolves the appropriate primary action from the vehicle's current status — checkout for Available, check-in for On Rent, close work order for In Service, or return to service for Out of Service — and renders only that action button. The legacy `onCheckout` prop has been replaced with a more flexible `primaryAction` prop on the shared header, and supporting type definitions have been tightened.
- Customer Form — Phone Section Collapsed Into Single Searchable Country Selector: The phone-numbers section in the renter detail panel previously rendered three controls per row — a flag-only country dropdown with no search, a read-only "+1" box, and the phone-number input — which made the layout look broken and made non-top-of-list countries slow to find. The dropdown + read-only box pair is now replaced with a single searchable selector that renders the flag and dial code together (e.g. 🇺🇸 +1), matching the pattern already established for the customer form.
Fixed
- Reports — TAX/FEE Type Filter Now Tracks Report Mode: The TAX/FEE Type multi-select on the Tax, Fees & Misc. Charges report now mirrors the active Report Mode. Picking Tax & Fees hides misc-charge codes and picking Misc. Charges hides tax/fee codes, and any selections that no longer apply after a mode switch are pruned automatically.
1.9.34May 9, 2026
Fixed
- Terminal Settings — Saved Location No Longer Wiped After Save: Saving a terminal Location no longer clears itself when the modal is reopened on tenants with many locations. The settings dialog now loads the full active-location list before validating the saved value, and the dashboard's location filter updates immediately when a new terminal Location is saved instead of requiring a hard refresh.
- Dashboard — Today's Operations Tile Shows Correct Times: The Today's Operations tile now renders pickup and due-back times exactly as entered on the reservation, without shifting by the browser's time-zone offset. The Pickups and No Show tabs also relabel their columns to "Date & Time Out" and "Date & Time Due" for reservation context; the Due Back and Overdue tabs keep the existing "Check Out" and "Check In" labels.
- Reservations — Closed Contract Edit Preserves Stored Return Date and Time (Critical Financial Fix): Editing a closed rental agreement was silently overwriting its return date and time with today's date and time, recalculating Time & Mileage charges from the new duration, and surfacing a false balance due on a fully-paid contract — an agent who did not notice the silent change could collect money that was not owed. The Edit button on a closed contract now routes through the Contract Modify page (not the check-in URL, which is reserved for live returns), and the form-loader now reads the actual `dateIn` / `timeIn` captured at close instead of the planned `dateDue` / `timeDue`, so closed contracts open with the correct stored return values.
- Reservations — Stale Reservation Default Return Auto-Populates To Pickup + 1 Day: Honoring a reservation whose return date is already in the past (or missing) previously loaded the stale `dateDue` / `timeDue` from the database and required the agent to manually correct it before continuing. The form-loader now detects a past or missing return at populate time and defaults the return to pickup + 1 day (24 hours); reservations whose original return is still in the future are unchanged.
1.9.33May 9, 2026
Fixed
- Dashboard — Fleet Status Drill-Down Preserves Location: Clicking a status count on the Fleet Status widget now forwards the dashboard's current location filter to the Vehicle Fleet page, so the drill-down list matches the count that was clicked. When the dashboard is set to All Locations, no location filter is applied.
- Customers — Validation Details Now Surface on Create: The Add Customer page now shows the full list of validation errors returned by the server in the failure toast, so agents can see exactly which fields need fixing instead of a generic "Please fix the following validation errors" message. The Additional Personal Information section's "Start Date" field has also been relabeled to "License Issue Date" to match what it actually saves.
- Payments — Cash Receipts Auto-Refresh After Voiding a Direct-Bill Payment: When a Direct Bill payment is voided on a rental agreement, the linked corporate account's Outstanding Charges, Receipt History, and Total Receipts now refresh automatically. Agents no longer need to manually reload the Cash Receipts page to see the cascaded changes.
- Reservations — Adding Misc Charges Stops Freezing the Rate Breakdown: Adding a miscellaneous charge such as CDW or PAC to a reservation or rental agreement no longer causes the live rate calculation to silently fail and freeze on its last total. Charges and taxes now update on the breakdown as expected.
1.9.32May 9, 2026
Added
- Claims — Default Lookup Values Seeded for Every Tenant: New tenants are seeded with the legacy AutoMate2 / RentWorks defaults for every Claims lookup category — Claim Types, Expense Types, Recovery Sources, Document Types (with Rental Agreement marked as required), Contact Types, and a new Claim Payment Types lookup — so the Claims module is usable out of the box without manual setup. Existing tenants whose lookup tables are empty are backfilled with the same defaults; tenants that have already configured their own values are left untouched.
- Claims — Configurable Expense and Payment Types: Claim Expense Types and Claim Payment Types are no longer hardcoded enums and can now be managed from Configuration → Claims Setup like the other claim lookups, so tenants can add, rename, or retire their own expense and payment categories.
- Notes & Claim Reminders — Author and Assignee Display Names: Note and claim-reminder responses now include the author's or assignee's full name alongside the existing user identifier, so the Notes panel and Reminder views can show 'First Last' instead of an email address or user id on every list, detail, and update response.
- Vehicles — Coming Soon Status Backfill and Filtering: A new Coming Soon vehicle status is now seeded across tenants and surfaced as a first-class slice on Fleet KPI metrics. Vehicle list and dashboard breakdowns recognise the status and filter on it, and existing custom statuses are handled consistently so non-standard rows are no longer silently rolled into Available.
- Counter & Locations — Privileged Location-Hours Override Audit Trail: Agents who use a privilege to check out a vehicle outside the location's configured operating hours now write an audit log entry recording the overridden window, the privilege that allowed the override, and the user who exercised it, so out-of-hours rentals are reviewable after the fact.
Fixed
- Claims — History Tab Now Records Every Edit: Editing money fields such as estimated damage and subrogation amount, along with other claim fields including status, description, total estimate, total paid, deductible, and settlement amount, produced no entries on the Claim History tab because the audit pipeline was watching column names that did not exist and silently dropped Decimal money values from snapshots. Tracked fields now align with the real claim columns and the audit pipeline preserves Decimal and Date values on both top-level claim fields and sub-records (contacts, vehicles, expenses, reminders), so every edit is captured in History and reflected in the before/after diff.
- Claims — Subrogation Recovered and Notes Save Correctly: Subrogation Recovered and Subrogation Notes were accepted by the form but silently dropped on save because the create and update paths never wrote them through to the database. Both fields now persist on create and update, with Subrogation Notes validated up to 2,000 characters.
- Claims — Newest Same-Date Expense and Payment Rows Appear First: Claim Expenses and Claim Payments now sort by date and then by id (descending), so a row added on the same date as existing rows appears at the top of the list instead of getting buried.
1.9.31May 9, 2026
Added
- Privileges — RENT_UNAVL Now Enforced on Vehicle Search API: The vehicle search endpoint (GET /vehicles) now consults the caller's privileges and excludes On-Rent vehicles when the RENT_UNAVL privilege is not granted, instead of relying on client-side filtering that could be bypassed by any direct API call or by screens such as the Counter Fleet page that did not apply that filter. Privileged users see no change. The same WHERE clause is applied to both findMany and the paginated count so totals reconcile.
Fixed
- Rental Agreements Dashboard — Open / Voided / Closed KPI Counts: The Rental Agreements dashboard KPI endpoint now returns dedicated Open Contracts, Voided Contracts, and Closed Contracts counts and excludes pending-open rows from the Total Contracts figure, so the RA dashboard tiles reflect actual contract status totals. The Reservations dashboard tiles continue to use the existing Active and Pending counts unchanged.
- Dashboard — Fleet Status Widget Built Dynamically: The Dashboard Fleet Status widget no longer hardcodes eight status categories and silently drops anything else. The breakdown is now built from the tenant's actual `statuses` seed, so custom statuses such as Unavailable surface as their own slice instead of being rolled into Available. The Non-Revenue code mismatch that was inflating the Available count (dashboard constant `nonRevenue` versus seed code `nonRev`) has also been corrected.
- Customers — Blacklist Cascades to Upcoming Reservations Atomically: Marking a customer as blacklisted previously flipped the status flag only, leaving every upcoming reservation live so a blacklisted renter could still walk up at the counter with a confirmed booking. The status flip, audit note, and silent cancellation of every upcoming reservation now run inside a single transaction — any failure rolls the whole operation back so the customer is never left in a half-blacklisted state.
- Counter & Reservations — Primary Driver Auto-Promotion Closure Bug: Removing the primary driver from a counter checkout, reservation, or rental agreement that had additional drivers occasionally failed to promote the next driver because a stale closure in the remove handler read the pre-removal driver list. The auto-promote dialog now reads the post-removal list correctly and the first additional driver is silently promoted to primary as expected.
1.9.30May 9, 2026
Added
- Vehicle Fleet — Custom Status Tiles in Fleet KPIs: The Vehicle Fleet summary tiles now include every tenant-defined custom vehicle status (for example 'Unavailable') alongside the standard Available / On Rent / In Service / Out of Service tiles. The KPI endpoint aggregates any non-standard status into its own count so the sum of every tile always reconciles with the Total Vehicles count, eliminating the gap where custom-status vehicles were counted in the total but invisible on the breakdown.
Fixed
- Payments — Voiding a Direct Bill Payment Now Cascades to Its Receipts: Voiding a Direct Bill payment from a rental agreement reversed the payment's AR contribution but left every Cash Receipts entry recorded against that payment active, so Receipt History kept showing the receipts and Total Receipts was overstated by the voided amount. Voiding a Direct Bill payment now soft-deletes every receipt attached to it in the same transaction, restores the corresponding corporate balance, and applies the same cascade when an entire rental agreement is voided.
- Internal — Test Coverage: Expanded unit tests for the misc-charge templates service, with a small follow-up cleanup to the service itself, to lock in commission-handling behaviour.
1.9.29May 9, 2026
Fixed
- Dashboard — Operational Load Tile Times No Longer Shift by Timezone: Today's Operations tile was rendering pickup and return times shifted by the browser's UTC offset, so an early-morning pickup could appear on the previous day. The endpoint now returns the saved date and time as raw values exactly as recorded, so the tile displays the agreed pickup and return times regardless of the viewer's timezone.
- Reports — Charge-Code Options Match the Active Report Mode: On the Tax, Fees & Misc. Charges report, the TAX/FEE Type multi-select returned every misc-charge template regardless of the active Report Mode. The option list is now filtered to the codes that match the current mode (tax/fee codes in Tax & Fees view, misc-charge codes in Misc. Charges view), so the filter only ever shows codes that can actually appear on the report.
- Corporate Accounts — $0 Receipts and Credit Memos Rejected at the Service Layer: Direct Bill receipts and corporate credit memos now reject zero-amount records at the service layer as an additional safeguard on top of the existing form validation, so internal jobs or any future caller cannot plant $0 entries that would inflate Receipt History or pollute credit-memo totals and AR aging reports.
1.9.28May 6, 2026
Added
- Contract Modification — Full Open Contract Edit Page: A new dedicated Contract Modify page lets agents edit any open rental agreement end-to-end — change the rate, swap the vehicle, edit drivers, add or remove miscellaneous charges, edit equipment, change pickup/return dates and locations, and update company information — with a live calculation sidebar that re-prices the contract as edits are made. A per-rental edit lock prevents two agents from working on the same agreement at the same time, and a session heartbeat keeps the lock alive while the page stays open. Saving routes the agent into the check-in flow with all updated values applied atomically.
- Contract Modification — Vehicle Exchange Within Open Contract: A new Vehicle Exchange section on the Contract Modify page lets agents swap the rented vehicle mid-rental. Agents enter the return fuel level and odometer for the outgoing vehicle, pick a new vehicle from the live availability list (with utilization score and a detail modal), and confirm the exchange — fuel and mileage charges accumulate per leg of the rental, and a full vehicle exchange history is preserved on the contract.
- Contract Modification — Closed Contract Editing: The Contract Modify page now also opens for closed contracts, letting accounting staff correct miscellaneous charges, taxes, and driver records on already-closed agreements (the Edit-button routing for closed contracts in the Reservations list, added in 1.9.24, is now backed by the full edit experience).
- Check-In — Late Return Overtime Charge: When a vehicle is returned after the due-back date, the system now automatically computes and posts a late-return overtime charge based on the contract's rate and the actual return date and time. The new charge is rolled into the balance-due total on check-in and printed on the closing rental agreement.
- Multi-Currency — Rate Snapshots on the Rental Agreement: At checkout, the location's currency and exchange rate to the system base currency are now frozen on the rental agreement. Every downstream calculation — rate, taxes, miscellaneous charges, late-return overtime — uses that snapshot rate, so prices on a contract no longer drift if the location currency or exchange rate is updated after checkout. The Contract Modify page surfaces the saved exchange rate for review and supports a manual override when the current location currency does not match the snapshot.
- Payments — Saved Cards on Rental Agreements (Adyen): Adyen card tokenization is now wired all the way through to the rental agreement. Agents can tokenize a card during checkout and reuse it for later payments on the same RA via a new Save to RA button in the payment modal; saved cards appear in the modal's saved-card list. A new Adyen tokenization webhook updates saved-card tokens automatically as Adyen rotates them, and duplicate cards (same last four + brand) on a customer, company, or rental agreement are deduplicated automatically.
- Insurance — Replacement Rental Insurance Fields: Open contracts now expose replacement-rental insurance fields end-to-end (bill-to, extension dates, coverage details), so insurance-paid replacement rentals can be edited and extended through the standard contract flow.
- Marketing — T&M Rates: Duplicate Rate Line Action: The Time & Mileage rate form now provides a Duplicate row action on every rate line, letting rate managers create a variant of an existing line in one click without re-entering shared values.
- Reservations — Tax-Exempt Removal Confirmation: Removing a tax-exempt customer or company from a reservation now prompts the agent with a confirmation explaining that taxes will be re-applied, preventing accidental loss of tax-exempt status.
- Counter — Rent Underage and Unqualified Rate Inline Hints: Continuing the privilege rollout from 1.9.26, expired-license, unqualified-rate, and rent-underage indicators are now surfaced directly in the driver-search and rate-selection steps of the Counter checkout, so agents can see at a glance which privilege gate would apply before selecting that driver or rate.
- Settings — Adyen Tokenization Webhook HMAC Key: The terminal credit-card configuration modal now exposes a Webhook HMAC Key field, so each tenant can configure its Adyen tokenization webhook secret directly from Settings.
- Contracts — Quick-Status Tab Filter: The Contracts list page now has a top bar with four instant-filter tabs — Open, Closed, Voided, and All — allowing staff to switch between contract status groups with a single click without opening the advanced filter panel. The active tab is preserved in the URL so the view survives a page refresh and can be shared as a direct link.
- Vehicles — Add Vehicle Section Navigation Strip: The Add Vehicle form now has a sticky navigation bar pinned below the page header with one button per section. Clicking any section name smoothly scrolls the form to that section and keeps the bar visible throughout the entire form. Required sections (Core Identifiers, Initial Status, Vehicle Identity) show a small Required badge so agents know at a glance what must be filled before saving.
Fixed
- Time & Mileage — Cascade Across Regular Tiers: Non-VP rate lines now cascade correctly across regular tier thresholds and route residual time and mileage units to overtime / extra-units lines, matching legacy AutoMate2 behaviour. Minimum-units thresholds now correctly use the rental duration in days. This eliminates a silent overcharge where the cascade rounded up.
- Vehicle License Fees — Half-Up Rounding: Per-day VLF charges now round half-up at every write site, eliminating 1-cent drift between the calculation preview and the posted total on the contract.
- Taxes — Auto-Apply No Longer Retroactive: Newly added auto-apply tax charges no longer re-apply to taxable charges that already exist on the contract, preventing double-tax scenarios when a tenant turns on a new auto-tax.
- Taxes — Recalculation on Misc Charge Edits: When a taxable miscellaneous charge is added, removed, or edited on a contract, dependent taxes now recompute automatically so totals stay in sync without requiring the agent to reopen and resave the contract.
- Check-In — Balance-Due Correctness: Balance-due calculations now correctly exclude voided and refunded transactions, account for credit balances, and write the Date In and Time In on the contract from the actual return date and time entered at check-in. Late-return charges persist on the contract after submit.
- Contract Modify — Driver Sync on Save: Updating a driver from the Contract Modify driver section now correctly synchronises phones, addresses, and driver-license records — removed entries are deleted, new entries are inserted, and database IDs are preserved across re-renders so existing records are updated rather than re-created. Drivers whose only change is a contact-detail edit are no longer skipped on save.
- Marketing — T&M Rates: Duplicate No Longer Mutates Source: Duplicating a Time & Mileage rate template no longer leaks rate-line IDs from the source template — the duplicate is now a clean copy and the original is no longer overwritten when the duplicate is saved. Rate template scope dropdowns (location, class, and similar) are also mono-select in edit and duplicate modes, preventing accidental multi-scope assignments.
- Reservations — Edit No Longer Sends Stale Session Lock ID: Saving an edit on an existing reservation no longer sends the editing-lock session ID as part of the update payload, removing a benign error log on the server.
- Contract Modify — Modal Scroll and Footer Overlap: The driver-edit and other modals on the Contract Modify page no longer have their footer overlap the body content; modals scroll cleanly even with tall driver records.
- Contract Modify — No False ‘Update Charge’ Flag on Page Load: Opening the Contract Modify page no longer falsely flags miscellaneous charges as edited before any user input, removing a spurious save-warning prompt.
- Contract Modify — Block Save When a Driver Has No License: Saving a contract modification is now blocked when any driver on the contract is missing a driver's licence, with an inline error pointing to the offending driver row.
- Reports & Vehicles — Misc Cleanup: Several smaller backend fixes across the rental-agreement report strategy, fleet-list report, vehicles service, payments service, physical-inventory service, and notes controller were applied to keep totals, statuses, and audit data consistent.
1.9.27May 5, 2026
Changed
- Vehicle Classes — Category is Now Optional: Vehicle classes can now be created and saved without selecting a category. Operators that do not use the Product → Category → Class fleet grouping no longer need to invent a placeholder category to set up a vehicle class. The Category Code field now shows a 'No category' option and no longer carries a required indicator. Clearing the category from an existing class is also supported.
- Vehicle Form — Improved Page Performance: The vehicle add and edit form loads dropdown data more efficiently, reducing unnecessary re-renders and improving responsiveness when switching between fields.
Fixed
- Vehicle Class — Gas Tank Auto-Fill: Selecting a vehicle class that has a default gas tank size now correctly saves the vehicle without requiring the agent to manually re-enter the value. Previously the form would silently block submission even though the gas tank field appeared filled in.
1.9.26May 5, 2026
Added
- Privileges — Unqualified Rate and Expired License: Two new privilege gates are now enforced in the checkout flow. Agents with the Unqualified Rate privilege can proceed when the rate presented does not meet qualification criteria; agents with the Expired License privilege can check out a vehicle when the driver's license has already expired. Both privileges must be explicitly granted to a role before agents can override these blocks.
- Privileges — Rent Unavailable Vehicle: A new privilege gate allows authorized agents to assign and check out a vehicle that is not in an Available status. Agents without this privilege cannot proceed when the selected vehicle is unavailable.
- Privileges — Rent Underage Indicator in Driver Search: When searching for a driver, the underage indicator is now surfaced directly in the search input results when a driver does not meet the minimum age requirement, giving agents clear visibility into whether the Rent Underage privilege is required before selecting that driver.
- Misc Charges — Auto-Apply with Privilege-Gated Removal: Misc charges configured for automatic application are now applied to the contract at the start of the rental. Agents with the Delete Auto Charges privilege can remove these system-applied charges from the RA; without the privilege, the auto-applied charges are locked in place.
- Rental Agreements — Edit Cash Payment: Agents with the Edit Cash Payment privilege can now edit the amount and memo of an existing cash payment directly from the Payments tab on a rental agreement, correcting entry mistakes without voiding and re-entering the payment.
Changed
- Privileges — Dynamic Privilege System Enhancement: The privilege enforcement flow across checkout controllers and services has been refactored for consistency, ensuring privilege checks are applied uniformly throughout the rental workflow and that unused or redundant privilege constants are removed from the codebase.
- Additional Drivers — Form Aligned with Customer Form: The Add Driver form now matches the structure of the customer creation form. The Phone Numbers, Address, and Driver's License sections open pre-expanded with one empty entry each so agents can fill in data immediately without manually expanding each section; the Add Phone button appears only when no phone entry exists, matching Address section behavior. Employer, Extension, and Apt/Suite fields have been removed. All required fields now show a red asterisk consistently.
Fixed
- Additional Drivers — Unique Email Enforcement: Adding a new driver with an email address already belonging to another customer now shows an inline error directly under the Email field, preventing form submission and identifying the conflicting address. Searching for and selecting an existing customer from the driver search correctly bypasses this check by passing the customer ID.
- Additional Drivers — Auto-Resolution of Customer Records After Contract Close: When a contract is closed through check-in, any additional driver snapshot added without a linked customer record is now automatically resolved — the system finds an existing customer by email or license number, or creates a new one, and links the snapshot to that customer record. Individual resolution failures are caught and logged without blocking the contract close.
- Misc Charges — Taxable Option Locked for Tax-Type Charges: Tax-type miscellaneous charges (Sales Tax, Federal Tax, Other Tax, and Misc Fees) can no longer be marked as taxable. The Taxable tab is hidden in the misc charge form for these charge types, the taxable checkbox on the General tab is disabled and grayed out with an explanatory hint, and tax-type charges are excluded from the Percent Calc applicable targets list to prevent tax-on-tax scenarios.
1.9.25May 2, 2026
Added
- Miscellaneous Charges — Multiple Instances per Rental Agreement: The same miscellaneous charge can now be added to a rental agreement multiple times as independent line items, each with its own quantity and rate, so agents can record separate GPS rentals or other recurring charges without them collapsing into a single row.
- Corporate Accounts — Per-Class and Per-Location Rate Overrides: Rate managers can now configure class- and location-specific rate rules on any corporate account from the Company Rates tab, ensuring that reservations under that corporate automatically qualify only the designated rate for the selected vehicle class and pickup location.
- Corporate Accounts — Misc Charge Inclusion Rules: A new section in the Company Rates tab lets rate managers force-include or exclude individual miscellaneous charges for a specific corporate account, overriding the default charge rules for every reservation booked under that corporate.
- Counter — Contract Inquiry: A new Contract Inquiry screen on the Counter lets agents search rental agreements by agreement number, unit, plate, or renter name, view full agreement details, and immediately print, email, or send the contract for e-signature.
- Counter — Fleet Management: A new Fleet Management screen on the Counter shows the live status of all fleet units and lets agents modify unit status, open and close non-revenue tickets, initiate a checkout with the vehicle pre-selected, and run a vehicle inspection — all without leaving the Counter.
Fixed
- Rental Agreement Notes — Correct Dialog Title: The Add Note dialog on a rental agreement now reads 'Add Rental Agreement Note' instead of 'Add Reservation Note', matching the correct context of the page.
- Edit Agreement — Contract Details Field Alignment: The Rental Reason dropdown in the Contract Details section now aligns to the same horizontal baseline as the adjacent PO# and Referral # fields.
- Open Contract — Due Back Date and Time Labels: On an open rental agreement, the return date and time fields are now labelled 'Due Back Date' and 'Due Back Time' to reflect that the vehicle has not yet been returned; closed contracts, reservations, and the check-in flow keep the existing 'Return' labels.
- Advanced Filters — Apply Button Always Visible: The Apply Filters and Clear All buttons in every advanced filter panel now stay pinned at the bottom of the filter sheet regardless of how many filter values are selected, so agents no longer need to scroll down to apply a filter.
- Navigation Sidebar — Rental Agreements Highlighted During Checkout: When an agent begins the checkout workflow from a reservation, the sidebar now correctly highlights the Rental Agreements section instead of keeping Reservations active.
1.9.24May 2, 2026
Changed
- Contract Modification — Closed Contracts Now Editable: Clicking Edit on a closed contract from the Reservations list now opens the Contract Modify page and the system accepts the update, allowing staff to adjust contract details such as miscellaneous charges on closed contracts; previously this workflow was blocked at both the page level and the server level.
Fixed
- Reservations — Edit Button Routing for Closed Contracts: The Edit button on a closed contract in the Reservations list now correctly navigates to the Contract Modify page; previously it incorrectly opened the check-in edit view.
1.9.23May 2, 2026
Added
- Tax, Fees & Misc. Charges Report — a new Report Mode toggle allows switching between Tax & Fees view (showing Total Taxes and Total Fees KPIs) and Misc. Charges view (showing a Total Charges KPI), making both charge categories accessible from a single report.
- Tax, Fees & Misc. Charges Report — Location, Brand, and TAX/FEE Type filters now support multiple simultaneous selections, so results can be narrowed to any combination of locations, brands, or charge codes in a single run.
- Customer Form — entering a zip code on the create or edit customer form now automatically fills in the City and State fields, with support for both US ZIP codes and Canadian postal codes.
- Tenant 360 — a warning banner now appears on the tenant overview when a tenant is missing default system forms, with a one-click action to seed the missing forms and dismiss the banner immediately.
Changed
- Tax, Fees & Misc. Charges Report — renamed from "Tax & Fees Audit" and now restricted to closed contracts only, so all KPIs and line items reflect finalized rental data rather than mixing in open agreements.
- Reports — Tax-Exempt Rentals moved from the Compliance & Exceptions tab to the Accounting tab.
- Customer Form — address entry order updated to Country → Zip → City → State, and changing the Country now also clears the Zip field to prevent stale postal codes from triggering incorrect city and state lookups.
Fixed
- Rental Agreements Dashboard — the Total Contracts tile now correctly counts all contracts across every status (open, closed, void, and pending) instead of showing only open and pending agreements.
- Rental Agreements Dashboard — the Total Revenue tile now displays the actual sum of charges from closed contracts instead of always showing $0.00.
- Contract E-Signing — resolved an issue in the Ampliphi digital signature integration that was preventing the e-sign workflow from functioning correctly.
- Multi-select filter dropdowns — selected value badges now truncate long labels with an ellipsis and display the full text on hover, preventing them from overflowing their container.
1.9.22May 2, 2026
Changed
- Misc Charges — Pricing Grid Visibility: When creating a new misc charge, the Hourly, Daily, Weekly, and Monthly rate inputs are now displayed by default, removing the extra step of enabling the pricing grid before entering rates.
- Vehicles — VIN Auto-Fill Scope: When a VIN is decoded during vehicle entry, only the core identifying fields — year, make, model, doors, seats, and fuel type — are automatically populated; engine, body type, drivetrain, and transmission are no longer overwritten by VIN data and remain under the agent's control.
Fixed
- Corporate Accounts — Cash Receipts Ledger: Direct Bill payments and refunds recorded against a company were not appearing in that company's Cash Receipts ledger — all transactions, including refund lines, now display correctly and the outstanding balance on the Account Summary tab matches the Cash Receipts totals.
- Vehicles — Vehicle Selection: An issue that caused incorrect behavior when selecting vehicles in certain workflows has been resolved.
- Vehicles — VIN Catalog Adoption: When scanning or entering a VIN that resolves to a make or model not yet in your catalog, the system previously displayed an error and required manual re-entry — the make and model are now automatically added to your catalog and pre-selected so the vehicle form can be submitted immediately.
- Misc Charges — Zero-Price Validation: Misc charges with no pricing configured could previously be saved, creating zero-rate charges on contracts — the system now requires at least one rate to be set and highlights the missing input if you attempt to save without pricing.
- Customers — Country Field: The Country field in the Add Customer form now accepts keyboard input immediately on focus without requiring a click first, and searching by ISO code such as "US" or "GB" now correctly surfaces the matching country.
- Rental Agreement Flow — Contextual Wording: Loading messages and driver confirmation toasts in the Rental Agreement workflow now correctly display "rental agreement" instead of "reservation" when working on checkout, check-in, or edit agreement flows.
1.9.21May 2, 2026
Added
- Customer & Company Profiles — Taxable Status Change Warning: Toggling the taxable flag on a customer or company profile now shows a confirmation dialog listing all open reservations and contracts linked to that record, so agents can review the pricing impact before the change is saved.
Changed
- Contract Pages — Header Renamed to Contract Details: The page title across the check-out, check-in, and counter check-out flows now reads "Contract Details" instead of "Reservation Details", more accurately reflecting the document being created.
- Counter Check-Out — Vehicle Search No Longer Requires a Class Selection: The Search for Vehicle button in the counter check-out flow is now always active — a vehicle class no longer needs to be selected before the search can be initiated.
- Counter Check-Out — Automatic Redirect to Print Contracts After Completion: Completing a counter check-out or check-in now navigates directly to the Print Contracts page with the agreement number pre-loaded, so agents can immediately print or email the document without an additional search step.
- Company Billing Profile — Searchable Dropdowns for Country, State, and City: Address fields on the company billing profile now use searchable dropdown selectors instead of free-text inputs, with automatic clearing of dependent fields when a parent selection changes.
- Counter Check-Out — Driver Changes and Cancellation Locked After Payment: Once a payment is collected during a counter check-out session, driver edits and removals are blocked to prevent accidental changes; cancelling the session at that point automatically voids the most recent non-voided payment to keep the transaction clean.
- Counter Check-Out — Rented As Field Restricted by Privilege: The Rented As vehicle class field during check-out is now disabled for agents who do not hold the required privilege, preventing unauthorised overrides of the contracted vehicle class.
Fixed
- Additional Drivers — Driver Promotion Corrected: Promoting a secondary driver to primary on a rental agreement now saves correctly.
- Vehicle Fleet — Class Filter Results Corrected: The vehicle class filter on fleet and reservation search screens now returns the correct matching results.
- Additional Driver — Charge Amount Corrected: The additional driver charge is now calculated and displayed correctly on rental agreements.
- Counter Check-Out — Duplicate Driver Entry Resolved: Adding a driver through the counter check-out wizard no longer creates a duplicate driver entry on the contract.
- Vehicle Management — Import and Export Restored: Importing and exporting vehicle records now completes successfully without errors.
- Check-Out — Driver Charges Corrected: Driver-related charges in the checkout billing summary are now correctly reflected and applied to the contract.
1.9.20May 2, 2026
Added
- Vehicle Revenue & Profitability — Revenue Charts: Two new chart panels now appear on the Vehicle Revenue & Profitability report — a horizontal bar chart showing Revenue and Utilization Percentage by Vehicle Group, and a stacked bar chart comparing Revenue versus Costs — giving fleet managers a visual summary of performance alongside the data table.
- Vehicle Revenue & Profitability — Detailed Revenue Breakdown: Revenue figures in the Vehicle Revenue & Profitability report can now be split into individual columns for Time & Mileage, CDW, Fuel, and Tax charges, available as opt-in fields under the Revenue & Charges group in the field selector.
- Vehicle Revenue & Profitability — Advanced Calculation Filters: Four new filters — Include Open Contracts, Include Sold Vehicles, Pro-Rate Revenue, and Accrual Method (Cash, As-of-date, or Due-date) — are now available on the Vehicle Revenue & Profitability report, giving users finer control over which rentals are factored into the results.
- Location Performance — New Operations Report: A new Location Performance report is now available under Operations, showing per-vehicle fleet metrics grouped by vehicle class with class subtotals and a grand total row, including columns for Days On Rent, utilization percentage, revenue per day, and Misc. Charges; the Location filter supports selecting multiple locations simultaneously.
Changed
- Vehicle Revenue & Profitability — Multi-Select Location and Class Filters: The Location and Class filters on the Vehicle Revenue & Profitability report have been upgraded from single-value to multi-select dropdowns, so users can include multiple locations or classes in a single report run.
- Vehicle Revenue & Profitability — Filter Help Tooltips and Collapsible Charts: Filter description text has moved from inline notes into help-icon tooltips beside each label, and the charts section is now collapsible so users can focus on the data table when preferred.
Fixed
- Vehicle Revenue & Profitability — Missing Vehicles in Filtered Results: Some vehicles were incorrectly excluded from the Vehicle Revenue & Profitability report when using the Location or Class filter, because a redundant case-sensitive check was silently dropping vehicles that the initial query had already returned — all matching vehicles now appear in results as expected.
1.9.19May 2, 2026
Added
- Vehicle Options Catalog — Factory Option Codes: Administrators can now build a tenant-scoped library of vehicle option codes (such as navigation systems, sunroofs, and trailer hitches) under Business Setup, and fleet managers can assign or remove those codes from any vehicle profile via a new Factory Options tab — giving every team a permanent, searchable record of each vehicle's installed features.
- Rental Counter — Pickup and Return Time Validation: When setting rental start and end times at the counter, invalid hour entries are now caught and blocked before submission, preventing out-of-range time values and keeping rental period calculations accurate.
- Time & Mileage Rates — Duplicate Rate Action: A new Duplicate action on each rate row opens the rate creation form pre-filled with the source rate's pricing configuration but with Location, Product, and Vehicle Class left blank, so rate managers can quickly create a new rate combination without re-entering all pricing fields from scratch.
Changed
- Vehicle Profile — Unified View and Inline Editing: The vehicle detail page now shares a single layout for viewing and editing, mirroring the customer profile experience — General, Finance, and Custom Fields sections live directly on the profile page with an inline Edit button and a fixed save toolbar, replacing the previous separate edit page; existing bookmarks to the old edit URL are automatically redirected.
- Time & Mileage Rates — Single-Select Dropdowns When Editing: Editing an existing rate now uses single-select dropdowns for Location, Product, and Vehicle Class, making it explicit that changes apply only to that specific rate row rather than across all classes or locations simultaneously.
Fixed
- Time & Mileage Rates — Tier Cascade Corrected for Non-Optimal-Value-Pricing Rates: T&M rates without Optimal Value Pricing now correctly step down through regular tiers from largest to smallest — a 10-day rental on a weekly+daily rate now charges 1 week + 3 days instead of always rounding up to 2 full weeks.
- Time & Mileage Rates — Multi-Class Apply No Longer Fails: Applying a T&M rate across multiple vehicle classes at once no longer silently returns a 400 error — the rate now saves successfully to all selected classes in a single action.
- Vehicles — Equipment Usage: An issue preventing equipment usage records from displaying or functioning correctly on vehicle profiles has been resolved.
1.9.18May 2, 2026
Added
- Reservations & Checkout — Rate Plan Access Code: Rate plans can now be protected with a private access code — rates assigned a code are hidden from the rate selection list until the agent enters the matching code, preventing use of restricted or negotiated rates without authorization during reservation creation and counter checkout. When reopening an existing reservation, the access code is pre-filled automatically so the previously selected locked rate remains qualified without re-entry.
- Reservations — Tax-Exempt Removal Warning: Removing the primary driver or the attached company currently responsible for a reservation's tax-exempt status now triggers a confirmation dialog warning that taxes will be restored; removing drivers or companies from non-tax-exempt reservations continues without interruption.
- Vehicles — Commission Status Tracking: A new Commission Status field is now available on the vehicle profile's General tab, allowing staff to tag each vehicle as None, Pending, Reported, Paid, or Excluded for franchise commission reporting workflows including HUF, SixSense, and BBARS.
- Configuration — Vehicle Commission Statuses Management: A new Vehicle Commission Statuses section is now available in the Configuration Settings sidebar, giving administrators full control over the commission status options that appear throughout the vehicle profile — including the ability to create custom statuses beyond the five built-in values.
Changed
- Reservations — Rate Disqualification Modal: When a rate plan access code change causes the currently selected rate to lose eligibility, the disqualification modal now only offers the option to switch to the most qualified available rate — keeping a disqualified rate is intentionally blocked for code-triggered disqualifications, while date and location changes continue to offer the existing keep-or-replace choice.
- User Management — Privileges Tab: The Privileges tab now shows only privileges that have a complete backend implementation, removing non-functional toggles that had no effect when switched on, so administrators see an accurate and actionable list of configurable permissions.
Fixed
- Reservations — Rate Disqualification Modal on Edit Load: The rate disqualification modal no longer appears incorrectly when opening an existing reservation in edit mode and API responses arrive out of order.
- User Management — Privilege Changes Reflected Immediately: An administrator who updates their own privileges now sees the changes applied to their active session without needing to reload the page.
1.9.17May 2, 2026
Added
- Message of the Day — Expanded Page Targeting: The MOTD configuration form now supports five additional page destinations — Counter Check-Out, Counter Check-In, Checkout, Check-In, and Contract Modify — giving staff the ability to direct informational messages to those specific screens.
Changed
- Rental Agreement Report — Status Filter Refined: The "Void" option has been removed from the Status filter on the Rental Agreement report since no rental agreement can carry that status; the filter now offers only the four valid states — Open Contract, Pending Open, Closed Contract, and Void Contract — eliminating a selection that previously always returned zero results.
- Message of the Day — Cleaner Form Labels and Location Display: The priority type label for critical alerts has been shortened to "Critical", and the location selector in the MOTD form now shows location codes only rather than the full code-and-name format, making the list more compact and easier to scan.
Fixed
- Vehicle Inventory — Search Selections Preserved Across Navigation: Filters and selections made in the vehicle inventory screen are now correctly retained when navigating away and returning to the page, preventing users from losing their in-progress setup.
- Message of the Day — Location Dropdown Now Populates: The location selector in the MOTD configuration form now loads all available locations reliably, resolving a case where the list appeared empty.
- Message of the Day — Type and Priority Fields No Longer Overlap: The Type and Priority fields in the MOTD creation form are now displayed side by side correctly, and the Type dropdown no longer renders beneath other elements on screen.
- Message of the Day — Counter Check-Out Trigger Restored: MOTD messages targeted at the Check-Out page now correctly appear when staff navigate to the Counter Check-Out screen, which was previously not triggering message display.
- Interface — Visual Fixes: Several minor display inconsistencies across screens have been corrected, improving layout stability in affected areas.
1.9.16May 2, 2026
Added
- Vehicle Inventory — A session lifecycle bar now appears at the top of the Vehicle Inventory screen, allowing ADMIN and MANAGER users to open, close, reopen, and reconcile inventory sessions; the bar displays the current session status (OPEN, IN_PROGRESS, CLOSED, or RECONCILED) at all times.
- Vehicle Inventory — Scanning a vehicle now accepts an optional physical odometer reading; if the entered value differs from the system record by more than 100 miles, a variance badge is shown on the vehicle card and the discrepancy is tallied in the session report.
- Vehicle Inventory — A Discrepancy Report is now available for the active session, listing missing, extra, mismatched, and odometer-variance vehicles, with an Export CSV button for off-system reconciliation.
- Cash Receipts — The Credit Memos section header on the Cash Receipts page and the company's Cash Receipts tab now shows a "Total Memo Balance" summing all available and partially-applied credit memos.
- Subrogation Report — The report can now be filtered by a date-of-loss date range.
Changed
- Vehicle Inventory — Session lifecycle actions (open, close, reopen, and reconcile) are now restricted to ADMIN and MANAGER roles; STAFF users can still scan vehicles but the session management buttons are hidden from their view.
- Cash Receipts — The action icon on each receipt history row has been changed from a trash icon to an undo icon, more accurately reflecting that the action voids the receipt rather than permanently deleting it.
Fixed
- Rate Selection — When no rates are configured for the selected vehicle class, the rate dropdown now shows an inline amber warning with a direct link to the rate configuration page, instead of silently disabling with a vague placeholder.
- Cash Receipts — The AR balance in the company panel now shows the live balance, matching the values displayed on the Company Summary and Billing tabs.
- Vehicle Inventory — Attempting to open a second active inventory session for the same location now shows a clear conflict error instead of a generic failure message.
- Vehicle Inventory — Attempting a restricted session action without the required role now shows a descriptive message specifying which role is needed, instead of a generic 'Forbidden resource' error.
- Claims — Several display issues in the Claims section have been corrected, improving the consistency of claim records as they appear in the interface.
- Coming Soon — Display and behavior issues with the Coming Soon feature have been resolved.
1.9.15May 2, 2026
Fixed
- Vehicle Import — Initial Status Now Required: When importing vehicles using the bulk import template, rows without an Initial Status now produce a clear per-row validation error instead of silently defaulting to Available, ensuring import issues are visible and correctable before any records are saved.
- Vehicle Import — Historical In-Service Dates Accepted: Vehicle import rows with in-service dates in the past are now accepted and stored as provided; previously, any past date caused every row in the file to fail with a date-validation error.
- Vehicle Import — Long Color Names No Longer Rejected: Exterior and interior color values of up to 50 characters are now accepted during vehicle import, resolving failures for real-world color names such as "Lunar Silver" or "Medium Light Stone".
- Rental Agreements — Time & Mileage Rate Lines: Corrected an issue where rate line items were not rendering correctly on Time & Mileage rental agreements.
- Reservations — Return Date Preserved on Focus: When honoring a past reservation or editing a rental agreement, clicking into the return date field no longer clears it to a blank placeholder — the original date is preserved so agents can make deliberate corrections rather than re-entering the date from memory.
1.9.14May 2, 2026
Added
- Vehicle Fleet — Vehicles with an expiring or expired registration or inspection certificate now display a yellow 'Doc Expiring' or red 'Doc Expired' status pill on fleet cards and in a new Documents column in the fleet table view, giving the fleet team at-a-glance visibility into document health without opening each vehicle profile.
- Vehicle Fleet — An inline alert on the Edit Vehicle page's License Information section updates live as the expiration date is changed, showing an amber 'expiring soon' or red 'expired' warning before the record is saved.
- Checkout — A document-expired modal now blocks vehicle selection at checkout across all three entry flows (standalone, counter, and dashboard/reservation). Agents who hold the OVERRIDE_EXPIRED_VEHICLE_DOC privilege see a 'Proceed Anyway' option; those without it see a Cancel-only dialog.
- NHTSA Recalls — A new Recalls dashboard under Maintenance lists all active recall matches with severity filters, an ingest-progress indicator, last-run timestamp, and a manual 'Run ingest now' button. Each vehicle profile also gains a Recalls tab showing the last NHTSA check date and a per-vehicle 'Check now' trigger.
- NHTSA Recalls — Fleet cards now display an amber or red recall badge when a vehicle has an active Warn or Ground recall, allowing staff to identify affected units at a glance. Vehicles with a Ground ('Do Not Drive') recall are automatically moved to In Maintenance status and revert automatically when the recall is cleared.
- NHTSA Recalls — Checkout is blocked for recalled vehicles: Ground recalls show a hard-block dialog with only a Cancel option; Warn recalls show an amber dialog requiring staff to tick a customer-notice acknowledgement before proceeding.
- Customers — When a customer with an expired driver's license is selected for a rental, a warning dialog appears. Agents with the RENT_EXP_DL privilege see an 'Override & Select' button; those without it see an acknowledgment-only message directing them to a manager.
- Rental Agreements — When a rental is finalized with an expired-DL override, a pinned amber warning banner is added to the rental agreement header, recording the override, the driver's name, and the license expiration date as a permanent audit trail.
- Reservations — When a pickup location is not yet synced to Self-Inspection, an amber modal now blocks rental agreement creation and provides a 'Check integration' button that navigates directly to the Self-Inspection settings tab. The in-progress draft is preserved in session storage so no data is lost during the fix.
Changed
- Payments — The combined 'Add Deposit / Issue Credit' button on the Reservations page and Counter Check-in Summary is replaced by two explicit buttons: 'Add Deposit' (always visible) and 'Issue Refund' (visible only when a credit balance exists). The refund modal opens with a read-only amount, excludes Adyen as a payment option, and submits the amount as a negative value.
- Customers — Expired driver licenses no longer hard-block customer profile creation or editing. The restriction is now enforced at the rental-selection step via a privilege-gated warning dialog, and the eligibility warnings section refreshes immediately after a customer save without requiring a page reload.
- Maintenance — Recall alerts in the Maintenance Alerts table are now labelled 'NHTSA Recall {campaign}' with severity-appropriate styling, and a new 'NHTSA Recalls' filter chip lets staff narrow the list to recall-related alerts only.
Fixed
- Security — Users no longer see data belonging to other tenants. The Location Code dropdown in T&M Rate Scope no longer surfaces cross-tenant locations, location data is cleared on logout, and switching impersonated sessions no longer carries over cached locations from the previous tenant.
- Rental Agreements and Reservations — Creating a rental agreement or reservation no longer fails with 'No active transaction number range configured' when a location-specific range exists but no global fallback is set. The system now falls back to any active range for the same record type.
- Customers — Active customers were silently re-blacklisted each time their profile page was refreshed. Blacklisting is now an explicit operation only and no longer occurs on page load.
- Check-in — The navigation controls and the Review/Submit button are now blocked when an outstanding balance (positive or negative, greater than \.01) exists, preventing accidental submission with an unresolved balance. An inline credit alert is shown in the Review/Submit step when the reservation carries a negative balance.
- Reservations — The Self-Inspection location sync check now shows a modal (previously a dismissible toast) so agents cannot bypass the block. The Integrations settings page pre-selects the Self-Inspection tab automatically when navigated to from this modal.
1.9.13April 28, 2026
Added
- Physical Inventory — Full Session & Scan Workflow: Managers can now open, track, and reconcile dedicated inventory sessions per location with a full lifecycle audit trail (Open → In Progress → Closed → Reconciled). Each scan captures odometer and custom counter readings (engine hours, cycles, or any operator-defined metric) alongside system values, flags variances above the configured threshold for supervisor review, and records any units not found in the system as unresolved entries so nothing is silently dropped before sign-off.
- Promotions — Full Rental Window Validation: Applying a promotion code now checks that both the pickup and return date fall within the promotion's active date range. Previously, a promo could be applied even when the return date extended past the promotion's end date.
- Promotions — Live Re-Validation When Booking Details Change: During new reservation creation, applied promotions are automatically re-checked whenever rental dates or vehicle class are updated — promotions that no longer qualify are removed with a warning so pricing stays accurate as the booking evolves. Editing an existing saved contract is intentionally unaffected.
- Promotions — Specific Rejection Reasons: When a promotion code exists but does not apply to the current rental, the system now explains why — such as wrong vehicle class or wrong product type — instead of showing a generic 'code not found' message.
Changed
- Reservations & Walkup RAs — Return Date Defaults to Tomorrow: New rental agreements and reservations now pre-fill the return date and time to tomorrow at the same pickup time, and the number-of-days field defaults to 1. Agents no longer need to manually enter the return date for every new short-term booking. Existing saved bookings are unaffected.
- Promotions — Vehicle Class Dropdown Shows All Active Classes: The vehicle class list in the Add Promo Code form now loads all active classes regardless of which product is selected, fixing an empty dropdown for products such as TRUCK and EQUIPMENT.
- Promotions — Per-Row Remove Action: The Promotions dialog now shows a remove icon on each row, replacing the single top-level Remove button. Agents can delete individual promotions without having to select a row first, and the table adds horizontal scrolling for wide datasets.
- Vehicles — Status Dropdown Uses Statuses Management Labels: The Status field on the new vehicle form now shows the human-readable descriptions and colour-coded badges configured in Statuses Management instead of raw system codes. Statuses that do not apply to a brand-new vehicle (On Rent, Sold) are excluded, and the list is ordered to match the admin page.
Fixed
- Tenant Provisioning — New Accounts Now Fully Initialised on Creation: Creating a new tenant now guarantees all four default form templates (Rental Agreement, Invoice, Non-Revenue, Reservation) are set up as part of the same operation. If any step fails, the creation is rolled back entirely — preventing partially-configured accounts that previously required manual intervention to repair.
- Tenant Provisioning — Account Creation Was Failing on Certain Installations: New tenant creation was returning an error on environments that lacked a specific legacy data record, a regression introduced in April. All environments can now create new tenants successfully.
- Tenant Provisioning — Default Form Templates Were Blank in Production: Default form templates were being generated empty in production due to an incorrect internal path resolution. Templates are now correctly populated in all environments.
- Application Startup — Server No Longer Stalls When Background Job Service Is Unavailable: The application server now starts normally even when the background job service cannot be reached, instead of hanging indefinitely on startup.
- Setup Wizard — Status Configuration Warning No Longer Repeats After First Setup: The warning prompting users to configure required statuses was reappearing on every login even for tenants who had already done so manually. The check now correctly recognises both user-created and system-generated statuses, so the prompt is suppressed once the required statuses are in place.
- Reservations — On-Rent Vehicles No Longer Appear in Vehicle Search: The vehicle search no longer shows units that are currently out on rent, preventing agents from accidentally selecting an unavailable vehicle. Units due back before the requested pickup date still appear as available.
- Reservations — Vehicle Class Labels Corrected and Upgrade/Downgrade Selections Preserved: The 'Vehicle Class' and 'Rented As Vehicle Class' fields are now correctly labelled and no longer overwrite each other on save or reload. Upgrade and downgrade selections are preserved correctly across edits, and the upgrade/downgrade indicator now appears consistently on all booking paths.
- Reservations / Counter — Driver Completeness Check Now Includes Licence Fields: Contract creation blocked by a 'drivers incomplete' warning now clearly identifies every missing field — including Licence Number, Licence State, and Expiration Date — for each affected driver. Previously, missing licence information was an invisible blocker with no actionable error message.
1.9.12April 27, 2026
Added
- What's New Page: A new /releases page gives every user a full, scrollable history of all product versions. A sticky sidebar highlights the release you are currently reading as you scroll, and each version has a permanent link you can share directly.
- Version Badge Quick-View: Clicking the version number in the sidebar now opens a compact popover showing the three most recent releases, each with a direct link to its entry on the What's New page.
- Misc Charges — Bracket Pricing Grid: When configuring a misc charge that uses a time-based pricing method (24-Hour, Calendar Day, or Modified 24-Hour), a new Tiers checkbox reveals a bracket pricing grid. Agents can now enter separate Hourly, Daily, Weekly, and Monthly rates for a single charge — for example, charge $5/hour up to $20/day up to $80/week. Unchecking the box collapses the grid and reverts the charge to a single flat rate, keeping straightforward charges uncluttered.
- Vehicle Maintenance Alerts — Custom Counter Support: Maintenance alert thresholds can now be tied to a vehicle's custom counter (such as engine hours, cycles, or any operator-defined reading) in addition to standard odometer mileage. When the counter crosses a configured critical threshold the alert fires and, if set to Ground, automatically changes the vehicle's status to In Maintenance.
Changed
- Release Notes — Always Available Offline: Release notes are now bundled with the application at build time instead of being fetched from GitHub at runtime. Notes load instantly, work in restricted network environments, and no longer require a GitHub token in the build pipeline.
- Misc Charges — Per-Tier Rate Storage: Each misc charge template now stores a distinct rate for every time bracket (Hourly, Daily, Weekly, Monthly) rather than a single override value. This is the data foundation that powers the new bracket pricing grid and ensures historical rental records are not affected when a template is later edited.
- Reservations — Cancellation Flow Overhauled: The cancel modal now calculates the balance against actual payments received rather than outstanding charges. A live Balance to Reconcile line must reach zero before the Confirm button enables — preventing accidental cancellations that would leave unreconciled payments on the record. The no-show fee pre-fills automatically to match the total paid, so for a standard no-show the agent can confirm in a single click.
- Reservations — Charges Cleared on Cancellation: When a reservation is cancelled all rental charges are removed so the booking settles at exactly $0. If a no-show fee was applied, only that fee remains, equal to the amount already collected.
- Statuses — Generate Defaults Button Removed: The Generate Defaults button has been removed from the Statuses configuration page. Default statuses are now provisioned automatically the moment a new tenant is created, making the manual button redundant and eliminating a potential source of accidental overwrites for tenants who have already customised their statuses.
Fixed
- Statuses — Startup Warning Modal Appears Repeatedly: The Required Statuses Missing modal was appearing on every login for tenants who had manually created their own statuses (such as 'Available' or 'Active') instead of using the system-generated defaults. The check now recognises both user-created and system-created statuses, so the modal no longer appears once the required statuses exist regardless of how they were created.
- Reservations — Tax Exemption Not Cleared When Driver Removed: Removing a tax-exempt primary driver from an existing reservation left the booking permanently tax-exempt — taxes never returned even after a non-exempt driver was added. The exemption is now cleared correctly when the exempt entity is removed.
- Reservation Charges — Events Routed Through Structured Logging: Internal charge-calculation events were written directly to stdout, bypassing the application's log aggregation pipeline. All charge events now flow through the standard structured logger so they appear in monitoring dashboards alongside other reservation activity.
- Reservation Charges — Soft Delete Policy Enforced: Two places in the reservation charge service were permanently deleting records instead of marking them as deleted. Charge records are now soft-deleted in line with the rest of the platform, preserving audit history.
- Loyalty Calculation — Customer Data No Longer Written to Logs: Full customer records (including personal details) were being serialised and written to the application log during loyalty calculations. The log statements have been removed.
1.9.11April 26, 2026
Added
- Non-Exemptable Override Checkbox: The NonExemptable flag is now exposed in the Exemptions tab of the misc-charge template editor. When checked, the charge applies even when the customer or company is tax-exempt (tax types only: SALES_TAX, FEDERAL_TAX, OTHER_TAX).
- checkInDate sent to qualify endpoint: Reservation page now sends the return date to the misc-charge qualification endpoint so the backend MinMaxDaysExemptionValidator can compute rental days correctly.
Fixed
- classesExempt master-toggle gate removed: The class-exemption list now drives the gate directly, fixing an issue where configured class exemptions were silently disabled.
1.9.10April 26, 2026
Fixed
- Initial Vehicle Status — Status Dropdown: The Status dropdown on the new vehicle form now displays the human-readable description (e.g. "Available") instead of the raw status code.
- Payments — Optimistic Refund Record Shape: Optimistic refund records aligned with the expanded PaymentDto shape, preventing undefined field access on immediate UI updates.
- Build — manualChunks Restored in Cloudflare Config: vite.config.build.ts was missing manualChunks, causing Cloudflare Pages builds to emit one monolithic bundle. Chunk split is now correctly applied.
1.9.8April 26, 2026
Changed
- Bundle Chunking: Production builds now split into vendor chunks (react, ui, data, forms, utils, exceljs, zxing, adyen) instead of one monolithic bundle for faster page loads.
- Caching: Removed aggressive staleTime: 0 and refetchOnMount overrides from claim hooks and contract search — data now uses the global 5-minute cache default.
Fixed
- Debug Leaks: Removed console.log of auth URL and cookie headers from NewSolAuthStore; removed stray debug log from apiClient.
1.9.7April 26, 2026
Added
- Loyalty Program — Full Implementation: Customer enrollment, tier management, points earning at check-in, reward redemption during checkout (modal + calculate API integration), loyalty sidebar card in ReservationsPage, and loyalty detail view inside the customer profile page.
- Scheduled Reports — BullMQ Cron System: Create, edit, pause/resume, and delete scheduled report configurations. Reports run automatically on daily/weekly/monthly schedules and are exported to S3 as PDF or CSV with email delivery to configured recipients.
- 10+ New Report Types: Revenue Summary, Fleet List, Location List, Reservations, Fleet & Equipment Overview, Equipment Transactions, Vehicle Revenue & Profitability, Tax & Fees Audit, Tax-Exempt Rentals, CC Payments, UK P11D — each with fields, KPIs, filters, and export support.
- Company Management — Full Tab Suite: Billing (credit status, limits, payment terms), Rates (rate codes, vehicle classes, charge overrides), Contacts (CRUD with primary contact), Contracts (CRUD with status, renewal type), Preferences (insurance, fuel, vehicle), and Activity (rental history, customers, notes, payments) tabs on the company profile.
- Multi-Step Company Create Wizard: 4-step wizard (Company Info → Primary Contact → Physical Address → Review) with 10 additional backend fields and reusable Stepper/StepNavigation components.
- Reservation Locking: Pessimistic per-tab locking prevents concurrent edits. Other users see a blocking modal with the lock holder's name. Cross-tab takeover notification invalidates the losing tab instantly.
- Maintenance Alert System: Mileage-triggered alerts checked at check-in; alerts with Ground action auto-change vehicle status to inMaintenance. Date-based alerts run via BullMQ cron with digest email and Pester/Ground actions.
- Privilege Enforcement: RENT_TO_BLACKLIST (bypass blacklist check), RENT_UNDERAGE (bypass age restriction), and RESERVE_SPECIFIC_VEHICLE (restrict specific-unit booking) privilege checks in reservation creation and updates.
- Equipment Tab on Reservation Details: Shows all equipment transactions with asset ID, type, daily rate, status, dates, and counter readings. Summary footer shows total daily rate of checked-out equipment.
- Primary Driver Tax Exemption: When primary driver's preference is tax-exempt, taxes are skipped in rate calculation and RRM.Taxable is set accordingly.
- Primary Driver Age Restriction: Validates driver age against pickup location min/max driver age settings on reservation create/update.
- Per-Tab Reservation Locking: lockSessionId (per-tab UUID) prevents the same user from silently re-acquiring their own lock across browser tabs.
- Flat-Fee Tax Support: Tax templates configured with calcMeth = FLAT now correctly apply rateUnit as a fixed dollar amount instead of silently producing zero.
- Inline Driver Search: Agents type a name or phone directly in the driver section without opening a modal. Auto-promotes first additional driver when primary is removed.
- Cross-Tab Lock Takeover Notification: Take Over in one tab immediately invalidates the other tab's lock via localStorage storage event.
Changed
- Loyalty moved into Customer Profile Page: Standalone Loyalty Page removed. Loyalty management lives inside each customer's profile with a compact banner, enrollment modal, and full detail view with AnimatePresence transitions.
- Loyalty Rewards Restructured: Replaced FREE_RENTAL_DAY/FREE_ADDON with TIME_AND_MILEAGE/MISC_CHARGE reward types. Rewards now link to child items (rate heads or misc charge templates) with per-item discount configuration.
- Reports rebuilt with strategy pattern: Each report is a self-contained strategy class. Frontend uses a Map-based registry with auto-registration via side-effect imports.
- Mileage charge integrated into rate calculation: odometerIn parameter added to the calculate endpoint; mileage charges persisted/cleaned up automatically during rate calculation instead of at check-in submission.
- Reservations — Corporate Account Integration: Real searchable CompanySelector fetches live corporate accounts. Auto-applies company rental preferences (fuel level, vehicle class, coverages) on selection.
- Company Rates Tab — Searchable Dropdowns: Default Rate Code, Rate Codes, and Vehicle Classes use SearchableSelect/MultiSelect fetching from live APIs. Charge Override modal uses a single searchable charge selector.
- Report Date Range No Longer Persists: Reports always open with default field visibility instead of loading saved preferences. Scheduled report link pre-applies that schedule's configuration for the session only.
- Customer statusType Badges in Statuses Management: Color-coded badges for canRent, vip, inactive, restricted, banned customer status types in the Statuses Management UI.
- Equipment Return Always Sets Available Status: Status dropdown removed from the return modal — returned equipment is always set to available.
- Equipment Tab Always Visible: Equipment tab shows an empty state instead of being hidden when no equipment transactions exist.
Fixed
- User-Level Privileges Ignored: hasPrivilege() now queries the UserPrivilege table as a fallback, so privileges assigned directly to a user (not via a role) are honored.
- Loyalty Redemptions Not Merged in /calculate: DB-saved and payload redemptions now always merged by rewardId — editing an existing contract correctly reflects both.
- Auto-Applied Misc Charges Not Visible: Auto-applied misc charges from rate calculation are now merged into selectedMiscCharges so they appear in the UI table with an "Auto" badge.
- Tax Types Double-Processed as Misc Charges: Auto-apply queries no longer return tax-type templates (SALES_TAX, FEDERAL_TAX, OTHER_TAX), preventing taxes from being calculated twice.
- Checkout Allows No Specific Vehicle for Class-Only Reservation: Guardrail added to block checkout submission when no specific vehicle is selected for a class-only reservation.
- Rate Cleared When Checking Out Class-Only Reservation: Reverted to keeping vehicleSelectionMode as 'class' for class-only reservations, fixing rate clearing regression.
- Duplicate Equipment on Reservation Edit: Idempotency check moved before both equipment steps; hasEquipmentChanged compares against original transactions instead of always returning true.
- Equipment Removal Not Persisted in Edit Mode: Removing equipment in edit mode now calls DELETE endpoint before updating local state.
- Vehicle Not Available When Editing Existing Contract: excludeCommonId parameter added to validateVehicleStatusForCheckout() so the current vehicle passes validation when editing.
- Check-In Balance Validation Missing Mileage Charge: Mileage charges now exist in RentalCharge before validateFullPaymentForCheckin runs.
- Check-In Return Date/Time Not Set to Now: Return Date and Time now default to today/current time in CheckIn mode and auto-update every 15 seconds.
- Charges Not Recalculated When Dates Change During Check-In: updateFull() detects date/time changes and triggers full charge recalculation automatically.
- Scheduled Reports Not Firing Automatically: Frontend now sends browser timezone with schedule payload; backend uses it for BullMQ tz parameter, fixing wrong-UTC-offset cron misfires.
- Loyalty Discounts Not Deducted from Outstanding Balance at Check-In: Backend validateFullPaymentForCheckin() now queries LoyaltyRedemption records and subtracts total discount from balance due.
1.9.6April 26, 2026
Added
- Generate Defaults Dialog: Statuses Management page now shows a "Generate Defaults" button for vehicles and customers tabs, listing statuses to be created or repaired before calling POST /statuses/generate-defaults.
- Pre-flight Status Check: After terminal settings initialization, if the tenant is missing the required "available" vehicle or "active" customer status, a blocking modal redirects to the Statuses page. Super Admin accounts bypass the check.
1.9.5April 25, 2026
Added
- Payments Timeline: PaymentsTimelineSection added to both the Reservations list collapsible and Charges & Payments detail tab. Shows a 2×2 totals grid (Charged / Authorized / Captured / Refunded), per-row lifecycle mini-timeline, refund-chain indentation, category badges, provider/card chips, and preserved Void/Refund/Delete actions via render-prop.
Changed
- Charges & Payments tab redesigned: Rate card compressed, charges collapsed into one card with inline section headers, Promotions + Loyalty merged into a Discounts section.
1.9.4April 25, 2026
Added
- Company Management Overhaul: Financial data now reconciles across Summary, Billing, and Cash Receipts tabs. Cash Receipts rewritten with per-invoice allocation, partial payments, and overpayment credit memo creation.
- UserLabel component resolves user IDs to full names in Summary, sidebar, and Companies list.
- Tour Company type added to company type options.
Changed
- Contract modal now includes a Contact picker defaulting to Primary. Confirmation dialogs replaced with styled AlertDialog components. Payment type dropdown reads from live /payment-types API.
1.9.3April 25, 2026
Added
- Inline Driver Search (#430): Agents type a name or phone directly in the driver section without opening a modal. Keyboard navigation supported. Already-selected drivers show a "Selected" badge; blacklisted drivers show "Blacklisted". Removing the primary driver auto-promotes the first additional driver.
Fixed
- Reservations — Rental Reason & Tax-Exempt (#436): Missing selectedRentalReason destructuring caused a runtime ReferenceError on the Reservations page. Tax-exempt identity now sent to server for live resolution.
- Misc Charges — Calc Method Reset (#437): Switching "Calculate By" now clears all rate fields so stale amounts from a prior calc method cannot persist on save.
1.9.2April 25, 2026
Fixed
- Rate Seasons (#435): Day is now a dropdown with dynamically computed valid options per month/year. Auto-clamp on month/year change prevents impossible dates. "Save Date Range" disabled while any error is present.
- Rate Rules (#438): Booking and Departure Start Dates are now editable in create mode. End Date ≥ Start Date enforced via picker min, inline error, and submit guard.
1.9.1April 25, 2026
Changed
- Dashboard Background Polling (#442): Fleet status, operational load, class availability, and revenue pipeline hooks no longer poll every 60 s when the browser tab is unfocused — eliminates 20+ unnecessary API requests per minute.
- Customer Dashboard Parallelization (#442): Customer details and contracts now fetched concurrently with Promise.all, saving ~500 ms per load.
Fixed
- Transaction Number Location Guard (#441): Availability check now passes the active terminal locationCode to the backend. Tenants with per-location ranges no longer see false "blocked" warnings.
- TypeScript Build Errors (#443): Contract modal no longer triggers spurious API calls before an account exists. Rate season date validation type mismatch resolved. Driver search uses the correct narrowed Customer type.
1.9.0April 24, 2026
Added
- Searchable rate dropdown in reservation rate selection.
- Inline change-vehicle flow in reservation mode, replacing the older popup workflow.
Changed
- Reservation pricing, rate lines, misc charges, and summary UI refined for a cleaner workflow.
- Misc charges can now be surfaced earlier in the reservation flow without forcing initial rate selection.
Fixed
- Misc charges qualification no longer incorrectly requires a selected rate.
- Blacklist-check and related reservation UI follow-up issues cleaned up.
1.8.0April 24, 2026
Added
- Direct unit-number lookup in reservation vehicle selection.
- Inline vehicle picker grid for reservation workflows — faster vehicle assignment without leaving the reservations form.
Fixed
- Vehicle-selection cleanup and small follow-up issues resolved as part of the new inline picker rollout.
1.7.0April 24, 2026
Added
- Vehicle management dialogs for in-fleet confirmation, status changes, and in-service date workflows.
- New fleet-management actions in the vehicles data-table.
Fixed
- Fleet-management follow-up issues found during review and merge reconciliation.
1.6.1April 23, 2026
Changed
- Vehicle import/export template handling centralized to make template maintenance easier.
- Vehicle import logic improved to better support template-driven workflows.
Fixed
- Vehicle management UI now guards invalid empty selection values more safely.
- Coming Soon flows now show clearer toast-based error feedback.
1.6.0April 23, 2026
Added
- Rental Agreement Master Report: New report with dashboard deep-links into the rental agreement reporting flow.
Changed
- Report detail, summary, and shell components improved for a clearer reporting experience.
1.5.1April 23, 2026
Changed
- Fuel pricing labels now use clearer Markup and Discount terminology.
- Promo code and transaction-number dialogs polished for a smoother workflow.
Fixed
- T&M Rate now correctly enforces Rate Rule as a required field.
- Reservation flows now warn when driver date of birth is missing and block submit until required data is present.
- Sidebar menu items now refresh correctly after permission updates.
- Add Line and Duplicate Rate Lines buttons no longer misfire due to shimmer overlay.
1.4.0April 15, 2026
Added
- Manual Notification UI: Full manual notification flow — template/event selection, compatible RRM search, message preview, and send confirmation.
- PDF System Template Cloning: Browse system-level PDF templates and clone them into your tenant's PDF Builder.
- Test Suite — 158 Unit + 22 E2E: Customer and vehicle unit tests (Vitest); Playwright E2E rewrite; super-admin test runner redesigned with Backend/Frontend tabs.
Fixed
- Rate Field Formatting: Leading zero suppression in misc charge flat/unit rate input fields.
- UI Enhancements: "Start Rental" and "Start Reservation" dashboard buttons unified with + icon.
- Misc Charges — Taxable Flag: Taxable toggle added to misc charge form; flag respected in charge display and tax calculation.
- Reservations — Charges Display: Misc charges and taxes combined into a single summary section.
- Transaction Numbers — Modal Layout: Cleaned up; redundant helper text removed.
1.3.0April 10, 2026
Added
- Tenant Initial Admin Creation: New tenant provisioning flow creates a default admin user automatically.
- Claim Notes & Linked Inspections: Claims detail now supports attaching notes and linking inspection records.
- CC Payments UI Redesign: Two-panel layout, ReportFilterPanel with responsive mobile Sheet drawer, status badges in table, header export actions.
Changed
- PromoCode Form: Refactored to use availableCalcMethods for calculation method selection instead of a hardcoded list.
- GitHub Actions Workflow: Added preprod environment option; removed sensitive env variables from workflow definitions.
Fixed
- TypeScript Build Errors: Resolved compile errors in PromoCodeFormModal and TenantModal.
1.1.0January 22, 2026
Added
- Super Admin Impersonation: Super admins can now impersonate any tenant user account to diagnose issues.
- Dashboard Location Integration: Location-specific data integration for dashboard widgets.
- DataTable Export: Export functionality with enhanced components across data tables.
Changed
- UserAvatar Component: Added loading state during logout for better UX.
- Reservations Page: Extracted dialog components for better modularity.
Fixed
- Claim issues with editing and adding expenses and vehicles.
1.0.0January 21, 2025
Added
- Customer Management: Customer eligibility alert component with enhanced customer information handling.
- PDF Builder: Complete PDF builder feature with drag-and-drop canvas, undo/redo functionality, and entity name handling.
- User Role Management: Role management features with simplified user roles display.
- Claims Management: Claims workflow with repair orders attachment and equipment store integration.
- Payments Feature: New payments functionality for rental transactions.
- Signiphi Billing (Super Admin): Client management features for Signiphi billing administration.
Changed
- Rate Qualification: Improved rate selection logic.
- Vehicle Fleet: Enhanced filters and added odometer/fuel level tracking during checkout.
- Settings Pages: Unified design across all settings pages using shared component.
- Misc Charges: Grouped misc charge rows and time/mileage rows for better organization.