Использование кассовых регистраторов

1. Общие положения.

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

Различия между моделями заключается в следующем:

- терминальная:
предполагалось подключение КР либо напрямую к последовательным портам
сервера приложений, либо через dumb-терминалы, сидящие на таких линиях.

- клиент-серверная:
предполагается подключение КР к произвольным компьютерам в сети,
выполняющим программу "кассовый сервер". На сервере приложений выполняется
программа-клиент, общающийся с кассовым сервером по сети TCP/IP. В
простейшем случае обе программы - клиент и сервер - могут выполняться на
одной и той же машине.

Пока в этой системе поддерживаются два типа кассовых регистраторов:

- МАРІЯ-301 (Объединение "Резонанс", Кривой Рог, Украина)
- АМС-100Ф (Фирма "Версия-Т", Калуга, Россия)

Поддержка касс Datecs/Samsung, имевшаяся в терминальной версии, пока
отсутствует (за неимением спроса).


2. Состав программных средств для работы с КР.


libdev/

iceb_server - кассовый сервер;

buhg/

mariq - настройка КР (внешний вид чека, налоги, режимы, etc)

rozn - розничная торговля

xpro - оптовая торговля




3. Особенности сборки для поддержки АМС-100Ф

Поскольку протокол работы АМС-100Ф производителем не предоставляется -
для его работы требуется библиотека libchon100.so, распространяемая
производителем этих аппаратов на коммерческой основе.

Если у вас эта библиотека имеется, то:

1) скопируйте файл libchon100.so в директорию /lib и выполните команду

ldconfig

2) поскольку поставляемый производителем заголовочный файл chon100.h не
приспособлен к сборке c++ - перед помещением его в директорию
/usr/include примените к нему следующий патч:

-----------------------------cut-----------------------------------------
--- chon100.h.orig 2002-04-26 20:36:25 +0300
+++ chon100.h 2003-05-07 08:13:31 +0300
@@ -40,4 +40,7 @@
#define errRemovedQty 55

+#ifdef __cplusplus
+extern "C" {
+#endif
extern int cbAddBottomLine(char *Line);
extern int cbAddSale(char *Name, double Price, double Qty, int Section);
@@ -94,3 +97,6 @@
extern void SetSupplierCode(char *Code);
extern int UnLock(void);
-extern PrintCheck(void);
+extern int PrintCheck(void);
+#ifdef __cplusplus
+}
+#endif
-----------------------------cut-----------------------------------------

3) при сборке укажите configure ключ --enable-amc


4. Настройка кассового сервера

Формат командной строки запуска кассового сервера:

iceb_server [--test] [--model=MARIA-301|AMC-100F] device


где


--test - имитировать работу с КР, выполняя все действия,

за исключением непосредственной отправки команд

устройству (умолчание - выкл.);

--model - указывается конкретный тип КР (умолчание - MARIA-301)

device - файл устройства COM-порта, к которому подключен KP

(в случае АМС-100Ф может быть только /dev/ttyS0 или

/dev/ttyS1).


Каждый кассовый регистратор на машине должен обслуживаться своей копией
кассового сервера, подключенного с помощью демона (x)inetd к своему
TCP-порту.



ПРИМЕР.

Допустим, к портам ttyS0 и ttyS1 компьютера kassa.my.net подключены два
кассовых аппарата - МАРІЯ-301 и АМС-100Ф соответственно. Адрес сети,
в которой находится компьютер - 192.168.10.0, и мы хотим иметь возможность
запуска клиентских программ для использования этих устройств
на любой из машин этой сети.


Рассмотрим установку кассового сервера по шагам:


1) выбрать для регистраторов свободные TCP-порты и вписать их определения в
файлы /etc/services на клиентской и серверной машинах в виде (имена -
произвольные):

iceb-maria 7654/tcp # КР МАРІЯ-301
iceb-amc 7655/tcp # КР АМС-100Ф

2) подключить свою копию сервера к каждому из портов.
В случае использования inetd необходимо в его конфигурационный файл (обычно
/etc/inetd.conf) записать:

iceb-maria stream tcp nowait root /usr/local/bin/iceb_server iceb_server --model=MARIA-301 /dev/ttyS0
iceb-amc stream tcp nowait root /usr/local/bin/iceb_server iceb_server --model=AMC-100F /dev/ttyS1

