PHPackages                             orangecat/module-quickorder - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. orangecat/module-quickorder

ActiveMagento2-module[Utility &amp; Helpers](/categories/utility)

orangecat/module-quickorder
===========================

Bulk add-to-cart by SKU for Magento 2 B2B — search, paste, or upload a CSV to fill the cart in one shot

0.0.2(2d ago)02↑2900%OSL-3.0HTMLPHP &gt;=8.1

Since Jun 5Pushed 2d agoCompare

[ Source](https://github.com/olivertar/m2_quickorder)[ Packagist](https://packagist.org/packages/orangecat/module-quickorder)[ RSS](/packages/orangecat-module-quickorder/feed)WikiDiscussions main Synced 2d ago

READMEChangelog (2)Dependencies (1)Versions (3)Used By (0)

Orangecat\_QuickOrder
=====================

[](#orangecat_quickorder)

Bulk add-to-cart by SKU — search, paste, or upload a CSV to fill the cart in one shot.

**Module:** `Orangecat_QuickOrder`**Version:** 1.0.0 **License:** OSL-3.0 **Author:** Oliverio Gombert

---

Table of Contents
-----------------

[](#table-of-contents)

1. [Overview](#overview)
2. [Theme Compatibility](#theme-compatibility)
3. [Requirements](#requirements)
4. [Installation](#installation)
5. [What Gets Installed](#what-gets-installed)
6. [Configuration](#configuration)
7. [Store Admin Guide](#store-admin-guide)
8. [Buyer Guide (Frontend)](#buyer-guide-frontend)
9. [Developer Guide](#developer-guide)
10. [REST API](#rest-api)
11. [Frontend Routes Reference](#frontend-routes-reference)
12. [DevOps &amp; Integrator Notes](#devops--integrator-notes)

---

Overview
--------

[](#overview)

`Orangecat_QuickOrder` gives logged-in customers a dedicated page to build and submit large orders without browsing the catalog. Three input methods are available in parallel on the same page:

- **Live search** — type at least 3 characters to search by SKU or product name; results appear in a dropdown with price and type badge.
- **Bulk SKU textarea** — paste a comma- or newline-separated list of SKUs; the module resolves each SKU to a product and adds it to the staging list.
- **CSV upload** — upload a file with `SKU,Qty` rows; header row is auto-detected and skipped.

All resolved products land in an editable staging table where the buyer can adjust quantities, select configurable options, and remove individual rows before sending everything to the cart in one request.

### Position in the Orangecat B2B Dependency Chain

[](#position-in-the-orangecat-b2b-dependency-chain)

```
Orangecat_Core (via composer: orangecat/core)
  └── Orangecat_Company
        └── ...

Orangecat_QuickOrder    ← this module (standalone, no inter-module dependency)

```

`Orangecat_QuickOrder` is independent — it does not depend on `Orangecat_Company` or any other Orangecat module. It integrates with core Magento catalog, checkout, and customer modules only.

---

Theme Compatibility
-------------------

[](#theme-compatibility)

ThemeStatusNotes**Luma**Supported`quickorder.phtml` + RequireJS AMD widget `quick-order.js`. LESS styles in `web/css/source/_module.less`.**Hyvä**Supported`quickorder_hyva.phtml` with inline Alpine.js `initQuickOrder()` component. CSS utilities in `web/css/hyva/module.css`. Layout handle `hyva_quickorder_index_index.xml` swaps the template and loads the Hyvä CSS.**Breeze Evolution**SupportedUses the same Luma template (`quickorder.phtml`). The JS widget is registered in `breeze_default.xml` as a Breeze bundle item. LESS styles in `web/css/breeze/_default.less`.Each theme uses its own layout handle. The Hyvä template is at `view/frontend/templates/quickorder_hyva.phtml` — not in a `view/hyva/` subdirectory, following this project's convention.

---

Requirements
------------

[](#requirements)

DependencyVersion / NotesMagento 22.4.xPHP&gt;= 8.1`magento/module-customer`Bundled with Magento`magento/module-catalog`Bundled with Magento`magento/module-checkout`Bundled with Magento`magento/module-configurable-product`Bundled with Magento (required for configurable option resolution)`magento/module-config`Bundled with Magento`magento/module-store`Bundled with MagentoNo dependency on `orangecat/core` or any other Orangecat module.

---

Installation
------------

[](#installation)

### Via Git Submodule (recommended for this project)

[](#via-git-submodule-recommended-for-this-project)

```
# From repo root
git submodule add git@github.com:olivertar/m2_quickorder.git app/code/Orangecat/QuickOrder
git submodule update --init --recursive
```

### Enable the Module

[](#enable-the-module)

Run inside the PHP container (`reward shell`):

```
bin/magento module:enable Orangecat_QuickOrder
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento setup:static-content:deploy -f
bin/magento cache:flush
```

---

What Gets Installed
-------------------

[](#what-gets-installed)

- **No database tables** — this module creates no schema changes.
- **No EAV attributes** — no customer or product attributes are added.
- **No data patches** — no default records, CMS pages, or roles are created.

`setup:upgrade` only registers the module version in `setup_module`. All module state lives in `core_config_data` (the enabled/disabled flag).

---

Configuration
-------------

[](#configuration)

**Path:** `Stores > Configuration > Orangecat > Quick Order`

### General

[](#general)

LabelConfig pathDefaultDescriptionEnable Quick Order`orangecat_quickorder/general/enabled`YesMaster switch. When disabled, the frontend page returns 404 and all AJAX endpoints return empty/error responses. The account navigation link is also hidden (via `ifconfig`).```
orangecat_quickorder/general/enabled

```

Scope: Default / Website / Store View.

---

Store Admin Guide
-----------------

[](#store-admin-guide)

### Enabling / Disabling

[](#enabling--disabling)

1. Go to **Stores &gt; Configuration &gt; Orangecat &gt; Quick Order**.
2. Set **Enable Quick Order** to **Yes** or **No**.
3. Save and flush cache.

No other admin configuration or UI exists. The module has no admin grids, order management screens, or report panels — it is a pure frontend feature.

### Verifying the Link Appears

[](#verifying-the-link-appears)

After enabling, logged-in customers should see a **Quick Order** link in the **My Account** sidebar. If the link is missing, confirm `orangecat_quickorder/general/enabled` is `1` for the active store view and that static content has been deployed.

---

Buyer Guide (Frontend)
----------------------

[](#buyer-guide-frontend)

### Accessing Quick Order

[](#accessing-quick-order)

Direct URL: `https://your-store.test/quickorder`

The **Quick Order** link appears in the **My Account** sidebar navigation for all logged-in customers. Guests are redirected to the login page. When the module is disabled, the page returns a 404.

---

### Step 1 — Add Products to Your List

[](#step-1--add-products-to-your-list)

Three methods are available on the same page:

#### Search by SKU or Name

[](#search-by-sku-or-name)

1. Type at least 3 characters in the **Search Products** input.
2. A dropdown appears with matching results showing product name, SKU, price, and type.
3. Click a result to add it to the staging list.

For **configurable products**, the row will show option selectors (e.g. Color, Size) that must be completed before adding to cart.

#### Bulk SKU Input

[](#bulk-sku-input)

1. Paste SKUs into the **Bulk SKU Input** textarea, separated by commas or new lines.
2. Click **Add to List**.
3. Each valid SKU resolves to a product row. Invalid or not-found SKUs are reported as errors below the action area.

> Only **simple** products are supported via bulk input. Configurable, bundle, and grouped products are skipped with an explanatory message.

#### CSV Upload

[](#csv-upload)

1. Prepare a CSV file:

```
SKU,Qty
PROD-001,5
PROD-002,2
SIMPLE-ABC,10
```

A header row (`SKU,Qty`) is optional — if the first cell is literally `sku` (case-insensitive) it is skipped.

2. Click **Choose File**, select the CSV, then click **Upload CSV**.
3. Valid rows appear in the staging list; invalid SKUs are reported as errors.

> Same restriction as bulk input: only simple products are accepted from CSV.

---

### Step 2 — Review and Adjust

[](#step-2--review-and-adjust)

The **Your Selection** table shows all staged products:

ColumnEditableNotesProductNoProduct nameSKUNoProduct SKUOptionsYesDropdowns for configurable attributes; N/A for simplePriceNoFormatted product priceQtyYesNumeric input, minimum 1Actions—× button removes the rowUse **Clear All** to empty the entire list.

---

### Step 3 — Add All to Cart

[](#step-3--add-all-to-cart)

Click **Add all to Cart**. The module validates that all configurable options are selected before submitting. On success:

- All items are added to the active cart in one request.
- The mini-cart refreshes automatically.
- The staging list clears.

On partial failure (e.g. out-of-stock item), the server returns an error message and no items are added.

---

Developer Guide
---------------

[](#developer-guide)

### Module Structure

[](#module-structure)

```
Orangecat/QuickOrder/
├── Controller/
│   ├── Index/
│   │   └── Index.php              — GET /quickorder (page; login + enabled check)
│   └── Ajax/
│       ├── Search.php             — POST /quickorder/ajax/search
│       ├── BulkSku.php            — POST /quickorder/ajax/bulksku
│       ├── Upload.php             — POST /quickorder/ajax/upload
│       └── AddToCart.php          — POST /quickorder/ajax/addtocart
├── Helper/
│   └── Data.php                   — isEnabled() helper (legacy; use Model/Config)
├── Model/
│   └── Config.php                 — isEnabled() via ScopeConfigInterface
├── etc/
│   ├── module.xml                 — sequence: Customer, Catalog, Checkout
│   ├── acl.xml                    — Orangecat_QuickOrder::config
│   ├── config.xml                 — default enabled = 1
│   ├── frontend/routes.xml        — frontName: quickorder
│   └── adminhtml/system.xml       — Enable Quick Order field
├── registration.php
└── view/frontend/
    ├── layout/
    │   ├── quickorder_index_index.xml      — Luma page (2columns-left)
    │   ├── hyva_quickorder_index_index.xml — Hyvä: swaps template + loads CSS
    │   ├── customer_account.xml            — sidebar nav link (all themes)
    │   └── breeze_default.xml              — Breeze JS bundle registration
    ├── templates/
    │   ├── quickorder.phtml        — Luma/Breeze template (data-mage-init)
    │   └── quickorder_hyva.phtml   — Hyvä template (Alpine.js initQuickOrder())
    └── web/
        ├── js/quick-order.js       — Luma/Breeze RequireJS AMD widget
        ├── css/source/_module.less — Luma LESS styles
        ├── css/breeze/_default.less — Breeze LESS styles
        └── css/hyva/module.css     — Hyvä CSS utilities (z-index, animation, etc.)

```

### Key Classes

[](#key-classes)

#### `Orangecat\QuickOrder\Model\Config`

[](#orangecatquickordermodelconfig)

Primary config reader. Inject via constructor.

```
isEnabled(): bool   // reads orangecat_quickorder/general/enabled, store scope
```

#### `Orangecat\QuickOrder\Helper\Data`

[](#orangecatquickorderhelperdata)

Extends `AbstractHelper`. Provides the same `isEnabled()` check. Kept for compatibility; prefer `Model\Config` in new code.

### Controllers

[](#controllers)

All AJAX controllers implement `HttpPostActionInterface` and return `JsonFactory` responses.

ClassMethodRouteKey behavior`Controller\Index\Index``execute()``GET /quickorder`Redirects to 404 if disabled; redirects to login if not logged in`Controller\Ajax\Search``execute()``POST /quickorder/ajax/search``query` param (min 3 chars); searches SKU and name; returns max 10 results with configurable options array`Controller\Ajax\BulkSku``execute()``POST /quickorder/ajax/bulksku``skus` param; splits on comma/newline; resolves via `ProductRepositoryInterface`; simple products only`Controller\Ajax\Upload``execute()``POST /quickorder/ajax/upload``csv_file` multipart; parsed with `Magento\Framework\File\Csv`; auto-detects header row; simple products only`Controller\Ajax\AddToCart``execute()``POST /quickorder/ajax/addtocart``items` JSON param; adds each item via `Magento\Checkout\Model\Cart`; supports `super_attribute` for configurables### Search Response Shape

[](#search-response-shape)

```
{
  "items": [
    {
      "id": 42,
      "name": "Blue Widget",
      "sku": "BW-001",
      "price": "$19.99",
      "type": "simple",
      "options": []
    },
    {
      "id": 55,
      "name": "T-Shirt",
      "sku": "TS-XL",
      "price": "$29.00",
      "type": "configurable",
      "options": [
        {
          "id": "93",
          "label": "Color",
          "code": "color",
          "values": [
            { "value": "56", "label": "Blue" },
            { "value": "57", "label": "Red" }
          ]
        }
      ]
    }
  ]
}
```

### AddToCart Request Shape

[](#addtocart-request-shape)

```
POST /quickorder/ajax/addtocart
Content-Type: application/x-www-form-urlencoded

items=%5B%7B%22id%22%3A42%2C%22qty%22%3A3%2C%22super_attribute%22%3A%7B%7D%7D%5D&form_key=abc123

```

Decoded `items` value:

```
[
  { "id": 42, "qty": 3, "super_attribute": {} },
  { "id": 55, "qty": 1, "super_attribute": { "93": "56" } }
]
```

### Observers

[](#observers)

This module registers no observers.

### Plugins

[](#plugins)

This module registers no plugins.

### JS Components

[](#js-components)

#### Frontend — Luma / Breeze

[](#frontend--luma--breeze)

FileTypeDescription`web/js/quick-order.js`RequireJS AMD widgetManages all UI state: search debounce (300 ms), result rendering, staging list, qty/option change handlers, CSV upload, bulk SKU, add-to-cart with mini-cart invalidation via `Magento_Customer/js/customer-data`Initialized via `data-mage-init` in `quickorder.phtml`:

```
{
  "Orangecat_QuickOrder/js/quick-order": {
    "searchUrl": "...",
    "uploadUrl": "...",
    "bulkSkuUrl": "...",
    "addToCartUrl": "...",
    "formKey": "..."
  }
}
```

#### Frontend — Hyvä

[](#frontend--hyvä)

FileTypeDescription`quickorder_hyva.phtml`Inline Alpine.js`initQuickOrder()` function returns Alpine data object with `handleSearch`, `handleBulkSku`, `handleUpload`, `handleAddToCart`, `selectProduct`, `removeItem`, `clearList`. Uses `hyva.getFormKey()` and `window.dispatchMessages` for notifications. Cart refresh via `CustomEvent('reload-customer-section-data')`.### Email Templates

[](#email-templates)

This module sends no transactional emails.

### ACL Resources

[](#acl-resources)

Resource IDTitleLocation`Orangecat_QuickOrder::config`Orangecat Quick Order ConfigurationStores &gt; Settings &gt; Configuration### Adding Custom Logic

[](#adding-custom-logic)

- **Disable for specific customer groups**: add a plugin on `Controller\Index\Index::execute()` or `Model\Config::isEnabled()` that checks the customer session's group ID.
- **Extend search results**: add a plugin on `Controller\Ajax\Search::execute()` to filter or enrich the `$items` array before the JSON response is built.
- **Post-add-to-cart hook**: observe `checkout_cart_product_add_after` to trigger custom logic (logging, price override) after each product is added by the Quick Order flow.

---

REST API
--------

[](#rest-api)

This module exposes no REST API endpoints. There is no `etc/webapi.xml`.

---

Frontend Routes Reference
-------------------------

[](#frontend-routes-reference)

RouteControllerAccess`GET /quickorder``Controller\Index\Index`Logged-in customers; 404 if disabled`POST /quickorder/ajax/search``Controller\Ajax\Search`Any (enabled check only)`POST /quickorder/ajax/bulksku``Controller\Ajax\BulkSku`Any (enabled check only)`POST /quickorder/ajax/upload``Controller\Ajax\Upload`Any (enabled check only)`POST /quickorder/ajax/addtocart``Controller\Ajax\AddToCart`Any (enabled check only)The AJAX endpoints do not enforce an active customer session — they rely on the form key for CSRF protection and check the enabled flag. Add a customer-session guard in a plugin if stricter access control is required.

---

DevOps &amp; Integrator Notes
-----------------------------

[](#devops--integrator-notes)

### Deployment Checklist

[](#deployment-checklist)

```
bin/magento module:enable Orangecat_QuickOrder
bin/magento setup:upgrade          # registers module version only (no schema changes)
bin/magento setup:di:compile
bin/magento setup:static-content:deploy -f
bin/magento cache:flush
```

### Integration Token Scope

[](#integration-token-scope)

No REST API. No integration token permissions required for this module.

### Disabling Without Uninstalling

[](#disabling-without-uninstalling)

```
bin/magento module:disable Orangecat_QuickOrder
bin/magento setup:upgrade
bin/magento cache:flush
```

No dependent Orangecat modules — safe to disable at any time without cascade effects.

### Data Integrity

[](#data-integrity)

- No database tables are created or modified by this module.
- The only persisted state is `core_config_data` rows for `orangecat_quickorder/*`.
- Disabling the module leaves those rows in place; re-enabling restores prior settings.
- No cart data is stored by this module — items written to the cart follow standard Magento quote lifecycle.

###  Health Score

37

—

LowBetter than 81% of packages

Maintenance100

Actively maintained with recent releases

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity33

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

2

Last Release

2d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/959440?v=4)[Oliverio Gombert](/maintainers/olivertar)[@olivertar](https://github.com/olivertar)

---

Top Contributors

[![olivertar](https://avatars.githubusercontent.com/u/959440?v=4)](https://github.com/olivertar "olivertar (13 commits)")

---

Tags

b2bmagento2orangecatquickorder

### Embed Badge

![Health badge](/badges/orangecat-module-quickorder/health.svg)

```
[![Health](https://phpackages.com/badges/orangecat-module-quickorder/health.svg)](https://phpackages.com/packages/orangecat-module-quickorder)
```

###  Alternatives

[magepal/magento2-googletagmanager

Google Tag Manager (GTM) for Magento 2 with Advance Data Layer

2671.6M5](/packages/magepal-magento2-googletagmanager)[run-as-root/magento2-prometheus-exporter

Magento2 Prometheus Exporter

68353.9k](/packages/run-as-root-magento2-prometheus-exporter)[magepal/magento2-reindex

Reindex your Magento2 store quickly and easily from backend/admin, instead of command line.

112688.4k1](/packages/magepal-magento2-reindex)[lillik/magento2-price-decimal

Magento 2 Price Decimal Precision

113148.3k](/packages/lillik-magento2-price-decimal)[myparcelnl/magento

A Magento 2 module that creates MyParcel labels

1859.0k](/packages/myparcelnl-magento)[magepal/magento2-preview-checkout-success-page

Quickly and easily preview and test your Magento2 checkout success page, without placing a new order each time

7792.8k](/packages/magepal-magento2-preview-checkout-success-page)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
