DistributorsDesk — Changelog

Every user-visible change to DistributorsDesk, newest first.

This log covers changes that matter to users — new features, behaviour changes, removals, and bug-fix summaries. Internal refactors, dependency bumps, and build-system tweaks are left out. The format follows Keep a Changelog. Versions follow the project’s FileVersion scheme; each entry is tagged with the Windows build it shipped in.

Back to DistributorsDesk

How entries are labelled
  • Added — new capabilities.
  • Changed — adjustments to existing behaviour you should notice.
  • Fixed — defects that affected the product day to day.
  • Security — fixes to access control, authentication, or data exposure.
  • Removed — capabilities that were taken out.

1.6.1 — 2026-09-09

A fix release for the Google Drive backup introduced in 1.6.0, which could not complete a single upload. Your database is untouched — upgrading from 1.6.0 needs nothing.

Fixed
  • “Backup now” failed on the file it had just written. Every cloud backup ended with “the process cannot access the file… because it is being used by another process” — the copy was written correctly, and then the upload could not open it. The same held-open file also defeated the tidy-up step afterwards, which is the worse half of the problem: an unencrypted copy of your books was left behind in the temporary folder. Both sides are fixed, and the temporary copy is now reliably removed once the upload finishes.
  • The list of backups now refreshes as soon as one finishes. After “Backup now” the list on screen was wrong in both directions — missing the backup just uploaded, and still offering ones that retention had already deleted. It is re-read automatically, with the new backup selected.

1.6.0 — 2026-09-09

A user-interface release. The navigation and the dashboard were both shaped like the data model rather than like anyone's job; this changes that. Plus automatic backup to the customer's own Google Drive. Your existing database is carried forward unchanged — upgrading from 1.5.0 needs nothing.

Added
  • A guided dashboard, arranged around the job rather than the tables. There were fourteen list pages named after records, and a dashboard that reported the state of things without offering any way to act on it — so completing one sale meant already knowing it is four entities in a fixed order, and visiting four pages to enter them. The dashboard now opens with task tiles named after what the operator came to do: Sell / Take Order, Deliver Order, Receive Money, Buy Stock, Customer Return, Supplier Return, Add Product, Add Customer, Add Supplier, Stock Movements. Each role sees only its own. The full menu is unchanged and still reaches everything — there is no simplified mode to get stranded in.
  • A tile that needs to know which record you mean asks that one question first — which order is being delivered, which invoice is being paid or returned against, which purchase is going back — and then opens the form with your answer already applied. If there is only one candidate it is chosen for you rather than making you confirm the only option, and nothing is quietly cut off: the list says how many of the total are on screen and its search goes back to the server for the rest.
  • Save & New on every create form. Each form used to close on success and drop you back on a list page, so entering thirty orders meant thirty round trips through a list nobody wanted to see. Save & New keeps the form open, clears what changes and keeps what does not, and tells you what was just saved. On this path the credit-limit warning stays on screen as a strip rather than fading away while you are already typing the next order.
  • Automatic backup to your own Google Drive. Until now the only backup was a manual save on the Database tab, so protection depended on someone remembering. Connect a Google account once and a copy of the live database is uploaded to a folder in your Drive on the schedule you choose — hourly, daily, weekly or monthly — with older copies rotated out after each successful upload. A machine that was switched off at the scheduled time is the normal case, not an edge case: the backup runs shortly after the app next opens and says it was late rather than pretending it was on time. Restoring lists what is actually in your Drive and brings a copy back as an additional database, never over the one in use. Reached from “Auto Backup…” on the Database tab; failures are surfaced on the Service tab, because an automatic backup that has been failing unnoticed is indistinguishable from one that never ran.
    • Only per-file Drive access is requested — the application can see and manage only the files it created itself, never the rest of your Drive.
    • The stored Google credential is protected against the signed-in Windows user, so a settings file copied to another machine is inert rather than portable; you simply sign in again there.
    • What gets uploaded is produced through the database engine's own backup mechanism, never a file copy — a plain copy of the main file yields a backup that opens perfectly and is quietly missing the newest rows.
  • The login page now leads with the full DistributorsDesk brand header instead of the square mark.
