var // переменные для выполнения запросов и обработки ошибок по ним AAddress,ResursName,RequestText,ResultText,Details,API_Key,Company_ID: string; date_today, date_end: TdateTime; Str_var, Error_text,codeUserD,UDS_Cheked,Cash_GUID,Cash_name,Check_num,UDS_CODE_GUID,UDS_TRANSACTION_GUID,UDS_Transaction,UDS_DateEnd : string; Operation_Correct, UDS_present,Is_error,CheckCateg,CheckCateg_Out,boolean_var: boolean; i_count,Int_var,UDS_Code,Categ_Num_In,Categ_Num_Out,DO_NOT_SHOW_SUCCESS,Without_Discount : integer; Check_item: TCheckItem; TotalSum,BonusSum,DiscontSum,CashSum,SumCategAll,SumCateg,Double_var : double; // переменные для расширенных свойств, категорий и т.д. CategA: TClassificatorGroup; Props: TVisitOrderInfo; RefCollection: TReferentCollection; // коллекция элементов справочника begin //======================================================================================================================================================== ПАРАМЕТРЫ ДЛЯ РАБОТЫ СКРИПТА //Параметры регистрации заведения, берутся из настроек в личном кабинете UDS API_Key:=''; //API ключ из личного кабините UDS (НаСтройки->Интеграция) Company_ID:='';// // параметры для расчета скидок Categ_Num_In := 0; // Код категории в которую входят товары на которые действуют операции с бонусами UDS / если 0 - фильтр по категории отключен Categ_Num_Out := 0; // Код категории в которую входят товары, исключенные из операций с бонусами UDS / если 0 - фильтр по категории отключен Without_Discount := 0; // Код скидки или НАЦЕНКИ, которую надо исключить из расчета бонуса, например наценка на обслуживание / если 0 - в расчет включается все DO_NOT_SHOW_SUCCESS :=0; // установить в 1 чтобы не показывать сообщение "Применено UDS" //=============================================================================================================================================================================================== //КОД НИЖЕ НЕ РЕДАКТИРОВАТЬ if(length(AAddress) = 0 ) then begin AAddress := 'https://informapi.ru'; end Cash_GUID:= rk7.cash.Guidstring; Cash_name:= rk7.cash.Name; if Operation = rkoCloseReceipt then begin UDS_present := false; // проверяем, есть ли в заказе UDS_BONUSES, UDS_DISCOUNT for i_count := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin Check_item := RKCheck.CurrentOrder.Sessions.Lines[i_count]; if SYS.ObjectInheritsFrom(TObject(Check_item), 'TDiscountItem') then begin sys.GetStrObjectProperty(Check_item, 'NAME' ,Str_var); if Str_var = 'UDS_DISCOUNT' then begin sys.GetStrObjectProperty(Check_item, 'State' ,Str_var); if TDiscountItem(Check_item).State <> disDeleted then begin UDS_present := True; DiscontSum := -1*TDiscountItem(Check_item).CalcAmount;// сумма отрицательная, так как скидка, поэтому умножим на -1 end end if Str_var = 'UDS_BONUSES' then begin sys.GetStrObjectProperty(Check_item, 'State' ,Str_var); if TDiscountItem(Check_item).State <> disDeleted then begin UDS_present := True; BonusSum := -1*TDiscountItem(Check_item).CalcAmount;// сумма отрицательная, так как скидка, поэтому умножим на -1 end end if TDiscountItem(Check_item).Code = Without_Discount then begin if TDiscountItem(Check_item).State <> disDeleted then begin DiscontSum := TDiscountItem(Check_item).CalcAmount; end end end end if UDS_present then begin // UDS_present // получаем значениея расширенных свойств // ищем расширенные свойства заказa UDS_CODE и UDS_TRANSACTION UDS_CODE_GUID := ''; UDS_TRANSACTION_GUID := ''; RefCollection := RK7.RefCollectionByName(rkrefGENERATEDPROPTYPES);// коллекция расширенных свойств заказа for i_count := 0 to RefCollection.Count - 1 do begin sys.GetStrObjectProperty(RefCollection.Items[i_count], 'NAME' ,Str_var); if Str_var = 'UDS_CODE' then begin sys.GetStrObjectProperty(RefCollection.Items[i_count], 'GUIDSTRING' ,UDS_CODE_GUID); end if Str_var = 'UDS_TRANSACTION' then begin sys.GetStrObjectProperty(RefCollection.Items[i_count], 'GUIDSTRING' ,UDS_TRANSACTION_GUID); end end boolean_var := False; if (UDS_CODE_GUID ='') then begin gui.ShowMessage('Не настроено расширенное свойство заказа '); boolean_var := True; end if (UDS_TRANSACTION_GUID ='') then begin gui.ShowMessage('Не настроено расширенное свойство заказа '); boolean_var := True; end if boolean_var then begin ValidResult:= False; exit; end for i_count := 0 to RKCheck.CurrentOrder.CustomProps.Count - 1 do begin if TCustomProp(RKCheck.CurrentOrder.CustomProps.Items[i_count]).PropName = UDS_CODE_GUID then begin codeUserD:= TCustomProp(RKCheck.CurrentOrder.CustomProps.Items[i_count]).Value; end if TCustomProp(RKCheck.CurrentOrder.CustomProps.Items[i_count]).PropName = UDS_TRANSACTION_GUID then begin UDS_Cheked:= TCustomProp(RKCheck.CurrentOrder.CustomProps.Items[i_count]).Value; end end if (length(UDS_Cheked)=0) and (codeUserD <> '') then begin // UDS_Cheked <> '' //====================================================== Проверяем подключение к интернету ResursName := '/test_connect/'; ResultText:=''; HttpGet(AAddress+ResursName,ResultText); if (length(ResultText) = 0) then begin // а есть ли вообще интернет? i_count := HttpGet('ya.ru',ResultText); if (i_count<0) then begin gui.ShowMessage('Подключение к интернет отсутствует'); end else begin gui.ShowMessage('Нет связи с informAPI'); end ValidResult:= False; exit end SumCategAll:=0; SumCateg :=0; for i_count := 0 to RKCheck.CurrentOrder.Sessions.LinesCount - 1 do begin Check_item := RKCheck.CurrentOrder.Sessions.Lines[i_count]; if SYS.ObjectInheritsFrom(TObject(Check_item), 'TDish') then begin SumCategAll := SumCategAll+TDish(Check_item).PaySum; CheckCateg := true; CheckCateg_Out := true; if(Categ_Num_In <> 0) then begin // берем товары только из указанной категории CategA:= TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', Categ_Num_In)); CheckCateg := CategA.IsChild(Check_item.RefItem); end if(Categ_Num_Out <> 0) then begin // берем товары не из указанной категории CategA:= TClassificatorGroup(getitemBycodeNum('ClassificatorGroups', Categ_Num_Out)); CheckCateg_Out := (CategA.IsChild(Check_item.RefItem) = false); end if CheckCateg and CheckCateg_Out then begin SumCateg := SumCateg+TDish(Check_item).PaySum; end end end TotalSum := SumCateg+BonusSum-DiscontSum; CashSum := TotalSum-BonusSum; Check_num := IntToStr(RKCheck.CurrentOrder.UVN); // и проводим транзакцию ResursName := '/Operation/'; RequestText := '{'+ '"uds_id":"'+Company_ID+'",'+ '"api_key":"'+API_Key+'",'+ '"station_guid":"'+Cash_GUID+'",'+ '"station_name":"'+Cash_name+'",'+ '"check_num":"'+Check_num+'",'+ '"type_id":"PAY",'+ '"soft_id":"RK",'+ '"id_client":"'+codeUserD+'",'+ '"points":"'+FloatToStr(BonusSum)+'",'+ '"cash":"'+FloatToStr(CashSum)+'",'+ '"total":"'+FloatToStr(TotalSum)+'",'+ '"name_off":"'+RKCheck.CurrentOrder.MainWaiterName+'",'+ '"id_off":"' +IntToSTr(RKCheck.CurrentOrder.MainWaiter)+'",'+ '"skiploaylty":"0.00"'+ '}'; RequestText := AnsiToUtf8(RequestText); HttpPost(AAddress+ResursName,RequestText,ResultText); if (length(ResultText) > 0) and (pos('error',ResultText)=0) then begin if DO_NOT_SHOW_SUCCESS <> 1 then begin gui.ShowMessage('Применено UDS'); end // , // вырежем UDS_Transaction UDS_Transaction:=Copy(ResultText,1,Pos(';',ResultText)-1); Delete(resulttext,1,Length(UDS_Transaction)+1); // в остатке UDS_DateEnd UDS_DateEnd:=ResultText; if (length(UDS_DateEnd) > 5) then begin gui.ShowMessage('Внимание, лицензия заканчивается'+ #13#10 +UDS_DateEnd); end //добавляем свойство, что проверка совершена Props := TVisitOrderInfo.Create(); Props.CustomProps.Values[UDS_TRANSACTION_GUID] := UDS_Transaction; RKCheck.UpdateOrderProps(Props); ValidResult:= True; end else begin if (length(ResultText) = 0) then begin ResultText := 'UDS_CASH_CONTROL: '; end gui.ShowMessage('Ошибка, удалите и пересчитайте UDS.'+ #13#10 +ResursName+#13#10+Details+#13#10+'Station: '+Cash_name+#13#10+'ID: '+Company_ID+#13#10+ResultText); ValidResult:= False; end end // UDS_Cheked <> '1' end // UDS_present end //Operation = rkoCloseReceipt end;