Skip to content

feat(OCM-99): пакет модуля для OpenCart 4.1.x - #39

Open
khalturinsky wants to merge 6 commits into
mainfrom
khalturinsky/OCM-99
Open

feat(OCM-99): пакет модуля для OpenCart 4.1.x#39
khalturinsky wants to merge 6 commits into
mainfrom
khalturinsky/OCM-99

Conversation

@khalturinsky

Copy link
Copy Markdown
Contributor

Что сделано

Новый пакет 4.x/ — модуль ApiShip для OpenCart 4.1.x с паритетом функций пакета 3.x (задача OCM-99):

  • Пакет в формате OC4: install.json, неймспейсы, автозагрузка через oc_extension; архив apiship.ocmod.zip ставится через Расширения → Установщик. Имя файла менять нельзя: код расширения OC4 берёт из имени архива.
  • События вместо OCMOD-патчей ядра: карта ПВЗ в штатном чекауте, запрет продолжить без выбранного ПВЗ, пересчёт варианта после выбора оплаты (наложенный платёж), вкладка ApiShip в карточке заказа, ярлыки и акты в списке заказов, поиск ПВЗ в модалке выбора доставки при редактировании заказа.
  • Витрина: расчёт тарифов (ПВЗ и курьер), карта Яндекс с фильтрами, экспорт заказа в СД, отмена, ярлык, акт, статус и трек-ссылка, cron-экспорт и импорт статусов с маппингом.
  • Админка: настройки на Bootstrap 5 по ajax-конвенции OC4 (ошибки по полям), поиск точек привоза через select2, четыре вкладки как в 3.x.
  • Заголовок Platform: opencart_v4 в запросах к API ApiShip.
  • Стенд dev/oc4: OpenCart 4.1.0.4 на PHP 8.3 в Docker, MariaDB, mock-сервер API ApiShip, скрипт установки модуля через HTTP-эндпоинты админки, юнит-тесты библиотеки (make lint, make test, make oc4-up).
  • Пакеты 2.1/2.3/3.x не изменены; make build собирает и apiship.ocmod.zip.

Как проверено

  • make lintphp -l всех файлов 4.x на PHP 8.3: чисто.
  • make test — 46 юнит-тестов библиотеки (разбор кодов, адреса, расчёт мест, распределение веса, наложенный платёж, направление конвертации валют): 46/46.
  • Сквозной сценарий на стенде в браузере: установка через Установщик → включение → настройка → чекаут с картой ПВЗ (негативный случай без ПВЗ даёт ошибку) → оформление заказа → вкладка ApiShip: экспорт, ярлык, акт, отмена → cron-экспорт и импорт со сменой статуса по маппингу → поиск ПВЗ при редактировании заказа → кнопки в списке заказов → uninstall/install (события удаляются и создаются заново).
  • Сбой калькулятора: при недоступном API пересчёт после выбора оплаты сбрасывает способ доставки с ошибкой, сбойные ответы не кешируются.
  • Ревью revmux: 4 раунда (2 с codex adversarial). Раунд 2 — 3 major и 9 minor, раунд 3 — 1 major, раунд 4 — 0 гейтящих (1 minor исправлена попутно). CI в репозитории нет.

Принятые решения (без владельца)

  1. Только OpenCart 4.1.x; 4.0.x вне объёма (по постановке).
  2. Uninstall удаляет события модуля; настройки удаляет само ядро OC4 при uninstall; таблицы apiship_order и apiship_order_status сохраняются.
  3. Эндпоинты витрины, вызываемые из админки (экспорт, отмена, ярлык, акт, параметры заказа), защищены cron-ключом; вкладка и кнопки с ключом показываются только пользователям с правом modify на sale/order.
  4. Наложенный платёж: в OC4 оплата выбирается после доставки, поэтому вариант ApiShip пересчитывается событием checkout/payment_method.save; код оплаты cod.cod сопоставляется с кодом расширения cod из настроек.
  5. Суммы для ApiShip конвертируются из базовой валюты магазина в валюту «рубль» из настроек (в 3.x направление было перевёрнуто, что не проявлялось при базовой валюте RUB).
  6. Тестовый контур: константа APISHIP_API_URL в config.php (совместимо с APISHIP_TEST_MOD из 3.x).
  7. bcmath заменён на round(); версия пакета OC4 — 1.3, версии 2.x/3.x не менялись.
  8. Стенд — Docker в репозитории, а не сервер opencart-dev (он на PHP 7.4).
  9. Публикация на маркетплейсах OpenCart — отдельная задача.

