Складской учет для OpenCart и ocStore

При помощи СКИФ вы можете вести складской и финансовый учет, интегрированный с вашим интернет-магазином на OpenCart. СКИФ устанавливается на вашем сайте, поэтому вы имеете полный контроль над базой данных и возможность дорабатывать систему для своих потребностей.

Что Вам даст интеграция

Будете знать, когда и сколько закуплено, когда, кому и по какой цене продано

Куда были потрачены деньги (на какие статьи затрат)

Автоматизация обновления цен

Назначение ответственных сотрудников и контроль их работы

Еще 21 возможность

Склад, товары и остатки

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

Финансы и расходы

• Наличие денег в кассах и на счетах
• Данные о дебиторской и кредиторской задолженности
• Отчеты по доходности и ликвидности

Цены

• Удобное обновление продажных цен при изменении закупочных
• Обновление цен из прайсов поставщиков (импорт из Excel)
• Контроль над наценками
• Печать и рассылка прайс-листов
• Печать ценников, в том числе со штрихкодами

Управление персоналом

• Назначение менеджеров клиентам и сделкам
• Расчет заработной платы
• Управление задачами и поручениями
• Мониторинг работы сотрудников
• Настройка прав доступа сотрудников
• Контроль за исправлениями в документах

И многое другое

• Обширная отчетность по всем аспектам работы фирмы
• CRM-инструменты (рассылки, задачи, сверки взаиморасчетов и др.)
• Работа с облачными кассами и фискальными регистраторами по 54ФЗ

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

» Другие возможности СКИФ

Выберите вариант комплектации

1 Модуль синхронизации: 6900
2 Версия СКИФ:


сравнение версий
0
Купить за 6900
Гарантия! MoneyBack 7 дней.
Если модуль Вам не подойдет, мы вернем деньги.
Нужна консультация? Напишите нам на biz@webnice.biz, в мессенджер или закажите звонок.

Что интегрируется

из СКИФ в OpenCart передаются производители, категории, товары, цены, остатки и изменения в заказах

из OpenCart в СКИФ передаются интернет-заказы, оплаты и данные о покупателях.


Как установить

Установка и настройка выполняются нашими специалистами бесплатно. Вы также можете выполнить установку самостоятельно по инструкции ниже. ИНСТРУКЦИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ УСТАНОВКИ
1 Скачайте СКИФ
Запросите дистрибутив СКИФ для установки на своем сайте. В ответ сразу придет ссылка на скачивание.

2 Установите СКИФ
Установите СКИФ по инструкции как отдельный сайт или на сайт с OpenCart:
- на отдельный домен или поддомен (если вы планируете создавать на движке СКИФ отдельный интернет-магазин)
- в подпапку сайта с установленным OpenCart (если вы хотите иметь возможность загружать изображения в OpenCart напрямую из СКИФ).
Важно! Таблицы СКИФ должны быть размещены в той же базе данных, что и OpenCart. Они имеют собственный префикс, поэтому никак не могут нарушить работу OpenCart.

3 Приобретите модуль синхронизации
Купите модуль в нашем каталоге плагинов. Сразу после оплаты на Ваш email придет архив с файлами модуля.

4 Скопируйте файлы модуля на сайт
Распакуйте полученный архив в папку /scif/includes/ с сохранением структуры директорий (путь указан от корня установки дистрибутива СКИФ. Если вы установили СКИФ в подпапку основного сайта, например, /wn/, соответственно, распаковать нужно в /wn/scif/includes/)

