Зв'язатись
  • OpenCart
  • Імпорт і експорт
  • v1.0.1

Shared Stock для OpenCart — один залишок для кількох товарів і значень опцій без перепродажу

Модуль для OpenCart 4, 3 і 2.3, який продає одну фізичну річ з одного залишку, хоч би де вона стояла: окремим товаром, значенням опції в кількох списках подарункового набору («Смак 1…5: Ваніль») чи в іншому наборі. Кошик перевіряється по пулу загалом, «Купити» відмовляє з кількістю, що лишилась, а два покупці, які в ту саму секунду підтверджують останні одиниці, не отримають їх обидва. Базова версія безкоштовна; Pro — упаковки, історія з CSV, листи «мало» і «закінчився». Ліцензія назавжди.

Завантажити Free
Pro · ліцензія назавжди Чим більше сайтів, тим дешевше кожен
Сумісність
OpenCart 4.0.2 – 4.1.x (перевірено на 4.1.0.3 з драйвером pdo і 4.0.2.3), 3.0.x (перевірено на 3.0.5.0) і 2.3.0.2 (PHP 7.0) · штатний чекаут і наш One Page Checkout · MySQL / MariaDB · мови модуля: українська, англійська, російська
Версія
v1.0.1 (OpenCart 4)
v1.0.1 (OpenCart 3.x)
v1.0.1 (OpenCart 2.3)
Ліцензія
один сайт, назавжди
Тріал
7 днів, без картки, один на сайт
Або всі 173 Pro-модулів з All Access — 4 990 ₴ / рік

Що є в Free,
а що дає Pro

Безкоштовна версія працює без обмеження в часі. Pro додає решту функцій з таблиці.

Функція Free Pro
Пули спільного залишку без обмеження кількості: учасник — товар цілком або окреме значення опції (Смак 3: Ваніль) ✔ ✔
Той самий пул — у кількох товарах і кількох списках опцій одного товару: набір із 5 списками «Смак» і окремий батончик продаються з одного залишку ✔ ✔
Кошик перевіряється по пулу загалом: 2 набори по 5 «Ваніль» = 10 одиниць пулу ✔ ✔
«Купити» відмовляє з кількістю, що лишилась, — у блоці біля кнопки, а не як «обов'язкова опція» ✔ ✔
Кошик позначає рядки *** і не пускає далі, якщо пул уже не покриває кошик ✔ ✔
Крок підтвердження утримує одиниці замовлення під замком бази: одночасні покупці не отримають останню одиницю обидва ✔ ✔
Списання при переході замовлення в статус обробки чи виконання (як в OpenCart), повернення при скасуванні — рівно один раз ✔ ✔
Правка замовлення в адмінці: прибрані рядки повертаються в пул, нові списуються ✔ ✔
Кількість учасника в OpenCart — дзеркало пулу: значення без залишку зникають зі списку опцій, як звичайне «немає в наявності» ✔ ✔
Форма товару: нова цифра в полі «Кількість» встановлює пул; стара відкрита форма пул не перезаписує ✔ ✔
«Синхронізувати кількості» після імпорту: дзеркала знову = пул, учасники видалених товарів прибираються ✔ ✔
Мови модуля: українська, англійська, російська ✔ ✔
Одиниць пулу за один продаж завжди 1 будь-яке число: упаковка з 6 знімає 6
Історія кожної зміни пулу з джерелом і замовленням, експорт CSV — ✔
Лист «мало на складі» з порогом на пул і лист «закінчився» — ✔
Масове додавання: знайти значення опції за назвою в усіх товарах і додати одним кліком — ✔

Як це виглядає

Відмова «Купити» біля кнопки на сторінці товару OpenCart 4.1
Подарунковий набір із 5 списками «Flavour», у кожному обрано Vanilla, а в пулі «Vanilla» лишилось 4: «Купити» відмовляє, і покупець бачить причину в блоці над кнопкою.
Відмова «Купити» на телефоні
Той самий блок на телефоні: в ширину екрана, над кнопкою кошика; перевірено на ширинах 375 і 320 px.
Кошик OpenCart з позначкою *** для пулу
Пул зменшився, поки товар лежав у кошику: рядок позначено ***, і OpenCart не пускає до оформлення, доки покупець не змінить кількість.

Головне про модуль

Як це виглядає для покупця