Открытые вопросы

  • Моды для сторонних шаблонов OC4 (пункт 2 постановки): по поиску OC4-версия подтверждена только у Simple (маркетплейс OpenCart: support 1.5–4.*); UniShop, Простор, ShowCase, UltraStore, oct_fastorder найдены только в версиях под OC 3. Исходников тем нет, патчи вслепую не писались — предлагается вынести в отдельные задачи по мере запросов клиентов.
  • Дублирование вариантов «курьер» для двух типов забора (курьер / привоз на склад) в чекауте унаследовано из 3.x — оставлено для паритета.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CJBKXErtvktf1AARtDmQ3Z

khalturinsky and others added 6 commits September 4, 2026 22:42
Новый пакет 4.x (архив apiship.ocmod.zip): установка через Расширения → Установщик,
события вместо OCMOD-патчей ядра, карта ПВЗ в штатном чекауте OC4, вкладка ApiShip
в карточке заказа, ярлыки и акты в списке заказов, поиск ПВЗ при редактировании заказа,
cron-экспорт и импорт статусов. Заголовок Platform для OC4 — opencart_v4.

Стенд dev/oc4: OpenCart 4.1.0.4 на PHP 8.3 в Docker, mock API ApiShip, скрипт
установки модуля, юнит-тесты библиотеки (make lint / make test / make oc4-up).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CJBKXErtvktf1AARtDmQ3Z
- import_orders: проверка результата fopen/flock вместо TypeError под PHP 8
- карта ПВЗ: ключ Яндекс API берётся из конфига экземпляра, глобальная функция — запасной вариант
- чекаут: текст выбранного способа в fallback-ветке без html, x-tracing-id расчёта пишется в консоль (паритет с 3.x)
- get_delivery_cost_original: задокументирован как публичный эндпоинт для внешних интеграций
- тесты: переопределение веса места проверяется на числах, не совпадающих с расчётом; добавлены проверки габаритов и веса упаковки

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CJBKXErtvktf1AARtDmQ3Z
major:
- наложенный платёж в чекауте OC4: код оплаты в сессии имеет вид cod.cod, а в настройках хранится cod —
  сравнение по коду расширения; после выбора оплаты вариант ApiShip пересчитывается событием
  checkout/payment_method.save (refresh_quote), текст в форме обновляется через get_selected
- суммы для ApiShip конвертируются из базовой валюты магазина в валюту «рубль» из настроек:
  цены товаров, фиксированная страховка, итоги заказа при экспорте
- вкладка ApiShip, кнопки ярлыков/актов и поиск ПВЗ в админке только для пользователей
  с правом modify на sale/order: cron-ключ не раскрывается операторам с правом чтения

minor:
- pickupTypes тарифа читается через tariff_pickup_types() с защитой от отсутствующего поля (5 дублей убраны)
- пустой ответ lists/points и пустая карта — ошибка с текстом, а не пустая модалка
- импорт статусов: сначала история заказа OpenCart, затем фиксация статуса ApiShip
- карта: ожидание ymaps ограничено 15 с и прерывается при ошибке загрузки скрипта; фильтры типов и СД применяются вместе
- остаток веса места отдаётся одной единице последней позиции (distribute_place_weight)
- докблок apiship_calculator: индекс намеренно не используется (паритет 3.x)
- общие помощники alert/файлов админки вынесены в apiship_order.js
- README стенда: make lint / make test / install-module.sh (REINSTALL=1)
- тесты: наложенный платёж, распределение веса, направление конвертации валют

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CJBKXErtvktf1AARtDmQ3Z
- пересчёт после выбора оплаты: если вариант ApiShip пересчитать не удалось (калькулятор недоступен,
  тариф исчез), способ доставки сбрасывается с ошибкой вместо оформления заказа по старой цене;
  в чекауте поле доставки очищается, модалка оплаты закрывается, блок подтверждения перерисовывается
- адрес для пересчёта и карты берётся из сессии чекаута, если кеш последнего расчёта (10 минут) истёк
- калькулятор: транспортная ошибка и не-JSON ответ больше не кешируются на 10 минут

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CJBKXErtvktf1AARtDmQ3Z
curl-помощники возвращают HTTP-код; расчёт кешируется только при коде < 400 и наличии
разделов deliveryToPoint/deliveryToDoor в ответе. Ответ 401/429/5xx с JSON-телом
без errors раньше залипал в сессии на 10 минут.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CJBKXErtvktf1AARtDmQ3Z
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant