A script to automatically add a menu group to the order

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

In the order, the group should be displayed as a line. When clicking on it, it would be possible to either add the dish from the group or delete the line.

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;

A script to create 2+1 and 3+1 special offers

Insert the script in the OnOrderVerify event of the CheckView component on the check editing form. The discount will be calculated and added to the receipt when the bill is printed.

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)     // bill

//  or (AVerifyType=vtBeforeSave)  // save order

//  or (AVerifyType=vtFirstPay)    // first payment input

//  or (AVerifyType=vtPrintReceipt)  // print receipt

  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 special offer

    else

      tdisc := 3;  // 3+1 special offer

     

    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 category 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;

A script to add a discount when using a PDS card

The operation algorithm:

  1. When swiping the PDS card (the OnProcessCard handler), the script checks if it is possible to add a discount to the dish.
  2. If the discount was not used, the script finds for a dish that can be given a 100% discount:
    • This dish is given a 100% discount.
    • The discount "DISCOUNT USED" is added to the order via PerformMCRAlgoritm, so that the card code is registered in the discount.

The «DISCOUNT USED» discount must have the «Not manually» flag set and the «Print nulls» option unchecked.
Insert the script in the OnProcessCard method on the order editing form.

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; // PDC interface ID

    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); // replace 1000308 with the corresponding value of the SIFR field from the SQL table [DISCOUNTS] for a 100% discount.

    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;

Create an MCR script with the following settings:

Basic — Scope: Discount

Basic — Object: DISCOUNT USED

Basic — Device Types — Script: check the box

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;

A script to stop service without a special dish and displaying a message

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('No mandatory dish! Saving prohibited');

              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;

A script to show a message after printing authorization slips or printing a receipt when paying with a MasterCard card

On the order form for the CheckView object, insert the script in the OnOrderVerify event:

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;

A script for automatic LogOut after each sale in Quick Sale Mode

On the quick check form, insert the script for the CheckView object in the OnOrderVerify event:

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;

A script to add a gift dish to the order, depending on the order amount and the number of guests

On the order editing form, insert the script for the CheckView object in the OnOrderVerify event:

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;  // gift offer limit

  GuestTypeCode := 2;  // guest type code

  if (AVerifyType=vtBill)     // bill

  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('The "Postcard..." dish will be added to the order in the amount of'+IntToStr(RKCheck.CurrentOrder.GuestsCount)+'servings, dish "Gift set",'+#10#13+'don't forget to bring guest a gift'); 

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), IntToStr(RKCheck.CurrentOrder.GuestsCount) );  // postcards

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), IntToStr(1) );   // gift
    end

    else

    begin

      gui.showmessage('The "Postcard..." dish will be added to the order in the amount of'+IntToStr(RKCheck.CurrentOrder.GuestsCount)+' servings,'+#10#13+'don't forget to bring guest a gift');     

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode), IntToStr(RKCheck.CurrentOrder.GuestsCount) );  // postcards

    end;

  end;

end;

A script to change the delivery cost depending on the delivery zone

The cost of delivery to zone 1 is 600 rubles, to zone 2 — 750 rubles. If the cost of the order in zone 1 is more than 600 rubles, then the delivery is free.

The script is inserted in the OnOrderVerify event of the CheckView object located on the check editing form:

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;  // paid delivery limit 1

  limit2 := 750;  // paid delivery limit 2

  limit3 := 850;  // paid delivery limit 3

  limit4 := 950;  // paid delivery limit 4

  ZoneId1 := 2;  //  delivery zone 1 ID

  ZoneId2 := 3;  // delivery zone 2 ID

  ZoneId3 := 4;  //  delivery zone 3 ID

  ZoneId4 := 5;  //  delivery zone 4 ID

  if (AVerifyType=vtBill)     // bill

  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) );   // delivery 1

    if RKCheck.CurrentOrder.ZoneID = ZoneId2 then

     if RKCheck.CurrentOrder.ToPaySum <= limit2 then

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode2), IntToStr(1) );   // delivery 2

    if RKCheck.CurrentOrder.ZoneID = ZoneId3 then

     if RKCheck.CurrentOrder.ToPaySum <= limit3 then

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode3), IntToStr(1) );   // delivery 3

    if RKCheck.CurrentOrder.ZoneID = ZoneId4 then

     if RKCheck.CurrentOrder.ToPaySum <= limit4 then

      RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(DishCode4), IntToStr(1) );   // delivery 4

  end;

