Скрипт на автоматическое добавление группы меню в заказ

В заказе группа должна отображаться строкой, при нажатии на которую была бы возможность, либо пробить блюдо, находящееся в ней, либо удалить строку.

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

begin

 if AVerifyType = vtNewQuickCheck then

  if RKCheck.CurrentOrder.IsEmpty then

    RK7.PerformRefObject(RK7.FindItemByCode(rkrefCategList, 5 {Menu group code}));

end;

Скрипт для создание акций 2+1 и 3+1

Скрипт необходимо повесить на событие OnOrderVerify у компонента CheckView в форме редактирования чека. Скидка посчитается и добавится в чек при печати пречека.

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i: integer;  

    i2, j, j2, t1, cntdisc, tdisc, DiscCode: integer;

    it, CurItem, ds: TCheckItem;

    SL: TStringList;

    a, q, Price: double;

    minPrice1, cnt1: double;

    d, dd: TDish;

    CheckView: TCheckView;

begin

  // Before print

  if (AVerifyType=vtBill)     // пречек

//  or (AVerifyType=vtBeforeSave)  // сохранение заказа

//  or (AVerifyType=vtFirstPay)    // ввод первого платежа

//  or (AVerifyType=vtPrintReceipt)  // печать чека

  then 

  begin


    DiscCode := 11;   // code of discount

  CheckView := TCheckView(GUI.FindComponentByName('CheckView'));

  if CheckView = Nil then Exit;

  cntdisc := 0;

  CurItem := RKCheck.CurrentCheckItem;

  SL := TStringList.Create;

  try

    // Create list of the dishes, sorted by price 

    SL.Sorted := False;

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then

        if (it.Code = DiscCode) then begin

          cntdisc := cntdisc + 1;

          j2 := i; 

        end;

      if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

        if ((it.State = disOpened) or (it.State = disPrinted)) then begin

          if (TDish(it).Quantity = 0) or (TDish(it).PRListSum = 0) then Price := TDish(it).Price

          else Price := TDish(it).PRListSum/TDish(it).Quantity;

          SL.AddObject(FormatFloat('00000000.00', Price) + IntToStr(TDish(it).UNI),

            TObject(it));

        end;    

    end;

    minPrice1 := 0;

    cnt1 :=0;

     

    if (RKCheck.CurrentOrder.TableCode = 2) then   // different discounts for different tables

      tdisc := 2   // акция 2+1

    else

      tdisc := 3;  // акция 3+1

     

    for i := 0 to SL.Count - 1 do begin

      d := TDish(SL.Objects[i]);    

      a := 0;     

      q := d.Quantity;

      if (d.Quantity = 0) or (d.PRListSum = 0) then Price := d.Price

      else Price := d.PRListSum/d.Quantity;


//    if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then 

    begin

      if (d.RefItem.MainParent.code = 1) then    // if dish from categore of menu and have same code

         begin

           cnt1 := cnt1 + d.Quantity;

           if 0.00 = minPrice1 then

           begin

             dd := TDish(SL.Objects[i]);    

             minPrice1 := Price;

           end;

//           else

           if (Price < minPrice1) then

           begin

             dd := TDish(SL.Objects[i]);    

             minPrice1 := Price;

           end;

         end;

    end;


  a := minPrice1;

   

    if ((cntdisc > 0)and(cnt1<tdisc)) then    

     for i2 := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i2];

      if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then

        if (it.Code = DiscCode) then begin

          RKCheck.DeleteCheckItem(it);

          cntdisc := 0

        end;

     end;

    

      // Create discount to a dish

      if ((cntdisc = 0) and (a > 0) and (cnt1 >= tdisc)) then begin

        CheckView.GotoItem(TObject(dd));

        RKCheck.CreateCheckItem(rkrefDiscounts, IntToStr(DiscCode), FloatToStr(a));

      end;

    end;

  finally

    SL.Free();

    if CurItem <> Nil then

      CheckView.GotoItem(CurItem);

  end;

  RKCheck.CurrentOrder.Recalc();  

  end;