Changed
  • Admin and Office no longer share one dashboard. They were the same view with more menu links, which made “admin” simply “office who can see more”. Admin now gets an administration view of its own — a user overview, recent sign-ins and system information — with the operational dashboard below it, because an admin also does the day job. There is deliberately no “view as another role” switcher: that is a question about permissions, not about navigation.
  • The greeting bar's quick-action buttons and the duplicate “Quick Actions” panels are gone. The tiles replace both, with room to say what each one does.
  • Importing a database and restoring one from Drive are now the same operation internally, so a restore cannot skip the checks an import performs.

1.5.0 — 2026-09-05

A correctness and security pass across the whole application, closing every finding raised against 1.4.0 and adding the document/filtering features that pass surfaced as missing.

Added
  • Credit limits are now enforced. A customer's credit limit was always recorded and shown, but nothing acted on it. Placing an order that would push a customer over their limit now succeeds but shows a warning — an order is only a request. A delivery that would do the same is refused outright, before it is written, since that is the last point stock can still be stopped from going out. A customer with no limit configured is unaffected.
  • View and print Invoices, Deliveries, Purchase Returns and Sales Returns. All four previously had no way to see the full document, let alone hand a copy to a customer or supplier. Each now opens a clean, printable view of exactly what it contained.
  • Cancel a delivery from the page. Cancelling was already possible through the system; there was simply no button. Cancelling now reverses the stock the delivery took out, rolls back its order, and updates statuses to match.
  • Date-range and customer filters on Orders, Deliveries, Invoices and Payments. All four pages gained a customer search, two date fields, and a Clear Filters button.
  • An ageing breakdown on the Customer Ledger report — current, 1–30, 31–60 and 90+ days — so following up on a customer is not just a running balance but a picture of how overdue it actually is.
  • An optional redirect plain HTTP to HTTPS setting on the Configuration tab. Off by default, so a single-office LAN install keeps working over plain HTTP unless you explicitly turn encryption enforcement on.
  • Database upgrades between versions now happen safely and automatically, with a backup taken beside your database first whenever an update needs one — no manual steps, and nothing proceeds unless the backup and the upgrade both succeed.
Security
  • A salesman could previously read every customer's invoices, not just their own — the Invoices page for a salesman is their ordinary daily view, not an edge case, so this was a real exposure and is now scoped the same way orders and deliveries already were.
  • Old, unused login-lockout tracking and expired session tokens are now cleaned up automatically instead of accumulating indefinitely.
Fixed
  • Every product/customer/order/delivery/invoice/purchase picker was silently capped at 200 rows — a distributor with more than 200 active products could not select the 201st on any form, with no error and no visible sign. Every picker across the application is now a live search rather than a fixed list.
  • An order could be invoiced in full before anything had actually been delivered.
  • A delivery line could be booked against a product or order that did not actually match it.
  • A sales return could be recorded at a higher price than the item was originally sold for, inflating the amount credited back to the customer.
  • Cancelling a delivery could bypass an invoice that had since been raised directly against its order.
  • Three rare race conditions — two people acting at the same moment — that could let an invoice be overpaid or let stock go negative on a purchase return or a manual adjustment.
  • Importing a database into the Admin app could silently lose the most recent activity if the database had unsaved changes still pending internally at the moment of import.
  • Every "New…" form defaulted its date field using the wrong calendar day for anyone outside the UK/Europe time zones — a clerk well east or west of it could see yesterday's or tomorrow's date pre-filled.
  • The Reports date-range default for "this month" could start a day early, landing on the last day of the previous month instead.
  • A fully returned invoice stayed marked unpaid forever and kept appearing as something still owed, because a sales return updated the customer's balance but never told the invoice it carried that it had been settled.

1.4.0 — 2026-07-20

A security and correctness release, closing two gaps found by testing bug classes the application had never been checked against before.

Added
  • The web client now shows its own build version in the sidebar, so anyone reporting a problem can say exactly which release they are on.
Security
  • A stored cross-site-scripting gap in the web client. A shop, product or supplier name containing certain characters could break out of its field and attach a script that ran for anyone who later opened that record. Names are now escaped safely wherever they are displayed.
  • Login attempts are now rate-limited per address. There was previously no lockout at all on the sign-in form, so a password could be guessed as fast as the server would answer. Five failed attempts from one address within 15 minutes are now refused for a cool-down period.
