Кассир:Пересчет Бонусов кассиру — различия между версиями
Материал из wiki.standart-n.ru
Lander (обсуждение | вклад) (Новая страница: «Возникают моменты когда требуется пересчитать Бонусы начисленные за определенный пери…») |
Lander (обсуждение | вклад) (→PROCEDURE PR_GETBONUS) |
||
| Строка 112: | Строка 112: | ||
declare variable SUMMA DM_DOUBLE; | declare variable SUMMA DM_DOUBLE; | ||
declare variable KOEF DM_DOUBLE; | declare variable KOEF DM_DOUBLE; | ||
| + | declare variable QUANT DM_DOUBLE; | ||
begin | begin | ||
sum_bonus_doc = 0; | sum_bonus_doc = 0; | ||
| − | for select part_id,dd.summa from doc_detail dd where dd.doc_id=:DOC_ID into :part_id,:summa | + | 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 | do | ||
begin | begin | ||
| Строка 127: | Строка 128: | ||
begin | begin | ||
if (:group_id<>10472) then | if (:group_id<>10472) then | ||
| − | if (position(:group_id||'=' in :s)>0) then summ = | + | if (position(:group_id||'=' in :s)>0) then summ = :sum_bonus*:quant; |
else | else | ||
| − | if (position(:group_id||'=' in :s)>0) then summ = :summa* :koef; | + | if (position(:group_id||'=' in :s)>0) then summ = :summa* :koef*:quant; |
end | end | ||
sum_bonus_doc = sum_bonus_doc + summ; | sum_bonus_doc = sum_bonus_doc + summ; | ||
Версия 13:51, 4 марта 2021
Возникают моменты когда требуется пересчитать Бонусы начисленные за определенный периуд. К сожалению реализация системы бонусов не подразумевает легкого пути.
Для этого нам потребуется:
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: Кассир, Бонус, Пересчет, Перерасчет