end;


Скрипт на добавлении скидки при использовании карты ПДС

Алгоритм работы:

 1. При прокатывании ПДС карты (обработчик OnProcessCard) скрипт проверяет можно ли будет добавлять скидку на блюдо.

 2. Если не применялась, то скрипт ищет блюдо, на которое можно дать 100%:

  2.1 На это блюдо дается 100%

  2.2. В заказ добавляется скидка "СКИДКА ИСПОЛЬЗОВАНА". Добавляется через PerformMCRAlgoritm, чтобы в скидке прописался код карты.

 У скидки «СКИДКА ИСПОЛЬЗОВАНА» должны быть выставлен флаг «Не вручную» и не отмечено «Печатать нулевые».
Скрипт нужно вставить в метод OnProcessCard на форме редактирования заказа.

 procedure DesignFormOnProcessCard(IntfID, EntranceCardType: integer; CardCode: string; RKCardInfo: TRKCardInfo; var res: integer);

 var i,fst,dsk, CntDsk: integer;

     it,it2: TCheckItem;

     DeviceID : integer;

  begin

    fst:=-1;

    dsk:=0;

    CntDsk:=0;

    DeviceID := 0; // идентификатор интерфейса ПДС

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

        if ((it.CODE = 5502) OR (it.CODE = 1003)) then // code of dishes

        begin

          fst:=i;

          it2 := it;

        end;

      if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then

        if ((it.CODE = 11)) then // code of 100% discounts for dish

          dsk:=1;

    end;

    //function GetDiscountCount(const Sifr: integer; IntfID: integer; const CardCode: string): integer;

    CntDsk := RKCheck.GetDiscountCount(1000308, DeviceID, CardCode); // здесь 1000308 заменить на соотвествующее значение поля SIFR из SQL-таблицы [DISCOUNTS] для 100% скидки.

    If (fst>=0) and (dsk=0) and (CntDsk=0) then

    begin

      RK7.PerformOperation(rkoHome, 0);

      repeat

        it := RKCheck.CurrentCheckItem;

        if TObject(it) <> TObject(it2) then

          RK7.PerformOperation(rkoUp, 0);

      until ( TObject(it) = TObject(it2)) or ( TObject(it) = Nil);

     RKCheck.CreateCheckItem(rkrefDiscounts, '11', FloatToStr(100)); // add discount // 11 change on 100% discount for dish

     Data := 'CardCode';

     RK7.PerformMCRAlgorith('8989=', DeviceID);

    end;

  end;

