Discount changelog

  1. 1.0.1

    Stable

    First public release of the Solidshop Discount & Coupons plugin (plg_solidshop_discount) — rule-based promotions on top of Solidshop's core discount engine. A 1.0.0 build was prepared but never published, so this entry is the baseline all later entries are deltas against.

    Conditions

    • AND/OR rule builder — a visual tree of rules and nested groups on the new Advanced Conditions tab, evaluated alongside the core minimum-cart-total and usage-limit conditions.
    • Seven condition types — Customer Group (Joomla user groups), Purchase History (first order, lifetime spend, has purchased a product), Product Category, Cart Quantity, SKU, SKU Quantity (units counted across the listed SKUs only), and Location (shipping address, falling back to billing; confirmed at checkout when entered on the cart page).
    • Incomplete rules never apply — a rule left without values (no customer groups, categories, SKUs or locations; Purchase History without a subtype; an unreadable rule tree) fails closed instead of matching every cart. An empty Advanced Conditions tab still means "no extra rules" and passes.

    Actions

    • Buy X get Y (BOGO) — every buy + get units form a group and the cheapest get units in each group are discounted by a percentage; count units from the whole cart or from a single product.
    • Fixed price per unit — sell the chosen products, variants or categories at one price; items already cheaper are left alone.
    • Tiered by cart total — a table of thresholds, each a percentage or fixed amount; the highest threshold the cart reaches wins, blank rows are skipped.
    • Free item — take the price of up to N units of a chosen product (or variant) off the order once the customer adds it to the cart. When the cart holds more units than the offer covers, the cheapest ones are the free ones.
    • Free-item shopper notices — an offer the shopper has qualified for but not collected is no longer invisible. The cart page shows "Add Product to your cart — it is free with this order" with a link to the product, and the product's own page shows "This item is free with your current order"; both disappear once the item is in the cart, because the discount then shows on the total instead. Qualification runs through the engine's resolveApplicable() — checkout's own definition of "qualifies" — and the cart re-renders its notices on every quantity change. The new Show Free Item Notice plugin option (default on) turns them off to apply the discount silently.
    • Shipping discount — a percentage of, or a fixed amount off, the shipping cost, never exceeding the cost of the rate the shopper picks. Checkout shows the original shipping cost struck through next to the reduced one; the order, confirmation email, account order page and invoice list it on a separate Shipping discount line. On the cart page a coupon whose only effect is a shipping discount is accepted and marked "Confirmed at checkout", the same treatment as a location-restricted code.
    • Product-level scope — percentage, fixed and tiered discounts can be limited to the cart items that match the SKU, SKU Quantity and Product Category rules instead of the whole subtotal. When those rules name targets but nothing in the cart matches them (the discount qualified through another branch of an OR group), the discount is zero rather than widening to the whole cart; a rule tree with no SKU or category targets keeps the full subtotal as the base.
    • Per-line allocation — Free item, BOGO and Fixed price implement the core LineAllocatingActionInterface (core 1.3.2): each reports exactly which cart lines its discount belongs to (the free item's own line, the cheapest units' lines, the repriced line), so tax is removed from those lines and a product made free carries no tax. Tiered stays a cart-total scalar and is prorated by the engine.
    • Each action type has its own settings on the core Action tab; the core Action value field hides for the types that do not use it.

    Stacking

    • Exclusive Discount — a per-discount flag that makes it the only discount applied to the order; among several qualifying exclusive discounts the highest priority wins.
    • Maximum Discounts Per Order — a plugin option capping how many discounts apply to one order, highest priority first.

    Bulk coupon codes

    • Bulk Generate Codes tab on saved coupon-code discounts — up to 500 codes per run, optional prefix plus eight random characters, each a standalone discount carrying a copy of the template's conditions, action, rule tree, exclusive flag and usage limits. Copy all or download as a one-column CSV. Requires the Create permission on Solidshop.

    Lifecycle

    • Safe uninstall — the plugin drops only its own table; conditions and actions stay in Solidshop's core tables, and every discount that depends on a plugin handler is unpublished rather than left published and inert.
    • Disabled plugin — core 1.3.2 fails closed on a condition it has no handler for, so a rule-builder discount never applies unconditionally while the plugin is off; saving such a discount leaves its plugin-owned action row untouched.

    Requirements

    • Joomla 6.0+, PHP 8.4+, and Solidshop 1.3.2 or later — enforced at install time. 1.3.2 is the core that stores the action-type settings above (an older core would drop them on save) and that records a shipping-only discount on the order, which the Shipping discount action needs to validate as a coupon and survive into the saved order.
    • 23 admin locales bundled.