Кассир:Пересчет Бонусов кассиру — различия между версиями
Lander (обсуждение | вклад) (Новая страница: «Возникают моменты когда требуется пересчитать Бонусы начисленные за определенный пери…») |
Lander (обсуждение | вклад) |
||
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
Возникают моменты когда требуется пересчитать Бонусы начисленные за определенный периуд. К сожалению реализация системы бонусов не подразумевает легкого пути. | Возникают моменты когда требуется пересчитать Бонусы начисленные за определенный периуд. К сожалению реализация системы бонусов не подразумевает легкого пути. | ||
+ | Перенес на сервер | ||
+ | |||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
+ | |||
+ | задаем диапазон времени | ||
+ | профиль | ||
+ | |||
+ | |||
+ | Результат оформляем в TASK и посылаем на точку | ||
+ | |||
+ | Это по локальной точке | ||
Для этого нам потребуется: | Для этого нам потребуется: | ||
Строка 112: | Строка 141: | ||
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: | Строка 157: | ||
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: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: Кассир, Бонус, Пересчет, Перерасчет