СЕРВЕРНА ЧАСТИНА

Програма для автоматичного списання роздрібу.

Програма "fsprozn" варта автоматичного списання роздрібного продажу зі складів. Якщо ви експлуатуєте програму "rozn", то щодня після завершення торгівлі ви мають виконати процедуру списання проданого товару з карток матеріалів.

Це можна зробити двома шляхами. Зайти у програмі "xmu" і запустити там відповідний режим або скористатися програмою "fsprozn". Запуск цієї програми можна налаштувати в автоматичному режимі. Вона спише всю реалізацію зроблену до дати запуску програми, включаючи й дату запуску програми.

Програма повинна запускатися з ключами що передають їй пароль для доступу до бази даних, і ім'ям бази даних.

Наприклад:

fsprozn -p aaa -b bx
            |     |
            |     -> Ім'я бази даних
            -> Пароль

Протокол роботи програми буде вивантажений в файл /tmp/iceb_srммгггг.pr

"рррр" : - рік запуску програми.

"мм" : - в імені файла означає місяць запуску програми

Необхідно пам'ятати що якщо ви налаштували автоматичне списання, то реалізація повинна завжди закінчуватися перед запуском програми й машина не повинна бути виключена перед запуском програми. Якщо сервер працює у цілодобовому режимі, то найкраще запуск програми налаштовувати на 0 годин (північ). За умови що в вночі ніхто не торгує. Якщо магазин працює цілодобово, то списання реалізації має виконуватися лише у ручному режимі.

Використання касових реєстраторів.

Загальні засади

Нині виконується перехід обслуговування касових реєстраторів від термінальної моделі що використовувалася раніше до клієнт-серверної моделі. Відмінності між моделями полягають ось у чому:

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

клієнт-серверна : передбачається підключення КР до довільних комп'ютерів у мережі, що виконують програму «касовий сервер». На сервері додатків виконується програма-клієнт, яка зєднується з касовим сервером через мережу TCP/IP. У найпростішому разі обидві програми - клієнт і сервер - можуть виконуватися на одному й тому ж комп'ютері. Поки що у цій системі підтримуються два типу касових реєстраторів:

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

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

Склад програмних засобів для роботи з КР

   libdev/
    iceb_server - касовий сервер;
   buhg/
    mariq - настроювання КР (зовнішній вигляд чека, податки, режими, etc)
    rozn - роздрібна торгівля
    xpro - оптової торгівлі

