Rollora – Made-to-Measure Roller Blinds

Description

Rollora – Made-to-Measure Roller Blinds adds a roller-blinds-only configurator to a WooCommerce store. Customers enter width and drop in millimetres, choose recess, exact, or outside-mount fit, and select fabric, corner fit, control side, bracket, and options. Prices are calculated server-side from the active supplier configuration; a browser-submitted price is never used. Money is handled in integer minor units and measurements are stored in millimetres internally.

When an order is placed, the per-blind measurements, per-blind price, fabric, options, rule version, and data label are frozen in an immutable order snapshot. Quantity and line total are finalised at order creation from the order item, and the workshop production sheet is generated from that saved snapshot, never from recalculated current prices. Per-order fees stay order-level and are shown on the sheet as their own row, not folded into the line total.

Supplier pricing is managed through price books: upload a flattened band-row CSV, preview staged rows with row-level errors and a diff against the active book, then approve. Promotion requires zero errors, zero unmapped rows, and an explicit approval click, and the approver is recorded. Exactly one price book is active at a time in the free edition, and activating a book supersedes the previous one. History and rollback are built in.

IMPORTANT: the plugin ships with synthetic supplier defaults, clearly labelled SYNTHETIC. They are placeholder values, not real supplier rules. Replace them with your own supplier configuration before taking real orders, and do not use the synthetic defaults for real orders. Workshop sheets carry the data label of the configuration they came from; sheets from synthetic data say so, and sheets from other data say to use them only if approved for production. The workshop sheet is not production-approved, and 36 additional manufacturing fields remain unconfirmed.

Compatibility is claimed only for versions actually tested: WordPress 7.1.4, WooCommerce 11.2.1, and PHP 8.3.6. WordPress 6.4, WooCommerce 9.x, and PHP 8.2 are NOT claimed and are NOT supported by this release.

Configuration

Supplier Settings (Rollora > Supplier Settings): deductions, mechanism allowance, size limits, roll widths by fabric, recess depth minimum, tolerance, fabrics, and options. Saving stamps config_version (incremented), updated_by, and updated_at. « Restore synthetic defaults » reloads the bundled defaults. The price matrix and bands are edited through the CSV importer, not here, and are preserved on save.

Price Books (Rollora > Price Books): a 3-step controlled import. Step 1 uploads a CSV of flattened band rows only. Step 2 previews staged rows, row-level errors, and the diff against the active book. Step 3 approves: promotion requires zero errors, zero unmapped rows, and an explicit approval click. An active book’s mapped rows replace the covered matrix cells. Price books apply to matrix pricing only; per-m2 mode is unaffected by price books. History and rollback: the same page lists every price book (newest first) with its status, source, row count, and activation record; any superseded book has a « Roll back to this book » button (nonce-checked, with confirmation) that reactivates it and supersedes the current active book.

Import preview (Rollora > Import Preview): a preview-only page that shows staging, diff, and row-level errors. It does not promote anything.

Data label: the configuration carries a data label. The bundled defaults are labelled SYNTHETIC. When you enter your real supplier rules, set the label accordingly; snapshots and workshop sheets then carry that label.

Features

  • Roller-blinds-only configurator: width, drop, recess/exact/outside fit, fabric, corner fit, control side, bracket, options
  • Server-side pricing only: matrix, bands, per-m2, fabric groups, surcharges
  • Tax-exclusive engine prices; WooCommerce calculates applicable taxes
  • Admin supplier settings with version stamps and restore-defaults
  • Price books: CSV preview, diff vs the active book, approval-gated promotion, single active book in free, history and rollback
  • Immutable order snapshots: per-blind measurements, price, fabric, options, rule version, and data label frozen at add-to-cart; quantity and line total finalised at order creation
  • Workshop production sheet from the saved order snapshot, with guest access restricted
  • Currency table with a zero-decimal guard, so zero-decimal currencies are not divided by 100
  • HPOS-compatible order storage using WooCommerce CRUD only; no tables created
  • No licence-key checks, network calls, or subscription logic in the free edition
  • Security: nonces and manage_options / manage_woocommerce capability checks on admin and workshop pages, uploaded files checked with is_uploaded_file, all admin output escaped, no direct order-table queries, no AJAX or REST endpoints in plugin code, and the configurator product ID bound by a server-salt token so a visitor cannot reprice an arbitrary store product as a blind

