Взаимодействие 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 - неверный токен