Особливості збірки для підтримки АМС-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 "З" {
     +#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

Налаштування касового серверу

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

    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

Установка клієнтських програм

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

Усі РМ підприємства описуються в файлі 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 номер РМ, якому належить термінал.

Опис роботи протоколу обміну для "iceb_server"

Робота починається з створення серверу. У відповідь на встановлення з'єднання сервер відповідає рядком :

OK MARIA V1.0

де

  "OK" - сигнатура
  "MARIA" - назва пристрою
  "V1.0" - версія ПО

Після цього сервер готовий до прийому команд. Кожна команда починається ключовим словом FSTART: потім через прогалину слідує назва команди, і можна натискати клавішу ввід. Усі параметри для команди передаються в символьному вигляді й завершуються вводом рядку.

Завершує введення параметрів ключове слово FEND: Сервер відповідає рядком з числовим кодом завершення операції при успішному ході чи рядками:

ERROR - помилкове число параметрів в команді
ERROR FUNC - помилкова команда після FSTART:
ERROR CMD - помилкове ключовим словом

Завершення роботи сервера іде за рахунок команди FQUIT: Сервер видає рядок QUIT і закриває з'єднання. Реалізовані команди в версії 1.0

ADD_CHECK : функція створення і роздруку чеків

MARIA_PRCHECK : роздрук чека на фіскальний принтер МАРИЯ-301

MARIA_INDICATOR : висновок повідомлення на індикатор касового реєстратора

MARIA_LINEFEED : прогнати чекову стрічку

MARIA_DAY_REPORT : формування та роздрук денного звітного чека

MARIA_DATE_REPORT : формування та роздрук звітного чека за вказаний період часу

MARIA_SETCHECK : формування зовнішнього вигляду чека

MARIA_NALOG : запрограмувати податок

MARIA_REGINFO : запрограмувати реєстраційну інформацію про власника

MARIA_VALUTA : запрограмувати валюту

MARIA_TIME : встановити годинник реального часу (не більш +- 1 година)

MARIA_NULL : надрукувати нульової чек (для перевірки введених настройок касового реєстратора)

MARIA_SLUG : службове внесення/вилучення

FREE_CHECK

Для роботи з сервером з програми-клієнта існують наст.функції :

Призначення : Відкриття з'єднання з сервером.
Результат : Дескриптор сполуки чи ICEB_GET_ERROR у разі помилки
#define ICEB_GET_ERROR -1
icebcon iceb_open_server
(
char *server_name //Ім'я хоста,доступне через DNS чи /etc/host
);
Призначення: Послати рядок на сервер
Результат : Кількість посланих байт чи ICEB_GET_ERROR у разі помилки
int iceb_write_to_server
(
icebcon conection_id, // Дескриптор зєднання
char *cmd // Стрічка даних
);
Призначення: Прочитати рядок відповіді серверу
Результат : Кількість прийнятих байт чи ICEB_GET_ERROR у разі помилки
int iceb_read_from_server
(
icebcon conection_id, // Дескриптор зєднання
char *server_answer, // Буфер прийому відповіді
int count // Розмір буфера
);
Призначення: Закрити з'єднання з сервером
Результат : завжди 0
int iceb_close_server(icebcon conection_id);
Призначення: Одержати код останньої помилки
Результат : ціле число

int iceb_get_last_error()

ICEB_ERROR_NONE 0 немає помилок

ICEB_ERROR_HOST_NOT_FOUND 1 хост не знайдено

ICEB_ERROR_SERVICE_NOT_FOUND 2 немає такого номеру порту

ICEB_ERROR_CREATE_SOCKET 3 неспроможна створити сокет

ICEB_ERROR_CONNECT_HOST 4 неспроможна з'єднатися з сервером

ICEB_ERROR_SEND_HOST 5 не зміг послати дані

ICEB_ERROR_SEND_DATA 6 під час посилки повідомлення розірвалось мережне з'єднання

ICEB_ERROR_READ_DATA 7 не зміг прочитати дані

ICEB_ERROR_LARGE_BLOCK 8 розмір буфера прийому даних менш як необхідно

ICEB_ERROR_INVALID_HANDLE 9 не відрив сервер чи неправильний дескриптор

ICEB_ERROR_NO_MORE_HANDLE 10 під час відкриття серверу закінчилися дескриптори

Перелік команд EPSON що застосовуються для створення звітів у системі iceB.

ESC 27 1B
----------------------------------------------------------------------
ASCII  |Десяткове|Шістнадцяткове| Опис
----------------------------------------------------------------------
LF      10        0A              Перевід рядку
FF      12        0C              Перевід формату
DC2     18        12              Скасування стисненого режиму
DC4     20        14              Скасування подвійної ширини (Для рядка)
SO      14        0E              Вибір подвійної ширини (для 1 рядка)
SI      15        0F              Вибір стисненого режиму
ESC - n 45        2D              Включення/виключення підкреслення
                                  Якщо n = 0 режим виключений \x30
                                           1 режим включений  \x31
ESC 2   50        32              Вибір 1/6-дюймового інтервалу між рядками
ESC 3 n 51        33              Вибір n/216-дюймового інтервалу між рядками
ESC A n 65        41              Вибір n/72-дюймового інтервалу між рядками
ESC E   69        45              Вибір режиму виділеного шрифту
ESC F   70        46              Скасування режиму виділеного шрифту
ESC G   71        47              Вибір двухударного режиму
ESC H   72        48              Скасування двухударного режиму
ESC M   77        4D              Дванадцять знаків на дюйм
ESC P   80        50              Десять знаків на дюйм
ESC U n 85        55              Включення/виключення односпрямованого режиму
                                  Якщо n = 0 режим виключений \x30
                                           1 режим включений  \x31
ESC l   108       6C              Установка лівого поля
ESC x n 120       78              Вибір режимів високоякісного чи чорнового
                                  друку. Якщо n = 0 - Вибір чорнового режиму
                                                  1 - Вибір високоякісного друку
----------------------------------------------------------------------------
fprintf(ff,"\x12");
fprintf(ff,"\x1b\x6C%c",10-koolk); /*Установка лівого поля*/
fprintf(ff,"\x1B\x4D"); /*12-знаків*/
fprintf(ff,"\x0F"); /*Стиснений режим*/
fprintf(ff,"\x1B\x33%c\n",30); /*Примусовий міжрядковий інтервал*/