Покупець обирає смаки в наборі й натискає «Купити». Якщо разом з тим, що вже лежить у кошику, пулу не вистачає, OpenCart не додає товар, а над кнопкою з’являється зрозуміле речення: скільки ще лишилось або що все вже в кошику.

Що перевірено, а що ні

Перевірено локально на чотирьох версіях OpenCart: 79 перевірок на OpenCart 4.1.0.3 і 4.0.2.3 і по 77 на 3.0.5.0 і 2.3.0.2 за основним сценарієм, плюс окремі прогони в браузері, з One Page Checkout, правки замовлень, імпорту й листів Pro.

Тріал стартує, коли ви попросите

Свіжий інстал — безкоштовна версія, нічого не вмикається само. Кнопка «Спробувати Pro 7 днів» → e-mail → ключ одразу у вікні і листом.

Один ключ — один сайт

Переносите магазин — відв’яжіть ліцензію на старому домені й активуйте на новому самі. Для студій — ключі на 5, 25 сайтів або без обмежень.

Технічні вимоги

  • OpenCart 4.0.2.0+ і 4.1.x (перевірено на 4.1.0.3 і 4.0.2.3), 3.x (перевірено на 3.0.5.0) або 2.3.0.2.
  • PHP 7.0+ — той, що потрібен вашій версії OpenCart (перевірено на 7.0, 8.1, 8.2 і 8.3).
  • База MySQL або MariaDB: замок між чекаутами — іменований замок MySQL (GET_LOCK). Перевірено на MariaDB 10.11. На кластері Galera такий замок не діє між вузлами.
  • «Оформлення без наявності» в налаштуваннях OpenCart має бути вимкнене — інакше OpenCart не перевіряє залишок на чекауті, і модуль теж не відмовляє.
  • Пошта магазину налаштована (System → Settings → Mail) — для листів Pro.
  • Мови модуля: українська, англійська, російська.

Разом з Shared Stock для OpenCart купують

4 модулі одним замовленням — на 40% дешевше, ніж окремо

Набір «Старт магазину» Shared Stock Nova Poshta Premium LiqPay Telegram-сповіщення і Viber/SMS покупцям Потрібно більше — усі 173 модулі в All Access за 4 990 ₴.
3 790 ₴ назавжди замість 6 260 ₴ поштучно
Купити набір →

Повний опис модуля

Shared Stock для OpenCart — модуль від студії CatCode для магазину, який продає одну фізичну річ у кількох місцях каталогу. Батончик «Ваніль» окремо — і той самий смак у подарунковому наборі, де покупець обирає смак у п’яти списках «Смак 1…5». Той самий товар в іншому наборі. OpenCart рахує залишок кожного товару і кожного значення опції окремо, тож власник магазину переписує цифри вручну — і все одно продає останню одиницю двічі.

Shared Stock об’єднує такі місця в пул — одну цифру залишку, з якої продають усі вони. Учасником пулу може бути товар цілком або окреме значення опції. Кошик перевіряється по пулу загалом: набір із п’ятьма «Ваніль» у кількості 2 бере з пулу 10. Продаж будь-якого учасника знімає з пулу, а кожен учасник показує, скільки пул ще може покрити. Два покупці, які в ту саму секунду підтверджують останні одиниці, не отримають їх обидва.

Це не дубль Option Combinations. Option Combinations веде залишок комбінацій опцій усередині одного товару (розмір × колір). Shared Stock розв’язує інший сценарій: один залишок для різних товарів і значень опцій — той самий смак окремим товаром, у п’яти списках набору й в іншому наборі. Перший модуль не ділить залишок між товарами, другий не веде комбінацій усередині товару.

Як це виглядає для покупця

Покупець обирає смаки в наборі й натискає «Купити». Якщо разом з тим, що вже лежить у кошику, пулу не вистачає, OpenCart не додає товар, а над кнопкою з’являється зрозуміле речення: скільки ще лишилось або що все вже в кошику. Значення, яке пул уже не може покрити, зникає зі списку опцій, як звичайне «немає в наявності».

Якщо пул зменшився, поки товар лежав у кошику (інший покупець встиг купити), кошик позначає рядок *** і не пускає до оформлення — це штатна поведінка OpenCart для залишку, тільки рахується вона по пулу.