5 Задайте настройки синхронизации
Скопируйте из блока ниже код с настройками, добавьте его в конец файла wn_settings.php в корне установки СКИФ (это можно сделать через меню "Сервис-Редактор кода") и укажите нужные вам параметры синхронизации. НАСТРОЙКИ СИНХРОНИЗАЦИИ
Код настроек
$sync_opencart=array(
// сборка и версия OpenCart. Возможные значения:
// ocstore1 - для сборки ocStore 1.5 https://ocstore.com/downloads
// ocstore2 - для сборки ocStore 2.3.0.2.3 https://ocstore.com/downloads
// ocstore3 - для сборки ocStore 3.0.2.0 https://ocstore.com/downloads
// opencart2 - для opencart версии 2.3.0.2 http://opencart-russia.ru/
// opencart3 - для opencart версии 3.0.2.0 http://opencart-russia.ru/
// узнать версию можно в файле index.php в корне установки OpenCart
'version'=>'укажите',
// если вы используете opencart и установлен модуль SeoPro, установите 1 (в ocStore модуль включен в комплект).
// (если не уверены, проверьте наличие поля main_category в таблицу product_to_category)
'seopro'=>0,
// префикс базы данных интернет-магазина
'shop_prefix'=>'oc_',
// код языка магазина
'language_id'=>1,
// Записывать заказ в таблицу заказов wn_orders: Меню "Торговля-Заявки с сайта"
// без данных о товарах, эта таблица может использоваться для контроля обработки заказов из разных источников
// Укажите код типа заказа из массива $scif_order_fields['type'] в файле настроек wn_settings.php в корне папки установки СКИФ.
// Рекомендуется добавить отдельный, например 2-Интернет-магазин
// Если не задан, заказ не будет копироваться в эту таблицу
//'scif_order_type'=>0,
// код группы в справочнике контрагентов в СКИФ, в которой будут добавляться заказчики интернет-магазина
'scif_contr_group'=>1,
// если заказ без авторизации, искать в базе клиента по номеру телефона и относить заказ на него
// true - по телефону, email - по телефону и email
//'match_noaut_client'=>true,
// код группы в справочнике статей движения в СКИФ для импорта статусов заказов из OpenCart. Если 0, то статусы импортироваться и обновляться не будут
'scif_finitem_group'=>6,
// код склада в СКИФ для обновления остатков в OpenCart. Если не задан или установлен в 0, остатки в OpenCart не обновляются
'scif_store'=>0,
// код типа цен в СКИФ для синхронизации с магазином. По умолчанию 2-Продажные
'scif_price'=>2,
// раскомментируйте, если нужно отключить обновление цен в OpenCart из СКИФ
//'noupdate_prices'=>true,
// с каким полем синхронизировать поле СКИФ Артикул (vendorcode): sku или model
// если установлено model, нужно задать для поля Артикул в СКИФ обязательность и длину 64 символа
// $sprs[5]['fields']['vendorcode']['required']=true; $sprs[5]['fields']['vendorcode']['maxlength']=64;
'vendorcode'=>'sku',
// что сохраняем в поле vendorcode опции: значение родительского товара (по умолчанию), пустое "" или NULL
//'vendorcode_option'=>'""',
// раскомментируйте, если нужно отключить синхронизацию описаний и тега Title (например, для случаев, когда данные на сайте заполняет SEO-шник)
//'noupdate_seo'=>true,
// дополнительное условие выборки для обновления производителей в OpenCart. Используйте 'AND 0' чтобы не обновлять производителей
//'where_spr_values'=>'',
// дополнительное условие выборки для обновления категорий товаров в Опенкарт.
// Например, для исключения групп с кодами 1,2 используйте 'AND s.id NOT IN (1,2)'
// Чтобы вообще не обновлять категории, используйте 'AND 0'
//'where_spr_noms_gr'=>'',
// дополнительное условие выборки для обновления товаров в Опенкарт.
// Например, для исключения товаров из групп с кодами 1,2 используйте 'AND s.parent NOT IN (1,2)'
// Чтобы вообще не обновлять товары, используйте 'AND 0'
//'where_spr_noms'=>'',
// дополнительное условие выборки заказов для импорта в СКИФ. Рекомендуется задать дату начала синхронизации,
// чтобы не импортировались старые заказы при их изменении (при необходимости, их можно импортировать вручную из меню Сервис-Opencart, Импортировать заказ
// Другие условия: загрузка только 10 последних заказов (для отладки): 'OR 1 ORDER BY o.order_id DESC LIMIT 10';
// или не загружать "незавершенные заказы" - 'AND o.order_status_id>0'
'where_order'=>'AND o.date_added>="2024-05-01 00:00:00"',
// Коды из таблицы OpenCart order_total и соответствующие им коды услуг из номенклатуры СКИФ, которые нужно вносить в состав заказа в документ СКИФ (доставка, ваучеры, купоны и т.д.).
// Cумма позиций, коды по которым в этом массиве не определены, будет вноситься в поле "Накладные расходы"
// например, array('shipping'=>1054,'coupon'=>1055,'voucher'=>1055)
// Если будут использоваться отрицательные суммы, включите в меню Сервис-Настройки опцию "разрешить минусовые цены"
'order_total_codes'=>array(),
// данные для создания документа в СКИФ (пользователь, организация, контрагент, склад, ответственный),
// если они отличаются от массива $wn_catalog_invoice, указанного в файле настроек wn_settings.php в корне сайта
// array('user_insert'=>1,'org'=>1,'contr'=>1,'store'=>1,'manager'=>1,'type'=>11)
// Пользователь user_insert - ID пользователя СКИФ, от имени которого будут добавляться записи. Для лучшего контроля рекомендуется завести в СКИФ отдельного пользователя
'invoice'=>$wn_catalog_invoice,
// Перечислите через запятую коды статусов заказа из OpenCart, при которых заказ в СКИФ нужно преобразовать в Продажу
// (будут уменьшены остатки товара на складе и увеличена задолженность покупателя)
'statuses_confirmed'=>array(), // например, array(1,3,4)
// Перечислите через запятую коды статусов заказа из OpenCart, при которых в СКИФ нужно внести оплату
'statuses_paid'=>array(), // например, array(5,6,7)
// Перечислите через запятую коды статусов заказа из OpenCart, при которых заказ считается отмененным
// (если в СКИФ была создана Продажа, она будет преобразована в Заказ покупателя, а остатки возвращены на склад)
'statuses_rejected'=>array(), // например, array(8)
'rejected_del_pay'=>false, // true - разрешить удалять оплаты при отмене заказа (не рекомендуется, если вы ведете финансовый/кассовый учет по датам)
// скопируйте в переменную https_server константу HTTPS_SERVER из config.php в корне установки OpenCart
'https_server'=>'',
// использование API для изменение статуса заказа OpenCart из карточки документа в СКИФ
// Внимание, для работы API на ocStore 3.0.2 необходимо обновить часть файлов из дистрибутива Opencart 3.0.4
'api'=>array('username'=>'Default','key'=>''),
// синхронизировать опции товаров: 0-нет, 1-да. Опции создаются в СКИФ как ОТДЕЛЬНЫЕ товары с названием "Товар // Опция Значение опции"
'use_options'=>0,
// синхронизации изображений: 0-не синхронизировать, 1-хранить и в СКИФ и в OpenCart, 2-хранить в OpenCart по symlink, 3-хранить только в СКИФ (подробнее https://www.webnice.biz/opencart/)
'sync_image'=>0,
// скопируйте в переменную dir_image константу DIR_IMAGE из config.php в корне установки OpenCart
'dir_image'=>'' // имеет вид '/var/www/..../image/' или /home/.../public_html/image/
);

