PDA

Просмотр полной версии : Скрипт для видимости валют



pixnet
26.08.2020, 11:48
Помогите написать скрипт для события OnOrderVerify объекта TCheckView формы быстрого чека для видимости валют. Задача такая, если в заказе есть блюда (одно или несколько, неважно) из определенной классификации, то в режиме оплаты должна отображаться одна валюта (с указанным в скрипте кодом), если в этом же заказе есть частичная оплата валютой (с указанным в скрипте кодом), то тогда в режиме оплаты отображаются все валюты.

pixnet
31.08.2020, 13:07
Дополню, возможно все это можно сделать и другим способом. Необходимость заключается в том, что бы разграничить оплату между питанием сотрудников и обычными заказами. На кассе три валюты: нал, безнал и пдс оплата. Есть два вида меню, блюда для гостей и блюда для персонала, у каждого вида своя классификация, по которой кстати можно настроить ограничение на использование валюты, но вот беда только для безнала и пдс. Налик ни как, так как он является национальной базовой валютой и для него ограничение по классификации не предусмотрено. На картах персонала есть лимит суммы потрат на месяц, например пусть будет - 3000р, на валюту пдс уже стоит ограничение, она может закрыть только заказ с блюдами классификации "для персонала", но эти же блюда можно оплатить наликом и это проблема, вместе с этим необходимо чтобы персонал мог выбирать свой лимит в 3000р полностью, ибо если не хватает остатка лимита, то доступна комбинированная оплата (пдс+нал либо пдс+безнал).

В итоге имеем следующую задачу, если в заказе блюда для персонала, то в режиме оплаты должна отображаться только одна валюта (пдс), если сумма заказа более остатка по лимиту, то при внесении части оплаты пдс, появляются оставшиеся валюты, которыми можно закрыть оставшуюся сумму и не более того, чтоб блюда для персонала без комбинирования, по принципу сначала пдс потом любая другая валюта, нельзя было свободно оплачивать налом и безналом. Комбинирование валют на данный момент работает, а вот как скрыть валюты по этим критериям ума не приложу...

pixnet
31.08.2020, 13:17
Если это невозможно ни как реализовать, то можно отказаться от комбинирования оплаты и выборки всей суммы по лимиту. Сделать хотя бы так, когда в заказе есть блюда из классификации "для персонала", в режиме оплаты отображается только одна валюта, пдс оплата.

satan
31.08.2020, 15:22
Можно же правами национальную валюту закрыть, ее копию, например, использовать в ограничении по классификациям, а еще можно меню персонала ограничить категорией заказа и ограничить валюту там

pixnet
01.09.2020, 12:35
Можно же правами национальную валюту закрыть, ее копию, например, использовать в ограничении по классификациям,

Вот это тема! Настроил, работает.


А вот как связать правом категорию заказа с нужными валютами и меню не понял, право же все равно надо будет привязывать к пользователю, а он один, и если создать два права для каждой классификации меню, то их все равно нужно оба привязывать к пользователю, то бишь этим комбинированную оплату по критериям о которых писал выше не настроить :duma: За вторую валюту благодарю!

satan
01.09.2020, 22:36
А вот как связать правом категорию заказа с нужными валютами и меню не понял, право же все равно надо будет привязывать к пользователю,
Право не нужно, в свойствах категории заказа можно ограничить валюты