Що отримує адмін

  • Каталог → Спільний залишок: пули із залишком, утриманим непідтвердженими замовленнями, і доступним; створення пулу. Порожній новий пул бере залишок першого доданого учасника.
  • Сторінка пулу: «Додати / списати (±N)» відносно поточного — поставка, оформлена під час замовлень, не загубиться; «Встановити» для інвентаризації; поріг листа (Pro); учасники з їхньою кількістю в OpenCart; пошук товару й додавання цілого товару або одного значення опції; список утримань непідтверджених замовлень.
  • Форма товару: рядок під полем «Кількість» з назвою пулу. Нова цифра в цьому полі чи в кількості значення опції встановлює пул, а стара цифра з давно відкритої форми — ні.
  • «Синхронізувати кількості» — після CSV-імпорту чи іншого модуля, що пише кількості напряму: дзеркала знову показують пул, учасники видалених товарів прибираються.

Як це працює — крок за кроком

  1. Ви створюєте пул (наприклад, «Ваніль»), задаєте залишок і додаєте учасників: батончик цілком і значення «Ваніль» з кожного списку набору. Кількість кожного учасника в OpenCart стає дзеркалом пулу.
  2. Покупець додає товар у кошик. Модуль рахує, скільки одиниць кожного пулу просить весь кошик, з урахуванням того, що утримують непідтверджені замовлення інших покупців, і відмовляє з поясненням, якщо не вистачає.
  3. На кроці підтвердження — окремим запитом чи всередині сторінки оформлення OpenCart 4 і One Page — модуль бере замок бази, ще раз перевіряє кошик по пулу і утримує одиниці замовлення. Інший покупець, який підтверджує в ту саму секунду, чекає своєї черги й бачить уже меншу цифру. Черга довша за 10 секунд (налаштовується) — покупець отримує відмову, а не ризик продати двічі.
  4. Коли замовлення переходить у статус обробки чи виконання, модуль знімає одиниці з пулу — рівно один раз на рядок замовлення — і оновлює кількість усіх учасників. Скасування повертає одиниці.
  5. Утримання непідтвердженого замовлення живе 60 хвилин (налаштовується), потім одиниці знову доступні іншим покупцям.

Що перевірено, а що ні

Перевірено локально на чотирьох версіях OpenCart: 79 перевірок на OpenCart 4.1.0.3 і 4.0.2.3 і по 77 на 3.0.5.0 і 2.3.0.2 за основним сценарієм, плюс окремі прогони в браузері, з One Page Checkout, правки замовлень, імпорту й листів Pro. Версію 1.0.1 — тим самим набором, плюс п’ять прогонів поспіль одночасних завантажень сторінки оформлення (штатної й One Page) на OpenCart 4.1 і 4.0.2.3 — щоразу рівно 2 замовлення з 8, пул не нижче нуля — і 24 комбінації мови магазину й мови покупця для повідомлення «в кошик». Ліцензійний сервер і пошту підміняли тестові сервери.

Межі, про які варто знати. Захист від одночасних покупців стоїть на кроці підтвердження замовлення — і тоді, коли він іде окремим запитом, і коли OpenCart 4 чи наш One Page відкриває його всередині сторінки оформлення. Сторонній one-page чекаут, що записує замовлення в обхід цього кроку, перевіряє кошик без замка; утримання модуль і тоді пише лише тоді, коли пул його покриває. Замовлення, оплачене вже після того, як його утримання минуло (60 хвилин за замовчуванням), списує пул навіть у мінус — так само, як OpenCart без модуля; це видно в історії пулу. Не перевіряли: платіжні шлюзи зі зворотним викликом банку, сторонні one-page чекаути (крім нашого), спільну роботу з Option Combinations, варіанти товарів OpenCart 4 (master / variant), MySQL 8 і кластери Galera.

Що під капотом

  • Пул — у власній таблиці. Кількості учасників в OpenCart лише показують, скільки пул ще може покрити; чекаут рахує по пулу.
  • Одне списання на рядок. Рядок замовлення знімає з пулу один раз (умовне оновлення в базі), тож повторна зміна статусу чи повторне скасування нічого не подвоює.
  • Утримання на підтвердженні. Замовлення, що дійшло до кроку підтвердження, утримує свої одиниці; повторне відкриття кроку того самого покупця замінює утримання, а не додає друге.
  • Без правок ядра і без OCMOD-патчів — лише події OpenCart; одна бібліотека на три збірки, код сумісний з PHP 7.0, працює і з драйвером бази pdo в OpenCart 4.1.
  • Ліцензія — окремою групою налаштувань, тож збереження налаштувань її не зачіпає.
  • Видалення знімає події й таблиці модуля (можна залишити дані для повторного встановлення).