Создать MCR-скрипт с такими настройками:

 Основное — Область: Скидка

 Основное — Объект: СКИДКА ИСПОЛЬЗОВАНА

 Основное — Типы устройств — Скрипт: поставить галочку

 function MCR1001146(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;

 var RestCode: integer;

 begin

   Result := False;

   if pos('8989=', Parameter) = 1 then begin

     Result := True;

   end;

 end;

Скрипт для остановки обслуживания без специальной тарелки и показа сообщения

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i, Interval, RND, DEV,happynum, CntDish, HaveSpecialDish: integer;

    rr : double;

    tt: string;

    it: TCheckItem;

begin 

//************************************//

// stop service without special dish  //

//************************************//

  if (AVerifyType = vtBeforeSave) then

  begin

    HaveSpecialDish := 0;

    CntDish := 0;

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

      if (TDish(it).Quantity <> 0) then

              begin

        CntDish := CntDish + 1;     

        if ((it.CODE = 5502) OR (it.CODE = 1003)) then

          HaveSpecialDish := HaveSpecialDish + 1;

      end;

    end;

    if (CntDish>0) and (HaveSpecialDish = 0) then

    begin

    //  gui.showmessage('Нет обязательного блюда! Сохранение запрещено');

              if GUI.RKMessageDlg('Return to edit order?', 0, 3, 10000) = 6 then

            AContinue := False

          else

            AContinue := True;    

    end;

  end;

//************************************//

// stop service without special dish  //

//************************************//


// show meessage on special order

  Interval := 10;

  DEV := 5;

  tt := TimeToStr(time);

  rr := 10*1/StrToInt(Copy(tt,length(tt)-1,2));

  happynum := trunc(Interval + rr*DEV - trunc(DEV/2));

//  GUI.ShowMessage('Happy Num='+IntToStr(happynum));

//  GUI.ShowMessage('Happy Time='+tt+' --'+Copy(tt,length(tt)-1,2));

  if (AVerifyType = vtBill) and (happynum=RKCheck.CurrentOrder.SeqNumber) then

  begin

    GUI.ShowMessage('Happy Order '+IntToStr(RKCheck.CurrentOrder.SeqNumber));

 //  ss := RKCheck.CurrentOrder.OrderName;

 //   CheckView.Tag:=1;

  end;

end;

Скрипт, показывающий сообщение после печати слипов авторизации или печати чека, если оплата была картой MasterCard

В форме заказа у объекта CheckView в событии OnOrderVerify указать скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i: integer;

it: TCheckItem;

begin

  if (AVerifyType = vtAfterReceipt) then

  begin

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do

    begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then

        if Pos('MASTERCARD', UpperCase(TPayLine(it).Owner)) > 0 then

          gui.ShowMessage('Ta-Da-a!');

    end;

  end;

end;

Скрипт для автоматического LogOut после каждой продажи в Quick Sale Mode

На форме быстрого чека у объекта CheckView в событии OnOrderVerify указать скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

begin

  if  (AVerifyType=vtAfterReceipt) then

  begin

    RK7.PostOperation(rkoOk,0);

    RK7.PostOperation(rkoUnregister,0);

  end;  

end;

Скрипт на добавления в заказ подарочного блюда, в зависимости от суммы заказа и количества гостей

В форме редактирования заказа у объекта CheckView в событии OnOrderVerify указать скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var DishCode, DishCode2, GuestTypeCode: integer;

    limit: double;

begin

  DishCode := 43; // special dish code

  DishCode2 := 46; // special dish2 code

  limit := 5000;  // лимит для предложения подарка

  GuestTypeCode := 2;  // код типа гостя

  if (AVerifyType=vtBill)     // пречек

  then

  if RKCheck.CurrentOrder.Visit.GuestType <> 0 then

  if RK7.FindItemBySifr(rkrefGuestTypes, RKCheck.CurrentOrder.Visit.GuestType).Code = GuestTypeCode then

  begin

    if RKCheck.CurrentOrder.ToPaySum >= limit then

    begin

      gui.showmessage('В заказ будет добавлено блюдо "Открытка..." в количестве '+IntToStr(RKCheck.CurrentOrder.GuestsCount)+' штук, блюдо "Подарочный набор",'+#10#13+'не забудьте вынести гостю подарок'); 

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), IntToStr(RKCheck.CurrentOrder.GuestsCount) );  // открытки

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), IntToStr(1) );   // подарок

    end

    else

    begin

      gui.showmessage('В заказ будет добавлено блюдо "Открытка..." в количестве '+IntToStr(RKCheck.CurrentOrder.GuestsCount)+' штук,'+#10#13+'не забудьте вынести гостю подарок');     

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), IntToStr(RKCheck.CurrentOrder.GuestsCount) );  // открытки

    end;

  end;

end;

Скрипт для изменения стоимости доставки в зависимости от зоны доставки

Стоимость доставки в зону 1 - 600 рублей, в зону 2 - 750 рублей. Если стоимость заказа в зону 1 больше 600 рублей, тогда доставка бесплатная. 

Скрипт размещается в событии OnOrderVerify объекта CheckView расположенного на форме редактирования чека:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var DishCode1, DishCode2, DishCode3, DishCode4, ZoneId1,ZoneId2,ZoneId3,ZoneId4: integer;

    limit1, limit2, limit3, limit4: double;

