Установка бонусов кассирам — различия между версиями

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск
(Установить ТМС)
Строка 7: Строка 7:
  
 
  <nowiki>
 
  <nowiki>
uses
+
uses
 
   Graphics, Controls, Forms, Dialogs, StdCtrls,
 
   Graphics, Controls, Forms, Dialogs, StdCtrls,
 
   ComCtrls, ExtCtrls, ibquery, DB, ChequeList, FR,
 
   ComCtrls, ExtCtrls, ibquery, DB, ChequeList, FR,
Строка 17: Строка 17:
 
   iq: tibquery;
 
   iq: tibquery;
 
   BONUS_CALCULATE_DAY: string;
 
   BONUS_CALCULATE_DAY: string;
 +
  i: integer;
 
  begin
 
  begin
 
   //Создаем соединение с базой
 
   //Создаем соединение с базой
Строка 46: Строка 47:
 
   iq.sql.text := 'select Round(coalesce(sum(bonus),0),2) as sum_bonus from DOCS d where status = 1 and' +
 
   iq.sql.text := 'select Round(coalesce(sum(bonus),0),2) as sum_bonus from DOCS d where status = 1 and' +
 
   '((doc_type = 3 and d.owner = ' + inttostr(userid) + ') or (doc_type = 9 and (select owner from docs d2 where d2.id = d.parent_id) = ' + inttostr(userid) + ')) and ' +
 
   '((doc_type = 3 and d.owner = ' + inttostr(userid) + ') or (doc_type = 9 and (select owner from docs d2 where d2.id = d.parent_id) = ' + inttostr(userid) + ')) and ' +
   'd.commitdate between '''+BONUS_CALCULATE_DAY+''' || ''.'' || iif('+BONUS_CALCULATE_DAY+' > EXTRACT(DAY from CURRENT_DATE), EXTRACT(MONTH from DATEADD(month, -1, CURRENT_DATE)),EXTRACT(MONTH from CURRENT_DATE)) || ''.'' || EXTRACT(YEAR from CURRENT_DATE) || '' 00:00' '' +
+
   'd.commitdate between '''+BONUS_CALCULATE_DAY+''' || ''.'' || iif('+BONUS_CALCULATE_DAY+' > EXTRACT(DAY from CURRENT_DATE), EXTRACT(MONTH from DATEADD(month, -1, CURRENT_DATE)),EXTRACT(MONTH from CURRENT_DATE)) || ''.'' || iif(1 = EXTRACT(MONTH from CURRENT_DATE), EXTRACT(YEAR from DATEADD(YEAR, -1, CURRENT_DATE)),EXTRACT(YEAR from CURRENT_DATE)) || '' 00:00''' +
 
   ' and CURRENT_DATE || '' 23:59''';
 
   ' and CURRENT_DATE || '' 23:59''';
 
   iq.active := True;
 
   iq.active := True;
 
   TagSetContent(fmMain.ewbInfo, 't_bonus_all', StringReplace(iq.FieldByName('sum_bonus').AsString, '.', ',', 1) );
 
   TagSetContent(fmMain.ewbInfo, 't_bonus_all', StringReplace(iq.FieldByName('sum_bonus').AsString, '.', ',', 1) );
 +
 +
  //Определяем суммарный бонус за месяц по всем кассирам
 +
  iq.active := False;
 +
  iq.sql.text := 'select * from '+
 +
  '(select u.username, '+
 +
  ' (select coalesce(-1*sum(summa),0) as summa_all from DOCS d Where d.status = 1 and d.commitdate between '''+BONUS_CALCULATE_DAY+''' || ''.'' || iif('+BONUS_CALCULATE_DAY+' > EXTRACT(DAY from CURRENT_DATE), EXTRACT(MONTH from DATEADD(month, -1, CURRENT_DATE)),EXTRACT(MONTH from CURRENT_DATE)) || ''.'' || iif(1 = EXTRACT(MONTH from CURRENT_DATE), EXTRACT(YEAR from DATEADD(YEAR, -1, CURRENT_DATE)),EXTRACT(YEAR from CURRENT_DATE)) || '' 00:00'' and CURRENT_DATE || '' 23:59'' and ' +
 +
  '  ((doc_type = 3 and d.owner = u.id) or (doc_type = 9 and (select d2.owner from docs d2 where d2.id = d.parent_id)=u.id))) as summa_all '+
 +
  ' from users u '+
 +
  ' where u.status = 0 and exists(select * from GROUP_DETAIL where GROUPTABLE_ID = u.id and GROUPTABLE = ''USERS'' and GROUP_ID = -1) ) as data '+
 +
  ' order by summa_all desc';
 +
  iq.active := True;
 +
  i:=0;
 +
  While not(iq.Eof) do
 +
  begin
 +
    i:=i+1;
 +
    TagSetContent(fmMain.ewbInfo, 't_kassir_caption'+IntToStr(i), iq.FieldByName('username').AsString);
 +
    TagSetContent(fmMain.ewbInfo, 't_kassir_bonus'+IntToStr(i), StringReplace(iq.FieldByName('summa_all').AsString, '.', ',', 1) );
 +
    //  showmessage(iq.FieldByName('username').AsString + ':' +iq.FieldByName('sum_bonus').AsString);
 +
    iq.Next;   
 +
  end
 +
 
   iq.active := False;
 
   iq.active := False;
 
   iq.transaction.free;
 
   iq.transaction.free;

Версия 11:16, 4 февраля 2015

Заменить версию Кассира

Заменить zkassa.exe на версию 2.17.9 от 25.09.2014 или выше.

Установить ТМС

  • Создать новую ТМС в Кассире и назвать ее "Бонусы кассирам"
  • Исходный код данной ТМС:
uses
  Graphics, Controls, Forms, Dialogs, StdCtrls,
  ComCtrls, ExtCtrls, ibquery, DB, ChequeList, FR,
  ScriptRes, Barcode,ZKassa, StrUtils, Windows, Classes,
  IBDataBase, SysUtils;
       
 Procedure BonusRecalc;
 var
  iq: tibquery;
  BONUS_CALCULATE_DAY: string;
  i: integer;
 begin
   //Создаем соединение с базой
   iq := tibquery.create(nil);
   iq.transaction := CreateRT(CurrDB);
   iq.transaction.starttransaction;
   iq.active := False;
   //Определяем день, с которого считать бонусы
   iq.sql.text := 'select param_value from params where param_id=''BONUS_CALCULATE_DAY''';
   iq.active := True;
   //забираем данные
   if iq.Eof then exit;
   BONUS_CALCULATE_DAY:= Trim(iq.FieldByName('param_value').AsString);
   //Определяем бонус за последний чек
   iq.active := False;
   iq.sql.text := 'select Round(coalesce(sum(bonus),0),2) as sum_bonus from DOCS d where d.id = '+
                  '(select max(id) from DOCS d2 where status = 1 and ( (doc_type = 3 and owner = ' + inttostr(userid) + ') or (doc_type = 9 and (select owner from docs d3 where d3.id = d2.parent_id) = ' +  inttostr(userid) + ') ))'
   iq.active := True;
   TagSetContent(fmMain.ewbInfo, 't_bonus', StringReplace(iq.FieldByName('sum_bonus').AsString, '.', ',', 1) );
   //Определяем суммарный бонус за смену
   iq.active := False;
   iq.sql.text := 'select Round(coalesce(sum(bonus),0),2) as sum_bonus from DOCS d where status = 1 and' +
   '((doc_type = 3 and d.owner = ' + inttostr(userid) + ') or (doc_type = 9 and (select owner from docs d2 where d2.id = d.parent_id) = ' + inttostr(userid) + ')) and ' +
   'd.commitdate between CURRENT_DATE || '' 00:00'' and CURRENT_DATE || '' 23:59''';
   iq.active := True;
   TagSetContent(fmMain.ewbInfo, 't_bonus_smena', StringReplace(iq.FieldByName('sum_bonus').AsString, '.', ',', 1) );
   //Определяем суммарный бонус за месяц
   iq.active := False;
   iq.sql.text := 'select Round(coalesce(sum(bonus),0),2) as sum_bonus from DOCS d where status = 1 and' +
   '((doc_type = 3 and d.owner = ' + inttostr(userid) + ') or (doc_type = 9 and (select owner from docs d2 where d2.id = d.parent_id) = ' + inttostr(userid) + ')) and ' +
   'd.commitdate between '''+BONUS_CALCULATE_DAY+''' || ''.'' || iif('+BONUS_CALCULATE_DAY+' > EXTRACT(DAY from CURRENT_DATE), EXTRACT(MONTH from DATEADD(month, -1, CURRENT_DATE)),EXTRACT(MONTH from CURRENT_DATE)) || ''.'' || iif(1 = EXTRACT(MONTH from CURRENT_DATE), EXTRACT(YEAR from DATEADD(YEAR, -1, CURRENT_DATE)),EXTRACT(YEAR from CURRENT_DATE)) || '' 00:00''' +
   ' and CURRENT_DATE || '' 23:59''';
   iq.active := True;
   TagSetContent(fmMain.ewbInfo, 't_bonus_all', StringReplace(iq.FieldByName('sum_bonus').AsString, '.', ',', 1) );

   //Определяем суммарный бонус за месяц по всем кассирам
   iq.active := False;
   iq.sql.text := 'select * from '+
   '(select u.username, '+
   ' (select coalesce(-1*sum(summa),0) as summa_all from DOCS d Where d.status = 1 and d.commitdate between '''+BONUS_CALCULATE_DAY+''' || ''.'' || iif('+BONUS_CALCULATE_DAY+' > EXTRACT(DAY from CURRENT_DATE), EXTRACT(MONTH from DATEADD(month, -1, CURRENT_DATE)),EXTRACT(MONTH from CURRENT_DATE)) || ''.'' || iif(1 = EXTRACT(MONTH from CURRENT_DATE), EXTRACT(YEAR from DATEADD(YEAR, -1, CURRENT_DATE)),EXTRACT(YEAR from CURRENT_DATE)) || '' 00:00'' and CURRENT_DATE || '' 23:59'' and ' +
   '   ((doc_type = 3 and d.owner = u.id) or (doc_type = 9 and (select d2.owner from docs d2 where d2.id = d.parent_id)=u.id))) as summa_all '+
   ' from users u '+
   ' where u.status = 0 and exists(select * from GROUP_DETAIL where GROUPTABLE_ID = u.id and GROUPTABLE = ''USERS'' and GROUP_ID = -1) ) as data '+
   ' order by summa_all desc';
   iq.active := True;
   i:=0;
   While not(iq.Eof) do
   begin
     i:=i+1;
     TagSetContent(fmMain.ewbInfo, 't_kassir_caption'+IntToStr(i), iq.FieldByName('username').AsString);
     TagSetContent(fmMain.ewbInfo, 't_kassir_bonus'+IntToStr(i), StringReplace(iq.FieldByName('summa_all').AsString, '.', ',', 1) );
     //   showmessage(iq.FieldByName('username').AsString + ':' +iq.FieldByName('sum_bonus').AsString);
     iq.Next;    
   end

   iq.active := False;
   iq.transaction.free;
   iq.free;   
 end;
 

Включить вызов ТМС

  • Включить вызов ТМС из п.1 в "После печати очереди чеков" и "После смены позиции", p84u1 заменить на соответствующий из п.1.
  • Затем Перекомпилировать скрипты.
 uses
  Graphics, Controls, Forms, Dialogs, StdCtrls,
  ComCtrls, ExtCtrls, ibquery, DB, ChequeList, FR,
  ScriptRes, Barcode,ZKassa, StrUtils, Windows, Classes,
  IBDataBase, SysUtils, p84u1;

 begin
   BonusRecalc;
 end;
 

Отображение кол-ва бонус в окне информации о чеке

В кассире в правом окне сумм итогов чека выполнить следующие действия:

  • Добавить .size1 {font-size:12px;} к строке:
  .size2 {font-size:14px;} .size3 {font-size:20px;} .size4 {font-size:50px;}
 
чтобы она выглядела следующим образом:
  .size1 {font-size:12px;} .size2 {font-size:14px;} .size3 {font-size:20px;} .size4 {font-size:50px;}
 
  • Заменить строки:
 <tr id="tr_cash"><td class="dlm" /><td id="t_cash_cap" class="mark size2">Наличные</td><td id="t_cash" class="ar mark size3">0.00</td><td class="dlm" /></tr>
 <tr id="tr_del"><td class="dlm" /><td id="t_del_cap" class="mark size2">Сдача</td><td id="t_del" class="ar mark size3">0.00</td><td class="dlm" /></tr>
 
на:
 <tr id="tr_cash"><td class="dlm" /><td id="t_cash_cap" class="mark size2">Наличные</td><td id="t_cash" class="ar mark size3">0.00</td><td class="dlm" /></tr>
 <tr id="tr_del"><td class="dlm" /><td id="t_del_cap" class="mark size3">Сдача</td><td id="t_del" class="ar mark size3">0.00</td><td class="dlm" /></tr>
 <tr id="tr_bonus"><td class="dlm" /><td id="t_bonus_cap" class="size1">Премия за посл. чек</td><td id="t_bonus" class="ar size1">0.00</td><td class="dlm" /></tr>
 <tr id="tr_bonus"><td class="dlm" /><td id="t_bonus_cap" class="size1">Премия за день</td><td id="t_bonus_smena" class="ar size1">0.00</td><td class="dlm" /></tr>
 <tr id="tr_bonus_all"><td class="dlm" /><td id="t_bonus_all_cap" class="size1">Премия за мес.</td><td id="t_bonus_all" class="ar size1">0.00</td><td class="dlm" /></tr>
 
  • Скопировать настройки для всех пользователей

Расчет премии

Кассир -> настройки -> администратор -> бонусы -> добавить "Премия" с текстом:

 result:= ::summa*-0.04; //Премия 4% от суммы чека
 

или

 result:= (::summa - ::summa_o)*-0.2; //Премия 20% от прибыли
 

Настройка с какого дня расчитывать премию

  • Выполнить запрос, который добавляет новый параметр в менеджер "С какого дня месяца рассчитывать премию кассирам?"
 INSERT INTO PARAMS (PARENT_ID, PARAM_ID, PARAM_CAPTION, PARAM_TYPE, PARAM_VALUE, AUDIT_ID, IMAGEINDEX, STATUS, INSERTDT, SORTING, PARAM_TYPE_DATA, PACKET) 
 VALUES (-30, 'BONUS_CALCULATE_DAY', 'С какого дня  месяца рассчитывать премию кассирам? (от 1 до 28)', 2, '20', 5082, 0, 0, '30-JUL-2014 08:34:35.812', 4, NULL, 16685);
 

Добавить отчет по премиям

  • В папку с формами скопировать bonus.cffr3 и добавить его спомощью sql-запроса:
 INSERT INTO REPORTS (PARENT_ID, STATUS, REPORTTYPE, SORTING, CAPTION, PARAMS, DATA, WDICT_ID) 
 VALUES (0, 0, 0, 12, 'Премии кассирам', '[freereport] tmplpath=bonus.cffr3', NULL, NULL);
 

Как себя проверить

Проверить все можно отбив любой чек на кассе, при этом должен расчитаться бонус в АРМ Кассира и в отчете "Премии кассирам" в АРМ Менеджера.

Теги: премии, бонусы кассирам, кассиры, продавцы, з/п, зарплата, заработная плата, материальное стимулирование