Кассир:Пересчет Бонусов кассиру — различия между версиями

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск
 
Строка 5: Строка 5:
 
<pre>  
 
<pre>  
 
select
 
select
'update docs d set d.bonus ='||cast(r.sum_bonus as numeric(9,2))||' where d.id='||r.id||';'
+
'update docs d set d.bonus ='||iif(r.doc_type=9,cast(-r.sum_bonus as numeric(9,2)),cast(r.sum_bonus as numeric(9,2))) ||' where d.id='||r.id||';'
 
from
 
from
 
(
 
(
 
select
 
select
 
d.id,
 
d.id,
 +
d.doc_type,
 
d.bonus,
 
d.bonus,
 
(select SUM_BONUS_DOC from pr_getbonus(d.id,d.g$profile_id))as sum_bonus,
 
(select SUM_BONUS_DOC from pr_getbonus(d.id,d.g$profile_id))as sum_bonus,
Строка 16: Строка 17:
  
 
from docs d
 
from docs d
where d.docdate between ''''03.06.2024 00:00:00' and '06.06.2024 23:59:59''''
+
where d.docdate between '06.06.2024 00:00:00' and '06.06.2024 23:59:59'
'''and d.doc_type=3
+
and d.doc_type in(3,9)
and d.g$profile_id=3)'''r
+
and d.g$profile_id=19)r
 
  where r.sum_bonus>0 and r.sum_bonus<>bonus
 
  where r.sum_bonus>0 and r.sum_bonus<>bonus
 
</pre>  
 
</pre>  
Строка 24: Строка 25:
 
задаем диапазон времени  
 
задаем диапазон времени  
 
профиль  
 
профиль  
и ти пдокумента вначале 3 чеки
+
 
затем ставим у SUM_BONUS знак минус и тип документа возврат
+
  
 
Результат оформляем в TASK и посылаем на точку
 
Результат оформляем в TASK и посылаем на точку

Текущая версия на 13:20, 14 июня 2024

Возникают моменты когда требуется пересчитать Бонусы начисленные за определенный периуд. К сожалению реализация системы бонусов не подразумевает легкого пути.

Перенес на сервер

 
select
'update docs d set d.bonus ='||iif(r.doc_type=9,cast(-r.sum_bonus as numeric(9,2)),cast(r.sum_bonus as numeric(9,2))) ||' where d.id='||r.id||';'
from
(
select
d.id,
d.doc_type,
d.bonus,
(select SUM_BONUS_DOC from pr_getbonus(d.id,d.g$profile_id))as sum_bonus,
d.summa


from docs d
where d.docdate between '06.06.2024 00:00:00' and '06.06.2024 23:59:59'
and d.doc_type in(3,9)
and d.g$profile_id=19)r
 where r.sum_bonus>0 and r.sum_bonus<>bonus

задаем диапазон времени профиль


Результат оформляем в TASK и посылаем на точку

Это по локальной точке Для этого нам потребуется:

1. Создаем таблицу BONUS в которой описываем все бонусы если у нас коэфициентный бонус заполняем поле KOEF_BONUS

если суммовой то SUM_BONUS

Данный скрипт предназначен если бонусы начисляются по определенным группам товара которую задаем в поле GROUP_ID


2. Далее нам потребуется процедура PR_GETBONUS на вход она принимает ID Документа в ответ отдает сумму бонуса по документу работает с документами типа 3 и 9 Чек и Чек возврата

3. Пример работы вызова пересчет бонусов с 01.01.2021 по 25.02.2021

 
Update docs d set d.bonus = (select SUM_BONUS_DOC from pr_getbonus(d.id) 
where d.doc_type=3 and commitdate between '01.01.2021 00:00:00' and '25.02.2021 23:59:59')

Update docs d set d.bonus = (select -SUM_BONUS_DOC from pr_getbonus(d.id) 
where d.doc_type=9 and commitdate between '01.01.2021 00:00:00' and '25.02.2021 23:59:59')


TABLE BONUS

/******************************************************************************/
/***               Generated by IBExpert 03.03.2021 15:06:37                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/


CREATE GENERATOR GEN_BONUS_ID;

CREATE TABLE BONUS (
    ID          DM_ID /* DM_ID = BIGINT */,
    SUM_BONUS   DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    KOEF_BONUS  DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */,
    GROUP_ID    DM_ID /* DM_ID = BIGINT */
);




/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/



/* Trigger: BONUS_BI */
CREATE OR ALTER TRIGGER BONUS_BI FOR BONUS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_bonus_id,1);
end
^


SET TERM ; ^



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/


PROCEDURE PR_GETBONUS

 
SET TERM ^ ;

create or alter procedure PR_GETBONUS (
    DOC_ID DM_ID)
returns (
    SUM_BONUS_DOC DM_DOUBLE)
as
declare variable PART_ID DM_ID;
declare variable GROUP_ID DM_ID;
declare variable S DM_TEXT;
declare variable SUM_BONUS DM_DOUBLE;
declare variable SUMM DM_DOUBLE;
declare variable SUMMA DM_DOUBLE;
declare variable KOEF DM_DOUBLE;
declare variable QUANT DM_DOUBLE;
begin
sum_bonus_doc = 0;
 for select part_id,dd.summa,abs(dd.quant) from doc_detail dd where dd.doc_id=:DOC_ID into :part_id,:summa, :quant
    do
    begin
      summ=0;
      s =  (select
        (select membership from PR_MEMBERSHIPS('PARTS=' || :part_id || ';PARTS.NAME_ID=' || w.name_id || ';PARTS.IZG_ID=' || w.izg_id ||';',ascii_char(13)||ascii_char(10),1))
         from parts p
        join wares w on w.id=p.ware_id
        where p.id = :part_id); -- ss =:s;suspend;
        for select b.group_id,b.sum_bonus,b.koef_bonus from bonus b where b.sum_bonus is not null into :group_id,:sum_bonus, :koef
               do
               begin
                if (:group_id<>10472) then
                   if (position(:group_id||'=' in :s)>0) then summ = :sum_bonus*:quant;
                else
                   if (position(:group_id||'=' in :s)>0) then summ = :summa* :koef*:quant;
               end
               sum_bonus_doc = sum_bonus_doc + summ;


    end

      suspend;

end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON DOC_DETAIL TO PROCEDURE PR_GETBONUS;
GRANT EXECUTE ON PROCEDURE PR_MEMBERSHIPS TO PROCEDURE PR_GETBONUS;
GRANT SELECT ON PARTS TO PROCEDURE PR_GETBONUS;
GRANT SELECT ON WARES TO PROCEDURE PR_GETBONUS;
GRANT SELECT ON BONUS TO PROCEDURE PR_GETBONUS;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PR_GETBONUS TO SYSDBA;


tags: Кассир, Бонус, Пересчет, Перерасчет