Requirements

  • WordPress 7.1 or higher (tested up to 7.1.4)
  • WooCommerce 11.2 or higher (tested up to 11.2.1)
  • PHP 8.3 or higher (tested on 8.3.6)
  • A WooCommerce product for each roller blind sold through the configurator

WordPress 6.4, WooCommerce 9.x, and PHP 8.2 are NOT claimed and are NOT supported by this release.

Support

For help with this plugin, use the plugin’s support forum on WordPress.org. When reporting an issue, include your WordPress, WooCommerce, and PHP versions, the steps to reproduce the problem, and whether you are using the bundled synthetic defaults or your own supplier configuration. Do not post private order details, customer data, or credentials in the forum.

Please note: this plugin ships with synthetic supplier defaults labelled SYNTHETIC. Before taking real orders, replace them with your real supplier rules and confirm your workshop sheets against those rules, as the sheets are not production-approved.

Captures d’écrans

Installation

  1. Install the plugin ZIP via WordPress Admin > Plugins > Add New > Upload Plugin, then activate it. Activation seeds the supplier configuration from the synthetic defaults and records plugin version 1.0.1. It never overwrites an existing admin configuration.
  2. Create a simple WooCommerce product for a roller blind and note its ID.
  3. Add [blinds_roller_configurator product_id="123"] to a page, replacing 123 with your product ID.
  4. Add [blinds_workshop_sheet order_id="123"] to an admin page for workshop sheets, replacing 123 with an order ID. Guests see only « Workshop sheet unavailable. »
  5. Replace the synthetic supplier defaults with your real supplier rules before taking real orders (see Configuration).

FAQ

What are the synthetic defaults, and must I replace them?

Yes. The plugin ships with synthetic supplier defaults, clearly labelled SYNTHETIC, so it works out of the box for evaluation. They are placeholder values, not real supplier rules. Replace them with your own supplier configuration in Rollora > Supplier Settings and Rollora > Price Books before taking real orders. Do not use the synthetic defaults for real orders.

How do price books work?

Upload a flattened band-row CSV in Rollora > Price Books, preview staged rows, row-level errors, and the diff against the active book, then approve. Promotion requires zero errors, zero unmapped rows, and an explicit approval click, and the approver is recorded. Exactly one book is active at a time in the free edition; activating a book supersedes the previous one. To roll back, use the « Roll back to this book » button next to any superseded book in the Price-book history table on the same page; the rolled-back book becomes active and the current active book becomes superseded. Price books apply to matrix pricing only.

What CSV format does the importer accept?

Flattened band rows only. XLSX files, 2D matrix grids, per-m2 imports, and universal imports are not supported; convert XLSX to CSV first. Decimal prices are rejected because prices use integer minor units. Open-ended top bands cannot be imported as-is, and importer overlap grouping ignores option_code.

Does the plugin work with HPOS?

Yes. HPOS on and off were both tested in staging (WordPress 7.1.4, WooCommerce 11.2.1). Order data is stored through WooCommerce CRUD only, and the plugin creates no tables.

How are taxes handled, including CAD and GBP?

Engine prices are tax-exclusive and WooCommerce calculates applicable taxes. In staging, a £38.50 blind checked out at CAD 43.13 in British Columbia (GST 5% plus PST 7%) and CAD 43.51 in Ontario (HST 13%), and GBP pricing was restored and re-verified at £38.50 afterwards. Currency display uses a per-currency table, so zero-decimal currencies are not divided by 100.

What is included free, and what is premium?

Free: single supplier configuration, configurator, matrix/bands/per-m2 pricing, server-side pricing, snapshot, workshop sheet, CSV preview with controlled promotion, and price-book history/rollback. Premium-only features are declared but not implemented in this edition: multiple supplier configurations, per-product supplier selection, and multi-site licence sharing. The free edition contains no licence-key checks, network calls, or subscription logic.

Who can see a workshop sheet?

