What’s New in Weaf Point of Sale
Every update we have shipped, newest first.
App version 2.8Latest release v2.43Released 26 July 202668 releasesWeafPOS_Setup_v2.8.exe
Get Weaf Point of SaleAlready using Weaf Point of Sale? Download the latest installer from your Weafmall account under Purchase history → Digital purchases and run it over your existing installation. Your database and settings are kept — nothing is overwritten.
On a multi-till setup, update the main computer first, then each till.
Latest release
Release v2.43 — One Click, One Invoice: Duplicate Sales FixedLATEST
Released 26 July 2026
- Fixed: clicking "Confirm & Print" more than once could book the sale several times over, every copy carrying the SAME invoice number. On a till that paused for a moment a cashier could click repeatedly and get eight identical invoices in ten seconds - inflating the day's takings and deducting the stock eight times. Confirm, Hold, Finalize & Pay and Save & Send to EFRIS now refuse a second press while a sale is being saved, and the buttons grey out so it is obvious the till is working.
- Fixed: invoice numbers are now allocated under a database lock. Two tills confirming at the same instant can no longer both be handed the same number.
- Fixed on upgrade: any sales already duplicated this way are cleaned up automatically the first time this version starts. One copy of each is kept (the earliest), the over-deducted stock is put back, and the takings correct themselves. Every removed copy is recorded in a DuplicateSaleCleanupLog table so the change is fully auditable. Invoices already sent to EFRIS are never touched, and any sales return is moved onto the copy that is kept.
- Fixed: the totals at the bottom of Make a Sale could disagree with the lines on screen - most often after retrieving a held invoice. Line totals and the summary are now derived directly from the lines, so they cannot drift apart. The figure the cashier is paid against, the change worked out from it, and the amount saved to the sale are now all one and the same reading, and the basket is frozen while the payment window is open.
- Fixed: a tender typed in wrongly used to be silently read as zero. It now blocks the sale with a clear message instead of quietly putting the balance on credit.
- Fixed: retrieving a held invoice now restores its customer and payment mode on screen, and keeps any promotion recorded against the lines.
- Fixed: the item box no longer stutters or drops characters while items are being added. Searching used to re-scan the whole product list twice on every keystroke - and a barcode scanner sends one keystroke per character. Lookups are now indexed, so scanning stays responsive on a large catalogue.
- Fixed: pressing Hold with an empty basket no longer files a blank held invoice and burns an invoice number.
- Note: Application version updated to 2.8 for this release.
Previous releases (67)
Release v2.42 — Customizable Columns on Sales History
Released 20 July 2026
- New: customizable columns on the Sales History grid, just like Make a Sale, Receive Stock and the Reorder Report. A "⚙ Columns" button next to "Show Details" lets you tick or untick which columns appear, so you can hide the ones you never use and reduce congestion on smaller screens.
- New: you can also drag the Sales History column headers to reorder them into the arrangement you prefer.
- Your arrangement is saved to your user account in the database, so it is remembered when you come back - and it is per user, meaning each person signing in on the same till keeps their own layout without affecting anyone else's. It follows you to any machine you sign in on, since it is stored centrally.
- A "Reset to default" option in the Columns menu restores the original columns and order.
- The last visible column cannot be hidden, so the grid can never be left completely blank.
- The two EFRIS columns (EFRIS Status and EFRIS Invoice No) only appear as options when EFRIS integration is switched on. On a store not using EFRIS they stay hidden and are not offered in the menu; if EFRIS is later switched on, they come back with whatever preference you had set.
- Note: Application version was left unchanged at 2.7 for this release.
Release v2.41 — Removed the Blank Gap at the Bottom of Receipts
Released 20 July 2026
- Fixed: sales receipts printed a noticeable blank band just above the "powered by Weaf Point of Sale" footer. On a sale with no EFRIS QR code (any non-fiscalised sale) and no thank-you message set, that space was pure wasted paper on every receipt.
- The footer now only prints the parts that actually have something to show. The thank-you message, its separator line and its spacing are printed only when a message is set; the QR code area only when there is a QR code; and the small gap above the footer only when something was printed above it. On a receipt with neither, the "powered by" footer now follows straight on from the printed-on/printed-by lines.
- A blank thank-you message no longer prints an empty line. If you clear the receipt message in Preferences the app now prints nothing there, instead of an empty bold line and its margin. Any message you have set is unaffected, and stores that never changed it still get the standard message.
- The same blank-line trim was applied to customer deposit receipts.
- Saves a little paper on every single receipt, which adds up on a busy till.
- Note: Application version was left unchanged at 2.7 for this release.
Release v2.40 — Fixed: Store Details & Preferences Being Erased on Networked Tills
Released 20 July 2026
- IMPORTANT FIX: on a till sharing the database over a network, the store name, address and receipt logo could be silently erased, after which receipts printed with fallback details ("WEAF") instead of the real store information. General preferences could reset to defaults the same way.
- The cause: when Preferences opened, it read the store details and settings from the database in the background. If that read failed (a brief network drop, the database busy) or had simply not finished yet, the boxes on screen stayed empty - and pressing Save then wrote those empty boxes straight over the real data in the database. The receipt logo was wiped the same way. Because the save still reported "Settings saved successfully", nothing indicated anything had been lost.
- Now, Preferences will never save a section it did not successfully read. If the store details or general preferences could not be loaded, they are left exactly as they are in the database, and you get a clear message naming what was skipped and confirming nothing was lost - instead of a false "saved successfully".
- Pressing Save while the settings are still loading is now safe too: the save waits for the read to finish first, so a quick Save on a slow connection can no longer store a half-filled window.
- The same protection was added to the discount reasons list, which could previously be emptied in the database if it had not loaded on screen.
- The same protection was added to the EFRIS General Settings page. A failed read there could previously wipe the middleware URL, business TIN and branch ID when saving, which would stop that till fiscalising.
- Errors while loading preferences are now recorded in the application log instead of being silently ignored, so a recurring network problem can actually be traced.
- Note: Application version was left unchanged at 2.7 for this release.
Release v2.39 — Fixed: Discounts Were Missing From EFRIS Tax Invoices
Released 20 July 2026
- IMPORTANT FIX: discounts given on a sale were not reaching URA on fiscal tax invoices. The app was sending each line already reduced by the discount, but EFRIS ignores a reduced line total and recalculates it as quantity x unit price. The result was that the discount disappeared: the customer's fiscal invoice showed the FULL undiscounted amount, and VAT was charged on that full amount, even though the customer had paid less.
- Lines are now declared to URA gross (quantity x unit price) with the discount sent alongside, which is the format EFRIS expects. URA then records the full line plus its own "(Discount)" line carrying the negative amount and its share of the tax, so the invoice totals and the VAT both match what the customer actually paid.
- This affects both ways of fiscalising: "Save & Send to Efris" on Make a Sale, and "Send to Efris" from a saved sale's details. It applies to line discounts, promotion discounts and whole-receipt discounts (a receipt discount is shared across the lines and declared per line).
- Verified against the live URA sandbox: a sale of 3 x 1,000 with a 450 discount plus 2 x 2,000 now correctly records 6,550 with 999.16 tax, instead of the previous 7,000 with 1,067.80 tax.
- Note: Application version was left unchanged at 2.7 for this release.
Release v2.38 — EFRIS Fiscal Receipts for Non-VAT Businesses & Item Category on Fiscal Documents
Released 20 July 2026
- New: businesses that are NOT VAT registered can now fiscalise their sales. Previously the "Save & Send to Efris" button was hidden unless the business was VAT registered, so a non-VAT business could not send anything to URA at all. The button now shows whenever EFRIS is switched on; whether the business is VAT registered only decides WHICH document is raised.
- New: the app now automatically raises the correct document type. A VAT-registered business sends a fiscal INVOICE (as before); a business that is not VAT registered sends a fiscal RECEIPT. This follows the "VAT Registered" setting under EFRIS Settings, so changing that one setting switches every sale. URA itself enforces this rule and rejects a receipt from a VAT-registered business (and vice versa), so this removes a class of failed submissions.
- Fiscal receipts are built in the format URA expects for a non-VAT business: no VAT breakdown (URA returns zero tax for these sellers), and discounts declared separately per line rather than folded into the line total. Verified against the live URA sandbox, including a sale with a discounted line.
- Fixed: discounted lines could be rejected by URA with "Multiply the quantity by the product of the unit price...". Line totals are now sent gross (quantity x unit price) with the discount declared separately, which is what URA validates against.
- New: each item on a fiscal invoice or receipt now also carries its category - the category code and category name from the item's assigned category (for example code 53131619, name "Cosmetics"). Nothing is invented: if an item has no category, no category is sent.
- Improved: no placeholder values are ever sent to URA any more. Previously an item missing a product code, name, unit or category had stand-in values substituted (a fixed commodity code, a fixed item code, "Goods", "PCE"). Those fields are now simply omitted when the item genuinely does not have them, so URA is never told a code or unit that is not really the item's.
- Note: Application version was left unchanged at 2.7 for this release.
Release v2.37 — Scanning & Search Now Tolerate Stray Spaces, Item List Loader, Payment Button Fix
Released 20 July 2026
- Fixed: scanning or typing a product code sometimes found nothing, even though the item existed - and removing a character or two would suddenly make it appear. The cause was stray spaces stored inside the code (from a barcode scanner, a paste, or from typing a code the way it is printed on the pack, e.g. "6 171105 494946"). Codes are now compared with all spaces ignored on both sides, so the item is found however the code was originally entered.
- Fixed: scanning an item's Product Code now adds it to the sale straight away. Previously only the Barcode fields were checked on a scan, so scanning a product code merely filtered the dropdown instead of adding the item.
- Fixed: when a code did not match exactly, pressing Enter could silently add the WRONG item (it fell back to whatever was first in the list). It now matches the correct item.
- Fixed: searching by name now ignores extra spaces and word order. Looking for "Fanta 330mls" finds an item saved as "Fanta 330mls", and " Lato Milk" finds "Lato Milk". Nearly a quarter of a typical item list has these accidental double spaces, so many items that seemed "missing" will now come up. This applies on Make a Sale, Receive Stock, Adjust Stock, Customer Orders, Quick Pick, Purchase Orders and the Item List.
- New: product codes and barcodes are now saved without any stray spaces, so the problem cannot be re-introduced when adding or editing an item.
- New: existing items that already have padded codes are repaired automatically. The background housekeeping job (which already tidied blank barcodes) now also trims codes that were saved with leading or trailing spaces. It runs quietly shortly after startup and every 30 minutes, and is designed never to interrupt whoever is working. Spaces inside a code are deliberately left alone and simply ignored when searching, so two different codes can never be merged by mistake.
- Fixed: on Make a Sale, the "CONFIRM & PRINT" button could disappear on the payment window - for example after entering 50,000 against a 1,000 sale - leaving no way to complete the sale. The payment window had no height limit, so once the wallet section, receipt discount box or quick-tender buttons appeared it grew taller than the screen and pushed the buttons out of view. The buttons are now fixed to the bottom of the window and the form scrolls if it is too tall, so BACK and CONFIRM & PRINT are always reachable.
- New: if the CONFIRM button is greyed out, the payment window now explains why - either over-tender is switched off in Preferences (so you cannot enter more than the total due), or the sale is underpaid and needs a real customer to carry the balance. Previously it just went dead with no explanation.
- New: the Item List now shows a loading spinner while items are being fetched, and has a "Refresh" button. On computers sharing a database over the network the first load can take a moment, and the empty grid used to look as though there were no items at all. If the load fails, the status bar now says so and invites you to click Refresh.
- Add/Edit Item: scanning (or typing) into the Product Code field now fills in Barcode 1 automatically, so a scanned item is immediately findable at the till. It stops copying as soon as you type your own Barcode 1, and when editing an existing item that already has a barcode, the existing barcode is never overwritten.
- Note: The application version (2.7) was already set before this release and has been left as-is.
Release v2.36 — Appearance Themes, Collapsible Daily Reminders & Customizable Reorder Report Columns
Released 4 July 2026
- New: Appearance / Theme customization (Preferences -> Appearance). You can now change the look of the whole app - font family and size, page background colour, default text colour, and the main button colour and text colour. Changes apply live to every open window; leaving any value unset keeps the app's original look.
- Two theme modes: "Site-wide" applies one shared look for the whole store (saved in the database, so every till matches), or "Per user" lets each login keep its own personal appearance. The defaults match the current design, so nothing changes until you customise it.
- New: the Daily Reminders panel on the right of the main window can now be collapsed to a thin strip using its arrow button, freeing up screen space, and expanded again when you need it. Your choice is remembered against your user account and restored on every page and after restarting the app, so each user keeps their own preference.
- New: customizable columns on the Low Stock / Reorder Report, just like Make a Sale and Receive Stock. A "Columns" button lets you show or hide columns (to reduce congestion on smaller screens) and you can drag the column headers to reorder them. Your arrangement is saved per user, with a "Reset to default" option to restore the original columns and order.
- Licence housekeeping: the silent background licence refresh now only ever uses your own licence's registered email. A leftover hard-coded fallback email address has been removed, so an unusual licence with no stored email is simply skipped instead of contacting the server with placeholder details.
- Note: Application version was intentionally left unchanged for this release.
Release v2.35 — Customizable Receive Columns & Item Form Tweaks
Released 4 July 2026
- New: customizable columns on the Receive Stock grid, just like Make a Sale. A "Columns" button lets you show or hide columns, and you can drag the column headers to reorder them. Your arrangement is saved to your user account in the database, so each user keeps their own layout across sessions, and a "Reset to default" option restores the original columns and order.
- Add/Edit Item form: as you type the Product Name it now also fills in the Description automatically. Once you edit the Description yourself it stops copying, so your own wording is never overwritten. When editing an existing item its saved description is left untouched.
- Fixed: the quick "Add Category" popup now resizes to fit its contents, so the Cancel and Save Category buttons are always visible (previously they could be cut off on some screens).
- Note: Application version was intentionally left unchanged for this release.
Release v2.34 — Create Items While Scanning, Inline Categories & Barcode Hygiene
Released 4 July 2026
- New: if you scan or type an item that does not exist on Make a Sale, Receive Stock or Adjust Stock, the app now offers to create it on the spot. Clicking "Yes" opens the Add Item form pre-filled with what you entered, and your current screen (and everything already added to the sale/voucher) is kept - nothing is lost. After saving, the new item is added straight to the transaction.
- Smart pre-fill when creating from a scan/search: a long numeric code (6 or more digits) is treated as a barcode and fills the Barcode field; a short numeric code fills the Product Code; text (or letters mixed with digits) fills the Product Name.
- Pasting a code into the item search now works immediately, just like a barcode scanner - you no longer need to press Enter. An existing item that matches by barcode, product code or name is added instead of prompting to create a duplicate.
- New: "Add New Category" is now the first option in the Category dropdown on the Add/Edit Item form. Selecting it opens a quick popup to enter the category (name, code and default tax); after saving, the new category is selected automatically without leaving the item form.
- New background housekeeping: every 30 minutes the app tidies blank barcode fields (both the built-in barcodes and any custom barcode fields), clearing empty/space-only values so they cannot cause the wrong item to be matched when scanning. This runs quietly in the background and is designed never to interrupt or slow down whoever is working.
- The application version has been updated to 2.6 (shown in the bottom-left of the main window).
Release v2.33 — Vendor Payments, and Completed Report Figures
Released 3 July 2026
- New: record payments to suppliers. On the Vendor Statement, a "Record Payment" button lets you enter an amount, date, payment mode and note. The payment reduces the vendor's outstanding balance, appears as a credit line on the statement, and updates the "Payments Made" total.
- Customer Statement now shows the real Wallet balance (deposits less amounts already spent from the wallet) instead of always showing 0.
- Cash Flow Summary: the "Withdrawals" column now reflects real money paid out to suppliers in the period (previously always 0), so the closing balance is accurate.
- Stock Adjustment Detail report: the Print button now actually prints a formatted report (date, reference, item, type, quantity, cost effect and user) instead of showing a "being prepared" message. CSV export was already available.
- Note: Application version was intentionally left unchanged for this release.
Release v2.32 — Personal Column Layout on the Sales Screen
Released 3 July 2026
- On Make a Sale you can now drag the grid column headers to reorder them, and the order is remembered for your user account - next time you sign in, your layout is restored.
- New "Columns" button on the sales screen: tick/untick columns to show or hide them (for example hide Item Code or Tax % if you never use them). Your choices are saved per user, so each cashier keeps their own view. A "Reset to default" option restores the original columns and order.
- The layout is stored against your user account (not a shared setting), so different tills/cashiers do not overwrite each other.
- Note: Application version was intentionally left unchanged for this release.
Release v2.31 — Application Version Updated to 2.5
Released 3 July 2026
- The application version has been updated to 2.5 (shown in the bottom-left of the main window and used by the installer).
- This rolls up the recent improvements: sale-price editing while receiving and on sales, below-cost warnings, the held-draft recall fix, working search buttons, global product search, the store logo on receipts (stored in the database), no-restriction Hold on receiving and sales, and the consistent "Hold" button across transaction screens.
Release v2.30 — Consistent "Hold" Button Across Transaction Screens
Released 3 July 2026
- The "Save Draft" button on Make a Sale is now labelled "Hold", matching how you hold a receiving voucher.
- Made the wording consistent everywhere you can park a transaction to finish later: Make a Sale, Receive Stock, Adjust Stock, Purchase Orders and Stocktake all now use a single "Hold" button (previously a mix of "Save Draft", "Save as Draft" and "Hold / Save Draft"). The buttons that open your parked items keep their descriptive names (Held Invoices, Held Vouchers, Held Adjustments).
- Note: Application version was intentionally left unchanged for this release.
Release v2.29 — Holding a Receiving Voucher Has No Restrictions
Released 3 July 2026
- Holding/saving a receiving voucher as a draft ("Hold / Save Draft") no longer runs the validation checks. You can now hold a part-finished voucher even if an item's cost is still 0 or details are incomplete, and finish it later.
- All the checks (cost price greater than 0, cost-vs-selling-price warning, supplier required, production batch/date for Manufacture) still apply as before when you actually Post the voucher ("Save & Post Voucher").
- Note: Application version was intentionally left unchanged for this release.
Release v2.28 — Store Logo Saved in the Database (Shared-Database Friendly)
Released 3 July 2026
- The store logo is now stored inside the database itself instead of as a file path. This means the logo shows on receipts from every till on a shared database, not just the computer where it was selected (a file path only exists on that one machine).
- Choosing a logo now reads the image into the database (limited to 1 MB; under 100 KB recommended for fast printing). Existing behaviour is otherwise unchanged: preview, "Use image as default logo", Remove, and printing on customer receipts, deposit receipts, customer orders and purchase vouchers.
- Note: Application version was intentionally left unchanged for this release.
Release v2.27 — Working Search Buttons, Global Product Search & Store Logo on Receipts
Released 3 July 2026
- Search buttons now work everywhere: the magnifier button next to search boxes (Sales History, Customer Order History, Inventory Items, Payment Modes, Expense Categories and the item-picker) now runs the search when clicked, instead of doing nothing.
- New global product search: the search bar at the top of the main window now works - type a product name or code and press Enter (or click the magnifier) to jump straight to the Inventory Items list filtered to your search.
- New store logo on receipts: Preferences -> Store Information -> Logo now lets you pick a logo image, see a live preview, and tick "Use image as default logo". When enabled, your logo prints at the top of customer receipts, deposit receipts, customer orders and purchase vouchers. A "Remove" button clears it. The chosen image is copied into the app's data folder so receipts keep working even if the original file is moved.
- Cleanup: removed more non-working placeholder buttons that did nothing when clicked.
- Note: Application version was intentionally left unchanged for this release.
Release v2.26 — Sale Price Editing on Receiving & Sales, Held-Draft Fix & Menu Cleanup
Released 3 July 2026
- Fixed: recalling held receiving drafts. On Receive Stock, pressing "Held Vouchers" (when the grid is empty) now correctly lists your held drafts. Previously the list could come up blank because the draft status was being treated as a search term, and older drafts were hidden by the default one-month date filter.
- New: Sale Price column on the Receive Stock voucher, so you can see each item's selling price alongside its cost while receiving.
- New preference (Preferences -> Receiving): "Allow changing product Sale Price while receiving stock". When on, the Sale Price column becomes editable and any change updates the product's master Sale Price for future sales. When off, the column is read-only.
- New preference (Preferences -> Pricing): "Allow editing the product's master Sale Price from the Make Sales screen". Cashiers can always change a line's price for the current sale; with this on, a price change can also be saved back to the product's default Sale Price (after a confirmation prompt).
- New: below-cost warnings. Entering a Sale Price lower than the item's cost now warns you both while receiving stock and while editing a price on Make a Sale, so items are not accidentally sold at a loss.
- Cleanup: removed non-working placeholder buttons that did nothing when clicked - Receive Stock (Discount/Fee/Freight, Print Tags, Show Messages, and the row Edit/Return Item), Sales History (Copy, Reverse, Reports), Customer Order History (Reports), Adjust Stock (Quick Pick Items) and the Import wizard (Help).
- Note: Application version was intentionally left unchanged for this release.
Release v2.25 — EFRIS Send Fix & Professional Installer (App v2.3)
Released 1 July 2026
- Application version updated to 2.3 (shown in the main window).
- Fixed a problem where sending a sale to EFRIS could fail in the installed app with a serialization error ("parameters with null names"). Generating an EFRIS fiscal invoice from Make a Sale, and re-sending from Sales History details, now work reliably in the packaged build.
- The Windows installer is now a professional step-by-step setup: choose Standalone (one computer), Server (main computer that hosts the shared database), or Client (till that connects over the network), with a short guide screen for your choice.
- On a Standalone or Server install, the bundled MariaDB database is now installed and configured automatically (service "MariaDB", port 3308) - no manual database setup - and for a Server the Windows Firewall is opened so tills can connect. After install, the in-app Setup Assistant finishes the rest.
- Note: This release intentionally sets the application version to 2.3 (previous releases left it unchanged).
Release v2.24 — Guided First-Time Setup Wizard
Released 1 July 2026
- Fresh installs now open a friendly step-by-step setup wizard instead of a technical connection screen - no database knowledge needed.
- Step 1 asks whether this computer is the MAIN computer (holds the data) or a TILL that connects to the main computer over the network.
- Main computer: the database settings are pre-filled with the standard values; a "Test connection" button confirms it works, and an option lets other tills connect to this computer.
- Till: a "Scan the network" button finds the main computer automatically so you just select it and connect.
- "Preparing your database" screen: creating tables and applying the latest updates now happens automatically behind a simple progress screen (database migrations are handled for you - nothing to type or run), with a clear "Try again" if something needs attention.
- The wizard then walks through activating your licence and entering your store name and currency, and finishes ready to sign in.
- This only appears on a brand-new installation; existing setups are unaffected.
- Note: Application version was intentionally left unchanged for this release.
Release v2.23 — Promotion Sales Report Drill-Down (3 Levels)
Released 1 July 2026
- The Promotion Sales Report's "Breakdown" is now an expandable tree you can drill into three levels: Promotion -> Item -> individual Sale. Click the arrow on any row to expand it.
- Level 1 shows each promotion's totals; expand it to see Level 2 (each product sold under that promotion, with its own units, discount and net); expand a product to see Level 3 (each individual sale line, labelled with invoice number and date/time).
- Added "Expand all" / "Collapse all" buttons, kept every column (Sales, Units, Gross, Discount, Net, Avg Discount) aligned across all levels, and the CSV export now includes all three levels with a Level column.
- Note: Application version was intentionally left unchanged for this release.
Release v2.22 — Promotion Discounts & Reporting, Purchase Order Email/Barcode & Fixes
Released 1 July 2026
- Promotions now apply as a visible discount instead of a silent price cut: the original price stays shown and the promotion is recorded as a line discount. The sale screen shows the discount amount, percentage and the promotion name on each affected line, and a promotions/"happy hour" banner at the top lists any promotions active right now (respecting the selected days and time window).
- Receipts now clearly show promotions: the printed receipt lists each item at its original price with a green "{Promotion}: -amount" line, plus the discount in the totals, so customers can see exactly what they saved.
- Choose multiple items per promotion: the promotion editor's "Specific item(s)" option now lets you search and tick several products at once (previously only a single item could be chosen), with a live "N selected" count.
- Promotion tracking & report: every sale line now records which exact promotion was applied. New Reports -> Customers -> "Promotion Sales Report" filters by date and by promotion and shows totals (promo net sales, discount given, units sold on promo, promo share of sales), a promo-vs-regular comparison, a per-promotion breakdown, and CSV export.
- Purchase Orders - email to supplier: the Purchase Orders list has a new "Email Supplier" button that sends the selected order as a branded email. It uses the supplier's email on file, or prompts for one.
- Purchase Orders - barcode entry: when building a purchase order you can now scan a barcode (or press Enter in the product search) to add the item to the order; scanning an item already on the order increases its quantity.
- EFRIS visibility fix: the "Increase Stock with Efris" button on a receiving voucher's details now only appears when EFRIS integration is enabled, matching every other EFRIS button in the app.
- Stability fixes: fixed crashes that could occur when editing quantities in the Stocktake, Purchase Order, Sales Return and Receive-against-PO grids ("Refresh is not allowed during an AddNew or EditItem transaction"), and a crash when opening Held Quantity Adjustments.
- Note: Application version was intentionally left unchanged for this release.
Release v2.21 — Loyalty Points & Promotions (Tier 3)
Released 1 July 2026
- Loyalty Points (Customers -> Loyalty Points): turn on a points program where customers earn points as they spend (configure how much spend = 1 point). Points can be redeemed to wallet credit (configure the value of 1 point and a minimum-points threshold). Points are awarded automatically on each sale to a named customer; redeem from the Loyalty screen.
- Promotions (Customers -> Promotions): create percent-off or fixed-amount-off promotions scoped to all items, a department or a single item, with optional start/end dates and an optional recurring "happy hour" window (selected days + time range). Turn "Promotions enabled" on and matching promotions are applied automatically as a promo price when items are added at Make a Sale.
- Note: Application version was intentionally left unchanged for this release.
Release v2.20 — Batch & Expiry Tracking with FEFO (Tier 3)
Released 1 July 2026
- Products are now tracked in batches (lots) with expiry dates. When receiving stock (Receive Items) you can enter a Batch # and Expiry date per line; goods received against a Purchase Order are also recorded as batches.
- FEFO consumption: sales automatically draw down the earliest-expiring batch first (First-Expiry-First-Out). Sales returns that restock, and stocktake adjustments, keep the batches in step.
- Existing stock is handled automatically: on first run, every product with stock on hand gets an "opening" batch (no expiry) so nothing breaks and FEFO has stock to draw from.
- New Inventory -> "Batch & Expiry Report": see Expiring Soon (within a configurable number of days), Expired stock, all batches, or batches with no expiry set, with remaining quantity and cost value at risk, plus CSV export.
- Note: Application version was intentionally left unchanged for this release.
Release v2.19 — Stocktake / Cycle Count (Tier 3)
Released 1 July 2026
- New Inventory -> "Stocktake / Cycle Count": run a guided physical count instead of one-off manual adjustments.
- Start a count for all items or a single department; the system captures the current on-hand quantities as a snapshot.
- Enter the counted quantity per item; the screen shows the variance (and its value) live, with a "show variances only" filter and search.
- Post the stocktake to automatically adjust stock on hand to match the count (writing "Stocktake In/Out" stock movements for the audit trail). Drafts can be saved and resumed; counts can be cancelled before posting.
- Variance report: view/print the variance report for any stocktake, and see a list of all stocktakes with their variance counts and net value.
- Note: Application version was intentionally left unchanged for this release.
Release v2.18 — Email Receipts & Statements (Tier 3)
Released 1 July 2026
- Email a receipt: Open a sale (Sales History -> Show Details) and click "Email Receipt" to send the customer a branded HTML receipt. If the customer has no email on file you're prompted for one.
- Email customer statements: The Customer Statement screen now has an "Email Statement" button that sends the account ledger (with running balance and closing balance) to the customer's email.
- Email supplier statements: The Vendor/Supplier Statement screen now has an "Email Statement" button that emails the purchases ledger to the supplier.
- All emails go through the existing Weaf email service (the same one used for EFRIS activation and password reset). Note: SMS is not included as there is no SMS gateway configured; this delivers the email side of the feature.
- Note: Application version was intentionally left unchanged for this release.
Release v2.17 — Sales Reports Net of Returns
Released 1 July 2026
- Daily Sales Summary now reflects real returns: the Returns/Refunds column and Net Sales figure are drawn from actual sales returns (from the Returns feature) instead of always showing zero. Days that only have returns now also appear, and the staff filter also filters returns processed by that user.
- Report Center dashboard "Today's Sales" is now net of today's returns, and "Today's Profit" is reduced by the margin lost on returns (the cost of restocked goods is credited back).
- Note: Application version was intentionally left unchanged for this release.
Release v2.16 — Configurable Currency Everywhere + Returns Visibility
Released 1 July 2026
- Currency now follows Preferences everywhere: the display currency set in Preferences -> Company (Currency Code) is now used across the whole app instead of a hard-coded "UGX". This includes Make a Sale, Receiving, Stock Adjustment, Customer Orders, the Cash Register/Z-Out screens, End of Day report, and all balances, KPIs and reports. Change it once in Preferences and it updates throughout.
- Sales Returns shown on the Cash Register: The Z-Out / Close Register screen now has a "Sales Returns (Cash)" line so you can see how much cash was refunded during the session; it explains why Expected Cash is lower than Net Sales.
- Sales Returns on the End of Day report: The EOD report now shows total refunds (and the cash portion) and subtracts cash refunds from the Total Cash Expected.
- Returns visible in Sales History: A sale that has a return raised against it now shows a "Returned" badge in Sales History. Selecting a posted sale enables the (now blue) "Accept Return" button.
- Returns History details: In Returns History you can now double-click a return (or use "View Details") to see the returned items, quantities, unit prices, tax, refund method, restock flag, reason and remarks.
- Note: Application version was intentionally left unchanged for this release.
Release v2.15 — Sales Return Usability Fixes
Released 1 July 2026
- Sales Return totals: When an invoice is loaded, each line's Return Qty now defaults to the full returnable quantity, so the Subtotal / Tax / Total Refund figures are populated immediately (previously they showed 0 until a quantity was typed). Cashiers can still reduce any line for a partial return.
- Initiate returns from Sales History: Selecting a posted sale in Sales History now enables the "Accept Return" button, which opens the Sales Return screen with that invoice already loaded. The button stays disabled for held/unposted sales.
- Note: Application version was intentionally left unchanged for this release.
Release v2.14 — Retail Workflows: Sales Returns, Purchase Orders, Reorder Report & Barcode Labels (Tier 2)
Released 1 July 2026
- Sales Returns / Refunds: New Point of Sale -> "Sales Return / Refund" screen. Look up an original invoice, choose which items (and how many) are coming back, and refund to cash or to the customer's store-credit wallet. Returned goods can be added back to stock. Over-returns are blocked (you can never return more than was sold, across multiple returns). Cash refunds are deducted from the drawer's expected cash at End of Day, and a "Returns History" view (with CSV export) lists every processed return.
- Purchase Orders: New Purchasing -> "Purchase Orders". Create an order to a supplier (items, quantities, unit costs, expected date), save it as a draft or issue it, then receive goods against it - including partial deliveries that track outstanding quantities. Each receipt adds stock, writes stock movements, updates the supplier balance and appears in Receiving History. Orders move Draft -> Open -> Partial -> Received automatically, and can be printed or cancelled.
- Low Stock / Reorder Report: New report (Inventory menu and Reports -> Items) listing every tracked item at or below its reorder level (the product's Stock Pre-warning value), with suggested order quantities and an estimated reorder cost. A red "low stock" alert badge in the top bar shows the count and opens the report in one click. Includes CSV export and print.
- Barcode & Shelf-Label Printing: New Inventory -> "Print Barcode / Shelf Labels". Pick products, set how many labels of each, choose what to show (name, price, code, store name, border) and the sheet layout, then print. Barcodes render as scannable Code 39 with no special font required.
- Note: Application version was intentionally left unchanged for this release.
Release v2.13 — Security Hardening, Activity Log & Database Backups
Released 1 July 2026
- Password Security: All account passwords are now securely hashed instead of being stored as plain text. Existing users keep their current passwords - nothing changes for them; each password is upgraded automatically the first time they log in. Applies to login, password reset, profile changes, manager approval and employee management.
- Activity / Audit Log: A new activity trail records key events (logins, failed logins, logouts, password changes and employee add/edit/remove). View it under Report Center -> Employees -> "Audit Log / Activity", with date filters and CSV export.
- Database Backup & Restore: New File -> Utilities -> Backup Database / Restore Database. Backups are saved as .sql files; restore is Admin-only and asks for confirmation before overwriting.
- Automatic Daily Backups: Preferences -> General -> Backups lets you turn on an automatic daily backup and choose the time of day. If the app is closed at that time, the backup runs the next time it is opened.
- Default Backup Folder: Preferences -> Backups lets you choose the default folder used for manual and automatic backups.
- Clearer Reset/Change-Password Validation: Wrong verification codes and mismatched passwords now show a clear pop-up message on the Forgot Password and Change Password screens.
- Launch Screen: The startup splash now reads "Weaf Point of Sale (POS)".
- Note: Application version was intentionally left unchanged for this release.
Release v2.12 — Custom Product Fields, Password Reset & User Profiles
Released 1 July 2026
- Custom Product Fields: A new "Custom Fields" section under Preferences -> Inventory lets you define your own product fields (Text, Number, Date or Barcode). Defined fields appear on every product's Add/Edit form and on the product detail page.
- Barcode Custom Fields in Scanning: Custom fields of type "Barcode" are now matched when scanning items in Make a Sale, Purchases (Receiving) and Stock Adjustment, in addition to the existing built-in Barcode 1-4 fields.
- Forgot Password: The login screen's "Forgot your password?" link now works. Enter your username or email and a 6-digit verification code (OTP) is emailed to your registered email address; enter the code and choose a new password to reset it. Codes expire after 15 minutes.
- Password Reset Email: Sent through the same email service as EFRIS activation, using a new dedicated email template.
- My Profile: The header Profile option now opens an editable profile window where users can update their full name, phone, email and address, and change their own password (with current-password verification).
- Help Window: Removed the old "Contact Page" link from the in-app Support window, leaving only the Support Desk link.
- Preferences Fix: Fixed the Company Preferences window so pages no longer overlap - the Hardware (Cash Drawer) page was previously drawn on top of other pages (e.g. Database) after being viewed once.
- Note: Application version was intentionally left unchanged for this release.
Release v2.11 — Support Desk Link & Admin Drawer Closing
Released 30 June 2026
- Support Desk Link: Added the Support Desk (https://supportdesk.weafcompany.com/) to the Websites section of the in-app Support window.
- Admin Drawer Closing: Fixed the admin register flow so an Admin can actually close a drawer. Previously, when an admin opened a session from End Of Day -> Admin Register Dashboard -> View Session Details, the cash-count box and the Z-OUT / Close Register button were hidden, so the drawer could be viewed but not closed. The close inputs are now shown, with a banner indicating which terminal/cashier's drawer is being closed.
- Note: Application version was intentionally left unchanged for this release.
Release v2.10 — Discount Fixes: Make-Sales Crash, Mutual Exclusivity, Default-Off & Receipt Printout
Released 30 June 2026
- Fixed a crash when opening the Make a Sale screen ("Value cannot be null (Parameter 'source')"). The receipt discount field fired its change handler during screen load before the sale items list existed; totals are now null-safe and the handler ignores load-time events.
- Mutually Exclusive Discounts: A receipt can now use EITHER per-line discounts OR a whole-receipt (cash) discount, not both. When any line already has a discount, the Receipt Discount field is hidden at checkout and a short note explains why.
- Receipt Discount Off by Default: The whole-receipt discount field now only appears when explicitly enabled in Preferences -> Discounts (the setting now defaults to off). Existing databases can turn it off by unchecking "Allow whole-receipt discount" and saving.
- Discounts on Receipt Printout: The sale receipt now prints the Trade Discount and/or Cash Discount as their own lines (shown only when greater than zero), with a pre-discount subtotal so the figures reconcile to the grand total. Receipts without discounts print exactly as before.
- Trade vs Cash discount are now recorded separately on each sale (trade = line discounts, cash = whole-receipt discount).
- Note: Application version was intentionally left unchanged for this release.
Release v2.9 — Fix: Preferences Save Crash (NULL Discount/Tendering Settings)
Released 30 June 2026
- Fixed a crash when opening or saving Preferences ("Unable to cast object of type 'System.DBNull' to type 'System.String'"). The new discount/tendering string settings (DefaultDiscountType, TenderRoundingMode, QuickTenderAmounts) were added as nullable columns while the app expects non-null text, so existing databases with NULL values failed to load/save.
- On startup the app now backfills any NULL values in these columns with their defaults (Percentage, None, and the default quick-tender amounts), repairing existing databases automatically.
- Note: Application version was intentionally left unchanged for this release.
Release v2.8 — Discounts & Receipt Tendering Preferences with Make-Sales Enforcement
Released 30 June 2026
- Discount Rules (Preferences -> Discounts): New configuration for enabling line/receipt discounts, default discount type, maximum discount percent, maximum fixed discount amount, manager-approval-above percent, and a "require reason" toggle, plus an editable list of preset Discount Reasons.
- Discount Enforcement in Make Sales: Line discount inputs are disabled when discounts are turned off; entered discounts are capped to the configured limits; discounts above the threshold require Admin/Manager approval (username + password); a reason can be required and is saved on the sale line.
- Receipt Tendering (Preferences -> Receipt Tendering): New configuration for default payment mode, require amount tendered, allow over-tender, allow split payments, require a customer for credit sales, cash rounding (None/5/10/50/100, cash-only toggle) and quick-tender button amounts.
- Tendering Enforcement at Checkout: The payment screen preselects the default payment mode, shows quick-tender buttons, rounds the suggested cash amount, and blocks confirmation on disallowed over-tender, missing amount tendered for cash, or credit to a Walk-In customer when a customer is required.
- Whole-Receipt (Cash) Discount: An optional receipt discount field at checkout. The discount is converted to a percentage of the sale and applied to each line item (the last line absorbs rounding), so EFRIS - which only supports line-item discounts - receives the discount consistently at the line level. Line taxes are recomputed accordingly.
- New Manager Approval window and a DiscountReasons table; new GlobalSettings and SaleItems columns are auto-created on startup (no destructive migration).
- Note: Application version was intentionally left unchanged for this release.
Release v2.7 — Top Menu Cleanup & Implemented "Coming Soon" Actions
Released 30 June 2026
- Top Menu Cleanup: Removed top-bar menu items that had no page or action wired to them (placeholders). Removed items are documented in pending-menu-items.md for future implementation. Items already wired to an action were kept.
- Data Export: File -> Utilities -> Export now opens a real Export window that exports Customers, Vendors, Suppliers, Inventory Items, Sales (including EFRIS fields), Expenses or Payment Modes to a CSV file (openable in Excel).
- Inventory List Toolbar: The Make a Sale, Receive Items and Reports buttons in the inventory item list popup now navigate the main window to the relevant screens instead of showing "coming soon".
- Customer Recent Sales: The customer detail page now shows the customer's last 10 sales (date, invoice number, total) loaded from the database, replacing the placeholder.
- Vendor Recent Purchases: The vendor detail page now shows the vendor's last 10 stock-in receipts (date, reference, total), replacing the placeholder.
- Note: Application version was intentionally left unchanged for this release.
Release v2.6 — Fix: Payment Modes Page Crash (Status Badge Converter)
Released 30 June 2026
- Fixed a crash when opening the Payment Modes list ("Cannot find resource named 'StatusBgConverter'"). The status-badge value converters were registered in code-behind after the view loaded, so the DataGrid's status column could not resolve them while rendering rows.
- The converters (active/inactive background, foreground and text) are now public, top-level classes registered in the view's XAML resources at parse time, so they always resolve. Removed the fragile code-behind registration.
- Note: Application version was intentionally left unchanged for this release.
Release v2.5 — Custom Date Range, EFRIS Sales Import & Sales Export
Released 30 June 2026
- Custom Date Range (Sales History): Added a "Custom Range" option to the Sales History date filter. Selecting it reveals From/To date pickers and filters sales between the chosen dates (either bound optional); the pickers auto-hide for the preset ranges.
- Auto-Create Departments on Import: Fixed an import failure ("Column 'DepartmentId' cannot be null") by auto-creating/resolving the department for imported and auto-created products, just like products and categories. Applied to both the sales and inventory imports.
- New "Sales (Advanced)" Import: Added a separate import type that brings in full sale records with ALL fields - including EFRIS tax details (FDN, verification code, QR code, EFRIS status and message). One row equals one sale. This is distinct from the existing itemized "Sales (with items)" import.
- Export Existing Sales -> Template: Added an "Export Existing Sales" button on the import file step that exports every existing sale with all fields (including EFRIS) to a CSV. Users can edit this file and re-import it via Sales (Advanced) - a ready-made dynamic template populated with real data.
- Updated Templates: Added a downloadable Advanced Sales template (all fields + EFRIS) and the Download Template button now offers CSV by default.
- Note: Application version was intentionally left unchanged for this release.
Release v2.4 — Import Fixes & Itemized Sales Import with Auto-Created Products
Released 30 June 2026
- CSV Import Fix: Fixed a bug where importing from a CSV file imported 0 records silently. CSV files are now fully loaded (headers and all rows) the same way as Excel files.
- Browse Filter Fix: The file picker now defaults to showing both CSV and Excel files together (instead of Excel only), so CSV files are visible immediately.
- Background-Thread Fix: The import engine no longer touches UI controls from the background worker (which previously failed silently). The selected import type and column mapping are now captured up front, eliminating the silent "0 imported" result.
- Visible Results & Errors: Import now shows a clear pop-up with the number of records imported and skipped, and surfaces any error message instead of failing quietly.
- Import Logging: The application log now records the full import payload - import type, column headers, every data row, the number of database rows saved, and the reason for each skipped row - for easy troubleshooting.
- Itemized Sales Import: Historical sales now import with product line items. Each row is a product line (ItemCode/ItemName, Quantity, UnitPrice, TaxRate, LineDiscount) and rows sharing the same InvoiceNumber are grouped into one sale with multiple lines; header totals are summed from the lines. Stock on hand is not changed.
- Auto-Create Missing Products: If a product on a sales row does not exist, it is created automatically using configuration columns carried in the CSV (ItemMeasureUnit, Department, ItemType) - defaulting the unit of measure to PP-Piece - and reused for later rows in the same file.
- Updated Templates: The downloadable Sales template now includes the product and configuration columns; Expenses and Purchases templates remain available.
- Note: Application version was intentionally left unchanged for this release.
Release v2.3 — Historical Data Import: Expenses, Sales & Purchases (Backdated)
Released 30 June 2026
- Expense Import: Added an "Expenses" type to the Data Import Wizard so users can import historical (backdated) expenses from other systems via CSV/Excel. Expense categories are created automatically when missing, the ExpenseDate is honored for old-year records, and rows with missing/zero amounts are safely skipped.
- Sales Import (Summary): Added a "Sales (Summary)" type to import historical sales totals from old years for reporting. One sale header per invoice; the original SaleDate is preserved; customers and payment modes are matched by name (falling back to Walk-In / default); the total is derived from SubTotal + Tax - Discount when not supplied. Imported sales do not change current stock.
- Multi-Line Invoices: Sales rows that share the same InvoiceNumber are consolidated into a single sale header with the SubTotal, Tax, Discount and Total summed across all its lines. Purchases behave the same way, grouped by ReferenceNumber (GRN).
- Purchases Import (Summary): Added a "Purchases (Summary)" type to import historical purchase totals from old years. One receipt per reference; suppliers matched by name; original PurchaseDate preserved. Imported purchases do not change current stock.
- Persisted Purchase Total: Added a ManualTotalAmount column on StockInReceipts (auto-created on startup) so header-only (summary) purchases carry a real total into the Purchases Summary and Purchases by Supplier reports without affecting normal line-item receipts.
- Downloadable Templates: "Download Template" now provides ready-to-fill CSV templates for Expenses, Sales (with a multi-line invoice example) and Purchases.
- Null-Safe Imports: Hardened number/date parsing and creator-id handling during import to avoid foreign-key and parsing errors.
- Note: Application version was intentionally left unchanged for this release.
Release v2.2 — POS Product License Lock, Full-Screen Activation Window & Online Activation Fixes
Released 30 June 2026
- POS Product License Lock: The application is now locked to its product type. On startup it fetches the product catalog from the server (https://weafcompany.com/api/v1/offline-licenses/products), selects the product whose type is "POS" (id is never hard-coded, so it survives catalog changes), and caches it locally (pos_products.json) so the lock keeps working offline.
- License Product Enforcement: License verification now rejects any otherwise-valid license that was issued for a different product (e.g. Payroll). Matching is by product id first, then by product name, with a conservative name fallback when no catalog has been cached yet.
- Dynamic Product in Activation: Online trial activation now requests the real POS product (id and name resolved from the catalog) instead of a hard-coded product, and caps the product description at 255 characters to satisfy the server's validation limit.
- Clearer Activation Errors: When the activation server rejects a request, the exact server returnMessage (or the first field validation error) is now shown to the user instead of a generic "HTTP 4xx" message.
- Null-Safe License Parsing: Hardened license parsing so a null/non-numeric product or license id in a server-issued license no longer throws during verification.
- Full-Screen Activation Window: The License Activation window now fills the screen work area (without covering the taskbar). The form scrolls and the "Verify and Activate" button is docked in an always-visible action bar at the bottom.
- Note: Application version was intentionally left unchanged for this release.
Release v2.2 — Startup Splash, Default Login Helper, License Expiry Banner & MRA EIS (Malawi) Integration
Released 23 June 2026
- Startup Splash Loader: Added a borderless splash window with an animated spinning ring shown during startup while the app discovers the network server and initializes the database; it closes automatically before the login screen.
- Default Login Helper: The sign-in screen now shows the default credentials (admin / admin123) with a one-click "Use default login" button that fills and submits them.
- Hide Default Login Setting: Added Preferences -> Store Info -> Login Screen toggle "Hide default login (admin / admin123) on the login screen" (stored in GlobalSettings.HideDefaultLogins).
- License Expiry Banner & Countdown: A banner appears at the top of the main window when 30 days or fewer remain on the license, showing a live day countdown and a Renew / Activate link to the activation page. The countdown is re-evaluated periodically while running.
- Auto Service Termination on Expiry: When the license has expired, the app prompts for activation and otherwise terminates, preventing continued use until renewed/activated.
- MRA EIS (Malawi) Integration: Added a new tax integration under File -> Integrations -> "MRA EIS (Malawi)", working exactly like EFRIS (6-digit one-time activation code emailed to the store for authorization).
- Mutually Exclusive Tax Integrations: EFRIS and MRA EIS cannot both be active at once; enabling one while the other is active is blocked with a clear message.
- Dynamic Activation Branding: The activation authorization dialog title and the activation email (subject, title and heading) now reflect the chosen integration (EFRIS vs MRA EIS) instead of always saying EFRIS.
- Note: Application version was intentionally left unchanged for this release.
Release v2.1 — Stock Search on Enter & Version Update
Released 12 June 2026
- Stock Search on Enter: Implemented PreviewKeyDown Enter-interceptor for the editable search textbox in Stock Adjustment (AdjustStockView) and Receive Stock (ReceiveItemsView) to allow selecting/adding items directly on pressing Enter.
- Walk-In Customer Restrictions: Protected default Walk-In Customer (Id=1) from deletion and ensured safe fallback selection in sales if ID search fails.
- UOM Default Handling: Reconfigured item creation window to correctly initialize all Unit of Measures from db and default select "PP-Piece".
- Application Version: Bumped version to 2.1 across WeafPOS.csproj, version.txt, and MainWindow.xaml.
Release v2.0 — Default UOM PP-Piece, Item List Refresh & Validation Checks
Released 12 June 2026
- Default UOM: Configured default Unit of Measure on the item creation page to be "PP-Piece".
- Item List Refresh: Added a Refresh button on the item list screen to reload current items dynamically while retaining filters.
- Price & Margin Checks: Integrated validations to prevent saving zero/negative/0.0 prices, and confirmation warnings for profit margins exceeding 50%.
- Application Version: Updated version to 2.0.
Release v1.9 — Scan Placeholder Removals, Sales History Shortcut & Login Autofocus
Released 12 June 2026
- Scan Placeholder Removals: Removed "Scan" placeholders from the item search box across Make Sales, Receive Purchases, and Stock Adjustment views. This avoids search dropdown filtration issues and input bugs.
- Login Input Autofocus: Configured the UsernameBox to receive focus automatically upon window load.
- Sales History Shortcut: Added a direct Sales History shortcut in the Make Sales page left sidebar.
- Sales History Logging: Integrated detailed diagnostic pipeline logging and case-insensitive terminal filters.
Release v1.8 — Search Autocomplete Fixes & Item Layout Enhancements
Released 12 June 2026
- Search Results Layout: Enhanced the item search result rows in Make Sales, Receive Stock, and New Adjustment to display the item name, product code, available stock (showing both UOMs if applicable), and price horizontally in a single row with larger fonts.
- Typing Autocomplete Disablement: Disabled native WPF ComboBox text search autocomplete (IsTextSearchEnabled="False") across Make Sales, Receive Stock, Customer Orders, and Stock Adjustments. This prevents the text box from automatically completing and highlighting match suffixes while the user is actively typing.
- Custom Customer Search & Filtering: Added custom TextChanged search handlers on Make Sales and Customer Order pages to filter the customer dropdown list dynamically by name and phone number as the user types, without native auto-selection interference.
- Receive Stock Dropdown Guard: Wrapped vendor selection updates in state guards on the Receive Stock page to prevent the vendor dropdown from automatically re-opening after selection.
Release v1.6 — CreatedById FK Fix, Efris Token Correction, Installer Paths & Store TIN Configuration
Released 3 June 2026
- CreatedById Foreign Key Violations: Resolved database seeding and preference saving failures by verifying user existence in the current database context before applying audit tracking, and bypassing user tracking for system-seeded records.
- Efris Token Schema Correction: Dropped obsolete and non-null TokenValue column in EfrisTokens table during initialization to prevent errors when saving Efris tokens.
- Default Installer Path: Updated installer.iss configuration to set default installation directory to C:\ProgramData\WeafPOS.
- Manual Schema Sync Improvements: Fixed duplicate column exceptions for CreatedById/TerminalName/etc. and corrected MariaDB syntax errors during automated startup schema check.
- Store TIN Preference & UI Integration: Integrated TIN number in the Store Info section of the preferences window, enabling store settings to store and propagate TIN.
- Auto-Activation Messages: Ensured returnMessage from the activation server is displayed to the user regardless of the returnCode to improve troubleshooting.
Release v1.2.4 — Stock-In & Stock-Adjustment Schema Reconciliation and EFRIS UI Controls
Released 2 June 2026
- Database Schema Reconciliation: Added startup schema checks to dynamically create missing columns in StockInReceipts, StockInItems, AdjustStockReceipts, and AdjustStockItems tables.
- Obsolete Columns Nullability: Configured legacy/obsolete database columns (e.g., ReceiptNumber and CostPrice) to be nullable to prevent insertion exceptions.
- Cost Data Migration: Added automatic database update routines to migrate existing CostPrice values to UnitPrice in the StockInItems table where UnitPrice was 0.
- Historical Script Correction: Aligned raw SQL scripts in historical migrations 20260307211000_AddStockInSupport and 20260309100000_AddStockAdjustmentTable to prevent issues on clean installations.
- EFRIS Dynamic UI Visibility: Configured the Receiving History view to query settings and dynamically collapse/hide the EFRIS Status filter and DataGrid column when EFRIS integration is disabled.
Release v1.2.3 — Database Migration & Auto-Refresh Fix
Released 2 June 2026
- Safe EfrisStatus Data Type Reconciliation: Implemented a startup schema check in DatabaseService.cs to automatically convert the EfrisStatus column data type from longtext to tinyint(1) across InventoryItems, StockInReceipts, and AdjustStockReceipts, preventing System.InvalidCastException failures.
- Event-Driven Auto-Refresh: Added an ItemSaved event to InventoryItemDetailsWindow that automatically triggers list updates in InventoryItemListView, ReceiveItemsView, and MainWindow without requiring the window to close.
- Reconciled Obsolete Columns: Resolved issues with faked migrations by setting safe default values and nullability on obsolete columns like Price, MovementType, and MovementDate, and added missing CreatedById column to StockMovements.
Release v1.2.2 — Production Login Cleanup & Installation Guide
Released 1 June 2026
- Removed Default Login UI: Removed the Quick Access development buttons (Admin, Manager, Cashier) from the login window for a cleaner, production-ready interface.
- Modern Sizing: Adjusted the login window height to 490px to perfectly match the streamlined UI layout.
- Premium Installation Guide: Created a highly-styled, interactive HTML guide (installation_and_license_guide.html) containing system requirements, network setup details, and default credential lookups with click-to-copy badges.
- Compilation Fix: Fixed the undefined variable build error in LicenseService.cs response body logging.
Release v1.2.1 — Online License Activation Reliability Fix
Released 1 June 2026
- Pre-Flight Connectivity Check: Added a lightweight HEAD request to weafcompany.com before the main activation API call. If the server is unreachable, the exact TCP/DNS/SSL error is shown immediately instead of a generic "check your internet" message.
- Increased HTTP Timeout: Raised the activation HTTP timeout from 10 seconds to 30 seconds to accommodate slower or congested connections common in the deployment region.
- Granular Error Reporting: Changed AutoActivateTrialAsync return type from bool to a (bool Success, string ErrorMessage) tuple, surfacing the exact failure reason (timeout, HTTP status code, server rejection message, signature mismatch) directly in the activation UI status label.
- Explicit Timeout Handling: Added a dedicated TaskCanceledException catch so a slow server response shows "request timed out (30s)" rather than silently failing.
- Server Rejection Details: When the server returns a non-00 return code, the returnMessage from the API is now displayed verbatim in the UI so the user knows exactly why the server rejected the request.
- Trial Auto-Activation: Implemented automatic online trial license registration on first launch, silently querying the generate API and saving the activation license.
- Verification Option UI: Added an "Online Activation" tab to the LicenseActivationWindow to allow manual clicks for trial activation.
- Cryptographic Signature Normalization: Added JSON normalization in LicenseService.cs signature verification logic to handle formatting/whitespace differences in license payloads.
- Startup Background Refresh: Integrated silent background refresh of the license (AutoRefreshLicenseAsync) on startup to dynamically extend active license dates when internet is available.
- WPF Multi-Csproj Cleanup: Resolved WPF project compilation errors caused by orphaned temporary `*_wpftmp.csproj` project files left by interrupted compilation processes.
Release v1.0.0 — License Activation Form & Dynamic Trial Application
Released 1 June 2026
- Removed Silent Background Trial Activation: The application now prompts the user to activate immediately on start-up rather than auto-activating with hardcoded details.
- User Trial Input Form: Redesigned the "Online Activation" tab with text inputs for Email, Full Name, Company, Phone, and Address.
- Dynamic Activation: Integrated the user-supplied details into the trial generation API query.
- User Form Input Validation: Validates all inputs on the activation window before submission.
Release v1.0.0 — Inventory Summary Category Export & Daily Sales Summary Report
Released 1 June 2026
- Category Items Export & PDF Printing: Added the ability to export and print/PDF item listings when double-clicking a category in the Inventory Summary report.
- Daily Sales Summary Report: Added a "Daily Sales Summary" report in the Report Center breaking down daily totals, payment modes (Cash, Mobile Money, Credit, Cards), discounts, and returns.
- Staff/User Filtering: Integrated dynamic dropdown filtering to filter daily summary records by specific staff members.
- Multi-Channel Exports: Implemented Excel (CSV) and professional FlowDocument print/PDF capabilities for daily reports.
- Outstanding Balance in Customer Sales Ranking: Added Outstanding Balance details to the Customer Sales Ranking report to aid wholesale analysis.
- Cashier Sales Performance Metrics: Upgraded the Employee Sales report to calculate and display Voids, Discounts Applied, and Returns Processed per employee, with full CSV export support.
- Report Center Integration: Unified the reports by directly placing Sales by Category, Sales by Customer, and Sales by Cashier under the main "Sales" category in the Report Center.
Release v1.0.0 — Cash & Financial Reports Integration
Released 1 June 2026
- Cash Flow Summary Report: Implemented a daily cash reconciliation report showing Opening balance, Sales (Inflows), Expenses (Outflows), Withdrawals, and Closing balance.
- Expense Grouped Report: Added an operating expense analysis report automatically grouping company expenditures by Rent, Transport, Salaries, Utilities, and Others.
- Income Statement (Profit & Loss): Designed a GAAP-compliant report detailing Revenue, Cost of Sales, Gross Profit, Expenses, and Net Profit with automatic margins.
- Multi-Channel Exports: Implemented high-fidelity PDF printing/FlowDocument preview and Excel (CSV) exports for all three financial reports.
- Report Center Navigation: Unified the financial reports under a dedicated "Financials" category section in the main Report Center.
Release v1.0.0 — Purchase Reports Integration
Released 1 June 2026
- Purchases Summary: Implemented an invoice procurement report showing Supplier, Invoice Reference, Date, and Amount Purchased.
- Purchases by Supplier: Added vendor purchase analysis calculating Total Bought and dynamically mapping Outstanding Balance per Supplier.
- Purchase Returns Report: Integrated standard returned vouchers audit logs to track supplier inventory refunds and balance reversals.
- Dynamic Exports & Print Formats: Integrated high-fidelity FlowDocument print templates and CSV/Excel exports for all three new purchase reports.
- Report Center Registration: Fully mapped the new purchase views directly under the existing "Purchasing" category tab in the Report Center.
Release v1.0.0 — Profitability Reports Integration
Released 1 June 2026
- Gross Profit Report: Implemented a comparative daily margin report showing Sales, Cost of Goods Sold (COGS), Gross Profit, and Margin %.
- Profit by Product: Designed ranking list tracking itemized profitability, detailing product sales, COGS, gross profits, and weighted margins.
- Profit by Category: Integrated category performance tracker aggregating revenue, COGS, profits, and margins per product department.
- High-Performance Printing & CSVs: Added professional flow document print layouts and Excel CSV exporters for all three profitability views.
- Report Center Category Section: Created and mapped a dedicated "Profitability" category sidebar tab to organize the new suite of reports.
Release v1.0.0 — Executive Insights Dashboard
Released 1 June 2026
- Landing View Dashboard: Created a beautiful, modern, executive landing dashboard for the Report Center displaying high-level key performance indicators (KPIs) in real time.
- Five Core KPI Metrics: Integrated real-time database calculations for Today's Sales, Today's Profit (revenue minus cost of goods sold), Low Stock Count, Outstanding Customer Debts, and Cash in Drawer (expected cashier register session balance).
- Top 10 Best-Sellers list: Implemented a live ranked product list tracking Today's Top 10 Best-Selling Products by Profit, displaying quantity sold, revenue generated, profit generated, and margin percentage.
- Real-Time Interactive Refreshes: Added manual "Refresh Data" functionality with modern animated overlays to retrieve the absolute latest figures instantly.
- Seamless Sidebar Integration: Configured the Report Center landing area to display the new Dashboard view by default while keeping transitions to detailed reports smooth.
Release v1.0.1 — Sales Drafts, Stock Column, & Best/Worst Sellers Export
Released 1 June 2026
- Auto-Clearing on Draft Save: Saving an invoice draft now resets and clears the sales interface automatically, allowing cashiers to immediately continue scanning items for other sales.
- Draft Recall / Retrieval: Enabled the 'Held Invoices' side button to display a visual overlay of all saved drafts, allowing cashiers to retrieve any active draft in one click and resume processing.
- Available Stock Column: Added a 'Stock' column to the sales creation items grid. This dynamically displays the available system stock (QuantityOnHand) for standard items and outputs '—' for service-based items.
- Best/Worst Sellers Export: Implemented separate 'Export CSV' buttons next to each grid header in the Best/Worst Sellers report page to export Best Sellers, Worst Sellers, and All Products to separate CSV files.
Release v1.0.2 — Quick Select Department Browser & Sidebar Cleanup
Released 1 June 2026
- Sidebar Cleanup: Removed non-functional button stubs ('Customer Details' and 'Apply Global Discount') from the left sidebar to present a clean, production-ready interface.
- ? Quick Select (Department Browser): Added a 'Quick Select' button to open a split-view overlay panel. Cashiers can browse items by department and easily add selected products to the sale grid.
- Live Department Search: Integrated a text search filter inside the Quick Select panel to narrow down items in the selected department instantly.
Release v1.0.3 — Practice Mode & Message Indicators Removal
Released 1 June 2026
- Removed Messages (2) and PRACTICE MODE: Cleaned up the global MainWindow bottom status bar, removing the mock "Messages (2)" link and the yellow "PRACTICE MODE" border to establish a clean, production-ready shell interface.
Release v1.0.4 — UI Shell Tweaks & Support Details Window
Released 1 June 2026
- Moved License under Help: Removed the standalone header link and relocated "License Activation" as a choice under a new dropdown-style ContextMenu on the "Help" link.
- Removed INPROGRESS Dropdown: Removed the mock "In Progress (0)" ComboBox from the top-right header panel.
- Contact & Support Dialog: Designed a modern custom popup window displaying full product support details, direct telephone/WhatsApp hyperlinks, email, and support web links.
Release v1.0.5 — Network Service Discovery, Windows Service & Client License Bypass
Released 1 June 2026
- Network Discovery Service: Added local UDP broadcast service discovery on port 19500 to automatically advertise Server database connection strings.
- Windows Service Integration: Configured the main executable to run as a standard Windows Service ("WeafPOS") when started with the `--service` command-line argument, hosting the discovery server persistently in the background.
- Active License Server Visibility: Discovery responder only advertises/responds on the Server machine if its local offline license is active.
- Till Client Skip Activation: Added auto-discovery sequence on startup to check for active Weaf POS servers on the local network; allows clients (Tills) to choose to connect directly to the discovered server, automatically bypassing local license registration.
Release v1.0.6 — Icon, Quick Pick on Purchases, Connection Caching, & Multi-User Mode Persistence
Released 1 June 2026
- No Background Console Terminal: Set build output type to WinExe to launch the WPF app directly without displaying a command prompt console window.
- Persistent Multi-User Mode: Stored server Multi-User configuration in dbconfig.json. The background Windows Service now remains active when the GUI is closed and auto-starts on system boot if configured.
- Till Client Connection Caching & Failover: Integrated a Connection Failure Troubleshooting dialog on clients with options to Retry, Scan Network (UDP discovery), Configure Manually, or Exit.
- Server Local Address Check: Added checks for local IP addresses and hostnames to prevent locking out the Server when it is configured with its own local LAN IP.
- Custom Application Icon: Set `logo.ico` from the `icon` folder as the application executable icon.
- Quick Pick on Purchases: Added the split-pane Quick Select department browser to the Receive Purchases view, allowing managers to quickly add products by department.
Release v1.0.7 — Obfuscar Reverse Engineering Protection
Released 1 June 2026
- Reverse Engineering Protection: Integrated Obfuscar NuGet package into the project to obfuscate output binaries on Release builds.
- Dynamic Reference Mapping: Configured obfuscar.xml with WindowsDesktop reference packs path for .NET 9.0 to successfully resolve XAML and core runtime dependencies.
- Build & Publish Automation: Automated the obfuscation process as a post-publish MSBuild target that replaces WeafPOS.dll in installer_files and cleans up WeafPOS.pdb symbols.
- Packaging Documentation: Created a readme.txt explaining the steps for publishing and packing.
Release v1.0.8 — Installer & Distribution Package
Released 1 June 2026
- Inno Setup Installer Script: Created installer.iss to package the application into a single distributable installer (WeafPOS_Setup_v1.0.exe).
- .NET 9.0 Bundled: Installer detects if Microsoft .NET Desktop Runtime 9.0 is missing and silently installs it as a mandatory prerequisite before the app.
- MariaDB Database Bundled: Installer bundles the MariaDB database server and conditionally installs it for Server Host machines if not already present.
- Client/Server Selection: Added a custom wizard page for the user to select their installation role: 'Client Till' or 'Server Host'.
- Conditional Database Install: If 'Server Host' is selected and no database is detected, the user is prompted to optionally install MariaDB alongside the application.
- Publisher Details: Configured official publisher as WEAF COMPANY UGANDA LIMITED with support URL https://weafpos.weafcompany.com.
Release v1.2.0 — Preferences Concurrency & Timezone Copyright Fix
Released 1 June 2026
- Preferences Concurrency Resolution: Eliminated the database optimistic concurrency exception (DbUpdateConcurrencyException) in PreferencesWindow by cleanly instantiating tracked models and copying scalar values during database sync rather than attaching WPF UI-bound objects directly.
- Customer Fields Sync Update: Updated Customer sync to properly persist and update all fields, including TIN number, customer type, balance, limits, and status.
- Dynamic Copyright Year: Reconfigured WeafPOS.csproj to dynamically compute the copyright year based on the build machine's local system timezone.
- EFRIS Schema & Column Verification: Patched DatabaseService startup routines to robustly verify and append Efris columns if not found, eliminating DB initialization startup failures.
Release v1.7 — EFRIS Invoice Query, HTML Emails & Bug Fixes
Released 7 June 2026
- EFRIS Invoice Receipt Query: Added a new full-featured 'Invoice Receipt Query' view under the Efris Report menu. Queries the /invoice-receipt-query endpoint with filters for Buyer Name, Invoice No, Start/End Date (DatePicker calendar), Invoice Kind, Is Invalid, Is Refund, and Page Size (All / 10 / 30 / 50 / 99). All unused filters send empty strings. Includes totals bar summing Gross Amount and Tax Amount for the current page, CSV export, and pagination.
- HTML Activation Emails: Rewrote the EFRIS activation email from plain text to a fully styled dark-theme HTML email matching the Weaf brand (indigo header, slate card, activation code highlighted). Added sender_name field ('Weaf Point of Sale') and 'Weaf Point of Sale Team' footer sign-off.
- Fix ILLink Trimming Crash: Replaced the anonymous object used in JsonSerializer.Serialize (EmailService) with Dictionary<string, string> to prevent parameter-name stripping by the .NET IL trimmer during publish.
- Fix taxRate JSON Deserialization: Changed ProductRecord.TaxRate from double to string in EfrisProductsView to match the API returning taxRate as a quoted string (e.g. "0.18"). TaxRateDisplay now parses with InvariantCulture before formatting.
- EFRIS Products Grid Cleanup: Removed 'Type' column, renamed 'Status' column to 'Tax Rule', and ensured the 'Name' column is fully visible with star width.