[ОТВЕТИТЬ]
19.03.2010 01:06
Павел Сосновских
 
Поставлена задача:
надо, чтобы в чеке, в котором накапливаются/расходуются бонусы внизу в разделе скидок чека появилось что-то вида:

Накоплено бонусов:......<сумма>
Бонусов на счете:.........<сумма>
Использовано бонусов:..<сумма>

Соответственно, правлю reciept.lua Пока что получилось сделать только 3ью из этих строк. Для остальных, насколько понимаю, надо использовать:
adder_info.amount и client_account.account_balance_info, но не до конца понимаю как их использовать в нужном разделе чека - print_hard_subtotal

Буду благодарен любой помощи, ибо в ООП на данный момент не очень силен.
22.03.2010 14:55
Павел Сосновских
 
Что-то никто ничего не говорит...
Кое-что-то сделать уже удалось. А именно, строку "Накоплено бонусов...<сумма>". Сделал вот как:
Код:
         if __hard_subtotal.receipt.items:getdiscount(discount):is_initialized() and __hard_subtotal.receipt.items:getdiscount(discount):get():sign() == 0 then
	        if string.len(ukm.rightpad(ukm.left(discount.name, width-20),width-20,".") .. " " ..  tostring(__hard_subtotal.receipt.items:getbasetotal(discount)*ukm.currency(0.05))) < width then
                    text = text .. ukm.adjustment(ukm.rightpad(ukm.left(discount.name, width-20),width-20,"."), tostring(__hard_subtotal.receipt.items:getbasetotal(discount)*ukm.currency(0.05)), width-1, ".") .. "\n";
                 else
                    text = text .. ukm.rightpad(ukm.rightpad(ukm.left(discount.name, width-20),width-20,"."), width-1, ".") .. "\n";
                    text = text .. ukm.leftpad(tostring(__hard_subtotal.receipt.items:getbasetotal(discount)*ukm.currency(0.05)),width-1,".") .. "\n";
                 end
         end
Это все в функции print_hard_subtotal
там, где "--печать скидок чека"
Перед строкой:
Код:
         if __hard_subtotal.receipt.items:getdiscount(discount):is_initialized() and __hard_subtotal.receipt.items:getdiscount(discount):get():sign() ~= 0 then
Сделал немного коряво. Как сделать, чтоб процент не вручную был прописан, а брался из алгоритма скидки?

Осталось сделать баланс на счете клиента. Приведенная раньше мысль об adder_info.amount оказалась неверна. Это поле будет заполнено, если на счет начисляется сумматорами. У меня - алгоритмами скидок. Нужно как-то добраться до client_account.account_balance_info, но как это сделать в скрипте чека разобраться не могу. Может быть можно как-то это вывести в разделе про клиента (print_client). Может быть как-то включить sql-запрос в скрипт чека.
Буду благодарен любым идеям.
22.03.2010 16:27
vdm
 
Грамотно подсказать не могу, не делал в скриптах ничего сложнее комментирования и правки текстов.

По процентам.
Накоплено бонусов: - это должна быть сумма начисления по текущему чеку ?
Тогда ниччего не понял, зачем вручную ее считать, когда в там стандартном виде есть .... getdiscount(discount):get()
По имени или каким-то другим параметрам определить, что текущая скидка - начисляющая на счет и вывести ее с нужным текстом. Хотя если она не сохраняется в чеке... Тогда не знаю.

По счетам - может взять из account.lua - print_client_account_info
account = ukm.map.string.currency.iterator(__client_info.account_info);
и т.д. ... ?
Опять же по каким-то критериям (имя/id) нужно отфильтровать бонусный счет.

sql можно использовать, см. reports_ext.lua
22.03.2010 22:51
Павел Сосновских
 
Цитата:
vdm По счетам - может взять из account.lua - print_client_account_info
account = ukm.map.string.currency.iterator(__client_info.account_info);
и т.д. ... ?
Опять же по каким-то критериям (имя/id) нужно отфильтровать бонусный счет.

sql можно использовать, см. reports_ext.lua
Это я все видел. Вот только непонятно как это использовать в receipt.lua
Функции из account.lua, насколько я понимаю, вызываются УКМом с какими-то параметрами. Среди них есть параметр класса client_account, поэтому там легко можно обратиться и к балансу счета. В reports_ext.lua тоже самое - функциям передается параметр(вроде __rep) класса query, с которым можно соответсвующим образом обращаться. В скрипте же receipt.lua подходящих входных параметров не нашел. Или они все же есть?

Цитата:
vdm когда в там стандартном виде есть .... getdiscount(discount):get()
Так не получается. Скидка начисляющая на счет клиента не меняет сумму текущего чека, поэтому приведенный способ даст "0.00". Надо добраться именно до алгоритма скидки.
24.03.2010 20:19
Павел Сосновских
 
