Подарочные карты 2го типа
Материал из wiki.standart-n.ru
Содержание
Установка-Настройка Подарочных карт 2го типа
выполняем скрипт
SET SQL DIALECT 3;
CREATE GENERATOR GEN_GIFTCARD_DETAIL_ID;
CREATE TABLE GIFTCARD_DETAIL (
S_ID DM_ID /* DM_ID = BIGINT */,
S_DATE DM_DATETIME /* DM_DATETIME = TIMESTAMP */,
BARCODE DM_TEXT NOT NULL /* DM_TEXT = VARCHAR(250) */,
OPER_TYPE DM_STATUS NOT NULL /* DM_STATUS = INTEGER */,
DOC_ID DM_ID /* DM_ID = BIGINT */,
D$UUID DM_UUID /* DM_UUID = CHAR(36) NOT NULL */,
D$SRVUPDDT DM_DATETIME /* DM_DATETIME = TIMESTAMP */
);
CREATE INDEX GIFTCARD_DETAIL_IDX1 ON GIFTCARD_DETAIL (BARCODE);
SET TERM ^ ;
CREATE OR ALTER TRIGGER GIFTCARD_DETAIL_BI FOR GIFTCARD_DETAIL
ACTIVE BEFORE INSERT POSITION 0
as
declare variable COMMITSESSION_ID type of dm_id;
declare variable agent_id type of dm_id;
declare variable DOC_ID type of dm_id;
declare variable PART_ID type of dm_id;
declare variable SNAME type of dm_text;
declare variable PRICE type of dm_double;
declare variable ID type of dm_ID;
begin
if (new.s_id is null) then
new.s_id = gen_id(gen_giftcard_detail_id,1);
if (new.s_date is null) then
new.s_date = 'Now';
if (new.oper_type = 1) then
begin
select d.COMMITSESSION_ID,d.agent_id from docs d where d.id = new.doc_id into :COMMITSESSION_ID, :agent_id ;
select DOC_ID from pr_newdoc(20,:agent_id,0,null,null,:COMMITSESSION_ID) into DOC_ID;
PART_ID = (select first 1 p.id from parts p where p.barcode = new.barcode or (p.barcode1 = new.barcode) );
select first 1 wb.sname,wb.price from warebase wb where wb.part_id = PART_ID into :SNAME, :PRICE;
select ID from PR_PRIHODPART(:DOC_ID,:PART_ID,1,:SNAME,:PRICE,0,null,0,0,null) into :id;
execute procedure pr_doc_commit(DOC_ID,COMMITSESSION_ID);
end
end
^
CREATE OR ALTER TRIGGER GIFTCARD_DETAIL_BI_DISTR FOR GIFTCARD_DETAIL
ACTIVE BEFORE INSERT POSITION 0
AS
begin
if (new.d$uuid is null) then
begin
new.d$uuid=UUID_TO_CHAR(GEN_UUID());
new.d$srvupddt='2000-01-01';
end
end
^
SET TERM ; ^
COMMENT ON COLUMN GIFTCARD_DETAIL.OPER_TYPE IS
'0 - продажа карты, активация
1 - оплата картой, карта неактивна';
SET TERM ^ ;
create or alter procedure PR_GET_ZREPORT_GIFTCARD (
AUDIT_ID integer)
returns (
Z_CAPTION DM_TEXT,
SNAME DM_TEXT,
PRICE DM_TEXT,
QUANT DM_DOUBLE,
NAL DM_DOUBLE,
BEZNAL DM_DOUBLE)
as
declare variable VSHIFT DM_ID;
declare variable DEVICE_NUM DM_TEXT;
declare variable Z_ID DM_ID;
begin
select max(id) from docs d where status = 1 and doc_type in (13) and d.audit_id = :audit_id into z_id;
select VSHIFT, DEVICE_NUM, caption||' от '||cast(d.commitdate as dm_date) from docs d where id = :z_id into :VSHIFT, :DEVICE_NUM, :Z_CAPTION;
--add avo bcode_izg 13/11/19
for select SNAME||', '||bcode_izg, round(PRICE,2),
iif(dd.doc_type=3, 1, -1)*abs(dd.QUANT),
iif(dd.doc_type=3, 1, -1)*round(iif(abs(d.summ1)<=abs(dd.summa),abs(d.summ1), abs(dd.summa)),2) as nal,
iif(dd.doc_type=3, 1, -1)*round(abs(dd.summa)-iif(abs(d.summ1)<=abs(dd.summa),abs(d.summ1), abs(dd.summa)),2) as beznal
from vw_doc_detail dd
left join docs d on dd.doc_id = d.id
where dd.doc_commitdate between current_date - 10 and current_date + 10
--add avo 13/11/19
and SNAME like '%Подаро%карт%' --and dd.dep = 4
and d.status = 1 and d.doc_type in (3,9) and d.VSHIFT = :VSHIFT and d.DEVICE_NUM = :DEVICE_NUM
into :SNAME, :PRICE, :QUANT, :NAL, :BEZNAL do
suspend;
end^
SET TERM ; ^
/* Следующие операторы GRANT сгенерированы автоматически */
GRANT SELECT ON DOCS TO PROCEDURE PR_GET_ZREPORT_GIFTCARD;
GRANT SELECT ON VW_DOC_DETAIL TO PROCEDURE PR_GET_ZREPORT_GIFTCARD;
/* Существующие привилегии на эту процедуру */
GRANT EXECUTE ON PROCEDURE PR_GET_ZREPORT_GIFTCARD TO SYSDBA;
SET TERM ^ ;
create or alter procedure PR_GIFTCARD (
BARCODE type of DM_TEXT not null)
returns (
S_ID DM_ID,
S_DATE DM_DATETIME,
OPER_TYPE DM_STATUS,
SUMM DM_DOUBLE)
as
begin
select first 1 s_id, s_date, oper_type from giftcard_detail where s_id is not null and barcode = :barcode order by s_id desc
into :s_id, :s_date, :oper_type;
if (oper_type is not null) then
begin
-- select first 1 price from parts where barcode = :barcode or (bcode_izg=:barcode) order by id desc into :summ;
select first 1 p.price
from parts p
join wares w on w.id = p.ware_id
where p.barcode = :barcode or (w.barcode = :barcode)
order by p.id desc into :summ;
suspend;
end
end^
SET TERM ; ^
GRANT SELECT ON GIFTCARD_DETAIL TO PROCEDURE PR_GIFTCARD;
GRANT SELECT ON PARTS TO PROCEDURE PR_GIFTCARD;
GRANT EXECUTE ON PROCEDURE PR_GIFTCARD TO SYSDBA;
Добавить в триггер DOC_DETAIL_AI0
if ((select d.doc_type from docs d where d.id = new.doc_id) in (3)) then
begin
if ((select wb.sname from warebase wb where wb.part_id = new.part_id ) like '%Подаро%карт%') then
begin
insert into giftcard_detail (BARCODE,OPER_TYPE,DOC_ID) values ((select iif(wb.bcode_izg='' or (wb.bcode_izg is null),wb.barcode,wb.bcode_izg ) from warebase wb where wb.part_id = new.part_id), 0,new.doc_id);
end
end
if ((select d.doc_type from docs d where d.id = new.doc_id) in (9)) then
begin
if ((select wb.sname from warebase wb where wb.part_id = new.part_id ) like '%Подаро%карт%') then
begin
insert into giftcard_detail (BARCODE,OPER_TYPE,DOC_ID) values ((select iif(wb.bcode_izg='' or (wb.bcode_izg is null),wb.barcode,wb.bcode_izg ) from warebase wb where wb.part_id = new.part_id), 1,new.doc_id);
end
end
В кассире в событии После закрытия смены меняем на
ТМС странная, можно не ставить
uses
Graphics, Controls, Forms, Dialogs, StdCtrls,
ComCtrls, ExtCtrls, ibquery, DB, ChequeList, FR,
ScriptRes, Barcode, ZKassa, StrUtils, Windows, Classes,
IBDatabase;
var
doc_id : integer;
LengthCheak,i , fl: integer;
iq: tibquery;
str_temp : string;
nal, beznal: float;
begin
Fr_activate(0);
//Создаем соединение с базой
iq := tibquery.create(nil);
iq.database := CurrDB;
iq.transaction := creatert(CurrDB);
iq.transaction.starttransaction;
iq.active := False;
//msgbox(IntToStr(ChequeList.Items[0].ID), 'Ошибка!', mb_ok);
//запросик к базе
fl:=0;
iq.sql.text := 'select z_caption, sname, price, sum(quant) as quant, sum(nal) as nal, sum(beznal) as beznal from PR_GET_ZREPORT_GIFTCARD ('+IntToStr(SessionID)+') group by z_caption, sname, price having sum(quant) <> 0';
iq.active := True;
str_temp := '';
nal:= 0;
beznal:= 0;
//забираем данные
if not(iq.Eof) then
begin
//Длина чековой ленты
LengthCheak := FR_LINELENGTH;
str_temp := str_temp + myFormatString('ДОПОЛНЕНИЕ ПО ПОДАРОЧНЫМ КАРТАМ',' ',' ',LengthCheak,0,true)+#13#10;
str_temp := str_temp + myFormatString(iq.FieldByName('z_caption').AsString,' ',' ',LengthCheak,0,true)+#13#10;
str_temp := str_temp + myFormatString('Подар. карта (Цена Х Кол-во) Нал/Безнал',' ',' ',LengthCheak,0,true)+#13#10;
str_temp := str_temp + dupestring('-',LengthCheak)+#13#10;
end
else
begin
str_temp := '';
// msgbox('Ошибка. Отчет по подарочным картам не будет распечатан!', 'Ошибка!', mb_ok);
exit;
end;
while not iq.Eof do
begin
str_temp := str_temp + myFormatString(iq.FieldByName('sname').AsString + '('+iq.FieldByName('price').AsString+' x '+iq.FieldByName('quant').AsString+')',' ',' ',LengthCheak,1,true)+#13#10;
str_temp := str_temp + myFormatString(' = ' + iq.FieldByName('nal').AsString+'/'+iq.FieldByName('beznal').AsString,' ',' ',LengthCheak,1,true)+#13#10;
nal:= nal + iq.FieldByName('nal').AsFloat;
beznal:= beznal + iq.FieldByName('beznal').AsFloat;
iq.Next;
end;
str_temp := str_temp + dupestring('-',LengthCheak)+#13#10;
str_temp := str_temp + myFormatString('ИТОГО:',' НАЛ='+Format('%.2f',[nal])+' БЕЗНАЛ='+Format('%.2f',[beznal]),' ',LengthCheak,1,true)+#13#10;
//закрываем соединение
iq.active := False;
iq.sql.text := 'select USERNAME from USERS where id = '+IntToStr(UserID);
iq.active := True;
str_temp := str_temp + dupestring('*',LengthCheak)+#13#10;
str_temp := str_temp + myFormatString(DateToStr(Date)+' '+TimeToStr(Time),' ',' ',LengthCheak,1,true)+#13#10;
str_temp := str_temp + myFormatString('Кассир:',iq.FieldByName('USERNAME').AsString,' ',LengthCheak,1,true)+#13#10;
//закрываем соединение
iq.active := False;
// Для select можно не завершать транзакцию
iq.Transaction.Commit;
iq.Transaction.Free;
iq.Free;
//str_temp := str_temp + dupestring(' ',LengthCheak)+#13#10;
//str_temp := str_temp + dupestring(' ',LengthCheak)+#13#10;
//str_temp := str_temp + myFormatCheque('Подпись: _______________________',' ',' ',LengthCheak,1,true)+#13#10;
//str_temp := str_temp + myFormatCheque(' М.П.',' ',' ',LengthCheak,1,true)+#13#10;
str_temp := str_temp + dupestring(' ',LengthCheak)+#13#10;
str_temp := str_temp + dupestring(' ',LengthCheak)+#13#10;
//Устанавливаем сформированную строку
FR_STRING_SET(str_temp);
//Печатаем строку на фискальнике
FR_PRINTSTRING;
FR_GETADVTEXT;
FR_PRINTSTRING;
// FR_PRINTCLICHE;
//протяжка
FR_NUMBER_SET(2);
FR_FEEDTAPE;
//отрезка
FR_BOOLEAN_SET(false);
FR_CUTTAPE;
ChequeList.CloseAll;
//Отключаем оборудование
FR_DEACTIVATE;
end
В Кассире устанавливаем галочку в пункте Подарочные карты 2
В итоге
Для того что бы карты появились в системе нужно их оприходовать через документ Приход поставщика
или Оприходование товаров. Если ШК карт уникальные вводим каждую в отдельную строку заполняя
Наименование, номинал карты, ШК, кол-во 1, цена оптовая по желанию 0,1 или 1 руб.
Все заполнили - проводим. Теперь можно продавать карту через кассу, после оплаты она
активируется (работает триггер DOC_DETAIL_AI0) и будет доступна для оплаты
Оплата подарочными картами идёт как отдельный тип оплаты - настраивается на ККМ
Приходование подарочной карты после оплаты ею идёт в триггере GIFTCARD_DETAIL_BI, по
тем настройкам как сейчас - документом оприходования(тип документа 20)
Ссылки по теме
Запрос для получения списка активных подарочных карт с их номиналом и датой активации
select distinct gd.barcode, pr.summ, pr.s_date as sale_date from GIFTCARD_DETAIL gd left join PR_GIFTCARD(gd.barcode) pr on pr.oper_type=0 where gd.s_date > dateadd(year,-1,current_timestamp) and pr.summ is not null --and gd.barcode='1000000018585' -- order by pr.s_date
Теги
Подарочная карта 2, Подарочная карта, Подарочные карты 2
