Function MCR1003052(DeviceSignal: Integer; DeviceIdent: Integer; var Parameter: String): Boolean;
var
parsedData: TStringList;
FNC1, GS: char;
AI01, AI21: string;
Prmt: string;
i: Integer;
currPos: Integer;
s: string;
AI: Integer;
partlen: Integer;
GSSymbolExists: Boolean;
Props: TVisitOrderInfo;
////////////////////////////////////////////////////////////////////////////////
it, CurItem: TCheckItem;
Categ: TClassificatorGroup;
CatCode, j, k, m, CntModif: integer;
CheckView: TCheckView;
voidCode: String;
d: TDish;
begin
Result := False;
if (Length(Parameter) = 0) then
Exit;
GSSymbolExists := False;
FNC1 := #232;
GS := #29;
Prmt := Parameter;
if (Prmt[1] = FNC1) or (Prmt[1] = GS) then begin
Delete(Prmt, 1, 1);
GSSymbolExists := True;
end;
parsedData := TStringList.Create;
try
// Разбираем QR-код, заносим секции в parsedData
currPos := 1;
while currPos < Length(Prmt) do begin
s := Copy(Prmt, currPos, 2);
if Length(s) <> 2 then Break;
AI := StrToIntDef(s, -1);
if AI = -1 then Exit;
//полный список AI фиксированной длины:
// "Table 2-3 Element strings with pre-defined length using Application Identifiers (GS1 General Specifications Figure 5.10.1-2)."
if AI = 00 then
partLen := 20
else if (AI >= 01) and (AI <= 03) then
partLen := 16
else if AI = 04 then
partLen := 18
else if (AI >= 11) and (AI <= 19) then
partLen := 8
else if AI = 20 then
partLen := 4
else if (AI >= 31) and (AI <= 36) then
partLen := 10
else if AI = 41 then
partLen := 16
else partLen := 0;
if partLen > 0 then begin
//AI фиксированной длины
if currPos + partLen > Length(Prmt)+1 then Exit;
s := Copy(Prmt, currPos, partLen);
//данные не должны содержать GS или FNC1
if Pos(GS, s) > 0 then Exit;
if Pos(FNC1, s) > 0 then Exit;
end else begin
//AI переменной длины
s := copy(Prmt, currPos, 1000);
//ищем первый GS или FNC1
partLen := Pos(GS, s);
if partLen > 0 then begin
s := copy(s, 1, partLen-1);
GSSymbolExists := True;
end;
partLen := Pos(FNC1, s);
if partLen > 0 then begin
s := copy(s, 1, partLen-1);
GSSymbolExists := True;
end;
end;
//добавляем найденный кусок
parsedData.Add(s);
currPos := currPos + Length(s);
//удаляем разделительный GS или FNC1. После AI фиксированной длины разделитель тоже допустим по GS1
s := Copy(Prmt, currPos, 1);
if (s = FNC1) or (s = GS) then begin
currPos := currPos + 1;
GSSymbolExists := True;
end;
end;
// Проверяем, что в ParsedData есть нужные данные
AI01 := '';
AI21 := '';
for i := 0 to parsedData.Count - 1 do begin
if copy(parsedData.Strings[i], 1, 2) = '01' then
AI01 := copy(parsedData.Strings[i], 3, 1000);
if copy(parsedData.Strings[i], 1, 2) = '21' then
AI21 := copy(parsedData.Strings[i], 3, 1000);
end;
finally
parsedData.Free;
end;
if (AI01 = '') or (AI21 = '') then Exit;
for i := 1 to Length(AI01) do
if (AI01[i] < '0') or (AI01[i] > '9') then Exit;
if not GSSymbolExists then begin
Result := False;
Exit;
end;
Result := True;
//////////////////////////////////////////////////////////////////////////////
//**************Set parameters********************************
CatCode:=16391; // код категории с маркированными товарами *
voidCode:= '2'; //код причины удаления блюда *
//************************************************************
Categ := TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', catcode));
CheckView := TCheckView(GUI.FindComponentByName('CheckView'));
if CheckView = Nil then Exit;
if not RKCheck.Valid then Exit;
CntModif := 0;
for k := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do
begin
it := RKCheck.CurrentOrder.Sessions.Lines[k];
if SYS.ObjectInheritsFrom(TObject(it), 'TDish') then
if Categ.IsChild(TDish(it).RefItem) then
begin
for j := 0 to TDish(it).Modifiers.Count - 1 do
begin
if (TModiItem(TDish(it).Modifiers.Items[j]).OpenName = Parameter) and (TDish(it).Quantity > 0) then
begin
CntModif := CntModif + 1;
d := TDish(it);
//dbg.dbgprint('!!==!!' + ' Марка ' + Parameter);
Break;
end;
end;
end;
end;
//dbg.dbgprint('!!==!!' + ' CntModif ' + IntToStr(CntModif));
if CntModif > 0 then
begin
m:= gui.MessageDlgEx('Позиция с такой маркой уже добавлена в заказ.', mtInformation, mbYes+mbNo, 'Удалить;Оставить');
if m=ID_Yes then
begin
CheckView.GotoItem(TDish(d));
RKCheck.CreateCheckItem(rkrefOrderVoids, voidCode, FloatToStr(d.Quantity));
//RKCheck.DeleteCheckItem(d);
Result := False;
end;
if m=ID_No then
Result := True;
end;
Parameter := Copy(AI01, 2, 13);
end;
DELPHI