Опенкарт — один из самых распространенных интернет-магазинов. Во многих случаях возникает задача интеграции со складской учетной системой (чаще всего с 1С).

Интеграция предполагает, как минимум, передачу заказов с ИМ в складскую систему для их обработки и отправки товаров покупателю и обновление количества товаров в ИМ в соответствии с реальным наличием на складе.

Также часто стоит задача засинхронизировать сами товары, их параметры, фотографии и так далее.

Сложность в том что, как правило, изменения нужно делать и в ИМ и в складской системе а значит, разработчик должен знать обе системы или нужно привлекать еще одного разработчика. Существуют готовые решения но они обычно требуют допиливания или платные и все равно требуют допиливания.

Для решения данной проблемы создан модуль к Опенкарт который расширяет API опенкарта позволяя вносить изменения только на стороне учетной системы.

Модуль бесплатный с открытым кодом, расположен на гитхабе.

Модуль разрабатывался под конкретную учетную систему, но написан так, что может использоваться любыми другими сторонними программами.

Устанавливается модуль в ИМ либо стандартным образом через админку либо простым копированием в папку catalog/controller/api. Модуль состоит из одного файла. Никаких изменений в настройках или структуре опенкарта не требуется.

Разумеется, в админке нужно сгенерить API KEY который потом будет задан в настройках складской системы для залогинивания в API перед обращением к нему.
Работа проверена с Опенкарт 2.3 и 3.0

Модуль предоставляет несколько функций API для работы с заказами и товарами.
В соответствии с соглашениями опенкарт, параметры передаются методом POST и перед обращением к API должен быть получен специальный токен. Обмен данными производится в формате JSON. Все это стандартные средства работы с API Опенкарта.

Работа с заказами


Когда в ИМ появляются новые заказы они должны импортироваться в складскую систему, то есть на их основе должны быть созданы соответствующие документы (записи и т.д.) в складской системе, обработаны и отправлены заказчику

Импорт заказов выполняется вызовом функции orders().
Чтобы получить только нужные ордера передается параметр status_id со статусом ордеров. Поскольку статусы в опенкарте создаются админке и могут быть какими угодно, то предварительно нужно получить список статусов методом statuses(), возвращающим массив ключ-значение с идентификаторами и названиями статусов.
Эти статусы учетная система предъявяет для уточнения в каком нибудь выпадающим списке. Менеджер выбирает с этих статусов тот, что соответствует новому заказу.

С заказом приходит список товаров и данные клиента для доставки.
Для идентификации заказов ИМ учетная система должна записать ID заказов в какой то атрибут внутреннего заказа. По этим идентификаторам обновляются статусы в ИМ а также проверяется что данный заказ уже импортирован.

Обновление статусов в ИМ производится функцией updateorder()
Менеджер выбирает нужные заказы (учетной системы) в нужном состоянии(например заказ в обработке) и обновляет статусы соответствующих исходных заказов в ИМ. Передается массив ключ-значение — идентификатор заказа ИМ и id статуса ИМ из предложенного системой выпадающего списка.

Например заказы могут быть обновлены после того как приняты в обработку, отправлены клиенту, доставлены клиенту и закрыты. Это на усмотрение менеджера.
Разумеется если статусы в обоих системах четко определены и не меняются то вызовы API с фиксированными статусами можно повесить на какой либо планировщик и вызывать автоматически.

Работа с товарами


При работе с товарами чаще всего необходимо обновлять в магазине актуальное количество товара на складе а также цены.

Чтобы выполнять обмен данными товары в ИМ должны быть засинхронизированы с товарами на складе. Соответствие обеспечивается артикулом, но при желании можно скорректировать код и использовать другой параметр, например название (хоть это и не лучшая идея).

Для добавления товаров в магазин служит функция addproducts().

В магазин передаются товары, которых там еще нет. Для того чтобы не передать дубли можно получить с магазина список существующих там артикулов методом articles().
Чтобы товары попали сразу в нужную категорию нужно предварительно получить список категорий методом cats() и дать менеджеру возможность выбрать нужную категорию из списка. После этого товары дооформляются стандартными средствами в админ панели Опенкарт.

Товар передается в виде наименования, артикула, описания (если есть), цены и количества. В ряде случаев стоит задача передать со склада атрибуты, все описания, фотографии и так далее. Но на этот счет есть сомнения в целесообразности создавать все это на стороне учетной системы.

Во первых, для классического складского учета достаточно названия и артикула, то есть тех данных, которые используются в накладных и заказах.

Во вторых, в админке ИМ уже есть штатные средства для формирования карточек товара.
В третьих, передача и согласование таких сложных структур как дерево категорий, атрибуты, изображения и так далее дело весьма хлопотное и как следует из вышеуказанного, не нужное.
Подобные решения имеют смысл если учетная система работает и с другими ресурсами, выгружает данные в маркетплейсы например. Хотя уверен, есть модули к опенкарту, которые выгружают характеристики и фотографии товары в маркетплейсы с опенкарта.

Если оказалось что в ИМ уже есть какие то товары на момент внедрения складской системы то можно получить список товаров из ИМ методом getproducts() и добавить в справочник товаров учетной системы. Уникальность так же проверяется по артикулу.

Далее основные функции updatequantity() и updateprice() для обновления количества и цены в ИМ в соответствии с данными склада. Функции передают массив ключ значение (артикул-количество или цена) и не требуют параметров то есть могут запускаться планировщиком.

Как уже упоминалось, преимущество модуля — отсутствие каких либо изменений в коде Опенкарта. При необходимости модуль легко дорабатывается — чтобы передать дополнительные данные нужно просто добавить новый ключ в соответствующий ассоциативный массив. Данные будут упакованы и затем распакованы в том же виде на приемной стороне.

На случай если учетная система написана на PHP есть готовая функция для вызова API опенкарта (строчку сообщения системе об ошибке просто убрать).

Комментарии (4)


  1. Khaperets
    08.08.2019 17:06

    Один я не увидел полезной информации в статье?


    1. caballero Автор
      08.08.2019 18:10

      Полезно для тех кто занимается подобными задачами. А они появляются на фрилансе каждый день — интеграция то с одноце то с битриксом то с какой нибудь CRM.
      Как ни странно, стандартное API Опенкарта не включает таких очевидно нужных функций.


      1. Khaperets
        08.08.2019 18:24

        Работал с OpenCart и делал интеграцию с различными системами (включая 1С). Вывод, который сделал для себя: написать интеграцию данной CMS с любой системой — работа из самых простых, и можно доверить даже джуниору.


  1. 1c80
    08.08.2019 20:06

    Спасибо, форкнул на всякий, все же меньше писать если что. А что касается написания интеграции джуниорами, то это вообще самое милое дело, обычно после них даже самый распоследний жопошник разбаксовывается на требуемую сумму без лишних вопросов, так что да, таких интеграций чем больше, тем лучше, джунам опыт, нам деньги.