Кассир:Пересчет Бонусов кассиру

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск

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

Для этого нам потребуется:

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: Кассир, Бонус, Пересчет, Перерасчет