Як встановити

  1. OpenCart 4: Розширення → Інсталятор → завантажте cc_sharedstock.ocmod.zip (ім’я архіву не змінюйте) і натисніть «Встановити». OpenCart 3: Розширення → Інсталятор → cc_sharedstock-oc3.ocmod.zip → «Встановити». OpenCart 2.3: Розширення → Інсталятор → cc_sharedstock-oc2.ocmod.zip, якщо в налаштуваннях магазину увімкнено FTP; інакше залийте вміст папки upload/ з архіву в корінь магазину.
  2. Розширення → Розширення → Модулі → Shared Stock → «Встановити».
  3. Каталог → Спільний залишок: створіть пул і додайте учасників — товар цілком або значення опції.
  4. Задайте залишок пулу або залиште поле порожнім — тоді пул візьме залишок першого доданого учасника.
  5. Для Pro: вставте ліцензійний ключ з листа після оплати або увімкніть тріал на вкладці «Ліцензія» налаштувань модуля.

Питання
про модуль

Не знайшли відповідь? Напишіть у Telegram — відповімо протягом робочого дня.

@catcode_support Налаштування, сумісність, активація
Чим це відрізняється від Option Combinations?

Option Combinations веде залишок комбінацій опцій усередині одного товару. Shared Stock потрібен, коли та сама річ продається в кількох товарах або в кількох списках опцій: окремий батончик «Ваніль», «Ваніль» у кожному зі списків «Смак 1…5» подарункового набору, той самий смак в іншому наборі. Тобто це не дубль, а інший сценарій: один залишок для різних товарів і опцій. Спільну роботу обох модулів в одному магазині ми ще не перевіряли.

Це справді захищає від перепродажу, коли двоє платять одночасно?

Так, на кроці підтвердження: замовлення утримує свої одиниці під замком бази, другий покупець чекає й бачить, що пулу вже не вистачає. У тесті 8 покупців одночасно підтверджували по 4 одиниці з пулу на 10 — пройшло рівно 2 замовлення, пул ніколи не пішов у мінус; без модуля той самий тест пропускав усі 4 з 4 перших. З версії 1.0.1 так само захищено випадок, коли OpenCart 4 чи One Page записує замовлення вже під час завантаження сторінки оформлення: 8 одночасних завантажень — рівно 2 замовлення, у 5 прогонах поспіль.

Коли знімаються одиниці з пулу?

Коли замовлення переходить у статус обробки чи виконання — як OpenCart знімає залишок товару. Скасування повертає одиниці, повторне скасування нічого не повертає вдруге. Непідтверджене замовлення лише утримує одиниці на час з налаштувань (60 хвилин за замовчуванням).

Що стане з кількістю товару, коли він увійде в пул?

Кількість учасника в OpenCart стає дзеркалом пулу і рахується модулем. Порожній новий пул бере залишок першого доданого учасника, тож цифра не обнуляється. Нова цифра, введена в поле «Кількість» товару чи значення опції, встановлює пул.

Імпорт з CSV перезаписав кількості — що робити?

Вітрина й далі рахує по пулу, тож зайвого не продасть. Натисніть «Синхронізувати кількості» на сторінці пулів — дзеркала знову покажуть цифру пулу. Якщо імпорт несе нову фактичну цифру залишку, введіть її в пул.

Працює з нашим One Page Checkout?

Так, ми перевірили їх разом на OpenCart 4.1, 4.0.2.3, 3.0 і 2.3: замовлення через One Page, відмова, коли пул став меншим за кошик, і одночасні підтвердження, зокрема коли One Page записує замовлення під час завантаження сторінки.

Інтерфейс українською?

Так: адмінка модуля — українською, англійською і російською, а повідомлення покупцю — мовою, яку він обрав на вітрині (з версії 1.0.1 і на OpenCart 3 та 2.3).

Ліцензія на рік?

Ні. Для OpenCart це одна оплата, ліцензія назавжди, і вона одна на всі три збірки: 4.x, 3.x і 2.3. Пули, перевірка кошика й захист на підтвердженні — у безкоштовній версії без обмеження в часі.

Не той варіант, що шукаєте?

Робимо кастомні модулі під WordPress, WooCommerce, OpenCart і Shopify. Розкажіть про задачу — підготуємо оцінку.

Замовити кастомний модуль