PDA

Просмотр полной версии : Свзяка ПДС + РК7 +РК 6 + fixlen



Uchenik
23.11.2017, 06:45
Добрый день. имеется небольшая сеть ресторанов. во всех кроме одного стоит РК6 в последнем РК7 есть ПДС. На РК6 есть fixlen, так как нумерация карт пересекается. Как в РК7 организовать работу ранее выданых карт. Точнее даже так в каком скрипте и что поправить что бы карты работали? До дилера не достучаться и он особо не торопиться шевелиться, а руководство требуют все организовать очень быстро. Заранее благодарю.
P. S. по поиску ничего подобного не нашел, мануалы от UCS конечно же недоступны.

sibgaba
23.11.2017, 11:20
Примеры карт приведите.
Что есть на карте -> какой номер нужно получить в 7ке

Делается все через MCR алгоритмы.
А там может быть маской дело ограничится, а может быть скрипт потребуется.

Uchenik
23.11.2017, 14:57
Примеры карт приведите.
Что есть на карте -> какой номер нужно получить в 7ке

Делается все через MCR алгоритмы.
А там может быть маской дело ограничится, а может быть скрипт потребуется.
На карте закодировано 778=216580001=NNNNN , это реальный номер первого ресторана, у второго ресторана код другой, через фикслен к номеру карты добавляется еще цифра 30, ну и собственно надо что бы новый ресторан на РК7 смог принимать карты с подобной кодировкой.

sibgaba
23.11.2017, 16:12
Скрипт надо писать. Маской тут не обойтись будет.
Будет время - напишу скрипт.
Возможно кто то раньше успеет...

Uchenik
23.11.2017, 17:08
Скрипт надо писать. Маской тут не обойтись будет.
Будет время - напишу скрипт.
Возможно кто то раньше успеет...
Буду очень благодарен

SLion
24.11.2017, 17:24
Что значит добавляется? Карта 7777 в первом ресторане, во втором? 7807 или 777730?

sibgaba
24.11.2017, 17:35
я думаю 307777

SH
25.11.2017, 03:47
Если и не готовое решение, то направление, куда думать.

Сервис - Обработка сигналов устройств - 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;

Uchenik
25.11.2017, 04:10
я думаю 307777
Да именно так фикслен в начале номера карты добавляет 30 и получается номер карты типа 30NNNNN

- - - Добавлено - - -


Если и не готовое решение, то направление, куда думать.

Сервис - Обработка сигналов устройств - 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;
Спасибо большое, сегодня попробую, ход мысли скрипта более менее понятен, есть хотя бы от чего оттолкнуться.

- - - Добавлено - - -

А еще такой вопрос, есть подозрение что фикслен не очень нужен. если его отключить в первом ресторане, то можно обойтись без скрипта? А например маска или просто префикс?

SH
25.11.2017, 04:12
А еще такой вопрос, есть подозрение что фикслен не очень нужен. если его отключить в первом ресторане, то можно обойтись без скрипта? А например маска или просто префикс?
Вот вообще вопроса не понял.

Uchenik
25.11.2017, 05:07
Вот вообще вопроса не понял.
Попробую прояснить как смогу. Фикслен используется потому что в базе несколько фудкортов с разными кодами ресторана и были выпущены карты с одинаковыми номерами, но с разными кодами ресторана, дилер настроил ПДС так что бы номера карт не пересекались, и в той же базе первый ресторан на РК 6 с кодом ресторана который я писал выше, на него выпущено порядка 3000 карт с номерами 00001 и далее до 30000, если в первом ресторане убрать фикслен что бы он не подставлял в начале номера карты цифру 30 и в базе ПДС изменить все эти карты на нормальные номера, то можно обойтись без скрипта и вообще будет ли работать эта система.
P. S. я сам к дилерству не имею отношение и немного далек от системы r keeper, я в этой конторе просто слежу за нормально работой сети и техники. но имею админские права в РК7

SH
25.11.2017, 05:56
Не, без скрипта не обойтись. И скрипт я не правильно написал. 30 не на карте, а в системе. Надо не убирать 30, а добавлять.

Uchenik
25.11.2017, 07:02
if RestCode = 123450001 then delete(Parameter, 1, 2);
- эта операция должна удалить первые два символа.
тогда получается надо изменить эту строку, и вписать по другому? не подскажете что написать? =)

SLion
25.11.2017, 20:52
function MCR1001280(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;
var RestCode: integer;
begin
result := false;
{ 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 = 123450002 then
Parameter := '30'+Parameter;
Result := RestCode div 10000 = IntParam('EnterpriseCode')
end;
end;
end;

Uchenik
26.11.2017, 05:05
function MCR1001280(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;var RestCode: integer;begin result := false; { 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 = 123450002 then Parameter := '30'+Parameter; Result := RestCode div 10000 = IntParam('EnterpriseCode') end; end;end;спасибо, сегодня попробую