>
Расширение системы, которые при необходимости можно подключить в качестве дополнительной функционалните.
Непосредственно на работу основной системы не влияют.
Подключить нужный модуль можно на странице администратора, после перелоги появляются соответствующие пункты меню.
Модуль для складской программы позволяет получать новые заказы из магазина, обновлять в магазине
статус выполненных заказов, добавлять в магазин новые товары, а также обновлять со склада количество
и цены товаров
Для работы необходимо установить приложение для Опенкарт. Дополнение расширяет стандартное API
и может использоваться для интеграции с другими программами.
Дополнение к ИМ расположено на GitHub, там же
описание и руководство по установке
Для автоматической синхронизации (обновление цен, количества и импорта заказов) в корне проекта есть скрипт
cron_updateoc.php,
который можно добавить к системному планировщику (cron или task sheduler). Также его можно вызвать по адресу
https://<адрес сайта>/cron_updateoc.php. В начале скрипта устанавливается название статуса, с которым импортируются
заказ.
В Модуле->Опенкарт->Настройки нужно указать адрес ИМ, а также аккаунт API, который создается в административной панели Опенкарт.
На странице Модули-> Опенкарт-> Заказы в складской системе выбираем статус заказов ИМ, которые считаются новыми и загружаем список из магазина. Затем импортируем в складскую программу. На каждую запись создается документ Заказ. На этой странице можно обновить статусы заказов в ИМ после их обработки.
На странице Модули->Опенкарт->Товары можно экспортировать новые товары со склада в магазин, а также импортировать из магазина, если товар там оказался раньше. Соответствие товаров обеспечивается по артикулу (SCU). Также можно в любой момент восстановить в магазине цены и количество в соответствии с составом.
Модуль по функциональности аналогичен модулю интеграции с Опенкартом.
В Модуле-> WooCommerce-> Настройки
необходимо указать адрес ИМ, а также ключи, создаваемые в административной панели магазина.
Небольшой модуль онлайн каталога встроен со складским учетом. Особенность каталога -
иерархическая система атрибутов товара,
что позволяет автоматически генерировать фильтры поиска товара и страницу сравнения.
К примеру, для категории бытовая техника можно задать атрибуты Вес и Размеры.
Выставить каталог домашней страницей можно в настройках модуля.
Перейти в админку можно по адресу http://<адрес сайта>/store.
На основе заказов магазина автоматически создаются заказы в журнале заказов.
Для настройки магазина необходимо выбрать состав и указать его в настройках модуля
Интернет-магазин.
После этого товары будут доступны в редактировании каталога в модуле магазина.
Для отображения в каталоге в справочнике должен быть тип Товар и указанная категория.
Дизайн по дефолту – на Twitter Bootstrap.
Для работи модуля должен работать mod_rewrite в Apache для обработки .htaccess
Органайзкр хранения неструктурированных данных в иерархическом виде. По сути, встроен проект Notty. Поскольку пользователи есть пользователями одной корпоративной системы, добавлена возможность совместного просмотра и редактирования топиков.
Менеджер задач. Позволяет назначать сотрудникам различные задачи, что позволяет контролировать ход.
исполнение.
Для задач можно указать приоритет, текущий статус, время выполнения на каждом этапе,
добавлять комментарии и прикреплять файлы. клиентов. Задания группируются в проекты.
Также есть возможность для сотрудников фиксировать проделанную работу в тайм-трекере.
с указанием номера задания.
Для администратора есть таблица статистики по проектам и сотрудникам.
Бот создается стандартным способом при помощи @BotFather. Токен, который будет при этом сгенерирован, вводится в общих настройках. После этого нужно активировать диалог с новосозданным ботом. Список команд – /help. Чтобы получать сообщения, нужно залогиниться тем же способом, как и на сайте.
API предназначен для интеграции с посторонними системами и мобильными приложениями.
С помощью API можно синхронизировать справочники номенклатуры и контрагентов,
получать и создавать документы и т.д.
Описание API по адресу <сайт состава>/api/help
Пример клиенту для работы с API
В программе могут быть использованы два типа принтеров – широкий (А4) и узкий (чековый).
Широкий принтер предназначен для вывода печатных форм первоначальных документов (накладных и т.п.).
Подключается как обычный системный принтер и не требует каких-либо настроек в программе.
Узкий принтер предназначен для печати чеков, квитанций, ценников и этикеток.
Может быть подключен как системный или, при низком качестве печати, через дополнительное ПО (сервер печати). Тип подключения
задается в профиле пользователя.
Для узкого принтера создаются отдельные шаблоны печатных форм в папке templates/printform,
структура которых зависит от типа подключения.
Если принтер подключен как системный, его печатные формы содержат html разметку и как формы стандартного широкого принтера, а
печать производится браузером через системный драйвер.
Если принтер подключен к серверу печати (см. ниже), печатные формы (с суффиксом _ps или _ts ) содержат специальную разметку в XML, которая соответствует
набор команд принтера.
Узкие принтеры обычно поддерживают один из двух (или оба) режимов печати – receipt (ESC/POS) для чеков
и метка (tspl/tspl2) для этикеток. В настройках принтера (пользовательский профиль) необходимо установить в каком режиме принтер.
(Этикетки можно печатать в режиме receipt).
В режиме label можно использовать Zebra и другие срочные протоколы для tspl/tspl2.
Шаблоны для чекового (receipt) режима хранятся в файлах с именем, заканчивающимся на _ps
(например, poscheck_bill_ps.tpl) для режима label на _ts (например, item_tag_ts.tpl ).
Как и все шаблоны их можно катомизировать добавив к концу имени _custom чтобы не перезатирало при обновлении. Наприлад item_tag_ps_custom.tpl
Для разметки шаблонов соответственно используются специальные теги, преобразуемые в ESC/POS команды (см. ниже)
или непосредственно команды tspl/rspl2 (см. документацию к принтеру)
printforms/item_tag.tpl - шаблон этикетки товара
printforms/item_qr.tpl - шаблон QR кода товара
printforms/item_sticker.tpl - шаблон стикера весового товара
printforms/pays_bill.tpl - квитанция об оплате
printforms/doc/*_bill.tpl - остальные шаблоны отвечают названиям документов
Шаблон должен соответствовать структуре XML. Как правило, метки определяют соответствующие команды для принтера.
Теги могут содержать обязательные или необязательные атрибуты. Также реализация некоторых тегов как, например,
cut или beep зависит от модели принтера. Некорректно указанные тэги будут пропущены.
Описание тегов
Тег
Прмер
Описание
text
<text>Hi, dude</text>
Текст в UTF-8
font
<font>a</font>
Шрифт (a или b). Млжет иметь атрибут bold="true"
size
<size height="2" width="2"></size>
Размер текста. Обязательные атрибуты height и width. значения- коеффициенты ( 1 - 8)
align
<align>center</align>
Выравнивание (left, center, right)
separator
<separator>*</separator>
Строка повторяющегося символа
barcode
<barcode type="code128">1234567890</barcode>
Штрих код. Обязательный атрибут type ('code128','code39','EAN13').
Может иметь атрибуты height (0-255)
и width (2 - 6)
qrcode
<qrcode>http://mysite.ua/</qrcode>
QR код. Может иметь атрибут size от 1 до 24. Например size="12"
newline
<newline></newline>
Перевод строки
cash
<cash>2</cash>
Открыть касовый ящик. Пин 2 или 5
cut
<cut></cut>
Отреэать после печати.
partialcut
<partialcut></partialcut>
Надрезать после печати.
beep
<beep></beep>
Звуковой сигнал
color
<color>0</color>
Цвет. Может иметь значения 0 або 1
commands
<commands>27,116,17</commands>
Последовательность команд принтера. Байты (0 - 255) через запятую
row,col
<row>
<col length="22" >11.11.2022</col><col align="left" length="10"
>100.00</col>
</row> Печать данных по колонкам в виде таблицы. Колонка должна иметь обязательный атрибут length – ширина
столбца в символах.
Сумма не может превышать ширину печати, заданную в настройках (по умолчанию 32 символа). Колонка
может иметь атрибут align="left" для выравнивания
текст внутри колонки. Выходящий за пределы колонки текст будет обрезан.
Длч реализации логоки в шаблонах используется синтаксис шаблонизатора Mustache
Поскольку приложение работает в онлайн режиме через браузер - подключение принтеров (кроме системного принтера на который брауэр может печатать напрямую)
и торгового оборудования проблематично без вспомогательного обеспечения.
POS сервер реализован как локальный веб-сервер, принимающий команды, отправляемые из браузера как на любой другой веб-сервер
и выполняет роль промежуточного звена
POS сервер выполнен в двух вариантах для Виндовса и кроссплатформен для NodeJs.
Оба решения – проекты с открытым кодом, расположенные на GitHub в соответствии с адресами
POS Server Net (Windows)
POS Server Node
Для виндовс можна загрузить готовую сборку
В обоих проектах реализован режим принт сервера для чековых принтеров и принтеров этикеток, подключаемых по USB.
Реализация других режимов зависит от оборудования и полагается на сторонних разработчиков. Для работы с складом в серверах
предусмотрен конкретный интерфейс обмена (API) командами и данными, понимаемый складской программой, одинаков для любого оборудования.
Адрес и порт серверов задается в appsettings.json и config.json соответственно По умолчанию http://127.0.0.1:8080. Серверы должны
быть расположенным на том же компьютере или в той же локальной сети, где пользователь попадает из браузера.
Проверить что сервер стартовал нормально можно, набрав в браузере http://127.0.0.1:8080/check.
Разумеется, сервер может быть добавлен в меню автостарта Виндовс.
Данная реализация может быть в качестве примера - POS сервер может быть реализован на любом другом технологическом стеке, если будет реализован аналогичный интерфейс обмена
с составом.
Подключение принтера через сервер печати позволяет выводить информацию (включая штрих коды) непосредственно
с помощью специальных команд принтера, что обеспечивает лучшее качество печати.
То есть специализированная чековая информация выводится предназначенными для этого аппаратными и программными средствами.
Обе программы можно проверить из браузера, набрав http://127.0.0.1:8080/testprint ( http://127.0.0.1:8080/testprintlabel для принтера этикеток в режиме Label).
Должна напечататься срок на принетре.
В варианте принт сервера для виндовс в конфигурационном файле appsettings.json должно быть прописано название принтера соответственно тому как оно записано в системе
в списке принтеров.
Рабочий адрес (по умолчанию http://127.0.0.1:8080 ) залвется в профиле пользователя CRM.
Поддержка фискального регистратора включается на странице общих настроек. Далее в справочнике POS терминалов
нужно запрограммировать поддержку конкретного устройства, написав соответствующий JavaScript обработчик.
Отправка данных на регистратор происходит в момент проведения чека. Чек возврата следует создавать в списке чеков в АРМ кассира
чтобы отправка выполнилась на текущий регистратор.
Скрипт обработчика – реализация встроенной функции callFR
function callFR(check,callback) {
<кастомный код>
}
Де
{
"type": "C",
"number": "K-0023",
"cashier": "Сидоров",
"totalamount": "198", сумма по документу
"payamount": 198, к оплате
"bonus": 0, списаные бонусы
"discount": 0, общая скидка
"rest": 0, сдача если есть
"nal": 0, нал
"beznal": 0, безнал
"prepaid": 0, предоплата
"credit": 0, в долг (послеплата)
"payed": 198, принятая от покупателя оплата
"slogan": "", фраза в конце чека (типа Спасибо за покупку)
"items": [ список позиций
{
"id": "476",
"article": "2233", артикул
"name": "Canon EOS 5D",
"qty": 2,
"price": 99,
"bar_code": штрих-код если задан в справочнике ТМЦ
}
]
}
{
fn: фискальный номер, возвращенный регистратором
}
или, если ошибка
{
error: текст ошибки, возвращенный регистратором
}
в случае ошибкти фискализацтю можно повторить в АРМ кассира.
var rows=[]
if(isNonEmptyString(check.cashier)) { //isNonEmptyString - встроеная функция проверки строки
rows.push({"C":{"cm":"Касир:"+check.cashier}})
}
for(let item of check.items) {
rows.push({
"code":item.id,
"name":item.itemname,
"price":item.price,
"qty":item.qty
})
}
if(check.nal >0) {
rows.push({"P":{"sum":check.nal}})
}
if(check.beznal >0) {
rows.push({"P":{"sum":check.nal,no:4}})
}
var body={
"F":rows
}
if(check.type=="R") {
body={
"R":rows
}
}
var opt={
method: 'POST' ,
headers: {
'Content-Type': 'application/json'
},
body: body
};
fetch(IP+"/cgi/chk",opt) //запрос к регистратору
.then((response) => {
return response.json();
})
.then((data) => {
if( isNonEmptyString(data.DI) ){
callback( { dn:data.DI } )
}
})
.catch(function (error) {
callback( { error:error} )
})
Поддержка весов включается в общие настройки. В профиле пользователя,
в поле скрипта нужно записать скрипт, что вернет значение веса из весов.
Скрипт – реализация встроенной функции callScale
function callScale(callback) {
<кастомный код>
}
где callback - функцмя которой должно быть передано значение измеренного веса
fetch(url ,opt)
.then((response) => {
return response.json();
})
.then((data) => {
callback(data.weight)
})
сообщение в обработчике ошибок:
toastr.error(строка ошибки)