pixnet
02.09.2020, 19:44
На support.ucs.ru (https://support.ucs.ru/) нашел вот такой скрипт:

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, CategCode, dishpresent: integer;
it: TCheckItem;
Categ: TClassificatorGroup;
CardCode: string;
McrPay: TMcrPay;


begin


CategCode := 9; // категория контролируемых блюд
dishpresent := 0;
Categ := TClassificatorGroup(getitemBycodeNum('Classificato rGroups', CategCode));
CardCode := '';


// проверка наличия карты в заказе
for i := 0 to RKCheck.CurrentOrder.Sessions.McrPays.ItemCount - 1 do begin
McrPay := TMcrPay(RKCheck.CurrentOrder.Sessions.McrPays.Item s[i]);
CardCode := McrPay.CardNum;
end;


// проверка наличия контролируемых блюд в заказе
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if Categ.IsChild(it.RefItem) then
dishpresent := dishpresent + 1;
end;


// контроль при оплате
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if dishpresent > 0 then
if CardCode <> '' then
AAllow:= True
else
begin
AAllow := false;
AMessage := 'Оплата товаров из служебного меню, наличными или банковской картой, доступна только после авторизации Карты!';
end;
end;

Он почти подходит под текущую задачу но, контролирует товары в заказе из определенной классификации и дает оплатить налом или безналом только если есть авторизация карты.
Пытаюсь его доработать, пока не получается. Необходимо, чтоб он помимо (или вместо) наличия карты заказе, проверял сумму этой картой оплаченную, если валютой пдс было оплачено 1р или более, то тогда можно доплатить остатки любой другой, если нет, то показ сообщения.

По сути нужно лишь добавить в него контроль суммы оплаты определенной валютой. Перепробовал несколько вариантов, безуспешно....
Заранее благодарю всех откликнувшихся :)

Snap01
07.09.2020, 22:20
На support.ucs.ru (https://support.ucs.ru/) нашел вот такой скрипт:

// проверка наличия контролируемых блюд в заказе
for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then



Он почти подходит под текущую задачу но, контролирует товары в заказе из определенной классификации и дает оплатить налом или безналом только если есть авторизация карты.
Пытаюсь его доработать, пока не получается. Необходимо, чтоб он помимо (или вместо) наличия карты заказе, проверял сумму этой картой оплаченную, если валютой пдс было оплачено 1р или более, то тогда можно доплатить остатки любой другой, если нет, то показ сообщения.

По сути нужно лишь добавить в него контроль суммы оплаты определенной валютой. Перепробовал несколько вариантов, безуспешно....
Заранее благодарю всех откликнувшихся :)

У вас половина ответа в вопросе содержится. Тут вы все блюда перебираете, а надо практически так же перебрать все оплаты на предмет выполнения дополнительного условия. Возьмите любой скрипт на проверку оплат и поймете в чем отличия. 'TDish' на 'tpayline' заменить, насколько помню.

pixnet
09.09.2020, 10:25
Я его доработал до вот этого состояния:

procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var AAllow: boolean; var AMessage: string);
var i, CategCode, currpresent, dishpresent: integer;


it: TCheckItem;
Categ: TClassificatorGroup;
CardCode: string;
McrPay: TMcrPay;
Limit: double;


begin


currpresent := 0; // сумма оплаты
CategCode := 9; // категория контролируемых блюд
dishpresent := 0; // блюда в заказе
Categ := TClassificatorGroup(getitemBycodeNum('Classificato rGroups', CategCode));
CardCode := '';
Limit :=0;

//проверка наличия карты в заказе


for i := 0 to RKCheck.CurrentOrder.Sessions.McrPays.ItemCount - 1 do begin
McrPay := TMcrPay(RKCheck.CurrentOrder.Sessions.McrPays.Item s[i]);
Limit := Limit + McrPay.MaxAmount;
CardCode := McrPay.CardNum;
end;

// проверка наличия контролируемых блюд в заказе


for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if Categ.IsChild(it.RefItem) then
dishpresent := dishpresent + 1;
end;

//проверка суммы оплаты

for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin
it := RKCheck.CurrentOrder.Sessions.Lines[i];
if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then
if (it.Code = 10) then //код валюты
if TPayLine(it).CurrLineSum > 0 then
currpresent := currpresent + 1;
end;


// контроль при оплате

if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if dishpresent > 0 then
if (CardCode <> '') and (Limit > 0) then
else if (currpresent > 1) then
AAllow:= True
else
begin
AAllow := false;
AMessage := 'Сообщение';
end;
end;