// Модуль синхронизации будет доступен по адресу /scif/?act=sync_opencart и в меню Сервис
$scif_actions[600]=array('name'=>'OpenCart','desc'=>'Синхронизация с OpenCart','file'=>'sync_opencart','menu'=>7);
$scif_actions[601]=array('name'=>'Опция','desc'=>'Добавление опции товаров','file'=>'opencart_option');
$scif_actions[602]=array('name'=>'История OpenCart','desc'=>'История изменения статусов заказа OpenCart','file'=>'opencart_history');
$scif_actions[603]=array('name'=>'Изображения OpenCart','desc'=>'Изображения товаров в OpenCart','file'=>'opencart_images');
$scif_actions[604]=array('name'=>'Возвраты OpenCart','desc'=>'Импорт возвратов из OpenCart','file'=>'opencart_refund','menu'=>3,
'days'=>30,'statuses'=>array(3=>array('name'=>'Готов')));
$scif_actions[605]=array('name'=>'Характеристики','desc'=>'Характеристики товаров OpenCart','file'=>'opencart_attributes','menu'=>2);
$scif_reps[600]=array('name'=>'Оплаты OpenCart','desc'=>'Оплаты за период с указанием номера заказа в Опенкарт','submenu'=>3);
$scif_reps[602]=array('name'=>'История заказов','desc'=>'История заказов Опенкарт по номеру телефона','submenu'=>1);

// Функция обработки заказов в СКИФ в зависимости от статуса заказа в OpenCart. Настройте как Вам требуется.
// (при каких статусах мы преобразуем заказ в Продажу (списываем остатки), вносим оплату, расформировываем и т.д.)
function my_proccess_orders() {
global $row, $sync_opencart;
 if (!$row['scif_id']) { // еще нет заказа в СКИФ, создаем его
 doc_create();
  if (!$row['scif_id']) { return false; } // ошибка создания заказа
 } else { // проверим, не изменился ли состав заказа.
 // мы можете отключить обновление состава заказа в направлении из Опенкарт в СКИФ
 // например, если вы добавляете в СКИФ в заказ товары, отсутствующие в Опенкарт
 // if (!$row['scif_finitem']) { // обновляем состав только для заказов без статусов (незавершенные заказы)
 doc_change();
 }
 // Для заданного в параметре 'statuses_confirmed' перечня статусов преобразуем Заказ покупателя в Продажу
 // (списываем остатки со склада и увеличиваем задолженность покупателя)
 if (isset($sync_opencart['statuses_confirmed']) AND in_array($row['order_status_id'],$sync_opencart['statuses_confirmed'])) {
 doc_change_type(2);
 }
 // Для заданного в параметре 'statuses_paid' перечня статусов внесем оплату
 if (isset($sync_opencart['statuses_paid']) AND in_array($row['order_status_id'],$sync_opencart['statuses_paid'])) {
 // Оплату можно внести только на Продажу, поэтому, сначала проверим, что заказ уже преобразован в Продажу
 doc_change_type(2);
 // Внесем оплату
 doc_payment();
 // В функции также можно указать счет/кассу зачисления и статью движения: doc_payment($account=1, $finitem=0)
 // Например, в зависимости от способа оплаты в OpenCart, внесем оплату на расчетный счет (код 2) или в кассу (код 1)
 // doc_payment(($row['payment_code']=='bank_transfer'?2:1));
 }
 // Для заданного в параметре 'statuses_rejected' перечня статусов преобразуем Продажу в Заказ покупателя
 // (остатки будут возвращены на склад, а задолженность покупателя по данному заказу аннулирована)
 if (isset($sync_opencart['statuses_rejected']) AND in_array($row['order_status_id'],$sync_opencart['statuses_rejected'])) {
 doc_change_type(11);
 }
// обновим статус (статью движения) заказа в СКИФ
doc_update_status();
}

