Взаимодействие DLL – БД - сервер
База данных
2 таблицы:
1. 1kk - iCardId, iCardNumber, dOverDate, iRestCode, iStatus, iSaleNumber, iTerminalId, sXmlText
2. fail – iCardId, iCardNumber, dOverDate, iRestCode, iTerminalId, iPartnerId
iCardId – собственно id (ключ)
iCardNumber – промо-код
dOverDate – время погашения карты
iRestCode – код ресторана у партнера
Status – 0/1, 0 – действительный код, 1 – погашенный код
iSaleNumber – номер скидки (всегда один и тот же)
iTerminalId – код кассы
iPartnerId - id партнера KFC
sXmlText - xml данные транзакции
DLL, описание функций
Язык программирования: -
Поля, которые нужны для функционала, выделены желтым!
Функция GetCardInfoEx
function GetCardInfoEx(
Card: Int64; Restaurant, UnitNo: DWORD;
Info: Pointer;
InpBuf: Pointer; InpLen: DWORD; InpKind: Word;
var OutBuf: Pointer; var OutLen: DWORD; var OutKind: Word
): Integer; stdcall;
Эта функция возвращает информацию о карте
параметры:
Card - номер карты
Restaurant - код ресторана
UnitNo - номер кассы
Info - адрес структуры, которую функция должна заполнить, если карта существует
InpBuf - дополнительная информация от кассы о заказе
InpLen - длина информации от кассы
InpKind - тип информации от кассы (0-нет 1-XML)
OutBuf - дополнительная ответная информация
OutLen - длина ответной информации (не более 150kb)
OutKind - тип ответной информации (2-Pr1me 101-Пластек)
результат
0 - без ошибок, структура Info заполнена
1 - карта не существует
Структура, на которую указывает Info:
Word размер структуры = 1164 байт (это поле заполнено при вызове)
Byte Карта существовала, но была удалена
0 - нет, и сейчас есть
1 - да, удалена
Byte Карту надо изъять
0 - нет
1 - да
Byte Истек срок действия
0 - нет
1 - да
Byte Сейчас карта не действует
0 - нет, действует
1 - да, не действует
Byte Нужно ли подтверждение менеджера
0 - не нужно
1 - нужно
Byte Карта заблокирована
0 - нет
1 - да
256 байт Asciiz строка - причина блокировки карты - будет показана на кассе
40 байт Asciiz строка - имя владельца карты
Int64 Идентификатор владельца карты
DWORD Номер счета
DWORD тип неплательщика
Word номер бонуса
Word номер скидки
Int64 предельная сумма скидки, в копейках
Int64 сумма, доступная для оплаты счета, в копейках
Int64 сумма на карточном счете N 2, в копейках
Int64 сумма на карточном счете N 3, в копейках
Int64 сумма на карточном счете N 4, в копейках
Int64 сумма на карточном счете N 5, в копейках
Int64 сумма на карточном счете N 6, в копейках
Int64 сумма на карточном счете N 7, в копейках
Int64 сумма на карточном счете N 8, в копейках
256 байт Asciiz - произвольная информация о карте
256 байт Asciiz - информация для вывода на экран кассы
256 байт Asciiz - информация для распечатки на принте
Функция TransactionsEx
function TransactionsEx(
Count: DWORD; List: Pointer;
InpBuf: Pointer; InpLen: DWORD; InpKind: Word;
var OutBuf: Pointer; var OutLen: DWORD; var OutKind: Word
): Integer; stdcall;
Эта функция проводит транзакции для кассового чека
параметры:
Count - количество транзакций
List - адрес списка, каждый элемент котoрого - ссылка (Pointer) на описание транзакции (см. ниже)
InpBuf - дополнительная информация от кассы о чеке
InpLen - длина информации от кассы
InpKind - тип информации от кассы (0-нет 1-XML)
OutBuf - дополнительная ответная информация
OutLen - длина ответной информации (не более 150kb)
OutKind - тип ответной информации
результат
0 - все транзакции проведены
1 - ни одна транзакция не проведена
частичного выполнения быть не должно - либо все проходят, либо ни одна!
Описание одной транзакции
Word размер структуры = 122 байт
Int64 Карта
Int64 Идентификатор владельца карты
DWORD Номер счета
Byte Тип транзакции
0 - платеж (снятие денег со счета)
1 - скидка
2 - бонус (начисление денег на счет)
3 - потраты гостя (сколько заплатил своих денег)
Int64 сумма, в копейках,
для типа 0 (платеж):
оплата снятием денег с карты - отрицательная сумма,
отмена оплаты - положительная сумма;
для типа 1 (скидка):
скидка клиенту - отрицательная сумма,
отмена скидки - положительная сумма;
для типа 2 (бонус):
клиенту начисляется бонус - положительная сумма,
отмена бонуса - отрицательная сумма;
для типа 3 (потраты):
клиент заплатил - положительная сумма,
отмена чека - отрицательная сумма;
Word код ресторана
DWORD кассовая дата ( 0 -> 30/12/1899 )
Byte номер кассы
DWORD номер чека
далее информация о налогах в чеке (8 штук)
Int64 сумма с налогом A
Word размер налога A в процентах * 100 (1500 -> 15.00%)
Int64 сумма с налогом B
Word размер налога B в процентах * 100
Int64 сумма с налогом C
Word размер налога C в процентах * 100
Int64 сумма с налогом D
Word размер налога D в процентах * 100
Int64 сумма с налогом E
Word размер налога E в процентах * 100
Int64 сумма с налогом F
Word размер налога F в процентах * 100
Int64 сумма с налогом G
Word размер налога G в процентах * 100
Int64 сумма с налогом H
Word размер налога H в процентах * 100
Взаимодействие DLL – БД - сервер
Касса вызывает функции и передает параметры согласно описанию этих функций.
Алгоритм авторизации
Каждому ресторану выдается пара логин-пароль. По данной паре происходит авторизация на сервере. Прежде чем выполнять запросы на сервер, необходимо пройти авторизацию. Для этого:
проверяется наличие в памяти tokena. Если его нет, запрос Get_token, если token есть в памяти, то выполняются запросы с данным токеном.
Dll
1. Выполняется запрос на установление связи с сервером Has_connect, если запрос false, то дальнейшие действия производятся с хранилищем (например, с файлом cards.txt или done_cards.txt) это п.2.1. Если вернулось true, то продолжаем выполнение функций.
2. Проверяется наличие токена в памяти, если его нет, то отправляется запрос на сервер Get_token. Если вернулся true, то сохраняем токен (этот токен будет во всех остальных запросах). Если вернулось false, то выполнить запрос еще 2 раза. Если запрос возвращает false 3 раза, то сразу прервать выполнение запрошенной от кассы функции, вернуть 1 и OutBuf с описанием ошибки (это ошибка 500). В OutBuf помещается значение ошибки 500.
2.1. Для функции GetCardInfoEx: обращаемся к хранилищу (файлу cards.txt) и проверяем есть ли такой номер карты в хранилище (файле cards.txt) и статус 0 и dOverDate пусто, если номер есть, то дописывает в строку номер ресторана, номер кассы и возвращает 0. Функция возвращает 1 OutBuf с описанием ошибки (это ошибки 2), если карта не найдена в хранилище (файле cards.txt). Если статус 1 и dOverDate заполнено, возвращает 1 и OutBuf с описанием ошибки (ошибка 3). В OutBuf помещается значение ошибки 2,3.
2.2. Для функции TransactionEx: функция обращается к хранилищу (файлу done_cards.txt) и проверяет на равенство (что в файле и что пришло от кассы) номер кассы и ресторана. Если проверка прошла успешно, то дописывает в него номер карты и серверное время, возвращает 0. Если проверка не пройдена, то вернуть 1 и OutBuf с описанием ошибки (это ошибка 201). В OutBuf помещается значение ошибки 201.
3. Запрос функции GetCardInfoEx.
a. Касса присылает во входных параметрах
i. Card - номер карты
ii. Restaurant - код ресторана
iii. UnitNo - номер кассы
b. Проверить Card на позицию цифр (способ проверки обычный if на позицию цифр, алгоритм будет чуть позже). Если проверка не пройдена, функция возвращает 1 и OutBuf с описанием ошибки (это ошибка 1). В OutBuf помещается значение ошибки 1.
c. Делаем п.1
d. Если токена нет в памяти, то п.2. Если токен есть в памяти, то выполняется запрос Has_one_card. Если вернулось true, то функция возвращает 0 и дописывает по данному номеру карты номер ресторана и кассы в хранилище (файл cards.txt), если вернулось false, то функция возвращает 1 и OutBuf с описанием ошибки (это ошибка 2,3). В OutBuf помещается значение ошибки 2,3.
4. Запрос функции TransactionEx.
a. Касса присылает во входных параметрах
i. Int64 Карта
ii. Word код ресторана
iii. Byte номер кассы
b. Делаем п.1.
c. Если токена нет в памяти, то п.2. Если токен есть в памяти, то выполняется запрос Transaction_complete. Если вернулось true, то функция возвращает 0, если вернулось false если вернулось false, то функция возвращает 1 и OutBuf с описанием ошибки (это ошибка 6). В OutBuf помещается значение ошибки 6.
d. Записывает в файл всю информацию из InpBuf - дополнительная информация от кассы о чеке и файл называется номером карты.
Off-line режим
Каждый день в 3:00-4:00 (нужно сделать интервалы для дллек) утра происходит синхронизация с сервером (получение всех карт и отправка карт на сервер, если падал инет). Запрос Gat_all_cards, Update_cards.
4:00-5:00 dll подключается к серверу и записывает в БД по номеру карты (по названию файла) в таблицу 1kk в поле sXmlText все содержимое файла и удаляет файл после удачной записи в БД
Логи
Каждый вызов функции заносится в лог:
{функция} {номер ресторана} {номер кассы} {дата время} {ответ сервера}
Серверное API
Запрос на авторизацию Get_token (GET)
1. Входные параметры
a. login
● str
b. pass
● str
c. hash
● str строка строится так md5(login+pass+login+date(m))
d. type_request
● Get_token - константа
2. Выходные параметры
a. Корректный ответ
{
"result": true,
"token": str
}
b. Некорректный ответ
{
"result": false,
"err_message":
{
"code": code_errors,
}
}
Запрос существования карты Has_one_card (GET)
3. Входные параметры
a. card_number
● int
b. type_request
● Has_one_card
c. rest_number
● int
d. terminal_number
● int
e. token
● str
4. Выходные параметры
a. Корректный ответ
{
"result": true,
"sale_number": int - тип скидки для дальнейшего использования
}
b. Некорректный ответ
{
"result": false,
"err_message":
{
"code": code_errors,
}
}
Запрос на проведение транзакции карты Transaction_complete (GET)
1. Входные параметры
a. card_number
● int
b. type_request
● Transaction_complete
c. rest_number
● int
d. terminal_number
● int
e. token
● str
2. Выходные параметры
a. Корректный ответ
{
"result": true,
}
b. Некорректный ответ
{
"result": false,
"err_message":
{
"code": code_errors,
}
}
Запрос на получения списка карт Get_all_cards (GET)
1. Входные параметры
a. type_request
● Get_all_cards
b. token
● str
2. Выходные параметры
a. Корректный ответ
{
"result": true,
"cards": [{
"card_number": int,
"status": int,
}],
}
b. Некорректный ответ
{
"result": false,
"err_message":
{
"code": code_errors,
}
}
Запрос на внесение в БД погашенных карт Update_cards (GET)
1. Входные параметры
a. type_request
1. Update_cards
b. token
1. str
c. cards (json) "cards":[{"card_number":123456789,"over_date": 2016-10-02 01:01:00}]
1. card_number
● int
2. over_date
● date
2. Выходные параметры
a. Корректный ответ
{
"result": true,
}
b. Некорректный ответ
{
"result": false,
"err_message":
{
"code": code_errors,
}
}
Запрос на проверку связи Has_connect (GET)
1. Входные параметры
a. type_request
● Has_connect
2. Выходные параметры
a. Корректный ответ
{
"result": true,
}
b. Некорректный ответ
{
"result": false,
"err_message":
{
"code": code_errors,
}
}
Code_errors:
● 1 - Некорректное значение номера карты
● 2 - Не найдена карта в БД
● 3 – Карта погашена (Status=1 и dOverDate заполнено)
● 6 – Неисправность БД (ошибка, нет ответа)
● 7 – отсутствует type_request
● 100 – отсутствует код ресторана
● 101 – отсутствует код кассы
● 201 – Несовпадение номера ресторана или кассы, зарезервированных в БД от функции GetCardInfoEx
● 301 – Невозможно получить список карт
● 302 – Нет списка карт
● 500 – ошибка авторизации! СРОЧНО вызвать администратора!
● 666 – карта уже погашена
● 501 – нет связи с сервером
● 502 - неверный токен