Кассир:Пересчет Бонусов кассиру
Возникают моменты когда требуется пересчитать Бонусы начисленные за определенный периуд. К сожалению реализация системы бонусов не подразумевает легкого пути.
Перенес на сервер
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: Кассир, Бонус, Пересчет, Перерасчет