[ОТВЕТИТЬ]
29.03.2012 12:46
УКМ_эксплуатант
 
А вдруг кому-то пригодится. Если так не считаете - прибейте тему.
А дело было так: придумали маркетологи акцию - за каждую полную тыщу в ИТОГО покупателю дается ШТУК (а моем случае это был КУПОН), который потом можно тем или иным макаром применить. Т.е. у покупателя товаров на 3456 руб, то выдается 3 КУПОНА, 1234 - 1 КУПОН и т.д.
Вот как я это реализовал. Может кому пригодится
А если подскажут, как это сделать более "изящно" - буду рад посмотреть...
Пихаем этот кусок "кода" в скрипт receipt.lua функция print_hard_subtotal
Код:
       if string.len("К ОПЛАТЕ:." .. ukm.leftpad(tostring(__hard_subtotal.receipt.subtotal.amount), 14, ".") .. " ", width, " ") < (width + 1) then
          text = text .. ukm.leftpad("К ОПЛАТЕ:." .. ukm.leftpad(tostring(__hard_subtotal.receipt.subtotal.amount), 14, ".") .. " ", width, " ") .. "\n";

-- *************************************************************************************************************
--              ПЕЧАТЬ ИНФОРМАЦИИ О КУПОНАХ

          text=text.."\n".."\n";
          local tempStr=tostring(__hard_subtotal.receipt.subtotal.amount);
          local t1=string.sub(tempStr,1,1);
          local t2=string.sub(tempStr,2,2);
          local t3=string.sub(tempStr,3,3);
          local t4=string.sub(tempStr,4,4);
          local t5=string.sub(tempStr,5,5);
          local t6=string.sub(tempStr,6,6);
          local Poz=0;         
          if t1=="." then
            Poz=1;
          end;
          if t2=="." then
            Poz=2; 
          end;
          if t3=="." then
            Poz=3;
          end;  
          if t4=="." then
            Poz=4;
          end;
          if t5=="." then
            Poz=5;
          end; 
          if t6=="." then
            Poz=6;
          end;
          local KolvoKuponov=0;
          if Poz==5 then
             KolvoKuponov=t1+0;
          else 
             if Poz==6 then
                KolvoKuponov=(t1..t2)+0;
             end;
          end;  
-- собственно печать количества купонофф


       text = text .. ukm.center("!!!!! ВНИМАНИЕ - АКЦИЯ !!!!!",width," ") .. "\n";
       text = text .. ukm.center("C _______ до ____________",width," ") .. "\n";
       text = text .. ukm.center("Количество купонов - "..KolvoKuponov ,width," ") .. "\n";
       text = text .. ukm.center("ЧТО-ТО О ПРИМЕНЕНИИ КУПОНОВ" ,width," ") .. "\n";
          text=text.."\n".."\n";
-- *************************************************************************************************************



       else
          text = text .. ukm.rightpad("К ОПЛАТЕ:.", width, ".") .. "\n";
          text = text .. ukm.leftpad(tostring(__hard_subtotal.receipt.subtotal.amount) .. " " ,width, ".") .. "\n";

-- *************************************************************************************************************
--              ПЕЧАТЬ ИНФОРМАЦИИ О КУПОНАХ

          text=text.."\n".."\n";
          local tempStr=tostring(__hard_subtotal.receipt.subtotal.amount);
          local t1=string.sub(tempStr,1,1);
          local t2=string.sub(tempStr,2,2);
          local t3=string.sub(tempStr,3,3);
          local t4=string.sub(tempStr,4,4);
          local t5=string.sub(tempStr,5,5);
          local t6=string.sub(tempStr,6,6);
          local Poz=0;         
          if t1=="." then
            Poz=1;
          end;
          if t2=="." then
            Poz=2; 
          end;
          if t3=="." then
            Poz=3;
          end;  
          if t4=="." then
            Poz=4;
          end;
          if t5=="." then
            Poz=5;
          end; 
          if t6=="." then
            Poz=6;
          end;
          local KolvoKuponov=0;
          if Poz==5 then
             KolvoKuponov=t1+0;
          else 
             if Poz==6 then
                KolvoKuponov=(t1..t2)+0;
             end;
          end;  