// Пользовательская обработка полей OpenCart, отсутствующих в СКИФ
// (в карточке товара в СКИФ мы будем видеть код соответствующего ему товара в базе OpenCart и возможность менять поля OpenCart, а также добавлять опции товара)
// Файл sync_spritem.php имеет открытый код, вы можете дополнять и видоизменять его под свои потребности.
$sprs[5]['userfields']['opencart']=array('name'=>'OpenCart:','type'=>'virtual','my_edit_field'=>'opencart','my_process_field'=>'opencart');
// Поле в документе для возможности менять статус в OpenCart
$docs_cat['store']['userfields']['opencart']=array('name'=>'OpenCart:','type'=>'virtual','my_edit_field'=>'opencart','my_process_field'=>'opencart');
function my_edit_field($key,$val,$cur_val='') {
global $db, $act, $t, $repl, $row, $row_old, $sync_opencart, $v, $sync_params;
$return='';
 switch ($val['my_edit_field']) {
 case 'opencart':
 $sync_func='my_edit_field';
  if ($act=='spritem') {
  require WN_PATH_INCLUDES.'sync_opencart/sync_spritem.php';
  } elseif ($act=='docitem') {
  require WN_PATH_INCLUDES.'sync_opencart/sync_docitem.php';
  }
 break;
 }
return $return;
}
function my_process_field($key,$val,$cur_val='') {
global $db, $act, $t, $sync_opencart;
$return='';
 switch ($val['my_process_field']) {
 case 'opencart':
 $sync_func='my_proccess_field';
  if ($act=='spritem') {
  require WN_PATH_INCLUDES.'sync_opencart/sync_spritem.php';
  } elseif ($act=='docitem') {
  require WN_PATH_INCLUDES.'sync_opencart/sync_docitem.php';
  }
 break;
 }
return $return;
}

// Добавляем колонку c кодом заказа OpenCart в журнал документов
$scif_actions[3]['my_doclist']=array('head'=>1,'filters'=>1,'sql'=>1,'row'=>1,'foot'=>1);
function my_doclist($type) {
global $cells, $sqls, $row;
 switch ($type) {
 case 'head':
 $cells[0].='<th data-sorter="digit">OpenCart</th>';
 break;
 case 'filters':
 $cells[0].='<td><input id="f_shop_id" size="5" maxlength="8" name="f_shop_id" type="text" value="'.(!empty($_REQUEST['f_shop_id'])?intval($_REQUEST['f_shop_id']):'').'" onchange="items(0)"></td>';
 break;
 case 'sql':
  if (!empty($_REQUEST['f_shop_id'])) {
  $sqls['where'].=($sqls['where']?' AND ':'').'d.shop_id="'.intval($_REQUEST['f_shop_id']).'"';
  }
 break;
 case 'row':
 $cells[0].='<td>'.($row['shop_id']?$row['shop_id']:'&nbsp;').'</td>';
 break;
 case 'foot':
 $cells[0].='<td>&nbsp;</td>';
 break;
 }
}
function scif_meta() {
global $act, $meta;
 // мы добавили еще одну колонку в начало таблицы и потому нужно сдвинуть номер колонки для подсветки Долга с 9 на 10
 if ($act=='doclist') {
 $meta.='<style type="text/css">tr.debt td:nth-child(9) { color:inherit } tr.debt td:nth-child(10) { color:red }</style>';
 }
}
function scif_after_act() {
global $db, $act, $v, $row, $is_change_det, $sync_opencart;
 // обновление состава заказа OpenCart
 if ($act=='docitem' AND $v AND !empty($_POST['shop_id']) AND !empty($sync_opencart['api']['key']) AND $is_change_det) { // AND !empty($_POST['opencart_change_det'])
  if (!defined('INCLUDE_FOLDER')) { define('INCLUDE_FOLDER',WN_PATH_INCLUDES.'sync_opencart/'); }
 require_once INCLUDE_FOLDER.'sync_functions.php';
 opencart_change_det($v,$_POST['shop_id']);
 } // была изменена табличная часть
}
Импорт заказов
Вы можете настроить как сохранять и обрабатывать в СКИФ заказы из OpenCart.
По умолчанию, в СКИФ создается документ "Заказ покупателя". Этот документ является "счетом на оплату", при его создании остатки на складе не уменьшаются и задолженность клиента не увеличивается. Используйте этот вариант, если требуется, чтобы поступившие из интернета-магазина заказы сначала проверил/обработал ваш менеджер. Для формирования из заказа документа отгрузки, просто измените в нём "Вид документа" с "Заказ покупателя" на "Продажа". После этого товары спишутся со склада, а сумма долга покупателя увеличится на сумму документа. Вы также можете задать создание сразу документа "Продажа", для этого замените в файле настроек wn_settings.php в корне установки СКИФ значение "type" в массиве $wn_catalog_invoice с 11 на 2.

Есть несколько вариантов обработки заказов без авторизации:
1. По умолчанию, модуль создает в справочнике контрагентов нового клиента для каждого заказа.
2. Можно задать, чтобы модуль искал среди ранее созданных клиентов по номеру телефона и относил новый заказ на найденного клиента. Для этого установите параметр match_noaut_client=true в настройках модуля (включение данной опции может предотвратить заведение множества записей в справочнике клиентов, но нужно иметь в виду, что Opencart не проверяет номера телефонов и, таким образом, клиент может намеренно или по ошибке указать чужой номер телефона и его заказ будет отнесен на клиента с указанным номером).
3. Можно все заказы, сделанные в Opencart без авторизации, сохранять в СКИФ на одного заданного клиента. Для этого установите в поле shop_id этого клиента в СКИФ значение 0.

