|
|
Строка 1: |
Строка 1: |
| =Настройка ТМС Акции в кассире= | | =Настройка ТМС Акции в кассире= |
| | | |
− | ==Начало== | + | ===Пример №2 (старый мех-м)=== |
| + | * акция действует всегда пока включен переключатель в параметрах системы |
| + | <PRE> |
| + | INSERT INTO PARAMS ( PARENT_ID, PARAM_ID, PARAM_CAPTION, PARAM_TYPE, PARAM_VALUE, AUDIT_ID, IMAGEINDEX, |
| + | STATUS, INSERTDT, SORTING, PARAM_TYPE_DATA, PACKET) VALUES ( -30, 'AKCCII_TOGGLE', 'Включение акций', 14, '0', 3229, NULL, 0, '19-DEC-2015 10:45:34.828', NULL, 'FIXEDITEMS SHOWONLYVALUES RETURNNAME |
| + | 0=выключено |
| + | 1=включено'); |
| + | </PRE> |
| + | * если переключатель включен - в кассире при продаже активируется скидка = разнице между заполненными колонками price и ещё одной ценовой колонкой, ниже использована PRICE_R |
| | | |
− | В ТМС '''-305 "После добавления позиции в чек"''' создаем скрипт.
| + | <PRE> |
− | Начало скрипта будет таким:
| + | |
− | | + | |
− | <pre> | + | |
| uses | | uses |
| Graphics, Controls, Forms, Dialogs, StdCtrls, | | Graphics, Controls, Forms, Dialogs, StdCtrls, |
Строка 21: |
Строка 26: |
| iq.transaction.starttransaction; | | iq.transaction.starttransaction; |
| iq.active := False; | | iq.active := False; |
− | </pre>
| |
| | | |
− | ==Примеры акций==
| |
− | Далее пишем скрипты акций.
| |
− |
| |
− | ===Пример №1===
| |
− | * скидка 20% на группу "Акция"
| |
− | * акция действует с 31.07.2015 по 23.08.2015
| |
− |
| |
− | <pre>
| |
− | if ((date() >= StrToDate('31.07.2015')) and (date() <= StrToDate('23.08.2015'))) Then
| |
− | Begin
| |
− | part_id := ChequeList.ActivePID;
| |
− | //запросик к базе
| |
− | iq.sql.text := 'select abs(price) as price, abs(quant) as quant from vw_doc_detail_active where UPPER(mmbsh) containing ''АКЦИЯ'' and doc_id='+inttostr(ChequeList.Active.ID)+' and part_id = '+inttostr(part_id) ;
| |
− | iq.active := True;
| |
− | //забираем данные
| |
− | if not(iq.Eof) then
| |
− | begin
| |
− | dsc := -0.20;
| |
− | ChequeList.Active.P_Index:= ChequeList.Active.IndexByPartID(part_id);
| |
− | ChequeList.Active.P_SetDiscount(abs(iq.FieldByName('price').AsFloat*iq.FieldByName('quant').AsFloat)*dsc);
| |
− | end;
| |
− | end;
| |
− | </pre>
| |
− |
| |
− |
| |
− | ===Пример №2===
| |
− | * акция действует с 01.02.2016 по 29.02.2016
| |
− | * Эссенциале форте Н №30 - скидка 150р. за каждую проданную упаковку
| |
− | * Магне В6 форте №30 - скидка 150 р. за каждую проданную упаковку
| |
− | * Фестал №40 - скидка 32 руб. за каждую проданную упаковку
| |
− | * Но-Шпа № 24 - скидка 50р. за каждую проданную упаковку
| |
− | * Бронхикум сироп - скидка 59 руб. за каждую проданную упаковку
| |
− | * Терафлекс №100- скидка 300 руб. за каждую проданную упаковку
| |
− | * Терафлекс №60 - скидка 200 руб. за каждую проданную упаковку
| |
− | * Эмолиум (все формы выпуска) - скидка 350р. на каждую вторую упаковку Эмолиум в чеке.
| |
− |
| |
− | <pre>
| |
− | if ((date() >= StrToDate('01.02.2016')) and (date() <= StrToDate('29.02.2016'))) Then
| |
− | Begin
| |
− | part_id := ChequeList.ActivePID;
| |
− | //запросик к базе
| |
− | iq.sql.text :=
| |
− | 'select UPPER(sname) as sname, quant,'+
| |
− | 'iif(upper(sname) containing ''ЭССЕНЦИАЛ'' and UPPER(sname) containing ''ФОРТ'' and UPPER(sname) containing ''№30'', 150*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''МАГНЕ'' and UPPER(sname) containing ''6'' and UPPER(sname) containing ''ФОРТ'' and UPPER(sname) containing ''№30'', 150*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''ФЕСТАЛ'' and UPPER(sname) containing ''№40'', 32*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''ШПА'' and UPPER(sname) containing ''НО'' and UPPER(sname) containing ''№24'', 50*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''БРОНХИКУМ'' and UPPER(sname) containing ''СИР'', 59*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''ТЕРАФЛЕКС'' and UPPER(sname) containing ''№100'', 300*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''ТЕРАФЛЕКС'' and UPPER(sname) containing ''№60'', 200*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''ЭМОЛИУМ'', (SELECT 350*Iif(abs(SUM(quant)) < 2, 0, Trunc(abs(Sum(quant))/2)) from vw_doc_detail_active where upper(sname) containing ''ЭМОЛИУМ'' and doc_id='+inttostr(ChequeList.Active.ID)+') ,'+
| |
− | '0)))))))) as dop_dsc '+
| |
− | 'from vw_doc_detail_active where '+
| |
− | '((upper(sname) containing ''ЭССЕНЦИАЛ'' and UPPER(sname) containing ''ФОРТ'' and UPPER(sname) containing ''№30'') or '+
| |
− | ' (upper(sname) containing ''МАГНЕ'' and UPPER(sname) containing ''6'' and UPPER(sname) containing ''ФОРТ'' and UPPER(sname) containing ''№30'') or '+
| |
− | ' (upper(sname) containing ''ФЕСТАЛ'' and UPPER(sname) containing ''№40'') or '+
| |
− | ' (upper(sname) containing ''ШПА'' and UPPER(sname) containing ''НО'' and UPPER(sname) containing ''№24'') or '+
| |
− | ' (upper(sname) containing ''БРОНХИКУМ'' and UPPER(sname) containing ''СИР'') or '+
| |
− | ' (upper(sname) containing ''ТЕРАФЛЕКС'' and UPPER(sname) containing ''№100'') or '+
| |
− | ' (upper(sname) containing ''ТЕРАФЛЕКС'' and UPPER(sname) containing ''№60'') or '+
| |
− | ' (upper(sname) containing ''ЭМОЛИУМ'') ) and '+
| |
− | ' doc_id='+inttostr(ChequeList.Active.ID)+' and part_id = '+inttostr(part_id) ;
| |
− | iq.active := True;
| |
− | //забираем данные
| |
− | if not(iq.Eof) then
| |
− | begin
| |
− | If (POS('ЭМОЛИУМ',iq.FieldByName('sname').AsString) <> 0) Then
| |
− | Begin
| |
− | for I := 0 to chequelist.count - 1 do
| |
− | for j := 0 to chequelist.items[i].count - 1 do
| |
− | begin
| |
− | chequelist.items[i].p_index := j;
| |
− | if (POS('ЭМОЛИУМ',AnsiUpperCase(chequelist.items[i].p_name)) <> 0) then
| |
− | chequelist.items[i].P_SetDiscount(0);
| |
− | end;
| |
− | End;
| |
− | ChequeList.Active.P_Index:= ChequeList.Active.IndexByPartID(part_id);
| |
− | ChequeList.Active.P_SetDiscount(-1*iq.FieldByName('dop_dsc').AsFloat)
| |
− | end;
| |
− | end;
| |
− | </pre>
| |
− |
| |
− |
| |
− | ===Пример 3===
| |
− | * акция действует с 01.03.2016 по 31.12.2016
| |
− | * Магне В6 форте розн цена 849р, скидка150р
| |
− | * Эссенциале форте №30 розн цена 798р, скидка 150р
| |
− | * Фестал тб №40 розн цена 252р, скидка 32руб
| |
− |
| |
− | <pre>
| |
− | if ((date() >= StrToDate('01.03.2016')) and (date() <= StrToDate('31.12.2016'))) Then
| |
− | Begin
| |
− | part_id := ChequeList.ActivePID;
| |
− | //запросик к базе
| |
− | iq.sql.text := 'select UPPER(sname) as SNAME, abs(quant) as quant from vw_doc_detail_active where'+
| |
− | '( ((UPPER(sname) containing ''МАГНЕ'' and UPPER(sname) containing ''6'' and UPPER(sname) containing ''ФОРТ'') and abs(price - 849) <= 10 ) or '+
| |
− | ' ((UPPER(sname) containing ''ЭССЕНЦИАЛЕ'' and UPPER(sname) containing ''30'' and UPPER(sname) containing ''ФОРТ'') and abs(price - 798) <= 10 ) or '+
| |
− | ' ((UPPER(sname) containing ''ФЕСТАЛ'' and UPPER(sname) containing ''40'') and abs(price - 252) <= 10 ) )'+
| |
− | ' and doc_id='+inttostr(ChequeList.Active.ID)+' and part_id = '+inttostr(part_id) ;
| |
− | iq.active := True;
| |
− | //забираем данные
| |
− | if not(iq.Eof) then
| |
− | begin
| |
− | ChequeList.Active.P_Index:= ChequeList.Active.IndexByPartID(part_id);
| |
− | If (POS('ФЕСТАЛ',iq.FieldByName('sname').AsString) = 0) Then ChequeList.Active.P_SetDiscount(-1*150*iq.FieldByName('quant').AsFloat)
| |
− | Else ChequeList.Active.P_SetDiscount(-1*32*iq.FieldByName('quant').AsFloat);
| |
− | end;
| |
− | end;
| |
− | </pre>
| |
− |
| |
− | ===Пример №4===
| |
− | * акция действует всегда пока включен переключатель в параметрах системы
| |
− | <PRE>
| |
− | INSERT INTO PARAMS ( PARENT_ID, PARAM_ID, PARAM_CAPTION, PARAM_TYPE, PARAM_VALUE, AUDIT_ID, IMAGEINDEX,
| |
− | STATUS, INSERTDT, SORTING, PARAM_TYPE_DATA, PACKET) VALUES ( -30, 'AKCCII_TOGGLE', 'Включение акций', 14, '0', 3229, NULL, 0, '19-DEC-2015 10:45:34.828', NULL, 'FIXEDITEMS SHOWONLYVALUES RETURNNAME
| |
− | 0=выключено
| |
− | 1=включено');
| |
− | </PRE>
| |
− | * если переключатель включен - в кассире при продаже активируется скидка = разнице между заполненными колонками price и ещё одной ценовой колонкой, ниже использована PRICE_R
| |
− |
| |
− | <PRE>
| |
| iq.sql.text := 'select wb.part_id,wb.PRICE_R,(select p.param_value from params p where p.param_id = ''AKCCII_TOGGLE'') from vw_warebase wb where wb.part_id = '+ | | iq.sql.text := 'select wb.part_id,wb.PRICE_R,(select p.param_value from params p where p.param_id = ''AKCCII_TOGGLE'') from vw_warebase wb where wb.part_id = '+ |
| IntToStr(ChequeList.ActivePID); | | IntToStr(ChequeList.ActivePID); |
Строка 156: |
Строка 39: |
| ChequeList.Active.P_SetDiscount(temp); | | ChequeList.Active.P_SetDiscount(temp); |
| end; | | end; |
− | </PRE>
| |
− |
| |
− | ===Пример №5===
| |
− | В событии -332 вызываем как "RecalcDSC(1);", а в -305 как "RecalcDSC(0);"
| |
− | <PRE>
| |
− | uses
| |
− | Graphics, Controls, Forms, Dialogs, StdCtrls,
| |
− | ComCtrls, ExtCtrls, ibquery, DB, ChequeList, FR,
| |
− | ScriptRes, Barcode,ZKassa, StrUtils, Windows, Classes,
| |
− | IBDataBase, SysUtils, DateUtils, chequelist;
| |
− | Const
| |
− | emolium ='ЭМОЛИУМ';
| |
− | magne ='МАГНЕ';
| |
− |
| |
− | //Для корретной работы скидок процедура RecalcDSC в событиях -305 и -332 должна быть идентична
| |
− | Procedure RecalcDSC(del:integer)
| |
− | var iq: tibquery;
| |
− | dsc, part_id,i,j: integer;
| |
− | discount, quant: float;
| |
− | begin
| |
− |
| |
− | Try
| |
− | iq := tibquery.create(nil);
| |
− | iq.transaction := CreateRT(CurrDB);
| |
− | iq.transaction.starttransaction;
| |
− | iq.active := False;
| |
− |
| |
− | //Акция с 01.03.2016 по 31.03.2016, суммовая скидка на некоторые товары
| |
− | //заявка в УР 545956
| |
− | //1. Эссенциале форте Н №30 розн цена 619р - скидка 150р. за каждую проданную упаковку
| |
− | //2. Магне В6 форте №30 розн цена 750р - скидка 150 р. за каждую проданную упаковку
| |
− | //3. Фестал №40 розн цена 242р - скидка 32 руб. за каждую проданную упаковку
| |
− | //4. Но-Шпа № 24 розн цена 190р - скидка 50р. за каждую проданную упаковку
| |
− | //5. Бронхикум сироп розн цена 369р - скидка 59 руб. за каждую проданную упаковку
| |
− | //6. Эмолиум (все формы выпуска) - скидка 350р. на каждую вторую упаковку Эмолиум в чеке.
| |
− | {
| |
− | if ((date() >= StrToDate('01.03.2016')) and (date() <= StrToDate('31.03.2016'))) Then
| |
− | Begin
| |
− | part_id := ChequeList.ActivePID;
| |
− | //запросик к базе
| |
− | iq.sql.text :=
| |
− | 'select UPPER(sname) as sname, quant,'+
| |
− | 'iif(upper(sname) containing ''ЭССЕНЦИАЛ'' and UPPER(sname) containing ''ФОРТ'' and UPPER(sname) containing ''№30'' and price >= 619, 150*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''МАГНЕ'' and UPPER(sname) containing ''6'' and UPPER(sname) containing ''ФОРТ'' and UPPER(sname) containing ''№30'' and price >= 750, 150*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''ФЕСТАЛ'' and UPPER(sname) containing ''№40'' and price >= 242, 32*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''ШПА'' and UPPER(sname) containing ''НО'' and UPPER(sname) containing ''№24'' and price >= 190, 50*abs(quant),'+
| |
− | 'iif(upper(sname) containing ''БРОНХИКУМ'' and UPPER(sname) containing ''СИР'' and price >= 369, 59*abs(quant),'+
| |
− | 'iif(upper(sname) containing '''+emolium+''', (SELECT 350*Iif(abs(SUM(quant)) < 2, 0, Trunc(abs(Sum(quant))/2)) from vw_doc_detail_active where upper(sname) containing '''+emolium+''' and doc_id='+inttostr(ChequeList.Active.ID)+') ,'+
| |
− | '0)))))) as dop_dsc '+
| |
− | 'from vw_doc_detail_active where '+
| |
− | '((upper(sname) containing ''ЭССЕНЦИАЛ'' and UPPER(sname) containing ''ФОРТ'' and UPPER(sname) containing ''№30'' and price >= 619) or '+
| |
− | ' (upper(sname) containing ''МАГНЕ'' and UPPER(sname) containing ''6'' and UPPER(sname) containing ''ФОРТ'' and UPPER(sname) containing ''№30'' and price >= 750) or '+
| |
− | ' (upper(sname) containing ''ФЕСТАЛ'' and UPPER(sname) containing ''№40'' and price >= 242) or '+
| |
− | ' (upper(sname) containing ''ШПА'' and UPPER(sname) containing ''НО'' and UPPER(sname) containing ''№24'' and price >= 190) or '+
| |
− | ' (upper(sname) containing ''БРОНХИКУМ'' and UPPER(sname) containing ''СИР'' and price >= 369) or '+
| |
− | ' (upper(sname) containing '''+emolium+''') ) and '+
| |
− | ' doc_id='+inttostr(ChequeList.Active.ID)+' and part_id = '+inttostr(part_id) ;
| |
− | iq.active := True;
| |
− | //забираем данные
| |
− | if not(iq.Eof) then
| |
− | begin
| |
− | If (POS(emolium,iq.FieldByName('sname').AsString) <> 0) Then
| |
− | Begin
| |
− | for I := 0 to chequelist.count - 1 do
| |
− | for j := 0 to chequelist.items[i].count - 1 do
| |
− | begin
| |
− | chequelist.items[i].p_index := j;
| |
− | if (POS(emolium,AnsiUpperCase(chequelist.items[i].p_name)) <> 0) then
| |
− | chequelist.items[i].P_SetDiscount(0);
| |
− | end;
| |
− | End;
| |
− |
| |
− | ChequeList.Active.P_Index:= ChequeList.Active.IndexByPartID(part_id);
| |
− | ChequeList.Active.P_SetDiscount(-1*iq.FieldByName('dop_dsc').AsFloat)
| |
− | end;
| |
− | end;
| |
− | }
| |
− | //Акция с 01.01.2016 по 31.12.2016, суммовая скидка на некоторые товары
| |
− | //заявка в УР 527176
| |
− | if ((date() >= StrToDate('01.04.2016')) and (date() <= StrToDate('31.12.2016'))) Then
| |
− | Begin
| |
− | part_id := ChequeList.ActivePID;
| |
− | //запросик к базе
| |
− | iq.sql.text := 'select UPPER(sname) as SNAME, abs(quant) as quant from vw_doc_detail_active where'+
| |
− | '( ((UPPER(sname) containing ''МАГНЕ'' and UPPER(sname) containing ''6'' and UPPER(sname) containing ''ФОРТ'') and abs(price - 849) <= 10 ) or '+
| |
− | ' ((UPPER(sname) containing ''ЭССЕНЦИАЛЕ'' and UPPER(sname) containing ''30'' and UPPER(sname) containing ''ФОРТ'') and abs(price - 798) <= 10 ) or '+
| |
− | ' ((UPPER(sname) containing ''ФЕСТАЛ'' and UPPER(sname) containing ''40'') and abs(price - 252) <= 10 ) )'+
| |
− | ' and doc_id='+inttostr(ChequeList.Active.ID)+' and part_id = '+inttostr(part_id) ;
| |
− | iq.active := True;
| |
− | //забираем данные
| |
− | if not(iq.Eof) then
| |
− | begin
| |
− | ChequeList.Active.P_Index:= ChequeList.Active.IndexByPartID(part_id);
| |
− | If (POS('ФЕСТАЛ',iq.FieldByName('sname').AsString) = 0) Then ChequeList.Active.P_SetDiscount(-1*150*iq.FieldByName('quant').AsFloat)
| |
− | Else ChequeList.Active.P_SetDiscount(-1*32*iq.FieldByName('quant').AsFloat);
| |
− | end;
| |
− | end;
| |
− |
| |
− | //Акция с 06.04.2016 по 30.04.2016, суммовая скидка на некоторые товары
| |
− | //заявка в УР 557450
| |
− | //1. Эссенциале форте Н 300мг №30 капс - скидка 150 руб.
| |
− | //2. Магне В6 №50 таб.п/п/о. При покупке 4х упаковок, скидка в размере цены 1 упаковки
| |
− | //3. Зодак Экспресс 5мг №7 таб.п/п/о - скидка 15%
| |
− | //4. Зодак Экспресс 5мг №28 таб.п/п/о - скидка 15%
| |
− | if ((date() >= StrToDate('06.04.2016')) and (date() <= StrToDate('30.04.2016'))) Then
| |
− | Begin
| |
− | part_id := ChequeList.ActivePID;
| |
− | //запросик к базе
| |
− | iq.sql.text :=
| |
− | 'select UPPER(sname) as sname, quant, price, '+
| |
− | 'iif(upper(sname) containing ''ЭССЕНЦИАЛ'' and UPPER(sname) containing ''ФОРТ'' and UPPER(sname) containing ''№30'', 150*quant,'+
| |
− | 'iif(upper(sname) containing '''+magne+''' and UPPER(sname) containing ''6'' and UPPER(sname) containing ''№50'', price*Trunc(quant/4),'+
| |
− | 'iif(upper(sname) containing ''ЗОДАК'' and upper(sname) containing ''ЭКСПРЕС'' and UPPER(sname) containing ''5'' and (UPPER(sname) containing ''№7'' or UPPER(sname) containing ''№28''), 0.15*price*quant,'+
| |
− | '0))) as dop_dsc '+
| |
− | 'from vw_doc_detail_active where '+
| |
− | '((upper(sname) containing ''ЭССЕНЦИАЛ'' and UPPER(sname) containing ''ФОРТ'' and UPPER(sname) containing ''№30'') or '+
| |
− | ' (upper(sname) containing '''+magne+''' and UPPER(sname) containing ''6'' and UPPER(sname) containing ''№50'') or '+
| |
− | ' (upper(sname) containing ''ЗОДАК'' and upper(sname) containing ''ЭКСПРЕС'' and UPPER(sname) containing ''5'' and (UPPER(sname) containing ''№7'' or UPPER(sname) containing ''№28'')) ) and '+
| |
− | ' doc_id='+inttostr(ChequeList.Active.ID)+' and part_id = '+inttostr(part_id) ;
| |
− | // Add2Log('mylog.txt', iq.sql.text);
| |
− | iq.active := True;
| |
− | //забираем данные
| |
− | if not(iq.Eof) then
| |
− | Begin
| |
− | quant:=0;
| |
− | discount:=iq.FieldByName('dop_dsc').AsFloat;
| |
− |
| |
− | //Магне В6 №50 таб.п/п/о.
| |
− | If ( (POS(magne,iq.FieldByName('sname').AsString) <> 0) and (POS('№50',iq.FieldByName('sname').AsString) <> 0) and (iq.FieldByName('price').AsFloat > 600)) Then
| |
− | Begin
| |
− | for I := 0 to chequelist.count - 1 do
| |
− | for j := 0 to chequelist.items[i].count - 1 do
| |
− | begin
| |
− | chequelist.items[i].p_index := j;
| |
− | if ((POS(magne,AnsiUpperCase(chequelist.items[i].p_name)) <> 0) and (POS('№50',AnsiUpperCase(chequelist.items[i].p_name)) <> 0) and (chequelist.items[i].p_price > 600) ) then
| |
− | Begin
| |
− | if (chequelist.items[i].p_id <> ChequeList.ActivePID) Then part_id:=chequelist.items[i].p_id; //При удалении, нужно назначать скидку другой партии
| |
− | chequelist.items[i].P_SetDiscount(0);
| |
− | If Not((del = 1) and (chequelist.items[i].p_id = ChequeList.ActivePID)) Then //При удалении не суммируем удаляемую позицию
| |
− | quant:= quant + chequelist.items[i].P_Quant;
| |
− | End;
| |
− | end;
| |
− | discount:= -1*(quant div 4)*iq.FieldByName('price').AsFloat;
| |
− | End
| |
− |
| |
− | ChequeList.Active.P_Index:= ChequeList.Active.IndexByPartID(part_id);
| |
− | ChequeList.Active.P_SetDiscount(discount);
| |
− | End;
| |
− |
| |
− | End;
| |
− |
| |
| finally | | finally |
| iq.active := False; | | iq.active := False; |
| iq.transaction.free; | | iq.transaction.free; |
| iq.free; | | iq.free; |
− |
| |
| end; | | end; |
| | | |
− | end;
| |
| </PRE> | | </PRE> |
− |
| |
− | ==Конец==
| |
− | Весь сркипт заканчивается так:
| |
− |
| |
− | <pre>
| |
− | finally
| |
− | iq.active := False;
| |
− | iq.transaction.free;
| |
− | iq.free;
| |
− | end;
| |
− |
| |
− | end;
| |
− | </pre>
| |
| | | |
| =Отправка ТМС по синхронизации= | | =Отправка ТМС по синхронизации= |