denizgolbas / laravel-tcmb-evds
TCMB EVDS2 API'si için Laravel paketi - Günlük döviz kurları
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 3
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/denizgolbas/laravel-tcmb-evds
Requires
- php: ^8.2
- illuminate/database: ^10.0|^11.0
- illuminate/http: ^10.0|^11.0
- illuminate/support: ^10.0|^11.0
- nesbot/carbon: ^2.0|^3.0
Requires (Dev)
- guzzlehttp/guzzle: ^7.0
- guzzlehttp/promises: ^1.0|^2.0
- guzzlehttp/psr7: ^1.0|^2.0
- laravel/pint: ^1.0
- orchestra/testbench: ^8.0|^9.0
- phpstan/phpstan: ^1.10 || ^2.0
- phpunit/phpunit: ^10.0|^11.0
Conflicts
- phpunit/phpunit: <10.0|>=12.0
README
🇹🇷 Türkçe | 🇬🇧 English
TCMB EVDS2 API'sinin "Günlük Döviz Kurları (Daily FX Rates)" servisine özel geliştirilmiş, modern bir Laravel paketi.
Paket, chainable bir URL/Query Builder, esnek bir API istemcisi, publish edilebilir migration + model yapısı ve isteğe bağlı olarak gelen verilerin veritabanına kaydedilmesini destekler.
Bu paket; proje içinde kolayca günlük döviz kurlarını çekmek, işlemek, saklamak ve otomatikleştirmek isteyen Laravel geliştiricileri için tasarlanmıştır.
⚠️ ÖNEMLİ UYARI
Bu paket resmi TCMB EVDS2 API'sine bağlanmak ve kurları kolayca işleyebilmek için oluşturulmuş bir araçtır. Resmi bir dağıtım değildir.
Kullanımda doğacak finansal hatalar ve kayıplar sizin sorumluluğunuzdadır.
- Bu paket TCMB tarafından resmi olarak desteklenmemektedir
- Finansal işlemlerde kullanmadan önce mutlaka doğrulama yapın
- Kritik finansal kararlar için resmi TCMB kaynaklarını kullanın
- Paket kullanımından kaynaklanan herhangi bir zarardan paket geliştiricileri sorumlu değildir
🚀 Özellikler
- 🔗 Fluent URL Builder - TCMB EVDS2 endpoint'ini zincir fonksiyonlar ile kolayca oluşturun
- 📅 Hazır Tarih Kısayolları -
today(),yesterday(),lastDays(7),thisMonth()gibi fonksiyonlarla hızlı tarih aralıkları - 💾 Opsiyonel Database Kaydı - API'den gelen döviz kurlarını model ile veritabanına kaydedebilirsiniz
- ⚙️ Publish Edilebilir Model ve Migration - İsterseniz kendi projenizde model/migration dosyalarını özelleştirin
- 🧩 Config Tabanlı Esneklik - Varsayılan dövizler, tarih ayarları ve API key config üzerinden yönetilir
- 🎯 Alış/Satış ve Forex/Banknote Ayrımı - Döviz alış, döviz satış, efektif alış, efektif satış kurlarını ayrı ayrı çekebilirsiniz
- 🔄 Null Değer Yönetimi - Hafta sonları ve tatil günleri için esnek null değer işleme stratejileri
- 🧪 Unit, Feature ve Matrix Testleri - Laravel 10/11 + PHP 8.2/8.3 kombinasyonları için GitHub Actions test workflow'u
- 📡 Laravel Http Client ile API İletişimi - Temiz, güvenli ve performanslı bir API client
📦 Kurulum
Paketi Composer ile yükleyin:
composer require denizgolbas/laravel-tcmb-evds
Config Dosyasını Publish Etme
Config dosyasını publish etmek için:
php artisan vendor:publish --tag=evds-config
Bu işlem config/evds.php dosyasını oluşturur. .env dosyanıza API anahtarınızı ekleyin:
TCMB_EVDS_API_KEY=your-api-key-here TCMB_EVDS_BASE_ENDPOINT=https://evds2.tcmb.gov.tr/service/evds/ TCMB_EVDS_NULL_HANDLING=previous_day
Önemli: API anahtarınızı TCMB EVDS2 Kullanıcı Dokümanları sayfasından alabilirsiniz.
Migration'ları Publish Etme
Migration dosyalarını publish etmek için:
php artisan vendor:publish --tag=evds-migrations
Ardından migration'ları çalıştırın:
php artisan migrate
Model'i Publish Etme
Model dosyasını publish etmek için:
php artisan vendor:publish --tag=evds-model
Bu işlem app/Models/EvdsCurrencyRate.php dosyasını oluşturur. İsterseniz bu modeli extend ederek özelleştirebilirsiniz.
🛠️ Kullanım Örnekleri
Temel Kullanım
use Denizgolbas\LaravelTcmbEvds\Facades\Evds; // Tek döviz kuru çekme (otomatik olarak hem alış hem satış, hem forex hem banknote) $data = Evds::currency('USD') ->today() ->get(); // Çoklu döviz kuru çekme $data = Evds::currency(['USD', 'EUR']) ->startDate('2024-01-01') ->endDate('2024-01-10') ->get();
Alış/Satış Seçimi
// Sadece satış kurları (Forex Selling - Döviz Satış) $data = Evds::currency('USD') ->startDate('2024-01-01') ->endDate('2024-01-10') ->type('sell') ->get(); // Sadece alış kurları (Forex Buying - Döviz Alış) $data = Evds::currency('USD') ->startDate('2024-01-01') ->endDate('2024-01-10') ->type('buy') ->get(); // Hem alış hem satış (varsayılan) $data = Evds::currency('USD') ->startDate('2024-01-01') ->endDate('2024-01-10') ->get();
Forex/Banknote (Döviz/Efektif) Seçimi
// Sadece Forex kurları (Döviz) $data = Evds::currency('USD') ->startDate('2024-01-01') ->endDate('2024-01-10') ->marketType('forex') ->get(); // Sadece Banknote kurları (Efektif) $data = Evds::currency('USD') ->startDate('2024-01-01') ->endDate('2024-01-10') ->marketType('banknote') ->get(); // Hem forex hem banknote (varsayılan) $data = Evds::currency('USD') ->startDate('2024-01-01') ->endDate('2024-01-10') ->get();
Kombinasyon Örnekleri
// Forex Satış (Döviz Satış) $data = Evds::currency(['USD', 'EUR']) ->startDate('2024-01-01') ->endDate('2024-01-10') ->type('sell') ->marketType('forex') ->get(); // Banknote Alış (Efektif Alış) $data = Evds::currency('USD') ->startDate('2024-01-01') ->endDate('2024-01-10') ->type('buy') ->marketType('banknote') ->get(); // Banknote Satış (Efektif Satış) $data = Evds::currency('EUR') ->today() ->type('sell') ->marketType('banknote') ->get();
Tarih Kısayolları
// Bugün $data = Evds::currency('USD')->today()->get(); // Dün $data = Evds::currency('USD')->yesterday()->get(); // Son 7 gün $data = Evds::currency('USD')->lastDays(7)->get(); // Bu hafta $data = Evds::currency('USD')->thisWeek()->get(); // Geçen hafta $data = Evds::currency('USD')->lastWeek()->get(); // Bu ay $data = Evds::currency('USD')->thisMonth()->get(); // Geçen ay $data = Evds::currency('USD')->lastMonth()->get();
Null Değer Yönetimi (Hafta Sonları ve Tatil Günleri)
// Bir önceki günün değerini kullan (varsayılan) $data = Evds::currency('USD') ->startDate('2024-01-01') ->endDate('2024-01-10') ->nullValueHandling('previous_day') ->get(); // Geçen haftanın ortalamasını kullan $data = Evds::currency('USD') ->startDate('2024-01-01') ->endDate('2024-01-10') ->nullValueHandling('last_week_avg') ->get(); // Null değerleri atla (kaydetme) $data = Evds::currency('USD') ->startDate('2024-01-01') ->endDate('2024-01-10') ->nullValueHandling('skip') ->get();
Veritabanına Kaydetme
// Basit kaydetme $saved = Evds::currency('USD') ->today() ->save(); // Kombinasyonlu kaydetme $saved = Evds::currency(['USD', 'EUR']) ->startDate('2024-01-01') ->endDate('2024-01-10') ->type('sell') ->marketType('forex') ->nullValueHandling('previous_day') ->roundDecimals(2) // 2 ondalık basamağa yuvarla ->save(); // Kaydedilen verileri kullanma foreach ($saved as $rate) { echo "{$rate->code}: {$rate->rate} ({$rate->date->format('Y-m-d')})\n"; echo "Tip: {$rate->type}, Market: {$rate->marketType}\n"; }
URL Oluşturma
// URL'i görmek için $url = Evds::currency(['USD', 'EUR']) ->startDate('2024-01-01') ->endDate('2024-01-10') ->type('sell') ->marketType('forex') ->build(); echo $url; // Çıktı: https://evds2.tcmb.gov.tr/service/evds/series=TP.DK.USD.S.YTL-TP.DK.EUR.S.YTL&startDate=01-01-2024&endDate=10-01-2024&type=json
Model ile Veritabanından Veri Çekme
use Denizgolbas\LaravelTcmbEvds\Models\EvdsCurrencyRate; use Carbon\Carbon; // Bugünün USD kuru $rate = EvdsCurrencyRate::where('code', 'USD') ->where('date', Carbon::today()) ->first(); // Belirli bir tarih aralığındaki kurlar $rates = EvdsCurrencyRate::where('code', 'USD') ->whereBetween('date', ['2024-01-01', '2024-01-10']) ->get(); // Sadece satış kurları $sellRates = EvdsCurrencyRate::where('code', 'USD') ->sell() ->get(); // Sadece forex kurları $forexRates = EvdsCurrencyRate::where('code', 'USD') ->forex() ->get(); // Kombinasyon: USD Forex Satış $usdForexSell = EvdsCurrencyRate::where('code', 'USD') ->sell() ->forex() ->whereBetween('date', ['2024-01-01', '2024-01-10']) ->orderBy('date', 'asc') ->get(); // En son kaydedilen USD kuru $latestUsd = EvdsCurrencyRate::where('code', 'USD') ->latest('date') ->first(); // Her döviz için en son kurlar $latestRates = EvdsCurrencyRate::whereIn('code', ['USD', 'EUR']) ->latest('date') ->get() ->groupBy('code');
Gerçek Dünya Örnekleri
Örnek 1: Günlük Döviz Kurlarını Çekip Kaydetme
use Denizgolbas\LaravelTcmbEvds\Facades\Evds; // Her gün çalışacak bir scheduled task public function handle() { // USD, EUR, GBP için bugünün kurlarını çek ve kaydet $saved = Evds::currency(['USD', 'EUR', 'GBP']) ->today() ->type('sell') ->marketType('forex') ->nullValueHandling('previous_day') ->save(); return "{$saved->count()} adet kur kaydedildi."; }
Örnek 2: Belirli Tarih Aralığındaki Kurları Raporlama
use Denizgolbas\LaravelTcmbEvds\Facades\Evds; $data = Evds::currency(['USD', 'EUR']) ->startDate('2024-01-01') ->endDate('2024-01-31') ->type('sell') ->marketType('forex') ->get(); $report = []; foreach ($data as $item) { $report[$item->code][$item->date->format('Y-m-d')] = $item->rate; } return view('exchange-rates', ['report' => $report]);
Örnek 3: Model ile Veri Analizi
use Denizgolbas\LaravelTcmbEvds\Models\EvdsCurrencyRate; // Son 30 günün ortalama USD kuru $avgRate = EvdsCurrencyRate::where('code', 'USD') ->sell() ->forex() ->where('date', '>=', Carbon::now()->subDays(30)) ->avg('rate'); // En yüksek ve en düşük kurlar $maxRate = EvdsCurrencyRate::where('code', 'USD') ->sell() ->forex() ->max('rate'); $minRate = EvdsCurrencyRate::where('code', 'USD') ->sell() ->forex() ->min('rate');
Örnek 4: Hata Yönetimi
use Denizgolbas\LaravelTcmbEvds\Facades\Evds; use Denizgolbas\LaravelTcmbEvds\Exceptions\InvalidConfigurationException; use Denizgolbas\LaravelTcmbEvds\Exceptions\ApiException; try { $data = Evds::currency('USD') ->today() ->get(); } catch (InvalidConfigurationException $e) { // API key eksik veya yanlış yapılandırılmış logger()->error('EVDS Config Error: ' . $e->getMessage()); return response()->json(['error' => 'API yapılandırma hatası'], 500); } catch (ApiException $e) { // API isteği başarısız logger()->error('EVDS API Error: ' . $e->getMessage()); return response()->json(['error' => 'API isteği başarısız'], 500); } catch (\Exception $e) { // Genel hata logger()->error('EVDS Error: ' . $e->getMessage()); return response()->json(['error' => 'Beklenmeyen bir hata oluştu'], 500); }
📚 Builder Metodları Referansı
currency(array|string $codes)
Döviz kodlarını ayarlar. Tek veya çoklu döviz kodu kabul eder.
Evds::currency('USD')->get(); Evds::currency(['USD', 'EUR', 'GBP'])->get();
startDate(Carbon|string $date)
Başlangıç tarihini ayarlar. Carbon instance veya string formatında tarih kabul eder.
Evds::currency('USD')->startDate('2024-01-01')->get(); Evds::currency('USD')->startDate(Carbon::parse('2024-01-01'))->get();
endDate(Carbon|string $date)
Bitiş tarihini ayarlar. Carbon instance veya string formatında tarih kabul eder.
Evds::currency('USD')->endDate('2024-01-10')->get();
type(array|string $types)
Alış/Satış tipini ayarlar. 'buy', 'sell' veya ['buy', 'sell'] kabul eder.
Evds::currency('USD')->type('sell')->get(); Evds::currency('USD')->type('buy')->get(); Evds::currency('USD')->type(['buy', 'sell'])->get();
marketType(array|string $marketTypes)
Market tipini ayarlar. 'forex', 'banknote' veya ['forex', 'banknote'] kabul eder.
Evds::currency('USD')->marketType('forex')->get(); Evds::currency('USD')->marketType('banknote')->get(); Evds::currency('USD')->marketType(['forex', 'banknote'])->get();
nullValueHandling(string $strategy)
Null değer işleme stratejisini ayarlar. 'previous_day', 'last_week_avg', 'skip' kabul eder.
Evds::currency('USD')->nullValueHandling('previous_day')->get(); Evds::currency('USD')->nullValueHandling('last_week_avg')->get(); Evds::currency('USD')->nullValueHandling('skip')->get();
build() veya toUrl()
URL'i oluşturur ve döndürür.
$url = Evds::currency('USD')->today()->build();
get()
API'den veri çeker ve Collection döndürür.
$data = Evds::currency('USD')->today()->get();
save()
API'den veri çeker ve veritabanına kaydeder. Collection döndürür.
// Basit kaydetme (API'den gelen değer olduğu gibi kaydedilir) $saved = Evds::currency('USD')->today()->save(); // Ondalık basamak sayısını yuvarlayarak kaydetme $saved = Evds::currency('USD') ->today() ->roundDecimals(2) // 2 ondalık basamağa yuvarla (örn: 45.67) ->save(); // Farklı yuvarlama modları $saved = Evds::currency('USD') ->today() ->roundDecimals(2, 'floor') // Aşağı yuvarla (örn: 45.67 -> 45.67, 45.678 -> 45.67) ->save(); $saved = Evds::currency('USD') ->today() ->roundDecimals(2, 'ceil') // Yukarı yuvarla (örn: 45.67 -> 45.67, 45.671 -> 45.68) ->save();
🧪 Testler
Testleri çalıştırmak için:
composer test
veya
vendor/bin/phpunit --testdox
Test Kapsamı
- ✅ Builder URL oluşturma testleri
- ✅ Tarih metodları testleri
- ✅ API client testleri (mock ile)
- ✅ Database kayıt testleri
- ✅ Facade testleri
- ✅ Null değer yönetimi testleri
Matrix Testler
GitHub Actions üzerinde şu kombinasyonlar test edilir:
- PHP 8.2 + Laravel 10.x
- PHP 8.2 + Laravel 11.x
- PHP 8.3 + Laravel 10.x
- PHP 8.3 + Laravel 11.x
GitHub Actions için API Key Kurulumu
GitHub Actions'da testlerin çalışması için (opsiyonel - testler mock kullanır):
- GitHub repository'nize gidin
- Settings → Secrets and variables → Actions seçeneğine gidin
- New repository secret butonuna tıklayın
- Şu bilgileri girin:
- Name:
TCMB_EVDS_API_KEY - Secret: API anahtarınızı yapıştırın
- Name:
- Add secret butonuna tıklayın
Not: Testler için gerçek API key'e ihtiyaç yoktur çünkü testler mock response kullanır. Ancak gerçek API testleri yapmak isterseniz secret'ı ekleyebilirsiniz.
⚙️ Konfigürasyon
Config dosyası (config/evds.php) aşağıdaki ayarları içerir:
return [ 'api_key' => env('TCMB_EVDS_API_KEY', ''), 'base_endpoint' => env('TCMB_EVDS_BASE_ENDPOINT', 'https://evds2.tcmb.gov.tr/service/evds/'), 'default_currencies' => ['USD', 'EUR', 'GBP'], 'default_start_date' => null, 'default_end_date' => null, 'default_frequency' => 'daily', 'null_value_handling' => env('TCMB_EVDS_NULL_HANDLING', 'previous_day'), 'model' => \Denizgolbas\LaravelTcmbEvds\Models\EvdsCurrencyRate::class, ];
Null Değer Yönetimi
Hafta sonları ve tatil günleri için null değerlerin nasıl işleneceğini ayarlayabilirsiniz:
'previous_day': Bir önceki günün değerini kullan (varsayılan)'last_week_avg': Geçen haftanın ortalamasını kullan'skip': Null değerleri atla, kaydetme
Model Özelleştirme
Kendi modelinizi kullanmak için config dosyasında model ayarını değiştirin:
'model' => \App\Models\CustomCurrencyRate::class,
Kendi modeliniz EvdsCurrencyRate modelini extend etmelidir:
namespace App\Models; use Denizgolbas\LaravelTcmbEvds\Models\EvdsCurrencyRate as BaseModel; class CustomCurrencyRate extends BaseModel { // Özelleştirmeleriniz }
🔧 Geliştirme
Gereksinimler
- PHP >= 8.2
- Laravel >= 10.0
- Composer
Geliştirme Ortamı Kurulumu
git clone https://github.com/denizgolbas/laravel-tcmb-evds.git
cd laravel-tcmb-evds
composer install
Kod Standartları
Paket PSR-12 kod standartlarına uygundur. Kodları kontrol etmek için:
composer lint
📄 Lisans
Bu paket MIT lisansı altında lisanslanmıştır. Detaylar için LICENSE dosyasına bakın.
🤝 Katkıda Bulunma
Katkılarınızı bekliyoruz! Lütfen:
- Fork edin
- Feature branch oluşturun (
git checkout -b feature/amazing-feature) - Değişikliklerinizi commit edin (
git commit -m 'Add some amazing feature') - Branch'inizi push edin (
git push origin feature/amazing-feature) - Pull Request oluşturun
📞 Destek
Sorularınız veya önerileriniz için:
- Issue açın: GitHub Issues
- Email: info@denizgolbas.com
🙏 Teşekkürler
- TCMB EVDS2 API ekibine teşekkürler
- Laravel topluluğuna teşekkürler
⭐ Bu paketi beğendiyseniz yıldız vermeyi unutmayın!