Работает так, если в заказе присутствуют блюда из определенной классификации, то при выборе валют нал и безнал запрет с выводом сообщения, при авторизации карты с нулевым остатком, тоже вывод сообщения. Если в заказе присутствует оплата спец валютой хотя бы на рубль, то можно доплатить налом или без налом. Все как я хотел, но за одним исключением, есть дыра в этом алгоритме. Если авторизировать карту с положительным остатком, а потом оплату по ней удалить из заказа, он дает оплатить любой валютой, хотя не должен, оплата любой валютой должна быть доступна только при наличии в заказе оплаты спец валютой на сумму от 1 рубля и более. Буду признателен если подскажите где что не так :)

pixnet
09.09.2020, 10:42
if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if dishpresent > 0 then
if (CardCode <> '') and (Limit > 0) then
else if (currpresent > 1) then

Вот этот участок кода должен быть таким:


if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then
if dishpresent > 0 then // проверка блюда из классификации
if (CardCode <> '') and (Limit > 0) then // одновременная проверка авторизации карты с лимитом по ней
if (currpresent > 1) then // проверка суммы оплаты спец валютой

Без else, но он в таком виде вообще перестает работать...:(

Snap01
10.09.2020, 02:02
Я его доработал до вот этого состояния:

Работает так, если в заказе присутствуют блюда из определенной классификации, то при выборе валют нал и безнал запрет с выводом сообщения, при авторизации карты с нулевым остатком, тоже вывод сообщения. Если в заказе присутствует оплата спец валютой хотя бы на рубль, то можно доплатить налом или без налом. Все как я хотел, но за одним исключением, есть дыра в этом алгоритме. Если авторизировать карту с положительным остатком, а потом оплату по ней удалить из заказа, он дает оплатить любой валютой, хотя не должен, оплата любой валютой должна быть доступна только при наличии в заказе оплаты спец валютой на сумму от 1 рубля и более. Буду признателен если подскажите где что не так :)
потому что нужно как правило проверять статусы.

pixnet
10.09.2020, 11:39
потому что нужно как правило проверять статусы.

Не понял о чем речь, если лень писать, то лучше этого не делать, а то от таких ответов еще больше вопросов:)

Скрипт дописал, работает четко.



procedure CheckViewOnBeforeCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject; var i, CategCode, CurrencyCode, dishpresent: integer;


it: TCheckItem;


Categ: TClassificatorGroup;

currsum: double;


begin


currsum := 0; // для проверки оплаты

CurrencyCode := 10; //код валюты


CategCode := 9; // категория контролируемых блюд


dishpresent := 0; //для проверки блюд


Categ := TClassificatorGroup(getitemBycodeNum('Classificato rGroups', CategCode));



// проверка наличия контролируемых блюд в заказе


for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin


it := RKCheck.CurrentOrder.Sessions.Lines[i];


if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then


if Categ.IsChild(it.RefItem) then


dishpresent := dishpresent + 1;


end;

//проверка наличия оплаты нужной валютой

for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin


it := RKCheck.CurrentOrder.Sessions.Lines[i];


if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then

if (it.Code = CurrencyCode) then

currsum := currsum + 1;

end;


// контроль при оплате

if SYS.ObjectInheritsFrom(AObjectAft, 'TPayLine') then

if dishpresent > 0 then

if (TPayLine(AObjectAft).code = CurrencyCode) then


else if currsum > 0 then


AAllow:= True

else

begin


AAllow := false;


AMessage := 'Данная операция недоступна!';


end;


end;

Snap01
11.09.2020, 02:30
Не понял о чем речь, если лень писать, то лучше этого не делать, а то от таких ответов еще больше вопросов:)

Речь о том, что я цитировал. Если у вас не контролировались удаления оплат, то это потому, что вы вообще нигде в скрипте не проверяете статусы. Ни у блюд, ни у оплат.
А сам скрипт я не читал, потому что сразу вижу, что он не соответствует ТЗ из первого поста.