end;

A script to control swiping of the PDS card

There are dishes that are only available to club card holders. When you select this dish, the «Use the PDS card» window should appear. If there is no card, the dish is not added to the order.

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 // defining PDS card by PDS discount availability

          CardPresent := 1;

    end;

    if DishPresent > 0 then

     if CardPresent > 0 then

       AContinue:= True

     else

{

      if GUI.RKMessageDlg('Special dishes available, use PDS card' ,0,3, 10000)=6

      then

        AContinue := false

      else

        AContinue := True;

}

     begin   

//      gui.showmessage('There are special dishes in the order, use PDS card' ');

       gui.showmessage('Special dishes: '+inttostr(DishPresent)+' ;  Cards found in the order: '+inttostr(CardPresent)); // test line

       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('Operation impossible, add consumator');

            AContinue := false;

          end;

        end;

    end; 

end;

A script to restrict the payment with PDS cards to a quick check only

Payments with PDS cards should be allowed only if the order is created using the «Quick Check» button.

On the quick check form of the CheckView object, insert the script in the OnOrderVerify event:

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;

Add a line to the MCR script to check the specified custom tag:

if (RKCheck.CurrentOrder.UserTag2 = 33) then

A script to control the number of consumators for some dishes

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

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

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


Some dishes should be given one consumator, while other dishes should be given 2 consumators.

To do this, set the limit of consumators — 2 in the parameter, and use the script to limit the dishes of a special category to one consumator.

On the order editing form for the CheckView object, insert the script in the OnOrderVerify event:

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;   // controlled dishes category

  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(' dish '+TDish(it).Name +' of modifiers '+inttostr(CntConsumators));

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

         if CntConsumators>MaxQntConsumCateg1 then

          begin                                                                     

            AContinue := False;

            gui.showmessage('The number of dish consumants is exceeded'+TDish(it).Name);

          end;

      end; 

    end;   

end;

A script to check the presence of a gift dish in the order

The special offer: A gift depending on the order sum. One dish is for free if the order sum is bigger than 1000 rubles. When it is bigger than 1200 rubles, one of two free dishes may be chosen.

The cashier shouldn't be able to calculate the order equal to or bigger than 1000 rubles if there is no gift dish in it.

Place the script on the order editing form at the CheckView object in the OnOrderVerify event.

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;  // dish code

  SpecialDishCode2 := 24;  // dish code

  LimitSum := 1000; // the sum of the check, over which the gift dish is due

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


  if ((AVerifyType=vtBill)     // bill

  or (AVerifyType=vtBeforeSave)  // save order

  or (AVerifyType=vtFirstPay)    // first payment input

  or (AVerifyType=vtPrintReceipt))  // print receipt

 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('No gift dishes!');

      AContinue := False

    end;

  end;

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

// stop service without special dish  //

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

end;

A script for link currencies to the type of guest

To arrange the staff meals, the following options were created:

  • two guest types («Guest» and «Staff») and an additional type of price;
  • the staff price type is linked to the «Staff» guests type;
  • two special currencies are used to pay for the order at staff prices.

The script restricts the payment only to these currency types when selecting the «Staff» guests type.

The version of the cash register system 7.5.2.377

On the order editing form for the CheckView object, insert the script in the OnOrderVerify event:

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 = 'Staff' 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 //Currency code for staff

          HaveAnotherCurr := HaveAnotherCurr + 1;     

    end;


    if (HaveAnotherCurr>0) then

    begin

      AContinue := False;

      gui.showmessage('Prohibited currency for this order!'); 

    end;

  end;

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

end;

A script to print the final receipt in R_Keeper_7

The restaurant works under two types of business entities — private limited company and sole proprietorship. In the first one, a fiscal register and a fiscal memory device are used. In the second one, a check printer is used.  A fiscal register works as a POS printer and has the «FR department» classification set. Alongside these two separated receipts, the third — a common one — should be printed on a check printer. 

Create a layout in «Other — Custom Layout» and load a check layout. Create a print view for it in the print layouts.

On the check editing form of the CheckView object, insert the script in the OnOrderVerify event:

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

