Просмотр полной версии : Скрипт для видимости валют
Помогите написать скрипт для события OnOrderVerify объекта TCheckView формы быстрого чека для видимости валют. Задача такая, если в заказе есть блюда (одно или несколько, неважно) из определенной классификации, то в режиме оплаты должна отображаться одна валюта (с указанным в скрипте кодом), если в этом же заказе есть частичная оплата валютой (с указанным в скрипте кодом), то тогда в режиме оплаты отображаются все валюты.
Дополню, возможно все это можно сделать и другим способом. Необходимость заключается в том, что бы разграничить оплату между питанием сотрудников и обычными заказами. На кассе три валюты: нал, безнал и пдс оплата. Есть два вида меню, блюда для гостей и блюда для персонала, у каждого вида своя классификация, по которой кстати можно настроить ограничение на использование валюты, но вот беда только для безнала и пдс. Налик ни как, так как он является национальной базовой валютой и для него ограничение по классификации не предусмотрено. На картах персонала есть лимит суммы потрат на месяц, например пусть будет - 3000р, на валюту пдс уже стоит ограничение, она может закрыть только заказ с блюдами классификации "для персонала", но эти же блюда можно оплатить наликом и это проблема, вместе с этим необходимо чтобы персонал мог выбирать свой лимит в 3000р полностью, ибо если не хватает остатка лимита, то доступна комбинированная оплата (пдс+нал либо пдс+безнал).
В итоге имеем следующую задачу, если в заказе блюда для персонала, то в режиме оплаты должна отображаться только одна валюта (пдс), если сумма заказа более остатка по лимиту, то при внесении части оплаты пдс, появляются оставшиеся валюты, которыми можно закрыть оставшуюся сумму и не более того, чтоб блюда для персонала без комбинирования, по принципу сначала пдс потом любая другая валюта, нельзя было свободно оплачивать налом и безналом. Комбинирование валют на данный момент работает, а вот как скрыть валюты по этим критериям ума не приложу...
Если это невозможно ни как реализовать, то можно отказаться от комбинирования оплаты и выборки всей суммы по лимиту. Сделать хотя бы так, когда в заказе есть блюда из классификации "для персонала", в режиме оплаты отображается только одна валюта, пдс оплата.
Можно же правами национальную валюту закрыть, ее копию, например, использовать в ограничении по классификациям, а еще можно меню персонала ограничить категорией заказа и ограничить валюту там
Можно же правами национальную валюту закрыть, ее копию, например, использовать в ограничении по классификациям,
Вот это тема! Настроил, работает.
А вот как связать правом категорию заказа с нужными валютами и меню не понял, право же все равно надо будет привязывать к пользователю, а он один, и если создать два права для каждой классификации меню, то их все равно нужно оба привязывать к пользователю, то бишь этим комбинированную оплату по критериям о которых писал выше не настроить :duma: За вторую валюту благодарю!
А вот как связать правом категорию заказа с нужными валютами и меню не понял, право же все равно надо будет привязывать к пользователю,
Право не нужно, в свойствах категории заказа можно ограничить валюты
На 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р или более, то тогда можно доплатить остатки любой другой, если нет, то показ сообщения.
По сути нужно лишь добавить в него контроль суммы оплаты определенной валютой. Перепробовал несколько вариантов, безуспешно....
Заранее благодарю всех откликнувшихся :)
На 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' заменить, насколько помню.
Я его доработал до вот этого состояния:
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 рубля и более. Буду признателен если подскажите где что не так :)
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, но он в таком виде вообще перестает работать...:(
Я его доработал до вот этого состояния:
Работает так, если в заказе присутствуют блюда из определенной классификации, то при выборе валют нал и безнал запрет с выводом сообщения, при авторизации карты с нулевым остатком, тоже вывод сообщения. Если в заказе присутствует оплата спец валютой хотя бы на рубль, то можно доплатить налом или без налом. Все как я хотел, но за одним исключением, есть дыра в этом алгоритме. Если авторизировать карту с положительным остатком, а потом оплату по ней удалить из заказа, он дает оплатить любой валютой, хотя не должен, оплата любой валютой должна быть доступна только при наличии в заказе оплаты спец валютой на сумму от 1 рубля и более. Буду признателен если подскажите где что не так :)
потому что нужно как правило проверять статусы.
потому что нужно как правило проверять статусы.
Не понял о чем речь, если лень писать, то лучше этого не делать, а то от таких ответов еще больше вопросов:)
Скрипт дописал, работает четко.
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;
Не понял о чем речь, если лень писать, то лучше этого не делать, а то от таких ответов еще больше вопросов:)
Речь о том, что я цитировал. Если у вас не контролировались удаления оплат, то это потому, что вы вообще нигде в скрипте не проверяете статусы. Ни у блюд, ни у оплат.
А сам скрипт я не читал, потому что сразу вижу, что он не соответствует ТЗ из первого поста.
Powered by vBulletin® Version 4.2.6 LTS Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot