Прайс-листы недоступны в модуле сервера прайсчекера.
Класс item сервера прайсчекеров и класс item модуля печати чеков - совершенно разные классы! Хотя у них есть схожие методы и свойства. Но есть вероятность 90%, что если в исходном скрипте pch_serv.lua (то есть при чистой установке сервера УКМ) они не используются, то они и не реализованы. В лучшем случае значение свойства будет nil, в худшем - ошибка при любой попытке обращения. Пару лет назад мы хотели остатки выводить, но свойство quantity содержало всегда 0. Требовалась доработка => теряли время.
Сервер прайсчекеров не готов, я считаю. Помимо вышеописанного, имеются так же следующие проблемы:
- сервер прайсчекеров не способен обслуживать более одного магазина - он жёстко привязан к одному магазину, поэтому в схеме "СГО - кассы" (без СМ) необходимо для данного магазина куда-нибудь ещё ставить сервер прайсчекеров с его отдельной БД;
- не реализовано обновление сервера прайсчекеров: при обновлении УКМ до новой версии или сервис-пака необходимо удалить файл pcserver.exe, удалить настройку из УКМ (но тут имеется ошибка № 3520 "При удалении прайсчекера на СГО он не удаляется с СМ" - не исправлена), удалить БД сервера прайсчекеров, создать БД новой версии, подложить файл pcserver.exe новой версии, настроить новый сервер прайсчекеров (но тут имеется ошибка № 3358 "Тиражирование ненужных копий прайсчекера в случаях разрыва связи серверов УКМ и прайсчекеров по тайм-ауту" - не исправлена). И это надо сделать на каждом СМе. И когда на горизонте замаячило обновление СГО и 75 СМов на новую версию УКМ, а у руководства возникло решение о сокращении расходов и переходе на безСМную схему, было принято радикальное решение - я написал собственный сервер прайсчекеров.
Он способен работать в единственном экземпляре с БД СГО, успешно обслуживая одновременно 69 магазинов (как показало самое тяжёлое нагрузочное тестирование в последних числах декабря-2012), в некоторых из которых по два прайсчекера, и в каждом магазине отображаются конкретно его цены с учётом автоматических безусловных скидок. Сервер прайсчекеров работает с теми же типами прайсчекеров, что и сервисплюсовский - Штрих-М и Shuttle SG-15, однако теоретически может работать с любым прайсчекером в режиме "запрос - ответ" (SG-15) или "запрос-ответ1-задержка-ответ2" (Штрих-М). Что же касается выводимой информации, то ответ прайсчекеру формируется непосредственно в хранимой процедуре БД ukmserver. Поэтому выводить можно таким образом любую информацию, например, действующие и потенциальные скидки на товар, баланс и историю операций по подарочной карте или карте клиента, или сроки действия купона на скидку. Достаточно только нужным образом отредактировать хранимую процедуру.
Добавлено через 6 минут 41 секунду
Впрочем, вот функция для Shuttle SG-15 и сервисплюсовского сервера прайсчекеров. Функция выводит артикул товара, его наименование и стоимость с учётом автоматической безусловной скидки "Распродажа", величина в процентах которой так же отображается в последней строке:
Код:
function form_discount_info_shuttle(item)
local text = "";
local str = item.name;
local i = 1;
text = text .. hw_pch_command_clear_screen;
text = text .. hw_pch_command_small_font;
text = text .. hw_pch_command_align_l_t .. "артикул: " .. hw_pch_command_end_text;
text = text .. hw_pch_command_align_r_t .. item.item .. hw_pch_command_end_text;
while ukm.str_len(str) > 20 and i < 3 do
text = text .. hw_pch_cursor_pos(0,i);
text = text .. hw_pch_command_align_l_cur_y .. ukm.str_sub(str, 1, 20) .. hw_pch_command_end_text;
str = ukm.str_sub(str, 20, ukm.str_len(str));
i = i + 1;
end;
text = text .. hw_pch_cursor_pos(0,i);
text = text .. hw_pch_command_align_l_cur_y .. str .. hw_pch_command_end_text;
ukm.debug("item.remain: "..tostring(item.remain));
local discount_text="";
local disc_val="";
for i=1,item.discount_list:size()-1 do
local __discount = item.discount_list:at(i);
local discount_name=ukm.trim(__discount.first);
if discount_name=="Распродажа" then
disc_val=__discount.second;
if ukm.str_len(disc_val)>0 then
disc_val=string.gsub(ukm.trim(ukm.str_sub(disc_val,1,string.find(tostring(disc_val),",")-1)),"-","");
if ukm.str_len(disc_val)>0 then
local procento=(ukm.str_sub(disc_val,-1)=="%");
local discount_val=ukm.currency(string.gsub(disc_val,"%%","")*1.0);
if not procento then
disc_val=disc_val.." р.";
end;
if disc_val~="" then
disc_val="(со скидкой "..disc_val..")";
end;
discount_text=tostring(item.price-item.price*discount_val/ukm.currency(100)*ukm.currency(procento and 1 or 0)-discount_val*ukm.currency(not procento and 1 or 0));
end;
end;
end;
end;
local price_text="";
if discount_text=="" then
price_text=tostring(item.price);
else
price_text=discount_text;
end;
text = text .. hw_pch_cursor_pos(0,3)..hw_pch_command_align_l_cur_y .. " цена: " .. hw_pch_command_end_text .. hw_pch_command_align_r_cur_y .. price_text .. " р." .. hw_pch_command_end_text;
text = text .. hw_pch_command_next_line .. hw_pch_command_align_c_b .. disc_val .. hw_pch_command_end_text;
ukm.debug("Shuttle SG-15 scanning: "..item.item .. " \""..item.name.."\", цена: " .. price_text.. "р. "..disc_val);
return text;
end
Добавлено через 2 минуты 46 секунд
А вот то же самое для Штрих-М, только в бегущих строках и в два экрана:
Код:
function form_discount_info_shtrih(item)
local discount_val="";
local discount_price="";
local discount_text="";
local disc_val="";
for i=1,item.discount_list:size()-1 do
local __discount = item.discount_list:at(i);
local discount_name=ukm.trim(__discount.first);
if discount_name=="Распродажа" then
disc_val=__discount.second;
if ukm.str_len(disc_val)>0 then
disc_val=string.gsub(ukm.trim(ukm.str_sub(disc_val,1,string.find(tostring(disc_val),",")-1)),"-","");
if ukm.str_len(disc_val)>0 then
local procento=(ukm.str_sub(disc_val,-1)=="%");
local discount_val=ukm.currency(string.gsub(disc_val,"%%","")*1.0);
if not procento then
disc_val=disc_val.." р.";
end;
if disc_val~="" then
disc_val="(со скидкой "..disc_val..")";
end;
discount_text=tostring(item.price-item.price*discount_val/ukm.currency(100)*ukm.currency(procento and 1 or 0)-discount_val*ukm.currency(not procento and 1 or 0));
end;
end;
end;
end;
local price_text="";
if discount_text=="" then
price_text=tostring(item.price);
else
price_text=discount_text;
end;
local text = item.name .. "\n"
.. "цена: " .. price_text .. "р.";
ukm.debug("Shtrih-M scanning: "..item.item .. " \""..item.name.."\", цена: " .. price_text.. "р. "..disc_val);
return text;
end