
Tue Aug 04 2026

Merhaba, arkadaşım! 👋 Hazırsan başlayalım.
Bir dakika, sen de SAP geliştiricilerinin her sabah GUI scripting ile o tekrar eden tıklama devrinin içine girdiğini biliyor musun? 🛠 Saatlerce ekranlar arasında sırayla dolaşıp, hata almadan çalışması için sabırsızlanmak gerçekten yıkıcı olabiliyor. İşte tam da bu noktada, SAP otomasyonu dünyamızın bir kurtarıcısı çıkıyor: ADT REST servisleri ve yapay zeka destekli otomasyon.
Peki bu yeni yaklaşım ne diyor bize? 🔁
Nasıl çalışıyor? Hadi pratik bir örnekle görelim:
import requests
# SAP ADT REST servisine bağlanma
response = requests.get(
"https://sap-api.example.com/bapi/...",
headers={"Authorization": "Bearer token"}
)
print(response.json())
Bu sayede ne oluyor? ❗️ Artık kodu çalıştırdığında, sistem manuel müdahale olmadan SAP'a ulaşıyor ve veriyi alıyor. Manuel tıklama yok, hata riski azalıyor, SAP otomasyonu gerçekten işe yarıyor! ✅
Eğer SAP geliştiricisiysen ve GUI scripting ile kavga etmekten bıktıysan, bu yazı tam da sana lazım. 🎯 İlerleyen bölümlerde ADT REST servislerini ve yapay zekayı nasıl birleştireceğimizi derinlemesine anlatacağım. Hazırsan, gelelim!
Hay, biliyorum. Sabahın ilk işin olarak SAP'te bir rapor tetiklemek için o eski GUI scriptine tekrar başvurmak. O scriptin sorunsuz çalıştığı günleri hatırlıyor musun? Şimdi biraz zorlanıyor, değil mi? 🎯
İşte SAP geliştiricilerinin günlük hayatta karşılaştığı başlıca sıkıntılar:
btn_pay iken, bir gün sonra btn_confirm oluyor. Script hemen çöküyor. ❗️Record & Playback haritaları gibi. Kimse bu kodu uzun sürede anlayamıyor. Okumak bir cefa. 📖Hadi biraz daha derinlemesine girelim... Tüm bu sıkıntılar aslında bizi bir noktaya getiriyor: Uçtan uca otomasyon kavramına. Peki bu tam olarak ne oluyor burada? Nasıl bir çıkış yolu var sence?
Hazırsan başlayalım! ADT, yani SAP Development Tools üzerinden SAP sistemlerine RESTful API ile nasıl bağlandığını merak ediyorsan, buradasın. 🎯 ADT REST servisleri, SAP ABAP nesnelerine (program, tabelar, vs.) HTTP protokolü üzerinden erişmenin modern yoludur.
Peki bu eski GUI scripting'e kıyasla ne farkı var? ❗️ Çok büyük fark var. Bir tıklamayla açtığın ekranları otomatize etmek yerine, doğrudan SAP'in içine yapılandırılabilir istekler atıyoruz. İşte neden bu kadar önemli:
Hadi pratik bir örnek üzerinden anlayalım. Ne oluyor burada? 🛠
curl -X GET -H "Authorization: Bearer <token>" https://<adt-host>/sap/bc/adt/abap/programs/root/Z_MY_PROGRAM
Bu curl komutu ne yapıyor? 🔁
Authorization: Bearer <token> ile SAP sistemine kimlik doğrulaması yapıyoruz.<adt-host> adresine gidip Z_MY_PROGRAM adlı ABAP programını istiyoruz.Bu sayede ne oluyor? SAP sistemine GUI'den bağlanıp tıklamak yerine, komut satırından veya bir otomasyon script'inden doğrudan program kodunu alıyoruz. ⛔ Manuel hatalar ve yavaşlıklar artık geride kalıyor.
Özetle, ADT REST servisleri SAP'a modern ve hızlı bir şekilde erişmeni sağlıyor. İleriki bölümlerde bu endpoint'leri nasıl daha detaylı kullanacağımızı göreceğiz. 🚀
Hazırsan başlayalım. Yapay zeka SAP otomasyonunda artık bir trend kelime değil, gerçekten işe yarayan bir ekip arkadaşı. Aklına gelen her şeyi açalım.
🔁 Nerede devreye giriyor?
Peki bu yapay zeka ADT REST servisleriyle nasıl entegre oluyor? Adım adım göstereyim.
Hadi pratik bir örnek üzerinden anlayalım. ADT REST'ten aldığın bir ABAP kod parçasını, OpenAI'ye göndererek refactor önerisi isteyen bir Python snippet'a bak:
import requests
abap_code_from_adt = """
DATA lv_text TYPE string.
lv_text = 'Merhaba'.
"""
payload = {
"model": "gpt-4",
"messages": [
{"role": "system", "content": "Sen ABAP uzmanısın. Bu kodu optimize et ve refactor önerisi ver."},
{"role": "user", "content": abap_code_from_adt}
]
}
response = requests.post(
"https://api.openai.com/v1/chat/completions",
json=payload,
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
Bu sayede ne oluyor? ADT REST'ten aldığınız ham ABAP kodunu doğrudan yapay zekaya yollıyor ve "bu kodu düzelt" diyorsunuz. Yapay zeka size daha temiz, daha sürdürülebilir bir versiyonunu döndürüyor.
Nasıl çalışıyor? ADT REST servisi size kodu veriyor, Python requests.post ile bu kodu LLM'a aktarıyor, LLM size cevap veriyor. Böylece elinizdeki tekrarları bırakıp mantıksal işelere odaklanıyorsunuz.
Hazırsan başlayalım! Önce elindeki GUI scriptlerini bir listeye koymam lazım. 📋 Hangi adımlar tekrar ediyor, hangileri elle yapılıyor? Burada mutlaka bir tablo oluştur:
Şimdi de hangi adımların API üzerinden halledilebileceğini görsek iyi olur. 🔁 GUI'yi açıp tıklama yerine, doğrudan ADT REST endpoint'lerini çağırıp işlemi yapalım. ❗️ Dikkat et: Sadece yapısal ve tekrarlayan adımları seç. Karmaşık karar adımlarına şimdilik dokunma.
Hadi pratik bir örnek üzerinden anlayalım! 🤖 Yapay zekayı kod yazmak ve test etmek için kullanacağız. Nasıl çalışıyor? İlk olarak AI'a ADT REST endpoint'ini tanımlayıp, ona göre kod parçasını üretletiriz. Sonra da o kodu otomatik test senaryolarıyla doğrularız.
Her şeyi bir anda değiştirmeyelim! 🧪 Küçük, risk düşük bir script ile başla. Bu pilot süreçte ne oluyor? Hız ve güven kazanacağız. Başarısız olursa çok az zarar veririz.
Pilot bittikten sonra ne olduğunu görmem lazım. 📈 Süre kısalıyor mu? Hata oranı düşüyor mu? Bu verileri alıp diğer scriptlere de uygulayalım.
Adım planlaması için basit bir checklist:
{"adim": 1, "aciklama": "Mevcut scriptleri tespit et", "durum": "yapildi"}
---
## 🛠 İlk ADT REST Çağrınızı Yapın: Pratik Bir Kurulum Rehberi
Hadi adım adım ilerleyelim. Bu bölümde **ADT REST servisine** nasıl bağlanacağınızı, **token** nasıl alacağınızı ve ilk **GET** isteğinizi nasıl göndereceğinizi göreceğiz.
---
### 1️⃣ Ön Hazırlık: ADT Kurulumu
ADT'yi (ABAP Development Tools) Eclipse üzerinden kullanıyorsunuz. İhtiyacınız olan şeyler:
- **Eclipse IDE** (ADT plugin ile birlikte)
- **SAP GUI** veya **SAP Logon** ile ABAP sisteminize erişim
- **Sertifika** (SSL bağlantısı için)
ADT'yi ilk kez kuruyorsanız, Eclipse Marketplace'den **"ABAP Development Tools"** eklentisini ekleyin. Kurulumdan sonra Eclipse'i açın ve **ABAP Perspective**'e geçin.
---
### 2️⃣ Sertifika Yapılandırması 🔐
ADT ile REST çağrısı yaparken SSL sertifikası kritik. Adımlar şöyle:
- **SAP Logon**'daki sistem bağlantınızı açın
- Sistem özelliklerine girin → **"Sertifika"** sekmesine gidin
- **SSL sertifikasını** export edin (`.p12` veya `.cer` formatında)
- Bu sertifikayı projenize aşağıdaki gibi ekleyin:
proje_kökü/ ├── config/ │ └── sertifika.p12 ├── src/ │ └── main.py └── requirements.txt
- `sertifika.p12` dosyasını `config/` klasörüne koyun. Bu dosya token alma sırasında SSL doğrulaması için kullanılacak.
**❗️ Dikkat:** Eğer sertifika yoksa, ADT REST servisi size `SSL handshake failed` hatası verecektir.
---
### 3️⃣ Token Alma: Kimlik Doğrulaması 🔁
ADT REST servisi **token-based authentication** kullanır. Yani her istek öncesinde bir token almanız ve header'a ekmeniz gerekiyor.
Token alma için kullanacağınız endpoint genelde şöyle bir formatta olur:
https://:/sap/bc/adt/oauth2/token
Burada **client_id** ve **client_secret** değerlerinizi ABAP sisteminde tanımlı servis kullanıcısı bilgileriyle birlikte gönderiyorsunuz.
---
### 4️⃣ İlk GET İsteği: ABAP Program Listesi Çekme 🎯
Token'ı aldıktan sonra artık istek göndermeye hazırız. Hadi bir Python script'i yazalım:
```python
import requests
import json
# --- Yapılandırma ---
ADT_HOST = "your-adt-host.example.com"
ADT_PORT = "443"
BASE_URL = f"https://{ADT_HOST}:{ADT_PORT}/sap/bc/adt"
CLIENT_ID = "your-client-id"
CLIENT_SECRET = "your-client-secret"
AUTH_URL = f"{BASE_URL}/oauth2/token"
PROGRAMS_URL = f"{BASE_URL}/abap/programs"
# --- Adım 1: Token Alma ---
print("🔑 Token alınıyor...")
auth_response = requests.post(
AUTH_URL,
data={"grant_type": "client_credentials"},
auth=(CLIENT_ID, CLIENT_SECRET),
verify="config/sertifika.p12", # SSL sertifikası yolu
headers={"Content-Type": "application/x-www-form-urlencoded"}
)
if auth_response.status_code != 200:
print(f"❌ Token alma başarısız! Status: {auth_response.status_code}")
print(auth_response.text)
exit(1)
token_data = auth_response.json()
access_token = token_data.get("access_token")
print("✅ Token başarıyla alındı!")
# --- Adım 2: ABAP Program Listesi Çekme ---
print("📋 ABAP program listesi çekiliyor...")
headers = {
"Authorization": f"Bearer {access_token}",
"Accept": "application/json"
}
programs_response = requests.get(
PROGRAMS_URL,
headers=headers,
verify="config/sertifika.p12",
params={"max_items": "50"}
)
if programs_response.status_code != 200:
print(f"❌ İstek başarısız! Status: {programs_response.status_code}")
print(programs_response.text)
exit(1)
programs = programs_response.json()
print(f"✅ {len(programs.get('programs', []))} program listelendi.")
print(json.dumps(programs, indent=2, ensure_ascii=False))
Nasıl çalışıyor?
POST ile token endpoint'ine istek atıyoruz. auth=(CLIENT_ID, CLIENT_SECRET) ile HTTP Basic Auth yapıyoruz.verify parametresinde sertifika dosyamızı gösteriyoruz — böylece SSL bağlantısı güvenli kapanıyor.Authorization: Bearer <token> header'ı ile GET isteği gönderiyoruz.json() metoduyla parse edip ekrana yazdırıyoruz.| Hata | Sebep | Çözüm |
|---|---|---|
SSL: CERTIFICATE_VERIFY_FAILED |
Sertifika yolu yanlış veya sertifika eksik | verify parametresine doğru .p12 dosya yolunu verin |
401 Unauthorized |
Token alınamadı, client_id/secret yanlış | SAP Logon'daki servis kullanıcı bilgilerini kontrol edin |
403 Forbidden |
Yetki yetersiz | Kullanıcınızın ADT REST servisine erişim iznine sahip olduğundan emin olun |
Connection refused |
Host veya port yanlış | ADT sunucu adresi ve port numarasını kontrol edin |
Timeout |
Ağ gecikmesi | requests.get(..., timeout=30) ekleyerek timeout süresini ayarlayın |
Projede kullanacağınız kütüphane:
requests>=2.28.0
Kurulum için:
pip install -r requirements.txt
Bu kadar! Script'i çalıştırdığınızda token alıp ABAP program listenizi JSON formatında görmeniz gerekiyor. Bir sonraki bölümde POST isteği ile yeni bir program nasıl oluşturacağımızı göreceğiz. Hazırsan bir sonraki başlığa geçelim 🚀
Hazırsan başlayalım. ADT REST servislerini yapay zekayla nasıl zincirleyerek bir otomasyon akışı kuracağımızı anlatıyorum. Enterprise yazılım dünyasında bu, tekrarlanabilir ve hata payını azaltan bir yaklaşım. 🎯
Akış şemasını dört adımda parçalayalım:
ADT REST ile kod çekme 🔁
/sap/bc/adt/... endpoint'leri).repository ve object path'lerini kullanarak raw kod'u JSON formatında çeşiyoruz.Yapay zeka ile analiz/refactor 🧠
ADT REST ile test senaryosu oluşturma 📝
LOCAL CLASS testleri oluşturuluyor ve ADT'e geri yükleniyor.Otomatik deploy ve doğrulama ✅
Hadi pratik bir örnek üzerinden bu zincirin nasıl çalıştığını görelim. Aşağıdaki Python script'i bu üç temel adımı (çekme, zekaya gönderme, geri gönderme) tek bir orchestration script'inde birleştiriyor.
Ne oluyor burada? İlk fonksiyon ADT'ten kodu çeker, ikincisi bu kodu yapay zekaya gönderip iyileştirilmiş versiyonunu alır, üçüncüsü ise bu öneriyi tekrar ADT REST üzerinden sisteme geri gönderir.
import requests
import json
# ADT REST ve LLM ayarları
ADT_BASE_URL = "https://adt.example.com/sap/bc/adt"
LLM_API_URL = "https://api.openai.com/v1/chat/completions"
HEADERS_ADT = {
"Authorization": "Bearer <ADT_TOKEN>",
"Content-Type": "application/json"
}
HEADERS_LLM = {
"Authorization": "Bearer <LLM_API_KEY>",
"Content-Type": "application/json"
}
def fetch_abap_from_adt(package_name, object_name):
"""ADT REST'ten ABAP kodu çekiyor."""
url = f"{ADT_BASE_URL}/repository/objects/{package_name}/{object_name}/source/main"
response = requests.get(url, headers=HEADERS_ADT)
response.raise_for_status()
return response.json().get("source", "")
def analyze_with_llm(abap_code):
"""Yapay zekaya kod gönderip refactor önerisi alıyor."""
payload = {
"model": "gpt-4",
"messages": [
{
"role": "system",
"content": "Sen bir ABAP uzmanısın. Gelen kodu optimize et ve SOLID prensiplerine uygun hale getir."
},
{
"role": "user",
"content": abap_code
}
]
}
response = requests.post(LLM_API_URL, headers=HEADERS_LLM, json=payload)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
def push_refactored_code_to_adt(package_name, object_name, refactored_code):
"""Yapay zekanın önerdiği kodu ADT REST üzerinden sisteme gönderiyor."""
url = f"{ADT_BASE_URL}/repository/objects/{package_name}/{object_name}/source/main"
payload = {"source": refactored_code}
response = requests.put(url, headers=HEADERS_ADT, json=payload)
response.raise_for_status()
return response.status_code
# Workflow Orkestrasyonu
if __name__ == "__main__":
package = "Z_AUTOMATION_PACKAGE"
obj = "Z_MY_ABAP_CLASS"
# 1. ADT'den kod çek
original_code = fetch_abap_from_adt(package, obj)
# 2. Yapay zekaya gönder ve öneri al
refactored_code = analyze_with_llm(original_code)
# 3. ADT'ye geri gönder
status = push_refactored_code_to_adt(package, obj, refactored_code)
print(f"Kod başarıyla güncellendi. HTTP Status: {status}")
Bu sayede ne oluyor? Manuel olarak kodu kopyala-yapıştır etmeye gerek kalmıyor. ADT REST servisleri ile yapay zeka arasında otomatik bir veri akışı kuruyoruz. Enterprise ortamda bu, hız ve tutarlılık demek. 🚀
Otomasyon akışını yazdın, çalışıyor dedin — ama gerçekten her adım doğru mu çalışıyor? Bir endpoint değiştiğinde, bir middleware'de sessizce hata saklendiğinde, seni ne biliyor? İşte tam da bu noktada test stratejinin devreye girmesi gerekiyor.
1. Unit Test — Temel Taşları Kontrol Et
Her fonksiyonu, her servisi ayrı ayrı test et. Bağımlılıkları mock edersin, sadece o birimin davranışına bakarsın.
2. Integration Test — Parçalar Arası Bağlantıyı Test Et
Birkaç modül bir araya geldiğinde ne oluyor? Burada gerçek servislere (veya onların mock'larına) bağlanırsın.
3. End-to-End Test — Tüm Akışı Tek Bir Çatı Altında
Başlangıçtan sona kadar her şeyin birlikte çalıştığını görürsün.
Şimdi gelin geleceğe bir adım atalım. Yapay zeka, test senaryo oluşturmayı tamamen farklı bir seviyeye taşıyor:
Bu sayede test kapsamını genişletirsin, ama elinden gelen her senaryoyu tek tek yazmak zorunda kalmazsın.
GUI tabanlı otomasyon test yazmak bir hayvan. Buton tıkla, gör, geç. Ama:
REST API bazlı otomasyon testleri ise:
Yani GUI scripting yerine API bazlı test stratejisi seçtiğinde, hem güvenilirlik hem de bakım kolaylığı kazanıyorsun.
Şimdi basit bir pytest senaryosu yazalım. ADT REST endpoint'lerini mock ediyoruz ve otomasyon akışının her adımını kontrol ediyoruz.
import pytest
from unittest.mock import patch, MagicMock
# Mock ADT REST endpoint'leri
MOCK_ADT_ENDPOINTS = {
"/api/v1/tasks": {"status": 200, "body": {"tasks": [{"id": 1, "name": "test_task"}]}},
"/api/v1/tasks/1": {"status": 200, "body": {"id": 1, "name": "test_task", "status": "completed"}},
"/api/v1/tasks/1/complete": {"status": 200, "body": {"id": 1, "status": "completed"}},
}
def mock_get(endpoint):
"""GET istekleri için mock response üretir."""
if endpoint in MOCK_ADT_ENDPOINTS:
return MagicMock(status_code=MOCK_ADT_ENDPOINTS[endpoint]["status"],
json=MagicMock(return_value=MOCK_ADT_ENDPOINTS[endpoint]["body"]))
return MagicMock(status_code=404)
def mock_post(endpoint):
"""POST istekleri için mock response üretir."""
if endpoint in MOCK_ADT_ENDPOINTS:
return MagicMock(status_code=MOCK_ADT_ENDPOINTS[endpoint]["status"],
json=MagicMock(return_value=MOCK_ADT_ENDPOINTS[endpoint]["body"]))
return MagicMock(status_code=500)
def run_automation_flow():
"""
Otomasyon akışı:
1. Görevleri listele
2. İlk görevin detaylarını al
3. Görevi tamamla
"""
import requests
# Adım 1: Görevleri listele
resp1 = requests.get("http://adt-api.local/api/v1/tasks")
tasks = resp1.json()["tasks"]
assert len(tasks) > 0, "Görev listesi boş geldi"
# Adım 2: İlk görevin detaylarını al
task_id = tasks[0]["id"]
resp2 = requests.get(f"http://adt-api.local/api/v1/tasks/{task_id}")
task_detail = resp2.json()
assert task_detail["id"] == task_id
# Adım 3: Görevi tamamla
resp3 = requests.post(f"http://adt-api.local/api/v1/tasks/{task_id}/complete")
result = resp3.json()
assert result["status"] == "completed"
return True
# --- Test Senaryoları ---
class TestAutomationFlow:
@patch("requests.get", side_effect=mock_get)
@patch("requests.post", side_effect=mock_post)
def test_full_flow_succeeds(self, mock_post_fn, mock_get_fn):
"""Tüm akış adımları başarılı şekilde tamamlanır mı?"""
result = run_automation_flow()
assert result is True
@patch("requests.get", side_effect=mock_get)
@patch("requests.post", side_effect=mock_post)
def test_task_list_not_empty(self, mock_post_fn, mock_get_fn):
"""Görev listesi boş gelmemeli."""
import requests
resp = requests.get("http://adt-api.local/api/v1/tasks")
assert len(resp.json()["tasks"]) > 0
@patch("requests.get", side_effect=mock_get)
@patch("requests.post", side_effect=mock_post)
def test_task_completion_status(self, mock_post_fn, mock_get_fn):
"""Görev tamamlandığında status 'completed' olmalı."""
import requests
resp = requests.post("http://adt-api.local/api/v1/tasks/1/complete")
assert resp.json()["status"] == "completed"
@patch("requests.get", return_value=MagicMock(status_code=500))
def test_get_failure_handled(self, mock_get_fn):
"""GET isteği başarısız olursa doğru hata yönetimi yapılıyor mu?"""
with pytest.raises(AssertionError):
run_automation_flow()
Bu sayede ne oluyor? Her bir test senaryosu, otomasyon akışının birer adımını izler ve mock'lanmış endpoint'lerle gerçek sunucuya bağlanmadan kontrol eder. test_full_flow_succeeds tüm akışı tek seferde çalıştırır, test_task_completion_status ise sadece tamamlama adımını izole eder. Hata neredeyse ise, o adımın testinde görürsün.
Şimdi kadar çok şey kavradın — mock'lar, senaryo katmanları, AI desteği. Ama bu sadece temel taş. Bir sonraki bölümde, bu testleri CI/CD pipeline'a entegre etmeyi ve test raporlarını gerçek zamanlı dashboard'larla görselleştirmeyi öğreneceğiz. Hazırsan, bir sonraki adımda buluşalım. 🎯
ADT REST servislerine geçiş yaparken kafan biraz karışabilir, bu tamamen normal. 🎯 Sık karşılaşılan tuzakları ve yanılgıları tek tek gezelim, böylece önceden hazırlanmış olursun.
# Token yenileme örneği
if response.status_code == 401:
yeni_token = token_yenile()
request_headers["Authorization"] = f"Bearer {yeni_token}"
Bu sayede ne oluyor? Token tükendiğinde elle müdahale etmeden, sistem otomatik olarak yenisini alır ve istek tekrar gönderilir. ✅
Hazırsan başlayalım! 🔁 Bu bölümde ana mesajı özetliyorum.
SAP otomasyonu ve ADT REST servisleri birlikte çağrışımında ne oluyor? 🛠
Nasıl çalışıyor? ADT REST servisleri üzerinden SAP'e doğrudan bağlanıyorsun. Yapay zeka ise bu bağlantıları optimize ediyor ve hataları azaltıyor. Böylece elle tıklamaya gerek kalmıyor.
❗️ Sonuç? Artık başlayabilirsin. Bu araçlarla SAP otomasyonu çok daha hızlı ve erişilebilir hale geliyor. Hazırsan başlayalım! 💪
Sevgili okur, bu yazının sonuna geldiğinde bir şeyi kesinlikle yapmanızı istiyorum. Çünkü bu bölüm sadece teorik bir bonus değil — hemen bugün uygulayabileceğiniz küçük ama güçlü bir adım. 🛠
ADT ile çalışırken karşınıza çıkabilecek en yaygın sorular bunlar:
oracle/adt-samples reposu harika bir başlangıç noktası.ADT REST servis geliştirme sürecinde size yardımcı olabilecek birkaç AI aracı:
İpucu: Bu araçları tek başına değil, birlikte kullanın. Önce Copilot ile kodunuzu yazın, sonra ChatGPT ile hata ayıklamasını isteyin — bu kombinasyon inanılmaz bir hız kazandırır.
İşte küçük ama etkili bir adım:
Bu kadar. 🎯
Bu üç adım, size ADT REST mimarisini somut bir şekilde tanıyacaktır. Teorik bilgiyi artık pratikte görmüş olacaksınız.
Bu yolculukta yalnız değilsiniz. Buradan sonra her şeyi adım adım takip edeceğiz — sorularınızı sormaktan çekinmeyin, çünkü her soru bir adım ilerlemedir. Haydi, ADT REST servislerinizi keşfetmeye başlayın — siz bunu yapabilirsiniz! 🚀
Bu içerik tamamen yapay zeka destekli otomasyon sistemi ile üretilmiştir.
All rights reserved