Налаштування мультисклада OpenCart
Мультисклад в OpenCart дозволяє розділити товарні запаси за кількома фізичними або логічними пунктами зберігання — офіс, склад поставщика, дропшиппінг-партнер, регіональний хаб. Без цього налаштування магазин з кількома джерелами поставок втрачає точність остатків і ускладнює логістику.
Що таке мультисклад в OpenCart
Стандартна установка OpenCart зберігає остатки в єдиній таблиці oc_product (quantity + subtract). Для роботи з кількома складами потрібен модуль, що додає таблиці виду oc_location, oc_product_location, і логіку списання при замовленні.
Популярні рішення:
- Journal3 Warehouse — вбудований у тему Journal3
- Multi Warehouse Pro від Opencart.com — офіційне розширення
- модуль XLDevelopment — гнучке налаштування пріоритетів складу
- Кастомна розробка через Events + Model override
Архітектура рішення
Базова схема при кастомній реалізації:
CREATE TABLE oc_location (
location_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(128),
address TEXT,
status TINYINT(1)
);
CREATE TABLE oc_product_to_location (
product_id INT,
location_id INT,
quantity INT DEFAULT 0,
PRIMARY KEY (product_id, location_id)
);
При оформленні замовлення подія catalog/model/checkout/order/addOrder/after триггерит кастомний observer, який списує остатки з потрібного складу за правилом пріоритету (найближчий до покупця, перший непустий, конкретний склад для товару).
Налаштування через extension
Крок 1 — встановлення модуля
Завантаження через admin > Extensions > Installer. Модуль реєструє події через oc_event:
// install.php модуля
$this->model_setting_event->addEvent([
'code' => 'multi_warehouse',
'trigger' => 'catalog/model/checkout/order/addOrder/after',
'action' => 'extension/multi_warehouse/model/warehouse/subtractStock',
'status' => 1,
'sort_order' => 1
]);
Крок 2 — створення складів
У розділі Extensions > Multi Warehouse > Locations створюються склади з атрибутами: назва, адреса, пріоритет, прив'язка до зон доставки.
Крок 3 — розподіл товарів
У карточці товару з'являється вкладка «Склади». Для кожного складу указується доступне кількість. При включеному subtract система працює з агрегованим остатком.
Крок 4 — правила вибору складу
Стратегії списання:
-
FIFO по пріоритету — бере зі складу з найменшим
priority - Найближчий до покупця — за mapping shipping zone
- Специфічний для товару — жорстка прив'язка товару до складу
- Змішаний — списує з кількох складів при дефіциті на одному (split fulfillment)
Інтеграція з поставщиками
Для дропшиппінгу або VMI остатки оновлюються по API:
// Обновлення остатків складу через кастомний API endpoint
// admin/controller/api/warehouse.php
public function updateStock(): void {
$json = [];
$location_id = (int)$this->request->post['location_id'];
$updates = $this->request->post['products']; // [{product_id, quantity}]
foreach ($updates as $item) {
$this->model_extension_warehouse->setLocationStock(
(int)$item['product_id'],
$location_id,
(int)$item['quantity']
);
}
$json['success'] = count($updates) . ' товарів оновлено';
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
Поставщик робить POST /index.php?route=api/warehouse/updateStock з токеном у заголовку — остатки оновлюються без доступу в адмінку.
Відображення на фронтенді
За замовчуванням покупець видить сумарний остаток. Можна вивести доступність по складу:
{% if product.locations %}
<ul class="warehouse-availability">
{% for loc in product.locations %}
<li>{{ loc.name }}:
{% if loc.quantity > 0 %}в наявності ({{ loc.quantity }} шт.)
{% else %}нема в наявності{% endif %}
</li>
{% endfor %}
</ul>
{% endif %}
Актуально для B2B-магазинів, де покупець вибирає склад самовивозу.
Резервування та повернення
Важливий момент — резервування остатків при оплаті замовлення, а не при його створенні. Модуль повинен обробляти статуси:
| Статус замовлення | Дія з остатком |
|---|---|
| Pending | Без змін або м'яке резервування |
| Processing | Жорстке списання |
| Shipped | Підтвердження відгрузки |
| Cancelled | Повернення на склад |
| Refunded | Повернення за правилом складу повернень |
Для цього настраюються події на catalog/model/checkout/order/addOrderHistory/after.
Звітність
Корисні SQL-запити для контролю остатків:
-- Остатки по складам
SELECT l.name AS location, p.model, ptl.quantity
FROM oc_product_to_location ptl
JOIN oc_location l ON l.location_id = ptl.location_id
JOIN oc_product p ON p.product_id = ptl.product_id
WHERE ptl.quantity < 5
ORDER BY l.name, p.model;
-- Рух по складу за період
SELECT DATE(oh.date_added), SUM(op.quantity)
FROM oc_order_history oh
JOIN oc_order_product op ON op.order_id = oh.order_id
WHERE oh.order_status_id = 2 -- Processing
AND oh.date_added BETWEEN '2025-01-01' AND '2025-01-31'
GROUP BY DATE(oh.date_added);
Терміни та трудозатрати
Налаштування готового модуля з 2–3 складами: 2–3 дні. Кастомна розробка з нуля (пріоритети, API поставщика, split fulfillment): 1–2 тижні. Інтеграція з зовнішньою WMS (1C, МойСклад) додає ще 3–5 днів на маппінг даних та тестування.







