Автоматическое удаление скидки по истечении периода использования

Задача: Необходимо, чтобы скидка автоматически исчезала из сохраненного заказа по истечении определенного времени.

Например, есть ручная скидка «Счастливые часы», которая действует с 11.00 до 13.00. Если сохраненный заказ остается неоплаченным более чем до 13.30, то скидка должна автоматически исчезнуть и не должна распространятся на блюда, забитые до 13.00 ч.

Решение: 

procedure DiscountUsage1001863(UsageParameters: TDiscountUsageParameters);
var
  t1, t2: TDatetime;
begin
  t1 := StrToTime('11:00:00');  // hour:minutes:seconds
  t2 := StrToTime('13:30:00');  // hour:minutes:seconds
  if (Time >= t1)and(Time < t2) then
    UsageParameters.UsageMode := umAllow //umAuto
  else
    UsageParameters.UsageMode := umDeny;
end;

Удаление автоматической наценки при добавлении определенного блюда

Задача: В караоке есть автоматическая наценка (оплата входа). Необходим скрипт, который будет удалять наценку при добавлении в заказ определенного блюда (заказ песни), или выводить напоминание о том, что ее нужно удалить.

Решение:

procedure DiscountUsage1000872(UsageParameters: TDiscountUsageParameters);
var i: integer;
    it: TCheckItem;
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 (it.CODE = 23) then  // заменить 23 на код блюда, при наличии которого отменять скидку
    Begin
     UsageParameters.UsageMode := umDeny;
     Exit;
    End;
  end;
  UsageParameters.UsageMode := umAuto;
end;

Добавление скидки на каждое второе блюдо в заказ

Задача: Необходим скрипт, который бы разрешал использование скидки на каждое второе блюдо. Коды конкретных блюд должны быть указаны в самом скрипте и могут быть изменены.

Решение: 

procedure DiscountUsage1001506(UsageParameters: TDiscountUsageParameters);

var i,sd,CategCode: integer;
    it: TCheckItem;
    Categ: TClassificatorGroup;
begin
  if not RKCheck.Valid then Exit;
  CategCode := 8;   // указать код категории
  Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));
  sd := 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 Categ.IsChild(TDish(it).RefItem) then    // проверка по категории блюда
     if
      //Блюда
      ((it.CODE = 3006)
      or (it.CODE = 3007)
      or (it.CODE = 3022)
      or (it.CODE = 3025)
      or (it.CODE = 8056)
      or (it.CODE = 8060)
      or (it.CODE = 3035)
      or (it.CODE = 3036)
      or (it.CODE = 8096)
      or (it.CODE = 8097)
      or (it.CODE = 3029)
      or (it.CODE = 3031)
      or (it.CODE = 3032)
      or (it.CODE = 3003)
      or (it.CODE = 3018)
      or (it.CODE = 3019)
      //Комбо
      or (it.CODE = 8066)
      or (it.CODE = 8067)
      or (it.CODE = 8068)
      or (it.CODE = 5011)
      or (it.CODE = 5015)
      or (it.CODE = 5023)
      or (it.CODE = 5026)
      or (it.CODE = 5029)
      or (it.CODE = 5102)
      or (it.CODE = 5152)
      or (it.CODE = 5202)
      or (it.CODE = 5254)
      or (it.CODE = 5302)
      or (it.CODE = 5354)
      or (it.CODE = 5402)
      or (it.CODE = 5452)
      or (it.CODE = 5502)
      or (it.CODE = 5552)
      or (it.CODE = 5604)
      or (it.CODE = 5654)
      or (it.CODE = 5754)
      or (it.CODE = 5904)
      or (it.CODE = 5039)
      or (it.CODE = 5040)
      or (it.CODE = 5041)
      or (it.CODE = 5042)
      or (it.CODE = 5043)
      or (it.CODE = 5044)
      or (it.CODE = 5045)
      or (it.CODE = 5046)
      or (it.CODE = 6013)
      or (it.CODE = 6014)
      or (it.CODE = 6015)
      or (it.CODE = 5047)
      or (it.CODE = 5048)
      or (it.CODE = 5049)
      or (it.CODE = 5050)
      or (it.CODE = 5051)
      or (it.CODE = 5052)
      or (it.CODE = 5053)
      or (it.CODE = 5201)
      or (it.CODE = 5204)
      or (it.CODE = 5205)
      or (it.CODE = 5206)
      or (it.CODE = 5207)
      or (it.CODE = 5208)
      or (it.CODE = 5209)
      or (it.CODE = 5210)
      or (it.CODE = 5211)
      or (it.CODE = 5212)
      or (it.CODE = 5213)
      or (it.CODE = 5214)
      or (it.CODE = 5215)
      or (it.CODE = 5216)
      or (it.CODE = 5217)
      or (it.CODE = 5218)
      or (it.CODE = 5219)
      or (it.CODE = 5220)
      or (it.CODE = 5221)
      or (it.CODE = 5222)
      or (it.CODE = 5223)
      or (it.CODE = 5224)
      or (it.CODE = 5054)
      or (it.CODE = 5055)
      or (it.CODE = 5056)
      or (it.CODE = 5225))
     then   // проверка по коду блюда
       sd := sd + 1;
  end;
  if sd>0 then
    UsageParameters.UsageMode := umAllow   // umAllow  umAuto
  else
    UsageParameters.UsageMode := umDeny;
end;

Добавления скидки при наличии в заказе блюд из определённой категории

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

Решение: 

procedure DiscountUsage1002322(UsageParameters: TDiscountUsageParameters);
var i,sd,CategCode: integer;
    it: TCheckItem;
    Categ: TClassificatorGroup;
begin
  if not RKCheck.Valid then Exit;
  CategCode := 8;   // указать код категории
  Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', CategCode));
  sd := 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
        if Categ.IsChild(TDish(it).RefItem) then    // проверка по категории блюда
          sd := sd + 1;
  end;
  if sd>0 then
    UsageParameters.UsageMode := umAuto   // umAllow  umAuto
  else
    UsageParameters.UsageMode := umDeny;
end;

Добавление блюда в чек, если добавляется скидка

    procedure CheckViewOnAfterCheckViewEdit(Sender: TObject; AEditType: TEditType; AObjectBef, AObjectAft: TObject);
    begin
       if AEditType = etInsert then
         if SYS.ObjectInheritsFrom(AObjectAft, 'TDiscountItem') then
           if (TDiscountItem(AObjectAft).Code = 3) then
             RKCheck.CreateCheckItem(rkrefMenuItems, IntToStr(143), '1');           
    end;