Merhaba, kişisel hobi amaçlı bir projemde kullandığım trendyol yemek entegrasyonu kütüphanemi sizler ile paylaşmak istedim. İhtiyaç duyan arkadaşlar kullanabilirler. Json parse işlemlerinde 3.parti bileşeni olarak açık kaynak olan superobject'den faydalandım. Github da bulunmaktadır. 10.4 ile yazılmıştır. Http bileşeni olarak modern RestRequest bileşenleri kullanılmıştır. SSL dll gerektirmez.
Örnek Kullanım :
Kütüphane
Örnek Kullanım :
var
TestTrendyolYemek : TTrendyolYemek;
xTestStr : String;
begin
TestTrendyolYemek := TTrendyolYemek.Create(nil);
try
TestTrendyolYemek.SaticiId := '';
TestTrendyolYemek.ApiKey := '';
TestTrendyolYemek.ApiSecretKey := '';
TestTrendyolYemek.TestMode := True;
xTestStr := TestTrendyolYemek.TestEt;
if xTestStr = 'OK' then
ShowMessage('Test başarılı.')
else
ShowMessage('Test başarısız.' + sLineBreak + xTestStr);
finally
FreeAndNil(TestTrendyolYemek);
end;
end;
Kütüphane
unit uTrendyolYemekLib;
{-----------------------------------------------------------------------------
Yola çıktı ve teslim edildi sadece restoran kuryesi ise gönderilmelidir.
Ödeme tipi yok hepsi online
-----------------------------------------------------------------------------}
interface
uses SysUtils, Classes, REST.Types, REST.Client, Data.Bind.Components, Data.Bind.ObjectScope, Soap.XSBuiltIns, REST.Authenticator.Basic;
type TTrendyolLogProc = procedure (const FormHandle:Cardinal;ADir,AStr:String;AMemoAdd:Boolean);
// Yeni, Onaylandı, Hazırlandı, Teslim edildi, Restoran iptal, Müşteri iptal, İşlem hatası
type TTrendyolOrderStatus = (StsCreated,StsPicking,StsInvoiced,StsDelivered,StsUnSupplied,StsCancelled,StsError);
// Normal onay, Hazırlandı, Sadece restoran kuryeleri Yola çıktı, Sadece restoran kuryeleri Normal teslim, Restoran iptal
type TTrendyolNextStatus=(NxtVerify,NxtPrepare,NxtShipped,NxtDeliver,NxtRestCancel);
type
TTrendyolRestaurantInfo = record
id : String; // Restoran id
status : Boolean; // Restoran açık mı
name : String; // Restoran adı
email : String; // Restoran mail
run : Boolean; // Çalıştı mı
end;
type
TTrendyolRestaurantList = record
id : String; // Restoran id
status : Boolean; // Restoran açık mı
name : String; // Restoran adı
email : String; // Restoran mail
end;
type TTrendyolRestaurantListArray = Array of TTrendyolRestaurantList;
type
TTrendyolOrderCancel = record
id : String; // iptal id
cancelMessage : String; // iptal mesaj
end;
type TTrendyolOrderCancels = Array of TTrendyolOrderCancel;
type
TTrendyolPaymentList = record
name : String; // ödeme adı
paymenttype : Integer; // ödeme id
end;
type TTrendyolPaymentLists = Array of TTrendyolPaymentList;
type
TOrderProductDisplayOption = record
optionNameDisplay : String; // Ürün opsiyon açıklaması
options : Array of TOrderProductDisplayOption;
end;
type TOrderProductDisplayOptions = Array of TOrderProductDisplayOption;
type
TOrderProductDisplay = record
productId : String; // Ürün id
count : Double; // Miktar
price : Double; // Opsiyonsuz fiyat
optionPrice : Double; // Opsiyonlar fiyat
priceWithOption : Double; // Opsiyon dahil fiyat
totalPrice : Double; // Toplam opsiyonsuz fiyat
totalOptionPrice : Double; // Toplam opsiyonlar fiyat
totalPriceWithOption : Double; // Toplam opsiyonlar dahil fiyat
nameDisplay : String; // Ürün adı
options : TOrderProductDisplayOptions; // Ürün opsiyonlar
end;
type TOrderProductsDisplays = Array of TOrderProductDisplay;
type
TTrendyolOrder = record
id : String; // Sipariş id
orderCode : String; // Sipariş kodu
storeId : Integer; // Trendyol restoran id
deliveryType : Integer; // 0 Restoran getirsin 1 Trendyol getirsin
packageCreationDate : TDateTime; // Sipariş tarihi
totalPrice : Extended; // Sipariş tutarı
customerId : String; // Müşteri Id
customerName : String; // Müşteri adı
address : String; // adres
addressDescription : String; // adres açıklaması
phoneNumber : String; // Telefon
clientLatitude : Double; // Müşteri adres enlem
clientLongitude : Double; // Müşteri adres boylam
paymentMethod : Integer; // Ödeme numarası
paymentMethodText : String; // Ödeme açıklaması
customerNote : String; // Müşteri notu
productsDisplays : TOrderProductsDisplays; // Ürünler
end;
type TTrendyolOrders = Array of TTrendyolOrder;
type
TTrendyolYemek = class(TComponent)
private
FMainurl: String;
FTestMode: Boolean;
FSaticiId: String;
FApiKey: String;
FApiSecretKey: String;
FLogFormHandle: Cardinal;
FLogRestoranAdi: String;
FLogModule: String;
FRestaurantId: String;
FEMail: String;
procedure setTestMode(const Value: Boolean);
procedure LogAdd(const AModule,AValue:String);
function TrendyolRequest(const AUrl,ARequestType,ABody:String;AHeaderName,AHeaderValue:Array of String):String;
function UserInfoNull:Boolean;
function RestaurantInfoNull:Boolean;
function TrendyolUnixDateTimeToDateTime(const AUnixTime:Int64):TDateTime;
function TrendyolDateTimeToUnixDateTime(const ADateTime:TDateTime):Int64;
public
FLogProc:TTrendyolLogProc;
constructor Create(AOwner: TComponent); override;
function TestEt:String;
function GetRestaurantList:TTrendyolRestaurantListArray;
function GetRestaurantStatus: TTrendyolRestaurantInfo;
function SetRestaurantStatus(const AEnable:Boolean):Boolean;
function GetOrderCancelList:TTrendyolOrderCancels;
function GetOrderCancelItemList(const AOrderId:String):String;
function GetOrders(const ANewOrder:Boolean;var AJsonStr:String):TTrendyolOrders;
function GetOrderStatus(const AOrderId:String):TTrendyolOrderStatus;
function SetOrderStatus(const AOrderId:String;const AType:TTrendyolNextStatus;const ACancelId:String):Boolean;
function GetPaymentList:TTrendyolPaymentLists;
published
property TestMode:Boolean read FTestMode write setTestMode;
property SaticiId:String read FSaticiId write FSaticiId;
property ApiKey:String read FApiKey write FApiKey;
property ApiSecretKey:String read FApiSecretKey write FApiSecretKey;
property RestaurantId:String read FRestaurantId write FRestaurantId;
property EMail:String read FEMail write FEMail;
property LogFormHandle:Cardinal read FLogFormHandle write FLogFormHandle;
property LogModule:String read FLogModule write FLogModule;
property LogRestoranAdi:String read FLogRestoranAdi write FLogRestoranAdi;
end;
implementation
uses DateUtils, StrUtils, superobject;
{ TTrendyolYemek }
constructor TTrendyolYemek.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
TestMode := False;
FLogFormHandle := 0;
end;
function TTrendyolYemek.GetOrderCancelItemList(const AOrderId: String): String;
var
Ind,Ind2 : Integer;
xSO : ISuperObject;
xSAProducts,xArrItems : TSuperArray;
xGetJson : String;
xUrl,xBody : String;
begin
Result := '';
try
if UserInfoNull then
Exit;
if RestaurantInfoNull then
Exit;
xUrl := '/suppliers/' + SaticiId + '/packages/' + AOrderId + '?storeId=' + RestaurantId;
xBody := '';
xGetJson := TrendyolRequest(xUrl,'GET',xBody,['x-agentname','x-executor-user'],['uygulamaadi',EMail]);
if Copy(xGetJson,1,2) = 'OK' then
begin
xGetJson := Copy(xGetJson,4,MaxInt);
xSO := SO(xGetJson);
if xSO <> nil then
begin
xSAProducts := xSO.A['lines'];
if xSAProducts <> nil then
begin
for Ind := 0 to Pred(xSAProducts.Length) do
begin
xArrItems := xSAProducts[Ind].A['items'];
if xArrItems <> nil then
begin
for Ind2 := 0 to Pred(xArrItems.Length) do
begin
if Result = '' then
Result := '"' + xArrItems[Ind2].S['packageItemId'] + '"'
else
Result := Result + ',"' + xArrItems[Ind2].S['packageItemId'] + '"';
end;
end;
end;
end;
end
else
LogAdd('TrendyolApiError',Format('Process:GetOrderCancelItemList JsonParseError:%s',[xGetJson]));
end
else
LogAdd('TrendyolApiError',Format('Process:GetOrderCancelItemList Json:%s',[xGetJson]));
except
on e:Exception do
begin
LogAdd('TrendyolApiError',Format('Process:GetOrderCancelItemList Message:%s Json:%s',[e.Message,xGetJson]));
end;
end;
end;
function TTrendyolYemek.GetOrderCancelList: TTrendyolOrderCancels;
begin
SetLength(Result,4);
Result[0].id := '621';
Result[0].cancelMessage := 'Tedarik problemi';
Result[1].id := '622';
Result[1].cancelMessage := 'Mağaza kapalı';
Result[2].id := '623';
Result[2].cancelMessage := 'Mağaza siparişi hazırlayamıyor';
Result[3].id := '623';
Result[3].cancelMessage := 'Yüksek yoğunluk / Kurye yok';
end;
function TTrendyolYemek.GetOrders(const ANewOrder: Boolean; var AJsonStr: String): TTrendyolOrders;
var
Ind, Ind2,Ind3,Ind4 : Integer;
xSO,xSOArrObj : ISuperObject;
xSA,xSAProducts : TSuperArray;
xArrModifier,xArrExtra,xArrRemove : TSuperArray;
xArrModifier2,xArrExtra2,xArrRemove2 : TSuperArray;
xGetJson : String;
xUrl,xBody : String;
xHigh,xHigh2 : Integer;
begin
SetLength(Result,0);
try
if UserInfoNull then
Exit;
if RestaurantInfoNull then
Exit;
if ANewOrder then
begin
xUrl := '/suppliers/' + SaticiId + '/packages';
xUrl := xUrl + '?storeId=' + RestaurantId + '&packageStatuses=Created';
xBody := '';
end
else
begin
// Son 1 saat iptaller
xUrl := '/suppliers/' + SaticiId + '/packages';
xUrl := xUrl + '?storeId=' + RestaurantId + '&packageStatuses=Returned&packageStatuses=Cancelled';
xUrl := xUrl + '&packageModificationStartDate=' + IntToStr(TrendyolDateTimeToUnixDateTime(IncHour(Now,-1)));
xUrl := xUrl + '&packageModificationEndDate=' + IntToStr(TrendyolDateTimeToUnixDateTime(Now));
xBody := '';
end;
xGetJson := TrendyolRequest(xUrl,'GET',xBody,['x-agentname','x-executor-user'],['uygulamaadi',EMail]);
AJsonStr := xGetJson;
if Copy(xGetJson,1,2) = 'OK' then
begin
xGetJson := Copy(xGetJson,4,MaxInt);
xSO := SO(xGetJson);
if xSO <> nil then
begin
xSA := xSO.A['content'];
if xSA <> nil then
begin
SetLength(Result,xSA.Length);
for Ind := 0 to Pred(xSA.Length) do
begin
with Result[Ind] do
begin
xSOArrObj := xSA.O[Ind];
{$REGION 'Üst Bilgi'}
id := xSOArrObj.S['id'];
orderCode := xSOArrObj.S['orderCode'];
storeId := xSOArrObj.I['storeId'];
if xSOArrObj.S['deliveryType'] = 'STORE' then
deliveryType := 0
else
deliveryType := 1;
totalPrice := xSOArrObj.D['totalPrice'];
if xSOArrObj.O['customer'] <> nil then
begin
customerId := xSOArrObj.O['customer'].S['id'];
customerName := Trim(xSOArrObj.O['customer'].S['firstName'] + ' ' + xSOArrObj.O['customer'].S['lastName']);
end
else
begin
customerId := '';
customerName := '';
end;
if xSOArrObj.O['address'] <> nil then
begin
if xSOArrObj.O['address'].S['neighborhood'] <> '' then
address := 'Semt:' + xSOArrObj.O['address'].S['neighborhood'];
address := address + ' ' + xSOArrObj.O['address'].S['address1'];
if xSOArrObj.O['address'].S['apartmentNumber'] <> '' then
address := address + ' Apt:' + xSOArrObj.O['address'].S['apartmentNumber'];
if xSOArrObj.O['address'].S['floor'] <> '' then
address := address + ' Kat:' + xSOArrObj.O['address'].S['floor'];
if xSOArrObj.O['address'].S['doorNumber'] <> '' then
address := address + ' Kapı:' + xSOArrObj.O['address'].S['doorNumber'];
if xSOArrObj.O['address'].S['company'] <> '' then
address := address + ' Firma:' + xSOArrObj.O['address'].S['company'];
if xSOArrObj.O['address'].S['city'] <> '' then
begin
address := address + ' ' + xSOArrObj.O['address'].S['city'];
if xSOArrObj.O['address'].S['district'] <> '' then
address := address + ' / ' + xSOArrObj.O['address'].S['district'];
end;
addressDescription := xSOArrObj.O['address'].S['addressDescription'];
phoneNumber := xSOArrObj.O['address'].S['phone'];
clientLatitude := StrToFloatDef(xSOArrObj.O['address'].S['latitude'],0);
clientLongitude := StrToFloatDef(xSOArrObj.O['address'].S['longitude'],0);
end
else
begin
clientLatitude := 0;
clientLongitude := 0;
end;
paymentMethod := 1;
paymentMethodText := 'Online Ödeme';
customerNote := xSOArrObj.S['customerNote'];
packageCreationDate := TrendyolUnixDateTimeToDateTime(StrToInt64Def(xSOArrObj.S['packageCreationDate'],0));
{$ENDREGION}
{$REGION 'Products'}
xSAProducts := xSOArrObj.A['lines'];
if xSAProducts <> nil then
begin
SetLength(Result[Ind].productsDisplays,xSAProducts.Length);
for Ind2 := 0 to Pred(xSAProducts.Length) do
begin
with Result[Ind].productsDisplays[Ind2] do
begin
productId := xSAProducts[Ind2].S['productId'];
count := xSAProducts[Ind2].A['items'].Length;
price := xSAProducts[Ind2].D['price'];
optionPrice := xSAProducts[Ind2].D['unitSellingPrice'] - xSAProducts[Ind2].D['price'];
priceWithOption := xSAProducts[Ind2].D['unitSellingPrice'];
totalPrice := price * count;
totalOptionPrice := optionPrice * count;
totalPriceWithOption := priceWithOption * count;
nameDisplay := xSAProducts[Ind2].S['name'];
{$REGION 'Extra'}
xArrExtra := xSAProducts[Ind2].A['extraIngredients']; // Extralar
for Ind3 := 0 to Pred(xArrExtra.Length) do
begin
SetLength(options,Succ(Length(options)));
options[Pred(Length(options))].optionNameDisplay := xArrExtra[Ind3].S['name'];
end;
{$ENDREGION}
{$REGION 'İstemiyorum'}
xArrRemove := xSAProducts[Ind2].A['removedIngredients']; // İstemiyorum
for Ind3 := 0 to Pred(xArrRemove.Length) do
begin
SetLength(options,Succ(Length(options)));
options[Pred(Length(options))].optionNameDisplay := xArrRemove[Ind3].S['name'] + '(Çıkarılan)';
end;
{$ENDREGION}
{$REGION 'Alt Ürün'}
xArrModifier := xSAProducts[Ind2].A['modifierProducts']; // Ürün
for Ind3 := 0 to Pred(xArrModifier.Length) do
begin
SetLength(options,Succ(Length(options)));
xHigh := Pred(Length(options));
options[xHigh].optionNameDisplay := xArrModifier[Ind3].S['name'];
{$REGION 'Alt Ürün Extra'}
xArrExtra2 := xArrModifier[Ind3].A['extraIngredients']; // Extralar 2
for Ind4 := 0 to Pred(xArrExtra2.Length) do
begin
SetLength(options[xHigh].options,Succ(Length(options[xHigh].options)));
xHigh2 := Pred(Length(options[xHigh].options));
options[xHigh].options[xHigh2].optionNameDisplay := xArrExtra2[Ind4].S['name'];
end;
{$ENDREGION}
{$REGION 'Alt Ürün İstemiyorum'}
xArrRemove2 := xArrModifier[Ind3].A['removedIngredients']; // İstemiyorum 2
for Ind4 := 0 to Pred(xArrRemove2.Length) do
begin
SetLength(options[xHigh].options,Succ(Length(options[xHigh].options)));
xHigh2 := Pred(Length(options[xHigh].options));
options[xHigh].options[xHigh2].optionNameDisplay := xArrRemove2[Ind4].S['name'] + '(Çıkarılan)';
end;
{$ENDREGION}
{$REGION 'Alt Ürün Alt Ürün'}
xArrModifier2 := xArrModifier[Ind3].A['modifierProducts']; // Ürün 2
for Ind4 := 0 to Pred(xArrModifier2.Length) do
begin
SetLength(options[xHigh].options,Succ(Length(options[xHigh].options)));
xHigh2 := Pred(Length(options[xHigh].options));
options[xHigh].options[xHigh2].optionNameDisplay := xArrModifier2[Ind4].S['name'];
end;
{$ENDREGION}
end;
{$ENDREGION}
end;
end;
end;
{$ENDREGION}
end;
end;
end;
end
else
LogAdd('TrendyolApiError',Format('Process:GetOrders JsonParseError:%s',[xGetJson]));
end
else
LogAdd('TrendyolApiError',Format('Process:GetOrders Json:%s',[xGetJson]));
except
on e:Exception do
begin
LogAdd('TrendyolApiError',Format('Process:GetOrders Message:%s Json:%s',[e.Message,xGetJson]));
end;
end;
end;
function TTrendyolYemek.GetOrderStatus(const AOrderId: String): TTrendyolOrderStatus;
var
xSO : ISuperObject;
xGetJson : String;
xUrl,xBody : String;
begin
Result := StsError;
try
if UserInfoNull then
Exit;
if RestaurantInfoNull then
Exit;
xUrl := '/suppliers/' + SaticiId + '/packages/' + AOrderId + '?storeId=' + RestaurantId;
xBody := '';
xGetJson := TrendyolRequest(xUrl,'GET',xBody,['x-agentname','x-executor-user'],['uygulamaadi',EMail]);
if Copy(xGetJson,1,2) = 'OK' then
begin
xGetJson := Copy(xGetJson,4,MaxInt);
xSO := SO(xGetJson);
if xSO <> nil then
begin
if xSO.S['packageStatus'] = 'Created' then
Result := StsCreated
else if xSO.S['packageStatus'] = 'Picking' then
Result := StsPicking
else if xSO.S['packageStatus'] = 'Invoiced' then
Result := StsInvoiced
else if xSO.S['packageStatus'] = 'Shipped' then
Result := StsInvoiced
else if xSO.S['packageStatus'] = 'Delivered' then
Result := StsDelivered
else if xSO.S['packageStatus'] = 'Returned' then
Result := StsCancelled
else if xSO.S['packageStatus'] = 'Cancelled' then
Result := StsCancelled
else if xSO.S['packageStatus'] = 'UnSupplied' then
Result := StsUnSupplied;
end
else
LogAdd('TrendyolApiError',Format('Process:GetOrderStatus JsonParseError:%s',[xGetJson]));
end
else
LogAdd('TrendyolApiError',Format('Process:GetOrderStatus Json:%s',[xGetJson]));
except
on e:Exception do
begin
LogAdd('TrendyolApiError',Format('Process:GetOrderStatus Message:%s Json:%s',[e.Message,xGetJson]));
end;
end;
end;
function TTrendyolYemek.GetPaymentList: TTrendyolPaymentLists;
begin
SetLength(Result,1);
Result[0].paymenttype := 1;
Result[0].name := 'Online Ödeme';
end;
function TTrendyolYemek.GetRestaurantList: TTrendyolRestaurantListArray;
var
Ind : Integer;
xSO : ISuperObject;
xSA : TSuperArray;
xGetJson : String;
begin
SetLength(Result,0);
try
if UserInfoNull then
Exit;
xGetJson := TrendyolRequest('/suppliers/' + SaticiId + '/restaurants','GET','',[],[]);
if Copy(xGetJson,1,2) = 'OK' then
begin
xGetJson := Copy(xGetJson,4,MaxInt);
xSO := SO(xGetJson);
if xSO <> nil then
begin
xSA := xSO.A['restaurants'];
SetLength(Result,xSA.Length);
for Ind := 0 to Pred(xSA.Length) do
begin
with Result[Ind] do
begin
id := xSA[Ind].S['id'];
name := xSA[Ind].S['name'];
status := xSA[Ind].S['workingStatus'] = 'OPEN';
email := xSA[Ind].S['email'];
end;
end;
end
else
LogAdd('TrendyolApiError',Format('Process:GetRestaurantList JsonParseError:%s',[xGetJson]));
end
else
LogAdd('TrendyolApiError',Format('Process:GetRestaurantList Json:%s',[xGetJson]));
except
on e:Exception do
begin
LogAdd('TrendyolApiError',Format('Process:GetRestaurantList Message:%s Json:%s',[e.Message,xGetJson]));
end;
end;
end;
function TTrendyolYemek.GetRestaurantStatus: TTrendyolRestaurantInfo;
var
Ind : Integer;
xTrendyolRestaurantListArray : TTrendyolRestaurantListArray;
begin
Result.run := False;
try
if UserInfoNull then
Exit;
if RestaurantInfoNull then
Exit;
xTrendyolRestaurantListArray := GetRestaurantList;
Result.run := True;
for Ind := Low(xTrendyolRestaurantListArray) to High(xTrendyolRestaurantListArray) do
begin
if RestaurantId = xTrendyolRestaurantListArray[Ind].id then
begin
Result.id := xTrendyolRestaurantListArray[Ind].id;
Result.name := xTrendyolRestaurantListArray[Ind].name;
Result.status := xTrendyolRestaurantListArray[Ind].status;
Result.email := xTrendyolRestaurantListArray[Ind].email;
Break;
end;
end;
except
on e:Exception do
begin
LogAdd('TrendyolApiError',Format('Process:GetRestaurantStatus Message:%s',[e.Message]));
end;
end;
end;
procedure TTrendyolYemek.LogAdd(const AModule, AValue: String);
begin
if (FLogFormHandle > 0) and Assigned(FLogProc) then
begin
FLogProc(FLogFormHandle,FLogModule + '\' + AModule,FLogRestoranAdi + ' ' + AValue,True);
end;
end;
function TTrendyolYemek.RestaurantInfoNull: Boolean;
begin
Result := RestaurantId.Trim.Equals('') or EMail.Trim.Equals('');
end;
function TTrendyolYemek.SetOrderStatus(const AOrderId: String; const AType: TTrendyolNextStatus; const ACancelId: String): Boolean;
var
xSO : ISuperObject;
xGetJson : String;
xBody : String;
xUrl : String;
begin
Result := False;
try
if UserInfoNull then
Exit;
xBody := '';
case AType of
NxtVerify:
begin
xUrl := '/suppliers/' + SaticiId + '/packages/picked';
xBody := '{"packageId":"' + AOrderId + '","preparationTime":30}';
end;
NxtPrepare:
begin
xUrl := '/suppliers/' + SaticiId + '/packages/invoiced';
xBody := '{"packageId":"' + AOrderId + '"}';
end;
NxtShipped:
begin
xUrl := '/suppliers/' + SaticiId + '/packages/' + AOrderId + '/manual-shipped';
xBody := '{}';
end;
NxtDeliver:
begin
xUrl := '/suppliers/' + SaticiId + '/packages/' + AOrderId + '/manual-delivered';
xBody := '{}';
end;
NxtRestCancel:
begin
xUrl := '/suppliers/' + SaticiId + '/packages/unsupplied';
xBody := '{"packageId":"' + AOrderId + '","itemIdList":[' + GetOrderCancelItemList(AOrderId) + '],"reasonId":' + ACancelId + '}'
end;
end;
xGetJson := TrendyolRequest(xUrl,'PUT',xBody,['x-agentname','x-executor-user'],['uygulamaadi',EMail]);
if Copy(xGetJson,1,2) = 'OK' then
begin
xGetJson := Copy(xGetJson,4,MaxInt);
xSO := SO(xGetJson);
if xSO <> nil then
begin
Result := xGetJson.Trim = '';
end
else
LogAdd('TrendyolApiError',Format('Process:SetOrderStatus JsonParseError:%s',[xGetJson]));
end
else
LogAdd('TrendyolApiError',Format('Process:SetOrderStatus Json:%s',[xGetJson]));
except
on e:Exception do
begin
LogAdd('TrendyolApiError',Format('Process:SetOrderStatus Message:%s Json:%s',[e.Message,xGetJson]));
end;
end;
end;
function TTrendyolYemek.SetRestaurantStatus(const AEnable: Boolean): Boolean;
var
xSO : ISuperObject;
xGetJson : String;
xBody : String;
begin
Result := False;
try
if UserInfoNull then
Exit;
if RestaurantInfoNull then
Exit;
xBody := '';
if AEnable then
xBody := '{"status":"OPEN"}'
else
xBody := '{"status":"CLOSED"}';
xGetJson := TrendyolRequest('/suppliers/' + SaticiId + '/restaurants/' + RestaurantId + '/status','PUT',xBody,[],[]);
if Copy(xGetJson,1,2) = 'OK' then
begin
xGetJson := Copy(xGetJson,4,MaxInt);
xSO := SO(xGetJson);
if xSO <> nil then
begin
Result := xGetJson.Trim = '';
end
else
LogAdd('TrendyolApiError',Format('Process:SetRestaurantStatus JsonParseError:%s',[xGetJson]));
end
else
LogAdd('TrendyolApiError',Format('Process:SetRestaurantStatus Json:%s',[xGetJson]));
except
on e:Exception do
begin
LogAdd('TrendyolApiError',Format('Process:SetRestaurantStatus Message:%s Json:%s',[e.Message,xGetJson]));
end;
end;
end;
procedure TTrendyolYemek.setTestMode(const Value: Boolean);
begin
FTestMode := Value;
if FTestMode then
FMainurl := 'https://stageapi.trendyol.com/mealgw'
else
FMainurl := 'https://api.trendyol.com/mealgw';
end;
function TTrendyolYemek.TestEt: String;
var
xSO : ISuperObject;
xGetJson : String;
begin
try
xGetJson := TrendyolRequest('/suppliers/' + SaticiId + '/restaurants','GET','',[],[]);
if Copy(xGetJson,1,2) = 'OK' then
begin
xGetJson := Copy(xGetJson,4,MaxInt);
xSO := SO(xGetJson);
if xSO <> nil then
Result := 'OK'
else
Result := Format('Process:GetRestaurantList JsonParseError:%s',[xGetJson]);
end
else
Result := Format('Process:GetRestaurantList Json:%s',[xGetJson]);
except
on e:Exception do
begin
Result := Format('Process:GetRestaurantList Message:%s Json:%s',[e.Message,xGetJson]);
end;
end;
end;
function TTrendyolYemek.TrendyolRequest(const AUrl, ARequestType, ABody: String; AHeaderName, AHeaderValue: array of String): String;
var
Ind : Integer;
xRESTClient: TRESTClient;
xRESTRequest: TRESTRequest;
xRESTResponse: TRESTResponse;
xBasicAuthenticator : THTTPBasicAuthenticator;
begin
Result := '';
try
xRESTClient := TRESTClient.Create(nil);
xRESTResponse := TRESTResponse.Create(nil);
xRESTRequest := TRESTRequest.Create(nil);
xBasicAuthenticator := THTTPBasicAuthenticator.Create(ApiKey,ApiSecretKey);
try
with xRESTClient do
begin
BaseURL := FMainurl + AUrl;
ConnectTimeout := 10000;
ReadTimeout := 30000;
Authenticator := xBasicAuthenticator;
end;
with xRESTRequest do
begin
AssignedValues := [TAssignedValue.rvConnectTimeout, TAssignedValue.rvReadTimeout];
Client := xRESTClient;
Response := xRESTResponse;
ConnectTimeout := 10000;
ReadTimeout := 30000;
if ARequestType = 'POST' then
begin
Method := rmPOST;
if ABody.Trim <> '' then
Params.AddItem('BodyPost',ABody, TRESTRequestParameterKind.pkREQUESTBODY, [], TRESTContentType.ctAPPLICATION_JSON);
end
else if ARequestType = 'PUT' then
begin
Method := rmPUT;
if ABody.Trim <> '' then
Params.AddItem('BodyPost',ABody, TRESTRequestParameterKind.pkREQUESTBODY, [], TRESTContentType.ctAPPLICATION_JSON);
end
else if ARequestType = 'GET' then
Method := rmGET;
for Ind := Low(AHeaderName) to High(AHeaderName) do
Params.AddHeader(AHeaderName[Ind],AHeaderValue[Ind]);
end;
xRESTRequest.Execute;
if xRESTResponse.StatusCode = 200 then
Result := 'OK=' + xRESTResponse.Content
else
Result := 'ERROR=' + Format('Process:TrendyolRequest Url:%s, Method:%s, Status:%d, Content:%s',[AUrl,ARequestType,xRESTResponse.StatusCode,xRESTResponse.Content]);
finally
FreeAndNil(xBasicAuthenticator);
FreeAndNil(xRESTRequest);
FreeAndNil(xRESTResponse);
FreeAndNil(xRESTClient);
end;
except
on e:Exception do
begin
Result := 'ERROR=' + Format('Process:TrendyolRequest Url:%s, Method:%s, Message:%s',[AUrl,ARequestType,e.Message]);
end;
end;
end;
function TTrendyolYemek.TrendyolUnixDateTimeToDateTime(const AUnixTime: Int64): TDateTime;
var
xNotMillisecond : Integer;
begin
try
xNotMillisecond := Round(AUnixTime/1000); // Milisaniye temizlenir
Result := UnixToDateTime(xNotMillisecond);
Result := TTimeZone.Local.ToLocalTime(Result); // Unix to GMT+3
except
Result := 0;
end;
end;
function TTrendyolYemek.TrendyolDateTimeToUnixDateTime(const ADateTime: TDateTime): Int64;
var
xUnixDateTime : TDateTime;
begin
try
xUnixDateTime := TTimeZone.Local.ToUniversalTime(ADateTime); // GMT+3 to Unix
Result := DateTimeToUnix(xUnixDateTime) * 1000;
except
Result := 0;
end;
end;
function TTrendyolYemek.UserInfoNull: Boolean;
begin
Result := ApiKey.Trim.Equals('') or ApiSecretKey.Trim.Equals('') or SaticiId.Trim.Equals('');
end;
end.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..