Рекомендуется настроить пользовательскую обработку заказов в функции my_proccess_orders(), код которой приведен выше. Для этого задайте в массиве настроек коды статусов заказов из OpenCart, при которых документ нужно преобразовать в "Продажу" (параметр "statuses_confirmed"), внести оплату (параметр "statuses_paid") или расформировать (параметр "statuses_rejected").

В поле "Примечание" по умолчанию копируются номер заказа, комментарий покупатетеля и способ доставки. При желании, вы можете изменить функцию формирования примечания sync_doc_note(), как описано в блоке "Расширение функционала" ниже.

Если в массиве настроек $sync_opencart задать параметр scif_order_type, все заказы из OpenCart, кроме создания документа "Продажа/Заказ покупателя", будут дополнительно сохраняться в журнал "Торговля-Заявки с сайта" (без данных о товарах). Этот журнал может использоваться для контроля обработки заказов из разных источников.
Учет доставки, скидок, купонов и т.п.
В параметре "order_total_codes" можно определить массив кодов из таблицы OpenCart order_total и соответствующие им коды из номенклатуры СКИФ, которые нужно вносить в состав заказа (табличную часть) в документ СКИФ. Для этого создайте в номенклатуре СКИФ нужные вам позиции-услуги "Доставка", "Ваучер", "Сертификат", "Скидка" и т.д. и внесите их коды в массив, например:
'order_total_codes'=>array('shipping'=>1054,'coupon'=>1055)
(можно для нескольких кодов определять одну и ту же услугу из СКИФ. Например, "Купон/Ваучер"
'order_total_codes'=>array('shipping'=>1054,'coupon'=>1055,'voucher'=>1055)
Если будут использоваться отрицательные суммы, включите в меню Сервис-Настройки в СКИФ опцию "разрешить минусовые цены".

Если массив не задан или в таблице order_total OpenCart есть коды, которые в этом массиве не определены, сумма по этим позициям будет вноситься в поле "Накладные расходы". Это поле, в отличие от внесения строк в табличную часть, не изменяет суммы документа и не фигурирует в отчетах по оборотам. Этот вариант может пригодиться, например, когда доставка осуществляется сторонней организацией, деньги клиент платит ей напрямую и вы не хотите учитывать её стоимость в своих отчетах.
Активация API для обновления статусов и состава заказов из СКИФ
Чтобы иметь возможность менять статус и состав заказа в OpenCart из СКИФ, необходимо настроить в СКИФ доступ к API OpenCart. Для этого проделайте следующее:
1. В админке OpenCart зайдите в Система -> Пользователи -> API. Если API еще не создано - создайте (введите имя API, сгенерируйте ключ, включите статус). Если уже создано - в открывшемся окне во вкладке IP адресов добавьте IP-адрес СЕРВЕРА (не своего компьютера!), сохраните. Адрес сервера можно посмотреть в меню СКИФ Сервис -> OpenCart, в блоке "Настройки" пункт "Доступ к API".
2. В админке OpenCart в меню Система -> Настройки, откройте настройки магазина, во вкладке "Опции" в выпадающием списке "Пользовательский API" выберите имя, созданное на предыдущем шаге, и сохраните настройки. Если API в OpenCart уже было создано ранее, посмотрите, какое имя пользователя используется в настройках магазина. В СКИФ нужно будет указать это же имя.
3. В массиве $sync_opencart в параметр api внесите значения username и key.
4. В параметре https_server укажите адрес сайта (должен совпадать с константой HTTPS_SERVER из файла config.php в корне установки OpenCart)

После этого, внизу страницы редактирования документа в СКИФ у вас появится строка "OpenCart", где будет возможность изменить статус заказа, в том числе указать примечание к этому изменению и отметить галочку отправки уведомления пользователю. При изменении статуса заказа, будут запущены все завязанные на него события (так называемые "триггеры"): начисление бонусных баллов, отправка письма клиенту и другие. Т.е. это изменение будет точно таким, как если оно было выполнено в самом OpenCart.

Внимание, если вы используете ocStore 3.0.2, некоторые скрипты в нем содержат ошибки, из-за которых API неработоспособно. Для исправления необходимо переписать 3 файла из дистрибутива Opencart 3.0.4: \catalog\controller\api\login.php, \catalog\controller\startup\session.php, \catalog\model\account\api.php

Обратите также внимание, что в Opencart3 разработчики изменили подход к редактированию заказа и теперь при каждом редактировании состава заказа покупателю отправляется уведомление "Заказ принят". Отключить это можно, только закомментировав в скрипте Opencart catalog/model/checkout/order.php строку 49 $this->addOrderHistory($order_id, 0); Подробнее о проблеме на GitHub
Варианты синхронизации изображений
Вариант синхронизации изображений задаётся в переменной sync_image и может иметь следующие значения: 0 (не синхронизировать), 1 (хранить и в СКИФ и в OpenCart), 2 (хранить в OpenCart по symlink), 3 (хранить только в СКИФ). Подробнее об этих вариантах:

0 - Не синхронизировать.
Изображения не будут синхронизироваться автоматически. Их можно будет загружать вручную как в панели управления OpenCart, так и в карточке товара в СКИФ. Возможно также настроить показ изображений из OpenCart в справочнике номеклатуры СКИФ.
Этот вариант рекомендуется, если вы начинаете вести учет на базе уже имеющегося магазина, основная часть товаров и изображений в котором уже была загружена ранее через OpenCart.

1 - Хранить и в СКИФ и в OpenCart.
Изображения, загруженные в СКИФ, будут копироваться из папки СКИФ в папку OpenCart.
Минус этого способа в том, что изображения на сайте будут храниться в двух копиях, занимая лишнее место на диске.
Плюс в том, что обе копии автономны. Это актуально, если на папке загруженных ранее изображений "завязаны" какие-то сторонние сервисы или плагины.
Этот способ рекомендуется, если вы будете создавать один магазин на OpenCart, второй магазин на движке СКИФ.
Для использования данного способа скопируйте из скрипта config.php в корне установки OpenCart значение константы 'DIR_IMAGE' и вставьте его в параметр dir_image массива $sync_opencart.

2 - Хранить в OpenCart по symlink.
СКИФ будет загружать изображения в стандартную директорию загрузки изображений OpenCart, при этом изображения будут храниться в одной копии и будут доступны и в СКИФ и в OpenCart. Этот вариант рекомендуется, если у вас уже есть загруженная база товаров с изображениями в СКИФ и вы создаете магазин на OpenCart.
Для использования данного способа проделайте следующее:
2.1. Переместите папки /img/scif1/ и /img/scif1_orig/ со всем их содержимым из директории установки СКИФ в папки /image/catalog/scif1/ и /image/catalog/scif1_orig/ в директории установки OpenCart
2.2. Создайте на их месте две ссылки с именами scif1 и scif1_orig, ссылающиеся на соответствующие адреса перемещенных папок. (Ссылки можно создать в файловом менеджере из панели управления хостингом. Для панели ISPManager меню Главное - Менеджер файлов, кнопка Создать, Тип: Ссылка)

3 - Хранить только в СКИФ.
OpenCart будет использовать изображения, загруженные в СКИФ. Изображения будут храниться только в папке СКИФ, что сэкономит место на вашем хостинге, но для данного способа требуется внести некоторые изменения в скрипты OpenCart. Эти изменения разрешают использовать другую папку для изображений вместо стандартной /images/catalog/ и использовать в качестве картинок файлы с расширением img. Для использования данного способа скачайте архив и следуйте инструкции в файле readme.txt из архива.

6 Проверьте настройки
Перейдите на страницу /scif/?act=sync_opencart (или через меню Сервис-OpenCart) чтобы проверить настройки. Если в OpenCart ранее были внесены товары, вы сможете выполнить импорт справочников и остатков.

7 Выполните импорт (если необходимо)
Если в вашем интернет-магазине есть внесенные ранее товары и производители, вы можете импортировать их в СКИФ. Для этого на странице /scif/?act=sync_opencart нажмите ссылку "Импорт справочников из OpenCart". После импорта данных, если в настройках вами была задана синхронизация изображений, вам будет предложено скопировать все картинки.
ИМПОРТ СПРАВОЧНИКОВ ИЗ OPENCART
1. Обратите внимание, что в СКИФ по умолчанию в справочниках названия групп, элементов и SEO URL (ЧПУ) должны быть уникальными. В справочнике товаров, кроме того, уникальным должно быть поле "Штрихкод" (barcode). Для успешного импорта, обеспечьте уникальность этих полей в OpenCart или уберите условие уникальности в СКИФ. Чтобы убрать условие уникальности, в phpmyadmin измените тип индексов `name` и `parent_name` с UNIQUE на INDEX.

2. В СКИФ по умолчанию в справочнике номенклатуры разрешено только два уровня вложенности. Если структура ваших категорий в OpenCart имеет больше уровней, добавьте в конец файла настроек wn_settings.php в корне установки СКИФ (это можно сделать через меню Сервис-Редактор кода) следующую строку, она разрешит неограниченный уровень вложенности групп для справочника товаров:
$sprs[5]['multilevel']=true;

3. В товарном учете нельзя использовать товары с несколькими опциями. Перед импортом справочника необходимо либо разделить товары, либо переделать опции в "сводные". Например, если у товара "Футболка" есть опции "Цвет" и "Размер", необходимо заменить её на одну "Цвет/Размер" со значениями "Красная L", "Красная M", "Синяя L" и т.д. Каждая опция будет создана в учете как отдельный товар.

8 Автоматизируйте синхронизацию (по желанию)
Проверьте работу синхронизации, нажав кнопку "Выполнить синхронизацию" внизу страницы. Если всё в порядке (не выводится никаких ошибок, товары и остатки из СКИФ перенеслись в OpenCart, а заказы из OpenCart в СКИФ), вы можете задать выполнение синхронизации в автоматическом режиме по расписанию через планировщик CRON. Для выполнение через планировщик добавьте вызов скрипта /cron/sync.php с нужным вам расписанием в CRON на своем хостинге.
Проверить, что синхронизация по планировщику выполняется корректно, можно на странице /scif/?act=sync_opencart. Внизу после кнопки "Выполнить синхронизацию" будет выводиться время последней успешной синхронизации.


9 Оптимизация быстродействия OpenCart (рекомендуется)
Мы рекомендуем добавить в базу OpenCart несколько индексов для улучшения его производительности. Эти индексы не связаны с модулем синхронизации, вы можете найти аналогичную рекомендацию в поисковых системах по запросу об оптимизации быстродействия OpenCart.
ИНДЕКСЫ ДЛЯ ПОВЫШЕНИЯ ПРОИЗВОДИТЕЛЬНОСТИ
Для добавления индексов выполните следующий SQL-запрос (это можно сделать через /admin/phpmyadmin/). Для OpenCart 3 используйте только первые две строки. Если префикс таблиц в вашей базе отличается от "oc_", предварительно замените его на нужный.
ALTER TABLE oc_order_history ADD INDEX order_id (order_id);
ALTER TABLE oc_order_option ADD INDEX order_product (order_id, order_product_id);
ALTER TABLE oc_order_product ADD INDEX order_id (order_id);
ALTER TABLE oc_product_option ADD INDEX product_id (product_id);
ALTER TABLE oc_product_option ADD INDEX option_id (option_id);
ALTER TABLE oc_product_option_value ADD INDEX product_id (product_id);
ALTER TABLE oc_product_option_value ADD INDEX option_id (option_id);

Это всё! Теперь Ваш складской учет и интернет-магазин автоматически синхронизируются!
Остались вопросы или нужна доработка синхронизации под Ваши потребности? Напишите нам biz@webnice.biz

Персональные настройки и доработки

Важным преимуществом нахождения базы и скриптов системы учета на вашем собственном сайте является то, что вы можете настраивать и дорабатывать систему под свои индивидуальные потребности. Вы можете делать это самостоятельно или заказывать нам. Ниже мы приводим примеры кода расширения функционала интеграции. РАСШИРЕНИЕ ФУНКЦИОНАЛА
Формирование примечания к заказу.
По умолчанию, в поле "Примечание" копируются номер заказа, комментарий покупатетеля и способ доставки. При желании, вы можете задать собственную функцию, для этого добавьте в файл настроек wn_settings.php в корне установки СКИФ следующий код (это можно сделать через меню "Сервис-Редактор кода"):
function sync_doc_note() {
global $row;
// в shipping_method могут быть как теги (например, картинки), так и кавычки, потому используем и strip_tags и htmlclean
return $row['order_id'].($row['comment']?' '.htmlclean($row['comment']):'').($row['shipping_method']?' '.htmlclean(strip_tags($row['shipping_method'])):'');
}

Вывод в СКИФ полей из OpenCart и поиск по ним.
Например, сделаем возможность вывода в списке номенклатуры СКИФ поля "Модель" и поиска по нему. Обратите внимание, что в таблице товаров СКИФ этого поля нет. В коде ниже мы приводим пример подключения к таблице товаров СКИФ таблицы товаров OpenCart. Добавьте в файл настроек wn_settings.php в корне установки СКИФ следующий код (это можно сделать через меню "Сервис-Редактор кода"):
// в справочник номенклатуры добавим вывод полей Модель и Статус и поиск по полю Модель
// в справочник статей движения добавим ID статуса из OpenCart
$sprs[5]['my_sprlist']=array('head'=>1,'sql'=>1,'row'=>1,'search'=>1);
$sprs[10]['my_sprlist']=array('head'=>1,'sql'=>1,'row'=>1);
function my_sprlist($type) {
global $t, $m, $row, $sqls, $cells, $sync_opencart;
 switch ($t) {
 case 5: // номенклатура
  switch ($type) {
  case 'head':
  // в форме подбора в документ добавляем ко второй колонке, в справочнике - к первой
   if ($m==1) {
   $cells[2].='<th data-sorter="text">Модель</th><th data-sorter="text">Статус</th>';
   } else {
   $cells[1].='<th data-sorter="text" rowspan="2">Модель</th><th data-sorter="text" rowspan="2">Статус</th>';
   }
  break;
  case 'sql':
  $sqls['from'].=' LEFT JOIN '.$sync_opencart['shop_prefix'].'product o ON s.shop_id=o.product_id';
  $sqls['select'].=', o.model, o.status';
  break;
  case 'row':
  $index=($m==1?2:1);
  $cells[$index].='<td>'.($row['model']?$row['model']:'&nbsp;').'</td><td class="status-'.($row['status']?'yes">+':'no">-').'</td>';
  break;
  case 'search': // подбор в документ
  $sqls['from'].=' LEFT JOIN '.$sync_opencart['shop_prefix'].'product o ON s.shop_id=o.product_id';
  $sqls['select'].=', o.model';
  break;
  }
 break;
 case 10: // статьи движения
  switch ($type) {
   case 'head':
    $cells[2].='OC';
   break;
   case 'sql':
    $sqls['select'].=', s.shop_id';
   break;
   case 'row':
    $cells[2].=''.$row['shop_id'].'';
   break;
  }
  break;
 }
}

// Поиск по полю "Модель" в справочнике номенклатуры (для подбора в документ в my_sprlist должна быть задана обработка search!)
$sprs[5]['filter_fields']['model']=array('name'=>'Модель','func'=>true);
$sprs[5]['filter_fields']['name_model']=array('name'=>'Название-Модель','func'=>true);
function my_filter_fields($t,$field,$filter) {
 switch ($t) {
 case 5: // Номенклатура
  switch ($field) {
  case 'model':
  return 'o.model LIKE "%'.$filter.'%"';
  break;
  case 'name_model':
  return 'CONCAT(s.name," ",o.model) LIKE "%'.$filter.'%"';
  break;
  }
 }
}
После этого в справочнике номенклатуры в СКИФ появятся поля "Модель" и "Статус" из OpenCart, а в списке полей фильтров появятся варианты "Модель" и "Название-Модель" (для сводного поиска как по названию так и по модели).

Стили оформления в зависимости от данных.
В СКИФ можно задать разное оформление в зависимости от данных. В примере ниже для справочника номенклатуры задается разный цвет в зависимости от "Статуса" товара в OpenCart. А для журнала документов разный фон колонки "Статья движения", в зависимости от статуса заказа в OpenCart.
// собственные стили
function scif_meta() {
global $act, $t, $meta;
 // стиль колонок в справочнике номенклатуры
 if ($act=='sprlist' AND $t==5) {
 $meta.='<style type="text/css">
 td.status-yes { text-align:center; color: green; }
 td.status-no  { text-align:center; color:red; }
 </style>';
 } elseif ($act=='doclist') {
 $meta.='<style type="text/css">
 tr.finitem45 td:nth-child(15) { background-color:#bf0000; color:#ffffff; }
 tr.finitem47 td:nth-child(15) { background-color:#ffffff; color:#00007f; }
 </style>';
 }
}

Работа с листом ожидания OpenCart (плагин WaitList) из СКИФ.
После сохранения документов "Оприходование" или "Покупка" проверим и выведем сообщение, если товары из листа ожидания появились в наличии. Можно выполнить email-рассылку клиентам по листу ожидания прямо из СКИФ со страницы ?act=opencart_waitlist.
$scif_actions[650]=array('name'=>'OpenCart Waitlist','desc'=>'Рассылка уведомлений по листу ожидания OpenCart','file'=>'opencart_waitlist','menu'=>7);
function scif_after_act() {
global $db, $act, $row_new, $sync_opencart;
 if ($act=='docitem' AND !empty($_POST['submit']) AND in_array($row_new['type'],array(1,3))) {
 $waitlist=$db->sql_fetch_row($db->sql_query('SELECT COUNT(DISTINCT w.product_id)
 FROM `'.$sync_opencart['shop_prefix'].'waitlist` w
 JOIN `'.SCIF_PREFIX.'spr_noms` n ON w.product_id=n.shop_id
 WHERE n.store'.$sync_opencart['scif_store'].'>0'));
  if ($waitlist AND $waitlist[0]) {
  echo '<div class="panel_top"><span style="color:red">Внимание!</span> Есть <b>'.$waitlist[0].'</b> товара(ов) в наличии из <a href="?act=opencart_waitlist" target="_blank">Листа ожидания</a></div>';
  }
 }
}

Пользовательская функция.
Вы можете задать в файле настроек wn_settings.php пользовательскую функцию my_sync_shop_after(), которая будет выполняться после каждой синхронизации.

Пример 1. Синхронизируем акционные цены на товары.
Cоздайте через меню "Справочники-Типы цен" новый тип цен, заполните цены этого типа равными продажным ценам (это можно сделать через меню "Торговля-Ценообразование"), а затем проставьте акционную цену нужным товарам. В файл настроек внесите следующий код (замените в коде price3, если код вашего типа акционных цен не 3).
(Этот же механизм можно использовать для формирования разных цен для разных групп клиентов, например, для опта)
function my_sync_shop_after() {
global $db, $sync_opencart;
$db->sql_query('LOCK TABLES '.$sync_opencart['shop_prefix'].'product_special WRITE, '.SCIF_PREFIX.'spr_noms WRITE');
$db->sql_query('TRUNCATE TABLE '.$sync_opencart['shop_prefix'].'product_special');
$db->sql_query('INSERT INTO '.$sync_opencart['shop_prefix'].'product_special
(product_id, customer_group_id, priority, price, date_start, date_end)
SELECT shop_id, 1, 0, price3, "0000-00-00", "0000-00-00"
FROM '.SCIF_PREFIX.'spr_noms
WHERE price3>0 AND price3<price2 AND shop_id IS NOT NULL AND shop_option_id IS NULL');
$db->sql_query('UNLOCK TABLES');
}

Пример 2. Формирование своего тега TITLE для новых товаров.
function my_sync_shop_after() {
global $db, $sync_opencart;
$db->sql_query('UPDATE '.$sync_opencart['shop_prefix'].'product_description
SET meta_title=CONCAT(name," ваш текст добавляемый к названию") WHERE meta_title=""');
}

Больше примеров кода смотрите в FAQ.

P.S. Дистрибутив СКИФ включает также собственный интернет-магазин, который напрямую интегрирован с системой учета. Если вы только выбираете движок для своего интернет-магазина, просто установите СКИФ и у вас будет складской учет, сайт и интернет-магазин. Подробнее.
Вы также можете при помощи СКИФ организовать работу второго интернет-магазина, отдельного от OpenCart, например, для акцента на других товарных категориях. Данные всех магазинов будут аккумулированы в единой системе учета.
Закажите интеграцию складского учета с OpenCart в каталоге или отправив письмо на адрес biz@webnice.biz