Кассир:Пересчет Бонусов кассиру
Возникают моменты когда требуется пересчитать Бонусы начисленные за определенный периуд. К сожалению реализация системы бонусов не подразумевает легкого пути.
Перенес на сервер
select 'update docs d set d.bonus ='||r.sum_bonus||' where d.id='||r.id||';' from ( select d.id, 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 '03.06.2024 00:00:00' and '06.06.2024 23:59:59' and d.doc_type=3 and d.g$profile_id=3)r where r.sum_bonus>0 and r.sum_bonus<>bonus
задаем диапазон времени профиль и ти пдокумента вначале 3 чеки затем ставим у SUM_BONUS знак минус и тип документа возврат
Это по локальной точке Для этого нам потребуется:
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: Кассир, Бонус, Пересчет, Перерасчет