begin

  DishCode1 := 43; // special dish1 code

  DishCode2 := 46; // special dish2 code

  DishCode3 := 47; // special dish3 code

  DishCode4 := 48; // special dish4 code

  limit1 := 600;  // лимит для платной доставки 1

  limit2 := 750;  // лимит для платной доставки 2

  limit3 := 850;  // лимит для платной доставки 3

  limit4 := 950;  // лимит для платной доставки 4

  ZoneId1 := 2;  // идентификатор зоны доставки 1

  ZoneId2 := 3;  // идентификатор зоны доставки 2

  ZoneId3 := 4;  // идентификатор зоны доставки 3

  ZoneId4 := 5;  // идентификатор зоны доставки 4

  if (AVerifyType=vtBill)     // пречек

  then

  if RKCheck.CurrentOrder.ZoneID > 0 then

  begin

    if RKCheck.CurrentOrder.ZoneID = ZoneId1 then

     if RKCheck.CurrentOrder.ToPaySum <= limit1 then

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode1), IntToStr(1) );   // доставка 1

    if RKCheck.CurrentOrder.ZoneID = ZoneId2 then

     if RKCheck.CurrentOrder.ToPaySum <= limit2 then

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), IntToStr(1) );   // доставка 2

    if RKCheck.CurrentOrder.ZoneID = ZoneId3 then

     if RKCheck.CurrentOrder.ToPaySum <= limit3 then

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode3), IntToStr(1) );   // доставка 3

    if RKCheck.CurrentOrder.ZoneID = ZoneId4 then

     if RKCheck.CurrentOrder.ToPaySum <= limit4 then

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode4), IntToStr(1) );   // доставка 4

  end;

end;

Скрипт, контролирующий прокат карты PDS

Есть блюда, которые доступны только держателям клубных карт. При выборе этого блюда должно появляться окно — «Используйте карту PDS». Если нет карты, то блюдо в чек не попадает.

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i, DishCode1, DishCode2, DishCode3, DiscountCode1, DiscountCode2, DiscountCode3, CardPresent,DishPresent: integer;

    CardCode: string;

    it: TCheckItem;

begin

  DishCode1 := 1;

  DiscountCode1 := 12;

  DiscountCode2 := 13;

  DiscountCode3 := 14;

  CardPresent := 0;

  DishPresent := 0;

  CardCode := '';

  if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then

  begin

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do

    begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then //Check dish lines only

        if (TDish(it).code = DishCode1)

        then //Check category of the dish

          if TDish(it).Quantity > 0 then

            DishPresent := DishPresent + 1;

      if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then //Check discount lines only

        if (TDiscountItem(it).code = DiscountCode1)

         or(TDiscountItem(it).code = DiscountCode2)

         or(TDiscountItem(it).code = DiscountCode3)

        then // определение ПДС-карты по наличию ПДС-скидки

          CardPresent := 1;

    end;

    if DishPresent > 0 then

     if CardPresent > 0 then

       AContinue:= True

     else

{

      if GUI.RKMessageDlg('Есть специальные блюда, прокатайте карту ПДС' ,0,3, 10000)=6

      then

        AContinue := false

      else

        AContinue := True;

}

     begin   

//      gui.showmessage('В заказе есть специальные блюда, прокатайте картой ПДС');

       gui.showmessage('Специальных блюд: '+inttostr(DishPresent)+' ;  Найдено карт в заказе: '+inttostr(CardPresent)); // тестовая строка

       AContinue := false;

     end;


  end;

  if (AVerifyType = vtBill)

  or(AVerifyType = vtPrintReceipt)

  or (AVerifyType=vtBeforeSave)

  then

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do

    begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(it, 'TDish') then

        if CheckDishCode(TDish(it).Code) then // if (TDish(it).Code = DishCode) then

        begin

        // checking by Consumators

          if TDish(it).Consumators.Count = 0 then

          begin

            gui.ShowMessage('Операция невозможна, добавьте консумант');

            AContinue := false;

          end;

        end;

    end; 

