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

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
номер РМ, которому принадлежит терминал.