-- собственно печать количества купонофф

         text = text .. ukm.center("!!!!! ВНИМАНИЕ - АКЦИЯ !!!!!",width," ") .. "\n";
       text = text .. ukm.center("C _______ до ____________",width," ") .. "\n";
       text = text .. ukm.center("Количество купонов - "..KolvoKuponov ,width," ") .. "\n";
       text = text .. ukm.center("ЧТО-ТО О ПРИМЕНЕНИИ КУПОНОВ" ,width," ") .. "\n";
          text=text.."\n".."\n";
-- *************************************************************************************************************



       end

       if __hard_subtotal.receipt.type == ukm.core.goods_receipt then
29.03.2012 18:04
vdm
 
В недоумении
- Не заметил смысла в 2-х одинаковых вставках кода внутрь if string.len(...
Почему не вынести наружу 1.
- Количество купонов - целое от деления суммы на 1000 - не?
29.03.2012 21:29
УКМ_эксплуатант
 
Два раза потому-что так заработало, а так как нужно было "вчера" - то так и запустили в дело. А потом было лень "вылизывать" код - работает и ладно...
Да. Количество купонов=целое от ИТОГО/1000
Но зачем лишний раз преобразовывать и считать, если пятый и шестой символы слева от точки и так дают количество купонов?

Добавлено через 4 минуты 58 секунд
ААА! Сейчас опять сообразил зачем два раза дела!
Два раза делается для того, что-бы эта надпись печаталась в любом случае: и когда "К ОПЛАТЕ" влезает в одну строчку, и когда не влезает.
З.Ы. Вроде так. В общем привязка к оформлению строки "К ОПЛАТЕ"....
30.03.2012 07:18
Mtirt
 
И какая связь со строкой "К ОПЛАТЕ"?
Ты же всё равно эту информацию с отдельной строки печатаешь?
30.03.2012 10:21
УКМ_эксплуатант
 
Хотели, что-бы эта информация печаталась после строки "К ОПЛАТЕ".
Насколько помню, это значение (итого) смог получить (может неправильно что-то писал) только в этой функции.
26.02.2015 10:02
Nordik
 
Подскажите пож-та нужно почти тоже самое . Только нужно чтобы печатался купон в котором было бы указано N карточек выдать. N(целое)= сумма чека/500. Т.е при покупке на сумму чека 2750 чтобы в купоне было напечатано "Получите у кассира 5 карточек", для этого сделал скидку печать купона от суммы чека равной 500руб.
Что нужно прописать в скрипте чтобы он высчитал кол-во карточек и это кол-во напечатал в купоне ? Спасибо
26.02.2015 10:14
Mtirt
 
Может не надо на чеке печатать, а просто выдать сообщение кассиру? На монитор?
26.02.2015 10:20
Nordik
 
Цитата:
Mtirt Может не надо на чеке печатать, а просто выдать сообщение кассиру? На монитор?
Поставили задачу такую чтобы клиент знал сколько ему должны выдать карточек, и кассир не забрала их себе.
26.02.2015 10:38
Mtirt
 
Как обычно, традиционные вопросы: что именно сделали, где не получается, какие ошибки и в каком месте получаете?
26.02.2015 11:21
Nordik
 
Сделал скидку печать купона от суммы чека равной 500руб.
function print_discount_coupon(__rep, __print_data)
local printer = ukm.get_printer(ukm.printer_type_master());
if printer then
local text = "";
local width = printer:get_width();
text = text .. ukm.center("Акция ",width, " ") .. "\n";
text = text .. ukm.rightpad("Получите на кассе " .. __rep.discount.." карточек ",width, " ") .. "\n";
text = text .. ukm.center("*", width,"*") .. "\n";
__print_data:add(text, ukm.printer_type_master());
end
end
в данном случае просто прописал в скидке диапазоны по 500 до 10000 , и беру rep.discount = в зависимоти от диапазона кол-ву карточек.
но проблема в том что чеки могут быть и 20000 и прописывать это в каждом магазине не вариант так как нет СГО. а с скриптами Lua не знаком.
06.03.2015 12:08
vdm
 
Если еще нужно.
1 диапазон без ограничения сверху.
Количество вычисляется от суммы чека.
Код:
kolvo = math.floor(tonumber(ukm.rightcut(__rep.receipt_amount,3))/500);
text = text .. ukm.rightpad("Получите на кассе " .. tostring(kolvo) .." карточек ",width, " ") .. "\n";
16.07.2015 17:12
УКМ_эксплуатант_2
 
Последнее не сработало. Ругалась на "правый кусь": не стал разбираться.
Главная проблема в том, что сумма получается в "хрен знает" каком формате и стандартные операции (преобразования типов, арифметика) не срабатывает (ukm.currency тоже какой-то убогий).
Пришлось в цикле урезать до точки. Тоже замучился (забыл, что в ЛУА НЕРАВНО записывается как ~=, а не <> или !=; об.....ля с функцией string.sub), но победил...
Делал так (receipt.lua) (вставленные мной куски выделены звездочками)
В начале скрипта:
Код:
-- Модуль печати чека
--переменная для сжатой печати
compresed_print = false;
--**********************************************
ITOGO=0;
--**********************************************
В функцию print_hard_subtotal (наверное, в любом месте можно)
Код:
--печать скидок чека
--*******************************************************************
ITOGO=__hard_subtotal.receipt.subtotal.amount;
--*******************************************************************
Ну и в print_receipt_footer (я захотел после СПАСИБО ЗА ПОКУПКУ):
Код:
 text = text .. ukm.center("СПАСИБО ЗА ПОКУПКУ!",width," ") .. "\n";

--**************************************************************

local sss=tostring(ITOGO);
local it="";
-- получаем без копеек
local i = 1;
while string.sub(sss,i,i) ~= "." do
   it=it..string.sub(sss,i,i);
   i = i + 1;
end;
kolvo = math.floor(tonumber(it)/999);
 text = text .. ukm.center("\n\n****************************************",width," ") .. "\n";
text = text .. ukm.center("Получите на кассе " .. tostring(kolvo) .." купона (-ов)",width, " ") .. "\n";
 text = text .. ukm.center("****************************************",width," ") .. "\n\n";
--**************************************************************
З.Ы. Почитав "мурзилку" по ЛУА от С+ нашел НУ ОЧЕНЬ "ВКУСНУЮ" функцию! Все кто не пользовался (по какой-либо причине) рекомендую!!!
Вот она:
Код:
ukm.debug("ТЕКСТ")
или
Код:
PEREMENNAYA=100;
ukm.debug(PEREMENNAYA);
выведет в логи сервера
ТЕКСТ
или
100
соответственно!

Ну прям в восторге!
16.07.2015 17:13
УКМ_эксплуатант_2
 
P.P.S. Если кто знает более изящное решение - буду благодарен.
17.07.2015 10:01
vdm
 
ukm.currency вполне себе удобен тем, что автоматически округляется до копеек.
А вот вручную искать в числе точку чтобы выбросить копейки, смысла не вижу. tostring() от currency всегда дает строку с точкой и двузначными копейками (ну, для рублевых единиц по крайней мере).
"Проблемы" могут быть у tonumber() от строки с нецелым числом, где-то она точку воспринимает как разделитель дробной части, а где-то запятую. Сам с таким сталкивался.
28.07.2015 13:08
УКМ_эксплуатант_2
 
Во-во! Вот из-за неразберихи с "." и "," пришлось заниматься ....измом...
28.07.2015 14:08
OlegON
 
Я так полагаю, что десятичный разделитель определяется локалью. Соответственно, надо либо ее контролировать, либо задавать свою.
Опции темы


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

 

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