end;

Скрипт, ограничивающий оплату картами PDS только быстрым чеком

Необходимо разрешить оплату картами PDS только в случае, если заказ создан с помощью кнопки «Быстрый чек».

На форме быстрого чека у объекта CheckView в событии OnOrderVerify указать скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

begin

   if AVerifyType = vtNewQuickCheck then

    if RKCheck.CurrentOrder.IsEmpty then  

      RKCheck.CurrentOrder.UserTag2 := 33; 

end;


В MCR-скрипт добавить строку с проверкой заданного пользователького тега:


 if (RKCheck.CurrentOrder.UserTag2 = 33) then


Скрипт, контролирующий количество консумантов для некоторых блюд

Необходимо сделать так, чтобы к одним блюдам был привязан один консумант, а к другим — два консуманта.

Для этого в параметре задайте ограничение консумантов — 2, а скриптом ограничьте блюда специальной категории одним консумантом.

На форме редактирования заказа у объекта CheckView в событии OnOrderVerify укажите скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i,j,CntConsumators,MaxQntConsumCateg1:integer;

    it: TCheckItem;

    CategCode2: integer; 

    Categ2: TClassificatorGroup;

begin

//************************* Set parameters ******************************//

  CategCode2 := 8;   // категория контролируемых блюд

  MaxQntConsumCateg1 := 1;

//************************* Set parameters ******************************//

  Categ2  := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode2));

  if (AVerifyType = vtBeforeSave)or(AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then

    for i:= 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do

    begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

      begin

        CntConsumators := 0;

        CntConsumators :=  TDish(it).Consumators.Count;

//dbg.dbgprint(' блюдо '+TDish(it).Name +' модификаторов '+inttostr(CntConsumators));

        if not(Categ2.IsChild(it.RefItem)) then //Check category of the dish

         if CntConsumators>MaxQntConsumCateg1 then

          begin                                                                     

            AContinue := False;

            gui.showmessage('Превышено количество консумантов у блюда '+TDish(it).Name);

          end;

      end; 

    end;   

end;

Скрипт для проверки наличия подарочного блюда в заказе

Акция — Подарок от суммы заказа. От 1000 рублей — одно блюдо бесплатно,

от 1200 - одно из двух на выбор.

Необходимо чтобы кассир не смог рассчитать заказ от 1000 рублей, если в нём нет подарочного блюда.

Cкрипт разместить на форме редактирования заказа у объекта CheckView в событии OnOrderVerify

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i, CntDish, HaveSpecialDish, SpecialDishCode1, SpecialDishCode2: integer;

    LimitSum : double;

    it: TCheckItem;

begin 

//************************************//

// stop service without special dish  //

//************************************//


//********** Set parameters  ***********//

  SpecialDishCode1 := 23;  // код блюда

  SpecialDishCode2 := 24;  // код блюда

  LimitSum := 1000; // сумма чека, свыше которой требовать наличие подарочного блюда

//********** Set parameters  ***********//


  if ((AVerifyType=vtBill)     // пречек

  or (AVerifyType=vtBeforeSave)  // сохранение заказа

  or (AVerifyType=vtFirstPay)    // ввод первого платежа

  or (AVerifyType=vtPrintReceipt))  // печать чека

 then

  begin

    HaveSpecialDish := 0;

    CntDish := 0;

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

      if (TDish(it).Quantity <> 0) then

        begin

        CntDish := CntDish + 1;     

        if (it.CODE = SpecialDishCode1)or(it.CODE = SpecialDishCode2) then

          HaveSpecialDish := HaveSpecialDish + 1;

      end;

    end;  

    if (HaveSpecialDish = 0)and(RKCheck.CurrentOrder.ToPaySum >= LimitSum) then

    begin

      gui.showmessage('Нет подарочных блюд!');

      AContinue := False

    end;

  end;

//************************************//

// stop service without special dish  //

//************************************//

end;

Скрипт для привязки валют к типу гостя

Для организации питания персонала введено:

- два типа гостя («Гость» и «Персонал») и дополнительный тип цены;

- тип цены для персонала привязан к типу гости «Персонал»;

- для оплаты заказа по ценам для персонала используется две специальные валюты.

Скрипт ограничивает оплату только данными типами валют при выборе типа гостя «Персонал» 

Версия кассовой системы 7.5.2.377

В форме редактирования заказ у объекта CheckView в событии OnOrderVerify указать скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

 var i, CntDish, HaveSpecialDish, HaveDiscount: integer;

    it: TCheckItem;

    HaveAnotherCurr: integer;

begin 

//***********41012********************//

  if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then

//  if RKCheck.CurrentOrder.GuestType = 'Персонал' then

  if RKCheck.CurrentOrder.Visit.GuestType <> 0 then

    if RK7.FindItemBySifr(rkrefGuestTypes, RKCheck.CurrentOrder.Visit.GuestType).Code = 2 then

  begin

    HaveAnotherCurr := 0;

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TPayLine') then

      if (TPayLine(it).Code <> 98)and(TPayLine(it).Code <> 99) then //Код валют для персонала

          HaveAnotherCurr := HaveAnotherCurr + 1;     

    end;


    if (HaveAnotherCurr>0) then

    begin

      AContinue := False;

      gui.showmessage('Запрещённая валюта для этого заказа!'); 

    end;

  end;

//***********41012********************//

end;

Скрипт на печать финального чека в R_Keeper_7

Ресторан работает под ООО и ИП. В ООО - фискальный регистратор и накопитель. В ИП — роловый принтер. В качестве чекового принтера — фискалкальный регистратор, на котором задана классификация — отдел ФР. Необходимо, чтобы кроме этих двух разделенных чеков, дополнительно печатался третий — общий, на роловом принтере.

Создать макет в "Прочее -- Пользовательский макет" Загрузить в него макет чека. Создать для него представление печати в схемах печати.

В форме редактирования чека у объекта CheckView в событии OnOrderVerify указать скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

begin

 if (AVerifyType=vtAfterReceipt) then

 begin

  RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,219));  // код представления печати

 end; 