Only users with the manage_woocommerce capability. Guests and customers see only « Workshop sheet unavailable. » The sheet reads the saved order snapshot, never recalculated current prices, so it matches the order line. If a price book is activated or the configuration edited between add-to-cart and checkout, the snapshot is refreshed from the recalculated result before the order is created.

What happens when I deactivate or uninstall the plugin?

Deactivation deletes nothing. Uninstall deletes only the plugin’s own four options (blinds_supplier_config, blinds_price_books, blinds_plugin_version, blinds_premium_active). Past order snapshots remain with their orders, as store records should.

What is NOT supported?

Anything other than made-to-measure roller blinds; XLSX, 2D grids, and per-m2 imports; decimal prices in imports; open-ended top bands as-is; WordPress 6.4, WooCommerce 9.x, and PHP 8.2; real supplier sheets, retailer feedback, or manufacturing approval (none has been obtained); and production use of the synthetic defaults or of a workshop sheet that has not been approved for production.

Avis

Il n’y a aucun avis pour cette extension.

Contributeurs/contributrices & développeurs/développeuses

« Rollora – Made-to-Measure Roller Blinds » est un logiciel libre. Les personnes suivantes ont contribué à cette extension.

Contributeurs

Journal des modifications

1.0.1 — 2026-11-06

  • Fixed: the « Active price book » line on the Price Books admin page showed the previously active book on the approval response after activating a new price book, while the success notice and the history table already showed the newly activated book. The line is now rendered after the approve/rollback handlers run, so it always names the book that is active now. No pricing, measurement, activation, or other behaviour changed.

1.0.0 — 2026-11-02

  • Roller-blinds-only configurator: width, drop, recess/exact/outside fit, fabric, corner fit, control side, bracket, options.
  • Server-side pricing only: matrix, bands, per-m2, fabric groups, surcharges. Engine prices are tax-exclusive; WooCommerce calculates applicable taxes. Money in integer minor units, measurements in mm.
  • Admin supplier settings with version stamps (config_version, updated_by, updated_at) and restore-synthetic-defaults.
  • Price books: CSV preview, diff vs the active book, approval-gated promotion (zero errors, zero unmapped rows, explicit approval click), single active book in free, history/rollback.
  • Immutable order snapshots: per-blind measurements, price, fabric, options, rule version, and data label immutable from add-to-cart; quantity and line total finalised at order creation.
  • Workshop production sheet from the saved order snapshot, never recalculated current prices; guests see only « Workshop sheet unavailable. »
  • Currency table with zero-decimal guard; free/premium entitlement boundary.
  • Activation/deactivation/uninstall handling; no tables created.
  • Per-order-fee fix: the engine total includes per-order surcharges, but the WooCommerce order line total does not, so finalisation subtracts the per-order fee before dividing (recorded as finalisation_fee_excluded_minor); the workshop sheet shows the fee as its own row. Staging verified: motor plus remote, quantity 1 to 2, line £247.00 plus £15.00 fee once = £262.00 total.
  • Release-candidate fixes: configurator product ID bound by a server-salt token, closing an unauthenticated price override; non-array options input guarded; data label flows from the effective configuration through the engine and checkout hook; totals hook refreshes the stored snapshot from the recalculated result; admin preview dumps scroll on narrow screens; admin inputs are 16px; header floors raised to the tested versions.
  • Tests and staging (executed, WordPress 7.1.4 / WooCommerce 11.2.1 / PHP 8.3.6): pure-PHP regression suite 108/108 PASS on PHP 8.3.6; classic checkout £38.50; Blocks/Store API checkout £38.50 and £77.00 (quantity-change case); HPOS on and off; workshop sheets with guest restriction; admin save and restore; price-book activation (£40.00) and rollback (£38.50); CAD British Columbia CAD 43.13 and Ontario CAD 43.51; GBP restored at £38.50.
  • Known limitations: synthetic supplier defaults only; tested on WordPress 7.1.4 / WooCommerce 11.2.1 / PHP 8.3.6 only; visual responsive check in a live browser not verified; CSV flattened band rows only; price books apply to matrix pricing only; workshop sheet is not production-approved and 36 manufacturing fields remain unconfirmed.