Нарисовал после ответа ТП плюса. Приведу выдержки из него на случай, если кому понадобится:

Цитата:
1. Процент скидки из созданного алгоритма вывести в lua нельзя. Предлагаю добавить его в название скидки и выводить вместе с ним;
2. Доступ к классу query есть только для отчетов по внешним скриптам. Для работы с query надо иметь соединение с БД, а оно экспортируется только в отчетах;
3. Класс client_account предоставляет информацию по текущим суммам на счетах клиента.
Описание:
Класс client_account - счета клиентов
client_id - идентификатор клиента, string
client_name - имя клиента, string
account_info - информация о счетах, map<string, currency>
account_balance_info - информация о балансе, map<string, struct_balance_info>
client_patronymic - отчество, optional< string >
client_surname - фамилия, string

Класс struct_balance_info - информация о балансе
account_type_id - ID типа счета, int
balance - баланс, currency
credit - кледит, currency
decrease_type - тип списания, int
increase_type - тип увеличения, int

Пример использования: Получение сумм на счетах зарегистрированного в чеке клиента
local core = ukm.get_core(ukm.mashine.handle);
local text = "";
if core.header.__ok and core.header.client.__ok then
text = text .. "Баланс на счетах клиента:\n";
local account = ukm.map.string.struct_balance_info.iterator(ukm.get_client_account_info(core.header.client).account_balance_info);
while account:next() do
text = text .. ukm.adjustment(account:first(), tostring(account:second().balance), 80," ") .. "\n";
end
end
return text;
и еще добавление к этому:
Цитата:
Хочу только заметить, что информация о балансе на счетах клиента выводится в чек клиента именно в момент оформления этого чека, но эта информация не запоминается вместе с чеком. Таким образом, если напечатать копию чека, то в ней будет информация на момент печати копии. Поэтому рекомендуется в шаблонах копии чеков не выводить информацию о состоянии счетов.



Еще замечу, что такой способ вывода информации о состоянии счетов клиентов не является штатным (соответствующая доработка только запланирована). При этом способе <портится> краткая форма отображения чека на вебе сервера, но остается работоспособной подробная форма просмотра (речь идет о функционале - <отчеты - поиск чека - просмотр чека> на сервере УКМ).
20.04.2010 07:15
EJara
 
Прошу прощенья, не смог разобраться.
При добавлении данного кода в receipt.lua получаю ошибку "attempt to call method `getbasetotal` (a nil value)"
Может кто-нибудь выложить целиком receipt.lua? Если честно - то просто очень не хочется разбираться, если есть готовое решение - с удовольствием использую его
23.04.2010 14:33
Павел Сосновских
 
вот полный текст скрипта: receipt.lua
ну и моя тема как все настраивалось: Бонусная скидка
если что, спрашивайте
23.04.2010 15:37
EJara
 
Спасибо огромное, Павел! В понедельник проверю как это будет работать у меня. А саму скидку уже настроил, тоже по Вашей инструкции
12.11.2010 15:31
didinap
 
Павел, ссылка кажется уже не рабочая. Перезалей пожалуйста куда нибудь.
19.11.2010 20:15
Павел Сосновских
 
Вот:
Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 5 сообщение(ий)):
У вас нет прав чтобы видеть скрытый текст, содержащийся здесь.
23.11.2010 17:41
didinap
 
Цитата:
Павел Сосновских Вот:
*** скрытый текст ***
Никак не могу подключится к FTP.
Скинь на какой нибудь обменник пожалуйста.
17.10.2012 13:03
Eugin_S
 
Как в функции:

Код:
if core.header.__ok and core.header.client.__ok then
       local account = ukm.map.string.struct_balance_info.iterator(ukm.get_client_account_info(core.header.client).account_balance_info);
       while account:next() do
           text = text .. ukm.adjustment(account:first(), tostring(ukm.currency(account:second().balance)), __width,".") .. "\n";
       end
    end
    return text;
сделать так, чтобы выводился баланс не по всем счетам, а только по определенному?
17.10.2012 13:51
didinap
 
Ну тогда вот... То что все хотели в начале поста:)
Выводит накопления по чеку в подвале чека
На счеты было
Накоплено
Осталось
Надо просто вставить в receipt.lua в функцию function print_receipt_footer и вписать имя счета на место "Первый счет"
У нас работает на 48СП6 до 49сп9.
Если правильно помню на 47ой или даже на 48сп5 были какие то проблемы, кажется вообще не выводилось ничего на чеке по накоплениям.

Цитата:
function print_receipt_footer(__footer, __print_data)
local printer = ukm.get_printer(ukm.printer_type_master());
if printer then
local text = "";
local width = printer:get_width();
-- Начало

if __footer.receipt.header.client.__ok then
local acc_inrc = ukm.currency(0);