end;

Вместо «219» указать код представления печати пользовательского макета.

Скрипт на удаление наценки, если в заказе есть определенная скидка

Наценка «Обслуживание 10%» действует только на официантов и рассчитывается от суммы заказа. Набор скидок (5%, 10%, Сотрудник, Приват) рассчитывается от суммы заказа.

Скидки «Сотрудник» (код 5) и «Приват» (код 6) убирают наценку.

На форме редактирования чек у объекта CheckView в событии OnOrderVerify указать скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i,dsk1, dsk2: integer;

it, it2: TCheckItem;

begin

  dsk1 := 0;     // счётчик скидок отменяющих наценку

  dsk2 := 0;     // счётчик наценок

  for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

    it := RKCheck.CurrentOrder.Sessions.Lines[i];

    if SYS.ObjectInheritsFrom(TObject(it), 'TDiscount') then

    Begin

      if ((it.CODE = 5) or (it.CODE = 6)) then // коды скидок отменяющих наценку

        dsk1 := dsk1 + 1;

      if (it.CODE = 10) then // код наценки

      begin

        dsk2 := dsk2 + 1;

        it2 := it;

      end;     

    End;

  end;  

  if (dsk1 > 0) and (dsk2 > 0) then

    RKCheck.DeleteCheckItem(it2);  // удаление наценки

end;

Скрипт на активацию карты лояльности «Пластек»

Если в чеке есть блюдо пополнения или активации — стол невозможно закрыть без применения карты лояльности

Скрипт проверяет наличие в заказе указанного блюда и скидки. Если блюдо есть, а скидки нет, то выводится сообщене и блокируется действие, пока не добавят скидку или удалят блюдо.

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i, Interval, RND, DEV,happynum, CntDish, HaveSpecialDish, HaveSpecialDisc, SpecialDishCode, SpecialDiscCode: integer;

    rr : double;

    tt: string;

    it: TCheckItem;