Fixed
  • Two deliveries created at the same moment could together oversell stock that neither one could have taken on its own — each was checked against the stock level individually rather than against each other. Simultaneous deliveries are now checked against each other correctly.
  • Order, delivery, invoice and due dates could display a day early for anyone west of the UK/Europe time zones.
  • The Users page could open the New User form before the list of roles had finished loading, leaving the Role field empty and the form unusable until refreshed.

1.3.1 — 2026-07-14

Changed
  • The web client's login screen and sidebar now show the real DistributorsDesk logo in place of a placeholder square.
  • A parity pass against the original desktop application closed five gaps found in a side-by-side review: role-scoped sidebar navigation (each role now sees only the sections it can use, with empty sections hidden entirely); a role-specific dashboard restored for every role, each with its own greeting, today-at-a-glance strip, coloured stat cards and detail panels; a two-panel login screen with an in-page forced password-change step; toast notifications and a keyboard-navigable customer search on the order form; and the full navy/amber colour palette and branding matched throughout.
Fixed
  • Warehouse staff could no longer record purchases — a regression against the original desktop application, which always allowed the warehouse role to receive stock at the dock. Restored.

1.3.0 — 2026-07-11

Introduces safe database versioning ahead of the first Store release, plus a full pre-release security and correctness audit.

Added
  • Database schema versioning. Every database now carries a version stamp, checked and safely migrated forward every time it opens. An unrecognised or foreign database is refused with a clear explanation instead of a cryptic failure, and a database from an earlier release upgrades automatically with no action required.
Security
  • Negative payment amounts are now rejected — previously a negative payment could reverse recorded collections and inflate a customer's balance.
  • A salesman could look up another salesman's delivery by guessing its number. Delivery lookups are now scoped the same way the delivery list already was.
  • New salesman accounts no longer share one default password. Each is now issued a random one-time password, shown once at creation, with a forced change on first login.
Fixed
  • A purchase return had no check against current stock and could drive a product's stock negative — the same class of gap already closed for deliveries in an earlier release, now closed here too.
  • A sales return could exceed what was actually sold. Returns are now capped at what the invoice sold, minus anything already returned, and reject a product that was never on the invoice at all.
  • A stock adjustment could drive on-hand below zero; large negative adjustments beyond current stock are now rejected.
  • Zero, negative, or negatively-priced line items are now rejected consistently across orders, deliveries, purchases, and both kinds of returns.

1.2.0 — 2026-07-02

Fixed
  • A delivery could drive a product's stock negative — especially a direct delivery with no order behind it, which was validated only against the order's own quantities, never against what was actually on hand. Deliveries are now checked against real current stock before anything is saved.
  • A payment could exceed an invoice's remaining balance without being stopped. Overpayment beyond the balance due is now rejected; a payment for exactly the remaining balance still goes through.

1.1.0 — 2026-05-23 · FileVersion 1.0.0.100

First public release — baseline for this changelog. Earlier history is not itemised; everything below is recorded going forward.

Added
  • Orders & deliveries. Create and manage customer orders with a clear workflow from order entry to delivery dispatch. Track delivery status in real time and monitor pending, partially delivered, and completed shipments.
  • Invoicing & payments. Generate invoices directly from completed deliveries. Record customer payments against invoices with automatic balance tracking and outstanding calculations. Full receivables and payment history per customer.
  • Purchasing. Record supplier purchases and purchase returns with automatic stock adjustments. Keep supplier transactions organised while inventory levels update instantly.
  • Inventory management. Real-time stock levels across the inventory with full movement history. Every purchase, sale, or return automatically updates stock quantities. Manual adjustment tools for corrections and audits.
  • Sales returns & purchase returns with linked stock reversal so the books and the warehouse stay aligned.
  • Customer & supplier ledgers. Detailed records for every customer and supplier including transaction history, outstanding balances, payments, and account activity in one place.
  • Salesman tracking. Assign sales staff to orders and customers, with dedicated salesman dashboards.
  • Role-based access. Built-in role management — admins, office staff, salesmen, and warehouse users each see a simplified interface tailored to their responsibilities.
  • Built-in reports. Sales performance, overdue invoices, customer collections, stock movements, and more.
  • Browser-based UI. The full application UI and REST API are served from the Windows server — staff connect from any device on the network with no client install.
  • Runs on your own server. No cloud subscription, no per-user monthly fees — the data stays on your infrastructure.
  • 30-day free trial available through the Microsoft Store.

Back to DistributorsDesk