for i=0, __footer.receipt.discounts:size() - 1 do
local d = __footer.receipt.discounts:at(i);
local di = __footer.receipt.items:getdiscountaccount(d);

if di:is_initialized() then
acc_inrc = acc_inrc + di:get();
end
end
-- text = text .. ukm.center("-", width+8, "-") .. "\n";
text = text .. "\n" .."Ваши накопления" .. "на дату " .. ukm.ptime2str(ukm.get_sys_date(), "%H:%M %d.%m.%Y") .. "\n"
.. ukm.adjustment("Текущий", tostring(ukm.currency(-1) * acc_inrc), 48, " ") .. "\n";


local account = ukm.map.string.struct_balance_info.iterator(ukm.get_client_open_account_info(__footer.receipt.header.client).account_balance_info);

while account:next() do
if account:first() == "Первый счет" or
account:first() == "Второй счет" then

if account:second().account_type_id == -1 then
text = text .. ukm.adjustment(account:first(), " Связь отсутсвует", 48," ") .. "\n";
else

if __footer.receipt.type == ukm.core.normal or __footer.receipt.type == ukm.core.restore_ then
text = text .. ukm.adjustment("Прежний остаток на счете", tostring(account:second().balance), 23 ," ") .. " "
.. ukm.adjustment("Текущий остаток на счете", tostring(account:second().balance - acc_inrc), 24 , " ") .. "\n"

else


text = text .. ukm.adjustment("Прежний остаток на счете", tostring(account:second().balance + acc_inrc), 23 ," ").. " "
.. ukm.adjustment("Текущий остаток на счете", tostring(account:second().balance), 24 , " ") .. "\n"

end
-- text = text .. ukm.center("-", width+8, "-") .. "\n";
end
end
end
end



-- Конец
17.10.2012 14:25
Eugin_S
 
Спасибо, у меня работает на версии 49.9.

Подскажите, можно еще добавить в подвал фамилию клиента?
17.10.2012 14:31
didinap
 
Цитата:
Eugin_S Спасибо, у меня работает на версии 49.9.

Подскажите, можно еще добавить в подвал фамилию клиента?
Думаю если захотеть то можно. Правда мне это не удалось, и времени не было чтоб разбираться.
17.10.2012 16:27
Eugin_S
 
Есть ли в
Код:
__footer.receipt.header.client
имя клиента, и как можно его вывести? Где теперь можно посмотреть описания классов?
17.10.2012 23:32
vdm
 
В receipt.lua функция print_client(__header, __width).
В print_receipt_footer вызвать ее ровно также, как в print_receipt_open, только с правильным параметром:
text = text .. print_client(__footer.receipt.header, width);

Если нужно не все, а только имя - вытащить пару строк из кода print_client не проблема.

Описания lua на сервплюсе и правда не видно.
На ftp есть тут: /HELP/UKM/LUA/
Не вчерашней давности, но достаточно.
23.10.2012 01:46
Павел Сосновских
 
Вижу существенные изменения в изначально начатом.
Насколько понимаю, в футере достучаться до фамилии можно следующим образом:
if __footer.receipt.header.client.__ok then
text = text .. ukm.adjustment("Фамилия:", __footer.receipt..client.sur_name, __width, " ") .. "\n";
end

Встречный вопрос: при всем этом выше описанном, в новых версиях перестала "портиться" краткая форма чека на вебе?
24.10.2012 04:22
Eugin_S
 


Как-то вот так, если вы про это. Не отображается баланс, должны быть еще две строки: "Предыдущий баланс" и "Текущий баланс".
24.10.2012 05:25
Eugin_S
 
Вот такой код у меня получается:

Код:
--Модуль печати накоплений

	if __footer.receipt.header.client.__ok then
		local acc_inrc = ukm.currency(0);

			for i=0, __footer.receipt.discounts:size() - 1 do
				local d = __footer.receipt.discounts:at(i);
				local di = __footer.receipt.items:getdiscountaccount(d);

					if di:is_initialized() then
						acc_inrc = acc_inrc + di:get();
					end
	end

	text = text .. ukm.adjustment("Фамилия:", __footer.receipt..client.sur_name, __width, " ") .. "\n";

	text = text .. "\n" .."Накопленные баллы " .. "на " .. ukm.ptime2str(ukm.get_sys_date(), "%H:%M %d.%m.%Y") .. "\n"
	.. ukm.adjustment("Начислено:", tostring(ukm.currency(-1) * acc_inrc), 48, " ") .. "\n";

	local account = ukm.map.string.struct_balance_info.iterator(ukm.get_client_open_account_info(__footer.receipt.header .client).account_balance_info);

	while account:next() do
		if account:first() == "Накопление бонусов" or
		account:first() == "Второй счет" then

			if account:second().account_type_id == -1 then
			text = text .. ukm.adjustment(account:first(), " Связь отсутсвует", 48," ") .. "\n";
			else

				if __footer.receipt.type == ukm.core.normal or __footer.receipt.type == ukm.core.restore_ then
				text = text .. ukm.adjustment("Предыдущий баланс:", tostring(account:second().balance), 48 ," ") .. "\n"
				.. ukm.adjustment("Текущий баланс:", tostring(account:second().balance - acc_inrc), 48 , " ") .. "\n"
				else
                    
                    text = text .. ukm.adjustment("Предыдущий баланс:", tostring(account:second().balance + acc_inrc), 48 ," ").. "\n" 
					.. ukm.adjustment("Текущий баланс:", tostring(account:second().balance), 48 , " ") .. "\n"
                end
			end
		end
	end                                                                                                       	