begin 

//************************************//

// stop service without special dish  //

//************************************//

  if ((AVerifyType=vtBill)     // пречек

  or (AVerifyType=vtBeforeSave)  // сохранение заказа

  or (AVerifyType=vtFirstPay)    // ввод первого платежа

  or (AVerifyType=vtPrintReceipt))  // печать чека

 then

  begin

    SpecialDishCode := 23;  // код блюда

    SpecialDiscCode := 10;  // код скидки

    HaveSpecialDish := 0;

    HaveSpecialDisc := 0;

    CntDish := 0;

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

      if (TDish(it).Quantity <> 0) then

        begin

        CntDish := CntDish + 1;     

        if (it.CODE = SpecialDishCode) then

          HaveSpecialDish := HaveSpecialDish + 1;

      end;

      if SYS.ObjectInheritsFrom(TObject(it), 'TDiscountItem') then

        if (it.CODE = SpecialDiscCode) then

          HaveSpecialDisc := HaveSpecialDisc + 1;

    end;  

    if (HaveSpecialDisc = 0) and (HaveSpecialDish > 0) then

    begin

      gui.showmessage('Нет обязательной скидки!');

      AContinue := False

    end;

  end;

//************************************//

// stop service without special dish  //

//************************************//

end;

Скрипт для печати макета-купона

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i, CntDish2, CntDish3, CntDish4, CodeDish2, CodeDish3_1, CodeDish3_2, CodeCateg4_1, CodeCateg4_2: integer;

    it: TCheckItem;

    Categ: TClassificatorGroup;

    s1: string;

begin

  s1 := FormatDateTime('hh',Now);

  CntDish2 := 0;

  CntDish3 := 0;

  CntDish4 := 0;

  CodeDish2    := 10;  // код блюда

  CodeDish3_1  := 100; // код блюда

  CodeDish3_2  := 105; // код блюда

  CodeCateg4_1 := 5;   // код категории "салат"

  CodeCateg4_2 := 8;   // код категории "напиток"


  for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

    it := RKCheck.CurrentOrder.Sessions.Lines[i];

    if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then  

    begin

      if TDish(it).Code = CodeDish2 then

        CntDish2 := CntDish2 + 1;     

      if (TDish(it).Code = CodeDish3_1) or (TDish(it).Code = CodeDish3_2) then

        CntDish3 := CntDish3 + 1;

      Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CodeCateg4_1));

      if Categ.IsChild(it.RefItem) then

        CntDish4 := CntDish4 + 1;

      Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CodeCateg4_2));

      if Categ.IsChild(it.RefItem) then

        CntDish4 := CntDish4 + 1;              

    end

  end;


  if AVerifyType = vtPrintReceipt then

    if StrtoInt(s1) <= 18 then

    Begin

// сумма заказа >= 500 руб.

      if (RKCheck.CurrentOrder.ToPaySum >= 500) {and (RKCheck.CurrentOrder.ToPaySum < 1000)} then

        RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,3031))

      else

// в заказе есть блюдо с кодом "ххх"     

        if (CntDish2 > 0) then

        begin

          RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,3032));

        end

        else

// в заказе есть блюдо с кодом "100" и "105"

          if (CntDish3 > 0) then

          begin

            RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,3033));        

          end

          else

// в заказе есть блюдо из категории "салат" или "напиток"         

            if (CntDish4 > 0) then

            begin

              RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,3034));       

            end;

    end;

end;

Скрипт, запрещающий продавать весовой товар, если вес меньше нормы

На форме редактирования чека у объекта CheckView в событии OnOrderVerify указать скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i: integer;

    minweight: double;

    it: TCheckItem;