begin

 if (AVerifyType=vtAfterReceipt) then

 begin

  RK7.PerformRefObject(RK7.FindItemByCode(rkrefMaketSchemeDetails,219));  // print view code

 end; 

end;

Specify the print view code of the custom layout instead of «219».

A script to remove the markup, if the order has a certain discount

The « Service 10% » charge applies only to waiters and is calculated from the order amount. A set of discounts (5%, 10%, Employee, Private) is calculated from the order amount.

Discounts «Employee» (code 5) and «Private» (code 6) remove the markup.

On the check editing form of the CheckView object, insert the script in the OnOrderVerify event:

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

var i,dsk1, dsk2: integer;

it, it2: TCheckItem;

begin

  dsk1 := 0;     // discounts counter canceling markup

  dsk2 := 0;     // markup counter

  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 // discounts codes canceling markup

        dsk1 := dsk1 + 1;

      if (it.CODE = 10) then // markup code

      begin

        dsk2 := dsk2 + 1;

        it2 := it;

      end;     

    End;

  end;  

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

    RKCheck.DeleteCheckItem(it2);  // delete markup

end;

A script to activate the «Plastek» loyalty card

If there is a deposit or activation item in the receipt— the table cannot be closed without using a loyalty card.

The script checks the presence of the specified dish and the discount in the order. If there is a dish, but there is no discount, then a message is displayed and the action is blocked until the discount is added or the dish is removed.

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)     // bill

  or (AVerifyType=vtBeforeSave)  // save order

  or (AVerifyType=vtFirstPay)    // input of the first payment

  or (AVerifyType=vtPrintReceipt))  // print receipt

  then

  begin

    SpecialDishCode := 23;  // dish code

    SpecialDiscCode := 10;  // discount code

    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('No mandatory discount!');

      AContinue := False

    end;

  end;

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

// stop service without special dish  //

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

end;

A script to print a coupon layout

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;  // dish code    

  CodeDish3_1  := 100; // dish code  

  CodeDish3_2  := 105; // dish code  

  CodeCateg4_1 := 5;   // "Salad" category code

  CodeCateg4_2 := 8;   // "Drink" category code


  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

// order sum >= 500 rub.

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

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

      else

// there is the dish with the code "xxx" in the order       

        if (CntDish2 > 0) then

        begin

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

        end

        else

// there is the dish with the code "100" and "105" in the order

          if (CntDish3 > 0) then

          begin

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

          end

          else

// there is the dish from "salad" and "drink" category in the order          

            if (CntDish4 > 0) then

            begin

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

            end;

    end;

end;

A script to prohibit selling a catch weight product if the weight is less than the norm

On the check editing form of the CheckView object, insert the script in the OnOrderVerify event:

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

var i: integer;

    minweight: double;

    it: TCheckItem;

begin

  minweight := 0.3;  // setting the minimum weight for sale  

  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 //check for a catch weight dish     

           if Tdish(it).Quantity < minweight then

            begin

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

              AContinue := False;

            end;     

    end;

  end;

end;

A script to confirm saving the special dish by the manager's card

The algorithm :

  1. The waiter adds a special dish or drink (with the letter A) to the order.
  2. Then he or she clicks «Save order». After that, the «Confirmation by the manager's card is required » window pops up.
  3. The manager swipes his or her card, controlling if the special offer is correctly applied. The "Save order" window pops up.
  4. After that, the added dishes are printed on the kitchen printers.

On the order editing form of the CheckView object, insert the script in the OnOrderVerify event:

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;

Specify an empty script for a custom operation (operation #7 is used in the example):

procedure ProcessOperation1001837(Parameter: integer);

begin


end;

In the operation properties, check the box «Access Control» and assign rights to the appropriate user.

A script to automatically add a dish when creating an order

On the check editing form for the CheckView component, insert the script in the OnOrderVerify event:

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('No mandatory dish! Saving prohibited');

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;

In the line:

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

codes of required dishes are specified. Replace the condition in this line with your own.

The script that prints a receipt and a bill in the «quick check» mode

A script for the «Edit Order (quick receipt)» form:

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

begin

 if (AVerifyType=vtAfterReceipt) then

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

end;

Insert the code of your check view instead of 1001965. Printing will take place immediately after printing the main receipt.

  • No labels