end

--Конец модуля печати накоплений
УКМ выдает ошибку:

Код:
09:35:25: 0x00004000: WARNING: debug#/usr/local/storage/home/ukm/build-rel-49_sp9-2012_08_02_11_23_22/ukm/libukm/ccore.cpp(4618) CheckForNotEndedReceipt: п&#247;я&#9472;п&#9574; п&#9574;я&#9474;п©п&#9580;п&#9577;пҐп&#9571;пҐп&#9574;п&#9574; я&#9474;п&#9576;я&#9472;п&#9574;п©я&#9484;п&#9567; п©я&#9472;п&#9580;п&#9574;пЇп&#9580;я&#9516;п&#9577;п&#9567; п&#9580;я&#9516;п&#9574;п&#9568;п&#9576;п&#9567;: [string "receipt.lua"]:465: attempt to index global 'client' (a nil value)
25.10.2012 17:01
vdm
 
Ошибки (опечатки?).

__width - там есть такая переменная или это должно быть width ?
"Фамилия:", __footer.receipt..client.sur_name - пропущен header между точками
16.11.2012 13:45
Dim
 
Цитата:
didinap Ну тогда вот... То что все хотели в начале поста:)
Выводит накопления по чеку в подвале чека
На счеты было
Накоплено
Осталось
Надо просто вставить в receipt.lua в функцию function print_receipt_footer и вписать имя счета на место "Первый счет"
У нас работает на 48СП6 до 49сп9.
Если правильно помню на 47ой или даже на 48сп5 были какие то проблемы, кажется вообще не выводилось ничего на чеке по накоплениям.
48 СП5 - не печатает сумму в строке "Текущий остаток на счете"

как поправить?

upd: это сделал...

теперь вопрос другой... на кассе 2 ФР, соответственно печатается сводный чек. на сводном чеке все печатается как надо, а в фискальном чеке не считается начисление по текущему чеку, соответственно, неправильно печатается текущий остаток на счете... как бы тогда либо чтобы печаталось и в фискальном чеке нормально, либо в фискальном чеке не печаталась информация по накоплениям вообще?

upd2: я подумал, что на фискальном чеке этой информации быть не должно... помогите с условием пожалуйста
16.11.2012 15:08
OlegON
 
Как сделал? Нарушаешь правила...
16.11.2012 15:58
Dim
 
судя по всему текст не влазил по ширине чека, хотя визуально ширины достаточно... правда в настройках ФР-ов стоит компактная печать по горизонтали...

извини, Олег, исправлюсь ))
16.11.2012 16:52
didinap
 
Цитата:
Dim 48 СП5 - не печатает сумму в строке "Текущий остаток на счете"

как поправить?

upd: это сделал...
На 48сп5 у меня тоже почему то не печаталось. Заработало только на 48сп6.
16.11.2012 19:18
Dim
 
Цитата:
didinap На 48сп5 у меня тоже почему то не печаталось. Заработало только на 48сп6.
это у меня заработало... как запретить печатать в фискальном чеке?
23.11.2012 09:56
Dim
 
Цитата:
Mtirt Наверное также как здесь: https://olegon.ru/showthread.php?t=13380
не работает как нужно... добавил строку
Код:
if (__footer.receipt.type == ukm.core.goods_receipt) or (__footer.receipt.header:receipt_type() == ukm.header.nonfiscal) then
перестало печататься вообще... т.е. сводный чек, который печатается на основном принтере при многофискальности считается фискальным чеком...

вопрос остается. как в модуле луа поставить условие, чтобы накопления печатались ТОЛЬКО на сводном чеке?
23.11.2012 11:09
Dim
 
разобрался.... код перенес из функции print_receipt_footer перенес в функцию print_receipt_payment... заработало так как я хотел, т.е. при многофискальности информация о состоянии счета печатается только на сводном чеке.
12.11.2013 12:03
integor
 
Так все же каким способом извлечь процент скидки из алгоритма скидки, что бы он прописался в чеке?


Опции темы


Часовой пояс GMT +3, время: 20:50.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.