begin

  minweight := 0.3;  // установка минимального веса для продажи

  if (AVerifyType = vtBill)or(AVerifyType = vtPrintReceipt) then

  begin

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

        if TDish(it).Quantity>0.0 then

          if SYS.ObjectInheritsFrom(it, 'TPortion') then //проверка на весовое блюдо

            if Tdish(it).Quantity < minweight then

            begin

              gui.showmessage('Too small weight! Set more then '+FloatToStr(minweight));

              AContinue := False;

            end;     

    end;

  end;

end;

Скрипт на подтверждение картой менеджера сохранения акционного блюдо

Алгоритм :

1.Официант пробивает блюдо/напиток по акции (с литерой А)

2.Нажимает «сохранить заказ». После этого всплывает окно «Требуется подтверждение картой менеджера»

3. Менеджер поводит своей картой (контролирует в этот момент корректность применения акции), после чего всплывает окно «Сохранить заказ».

4. После этого пробитые блюда печатаются в цеховых принтерах.

На форме редактирования заказа у объекта CheckView в событии OnOrderVerify указать скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i, DishCode, CntDish, HaveSpecialDish: integer;

    it: TCheckItem;

begin 

//************************************//

//              57799                 //

//************************************//

  if (AVerifyType = vtBeforeSave) then

  begin

    DishCode := 25;       // code of dish

    HaveSpecialDish := 0;

    CntDish := 0;

    for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

      it := RKCheck.CurrentOrder.Sessions.Lines[i];

      if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

      if (TDish(it).Quantity <> 0) then

      begin

        CntDish := CntDish + 1;     

        if (it.CODE = DishCode) then

          HaveSpecialDish := HaveSpecialDish + 1;

      end;

    end;

    if (CntDish>0) and (HaveSpecialDish > 0) then

    begin

    //  gui.showmessage('??? ????????????? ?????! ?????????? ?????????');

      if RK7.PerformOperation(rkoUser07, 0)=1 then

            AContinue := True

          else

            AContinue := False; 

    end;

  end;

//************************************//

//               57799                //

//************************************//

end;

Для пользовательской операции (в примере используется операция №7) задать пустой скрипт:

procedure ProcessOperation1001837(Parameter: integer);

begin


end;

В свойствах операции выставить галочку «Контроль доступа» и назначить права соотвествующему пользователю.

Скрипт на автоматическое добавление блюда при создании заказа

В форме редактирования чека у компонента CheckView в событии OnOrderVerify укажите скрипт:

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

var i, CntDish, HaveSpecialDish: integer;
it:Tcheckitem;


begin

//************************************//

// stop service without special dish //

//************************************//

if (AVerifyType = vtBeforeSave) then

begin

HaveSpecialDish := 0;

CntDish := 0;

for i := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin

it := RKCheck.CurrentOrder.Sessions.Lines[i];

if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then

if (TDish(it).Quantity <> 0) then

begin

CntDish := CntDish + 1;

if ((it.CODE = 5502) OR (it.CODE = 1003)) then

HaveSpecialDish := HaveSpecialDish + 1;

end;

end;

if (CntDish>0) and (HaveSpecialDish = 0) then

begin

// gui.showmessage('Нет обязательного блюда! Сохранение запрещено');

if GUI.RKMessageDlg('Return to edit order?', 0, 3, 10000) = 6 then

AContinue := False

else

AContinue := True;

end;

end;

//************************************//

// stop service without special dish //

//************************************//


end;

В строке:

if ((it.CODE = 5502) OR (it.CODE = 1003)) then

указаны коды обязательных блюд. Замените условие в этой строке на своё.

Скрипт, печатающий чек и предчек в режиме «быстрый чек»

Скрипт для формы «Редактирование заказа(быстрый чек)»

procedure CheckViewOnOrderVerify(Sender: TObject; AVerifyType: TVerifyType; oper: integer; var AContinue: boolean);

begin

 if (AVerifyType=vtAfterReceipt) then

  RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,1001965)); 

end;

Вместо 1001965 подставите код представления своего чека. Печать будет происходить сразу после печати основного чека.