В случае xinetd - поместить в его конфигурационную директорию (обычно
/etc/xinetd.d) файлы для каждого из КР:

iceb-maria:
--------------------------cut--------------------------------
# default: off
# description: Cash register MARIA-301
service iceb-maria
{

disable = no

socket_type = stream

protocol = tcp

wait = no

user = root

server = /usr/local/bin/iceb_server

server_args = --model=MARIA-301 /dev/ttyS1

only_from = 192.168.10.0/24
}

--------------------------cut--------------------------------

iceb-amc:
--------------------------cut--------------------------------
# default: off
# description: Cash register AMC-100F
service iceb-amc
{

disable = no

socket_type = stream

protocol = tcp

wait = no

user = root

server = /usr/local/bin/iceb_server

server_args = --model=AMC-100F /dev/ttyS1

only_from = 192.168.10.0/24
}

--------------------------cut--------------------------------

После чего - рестартовать соответствующий демон.
Теперь можно проверить, подключились ли кассовые сервера, например, с
помощью программы telnet:

telnet kassa.my.net iceb-maria


Если все хорошо - вы увидите ответ:


OK MARIA-301 V1.1 /dev/ttyS0




5. Установка клиентских программ.

Связанную комбинацию ТЕРМИНАЛ <-> КАССОВЫЙ СЕРВЕР будем называть РМ
(Рабочее Место продавца). Каждому РМ в переделах предприятия назначается
уникальный номер (десятичное число), идентифицирующий его при выполнении
операции продажи.

Все РМ предприятия описываются в файле kassa.alx, находящемся в директории
конфигурации этого предприятия (обычно - /etc/iceB/<предприятие>/) на
сервере приложений, выполняющем клиентскую часть.

Пример этого файла для нашего случая:

kassa.alx:
--------------------------cut--------------------------------
# Настройка номеров рабочих мест, оснащенных кассовым регистратором

#<------ параметры РМ ------------>#<--- идентификатор РМ ----->
# #
1|1|kassa.my.net|iceb-maria|1111111#iceb.my.net|localhost|tty1
1|2|kassa.my.net|iceb-amc|161819022#iceb.my.net|remote.my.net|
| | | | | | | +>Терминал
| | | | | | -> Удаленный хост (откуда зашли telnet'ом)
| | | | | -> Хост, на котором запущена программа
| | | | -> Пароль для МАРIЯ
| | | | Код поставщика для АМС
| | | |
| | | -> TCP-порт кассового сервера
| | -> Хост кассового сервера
| -> Номер РМ
-> Номер склада
--------------------------cut--------------------------------

В описании кассового сервера текст слева от # описывает параметры
данного РМ, а текст справа используется для автоматической идентификации
номера РМ, с которого запущена клиентская программа (rozn или xpro).

Чтобы определить ее вид - запустите на терминале, принадлежащем РМ,
программу getworkid из комплекта утилит iceb (из шелла, не из mc!).
Она должна выдать идентификатор на stdout.

ПРИМЕЧАНИЕ: в случае использования удаленного терминального доступа

по протоколам типа telnet последнее поле идентификатора

(Терминал) следует опустить, поскольку в действительности

оно будет указывать на произвольный псевдотерминал,

предоставленный telnet-клиенту, и может меняться от

случая к случаю. В приведенном выше примере вывод

getworkid мог выглядеть как

iceb.my.net|remote.my.net|pty/4


В приведенном выше примере первая строка описания читается как:


РМ номер 1 состоит из:
- программы-кассового сервера, запущенного на компьютере

kassa.my.net и подключенного к TCP-порту с именем iceb-maria;

аппаратный пароль для подключения к кассовому регистратору

МАРIЯ - 1111111;
- терминала tty1 (первый экран консоли) компьютера iceb.my.net

Вторая строка:

РМ номер 2 состоит из:
- программы-кассового сервера, запущенного на компьютере

kassa.my.net и подключенного к TCP-порту с именем iceb-amc;

код поставщика кассового аппарата - 161819022;
- любого терминала, подключенного по telnet с компьютера

remote.my.net на компьютер iceb.my.net.


Если по каким-то причинам описанный выше способ идентификации вам не
подходит - можете воспользоваться альтернативным методом:
перед запуском клиентской программы назначьте переменной среды KASSANO
номер РМ, которому принадлежит терминал.