PluginProbe
WCPOS – Point of Sale (POS) plugin for WooCommerce / 1.10.3
WCPOS – Point of Sale (POS) plugin for WooCommerce v1.10.3
1.10.19 1.10.18 1.10.17 1.10.16 1.10.15 1.10.13 1.10.14 1.10.12 1.10.11 1.10.10 1.10.9 1.10.8 untagged-3d9b7ccddc54df87c672 1.10.7 1.10.6 1.10.5 1.10.3 1.10.4 1.10.2 1.10.1 1.10.0 1.9.17 1.9.15 1.9.16 1.9.14 All 163 releases
woocommerce-pos / CHANGELOG.md

CHANGELOG.md in WCPOS – Point of Sale (POS) plugin for WooCommerce 1.10.3, at CHANGELOG.md

160 lines 17.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 # WCPOS 1.8.15 — Changelog Draft
2
3 > **The biggest WCPOS release ever.** Almost three months of work, ~330 substantive PRs. Highlights below.
4
5 ## Unreleased
6
7 - Fixed: `wcpos/v2` product search matched product descriptions, a 1.10 regression from the 1.9 `wcpos/v1` title/SKU/barcode search, so stores where many descriptions mention a brand word saw fewer POS results than existed. It now searches title, SKU and barcode only, as before. (#1777)
8 - Fixed: deleting a product or coupon from the till permanently deleted it — the `wcpos/v2` push forwarded every catalogue delete as `force=true` and ignored the envelope's `force`. A delete without `force` now asks WooCommerce to trash the record and deletes permanently only where WooCommerce has no trash (categories, brands, tags, customers, variations); an explicit `force` is forwarded as sent. (#1741)
9 - **Breaking (developers):** `Init::remove_license_transient()` and its `pre_update_option_woocommerce_pos_pro_settings_license` hook are removed. The Pro licence option and both caches it cleared (`woocommerce_pos_pro_license_status` and `update_plugins`) belong to WCPOS Pro, which owns the licence Settings Section since wcpos/woocommerce-pos-pro#452 and now registers the handler itself (`Services\License_Cache`). A free-only install never had the option to watch, so nothing changes there; Pro installs run the bundled copy of this plugin and pick up both halves together.
10 - **Breaking (developers):** the `WCPOS\WooCommercePOS\API\Settings` REST controller is now an alias of `API\V1\Settings`, which serves every settings section through `get_section_settings()` / `update_section_settings()`. The per-section public methods (`get_general_settings()`, `update_access_settings()`, `get_general_endpoint_args()`, `remove_license_transient()`, …) are removed without compatibility wrappers; the REST routes and `woocommerce_pos_*` filters are unchanged, and the `Services\Settings` read API (`get_general_settings()`, `get_checkout_settings()`, …) is retained as supported public surface. Code that called or overrode the per-section controller methods must move to the section API; the licence-transient clear has moved out of this plugin entirely (see the `Init::remove_license_transient()` entry above).
11 - **Breaking (developers):** `Services\Settings::save_settings()` no longer persists settings ids that have no registered Settings Section. Previously any id fell through to a generic `woocommerce_pos_settings_{id}` option write carrying the `woocommerce_pos_pre_save_{id}_settings` filter and `woocommerce_pos_saved_{id}_settings` action; it now returns a `woocommerce_pos_settings_error` (HTTP 400) and writes nothing. Extensions that stored their own settings group this way must register it via the `woocommerce_pos_register_settings_sections` action — both hooks still fire for registered sections, under the same names. Reads are unaffected: `get_settings()` never resolved unregistered third-party ids.
12 - Added: anonymous analytics identifier (`wcpos_anon_id`) for the admin welcome screen — random UUID, no store data, deleted on uninstall, manageable via `wp wcpos anon-id rotate|delete`. Landing data contract `schema_version` bumped to 2.
13 - Added: `woocommerce_pos_consent_copy` filter so the tracking-consent prompt copy can be overridden.
14 - Added: `woocommerce_pos_get_anon_id()` accessor (used by the Pro licence-activation request).
15 - **Changed:** the till's customer list now includes every user on the site, not only those holding the `customer` role. Searching or browsing customers in WCPOS will now turn up administrators, shop managers, cashiers and any other user account. This is how the customer list has always behaved on the `wcpos/v2` sync lane and on the bulk-id pull the client syncs against — the older `wcpos/v1` list endpoint was the one place staff users were hidden, so the same search gave two different answers depending on which lane served it. Pass `role=customer` (or `roles[]=customer`) to narrow the list yourself.
16 - Fixed: with **Enable decimal quantities** on, every product save forced the stock status of non-stock-managed products back to "In stock" — a manually selected "Out of stock" or "On backorder" was reverted on wp-admin update (present since 1.5.0). WCPOS now leaves the manual stock status untouched when "Manage stock" is unchecked, matching WooCommerce. Note: POS checkout's out-of-stock validation now also applies to such manually-out-of-stock products on decimal-quantity stores, as it always did with the setting off.
17 - Fixed: the `roles` (multi-role) filter and `modified_after` were silently ignored on the `wcpos/v2` customer lane — both were forwarded to WooCommerce's own customer endpoint, which has neither parameter and drops unknown ones without complaint. A narrowed request came back unnarrowed, and a `modified_after` customer pull re-fetched the whole customer list every tick.
18
19 ### 🌐 REST CORS contract
20
21 - **Breaking (developers):** `API::rest_allowed_cors_headers()` and `API::rest_pre_serve_request()` are removed, along with `Init::rest_pre_serve_request()`. The WCPOS REST wire contract — CORS allow-list, expose-list, preflight and cache-defeating `Vary` — now has a single owner, `WCPOS\WooCommercePOS\Rest_Cors`, registered unconditionally. The `rest_exposed_cors_headers` and `rest_allowed_cors_headers` filters are unchanged and still the supported extension points; `Sync\Cors` keeps its method names and signatures.
22 - **Fixed:** the allow-list and expose-list were published by two independent handlers that had to be kept in step by hand, which had already caused three regressions (a missing `X-WCPOS-Store`, then `X-WCPOS-Idempotency-Key`). One writer now publishes both, so a header cannot be present on one path and absent from the other.
23 - **Changed:** WCPOS no longer stamps its CORS headers on preflight requests that are not destined for it. A cross-origin `OPTIONS` to another plugin's REST route now keeps WordPress core's own answer, where previously WCPOS claimed every preflight on the site.
24
25 ### 🖨️ Barcode printing fixes
26
27 - **Fixed:** thermal receipts now print the barcode symbology the template asks for. The ESC/POS and StarPRNT lanes ignored `<barcode type="…">` entirely and printed everything as Code 128 — so a template specifying EAN-13, UPC-A, ITF or Codabar produced a Code 128 barcode instead.
28 - **Fixed:** ESC/POS Code 128 barcodes were sent without the code-set selector Epson's `GS k` command requires. Genuine Epson hardware prints nothing at all in that case and reports no error; many clones auto-select, which is why this went unnoticed. Code 128 barcodes now carry the selector.
29 - **Fixed:** the ePOS-Print XML lane emitted `upca` / `upce`, which Epson's `<barcode>` element rejects. It now emits `upc_a` / `upc_e`.
30 - **Fixed:** the ePOS-Print XML lane now passes through symbologies Epson supports but WCPOS does not model itself — `jan13`, `jan8`, `code128_auto`, `gs1_128` and the `gs1_databar_*` family. A template asking for one of those previously reached the printer untouched; it must keep doing so rather than being folded to Code 128.
31 - **Fixed:** a `<barcode type="qr">` rendered noticeably smaller in the on-screen template preview than it printed. Preview and print now agree.
32 - **Changed:** if a barcode value does not satisfy the rules of the symbology it declares, thermal lanes now print the value as plain text instead of silently substituting a scannable Code 128. Merchants relying on the old fallback will see text where they previously got a barcode — the template's symbology or its value needs correcting. Values rejected include a non-numeric EAN-13, an odd-length ITF, an EAN/UPC value whose final check digit does not match the digits before it, a Code 39 value containing a `*` anywhere but as a matching first-and-last pair, and a Code 128 value too long to transmit once the printer's escaping has been applied.
33
34 - Fixed: thermal templates now handle out-of-range numeric attributes the same way in the live preview and on the server. An attribute outside the supported range is clamped to the nearest bound on both sides instead of one silently substituting the default — `<image width="5000">` renders at the 2000-dot maximum, `<size width="12">` at the 8x printer ceiling, and `<size width="-2">` / `<feed lines="0">` at 1 rather than disappearing from the preview. Fractional values such as `<feed lines="3.5">` now truncate to 3 instead of falling back to 1.
35
36 - Fixed: thermal templates now handle out-of-range numeric attributes the same way in the live preview and on the server. An attribute outside the supported range is clamped to the nearest bound on both sides instead of one silently substituting the default — `<image width="5000">` renders at the 2000-dot maximum, `<size width="12">` at the 8x printer ceiling, and `<size width="-2">` / `<feed lines="0">` at 1 rather than disappearing from the preview. Fractional values such as `<feed lines="3.5">` now truncate to 3 instead of falling back to 1. Every bound now also holds on the printer, not just in the preview: `<feed lines="500">` advances the 50-line maximum the preview has always shown rather than 500 lines of blank paper, and a fixed `<col>` wider than the paper no longer wraps onto a second printed line.
37
38 ---
39
40 ## 🧾 Receipt Templates — Complete Rebuild
41
42 This release introduces an entirely new receipt template system. It started in early March as a "receipt data + multi-engine rendering" foundation and grew into a full template platform.
43
44 - **New Template Gallery** with starter templates for every common use case — thermal (58mm, 80mm, narrow), A4 receipts, invoices, quotes, packing slips, gift receipts, kitchen tickets, and right-to-left languages (Arabic, Hebrew, Persian, Urdu).
45 - **New Template Editor** built on CodeMirror 6 with a field picker, live preview, paper-size + engine locking, and a Sample/Order preview pill toggle.
46 - **Multi-engine rendering** — HTML, Logicless (Mustache), PHP, and Thermal engines. Each template can declare which engine it uses; the active template is resolved per-store and per-order.
47 - **Receipt Data v1 contract** — a stable, branchable data shape that custom templates can rely on: refunds, transaction IDs, line tax labels, per-row meta, fiscal/refund context, customer notes, store address composed via `WC_Countries`, structured `store.tax_ids[]`, customer tax-id labels, localized `status_label`, and a render-time `order.printed` timestamp.
48 - **Store-aware presentation** — receipts now respect store currency, locale, timezone, tax display setting, price presentation, opening hours, and site logo, instead of falling back to global WooCommerce options.
49 - **Refund-aware totals** — refunded orders keep totals positive and add Refunded/Net rows so receipts stay readable.
50 - **Discounts as first-class data** — each coupon emits its own discount row, with `discounts[].code` as the canonical reference and `discounts[].label` taking the coupon description when available.
51 - **Tax-summary guard** so templates correctly distinguish tax-inclusive vs tax-exclusive stores, and summaries use real post-discount taxable bases instead of reverse-calculating from rounded tax.
52 - **Black-and-white safe printing** — light tints actually print, dark reverse-out fills removed, thermal receipts made 42-column-safe with star-column support.
53 - **PHP gallery catalogue registry** (#1035) replaces JSON tracking for shipped templates, keeping the gallery cleaner and easier to extend.
54 - **Template-management admin redesign** — unified Templates table with sidebar filters, drag-and-drop ordering, inactive-but-visible status, and a kebab menu replacing the old card "Settings" link.
55
56 ## 🪪 Customer & Store Tax IDs (new feature)
57
58 - **Customer tax IDs** end-to-end — reader, writer, REST exposure, persistence (#850, #863).
59 - **Store Tax IDs settings UI** with dedicated REST endpoints and country defaults (#851, #859, #872, #883).
60 - **Consolidation** — Tax IDs folded into General → Customers and into the Store Details block (#860, #924, #942).
61 - **Structured `store.tax_ids[]`** exposed on receipts with a derived `tax_id` scalar for legacy templates (#853, #874, #875).
62
63 ## 📈 Tracking Consent & Analytics (new feature)
64
65 - **GDPR-friendly consent prompt** with a two-tier landing page (#787, #788, #790, #792, #801, #804).
66 - **PostHog analytics foundation** with consent gating; session recording is explicitly disabled (#795, #799).
67 - **Reusable `@wcpos/consent` package** so the same consent flow can be embedded elsewhere (#822, #824, #829).
68 - **Landing Profile service** for personalized A/B testing (#781, #784, #797).
69 - **Upgrade-funnel instrumentation** (#798).
70
71 ## ⚙️ Settings Overhaul
72
73 - **General tab redesign** with a new Callout primitive (#864).
74 - **Store Details block** extracted with a Pro override slot (#868, #877, #1015).
75 - **General settings grouped** into Products and Customers sections (#733, #740).
76 - **Snackbar improvements** — pinned to viewport, aligned to content area (#867, #878).
77
78 ## 🧱 Shared UI Package (`@wcpos/ui`)
79
80 Many components extracted into a shared workspace package and reused across settings, templates, and consent:
81
82 - Button (with ghost-destructive variant, form primitives) (#782, #783, #802)
83 - Table (#879), Combobox (#880), searchable CountrySelect (#871)
84 - FormSection / FormRow with `headerRight` and divider props (#796, #800)
85 - Toggle hardened for hosts without Tailwind preflight (#841, #842, #843)
86 - Skeleton loading states (#703, #704)
87 - Filter sidebar with horizontal rule (#998)
88 - Shared `@wcpos/thermal-utils` workspace package (#730)
89
90 ## 🧩 Extensions Catalog
91
92 - **Redesigned cards** with body/footer layout, update badges, has-update flag, responsive grid, smaller buttons (#580, #778, #779, #780, #808, #809).
93 - **Auto-update field** exposed in the catalog (#566).
94 - **Extension settings and logs** now surface in POS admin (#821).
95
96 ## 📋 Sessions & Logs
97
98 - **Sessions page** redesigned as master/detail with a shared Avatar component (#826).
99 - **Logs page** redesigned with grouped-by-day view, copy boxes, and a new Chip primitive (#825).
100
101 ## 💳 Payments
102
103 - **Per-gateway order status settings** — Cash and Card gateways now have their own configurable post-checkout statuses (#564).
104 - **Refund support** added to POS Cash and Card gateways (#632).
105 - **POS payment gateway contract** — gateway catalog, bootstrap, and checkout coverage (#828, #830).
106
107 ## 🐞 Major Bug Fixes
108
109 ### POS order reliability
110 - Fixed `WC_Data_Exception` crash on misc product duplicate SKU (#573).
111 - Prevent line-item tax overrides from mutating products (#563).
112 - Cashier capabilities synced on plugin update, stripped on deactivation (#623, #768).
113 - POS capability checks added to checkout routes; cashier roles included in auth payloads (#624, #806).
114 - Cashier can now update orders with HPOS enabled (#662).
115 - New misc product meta fields handled: category, virtual, downloadable (#690).
116 - Variable-product empty sale prices filtered (#692).
117 - Optional stock restore when POS orders are deleted, with admin toggle (#701, #732).
118 - Line-item image IDs cast to integer in order responses (#756).
119 - Client-provided order creation date honored (#915).
120 - Historical store lookup works for trashed stores (#940).
121 - Receipt permission error code corrected (#1014).
122
123 ### Coupon calculations (multi-round WooCommerce interaction fixes)
124 - Strip coupon line IDs to prevent readonly errors on order update (#613).
125 - Deactivate subtotal filter before `calculate_totals()` (#674).
126 - Preserve subtotals during coupon recalculation (WC compound-tax bug) (#675, #677, #684).
127 - Use POS price directly as subtotal, remove fragile filter mechanism (#686).
128 - Clean up temporary cache entries after coupon validation (#693).
129 - Coupon include/exclude sync filters fixed (#840).
130 - Coupon REST API: shipped (#518), moved to Pro (#588), then restored as a standard controller (#766).
131
132 ### Auth & compatibility
133 - Prevent third-party JWT plugins from blocking WCPOS Bearer token auth (#744).
134 - Fix `require()` in IIFE bundle from Vite 8 CJS interop (#659, #664).
135 - Analytics tsconfig updated for TypeScript 6 (#708).
136
137 ### Memory & performance
138 - Log-spam memory exhaustion from i18n thundering herd resolved (#702).
139 - OPFS worker added for RxDB 17 storage migration (#739, #897).
140
141 ### Localization
142 - Translation write-location fallback and failure caching (#567).
143 - jsDelivr CDN trailing-slash redirect-loop fixed (#931).
144 - `TRANSLATION_VERSION` used for JS translation URLs (#707).
145 - `loadPath` interpolation conflict fixed (#729).
146 - Receipt dates and timestamps respect store timezone and locale (#666, #919, #937, #1029).
147 - Receipt gallery, template editor, Combobox, CountrySelect, and Skeleton strings all localized (#669, #681, #903, #925, #927).
148
149 ## 🔧 Behind the Scenes
150
151 - **CI/build** — root build script, simpler workflows, dynamic test matrix with RC/beta auto-detection, merge gate for bot PRs, hook-docs gh-pages deploy, release-draft idempotency, GitHub App tokens for POT and update-matrix automation, Dependabot auto-merge.
152 - **Dependencies** — Vite 8, TypeScript 6, RxDB 17, codecov-action 6, many action upgrades; pnpm supply-chain settings tightened.
153 - **Wiki** — moved to a `wcpos/wiki` submodule; deprecated `.kb/` folder removed (#759, #760).
154 - **Security**`TemplatesManager::save_raw_post_content` hardened with structural guards (#984).
155 - **Docs**`_woocommerce_pos_data` explainer, web bundle architecture KB article (#672, #753).
156
157 ---
158
159 **Stats:** 329 substantive PRs since v1.8.14, plus 60 routine translation/dependency-bot PRs folded into "Behind the Scenes".
160