Сообщение от
SH
Если и не готовое решение, то направление, куда думать.
Сервис - Обработка сигналов устройств - MCR-алгоритмы
Персональные дебетовые (ПДС), делаем копию.
В свойствах внизу - Скрипт, открываем.
Скрипт принимает на вход строку Parameter, пытается ее преобразовать и возвращает ответ, соответствует ли код в строке коду ресторана.
function MCR1001280(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;
var RestCode: integer;
begin
{ 778=КодРесторана=КодКарты }
if pos('778=', Parameter) = 1 then begin - здесь скрипт определяет, что строка начинается с 778. При неверной кодировке можно задать свое начало строки.
delete(Parameter, 1, 4); - здесь удаляется все начало, остается только "КодРесторана=КодКарты"
if pos('=', Parameter) > 1 then begin
RestCode := StrToIntDef(copy(Parameter, 1, pos('=', Parameter) - 1),-1); - в RestCode копируется код ресторана
delete(Parameter, 1, pos('=', Parameter)); - удаляется код ресторана, остается только код карты. Важно, чтобы алгоритм дошел до этого пункта.
if RestCode mod 10000 = 0 then - если код, в конце без кода ресторана (делится на 1000 без остатка), то...
{без кода ресторана - на всю компанию}
Result := RestCode div 10000 = IntParam('EnterpriseCode') - ... проверяем на соответствие коду предприятия,
else
Result := RestCode = IntParam('RestaurantCode'); - а иначе проверяем на соответствие полному коду.
end;
end;
end;
Если у нас закодированный код не совпадает, то нам надо добавить условия, по которым будет срабатывание.
Есть две задачи:
1. принимать чужой код ресторана
2. у карт с чужим номером отбрасывать "30" в начале.
Если просто не совпадает код ресторана, то алгоритм нормально пройдет разбор номера и в Parameter будет номер карты, но споткнется при сравнении с кодом ресторана.
Поэтому, для первой задачи можно просто добавить условие в строку последней проверки:
Result := (RestCode = IntParam('RestaurantCode')) OR (RestCode = 123450001); - начальное условие оставил и взял в скобки для удобства, далее добавлено ИЛИ и прямое сравнение с кодом, закодированным на карте. 123450001 - код чужого ресторана.
Далее, в Parameter у нас остается код карты, но он с лидирующими 30, т.е. формата 301234
Можно, например, так
После
delete(Parameter, 1, pos('=', Parameter));
Добавить строку
if RestCode = 123450001 then delete(Parameter, 1, 2);
- эта операция должна удалить первые два символа.
Если я нигде не ошибся, то итог будет такой:
function MCR1001280(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;
var RestCode: integer;
begin
{ 778=КодРесторана=КодКарты }
if pos('778=', Parameter) = 1 then begin
delete(Parameter, 1, 4);
if pos('=', Parameter) > 1 then begin
RestCode := StrToIntDef(copy(Parameter, 1, pos('=', Parameter) - 1),-1);
delete(Parameter, 1, pos('=', Parameter));
if RestCode = 123450001 then delete(Parameter, 1, 2);
if RestCode mod 10000 = 0 then
{без кода ресторана - на всю компанию}
Result := RestCode div 10000 = IntParam('EnterpriseCode')
else
Result := (RestCode = IntParam('RestaurantCode')) OR (RestCode = 123450001);
end;
end;
end;